{"version":3,"sources":["../src/fetch.ts","../src/utils/error-handling.ts","../src/auth.ts","../src/realtime.ts","../src/storage.ts","../src/functions.ts","../src/jobs.ts","../src/rpc.ts","../src/settings.ts","../src/ddl.ts","../src/oauth.ts","../src/impersonation.ts","../src/management.ts","../src/bundling.ts","../src/admin-functions.ts","../src/admin-migrations.ts","../src/admin-jobs.ts","../src/admin-ai.ts","../src/admin-rpc.ts","../src/admin-storage.ts","../src/admin-realtime.ts","../src/admin-service-keys.ts","../src/admin.ts","../src/secrets.ts","../src/ai.ts","../src/vector.ts","../src/knowledge-base.ts","../src/graphql.ts","../src/branching.ts","../src/tenant.ts","../src/query-builder.ts","../src/schema-query-builder.ts","../src/client.ts","../src/type-guards.ts"],"names":["fetch","queryString","path","data"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * HTTP client for making requests to the Fluxbase API\n */\n\nimport type { FluxbaseError, HttpMethod } from \"./types\";\n\nexport interface FetchOptions {\n  method: HttpMethod;\n  headers?: Record<string, string>;\n  body?: unknown;\n  timeout?: number;\n  /** Skip automatic token refresh on 401 (used for auth endpoints) */\n  skipAutoRefresh?: boolean;\n}\n\n/**\n * Response with headers included (for count queries)\n */\nexport interface FetchResponseWithHeaders<T> {\n  data: T;\n  headers: Headers;\n  status: number;\n}\n\n/** Callback type for automatic token refresh on 401 errors */\nexport type RefreshTokenCallback = () => Promise<boolean>;\n\n/** Callback type for modifying headers before each request */\nexport type BeforeRequestCallback = (headers: Record<string, string>) => void;\n\nexport class FluxbaseFetch {\n  private baseUrl: string;\n  private defaultHeaders: Record<string, string>;\n  private timeout: number;\n  private debug: boolean;\n  private refreshTokenCallback: RefreshTokenCallback | null = null;\n  private isRefreshing = false;\n  private refreshPromise: Promise<boolean> | null = null;\n  private anonKey: string | null = null;\n  private beforeRequestCallback: BeforeRequestCallback | null = null;\n\n  constructor(\n    baseUrl: string,\n    options: {\n      headers?: Record<string, string>;\n      timeout?: number;\n      debug?: boolean;\n    } = {},\n  ) {\n    this.baseUrl = baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n    this.defaultHeaders = {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    };\n    this.timeout = options.timeout ?? 30000;\n    this.debug = options.debug ?? false;\n  }\n\n  getBaseUrl(): string { return this.baseUrl }\n\n  getDefaultHeaders(): Record<string, string> { return { ...this.defaultHeaders } }\n\n  /**\n   * Register a callback to refresh the token when a 401 error occurs\n   * The callback should return true if refresh was successful, false otherwise\n   */\n  setRefreshTokenCallback(callback: RefreshTokenCallback | null) {\n    this.refreshTokenCallback = callback;\n  }\n\n  /**\n   * Register a callback to be called before every request.\n   * The callback receives the headers object and can modify it in place.\n   * This is useful for dynamically injecting headers at request time.\n   */\n  setBeforeRequestCallback(callback: BeforeRequestCallback | null) {\n    this.beforeRequestCallback = callback;\n  }\n\n  /**\n   * Set the anon key for fallback authentication\n   * When setAuthToken(null) is called, the Authorization header will be\n   * restored to use this anon key instead of being deleted\n   */\n  setAnonKey(key: string) {\n    this.anonKey = key;\n  }\n\n  /**\n   * Update the authorization header\n   * When token is null, restores to anon key if available\n   */\n  setAuthToken(token: string | null) {\n    if (token) {\n      this.defaultHeaders[\"Authorization\"] = `Bearer ${token}`;\n    } else if (this.anonKey) {\n      // Restore anon key auth instead of deleting header\n      this.defaultHeaders[\"Authorization\"] = `Bearer ${this.anonKey}`;\n    } else {\n      delete this.defaultHeaders[\"Authorization\"];\n    }\n  }\n\n  /**\n   * Set a custom header on all requests\n   */\n  setHeader(name: string, value: string) {\n    this.defaultHeaders[name] = value;\n  }\n\n  /**\n   * Remove a custom header\n   */\n  removeHeader(name: string) {\n    delete this.defaultHeaders[name];\n  }\n\n  /**\n   * Make an HTTP request\n   */\n  async request<T = unknown>(path: string, options: FetchOptions): Promise<T> {\n    return this.requestInternal<T>(path, options, false);\n  }\n\n  /**\n   * Full request implementation returning response with headers, status, and data.\n   * Used by both requestInternal and requestWithHeadersInternal.\n   */\n  private async requestFull<T = unknown>(\n    path: string,\n    options: FetchOptions,\n    isRetry: boolean,\n  ): Promise<FetchResponseWithHeaders<T>> {\n    const url = `${this.baseUrl}${path}`;\n    const headers = { ...this.defaultHeaders, ...options.headers };\n    if (this.beforeRequestCallback) {\n      this.beforeRequestCallback(headers);\n    }\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(\n      () => controller.abort(),\n      options.timeout ?? this.timeout,\n    );\n\n    if (this.debug) {\n      console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body);\n    }\n\n    try {\n      const isFormData =\n        options.body &&\n        (options.body.constructor?.name === \"FormData\" ||\n          options.body instanceof FormData);\n\n      const requestHeaders = isFormData\n        ? Object.fromEntries(\n            Object.entries(headers).filter(\n              ([key]) => key.toLowerCase() !== \"content-type\",\n            ),\n          )\n        : headers;\n\n      const response = await fetch(url, {\n        method: options.method,\n        headers: requestHeaders,\n        body: isFormData\n          ? (options.body as FormData)\n          : options.body\n            ? JSON.stringify(options.body)\n            : undefined,\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      const contentType = response.headers.get(\"content-type\");\n      let data: unknown;\n\n      if (contentType?.includes(\"application/json\")) {\n        data = await response.json();\n      } else {\n        data = await response.text();\n      }\n\n      if (this.debug) {\n        console.log(`[Fluxbase SDK] Response:`, response.status, data);\n      }\n\n      if (\n        response.status === 401 &&\n        !isRetry &&\n        !options.skipAutoRefresh &&\n        this.refreshTokenCallback\n      ) {\n        const refreshSuccess = await this.handleTokenRefresh();\n        if (refreshSuccess) {\n          return this.requestFull<T>(path, options, true);\n        }\n      }\n\n      if (!response.ok) {\n        const error = new Error(\n          typeof data === \"object\" && data && \"error\" in data\n            ? String(data.error)\n            : response.statusText,\n        ) as FluxbaseError;\n\n        error.status = response.status;\n        error.details = data;\n\n        throw error;\n      }\n\n      return {\n        data: data as T,\n        headers: response.headers,\n        status: response.status,\n      };\n    } catch (err) {\n      clearTimeout(timeoutId);\n\n      if (err instanceof Error) {\n        if (err.name === \"AbortError\") {\n          const timeoutError = new Error(\"Request timeout\") as FluxbaseError;\n          timeoutError.status = 408;\n          throw timeoutError;\n        }\n\n        throw err;\n      }\n\n      throw new Error(err instanceof Error ? err.message : String(err) || \"Unknown error occurred\");\n    }\n  }\n\n  /**\n   * Handle token refresh with deduplication\n   * Multiple concurrent requests that fail with 401 will share the same refresh operation\n   */\n  private async handleTokenRefresh(): Promise<boolean> {\n    if (this.isRefreshing && this.refreshPromise) {\n      return this.refreshPromise;\n    }\n\n    this.isRefreshing = true;\n    this.refreshPromise = this.executeRefresh();\n\n    try {\n      return await this.refreshPromise;\n    } finally {\n      this.isRefreshing = false;\n      this.refreshPromise = null;\n    }\n  }\n\n  /**\n   * Execute the actual token refresh\n   */\n  private async executeRefresh(): Promise<boolean> {\n    if (!this.refreshTokenCallback) {\n      return false;\n    }\n\n    try {\n      return await this.refreshTokenCallback();\n    } catch (error) {\n      if (this.debug) {\n        console.error(\"[Fluxbase SDK] Token refresh failed:\", error);\n      }\n      return false;\n    }\n  }\n\n  /**\n   * Internal request implementation with retry capability\n   */\n  private async requestInternal<T = unknown>(\n    path: string,\n    options: FetchOptions,\n    isRetry: boolean,\n  ): Promise<T> {\n    const { data } = await this.requestFull<T>(path, options, isRetry);\n    return data;\n  }\n\n  /**\n   * Internal request implementation that returns response with headers\n   */\n  private async requestWithHeadersInternal<T = unknown>(\n    path: string,\n    options: FetchOptions,\n    isRetry: boolean,\n  ): Promise<FetchResponseWithHeaders<T>> {\n    return this.requestFull<T>(path, options, isRetry);\n  }\n\n  /**\n   * GET request\n   */\n  async get<T = unknown>(\n    path: string,\n    options: Omit<FetchOptions, \"method\"> = {},\n  ): Promise<T> {\n    return this.request<T>(path, { ...options, method: \"GET\" });\n  }\n\n  /**\n   * GET request that returns response with headers (for count queries)\n   */\n  async getWithHeaders<T = unknown>(\n    path: string,\n    options: Omit<FetchOptions, \"method\"> = {},\n  ): Promise<FetchResponseWithHeaders<T>> {\n    return this.requestWithHeaders<T>(path, { ...options, method: \"GET\" });\n  }\n\n  /**\n   * POST request that returns response with headers (for POST-based queries with count)\n   */\n  async postWithHeaders<T = unknown>(\n    path: string,\n    body?: unknown,\n    options: Omit<FetchOptions, \"method\" | \"body\"> = {},\n  ): Promise<FetchResponseWithHeaders<T>> {\n    return this.requestWithHeaders<T>(path, {\n      ...options,\n      method: \"POST\",\n      body,\n    });\n  }\n\n  /**\n   * Make an HTTP request and return response with headers\n   */\n  async requestWithHeaders<T = unknown>(\n    path: string,\n    options: FetchOptions,\n  ): Promise<FetchResponseWithHeaders<T>> {\n    return this.requestWithHeadersInternal<T>(path, options, false);\n  }\n\n  /**\n   * POST request\n   */\n  async post<T = unknown>(\n    path: string,\n    body?: unknown,\n    options: Omit<FetchOptions, \"method\" | \"body\"> = {},\n  ): Promise<T> {\n    return this.request<T>(path, { ...options, method: \"POST\", body });\n  }\n\n  /**\n   * PUT request\n   */\n  async put<T = unknown>(\n    path: string,\n    body?: unknown,\n    options: Omit<FetchOptions, \"method\" | \"body\"> = {},\n  ): Promise<T> {\n    return this.request<T>(path, { ...options, method: \"PUT\", body });\n  }\n\n  /**\n   * PATCH request\n   */\n  async patch<T = unknown>(\n    path: string,\n    body?: unknown,\n    options: Omit<FetchOptions, \"method\" | \"body\"> = {},\n  ): Promise<T> {\n    return this.request<T>(path, { ...options, method: \"PATCH\", body });\n  }\n\n  /**\n   * DELETE request\n   */\n  async delete<T = unknown>(\n    path: string,\n    options: Omit<FetchOptions, \"method\"> = {},\n  ): Promise<T> {\n    return this.request<T>(path, { ...options, method: \"DELETE\" });\n  }\n\n  /**\n   * HEAD request\n   */\n  async head(\n    path: string,\n    options: Omit<FetchOptions, \"method\"> = {},\n  ): Promise<Headers> {\n    const url = `${this.baseUrl}${path}`;\n    const headers = { ...this.defaultHeaders, ...options.headers };\n    if (this.beforeRequestCallback) {\n      this.beforeRequestCallback(headers);\n    }\n\n    const response = await fetch(url, {\n      method: \"HEAD\",\n      headers,\n    });\n\n    return response.headers;\n  }\n\n  /**\n   * GET request that returns response as Blob (for file downloads)\n   */\n  async getBlob(\n    path: string,\n    options: Omit<FetchOptions, \"method\"> = {},\n  ): Promise<Blob> {\n    const url = `${this.baseUrl}${path}`;\n    const headers = { ...this.defaultHeaders, ...options.headers };\n    if (this.beforeRequestCallback) {\n      this.beforeRequestCallback(headers);\n    }\n    // Remove Content-Type for blob downloads\n    delete headers[\"Content-Type\"];\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(\n      () => controller.abort(),\n      options.timeout ?? this.timeout,\n    );\n\n    if (this.debug) {\n      console.log(`[Fluxbase SDK] GET (blob) ${url}`);\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: \"GET\",\n        headers,\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      if (!response.ok) {\n        const error = new Error(response.statusText) as FluxbaseError;\n        error.status = response.status;\n        throw error;\n      }\n\n      return await response.blob();\n    } catch (err) {\n      clearTimeout(timeoutId);\n\n      if (err instanceof Error) {\n        if (err.name === \"AbortError\") {\n          const timeoutError = new Error(\"Request timeout\") as FluxbaseError;\n          timeoutError.status = 408;\n          throw timeoutError;\n        }\n        throw err;\n      }\n\n      throw new Error(err instanceof Error ? err.message : String(err) || \"Unknown error occurred\");\n    }\n  }\n}\n","import type { FluxbaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Fluxbase response format\n * @param operation The async operation to wrap\n * @returns Promise resolving to { data, error: null } on success or { data: null, error } on failure\n */\nexport async function wrapAsync<T>(\n  operation: () => Promise<T>\n): Promise<FluxbaseResponse<T>> {\n  try {\n    const data = await operation()\n    return { data, error: null }\n  } catch (error) {\n    return {\n      data: null,\n      error: error instanceof Error ? error : new Error(String(error))\n    }\n  }\n}\n\n/**\n * Wraps void async operations (operations that don't return data)\n * @param operation The async void operation to wrap\n * @returns Promise resolving to { error: null } on success or { error } on failure\n */\nexport async function wrapAsyncVoid(\n  operation: () => Promise<void>\n): Promise<VoidResponse> {\n  try {\n    await operation()\n    return { error: null }\n  } catch (error) {\n    return {\n      error: error instanceof Error ? error : new Error(String(error))\n    }\n  }\n}\n\n/**\n * Wraps synchronous operations (for consistency)\n * @param operation The sync operation to wrap\n * @returns { data, error: null } on success or { data: null, error } on failure\n */\nexport function wrapSync<T>(\n  operation: () => T\n): FluxbaseResponse<T> {\n  try {\n    const data = operation()\n    return { data, error: null }\n  } catch (error) {\n    return {\n      data: null,\n      error: error instanceof Error ? error : new Error(String(error))\n    }\n  }\n}\n","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  AuthResponse,\n  AuthResponseData,\n  AuthSession,\n  SignInCredentials,\n  SignUpCredentials,\n  UpdateUserAttributes,\n  User,\n  TwoFactorSetupResponse,\n  TwoFactorEnableResponse,\n  TwoFactorLoginResponse,\n  TwoFactorStatusResponse,\n  TwoFactorDisableResponse,\n  TwoFactorVerifyRequest,\n  SignInWith2FAResponse,\n  PasswordResetResponse,\n  VerifyResetTokenResponse,\n  ResetPasswordResponse,\n  MagicLinkOptions,\n  MagicLinkResponse,\n  AnonymousSignInResponse,\n  OAuthProvidersResponse,\n  OAuthOptions,\n  OAuthUrlResponse,\n  OAuthLogoutOptions,\n  OAuthLogoutResponse,\n  ProviderTokenResponse,\n  AuthChangeEvent,\n  AuthStateChangeCallback,\n  AuthSubscription,\n  FluxbaseAuthResponse,\n  FluxbaseResponse,\n  UserResponse,\n  DataResponse,\n  VoidResponse,\n  SignInWithOtpCredentials,\n  VerifyOtpParams,\n  ResendOtpParams,\n  OTPResponse,\n  UserIdentitiesResponse,\n  LinkIdentityCredentials,\n  UnlinkIdentityParams,\n  ReauthenticateResponse,\n  SignInWithIdTokenCredentials,\n  AuthConfig,\n  CaptchaConfig,\n  CaptchaCheckRequest,\n  CaptchaCheckResponse,\n  SAMLProvidersResponse,\n  SAMLLoginOptions,\n  SAMLLoginResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\nconst AUTH_STORAGE_KEY = \"fluxbase.auth.session\";\nconst OAUTH_PROVIDER_KEY = \"fluxbase.auth.oauth_provider\";\nconst OAUTH_REDIRECT_URI_KEY = \"fluxbase.auth.oauth_redirect_uri\";\n\n// Auto-refresh configuration constants\nconst AUTO_REFRESH_TICK_THRESHOLD = 10; // seconds before expiry to trigger refresh\nconst AUTO_REFRESH_TICK_MINIMUM = 1000; // minimum delay in ms (1 second)\nconst MAX_REFRESH_RETRIES = 3; // number of retry attempts before signing out\n\n/**\n * In-memory storage adapter for Node.js/SSR environments\n * where localStorage is not available\n */\nclass MemoryStorage implements Storage {\n  private store = new Map<string, string>();\n\n  get length(): number {\n    return this.store.size;\n  }\n\n  clear(): void {\n    this.store.clear();\n  }\n\n  getItem(key: string): string | null {\n    return this.store.get(key) ?? null;\n  }\n\n  setItem(key: string, value: string): void {\n    this.store.set(key, value);\n  }\n\n  removeItem(key: string): void {\n    this.store.delete(key);\n  }\n\n  key(index: number): string | null {\n    return [...this.store.keys()][index] ?? null;\n  }\n}\n\n/**\n * Check if localStorage is available and working\n */\nfunction isLocalStorageAvailable(): boolean {\n  try {\n    if (typeof localStorage === \"undefined\") {\n      return false;\n    }\n    // Test that localStorage actually works (some browsers block it)\n    const testKey = \"__fluxbase_storage_test__\";\n    localStorage.setItem(testKey, \"test\");\n    localStorage.removeItem(testKey);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport class FluxbaseAuth {\n  private fetch: FluxbaseFetch;\n  private session: AuthSession | null = null;\n  private persist: boolean;\n  private autoRefresh: boolean;\n  private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n  private stateChangeListeners: Set<AuthStateChangeCallback> = new Set();\n  private storage: Storage | null = null;\n\n  constructor(fetch: FluxbaseFetch, autoRefresh = true, persist = true) {\n    this.fetch = fetch;\n    this.persist = persist;\n    this.autoRefresh = autoRefresh;\n\n    // Register refresh callback for automatic 401 handling\n    this.fetch.setRefreshTokenCallback(async () => {\n      const result = await this.refreshSession();\n      return !result.error;\n    });\n\n    // Initialize storage based on persist option and environment\n    if (this.persist) {\n      if (isLocalStorageAvailable()) {\n        this.storage = localStorage;\n      } else {\n        // Node.js/SSR fallback - use in-memory storage\n        this.storage = new MemoryStorage();\n      }\n    }\n\n    // Load session from storage if persisted\n    if (this.storage) {\n      const stored = this.storage.getItem(AUTH_STORAGE_KEY);\n      if (stored) {\n        try {\n          this.session = JSON.parse(stored);\n          if (this.session) {\n            this.fetch.setAuthToken(this.session.access_token);\n            // Schedule auto-refresh if enabled (only runs in browser environments)\n            this.scheduleTokenRefresh();\n          }\n        } catch {\n          // Invalid stored session, ignore\n          this.storage.removeItem(AUTH_STORAGE_KEY);\n        }\n      }\n    }\n  }\n\n  /**\n   * Get the current session (Supabase-compatible)\n   * Returns the session from the client-side cache without making a network request\n   */\n  async getSession(): Promise<\n    FluxbaseResponse<{ session: AuthSession | null }>\n  > {\n    return { data: { session: this.session }, error: null };\n  }\n\n  /**\n   * Get the current user (Supabase-compatible)\n   * Returns the user from the client-side session without making a network request\n   * For server-side validation, use getCurrentUser() instead\n   */\n  async getUser(): Promise<FluxbaseResponse<{ user: User | null }>> {\n    return { data: { user: this.session?.user ?? null }, error: null };\n  }\n\n  /**\n   * Get the current access token\n   */\n  getAccessToken(): string | null {\n    return this.session?.access_token ?? null;\n  }\n\n  /**\n   * Listen to auth state changes (Supabase-compatible)\n   * @param callback - Function called when auth state changes\n   * @returns Object containing subscription data\n   *\n   * @example\n   * ```typescript\n   * const { data: { subscription } } = client.auth.onAuthStateChange((event, session) => {\n   *   console.log('Auth event:', event, session)\n   * })\n   *\n   * // Later, to unsubscribe:\n   * subscription.unsubscribe()\n   * ```\n   */\n  onAuthStateChange(callback: AuthStateChangeCallback): {\n    data: { subscription: AuthSubscription };\n  } {\n    this.stateChangeListeners.add(callback);\n\n    const subscription: AuthSubscription = {\n      unsubscribe: () => {\n        this.stateChangeListeners.delete(callback);\n      },\n    };\n\n    return { data: { subscription } };\n  }\n\n  /**\n   * Start the automatic token refresh timer\n   * This is called automatically when autoRefresh is enabled and a session exists\n   * Only works in browser environments\n   */\n  startAutoRefresh(): void {\n    this.scheduleTokenRefresh();\n  }\n\n  /**\n   * Stop the automatic token refresh timer\n   * Call this when you want to disable auto-refresh without signing out\n   */\n  stopAutoRefresh(): void {\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n      this.refreshTimer = null;\n    }\n  }\n\n  /**\n   * Sign in with email and password (Supabase-compatible)\n   * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n   */\n  async signIn(\n    credentials: SignInCredentials,\n  ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n    return wrapAsync(async () => {\n      // Build request body with proper field names for backend\n      const requestBody: any = {\n        email: credentials.email,\n        password: credentials.password,\n      };\n\n      // Include CAPTCHA token if provided (transform camelCase to snake_case)\n      if (credentials.captchaToken) {\n        requestBody.captcha_token = credentials.captchaToken;\n      }\n\n      // Include challenge ID for adaptive trust validation\n      if (credentials.challengeId) {\n        requestBody.challenge_id = credentials.challengeId;\n      }\n\n      // Include device fingerprint for trust tracking\n      if (credentials.deviceFingerprint) {\n        requestBody.device_fingerprint = credentials.deviceFingerprint;\n      }\n\n      const response = await this.fetch.post<\n        AuthResponse | SignInWith2FAResponse\n      >(\"/api/v1/auth/signin\", requestBody);\n\n      // Check if 2FA is required\n      if (\"requires_2fa\" in response && response.requires_2fa) {\n        return response as SignInWith2FAResponse;\n      }\n\n      // Normal sign in without 2FA\n      const authResponse = response as AuthResponse;\n      const session: AuthSession = {\n        ...authResponse,\n        expires_at: Date.now() + authResponse.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Sign in with email and password (Supabase-compatible)\n   * Alias for signIn() to maintain compatibility with common authentication patterns\n   * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n   */\n  async signInWithPassword(\n    credentials: SignInCredentials,\n  ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n    return this.signIn(credentials);\n  }\n\n  /**\n   * Sign up with email and password (Supabase-compatible)\n   * Returns session when email confirmation is disabled\n   * Returns null session when email confirmation is required\n   */\n  async signUp(credentials: SignUpCredentials): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      // Transform Supabase-style options.data to backend's user_metadata format\n      const requestBody: any = {\n        email: credentials.email,\n        password: credentials.password,\n      };\n\n      // Map options.data to user_metadata for the backend\n      if (credentials.options?.data) {\n        requestBody.user_metadata = credentials.options.data;\n      }\n\n      // Include CAPTCHA token if provided\n      if (credentials.captchaToken) {\n        requestBody.captcha_token = credentials.captchaToken;\n      }\n\n      // Include challenge ID for adaptive trust validation\n      if (credentials.challengeId) {\n        requestBody.challenge_id = credentials.challengeId;\n      }\n\n      // Include device fingerprint for trust tracking\n      if (credentials.deviceFingerprint) {\n        requestBody.device_fingerprint = credentials.deviceFingerprint;\n      }\n\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/signup\",\n        requestBody,\n      );\n\n      // Check if session tokens are provided (no email confirmation required)\n      if (response.access_token && response.refresh_token) {\n        const session: AuthSession = {\n          ...response,\n          expires_at: Date.now() + response.expires_in * 1000,\n        };\n\n        this.setSessionInternal(session);\n        return { user: response.user, session };\n      }\n\n      // Email confirmation required - return user without session\n      return { user: response.user, session: null };\n    });\n  }\n\n  /**\n   * Get CAPTCHA configuration from the server\n   * Use this to determine which CAPTCHA provider to load and configure\n   * @returns Promise with CAPTCHA configuration (provider, site key, enabled endpoints)\n   */\n  async getCaptchaConfig(): Promise<DataResponse<CaptchaConfig>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<CaptchaConfig>(\"/api/v1/auth/captcha/config\");\n    });\n  }\n\n  /**\n   * Check if CAPTCHA is required for an authentication action (adaptive trust)\n   *\n   * This pre-flight check evaluates trust signals (known IP, device, previous CAPTCHA)\n   * to determine if CAPTCHA verification is needed. Use this before showing auth forms\n   * to provide a better user experience for trusted users.\n   *\n   * @param request - Check request with endpoint and optional trust signals\n   * @returns Promise with whether CAPTCHA is required and challenge tracking info\n   *\n   * @example\n   * ```typescript\n   * // Check if CAPTCHA is needed for login\n   * const { data, error } = await client.auth.checkCaptcha({\n   *   endpoint: 'login',\n   *   email: 'user@example.com'\n   * });\n   *\n   * if (data?.captcha_required) {\n   *   // Show CAPTCHA widget using data.provider and data.site_key\n   *   const captchaToken = await showCaptchaWidget(data.provider, data.site_key);\n   *\n   *   // Include challenge_id and captcha token in sign in\n   *   await client.auth.signIn({\n   *     email: 'user@example.com',\n   *     password: 'password',\n   *     captchaToken,\n   *     challengeId: data.challenge_id\n   *   });\n   * } else {\n   *   // No CAPTCHA needed - trusted user\n   *   await client.auth.signIn({\n   *     email: 'user@example.com',\n   *     password: 'password',\n   *     challengeId: data?.challenge_id // Still include challenge_id\n   *   });\n   * }\n   * ```\n   */\n  async checkCaptcha(\n    request: CaptchaCheckRequest,\n  ): Promise<DataResponse<CaptchaCheckResponse>> {\n    return wrapAsync(async () => {\n      // Transform camelCase to snake_case for backend\n      const requestBody: any = {\n        endpoint: request.endpoint,\n      };\n\n      if (request.email) {\n        requestBody.email = request.email;\n      }\n\n      if (request.deviceFingerprint) {\n        requestBody.device_fingerprint = request.deviceFingerprint;\n      }\n\n      if (request.trustToken) {\n        requestBody.trust_token = request.trustToken;\n      }\n\n      return await this.fetch.post<CaptchaCheckResponse>(\n        \"/api/v1/auth/captcha/check\",\n        requestBody,\n      );\n    });\n  }\n\n  /**\n   * Get comprehensive authentication configuration from the server\n   * Returns all public auth settings including signup status, OAuth providers,\n   * SAML providers, password requirements, and CAPTCHA config in a single request.\n   *\n   * Use this to:\n   * - Conditionally render signup forms based on signup_enabled\n   * - Display available OAuth/SAML provider buttons\n   * - Show password requirements to users\n   * - Configure CAPTCHA widgets\n   *\n   * @returns Promise with complete authentication configuration\n   * @example\n   * ```typescript\n   * const { data, error } = await client.auth.getAuthConfig();\n   * if (data) {\n   *   console.log('Signup enabled:', data.signup_enabled);\n   *   console.log('OAuth providers:', data.oauth_providers);\n   *   console.log('Password min length:', data.password_min_length);\n   * }\n   * ```\n   */\n  async getAuthConfig(): Promise<DataResponse<AuthConfig>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<AuthConfig>(\"/api/v1/auth/config\");\n    });\n  }\n\n  /**\n   * Sign out the current user\n   */\n  async signOut(): Promise<VoidResponse> {\n    return wrapAsyncVoid(async () => {\n      try {\n        await this.fetch.post(\"/api/v1/auth/signout\");\n      } finally {\n        this.clearSession();\n      }\n    });\n  }\n\n  /**\n   * Refresh the session (Supabase-compatible)\n   * Returns a new session with refreshed tokens\n   */\n  async refreshSession(): Promise<\n    FluxbaseResponse<{ user: User; session: AuthSession }>\n  > {\n    return wrapAsync(async () => {\n      if (!this.session?.refresh_token) {\n        throw new Error(\"No refresh token available\");\n      }\n\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/refresh\",\n        {\n          refresh_token: this.session.refresh_token,\n        },\n        { skipAutoRefresh: true }, // Prevent infinite loop on 401\n      );\n\n      const session: AuthSession = {\n        ...response,\n        user: response.user ?? this.session.user,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Refresh the session (Supabase-compatible alias)\n   * Alias for refreshSession() to maintain compatibility with Supabase naming\n   * Returns a new session with refreshed tokens\n   */\n  async refreshToken(): Promise<\n    FluxbaseResponse<{ user: User; session: AuthSession }>\n  > {\n    return this.refreshSession();\n  }\n\n  /**\n   * Get the current user from the server\n   */\n  async getCurrentUser(): Promise<UserResponse> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n      return { user };\n    });\n  }\n\n  /**\n   * Update the current user (Supabase-compatible)\n   * @param attributes - User attributes to update (email, password, data for metadata)\n   */\n  async updateUser(attributes: UpdateUserAttributes): Promise<UserResponse> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      // Transform Supabase-style 'data' to backend's 'user_metadata' format\n      const requestBody: any = {};\n\n      if (attributes.email) {\n        requestBody.email = attributes.email;\n      }\n\n      if (attributes.password) {\n        requestBody.password = attributes.password;\n      }\n\n      if (attributes.data) {\n        requestBody.user_metadata = attributes.data;\n      }\n\n      if (attributes.nonce) {\n        requestBody.nonce = attributes.nonce;\n      }\n\n      const user = await this.fetch.patch<User>(\n        \"/api/v1/auth/user\",\n        requestBody,\n      );\n\n      // Update session with new user data\n      if (this.session) {\n        this.session.user = user;\n        this.saveSession();\n        this.emitAuthChange(\"USER_UPDATED\", this.session);\n      }\n\n      return { user };\n    });\n  }\n\n  /**\n   * Set the session manually (Supabase-compatible)\n   * Useful for restoring a session from storage or SSR scenarios\n   * @param session - Object containing access_token and refresh_token\n   * @returns Promise with session data\n   */\n  async setSession(session: {\n    access_token: string;\n    refresh_token: string;\n  }): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      // Create a full auth session from the tokens\n      const authSession: AuthSession = {\n        access_token: session.access_token,\n        refresh_token: session.refresh_token,\n        user: null as any, // Will be populated by getCurrentUser\n        expires_in: 3600, // Default, will be updated on refresh\n        expires_at: Date.now() + 3600 * 1000,\n      };\n\n      // Set the token so we can make authenticated requests\n      this.fetch.setAuthToken(session.access_token);\n\n      // Fetch the current user to populate the session\n      const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n      authSession.user = user;\n\n      // Store the session\n      this.setSessionInternal(authSession, \"SIGNED_IN\");\n\n      return { user, session: authSession };\n    });\n  }\n\n  /**\n   * Setup 2FA for the current user (Supabase-compatible)\n   * Enrolls a new MFA factor and returns TOTP details\n   * @param issuer - Optional custom issuer name for the QR code (e.g., \"MyApp\"). If not provided, uses server default.\n   * @returns Promise with factor id, type, and TOTP setup details\n   */\n  async setup2FA(\n    issuer?: string,\n  ): Promise<DataResponse<TwoFactorSetupResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.post<TwoFactorSetupResponse>(\n        \"/api/v1/auth/2fa/setup\",\n        issuer ? { issuer } : undefined,\n      );\n    });\n  }\n\n  /**\n   * Enable 2FA after verifying the TOTP code (Supabase-compatible)\n   * Verifies the TOTP code and returns new tokens with MFA session\n   * @param code - TOTP code from authenticator app\n   * @returns Promise with access_token, refresh_token, and user\n   */\n  async enable2FA(\n    code: string,\n  ): Promise<DataResponse<TwoFactorEnableResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.post<TwoFactorEnableResponse>(\n        \"/api/v1/auth/2fa/enable\",\n        { code },\n      );\n    });\n  }\n\n  /**\n   * Disable 2FA for the current user (Supabase-compatible)\n   * Unenrolls the MFA factor\n   * @param password - User password for confirmation\n   * @returns Promise with unenrolled factor id\n   */\n  async disable2FA(\n    password: string,\n  ): Promise<DataResponse<TwoFactorDisableResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.post<TwoFactorDisableResponse>(\n        \"/api/v1/auth/2fa/disable\",\n        { password },\n      );\n    });\n  }\n\n  /**\n   * Check 2FA status for the current user (Supabase-compatible)\n   * Lists all enrolled MFA factors\n   * @returns Promise with all factors and TOTP factors\n   */\n  async get2FAStatus(): Promise<DataResponse<TwoFactorStatusResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.get<TwoFactorStatusResponse>(\n        \"/api/v1/auth/2fa/status\",\n      );\n    });\n  }\n\n  /**\n   * Verify 2FA code during login (Supabase-compatible)\n   * Call this after signIn returns requires_2fa: true\n   * @param request - User ID and TOTP code\n   * @returns Promise with access_token, refresh_token, and user\n   */\n  async verify2FA(\n    request: TwoFactorVerifyRequest,\n  ): Promise<DataResponse<TwoFactorLoginResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<TwoFactorLoginResponse>(\n        \"/api/v1/auth/2fa/verify\",\n        request,\n      );\n\n      // Create session from the response tokens\n      if (response.access_token && response.refresh_token) {\n        const session: AuthSession = {\n          user: response.user,\n          access_token: response.access_token,\n          refresh_token: response.refresh_token,\n          expires_in: response.expires_in || 3600,\n          expires_at: Date.now() + (response.expires_in || 3600) * 1000,\n        };\n\n        this.setSessionInternal(session, \"MFA_CHALLENGE_VERIFIED\");\n      }\n\n      return response;\n    });\n  }\n\n  /**\n   * Send password reset email (Supabase-compatible)\n   * Sends a password reset link to the provided email address\n   * @param email - Email address to send reset link to\n   * @param options - Optional configuration including redirect URL and CAPTCHA token\n   * @returns Promise with OTP-style response\n   */\n  async sendPasswordReset(\n    email: string,\n    options?: { redirectTo?: string; captchaToken?: string },\n  ): Promise<DataResponse<PasswordResetResponse>> {\n    return wrapAsync(async () => {\n      const requestBody: any = { email };\n\n      // Include redirect URL if provided\n      if (options?.redirectTo) {\n        requestBody.redirect_to = options.redirectTo;\n      }\n\n      // Include CAPTCHA token if provided\n      if (options?.captchaToken) {\n        requestBody.captcha_token = options.captchaToken;\n      }\n\n      await this.fetch.post(\"/api/v1/auth/password/reset\", requestBody);\n      // Return Supabase-compatible OTP response\n      return { user: null, session: null };\n    });\n  }\n\n  /**\n   * Supabase-compatible alias for sendPasswordReset()\n   * @param email - Email address to send reset link to\n   * @param options - Optional redirect and CAPTCHA configuration\n   * @returns Promise with OTP-style response\n   */\n  async resetPasswordForEmail(\n    email: string,\n    options?: { redirectTo?: string; captchaToken?: string },\n  ): Promise<DataResponse<PasswordResetResponse>> {\n    return this.sendPasswordReset(email, {\n      redirectTo: options?.redirectTo,\n      captchaToken: options?.captchaToken,\n    });\n  }\n\n  /**\n   * Verify password reset token\n   * Check if a password reset token is valid before allowing password reset\n   * @param token - Password reset token to verify\n   */\n  async verifyResetToken(\n    token: string,\n  ): Promise<DataResponse<VerifyResetTokenResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.post<VerifyResetTokenResponse>(\n        \"/api/v1/auth/password/reset/verify\",\n        {\n          token,\n        },\n      );\n    });\n  }\n\n  /**\n   * Reset password with token (Supabase-compatible)\n   * Complete the password reset process with a valid token\n   * @param token - Password reset token\n   * @param newPassword - New password to set\n   * @returns Promise with user and new session\n   */\n  async resetPassword(\n    token: string,\n    newPassword: string,\n  ): Promise<DataResponse<ResetPasswordResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/password/reset/confirm\",\n        {\n          token,\n          new_password: newPassword,\n        },\n      );\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session, \"PASSWORD_RECOVERY\");\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Send magic link for passwordless authentication (Supabase-compatible)\n   * @param email - Email address to send magic link to\n   * @param options - Optional configuration for magic link\n   * @returns Promise with OTP-style response\n   */\n  async sendMagicLink(\n    email: string,\n    options?: MagicLinkOptions,\n  ): Promise<DataResponse<MagicLinkResponse>> {\n    return wrapAsync(async () => {\n      const requestBody: any = {\n        email,\n        redirect_to: options?.redirect_to,\n      };\n\n      // Include CAPTCHA token if provided\n      if (options?.captchaToken) {\n        requestBody.captcha_token = options.captchaToken;\n      }\n\n      await this.fetch.post(\"/api/v1/auth/magiclink\", requestBody);\n      // Return Supabase-compatible OTP response\n      return { user: null, session: null };\n    });\n  }\n\n  /**\n   * Verify magic link token and sign in\n   * @param token - Magic link token from email\n   */\n  async verifyMagicLink(token: string): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/magiclink/verify\",\n        {\n          token,\n        },\n      );\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Sign in anonymously\n   * Creates a temporary anonymous user session\n   */\n  async signInAnonymously(): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AnonymousSignInResponse>(\n        \"/api/v1/auth/signin/anonymous\",\n      );\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Get list of enabled OAuth providers\n   */\n  async getOAuthProviders(): Promise<DataResponse<OAuthProvidersResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<OAuthProvidersResponse>(\n        \"/api/v1/auth/oauth/providers\",\n      );\n    });\n  }\n\n  /**\n   * Get OAuth authorization URL for a provider\n   * @param provider - OAuth provider name (e.g., 'google', 'github')\n   * @param options - Optional OAuth configuration\n   */\n  async getOAuthUrl(\n    provider: string,\n    options?: OAuthOptions,\n  ): Promise<DataResponse<OAuthUrlResponse>> {\n    return wrapAsync(async () => {\n      const params = new URLSearchParams();\n      if (options?.redirect_to) {\n        params.append(\"redirect_to\", options.redirect_to);\n      }\n      if (options?.redirect_uri) {\n        params.append(\"redirect_uri\", options.redirect_uri);\n      }\n      if (options?.scopes && options.scopes.length > 0) {\n        params.append(\"scopes\", options.scopes.join(\",\"));\n      }\n\n      const queryString = params.toString();\n      const url = queryString\n        ? `/api/v1/auth/oauth/${provider}/authorize?${queryString}`\n        : `/api/v1/auth/oauth/${provider}/authorize`;\n\n      const response = await this.fetch.get<OAuthUrlResponse>(url);\n      return response;\n    });\n  }\n\n  /**\n   * Exchange OAuth authorization code for session\n   * This is typically called in your OAuth callback handler\n   * @param code - Authorization code from OAuth callback\n   * @param state - State parameter from OAuth callback (for CSRF protection)\n   */\n  async exchangeCodeForSession(\n    code: string,\n    state?: string,\n  ): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const provider = this.storage?.getItem(OAUTH_PROVIDER_KEY);\n      if (!provider) {\n        throw new Error(\"No OAuth provider found. Call signInWithOAuth first.\");\n      }\n\n      // Retrieve stored redirect_uri if it was used during authorization\n      const redirectUri = this.storage?.getItem(OAUTH_REDIRECT_URI_KEY);\n\n      // Build query string with code, optional state, and optional redirect_uri\n      const params = new URLSearchParams({ code });\n      if (state) {\n        params.append(\"state\", state);\n      }\n      if (redirectUri) {\n        params.append(\"redirect_uri\", redirectUri);\n      }\n\n      const response = await this.fetch.get<AuthResponse>(\n        `/api/v1/auth/oauth/${provider}/callback?${params.toString()}`,\n      );\n\n      // Clear stored provider and redirect_uri after successful exchange\n      this.storage?.removeItem(OAUTH_PROVIDER_KEY);\n      this.storage?.removeItem(OAUTH_REDIRECT_URI_KEY);\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Convenience method to initiate OAuth sign-in\n   * Redirects the user to the OAuth provider's authorization page\n   * @param provider - OAuth provider name (e.g., 'google', 'github')\n   * @param options - Optional OAuth configuration\n   */\n  async signInWithOAuth(\n    provider: string,\n    options?: OAuthOptions,\n  ): Promise<DataResponse<{ provider: string; url: string }>> {\n    return wrapAsync(async () => {\n      const result = await this.getOAuthUrl(provider, options);\n\n      if (result.error) {\n        throw result.error;\n      }\n\n      const url = result.data.url;\n\n      if (typeof window !== \"undefined\") {\n        // Store the provider and redirect_uri for use in exchangeCodeForSession\n        this.storage?.setItem(OAUTH_PROVIDER_KEY, provider);\n        if (options?.redirect_uri) {\n          this.storage?.setItem(OAUTH_REDIRECT_URI_KEY, options.redirect_uri);\n        }\n        window.location.href = url;\n      } else {\n        throw new Error(\n          \"signInWithOAuth can only be called in a browser environment\",\n        );\n      }\n\n      return { provider, url };\n    });\n  }\n\n  /**\n   * Get OAuth logout URL for a provider\n   * Use this to get the logout URL without automatically redirecting\n   * @param provider - OAuth provider name (e.g., 'google', 'github')\n   * @param options - Optional logout configuration\n   * @returns Promise with OAuth logout response including redirect URL if applicable\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.auth.getOAuthLogoutUrl('google')\n   * if (!error && data.redirect_url) {\n   *   // Redirect user to complete logout at provider\n   *   window.location.href = data.redirect_url\n   * }\n   * ```\n   */\n  async getOAuthLogoutUrl(\n    provider: string,\n    options?: OAuthLogoutOptions,\n  ): Promise<DataResponse<OAuthLogoutResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<OAuthLogoutResponse>(\n        `/api/v1/auth/oauth/${provider}/logout`,\n        options || {},\n      );\n\n      // Clear local session\n      this.clearSession();\n\n      return response;\n    });\n  }\n\n  /**\n   * Sign out with OAuth provider logout\n   * Revokes tokens at the OAuth provider and optionally redirects for OIDC logout\n   * @param provider - OAuth provider name (e.g., 'google', 'github')\n   * @param options - Optional logout configuration\n   * @returns Promise with OAuth logout response\n   *\n   * @example\n   * ```typescript\n   * // This will revoke tokens and redirect to provider's logout page if supported\n   * await client.auth.signOutWithOAuth('google', {\n   *   redirect_url: 'https://myapp.com/logged-out'\n   * })\n   * ```\n   */\n  async signOutWithOAuth(\n    provider: string,\n    options?: OAuthLogoutOptions,\n  ): Promise<DataResponse<OAuthLogoutResponse>> {\n    return wrapAsync(async () => {\n      const result = await this.getOAuthLogoutUrl(provider, options);\n\n      if (result.error) {\n        throw result.error;\n      }\n\n      // If redirect is needed and we're in a browser, redirect\n      if (\n        result.data.requires_redirect &&\n        result.data.redirect_url &&\n        typeof window !== \"undefined\"\n      ) {\n        window.location.href = result.data.redirect_url;\n      }\n\n      return result.data;\n    });\n  }\n\n  /**\n   * Get provider OAuth tokens for calling external APIs\n   *\n   * Retrieves the stored OAuth tokens for a provider (e.g., Google, GitHub) that\n   * the user has previously authenticated with. Use these tokens to call provider\n   * APIs directly (e.g., Google Drive API).\n   *\n   * The access_token is automatically refreshed if it has expired or is about to expire.\n   *\n   * @param provider - OAuth provider name (e.g., 'google', 'github')\n   * @returns Promise with provider tokens (access_token, refresh_token, etc.)\n   *\n   * @example\n   * ```typescript\n   * // Get Google tokens to call Google Drive API\n   * const { data, error } = await client.auth.getProviderToken('google')\n   *\n   * if (error) {\n   *   if (error.error_code === 'oauth_token_not_found') {\n   *     // User needs to sign in with Google first\n   *     window.location.href = error.authorize_url\n   *   }\n   *   return\n   * }\n   *\n   * // Use the access token to call Google Drive API\n   * const response = await fetch('https://www.googleapis.com/drive/v3/files', {\n   *   headers: {\n   *     'Authorization': `Bearer ${data.access_token}`\n   *   }\n   * })\n   * const files = await response.json()\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Check token expiry before making API calls\n   * const { data } = await client.auth.getProviderToken('google')\n   *\n   * if (data.expires_in < 60) {\n   *   console.warn('Token expires soon, consider caching and refreshing')\n   * }\n   *\n   * // Token expiry is also available as ISO timestamp\n   * console.log('Token expires at:', data.token_expiry)\n   * ```\n   */\n  async getProviderToken(\n    provider: string,\n  ): Promise<DataResponse<ProviderTokenResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.get<ProviderTokenResponse>(\n        `/api/v1/auth/oauth/${provider}/token`,\n      );\n    });\n  }\n\n  /**\n   * Sign in with OTP (One-Time Password) - Supabase-compatible\n   * Sends a one-time password via email or SMS for passwordless authentication\n   * @param credentials - Email or phone number and optional configuration\n   * @returns Promise with OTP-style response\n   */\n  async signInWithOtp(\n    credentials: SignInWithOtpCredentials,\n  ): Promise<DataResponse<OTPResponse>> {\n    return wrapAsync(async () => {\n      await this.fetch.post(\"/api/v1/auth/otp/signin\", credentials);\n      // Return Supabase-compatible OTP response\n      return { user: null, session: null };\n    });\n  }\n\n  /**\n   * Verify OTP (One-Time Password) - Supabase-compatible\n   * Verify OTP tokens for various authentication flows\n   * @param params - OTP verification parameters including token and type\n   * @returns Promise with user and session if successful\n   */\n  async verifyOtp(params: VerifyOtpParams): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/otp/verify\",\n        params,\n      );\n\n      // Check if session tokens are provided\n      if (response.access_token && response.refresh_token) {\n        const session: AuthSession = {\n          ...response,\n          expires_at: Date.now() + response.expires_in * 1000,\n        };\n\n        this.setSessionInternal(session);\n        return { user: response.user, session };\n      }\n\n      // Email confirmation required - return user without session\n      return { user: response.user, session: null };\n    });\n  }\n\n  /**\n   * Resend OTP (One-Time Password) - Supabase-compatible\n   * Resend OTP code when user doesn't receive it\n   * @param params - Resend parameters including type and email/phone\n   * @returns Promise with OTP-style response\n   */\n  async resendOtp(params: ResendOtpParams): Promise<DataResponse<OTPResponse>> {\n    return wrapAsync(async () => {\n      await this.fetch.post(\"/api/v1/auth/otp/resend\", params);\n      // Return Supabase-compatible OTP response\n      return { user: null, session: null };\n    });\n  }\n\n  /**\n   * Get user identities (linked OAuth providers) - Supabase-compatible\n   * Lists all OAuth identities linked to the current user\n   * @returns Promise with list of user identities\n   */\n  async getUserIdentities(): Promise<DataResponse<UserIdentitiesResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.get<UserIdentitiesResponse>(\n        \"/api/v1/auth/user/identities\",\n      );\n    });\n  }\n\n  /**\n   * Link an OAuth identity to current user - Supabase-compatible\n   * Links an additional OAuth provider to the existing account\n   * @param credentials - Provider to link\n   * @returns Promise with OAuth URL to complete linking\n   */\n  async linkIdentity(\n    credentials: LinkIdentityCredentials,\n  ): Promise<DataResponse<OAuthUrlResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.post<OAuthUrlResponse>(\n        \"/api/v1/auth/user/identities\",\n        credentials,\n      );\n    });\n  }\n\n  /**\n   * Unlink an OAuth identity from current user - Supabase-compatible\n   * Removes a linked OAuth provider from the account\n   * @param params - Identity to unlink\n   * @returns Promise with void response\n   */\n  async unlinkIdentity(params: UnlinkIdentityParams): Promise<VoidResponse> {\n    return wrapAsyncVoid(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      await this.fetch.delete(\n        `/api/v1/auth/user/identities/${params.identity.id}`,\n      );\n    });\n  }\n\n  /**\n   * Reauthenticate to get security nonce - Supabase-compatible\n   * Get a security nonce for sensitive operations (password change, etc.)\n   * @returns Promise with nonce for reauthentication\n   */\n  async reauthenticate(): Promise<DataResponse<ReauthenticateResponse>> {\n    return wrapAsync(async () => {\n      if (!this.session) {\n        throw new Error(\"Not authenticated\");\n      }\n\n      return await this.fetch.post<ReauthenticateResponse>(\n        \"/api/v1/auth/reauthenticate\",\n      );\n    });\n  }\n\n  /**\n   * Sign in with ID token (for native mobile apps) - Supabase-compatible\n   * Authenticate using native mobile app ID tokens (Google, Apple)\n   * @param credentials - Provider, ID token, and optional nonce\n   * @returns Promise with user and session\n   */\n  async signInWithIdToken(\n    credentials: SignInWithIdTokenCredentials,\n  ): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/signin/idtoken\",\n        credentials,\n      );\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  // ==========================================================================\n  // SAML SSO Methods\n  // ==========================================================================\n\n  /**\n   * Get list of available SAML SSO providers\n   * @returns Promise with list of configured SAML providers\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.auth.getSAMLProviders()\n   * if (!error) {\n   *   console.log('Available providers:', data.providers)\n   * }\n   * ```\n   */\n  async getSAMLProviders(): Promise<DataResponse<SAMLProvidersResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<SAMLProvidersResponse>(\n        \"/api/v1/auth/saml/providers\",\n      );\n    });\n  }\n\n  /**\n   * Get SAML login URL for a specific provider\n   * Use this to redirect the user to the IdP for authentication\n   * @param provider - SAML provider name/ID\n   * @param options - Optional login configuration\n   * @returns Promise with SAML login URL\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.auth.getSAMLLoginUrl('okta')\n   * if (!error) {\n   *   window.location.href = data.url\n   * }\n   * ```\n   */\n  async getSAMLLoginUrl(\n    provider: string,\n    options?: SAMLLoginOptions,\n  ): Promise<DataResponse<SAMLLoginResponse>> {\n    return wrapAsync(async () => {\n      const params = new URLSearchParams();\n      if (options?.redirectUrl) {\n        params.append(\"redirect_url\", options.redirectUrl);\n      }\n\n      const queryString = params.toString();\n      const url = queryString\n        ? `/api/v1/auth/saml/login/${provider}?${queryString}`\n        : `/api/v1/auth/saml/login/${provider}`;\n\n      const response = await this.fetch.get<SAMLLoginResponse>(url);\n      return response;\n    });\n  }\n\n  /**\n   * Initiate SAML login and redirect to IdP\n   * This is a convenience method that redirects the user to the SAML IdP\n   * @param provider - SAML provider name/ID\n   * @param options - Optional login configuration\n   * @returns Promise with provider and URL (browser will redirect)\n   *\n   * @example\n   * ```typescript\n   * // In browser, this will redirect to the SAML IdP\n   * await client.auth.signInWithSAML('okta')\n   * ```\n   */\n  async signInWithSAML(\n    provider: string,\n    options?: SAMLLoginOptions,\n  ): Promise<DataResponse<{ provider: string; url: string }>> {\n    return wrapAsync(async () => {\n      const result = await this.getSAMLLoginUrl(provider, options);\n\n      if (result.error) {\n        throw result.error;\n      }\n\n      const url = result.data.url;\n\n      if (typeof window !== \"undefined\") {\n        window.location.href = url;\n      } else {\n        throw new Error(\n          \"signInWithSAML can only be called in a browser environment\",\n        );\n      }\n\n      return { provider, url };\n    });\n  }\n\n  /**\n   * Handle SAML callback after IdP authentication\n   * Call this from your SAML callback page to complete authentication\n   * @param samlResponse - Base64-encoded SAML response from the ACS endpoint\n   * @param provider - SAML provider name (optional, extracted from RelayState)\n   * @returns Promise with user and session\n   *\n   * @example\n   * ```typescript\n   * // In your SAML callback page\n   * const urlParams = new URLSearchParams(window.location.search)\n   * const samlResponse = urlParams.get('SAMLResponse')\n   *\n   * if (samlResponse) {\n   *   const { data, error } = await client.auth.handleSAMLCallback(samlResponse)\n   *   if (!error) {\n   *     console.log('Logged in:', data.user)\n   *   }\n   * }\n   * ```\n   */\n  async handleSAMLCallback(\n    samlResponse: string,\n    provider?: string,\n  ): Promise<FluxbaseAuthResponse> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AuthResponse>(\n        \"/api/v1/auth/saml/acs\",\n        {\n          saml_response: samlResponse,\n          provider,\n        },\n      );\n\n      const session: AuthSession = {\n        ...response,\n        expires_at: Date.now() + response.expires_in * 1000,\n      };\n\n      this.setSessionInternal(session);\n      return { user: session.user, session };\n    });\n  }\n\n  /**\n   * Get SAML Service Provider metadata for a specific provider configuration\n   * Use this when configuring your IdP to download the SP metadata XML\n   * @param provider - SAML provider name/ID\n   * @returns Promise with SP metadata URL\n   *\n   * @example\n   * ```typescript\n   * const metadataUrl = client.auth.getSAMLMetadataUrl('okta')\n   * // Share this URL with your IdP administrator\n   * ```\n   */\n  getSAMLMetadataUrl(provider: string): string {\n    const baseUrl = this.fetch[\"baseUrl\"];\n    return `${baseUrl}/api/v1/auth/saml/metadata/${provider}`;\n  }\n\n  /**\n   * Internal: Set the session and persist it\n   */\n  private setSessionInternal(\n    session: AuthSession,\n    event: AuthChangeEvent = \"SIGNED_IN\",\n  ) {\n    this.session = session;\n    this.fetch.setAuthToken(session.access_token);\n    this.saveSession();\n    this.scheduleTokenRefresh();\n    this.emitAuthChange(event, session);\n  }\n\n  /**\n   * Internal: Clear the session\n   */\n  private clearSession() {\n    this.session = null;\n    this.fetch.setAuthToken(null);\n\n    if (this.storage) {\n      this.storage.removeItem(AUTH_STORAGE_KEY);\n    }\n\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n      this.refreshTimer = null;\n    }\n\n    this.emitAuthChange(\"SIGNED_OUT\", null);\n  }\n\n  /**\n   * Internal: Save session to storage\n   */\n  private saveSession() {\n    if (this.storage && this.session) {\n      this.storage.setItem(AUTH_STORAGE_KEY, JSON.stringify(this.session));\n    }\n  }\n\n  /**\n   * Internal: Schedule automatic token refresh\n   * Only runs in browser environments when autoRefresh is enabled\n   */\n  private scheduleTokenRefresh() {\n    // Only auto-refresh in browser environments\n    if (!this.autoRefresh || typeof window === \"undefined\") {\n      return;\n    }\n\n    if (!this.session?.expires_at) {\n      return;\n    }\n\n    // Clear existing timer\n    if (this.refreshTimer) {\n      clearTimeout(this.refreshTimer);\n      this.refreshTimer = null;\n    }\n\n    // Calculate time until expiry (expires_at is in ms)\n    const expiresAt = this.session.expires_at;\n    const now = Date.now();\n    const timeUntilExpiry = expiresAt - now;\n\n    // Refresh 10 seconds before expiry, minimum 1 second delay\n    const refreshIn = Math.max(\n      timeUntilExpiry - AUTO_REFRESH_TICK_THRESHOLD * 1000,\n      AUTO_REFRESH_TICK_MINIMUM,\n    );\n\n    this.refreshTimer = setTimeout(() => {\n      this.attemptRefresh();\n    }, refreshIn);\n  }\n\n  /**\n   * Internal: Attempt to refresh the token with retry logic\n   * Uses exponential backoff: 1s, 2s, 4s delays between retries\n   */\n  private async attemptRefresh(retries = MAX_REFRESH_RETRIES): Promise<void> {\n    try {\n      const result = await this.refreshSession();\n      if (result.error) {\n        throw result.error;\n      }\n      // Success - scheduleTokenRefresh is called within setSessionInternal\n      // via refreshSession -> setSessionInternal -> scheduleTokenRefresh\n    } catch (error) {\n      if (retries > 0) {\n        // Exponential backoff: 1s, 2s, 4s (Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000)\n        const delay = Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000;\n        console.warn(\n          `Token refresh failed, retrying in ${delay / 1000}s (${retries} attempts remaining)`,\n          error,\n        );\n        this.refreshTimer = setTimeout(() => {\n          this.attemptRefresh(retries - 1);\n        }, delay);\n      } else {\n        // All retries exhausted - sign out\n        console.error(\n          \"Token refresh failed after all retries, signing out\",\n          error,\n        );\n        this.clearSession();\n      }\n    }\n  }\n\n  /**\n   * Internal: Emit auth state change event to all listeners\n   */\n  private emitAuthChange(event: AuthChangeEvent, session: AuthSession | null) {\n    this.stateChangeListeners.forEach((callback) => {\n      try {\n        callback(event, session);\n      } catch (error) {\n        console.error(\"Error in auth state change listener:\", error);\n      }\n    });\n  }\n}\n","/**\n * Realtime subscriptions using WebSockets\n */\n\nimport type {\n  RealtimeCallback,\n  RealtimePostgresChangesPayload,\n  RealtimeMessage,\n  PostgresChangesConfig,\n  RealtimeChannelConfig,\n  PresenceState,\n  RealtimePresencePayload,\n  PresenceCallback,\n  BroadcastMessage,\n  RealtimeBroadcastPayload,\n  BroadcastCallback,\n  ExecutionLogEvent,\n  ExecutionLogCallback,\n  ExecutionType,\n} from \"./types\";\n\nexport class RealtimeChannel {\n  private ws: WebSocket | null = null;\n  private url: string;\n  private token: string | null;\n  private channelName: string;\n  private callbacks: Map<string, Set<RealtimeCallback>> = new Map();\n  private presenceCallbacks: Map<string, Set<PresenceCallback>> = new Map();\n  private broadcastCallbacks: Map<string, Set<BroadcastCallback>> = new Map();\n  private executionLogCallbacks: Set<ExecutionLogCallback> = new Set();\n  private subscriptionConfigs: Array<{\n    config: PostgresChangesConfig;\n    callbacks: Set<RealtimeCallback>;\n  }> = [];\n  private subscriptionIds: Map<string, string> = new Map(); // \"schema.table\" -> subscription_id\n  private executionLogConfig: {\n    execution_id: string;\n    type?: ExecutionType;\n  } | null = null;\n  private _presenceState: Record<string, PresenceState[]> = {};\n  private myPresenceKey: string | null = null;\n  private config: RealtimeChannelConfig;\n  private reconnectAttempts = 0;\n  private maxReconnectAttempts = 10;\n  private reconnectDelay = 1000;\n  private shouldReconnect = true;\n  private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n  private pendingAcks: Map<\n    string,\n    {\n      resolve: (value: string) => void;\n      reject: (reason: any) => void;\n      timeout: ReturnType<typeof setTimeout>;\n    }\n  > = new Map();\n  private messageIdCounter = 0;\n  private onTokenRefreshNeeded: (() => Promise<string | null>) | null = null;\n  private isRefreshingToken = false;\n\n  constructor(\n    url: string,\n    channelName: string,\n    token: string | null = null,\n    config: RealtimeChannelConfig = {}\n  ) {\n    this.url = url;\n    this.channelName = channelName;\n    this.token = token;\n    this.config = config;\n  }\n\n  /**\n   * Set callback to request a token refresh when connection fails due to auth\n   * @internal\n   */\n  setTokenRefreshCallback(callback: () => Promise<string | null>) {\n    this.onTokenRefreshNeeded = callback;\n  }\n\n  /**\n   * Listen to postgres_changes with optional row-level filtering\n   *\n   * @param event - 'postgres_changes'\n   * @param config - Configuration including optional filter\n   * @param callback - Function to call when changes occur\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.on('postgres_changes', {\n   *   event: '*',\n   *   schema: 'public',\n   *   table: 'jobs',\n   *   filter: 'created_by=eq.user123'\n   * }, (payload) => {\n   *   console.log('Job updated:', payload)\n   * })\n   * ```\n   */\n  on(\n    event: \"postgres_changes\",\n    config: PostgresChangesConfig,\n    callback: RealtimeCallback\n  ): this;\n\n  /**\n   * Listen to a specific event type (backwards compatibility)\n   *\n   * @param event - The event type (INSERT, UPDATE, DELETE, or '*' for all)\n   * @param callback - The callback function\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.on('INSERT', (payload) => {\n   *   console.log('New record inserted:', payload.new_record)\n   * })\n   * ```\n   */\n  on(\n    event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n    callback: RealtimeCallback\n  ): this;\n\n  /**\n   * Listen to broadcast messages\n   *\n   * @param event - 'broadcast'\n   * @param config - Configuration with event name\n   * @param callback - Function to call when broadcast received\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.on('broadcast', { event: 'cursor-pos' }, (payload) => {\n   *   console.log('Cursor moved:', payload)\n   * })\n   * ```\n   */\n  on(\n    event: \"broadcast\",\n    config: { event: string },\n    callback: BroadcastCallback\n  ): this;\n\n  /**\n   * Listen to presence events\n   *\n   * @param event - 'presence'\n   * @param config - Configuration with event type (sync, join, leave)\n   * @param callback - Function to call when presence changes\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.on('presence', { event: 'sync' }, (payload) => {\n   *   console.log('Presence synced:', payload)\n   * })\n   * ```\n   */\n  on(\n    event: \"presence\",\n    config: { event: \"sync\" | \"join\" | \"leave\" },\n    callback: PresenceCallback\n  ): this;\n\n  /**\n   * Listen to execution log events\n   *\n   * @param event - 'execution_log'\n   * @param config - Configuration with execution_id and optional type\n   * @param callback - Function to call when log entries are received\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.on('execution_log', { execution_id: 'abc123', type: 'function' }, (log) => {\n   *   console.log(`[${log.level}] ${log.message}`)\n   * })\n   * ```\n   */\n  on(\n    event: \"execution_log\",\n    config: { execution_id: string; type?: ExecutionType },\n    callback: ExecutionLogCallback\n  ): this;\n\n  // Implementation\n  on(\n    event:\n      | \"postgres_changes\"\n      | \"INSERT\"\n      | \"UPDATE\"\n      | \"DELETE\"\n      | \"*\"\n      | \"broadcast\"\n      | \"presence\"\n      | \"execution_log\",\n    configOrCallback:\n      | PostgresChangesConfig\n      | RealtimeCallback\n      | { event: string }\n      | { event: \"sync\" | \"join\" | \"leave\" }\n      | { execution_id: string; type?: ExecutionType },\n    callback?:\n      | RealtimeCallback\n      | BroadcastCallback\n      | PresenceCallback\n      | ExecutionLogCallback\n  ): this {\n    if (\n      event === \"postgres_changes\" &&\n      typeof configOrCallback !== \"function\"\n    ) {\n      // on('postgres_changes', config, callback)\n      const config = configOrCallback as PostgresChangesConfig;\n      const actualCallback = callback as RealtimeCallback;\n\n      // Find existing config for same table/schema/event/filter combination\n      let entry = this.subscriptionConfigs.find(\n        (e) =>\n          e.config.schema === config.schema &&\n          e.config.table === config.table &&\n          e.config.event === config.event &&\n          e.config.filter === config.filter\n      );\n\n      if (!entry) {\n        entry = { config, callbacks: new Set() };\n        this.subscriptionConfigs.push(entry);\n      }\n\n      entry.callbacks.add(actualCallback);\n    } else if (\n      event === \"broadcast\" &&\n      typeof configOrCallback !== \"function\"\n    ) {\n      // on('broadcast', { event }, callback)\n      const config = configOrCallback as { event: string };\n      const actualCallback = callback as BroadcastCallback;\n\n      if (!this.broadcastCallbacks.has(config.event)) {\n        this.broadcastCallbacks.set(config.event, new Set());\n      }\n      this.broadcastCallbacks.get(config.event)!.add(actualCallback);\n    } else if (event === \"presence\" && typeof configOrCallback !== \"function\") {\n      // on('presence', { event }, callback)\n      const config = configOrCallback as { event: \"sync\" | \"join\" | \"leave\" };\n      const actualCallback = callback as PresenceCallback;\n\n      if (!this.presenceCallbacks.has(config.event)) {\n        this.presenceCallbacks.set(config.event, new Set());\n      }\n      this.presenceCallbacks.get(config.event)!.add(actualCallback);\n    } else if (\n      event === \"execution_log\" &&\n      typeof configOrCallback !== \"function\"\n    ) {\n      // on('execution_log', { execution_id, type }, callback)\n      const config = configOrCallback as {\n        execution_id: string;\n        type?: ExecutionType;\n      };\n      this.executionLogConfig = config;\n      const actualCallback = callback as ExecutionLogCallback;\n      this.executionLogCallbacks.add(actualCallback);\n    } else {\n      // on('INSERT'|'UPDATE'|'DELETE'|'*', callback)\n      const actualEvent = event as \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\";\n      const actualCallback = configOrCallback as RealtimeCallback;\n\n      if (!this.callbacks.has(actualEvent)) {\n        this.callbacks.set(actualEvent, new Set());\n      }\n      this.callbacks.get(actualEvent)!.add(actualCallback);\n    }\n\n    return this;\n  }\n\n  /**\n   * Remove a callback\n   */\n  off(\n    event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n    callback: RealtimeCallback\n  ): this {\n    const callbacks = this.callbacks.get(event);\n    if (callbacks) {\n      callbacks.delete(callback);\n    }\n    return this;\n  }\n\n  /**\n   * Subscribe to the channel\n   * @param callback - Optional status callback (Supabase-compatible)\n   * @param _timeout - Optional timeout in milliseconds (currently unused)\n   */\n  subscribe(\n    callback?: (\n      status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n      err?: Error\n    ) => void,\n    _timeout?: number\n  ): this {\n    // Re-enable reconnection in case this is a re-subscribe after unsubscribe\n    this.shouldReconnect = true;\n    this.connect();\n\n    // Call callback with SUBSCRIBED status after connection\n    if (callback) {\n      // Wait for connection to open\n      const checkConnection = () => {\n        if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n          callback(\"SUBSCRIBED\");\n        } else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {\n          callback(\"CHANNEL_ERROR\", new Error(\"Failed to connect\"));\n        } else {\n          setTimeout(checkConnection, 100);\n        }\n      };\n      setTimeout(checkConnection, 100);\n    }\n\n    return this;\n  }\n\n  /**\n   * Unsubscribe from the channel\n   * @param timeout - Optional timeout in milliseconds\n   * @returns Promise resolving to status string (Supabase-compatible)\n   */\n  async unsubscribe(timeout?: number): Promise<\"ok\" | \"timed out\" | \"error\"> {\n    // Prevent automatic reconnection after intentional unsubscribe\n    this.shouldReconnect = false;\n\n    return new Promise((resolve) => {\n      if (this.ws) {\n        // Send unsubscribe for each subscription ID we have\n        if (this.subscriptionIds.size > 0) {\n          for (const subId of this.subscriptionIds.values()) {\n            this.sendMessage({\n              type: \"unsubscribe\",\n              channel: this.channelName,\n              subscription_id: subId,\n            });\n          }\n        } else {\n          // Fallback: just send channel unsubscribe (server will cleanup all)\n          this.sendMessage({\n            type: \"unsubscribe\",\n            channel: this.channelName,\n          });\n        }\n\n        // Wait for disconnect\n        const startTime = Date.now();\n        const maxWait = timeout || 5000;\n\n        const checkDisconnect = () => {\n          if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n            this.disconnect();\n            resolve(\"ok\");\n          } else if (Date.now() - startTime > maxWait) {\n            this.disconnect();\n            resolve(\"timed out\");\n          } else {\n            setTimeout(checkDisconnect, 100);\n          }\n        };\n\n        setTimeout(checkDisconnect, 100);\n      } else {\n        resolve(\"ok\");\n      }\n    });\n  }\n\n  /**\n   * Send a broadcast message to all subscribers on this channel\n   *\n   * @param message - Broadcast message with type, event, and payload\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * await channel.send({\n   *   type: 'broadcast',\n   *   event: 'cursor-pos',\n   *   payload: { x: 100, y: 200 }\n   * })\n   * ```\n   */\n  async send(message: BroadcastMessage): Promise<\"ok\" | \"error\"> {\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      return \"error\";\n    }\n\n    try {\n      // Generate message ID if acknowledgment is requested\n      const messageId = this.config.broadcast?.ack\n        ? `msg_${Date.now()}_${++this.messageIdCounter}`\n        : undefined;\n\n      this.ws.send(\n        JSON.stringify({\n          type: \"broadcast\",\n          channel: this.channelName,\n          event: message.event,\n          payload: message.payload,\n          ...(messageId && { messageId }),\n        })\n      );\n\n      // Handle acknowledgment if configured\n      if (this.config.broadcast?.ack && messageId) {\n        // Wait for ack response with timeout (default 5 seconds)\n        const ackTimeout = this.config.broadcast.ackTimeout || 5000;\n        return await new Promise<\"ok\" | \"error\">((resolve, reject) => {\n          const timeout = setTimeout(() => {\n            this.pendingAcks.delete(messageId);\n            reject(new Error(\"Acknowledgment timeout\"));\n          }, ackTimeout);\n\n          this.pendingAcks.set(messageId, {\n            resolve: (value) => {\n              clearTimeout(timeout);\n              this.pendingAcks.delete(messageId);\n              resolve(value as \"ok\" | \"error\");\n            },\n            reject: (reason) => {\n              clearTimeout(timeout);\n              this.pendingAcks.delete(messageId);\n              reject(reason);\n            },\n            timeout,\n          });\n        }).catch((error) => {\n          console.error(\"[Fluxbase Realtime] Acknowledgment error:\", error);\n          return \"error\" as const;\n        });\n      }\n\n      return \"ok\";\n    } catch (error) {\n      console.error(\"[Fluxbase Realtime] Failed to send broadcast:\", error);\n      return \"error\";\n    }\n  }\n\n  /**\n   * Track user presence on this channel\n   *\n   * @param state - Presence state to track\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * await channel.track({\n   *   user_id: 123,\n   *   status: 'online'\n   * })\n   * ```\n   */\n  async track(state: PresenceState): Promise<\"ok\" | \"error\"> {\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      return \"error\";\n    }\n\n    try {\n      // Generate presence key if not set\n      if (!this.myPresenceKey) {\n        this.myPresenceKey =\n          this.config.presence?.key ||\n          `presence-${Math.random().toString(36).substr(2, 9)}`;\n      }\n\n      this.ws.send(\n        JSON.stringify({\n          type: \"presence\",\n          channel: this.channelName,\n          event: \"track\",\n          payload: {\n            key: this.myPresenceKey,\n            state,\n          },\n        })\n      );\n\n      return \"ok\";\n    } catch (error) {\n      console.error(\"[Fluxbase Realtime] Failed to track presence:\", error);\n      return \"error\";\n    }\n  }\n\n  /**\n   * Stop tracking presence on this channel\n   *\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * await channel.untrack()\n   * ```\n   */\n  async untrack(): Promise<\"ok\" | \"error\"> {\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      return \"error\";\n    }\n\n    if (!this.myPresenceKey) {\n      return \"ok\"; // Already not tracking\n    }\n\n    try {\n      this.ws.send(\n        JSON.stringify({\n          type: \"presence\",\n          channel: this.channelName,\n          event: \"untrack\",\n          payload: {\n            key: this.myPresenceKey,\n          },\n        })\n      );\n\n      this.myPresenceKey = null;\n      return \"ok\";\n    } catch (error) {\n      console.error(\"[Fluxbase Realtime] Failed to untrack presence:\", error);\n      return \"error\";\n    }\n  }\n\n  /**\n   * Get current presence state for all users on this channel\n   *\n   * @returns Current presence state\n   *\n   * @example\n   * ```typescript\n   * const state = channel.presenceState()\n   * console.log('Online users:', Object.keys(state).length)\n   * ```\n   */\n  presenceState(): Record<string, PresenceState[]> {\n    return { ...this._presenceState };\n  }\n\n  /**\n   * Check if the current token is expired or about to expire\n   */\n  private isTokenExpired(): boolean {\n    if (!this.token) return false;\n\n    try {\n      // Decode JWT payload (base64url encoded, second part)\n      const parts = this.token.split(\".\");\n      if (parts.length !== 3 || !parts[1]) return false;\n\n      const payload = JSON.parse(\n        atob(parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\"))\n      );\n      if (!payload.exp) return false;\n\n      // Check if expired or will expire in the next 10 seconds\n      const now = Math.floor(Date.now() / 1000);\n      return payload.exp <= now + 10;\n    } catch {\n      // If we can't decode the token, assume it might be expired\n      return true;\n    }\n  }\n\n  /**\n   * Internal: Connect to WebSocket\n   */\n  private connect() {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      return;\n    }\n\n    // Check if token is expired and we have a refresh callback\n    if (\n      this.isTokenExpired() &&\n      this.onTokenRefreshNeeded &&\n      !this.isRefreshingToken\n    ) {\n      this.isRefreshingToken = true;\n      console.log(\n        \"[Fluxbase Realtime] Token expired, requesting refresh before connecting\"\n      );\n\n      this.onTokenRefreshNeeded()\n        .then((newToken) => {\n          this.isRefreshingToken = false;\n          if (newToken) {\n            this.token = newToken;\n            console.log(\n              \"[Fluxbase Realtime] Token refreshed, connecting with new token\"\n            );\n          }\n          this.connectWithToken();\n        })\n        .catch((err) => {\n          this.isRefreshingToken = false;\n          console.error(\"[Fluxbase Realtime] Token refresh failed:\", err);\n          // Try connecting anyway - might work if refresh failed for other reasons\n          this.connectWithToken();\n        });\n      return;\n    }\n\n    this.connectWithToken();\n  }\n\n  /**\n   * Internal: Actually establish the WebSocket connection\n   */\n  private connectWithToken() {\n    // Build WebSocket URL\n    const wsUrl = new URL(this.url);\n    wsUrl.protocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n    wsUrl.pathname = \"/realtime\";\n\n    if (this.token) {\n      wsUrl.searchParams.set(\"token\", this.token);\n    }\n\n    this.ws = new WebSocket(wsUrl.toString());\n\n    this.ws.onopen = () => {\n      console.log(\"[Fluxbase Realtime] Connected\");\n      this.reconnectAttempts = 0;\n\n      // Subscribe to execution logs if configured\n      if (this.executionLogConfig) {\n        const logSubscribeMessage = {\n          type: \"subscribe_logs\" as const,\n          channel: this.channelName,\n          config: {\n            execution_id: this.executionLogConfig.execution_id,\n            type: this.executionLogConfig.type || \"function\",\n          },\n        };\n        this.sendMessage(logSubscribeMessage as unknown as RealtimeMessage);\n      } else if (this.subscriptionConfigs.length > 0) {\n        // Send a subscribe message for each postgres_changes config\n        for (const entry of this.subscriptionConfigs) {\n          const subscribeMessage: RealtimeMessage = {\n            type: \"subscribe\",\n            channel: this.channelName,\n            config: entry.config,\n          };\n          this.sendMessage(subscribeMessage);\n        }\n      } else {\n        // Legacy: no config, just subscribe to channel (for broadcast/presence)\n        const subscribeMessage: RealtimeMessage = {\n          type: \"subscribe\",\n          channel: this.channelName,\n        };\n        this.sendMessage(subscribeMessage);\n      }\n\n      // Start heartbeat\n      this.startHeartbeat();\n    };\n\n    this.ws.onmessage = (event: MessageEvent) => {\n      let message: RealtimeMessage;\n      try {\n        message =\n          typeof event.data === \"string\" ? JSON.parse(event.data) : event.data;\n      } catch (err) {\n        console.error(\"[Fluxbase Realtime] Failed to parse message:\", err);\n        return;\n      }\n\n      try {\n        this.handleMessage(message);\n      } catch (err) {\n        console.error(\n          \"[Fluxbase Realtime] Error handling message:\",\n          err,\n          message\n        );\n      }\n    };\n\n    this.ws.onerror = (error) => {\n      console.error(\"[Fluxbase Realtime] WebSocket error:\", error);\n    };\n\n    this.ws.onclose = () => {\n      console.log(\"[Fluxbase Realtime] Disconnected\");\n      this.stopHeartbeat();\n      this.attemptReconnect();\n    };\n  }\n\n  /**\n   * Internal: Disconnect WebSocket\n   */\n  private disconnect() {\n    this.stopHeartbeat();\n\n    if (this.ws) {\n      this.ws.close();\n      this.ws = null;\n    }\n  }\n\n  /**\n   * Internal: Send a message\n   */\n  private sendMessage(message: RealtimeMessage) {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      this.ws.send(JSON.stringify(message));\n    }\n  }\n\n  /**\n   * Internal: Handle incoming message\n   */\n  private handleMessage(message: RealtimeMessage) {\n    switch (message.type) {\n      case \"heartbeat\":\n        // Server heartbeat received - no echo needed\n        // Client sends its own heartbeats on interval\n        break;\n\n      case \"broadcast\":\n        // Server sends: { type: \"broadcast\", payload: { broadcast: {...} } }\n        // Client interface also supports: { type: \"broadcast\", broadcast: {...} }\n        const broadcastData =\n          message.broadcast ||\n          (message.payload &&\n          typeof message.payload === \"object\" &&\n          \"broadcast\" in message.payload\n            ? (message.payload as { broadcast: unknown }).broadcast\n            : null);\n        if (broadcastData) {\n          this.handleBroadcastMessage(broadcastData);\n        } else if (message.payload) {\n          // Legacy postgres_changes format for backwards compatibility\n          this.handlePostgresChanges(message.payload);\n        }\n        break;\n\n      case \"presence\":\n        // Server sends: { type: \"presence\", payload: { presence: {...} } }\n        // Client interface also supports: { type: \"presence\", presence: {...} }\n        const presenceData =\n          message.presence ||\n          (message.payload &&\n          typeof message.payload === \"object\" &&\n          \"presence\" in message.payload\n            ? (message.payload as { presence: unknown }).presence\n            : null);\n        if (presenceData) {\n          this.handlePresenceMessage(presenceData);\n        }\n        break;\n\n      case \"ack\":\n        // Handle broadcast acknowledgment\n        if (message.messageId && this.pendingAcks.has(message.messageId)) {\n          const ackHandler = this.pendingAcks.get(message.messageId);\n          if (ackHandler) {\n            ackHandler.resolve(message.status || \"ok\");\n          }\n        } else if (\n          message.payload &&\n          typeof message.payload === \"object\" &&\n          \"type\" in message.payload\n        ) {\n          const payload = message.payload as {\n            type: string;\n            updated?: boolean;\n            subscription_id?: string;\n            schema?: string;\n            table?: string;\n          };\n\n          // Handle access_token acknowledgment\n          if (\n            payload.type === \"access_token\" &&\n            this.pendingAcks.has(\"access_token\")\n          ) {\n            const ackHandler = this.pendingAcks.get(\"access_token\");\n            if (ackHandler) {\n              ackHandler.resolve(\"ok\");\n              this.pendingAcks.delete(\"access_token\");\n            }\n            console.log(\"[Fluxbase Realtime] Token updated successfully\");\n          } else if (payload.subscription_id) {\n            // Store subscription_id keyed by schema.table for unsubscribe support\n            const schema = payload.schema || \"public\";\n            const table = payload.table || \"\";\n            if (table) {\n              this.subscriptionIds.set(\n                `${schema}.${table}`,\n                payload.subscription_id\n              );\n              console.log(\n                \"[Fluxbase Realtime] Subscription ID received for\",\n                `${schema}.${table}:`,\n                payload.subscription_id\n              );\n            } else {\n              console.log(\n                \"[Fluxbase Realtime] Subscription ID received:\",\n                payload.subscription_id\n              );\n            }\n          }\n        } else {\n          // Store subscription_id from subscription acknowledgment (legacy format)\n          if (\n            message.payload &&\n            typeof message.payload === \"object\" &&\n            \"subscription_id\" in message.payload\n          ) {\n            const payload = message.payload as {\n              subscription_id: string;\n              schema?: string;\n              table?: string;\n            };\n            const schema = payload.schema || \"public\";\n            const table = payload.table || \"\";\n            if (table) {\n              this.subscriptionIds.set(\n                `${schema}.${table}`,\n                payload.subscription_id\n              );\n              console.log(\n                \"[Fluxbase Realtime] Subscription ID received for\",\n                `${schema}.${table}:`,\n                payload.subscription_id\n              );\n            } else {\n              console.log(\n                \"[Fluxbase Realtime] Subscription ID received:\",\n                payload.subscription_id\n              );\n            }\n          }\n        }\n        break;\n\n      case \"error\":\n        console.error(\"[Fluxbase Realtime] Error:\", message.error);\n        // If there's a pending access_token update, reject it and trigger reconnect\n        if (this.pendingAcks.has(\"access_token\")) {\n          const ackHandler = this.pendingAcks.get(\"access_token\");\n          if (ackHandler) {\n            ackHandler.reject(\n              new Error(message.error || \"Token update failed\")\n            );\n            this.pendingAcks.delete(\"access_token\");\n          }\n        }\n        break;\n\n      case \"postgres_changes\":\n        // Handle postgres_changes events\n        if (message.payload) {\n          this.handlePostgresChanges(message.payload);\n        }\n        break;\n\n      case \"execution_log\" as any:\n        // Handle execution log events\n        if (message.payload) {\n          this.handleExecutionLog(message.payload as ExecutionLogEvent);\n        }\n        break;\n    }\n  }\n\n  /**\n   * Internal: Handle execution log message\n   */\n  private handleExecutionLog(log: ExecutionLogEvent) {\n    // Call all execution log callbacks\n    this.executionLogCallbacks.forEach((callback) => {\n      try {\n        callback(log);\n      } catch (err) {\n        console.error(\n          \"[Fluxbase Realtime] Error in execution log callback:\",\n          err\n        );\n      }\n    });\n  }\n\n  /**\n   * Internal: Handle broadcast message\n   */\n  private handleBroadcastMessage(message: any) {\n    const event = message.event;\n    const payload: RealtimeBroadcastPayload = {\n      event,\n      payload: message.payload,\n    };\n\n    // Filter self-messages if configured\n    if (!this.config.broadcast?.self && message.self) {\n      return;\n    }\n\n    // Call event-specific callbacks\n    const callbacks = this.broadcastCallbacks.get(event);\n    if (callbacks) {\n      callbacks.forEach((callback) => callback(payload));\n    }\n\n    // Call wildcard callbacks\n    const wildcardCallbacks = this.broadcastCallbacks.get(\"*\");\n    if (wildcardCallbacks) {\n      wildcardCallbacks.forEach((callback) => callback(payload));\n    }\n  }\n\n  /**\n   * Internal: Handle presence message\n   */\n  private handlePresenceMessage(message: any) {\n    const event = message.event as \"sync\" | \"join\" | \"leave\";\n    const payload: RealtimePresencePayload = {\n      event,\n      key: message.key,\n      newPresences: message.newPresences,\n      leftPresences: message.leftPresences,\n      currentPresences: message.currentPresences || this._presenceState,\n    };\n\n    // Update local presence state\n    if (message.currentPresences) {\n      this._presenceState = message.currentPresences;\n    }\n\n    // Call event-specific callbacks\n    const callbacks = this.presenceCallbacks.get(event);\n    if (callbacks) {\n      callbacks.forEach((callback) => callback(payload));\n    }\n  }\n\n  /**\n   * Internal: Handle postgres_changes message\n   */\n  private handlePostgresChanges(payload: any) {\n    // Convert to Supabase-compatible format\n    const supabasePayload: RealtimePostgresChangesPayload = {\n      eventType: payload.type || payload.eventType,\n      schema: payload.schema,\n      table: payload.table,\n      commit_timestamp:\n        payload.timestamp ||\n        payload.commit_timestamp ||\n        new Date().toISOString(),\n      new: payload.new_record || payload.new || payload.record || {},\n      old: payload.old_record || payload.old || {},\n      errors: payload.errors || null,\n    };\n\n    // Route to subscription-specific callbacks based on matching config\n    for (const entry of this.subscriptionConfigs) {\n      const c = entry.config;\n      // Check if this payload matches the subscription config\n      const schemaMatch = !c.schema || c.schema === supabasePayload.schema;\n      const tableMatch = !c.table || c.table === supabasePayload.table;\n      const eventMatch =\n        c.event === \"*\" || c.event === supabasePayload.eventType;\n\n      if (schemaMatch && tableMatch && eventMatch) {\n        entry.callbacks.forEach((cb) => {\n          try {\n            cb(supabasePayload);\n          } catch (err) {\n            console.error(\n              \"[Fluxbase Realtime] Error in postgres_changes callback:\",\n              err\n            );\n          }\n        });\n      }\n    }\n\n    // Also call legacy event-specific callbacks (for backwards compatibility)\n    const callbacks = this.callbacks.get(supabasePayload.eventType);\n    if (callbacks) {\n      callbacks.forEach((callback) => callback(supabasePayload));\n    }\n\n    // Call wildcard callbacks\n    const wildcardCallbacks = this.callbacks.get(\"*\");\n    if (wildcardCallbacks) {\n      wildcardCallbacks.forEach((callback) => callback(supabasePayload));\n    }\n  }\n\n  /**\n   * Internal: Start heartbeat interval\n   */\n  private startHeartbeat() {\n    // Clear any existing interval to prevent accumulation during reconnects\n    this.stopHeartbeat();\n    this.heartbeatInterval = setInterval(() => {\n      this.sendMessage({ type: \"heartbeat\" });\n    }, 30000); // 30 seconds\n  }\n\n  /**\n   * Internal: Stop heartbeat interval\n   */\n  private stopHeartbeat() {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = null;\n    }\n  }\n\n  /**\n   * Update the authentication token on an existing connection\n   * Sends an access_token message to the server to update auth context\n   * On failure, silently triggers a reconnect\n   *\n   * @param token - The new JWT access token\n   * @internal\n   */\n  updateToken(token: string | null) {\n    // Skip if token hasn't changed\n    if (this.token === token) {\n      return;\n    }\n\n    this.token = token;\n\n    // Only send update if connected\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      return;\n    }\n\n    if (!token) {\n      // If token is null, we need to reconnect (can't send null token message)\n      this.disconnect();\n      this.connect();\n      return;\n    }\n\n    // Send access_token message\n    const message: RealtimeMessage = {\n      type: \"access_token\",\n      token: token,\n    };\n\n    try {\n      this.ws.send(JSON.stringify(message));\n\n      // Set up a timeout for the acknowledgment\n      const timeout = setTimeout(() => {\n        console.warn(\n          \"[Fluxbase Realtime] Token update acknowledgment timeout, reconnecting\"\n        );\n        this.disconnect();\n        this.connect();\n      }, 5000); // 5 second timeout\n\n      // Store the timeout so we can clear it when we receive the ack\n      // We'll handle this in handleMessage for 'ack' type with access_token\n      this.pendingAcks.set(\"access_token\", {\n        resolve: () => {\n          clearTimeout(timeout);\n        },\n        reject: () => {\n          clearTimeout(timeout);\n          this.disconnect();\n          this.connect();\n        },\n        timeout,\n      });\n    } catch (error) {\n      console.error(\"[Fluxbase Realtime] Failed to send token update:\", error);\n      // Silent fallback: reconnect\n      this.disconnect();\n      this.connect();\n    }\n  }\n\n  /**\n   * Internal: Attempt to reconnect\n   */\n  private attemptReconnect() {\n    // Don't reconnect if intentionally disconnected\n    if (!this.shouldReconnect) {\n      return;\n    }\n\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      console.error(\"[Fluxbase Realtime] Max reconnect attempts reached\");\n      return;\n    }\n\n    this.reconnectAttempts++;\n    const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n    console.log(\n      `[Fluxbase Realtime] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`\n    );\n\n    setTimeout(() => {\n      this.connect();\n    }, delay);\n  }\n}\n\nexport class FluxbaseRealtime {\n  private url: string;\n  private token: string | null;\n  private channels: Map<string, RealtimeChannel> = new Map();\n  private tokenRefreshCallback: (() => Promise<string | null>) | null = null;\n\n  constructor(url: string, token: string | null = null) {\n    this.url = url;\n    this.token = token;\n  }\n\n  /**\n   * Set callback to request a token refresh when connections fail due to auth\n   * This callback should refresh the auth token and return the new access token\n   * @internal\n   */\n  setTokenRefreshCallback(callback: () => Promise<string | null>) {\n    this.tokenRefreshCallback = callback;\n    // Set callback on all existing channels\n    this.channels.forEach((channel) => {\n      channel.setTokenRefreshCallback(callback);\n    });\n  }\n\n  /**\n   * Create or get a channel with optional configuration\n   *\n   * @param channelName - Channel name (e.g., 'table:public.products')\n   * @param config - Optional channel configuration\n   * @returns RealtimeChannel instance\n   *\n   * @example\n   * ```typescript\n   * const channel = realtime.channel('room-1', {\n   *   broadcast: { self: true, ack: true },\n   *   presence: { key: 'user-123' }\n   * })\n   * ```\n   */\n  channel(\n    channelName: string,\n    config?: RealtimeChannelConfig\n  ): RealtimeChannel {\n    // Create a unique key based on name and config\n    const configKey = config ? JSON.stringify(config) : \"\";\n    const key = `${channelName}:${configKey}`;\n\n    if (this.channels.has(key)) {\n      return this.channels.get(key)!;\n    }\n\n    const channel = new RealtimeChannel(\n      this.url,\n      channelName,\n      this.token,\n      config\n    );\n    // Set token refresh callback if available\n    if (this.tokenRefreshCallback) {\n      channel.setTokenRefreshCallback(this.tokenRefreshCallback);\n    }\n    this.channels.set(key, channel);\n    return channel;\n  }\n\n  /**\n   * Remove a specific channel\n   *\n   * @param channel - The channel to remove\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * const channel = realtime.channel('room-1')\n   * await realtime.removeChannel(channel)\n   * ```\n   */\n  async removeChannel(channel: RealtimeChannel): Promise<\"ok\" | \"error\"> {\n    // Unsubscribe the channel\n    await channel.unsubscribe();\n\n    // Remove from channels map\n    for (const [key, ch] of this.channels.entries()) {\n      if (ch === channel) {\n        this.channels.delete(key);\n        return \"ok\";\n      }\n    }\n\n    return \"error\";\n  }\n\n  /**\n   * Remove all channels\n   */\n  removeAllChannels() {\n    this.channels.forEach((channel) => channel.unsubscribe());\n    this.channels.clear();\n  }\n\n  /**\n   * Update auth token for all channels\n   * Updates both the stored token for new channels and propagates\n   * the token to all existing connected channels.\n   *\n   * @param token - The new auth token\n   */\n  setAuth(token: string | null) {\n    // Skip if token hasn't changed\n    if (this.token === token) {\n      return;\n    }\n\n    this.token = token;\n    // Update all existing connected channels\n    this.channels.forEach((channel) => {\n      channel.updateToken(token);\n    });\n  }\n\n  /**\n   * Create an execution log subscription channel\n   *\n   * This provides a cleaner API for subscribing to execution logs\n   * (functions, jobs, or RPC procedures).\n   *\n   * @param executionId - The execution ID to subscribe to\n   * @param type - The type of execution ('function', 'job', 'rpc')\n   * @returns ExecutionLogsChannel instance with fluent API\n   *\n   * @example\n   * ```typescript\n   * const channel = client.realtime.executionLogs('exec-123', 'function')\n   *   .onLog((log) => {\n   *     console.log(`[${log.level}] ${log.message}`)\n   *   })\n   *   .subscribe()\n   * ```\n   */\n  executionLogs(\n    executionId: string,\n    type: ExecutionType = \"function\"\n  ): ExecutionLogsChannel {\n    return new ExecutionLogsChannel(\n      this.url,\n      executionId,\n      type,\n      this.token,\n      this.tokenRefreshCallback\n    );\n  }\n}\n\n/**\n * Specialized channel for execution log subscriptions\n * Provides a cleaner API than the generic RealtimeChannel\n */\nexport class ExecutionLogsChannel {\n  private channel: RealtimeChannel;\n  private executionId: string;\n  private executionType: ExecutionType;\n  private logCallbacks: ExecutionLogCallback[] = [];\n\n  constructor(\n    url: string,\n    executionId: string,\n    type: ExecutionType,\n    token: string | null,\n    tokenRefreshCallback: (() => Promise<string | null>) | null\n  ) {\n    this.executionId = executionId;\n    this.executionType = type;\n\n    // Create a channel with a unique name for this execution\n    const channelName = `execution:${executionId}`;\n    this.channel = new RealtimeChannel(url, channelName, token);\n\n    // Set up token refresh if available\n    if (tokenRefreshCallback) {\n      this.channel.setTokenRefreshCallback(tokenRefreshCallback);\n    }\n  }\n\n  /**\n   * Register a callback for log events\n   *\n   * @param callback - Function to call when log entries are received\n   * @returns This channel for chaining\n   *\n   * @example\n   * ```typescript\n   * channel.onLog((log) => {\n   *   console.log(`[${log.level}] Line ${log.line_number}: ${log.message}`)\n   * })\n   * ```\n   */\n  onLog(callback: ExecutionLogCallback): this {\n    this.logCallbacks.push(callback);\n    return this;\n  }\n\n  /**\n   * Subscribe to execution logs\n   *\n   * @param callback - Optional status callback\n   * @returns Promise that resolves when subscribed\n   *\n   * @example\n   * ```typescript\n   * await channel.subscribe()\n   * ```\n   */\n  subscribe(\n    callback?: (\n      status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n      err?: Error\n    ) => void\n  ): this {\n    // Register all callbacks\n    this.channel.on(\n      \"execution_log\",\n      { execution_id: this.executionId, type: this.executionType },\n      (log) => {\n        this.logCallbacks.forEach((cb) => {\n          try {\n            cb(log);\n          } catch (err) {\n            console.error(\n              \"[Fluxbase ExecutionLogs] Error in log callback:\",\n              err\n            );\n          }\n        });\n      }\n    );\n\n    // Subscribe to the channel\n    this.channel.subscribe(callback);\n    return this;\n  }\n\n  /**\n   * Unsubscribe from execution logs\n   *\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * await channel.unsubscribe()\n   * ```\n   */\n  async unsubscribe(): Promise<\"ok\" | \"timed out\" | \"error\"> {\n    return this.channel.unsubscribe();\n  }\n}\n","/**\n * Storage client for file operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  FileObject,\n  UploadOptions,\n  UploadProgress,\n  StreamUploadOptions,\n  ListOptions,\n  SignedUrlOptions,\n  DownloadOptions,\n  StreamDownloadData,\n  ResumableDownloadOptions,\n  ResumableDownloadData,\n  ResumableUploadOptions,\n  ChunkedUploadSession,\n  ShareFileOptions,\n  FileShare,\n  BucketSettings,\n  Bucket,\n  TransformOptions,\n} from \"./types\";\n\nexport class StorageBucket {\n  private fetch: FluxbaseFetch;\n  private bucketName: string;\n\n  constructor(fetch: FluxbaseFetch, bucketName: string) {\n    this.fetch = fetch;\n    this.bucketName = bucketName;\n  }\n\n  /**\n   * Upload a file to the bucket\n   * @param path - The path/key for the file\n   * @param file - The file to upload (File, Blob, ArrayBuffer, or ArrayBufferView like Uint8Array)\n   * @param options - Upload options\n   */\n  async upload(\n    path: string,\n    file: File | Blob | ArrayBuffer | ArrayBufferView,\n    options?: UploadOptions,\n  ): Promise<{\n    data: { id: string; path: string; fullPath: string } | null;\n    error: Error | null;\n  }> {\n    try {\n      // Prepare FormData (common to both code paths)\n      const formData = new FormData();\n\n      // Convert to Blob if ArrayBuffer or ArrayBufferView (Uint8Array, etc.)\n      let blob: Blob | File;\n      if (file instanceof ArrayBuffer) {\n        blob = new Blob([file], { type: options?.contentType });\n      } else if (ArrayBuffer.isView(file)) {\n        // Cast needed because TypeScript's ArrayBufferView includes SharedArrayBuffer views\n        blob = new Blob([file as BlobPart], { type: options?.contentType });\n      } else {\n        blob = file;\n      }\n\n      formData.append(\"file\", blob);\n\n      if (options?.contentType) {\n        formData.append(\"content_type\", options.contentType);\n      }\n\n      if (options?.metadata) {\n        formData.append(\"metadata\", JSON.stringify(options.metadata));\n      }\n\n      if (options?.cacheControl) {\n        formData.append(\"cache_control\", options.cacheControl);\n      }\n\n      if (options?.upsert !== undefined) {\n        formData.append(\"upsert\", String(options.upsert));\n      }\n\n      let response: any;\n\n      // Use XMLHttpRequest for progress tracking if callback is provided\n      if (options?.onUploadProgress) {\n        response = await this.uploadWithProgress(\n          path,\n          formData,\n          options.onUploadProgress,\n        );\n      } else {\n        // Use standard fetch for uploads without progress tracking\n        response = await this.fetch.request<any>(\n          `/api/v1/storage/${this.bucketName}/${path}`,\n          {\n            method: \"POST\",\n            body: formData,\n            headers: {}, // Let browser set Content-Type for FormData\n          },\n        );\n      }\n\n      // Return Supabase-compatible response format\n      return {\n        data: {\n          id: response.id || response.key || path,\n          path: path,\n          fullPath: `${this.bucketName}/${path}`,\n        },\n        error: null,\n      };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Upload with progress tracking using XMLHttpRequest\n   * @private\n   */\n  private uploadWithProgress(\n    path: string,\n    formData: FormData,\n    onProgress: (progress: UploadProgress) => void,\n  ): Promise<any> {\n    return new Promise((resolve, reject) => {\n      const xhr = new XMLHttpRequest();\n      const url = `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/${path}`;\n\n      // Track upload progress\n      xhr.upload.addEventListener(\"progress\", (event) => {\n        if (event.lengthComputable) {\n          const percentage = Math.round((event.loaded / event.total) * 100);\n          onProgress({\n            loaded: event.loaded,\n            total: event.total,\n            percentage,\n          });\n        }\n      });\n\n      // Handle completion\n      xhr.addEventListener(\"load\", () => {\n        if (xhr.status >= 200 && xhr.status < 300) {\n          try {\n            const response = JSON.parse(xhr.responseText);\n            resolve(response);\n          } catch (e) {\n            resolve(xhr.responseText);\n          }\n        } else {\n          try {\n            const errorData = JSON.parse(xhr.responseText);\n            reject(new Error(errorData.error || xhr.statusText));\n          } catch (e) {\n            reject(new Error(xhr.statusText));\n          }\n        }\n      });\n\n      // Handle errors\n      xhr.addEventListener(\"error\", () => {\n        reject(new Error(\"Upload failed\"));\n      });\n\n      xhr.addEventListener(\"abort\", () => {\n        reject(new Error(\"Upload aborted\"));\n      });\n\n      // Open and send request\n      xhr.open(\"POST\", url);\n\n      // Set authorization header if present\n      const headers = this.fetch.getDefaultHeaders();\n      for (const [key, value] of Object.entries(headers)) {\n        // Don't set Content-Type header - let browser handle it for FormData\n        if (key.toLowerCase() !== \"content-type\") {\n          xhr.setRequestHeader(key, value);\n        }\n      }\n\n      xhr.send(formData);\n    });\n  }\n\n  /**\n   * Upload a file using streaming for reduced memory usage.\n   * This method bypasses FormData buffering and streams data directly to the server.\n   * Ideal for large files where memory efficiency is important.\n   *\n   * @param path - The path/key for the file\n   * @param stream - ReadableStream of the file data\n   * @param size - The size of the file in bytes (required for Content-Length header)\n   * @param options - Upload options\n   *\n   * @example\n   * ```typescript\n   * // Upload from a File's stream\n   * const file = new File([...], 'large-video.mp4');\n   * const { data, error } = await storage\n   *   .from('videos')\n   *   .uploadStream('video.mp4', file.stream(), file.size, {\n   *     contentType: 'video/mp4',\n   *   });\n   *\n   * // Upload from a fetch response stream\n   * const response = await fetch('https://example.com/data.zip');\n   * const size = parseInt(response.headers.get('content-length') || '0');\n   * const { data, error } = await storage\n   *   .from('files')\n   *   .uploadStream('data.zip', response.body!, size, {\n   *     contentType: 'application/zip',\n   *   });\n   * ```\n   */\n  async uploadStream(\n    path: string,\n    stream: ReadableStream<Uint8Array>,\n    size: number,\n    options?: StreamUploadOptions,\n  ): Promise<{\n    data: { id: string; path: string; fullPath: string } | null;\n    error: Error | null;\n  }> {\n    try {\n      if (size <= 0) {\n        return {\n          data: null,\n          error: new Error(\"size must be a positive number\"),\n        };\n      }\n\n      // Build headers for streaming upload\n      const headers: Record<string, string> = {\n        ...this.fetch.getDefaultHeaders(),\n        \"Content-Length\": String(size),\n      };\n\n      // Set content type\n      if (options?.contentType) {\n        headers[\"X-Storage-Content-Type\"] = options.contentType;\n      }\n\n      // Set cache control\n      if (options?.cacheControl) {\n        headers[\"X-Storage-Cache-Control\"] = options.cacheControl;\n      }\n\n      // Set metadata as JSON\n      if (options?.metadata && Object.keys(options.metadata).length > 0) {\n        headers[\"X-Storage-Metadata\"] = JSON.stringify(options.metadata);\n      }\n\n      // Create a stream that tracks progress if callback provided\n      let bodyStream: ReadableStream<Uint8Array> = stream;\n\n      if (options?.onUploadProgress) {\n        let uploadedBytes = 0;\n        const progressCallback = options.onUploadProgress;\n        const totalSize = size;\n\n        const transformStream = new TransformStream<Uint8Array, Uint8Array>({\n          transform(chunk, controller) {\n            uploadedBytes += chunk.byteLength;\n            const percentage = Math.round((uploadedBytes / totalSize) * 100);\n            progressCallback({\n              loaded: uploadedBytes,\n              total: totalSize,\n              percentage,\n            });\n            controller.enqueue(chunk);\n          },\n        });\n\n        bodyStream = stream.pipeThrough(transformStream);\n      }\n\n      // Use fetch with streaming body\n      // Note: duplex: 'half' is required for streaming request bodies\n      const response = await fetch(\n        `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/stream/${path}`,\n        {\n          method: \"POST\",\n          headers,\n          body: bodyStream,\n          signal: options?.signal,\n          // @ts-expect-error - duplex is not yet in TypeScript's RequestInit type\n          duplex: \"half\",\n        },\n      );\n\n      if (!response.ok) {\n        const errorData = await response\n          .json()\n          .catch(() => ({ error: response.statusText }));\n        throw new Error(\n          errorData.error || `Upload failed: ${response.statusText}`,\n        );\n      }\n\n      const result = await response.json();\n\n      return {\n        data: {\n          id: result.key || path,\n          path: path,\n          fullPath: `${this.bucketName}/${path}`,\n        },\n        error: null,\n      };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Upload a large file using streaming for reduced memory usage.\n   * This is a convenience method that converts a File or Blob to a stream.\n   *\n   * @param path - The path/key for the file\n   * @param file - The File or Blob to upload\n   * @param options - Upload options\n   *\n   * @example\n   * ```typescript\n   * const file = new File([...], 'large-video.mp4');\n   * const { data, error } = await storage\n   *   .from('videos')\n   *   .uploadLargeFile('video.mp4', file, {\n   *     contentType: 'video/mp4',\n   *     onUploadProgress: (p) => console.log(`${p.percentage}% complete`),\n   *   });\n   * ```\n   */\n  async uploadLargeFile(\n    path: string,\n    file: File | Blob,\n    options?: StreamUploadOptions,\n  ): Promise<{\n    data: { id: string; path: string; fullPath: string } | null;\n    error: Error | null;\n  }> {\n    // Use file's type if contentType not specified\n    const opts: StreamUploadOptions = {\n      ...options,\n      contentType:\n        options?.contentType || file.type || \"application/octet-stream\",\n    };\n\n    return this.uploadStream(path, file.stream(), file.size, opts);\n  }\n\n  /**\n   * Download a file from the bucket\n   * @param path - The path/key of the file\n   *\n   * @example\n   * ```typescript\n   * // Default: returns Blob\n   * const { data: blob } = await storage.from('bucket').download('file.pdf');\n   *\n   * // Streaming: returns { stream, size } for progress tracking\n   * const { data } = await storage.from('bucket').download('large.json', { stream: true });\n   * console.log(`File size: ${data.size} bytes`);\n   * // Process data.stream...\n   * ```\n   */\n  async download(\n    path: string,\n  ): Promise<{ data: Blob | null; error: Error | null }>;\n  async download(\n    path: string,\n    options: { stream: true; timeout?: number; signal?: AbortSignal },\n  ): Promise<{ data: StreamDownloadData | null; error: Error | null }>;\n  async download(\n    path: string,\n    options: { stream?: false; timeout?: number; signal?: AbortSignal },\n  ): Promise<{ data: Blob | null; error: Error | null }>;\n  async download(\n    path: string,\n    options?: DownloadOptions,\n  ): Promise<{\n    data: Blob | StreamDownloadData | null;\n    error: Error | null;\n  }> {\n    try {\n      const controller = new AbortController();\n      let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n      // Forward external signal to our controller\n      if (options?.signal) {\n        if (options.signal.aborted) {\n          return { data: null, error: new Error(\"Download aborted\") };\n        }\n        options.signal.addEventListener(\"abort\", () => controller.abort(), {\n          once: true,\n        });\n      }\n\n      // For streaming: no timeout by default (large files need time)\n      // For non-streaming: 30s default\n      const timeout = options?.timeout ?? (options?.stream ? 0 : 30000);\n\n      if (timeout > 0) {\n        timeoutId = setTimeout(() => controller.abort(), timeout);\n      }\n\n      try {\n        const response = await fetch(\n          `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/${path}`,\n          {\n            headers: this.fetch.getDefaultHeaders(),\n            signal: controller.signal,\n          },\n        );\n\n        if (timeoutId) clearTimeout(timeoutId);\n\n        if (!response.ok) {\n          throw new Error(`Failed to download file: ${response.statusText}`);\n        }\n\n        // Return stream with size if requested\n        if (options?.stream) {\n          if (!response.body) {\n            throw new Error(\"Response body is not available for streaming\");\n          }\n          // Extract file size from Content-Length header\n          const contentLength = response.headers.get(\"content-length\");\n          const size = contentLength ? parseInt(contentLength, 10) : null;\n          return {\n            data: { stream: response.body, size },\n            error: null,\n          };\n        }\n\n        // Default: return Blob\n        const blob = await response.blob();\n        return { data: blob, error: null };\n      } catch (err) {\n        if (timeoutId) clearTimeout(timeoutId);\n\n        if (err instanceof Error && err.name === \"AbortError\") {\n          // Check if it was user abort or timeout\n          if (options?.signal?.aborted) {\n            return { data: null, error: new Error(\"Download aborted\") };\n          }\n          return { data: null, error: new Error(\"Download timeout\") };\n        }\n        throw err;\n      }\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Download a file with resumable chunked downloads for large files.\n   * Returns a ReadableStream that abstracts the chunking internally.\n   *\n   * Features:\n   * - Downloads file in chunks using HTTP Range headers\n   * - Automatically retries failed chunks with exponential backoff\n   * - Reports progress via callback\n   * - Falls back to regular streaming if Range not supported\n   *\n   * @param path - The file path within the bucket\n   * @param options - Download options including chunk size, retries, and progress callback\n   * @returns A ReadableStream and file size (consumer doesn't need to know about chunking)\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await storage.from('bucket').downloadResumable('large.json', {\n   *   chunkSize: 5 * 1024 * 1024, // 5MB chunks\n   *   maxRetries: 3,\n   *   onProgress: (progress) => console.log(`${progress.percentage}% complete`)\n   * });\n   * if (data) {\n   *   console.log(`File size: ${data.size} bytes`);\n   *   // Process data.stream...\n   * }\n   * ```\n   */\n  async downloadResumable(\n    path: string,\n    options?: ResumableDownloadOptions,\n  ): Promise<{ data: ResumableDownloadData | null; error: Error | null }> {\n    try {\n      const chunkSize = options?.chunkSize ?? 5 * 1024 * 1024; // 5MB default\n      const maxRetries = options?.maxRetries ?? 3;\n      const retryDelayMs = options?.retryDelayMs ?? 1000;\n      const chunkTimeout = options?.chunkTimeout ?? 30000;\n\n      const url = `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/${path}`;\n      const headers = this.fetch.getDefaultHeaders();\n\n      // Check if already aborted\n      if (options?.signal?.aborted) {\n        return { data: null, error: new Error(\"Download aborted\") };\n      }\n\n      // Get file info with HEAD request to determine size and Range support\n      const headResponse = await fetch(url, {\n        method: \"HEAD\",\n        headers,\n        signal: options?.signal,\n      });\n\n      if (!headResponse.ok) {\n        throw new Error(`Failed to get file info: ${headResponse.statusText}`);\n      }\n\n      const contentLength = headResponse.headers.get(\"content-length\");\n      const acceptRanges = headResponse.headers.get(\"accept-ranges\");\n      const totalSize = contentLength ? parseInt(contentLength, 10) : null;\n\n      // If server doesn't support Range requests, fall back to regular streaming\n      if (acceptRanges !== \"bytes\") {\n        const { data, error } = await this.download(path, {\n          stream: true,\n          timeout: 0,\n          signal: options?.signal,\n        });\n        if (error) return { data: null, error };\n        return {\n          data: data as ResumableDownloadData,\n          error: null,\n        };\n      }\n\n      // Create a ReadableStream that fetches chunks internally\n      let downloadedBytes = 0;\n      let currentChunk = 0;\n      const totalChunks = totalSize ? Math.ceil(totalSize / chunkSize) : null;\n      let lastProgressTime = Date.now();\n      let lastProgressBytes = 0;\n\n      const stream = new ReadableStream<Uint8Array>({\n        async pull(controller) {\n          // Check if aborted\n          if (options?.signal?.aborted) {\n            controller.error(new Error(\"Download aborted\"));\n            return;\n          }\n\n          // Check if we've downloaded everything\n          if (totalSize !== null && downloadedBytes >= totalSize) {\n            controller.close();\n            return;\n          }\n\n          const rangeStart = downloadedBytes;\n          const rangeEnd =\n            totalSize !== null\n              ? Math.min(downloadedBytes + chunkSize - 1, totalSize - 1)\n              : downloadedBytes + chunkSize - 1;\n\n          let retryCount = 0;\n          let chunk: Uint8Array | null = null;\n\n          while (retryCount <= maxRetries && chunk === null) {\n            try {\n              // Check abort before each attempt\n              if (options?.signal?.aborted) {\n                controller.error(new Error(\"Download aborted\"));\n                return;\n              }\n\n              const chunkController = new AbortController();\n              const timeoutId = setTimeout(\n                () => chunkController.abort(),\n                chunkTimeout,\n              );\n\n              // Forward external signal to chunk controller\n              if (options?.signal) {\n                options.signal.addEventListener(\n                  \"abort\",\n                  () => chunkController.abort(),\n                  { once: true },\n                );\n              }\n\n              const chunkResponse = await fetch(url, {\n                headers: {\n                  ...headers,\n                  Range: `bytes=${rangeStart}-${rangeEnd}`,\n                },\n                signal: chunkController.signal,\n              });\n\n              clearTimeout(timeoutId);\n\n              if (!chunkResponse.ok && chunkResponse.status !== 206) {\n                throw new Error(\n                  `Chunk download failed: ${chunkResponse.statusText}`,\n                );\n              }\n\n              const arrayBuffer = await chunkResponse.arrayBuffer();\n              chunk = new Uint8Array(arrayBuffer);\n\n              // Check if we got less data than expected (end of file)\n              if (totalSize === null && chunk.byteLength < chunkSize) {\n                downloadedBytes += chunk.byteLength;\n                currentChunk++;\n                controller.enqueue(chunk);\n                controller.close();\n                return;\n              }\n            } catch (err) {\n              // Check if it was user abort\n              if (options?.signal?.aborted) {\n                controller.error(new Error(\"Download aborted\"));\n                return;\n              }\n\n              retryCount++;\n              if (retryCount > maxRetries) {\n                controller.error(\n                  new Error(\n                    `Failed to download chunk after ${maxRetries} retries`,\n                  ),\n                );\n                return;\n              }\n\n              // Exponential backoff: 1s, 2s, 4s...\n              const delay = retryDelayMs * Math.pow(2, retryCount - 1);\n              await new Promise((resolve) => setTimeout(resolve, delay));\n            }\n          }\n\n          if (chunk) {\n            downloadedBytes += chunk.byteLength;\n            currentChunk++;\n\n            // Report progress\n            if (options?.onProgress) {\n              const now = Date.now();\n              const elapsed = (now - lastProgressTime) / 1000;\n              const bytesPerSecond =\n                elapsed > 0\n                  ? (downloadedBytes - lastProgressBytes) / elapsed\n                  : 0;\n\n              lastProgressTime = now;\n              lastProgressBytes = downloadedBytes;\n\n              options.onProgress({\n                loaded: downloadedBytes,\n                total: totalSize,\n                percentage: totalSize\n                  ? Math.round((downloadedBytes / totalSize) * 100)\n                  : null,\n                currentChunk,\n                totalChunks,\n                bytesPerSecond,\n              });\n            }\n\n            controller.enqueue(chunk);\n\n            // Check if we're done\n            if (totalSize !== null && downloadedBytes >= totalSize) {\n              controller.close();\n            }\n          }\n        },\n      });\n\n      return {\n        data: { stream, size: totalSize },\n        error: null,\n      };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Upload a large file with resumable chunked uploads.\n   *\n   * Features:\n   * - Uploads file in chunks for reliability\n   * - Automatically retries failed chunks with exponential backoff\n   * - Reports progress via callback with chunk-level granularity\n   * - Can resume interrupted uploads using session ID\n   *\n   * @param path - The file path within the bucket\n   * @param file - The File or Blob to upload\n   * @param options - Upload options including chunk size, retries, and progress callback\n   * @returns Upload result with file info\n   *\n   * @example\n   * const { data, error } = await storage.from('uploads').uploadResumable('large.zip', file, {\n   *   chunkSize: 5 * 1024 * 1024, // 5MB chunks\n   *   maxRetries: 3,\n   *   onProgress: (p) => {\n   *     console.log(`${p.percentage}% (chunk ${p.currentChunk}/${p.totalChunks})`);\n   *     console.log(`Speed: ${(p.bytesPerSecond / 1024 / 1024).toFixed(2)} MB/s`);\n   *     console.log(`Session ID (for resume): ${p.sessionId}`);\n   *   }\n   * });\n   *\n   * // To resume an interrupted upload:\n   * const { data, error } = await storage.from('uploads').uploadResumable('large.zip', file, {\n   *   resumeSessionId: 'previous-session-id',\n   * });\n   */\n  async uploadResumable(\n    path: string,\n    file: File | Blob,\n    options?: ResumableUploadOptions,\n  ): Promise<{\n    data: { id: string; path: string; fullPath: string } | null;\n    error: Error | null;\n  }> {\n    try {\n      const chunkSize = options?.chunkSize ?? 5 * 1024 * 1024; // 5MB default\n      const maxRetries = options?.maxRetries ?? 3;\n      const retryDelayMs = options?.retryDelayMs ?? 1000;\n      const chunkTimeout = options?.chunkTimeout ?? 60000; // 1 minute per chunk\n\n      const totalSize = file.size;\n      const totalChunks = Math.ceil(totalSize / chunkSize);\n\n      // Check if already aborted\n      if (options?.signal?.aborted) {\n        return { data: null, error: new Error(\"Upload aborted\") };\n      }\n\n      const baseUrl = this.fetch.getBaseUrl();\n      const headers = this.fetch.getDefaultHeaders();\n\n      // 1. Initialize or resume session\n      let sessionId = options?.resumeSessionId;\n      let session: ChunkedUploadSession;\n      let completedChunks: number[] = [];\n\n      if (!sessionId) {\n        // Initialize new session\n        const initResponse = await fetch(\n          `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/init`,\n          {\n            method: \"POST\",\n            headers: {\n              ...headers,\n              \"Content-Type\": \"application/json\",\n            },\n            body: JSON.stringify({\n              path,\n              total_size: totalSize,\n              chunk_size: chunkSize,\n              content_type:\n                options?.contentType || file.type || \"application/octet-stream\",\n              metadata: options?.metadata,\n              cache_control: options?.cacheControl,\n            }),\n            signal: options?.signal,\n          },\n        );\n\n        if (!initResponse.ok) {\n          const errorData = await initResponse.json().catch(() => ({}));\n          throw new Error(\n            errorData.error ||\n              `Failed to initialize upload: ${initResponse.statusText}`,\n          );\n        }\n\n        const initData = await initResponse.json();\n        session = {\n          sessionId: initData.session_id,\n          bucket: initData.bucket,\n          path: initData.path,\n          totalSize: initData.total_size,\n          chunkSize: initData.chunk_size,\n          totalChunks: initData.total_chunks,\n          completedChunks: initData.completed_chunks || [],\n          status: initData.status,\n          expiresAt: initData.expires_at,\n          createdAt: initData.created_at,\n        };\n        sessionId = session.sessionId;\n      } else {\n        // Resume existing session - get status\n        const statusResponse = await fetch(\n          `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/${sessionId}/status`,\n          {\n            method: \"GET\",\n            headers,\n            signal: options?.signal,\n          },\n        );\n\n        if (!statusResponse.ok) {\n          const errorData = await statusResponse.json().catch(() => ({}));\n          throw new Error(\n            errorData.error ||\n              `Failed to get session status: ${statusResponse.statusText}`,\n          );\n        }\n\n        const statusData = await statusResponse.json();\n        session = statusData.session;\n        completedChunks = session.completedChunks || [];\n      }\n\n      // Calculate already uploaded bytes for progress\n      let uploadedBytes = 0;\n      for (const chunkIdx of completedChunks) {\n        const chunkStart = chunkIdx * chunkSize;\n        const chunkEnd = Math.min(chunkStart + chunkSize, totalSize);\n        uploadedBytes += chunkEnd - chunkStart;\n      }\n\n      let lastProgressTime = Date.now();\n      let lastProgressBytes = uploadedBytes;\n\n      // 2. Upload each chunk with retry logic\n      for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) {\n        // Check if aborted\n        if (options?.signal?.aborted) {\n          return { data: null, error: new Error(\"Upload aborted\") };\n        }\n\n        // Skip already completed chunks\n        if (completedChunks.includes(chunkIndex)) {\n          continue;\n        }\n\n        const start = chunkIndex * chunkSize;\n        const end = Math.min(start + chunkSize, totalSize);\n        const chunk = file.slice(start, end);\n        const chunkArrayBuffer = await chunk.arrayBuffer();\n\n        let retryCount = 0;\n        let chunkUploaded = false;\n\n        while (retryCount <= maxRetries && !chunkUploaded) {\n          try {\n            // Check abort before each attempt\n            if (options?.signal?.aborted) {\n              return { data: null, error: new Error(\"Upload aborted\") };\n            }\n\n            // Create per-chunk timeout controller\n            const chunkController = new AbortController();\n            const timeoutId = setTimeout(\n              () => chunkController.abort(),\n              chunkTimeout,\n            );\n\n            // Forward external signal to chunk controller\n            if (options?.signal) {\n              options.signal.addEventListener(\n                \"abort\",\n                () => chunkController.abort(),\n                { once: true },\n              );\n            }\n\n            const chunkResponse = await fetch(\n              `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/${sessionId}/${chunkIndex}`,\n              {\n                method: \"PUT\",\n                headers: {\n                  ...headers,\n                  \"Content-Type\": \"application/octet-stream\",\n                  \"Content-Length\": String(chunkArrayBuffer.byteLength),\n                },\n                body: chunkArrayBuffer,\n                signal: chunkController.signal,\n              },\n            );\n\n            clearTimeout(timeoutId);\n\n            if (!chunkResponse.ok) {\n              const errorData = await chunkResponse.json().catch(() => ({}));\n              throw new Error(\n                errorData.error ||\n                  `Chunk upload failed: ${chunkResponse.statusText}`,\n              );\n            }\n\n            chunkUploaded = true;\n          } catch (err) {\n            // Check if it was user abort\n            if (options?.signal?.aborted) {\n              return { data: null, error: new Error(\"Upload aborted\") };\n            }\n\n            retryCount++;\n            if (retryCount > maxRetries) {\n              throw new Error(\n                `Failed to upload chunk ${chunkIndex} after ${maxRetries} retries: ${(err as Error).message}`,\n              );\n            }\n\n            // Exponential backoff: 1s, 2s, 4s...\n            const delay = retryDelayMs * Math.pow(2, retryCount - 1);\n            await new Promise((resolve) => setTimeout(resolve, delay));\n          }\n        }\n\n        // Update progress\n        uploadedBytes += end - start;\n\n        if (options?.onProgress) {\n          const now = Date.now();\n          const elapsed = (now - lastProgressTime) / 1000;\n          const bytesPerSecond =\n            elapsed > 0 ? (uploadedBytes - lastProgressBytes) / elapsed : 0;\n\n          lastProgressTime = now;\n          lastProgressBytes = uploadedBytes;\n\n          options.onProgress({\n            loaded: uploadedBytes,\n            total: totalSize,\n            percentage: Math.round((uploadedBytes / totalSize) * 100),\n            currentChunk: chunkIndex + 1,\n            totalChunks,\n            bytesPerSecond,\n            sessionId: sessionId!,\n          });\n        }\n      }\n\n      // 3. Complete the upload\n      const completeResponse = await fetch(\n        `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/${sessionId}/complete`,\n        {\n          method: \"POST\",\n          headers,\n          signal: options?.signal,\n        },\n      );\n\n      if (!completeResponse.ok) {\n        const errorData = await completeResponse.json().catch(() => ({}));\n        throw new Error(\n          errorData.error ||\n            `Failed to complete upload: ${completeResponse.statusText}`,\n        );\n      }\n\n      const result = await completeResponse.json();\n\n      return {\n        data: {\n          id: result.id,\n          path: result.path,\n          fullPath: result.full_path,\n        },\n        error: null,\n      };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Abort an in-progress resumable upload\n   * @param sessionId - The upload session ID to abort\n   */\n  async abortResumableUpload(\n    sessionId: string,\n  ): Promise<{ error: Error | null }> {\n    try {\n      const baseUrl = this.fetch.getBaseUrl();\n      const headers = this.fetch.getDefaultHeaders();\n\n      const response = await fetch(\n        `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/${sessionId}`,\n        {\n          method: \"DELETE\",\n          headers,\n        },\n      );\n\n      if (!response.ok && response.status !== 204) {\n        const errorData = await response.json().catch(() => ({}));\n        throw new Error(\n          errorData.error || `Failed to abort upload: ${response.statusText}`,\n        );\n      }\n\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Get the status of a resumable upload session\n   * @param sessionId - The upload session ID to check\n   */\n  async getResumableUploadStatus(\n    sessionId: string,\n  ): Promise<{ data: ChunkedUploadSession | null; error: Error | null }> {\n    try {\n      const baseUrl = this.fetch.getBaseUrl();\n      const headers = this.fetch.getDefaultHeaders();\n\n      const response = await fetch(\n        `${baseUrl}/api/v1/storage/${this.bucketName}/chunked/${sessionId}/status`,\n        {\n          method: \"GET\",\n          headers,\n        },\n      );\n\n      if (!response.ok) {\n        const errorData = await response.json().catch(() => ({}));\n        throw new Error(\n          errorData.error ||\n            `Failed to get upload status: ${response.statusText}`,\n        );\n      }\n\n      const data = await response.json();\n      return {\n        data: data.session,\n        error: null,\n      };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List files in the bucket\n   * Supports both Supabase-style list(path, options) and Fluxbase-style list(options)\n   * @param pathOrOptions - The folder path or list options\n   * @param maybeOptions - List options when first param is a path\n   */\n  async list(\n    pathOrOptions?: string | ListOptions,\n    maybeOptions?: ListOptions,\n  ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n\n      // Determine if first arg is path or options\n      let prefix: string | undefined;\n      let options: ListOptions | undefined;\n\n      if (typeof pathOrOptions === \"string\") {\n        // Supabase-style: list('path/', { limit: 10 })\n        prefix = pathOrOptions;\n        options = maybeOptions;\n      } else {\n        // Fluxbase-style: list({ prefix: 'path/', limit: 10 })\n        options = pathOrOptions;\n        prefix = options?.prefix;\n      }\n\n      if (prefix) {\n        params.set(\"prefix\", prefix);\n      }\n\n      if (options?.limit) {\n        params.set(\"limit\", String(options.limit));\n      }\n\n      if (options?.offset) {\n        params.set(\"offset\", String(options.offset));\n      }\n\n      const queryString = params.toString();\n      const path = `/api/v1/storage/${this.bucketName}${queryString ? `?${queryString}` : \"\"}`;\n\n      const response = await this.fetch.get<{ files: any[] }>(path);\n\n      // Convert to FileObject format\n      const files: FileObject[] = (response.files || []).map((file: any) => ({\n        name: file.key || file.name,\n        id: file.id,\n        bucket_id: file.bucket || this.bucketName,\n        created_at: file.last_modified || file.created_at,\n        updated_at: file.updated_at,\n        last_accessed_at: file.last_accessed_at,\n        metadata: file.metadata,\n      }));\n\n      return { data: files, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Remove files from the bucket\n   * @param paths - Array of file paths to remove\n   */\n  async remove(\n    paths: string[],\n  ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n    try {\n      const removedFiles: FileObject[] = [];\n\n      // Delete files one by one (could be optimized with batch endpoint)\n      for (const path of paths) {\n        await this.fetch.delete(`/api/v1/storage/${this.bucketName}/${path}`);\n        // Add to removed files list\n        removedFiles.push({\n          name: path,\n          bucket_id: this.bucketName,\n        });\n      }\n\n      return { data: removedFiles, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Copy a file to a new path\n   *\n   * @param fromPath - Source file path\n   * @param toPath - Destination file path\n   * @returns Promise resolving to { data, error } tuple\n   */\n  async copy(\n    fromPath: string,\n    toPath: string,\n  ): Promise<{ data: unknown; error: Error | null }> {\n    try {\n      const data = await this.fetch.post(\n        `/api/v1/storage/${this.bucketName}/copy`,\n        { from_path: fromPath, to_path: toPath },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Move a file to a new path\n   *\n   * @param fromPath - Source file path\n   * @param toPath - Destination file path\n   * @returns Promise resolving to { data, error } tuple\n   */\n  async move(\n    fromPath: string,\n    toPath: string,\n  ): Promise<{ data: unknown; error: Error | null }> {\n    try {\n      const data = await this.fetch.post(\n        `/api/v1/storage/${this.bucketName}/move`,\n        { from_path: fromPath, to_path: toPath },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a public URL for a file\n   * @param path - The file path\n   */\n  getPublicUrl(path: string): { data: { publicUrl: string } } {\n    const publicUrl = `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/${path}`;\n    return { data: { publicUrl } };\n  }\n\n  /**\n   * Build query string from transform options\n   * @private\n   */\n  private buildTransformQuery(transform: TransformOptions): string {\n    const params = new URLSearchParams();\n\n    if (transform.width !== undefined && transform.width > 0) {\n      params.set(\"w\", String(transform.width));\n    }\n    if (transform.height !== undefined && transform.height > 0) {\n      params.set(\"h\", String(transform.height));\n    }\n    if (transform.format) {\n      params.set(\"fmt\", transform.format);\n    }\n    if (transform.quality !== undefined && transform.quality > 0) {\n      params.set(\"q\", String(transform.quality));\n    }\n    if (transform.fit) {\n      params.set(\"fit\", transform.fit);\n    }\n\n    return params.toString();\n  }\n\n  /**\n   * Get a public URL for a file with image transformations applied\n   * Only works for image files (JPEG, PNG, WebP, GIF, AVIF, etc.)\n   *\n   * @param path - The file path\n   * @param transform - Transformation options (width, height, format, quality, fit)\n   *\n   * @example\n   * ```typescript\n   * // Get a 300x200 WebP thumbnail\n   * const url = storage.from('images').getTransformUrl('photo.jpg', {\n   *   width: 300,\n   *   height: 200,\n   *   format: 'webp',\n   *   quality: 85,\n   *   fit: 'cover'\n   * });\n   *\n   * // Get a resized image maintaining aspect ratio\n   * const url = storage.from('images').getTransformUrl('photo.jpg', {\n   *   width: 800,\n   *   format: 'webp'\n   * });\n   * ```\n   */\n  getTransformUrl(path: string, transform: TransformOptions): string {\n    const baseUrl = `${this.fetch.getBaseUrl()}/api/v1/storage/${this.bucketName}/${path}`;\n    const queryString = this.buildTransformQuery(transform);\n    return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n  }\n\n  /**\n   * Create a signed URL for temporary access to a file\n   * Optionally include image transformation parameters\n   *\n   * @param path - The file path\n   * @param options - Signed URL options including expiration and transforms\n   *\n   * @example\n   * ```typescript\n   * // Simple signed URL (1 hour expiry)\n   * const { data, error } = await storage.from('images').createSignedUrl('photo.jpg');\n   *\n   * // Signed URL with custom expiry\n   * const { data, error } = await storage.from('images').createSignedUrl('photo.jpg', {\n   *   expiresIn: 7200 // 2 hours\n   * });\n   *\n   * // Signed URL with image transformation\n   * const { data, error } = await storage.from('images').createSignedUrl('photo.jpg', {\n   *   expiresIn: 3600,\n   *   transform: {\n   *     width: 400,\n   *     height: 300,\n   *     format: 'webp',\n   *     quality: 85,\n   *     fit: 'cover'\n   *   }\n   * });\n   * ```\n   */\n  async createSignedUrl(\n    path: string,\n    options?: SignedUrlOptions,\n  ): Promise<{ data: { signedUrl: string } | null; error: Error | null }> {\n    try {\n      const expiresIn = options?.expiresIn || 3600; // Default 1 hour\n\n      // Build request body with transform options if provided\n      const requestBody: Record<string, unknown> = { expires_in: expiresIn };\n\n      if (options?.transform) {\n        const transform = options.transform;\n        if (transform.width !== undefined && transform.width > 0) {\n          requestBody.width = transform.width;\n        }\n        if (transform.height !== undefined && transform.height > 0) {\n          requestBody.height = transform.height;\n        }\n        if (transform.format) {\n          requestBody.format = transform.format;\n        }\n        if (transform.quality !== undefined && transform.quality > 0) {\n          requestBody.quality = transform.quality;\n        }\n        if (transform.fit) {\n          requestBody.fit = transform.fit;\n        }\n      }\n\n      const data = await this.fetch.post<{ signed_url: string }>(\n        `/api/v1/storage/${this.bucketName}/sign/${path}`,\n        requestBody,\n      );\n\n      return { data: { signedUrl: data.signed_url }, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Share a file with another user (RLS)\n   * @param path - The file path\n   * @param options - Share options (userId and permission)\n   */\n  async share(\n    path: string,\n    options: ShareFileOptions,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.post(\n        `/api/v1/storage/${this.bucketName}/${path}/share`,\n        {\n          user_id: options.userId,\n          permission: options.permission,\n        },\n      );\n\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Revoke file access from a user (RLS)\n   * @param path - The file path\n   * @param userId - The user ID to revoke access from\n   */\n  async revokeShare(\n    path: string,\n    userId: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(\n        `/api/v1/storage/${this.bucketName}/${path}/share/${userId}`,\n      );\n\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List users a file is shared with (RLS)\n   * @param path - The file path\n   */\n  async listShares(\n    path: string,\n  ): Promise<{ data: FileShare[] | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<{ shares: FileShare[] }>(\n        `/api/v1/storage/${this.bucketName}/${path}/shares`,\n      );\n\n      return { data: data.shares || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n\nexport class FluxbaseStorage {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Get a reference to a storage bucket\n   * @param bucketName - The name of the bucket\n   */\n  from(bucketName: string): StorageBucket {\n    return new StorageBucket(this.fetch, bucketName);\n  }\n\n  /**\n   * List all buckets\n   */\n  async listBuckets(): Promise<{\n    data: Array<{ name: string; created_at: string }> | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.get<{\n        buckets: Array<{ name: string; created_at: string }>;\n      }>(\"/api/v1/storage/buckets\");\n\n      return { data: data.buckets || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new bucket\n   * @param bucketName - The name of the bucket to create\n   */\n  async createBucket(\n    bucketName: string,\n  ): Promise<{ data: { name: string } | null; error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/storage/buckets/${bucketName}`);\n      return { data: { name: bucketName }, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a bucket\n   * @param bucketName - The name of the bucket to delete\n   */\n  async deleteBucket(\n    bucketName: string,\n  ): Promise<{ data: { message: string } | null; error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/storage/buckets/${bucketName}`);\n      return { data: { message: \"Successfully deleted\" }, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Empty a bucket (delete all files)\n   * @param bucketName - The name of the bucket to empty\n   */\n  async emptyBucket(\n    bucketName: string,\n  ): Promise<{ data: { message: string } | null; error: Error | null }> {\n    try {\n      // List all files and delete them\n      const bucket = this.from(bucketName);\n      const { data: objects, error: listError } = await bucket.list();\n\n      if (listError) {\n        return { data: null, error: listError };\n      }\n\n      if (objects && objects.length > 0) {\n        const paths = objects.map((obj) => obj.name);\n        const { error: removeError } = await bucket.remove(paths);\n\n        if (removeError) {\n          return { data: null, error: removeError };\n        }\n      }\n\n      return { data: { message: \"Successfully emptied\" }, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update bucket settings (RLS - requires admin or service key)\n   * @param bucketName - The name of the bucket\n   * @param settings - Bucket settings to update\n   */\n  async updateBucketSettings(\n    bucketName: string,\n    settings: BucketSettings,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.put(`/api/v1/storage/buckets/${bucketName}`, settings);\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get bucket details\n   * @param bucketName - The name of the bucket\n   */\n  async getBucket(\n    bucketName: string,\n  ): Promise<{ data: Bucket | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<Bucket>(\n        `/api/v1/storage/buckets/${bucketName}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * Edge Functions module for Fluxbase SDK\n * Compatible with Supabase Functions API\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const { data, error } = await client.functions.invoke('hello-world', {\n *   body: { name: 'Alice' }\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-call', {\n *   body: { query: 'data' },\n *   headers: { 'X-Custom-Header': 'value' },\n *   method: 'POST'\n * })\n * ```\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n  FunctionInvokeOptions,\n  EdgeFunction,\n} from './types'\n\n/**\n * Edge Functions client for invoking serverless functions\n * API-compatible with Supabase Functions\n *\n * For admin operations (create, update, delete, sync), use client.admin.functions\n *\n * @category Functions\n */\nexport class FluxbaseFunctions {\n  private fetch: FluxbaseFetch\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch\n  }\n\n  /**\n   * Invoke an edge function\n   *\n   * This method is fully compatible with Supabase's functions.invoke() API.\n   *\n   * @param functionName - The name of the function to invoke\n   * @param options - Invocation options including body, headers, HTTP method, and namespace\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * // Simple invocation (uses first matching function by namespace alphabetically)\n   * const { data, error } = await client.functions.invoke('hello', {\n   *   body: { name: 'World' }\n   * })\n   *\n   * // Invoke a specific namespace's function\n   * const { data, error } = await client.functions.invoke('hello', {\n   *   body: { name: 'World' },\n   *   namespace: 'my-app'\n   * })\n   *\n   * // With GET method\n   * const { data, error } = await client.functions.invoke('get-data', {\n   *   method: 'GET'\n   * })\n   *\n   * // With custom headers\n   * const { data, error } = await client.functions.invoke('api-proxy', {\n   *   body: { query: 'search' },\n   *   headers: { 'Authorization': 'Bearer token' },\n   *   method: 'POST'\n   * })\n   * ```\n   */\n  async invoke<T = unknown>(\n    functionName: string,\n    options?: FunctionInvokeOptions\n  ): Promise<{ data: T | null; error: Error | null }> {\n    try {\n      const method = options?.method || 'POST'\n      const headers = options?.headers || {}\n      const body = options?.body\n      const namespace = options?.namespace\n\n      // Use the Fluxbase backend endpoint\n      // If namespace is provided, add it as a query parameter\n      const endpoint = namespace\n        ? `/api/v1/functions/${functionName}/invoke?namespace=${encodeURIComponent(namespace)}`\n        : `/api/v1/functions/${functionName}/invoke`\n\n      let response: T\n\n      // Route to appropriate HTTP method\n      switch (method) {\n        case 'GET':\n          response = await this.fetch.get<T>(endpoint, { headers })\n          break\n        case 'DELETE':\n          response = await this.fetch.delete<T>(endpoint, { headers })\n          break\n        case 'PUT':\n          response = await this.fetch.put<T>(endpoint, body, { headers })\n          break\n        case 'PATCH':\n          response = await this.fetch.patch<T>(endpoint, body, { headers })\n          break\n        case 'POST':\n        default:\n          response = await this.fetch.post<T>(endpoint, body, { headers })\n          break\n      }\n\n      return { data: response, error: null }\n    } catch (error) {\n      return { data: null, error: error as Error }\n    }\n  }\n\n  /**\n   * List all public edge functions\n   *\n   * @returns Promise resolving to { data, error } tuple with array of public functions\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.functions.list()\n   * if (data) {\n   *   console.log('Functions:', data.map(f => f.name))\n   * }\n   * ```\n   */\n  async list(): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<EdgeFunction[]>('/api/v1/functions')\n      return { data, error: null }\n    } catch (error) {\n      return { data: null, error: error as Error }\n    }\n  }\n\n  /**\n   * Get details of a specific edge function\n   *\n   * @param name - Function name\n   * @returns Promise resolving to { data, error } tuple with function metadata\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.functions.get('my-function')\n   * if (data) {\n   *   console.log('Function version:', data.version)\n   * }\n   * ```\n   */\n  async get(name: string): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<EdgeFunction>(`/api/v1/functions/${name}`)\n      return { data, error: null }\n    } catch (error) {\n      return { data: null, error: error as Error }\n    }\n  }\n}\n","/**\n * Jobs module for Fluxbase SDK\n * Client-facing API for submitting and monitoring background jobs\n *\n * @example\n * ```typescript\n * // Submit a job\n * const { data, error } = await client.jobs.submit('process-data', {\n *   items: [1, 2, 3]\n * })\n *\n * // Get job status\n * const { data: job, error } = await client.jobs.get(data.id)\n * console.log('Job status:', job.status)\n *\n * // Cancel a running job\n * await client.jobs.cancel(data.id)\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type { ExecutionLog, Job, OnBehalfOf, SubmitJobRequest, User } from \"./types\";\n\n/**\n * Jobs client for submitting and monitoring background jobs\n *\n * For admin operations (create job functions, manage workers, view all jobs),\n * use client.admin.jobs\n *\n * @category Jobs\n */\nexport class FluxbaseJobs {\n  private fetch: FluxbaseFetch;\n  private cachedRole: { userId: string; role: string; expiresAt: number } | null = null;\n  private readonly ROLE_CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n  private isServiceRole: boolean;\n\n  constructor(fetch: FluxbaseFetch, isServiceRole = false) {\n    this.fetch = fetch;\n    this.isServiceRole = isServiceRole;\n  }\n\n  /**\n   * Get the current user's role from user_profiles table\n   * This is used to auto-populate the onBehalfOf parameter when submitting jobs\n   *\n   * @returns Promise resolving to the user's role or null if not found\n   */\n  private async getCurrentUserRole(userId: string): Promise<string | null> {\n    try {\n      // Check cache\n      const now = Date.now();\n      if (\n        this.cachedRole &&\n        this.cachedRole.userId === userId &&\n        this.cachedRole.expiresAt > now\n      ) {\n        return this.cachedRole.role;\n      }\n\n      // Fetch user role from user_profiles table\n      // Note: This assumes a standard user_profiles table with role column\n      const profileResult = await this.fetch.get<Array<{ role: string }>>(\n        `/rest/v1/user_profiles?id=eq.${userId}&select=role`\n      );\n\n      if (!profileResult || !profileResult[0]) {\n        return null;\n      }\n\n      const role = profileResult[0].role;\n\n      // Update cache\n      if (role) {\n        this.cachedRole = {\n          userId,\n          role,\n          expiresAt: now + this.ROLE_CACHE_TTL\n        };\n      }\n\n      return role;\n    } catch (error) {\n      console.warn('[FluxbaseJobs] Failed to fetch user role:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Submit a new job for execution\n   *\n   * @param jobName - Name of the job function to execute\n   * @param payload - Job input data\n   * @param options - Additional options (priority, namespace, scheduled time, onBehalfOf)\n   * @returns Promise resolving to { data, error } tuple with submitted job details\n   *\n   * @example\n   * ```typescript\n   * // Submit a simple job\n   * const { data, error } = await client.jobs.submit('send-email', {\n   *   to: 'user@example.com',\n   *   subject: 'Hello',\n   *   body: 'Welcome!'\n   * })\n   *\n   * if (data) {\n   *   console.log('Job submitted:', data.id)\n   *   console.log('Status:', data.status)\n   * }\n   *\n   * // Submit with priority\n   * const { data } = await client.jobs.submit('high-priority-task', payload, {\n   *   priority: 10\n   * })\n   *\n   * // Schedule for later\n   * const { data } = await client.jobs.submit('scheduled-task', payload, {\n   *   scheduled: '2025-01-01T00:00:00Z'\n   * })\n   *\n   * // Submit on behalf of a user (service_role only)\n   * const { data } = await serviceClient.jobs.submit('user-task', payload, {\n   *   onBehalfOf: {\n   *     user_id: 'user-uuid',\n   *     user_email: 'user@example.com'\n   *   }\n   * })\n   * ```\n   */\n  async submit(\n    jobName: string,\n    payload?: unknown,\n    options?: {\n      priority?: number;\n      namespace?: string;\n      scheduled?: string;\n      /**\n       * Submit job on behalf of another user (service_role only).\n       * The job will be created with the specified user's identity,\n       * allowing them to see the job and its logs via RLS.\n       *\n       * If not provided, the current user's identity and role from user_profiles\n       * will be automatically included.\n       */\n      onBehalfOf?: OnBehalfOf;\n    },\n  ): Promise<{ data: Job | null; error: Error | null }> {\n    try {\n      let finalOnBehalfOf = options?.onBehalfOf;\n\n      // Only auto-populate onBehalfOf if this is a service role client\n      // Regular authenticated users cannot use on_behalf_of (backend rejects it)\n      if (this.isServiceRole && !finalOnBehalfOf) {\n        // Get current user info to submit on their behalf\n        const userResponse = await this.fetch.get<{ user: User }>(\"/api/v1/auth/user\");\n        if (userResponse?.user) {\n          const user = userResponse.user;\n\n          // Fetch user's role from user_profiles\n          const role = await this.getCurrentUserRole(user.id);\n\n          // Populate onBehalfOf with current user's identity and role\n          finalOnBehalfOf = {\n            user_id: user.id,\n            user_email: user.email,\n            user_role: role || undefined // Include role if found\n          };\n        }\n      }\n\n      const request: SubmitJobRequest = {\n        job_name: jobName,\n        payload,\n        priority: options?.priority,\n        namespace: options?.namespace,\n        scheduled: options?.scheduled,\n        on_behalf_of: finalOnBehalfOf,\n      };\n\n      const data = await this.fetch.post<Job>(\"/api/v1/jobs/submit\", request);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get status and details of a specific job\n   *\n   * @param jobId - Job ID\n   * @returns Promise resolving to { data, error } tuple with job details\n   *\n   * @example\n   * ```typescript\n   * const { data: job, error } = await client.jobs.get('550e8400-e29b-41d4-a716-446655440000')\n   *\n   * if (job) {\n   *   console.log('Status:', job.status)\n   *   console.log('Progress:', job.progress_percent + '%')\n   *   console.log('Result:', job.result)\n   *   console.log('Logs:', job.logs)\n   * }\n   * ```\n   */\n  async get(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<Job>(`/api/v1/jobs/${jobId}`);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List jobs submitted by the current user\n   *\n   * @param filters - Optional filters (status, namespace, limit, offset)\n   * @returns Promise resolving to { data, error } tuple with array of jobs\n   *\n   * @example\n   * ```typescript\n   * // List all your jobs\n   * const { data: jobs, error } = await client.jobs.list()\n   *\n   * // Filter by status\n   * const { data: running } = await client.jobs.list({\n   *   status: 'running'\n   * })\n   *\n   * // Paginate\n   * const { data: page } = await client.jobs.list({\n   *   limit: 20,\n   *   offset: 40\n   * })\n   * ```\n   */\n  async list(filters?: {\n    status?: string;\n    namespace?: string;\n    limit?: number;\n    offset?: number;\n    includeResult?: boolean;\n  }): Promise<{ data: Job[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n      if (filters?.status) params.append(\"status\", filters.status);\n      if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n      if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n      if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n      if (filters?.includeResult) params.append(\"include_result\", \"true\");\n\n      const queryString = params.toString();\n      const data = await this.fetch.get<Job[]>(\n        `/api/v1/jobs${queryString ? `?${queryString}` : \"\"}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Cancel a pending or running job\n   *\n   * @param jobId - Job ID to cancel\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n   *\n   * if (!error) {\n   *   console.log('Job cancelled successfully')\n   * }\n   * ```\n   */\n  async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/jobs/${jobId}/cancel`, {});\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Retry a failed job\n   *\n   * Creates a new job execution with the same parameters\n   *\n   * @param jobId - Job ID to retry\n   * @returns Promise resolving to { data, error } tuple with new job\n   *\n   * @example\n   * ```typescript\n   * const { data: newJob, error } = await client.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n   *\n   * if (newJob) {\n   *   console.log('Job retried, new ID:', newJob.id)\n   * }\n   * ```\n   */\n  async retry(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<Job>(`/api/v1/jobs/${jobId}/retry`, {});\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution logs for a job\n   *\n   * Returns logs for the specified job. Only returns logs for jobs\n   * owned by the authenticated user (unless using service_role).\n   *\n   * @param jobId - Job ID\n   * @param afterLine - Optional line number to get logs after (for polling/streaming)\n   * @returns Promise resolving to { data, error } tuple with execution logs\n   *\n   * @example\n   * ```typescript\n   * // Get all logs for a job\n   * const { data: logs, error } = await client.jobs.getLogs('550e8400-e29b-41d4-a716-446655440000')\n   *\n   * if (logs) {\n   *   for (const log of logs) {\n   *     console.log(`[${log.level}] ${log.message}`)\n   *   }\n   * }\n   *\n   * // Backfill + stream pattern\n   * const { data: logs } = await client.jobs.getLogs(jobId)\n   * let lastLine = Math.max(...(logs?.map(l => l.line_number) ?? []), 0)\n   *\n   * const channel = client.realtime\n   *   .executionLogs(jobId, 'job')\n   *   .onLog((log) => {\n   *     if (log.line_number > lastLine) {\n   *       displayLog(log)\n   *       lastLine = log.line_number\n   *     }\n   *   })\n   *   .subscribe()\n   * ```\n   */\n  async getLogs(\n    jobId: string,\n    afterLine?: number,\n  ): Promise<{ data: ExecutionLog[] | null; error: Error | null }> {\n    try {\n      const params = afterLine !== undefined ? `?after_line=${afterLine}` : \"\";\n      const response = await this.fetch.get<{ logs: ExecutionLog[]; count: number }>(\n        `/api/v1/jobs/${jobId}/logs${params}`,\n      );\n      return { data: response.logs || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * RPC (Remote Procedure Call) module for invoking SQL-based procedures\n */\n\nimport type {\n  RPCProcedureSummary,\n  RPCExecution,\n  RPCInvokeResponse,\n  RPCExecutionLog,\n} from \"./types\";\n\n/**\n * Options for invoking an RPC procedure\n */\nexport interface RPCInvokeOptions {\n  /** Namespace of the procedure (defaults to 'default') */\n  namespace?: string;\n  /** Execute asynchronously (returns execution ID immediately) */\n  async?: boolean;\n  /** Request timeout in milliseconds (default: 30000) */\n  timeout?: number;\n}\n\n/**\n * Fetch interface for RPC operations\n */\ninterface RPCFetch {\n  get: <T>(path: string) => Promise<T>;\n  post: <T>(\n    path: string,\n    body?: unknown,\n    options?: { timeout?: number },\n  ) => Promise<T>;\n}\n\n/**\n * FluxbaseRPC provides methods for invoking RPC procedures\n *\n * @example\n * ```typescript\n * // Invoke a procedure synchronously\n * const { data, error } = await fluxbase.rpc.invoke('get-user-orders', {\n *   user_id: '123',\n *   limit: 10\n * });\n *\n * // Invoke asynchronously\n * const { data: asyncResult } = await fluxbase.rpc.invoke('long-running-report', {\n *   start_date: '2024-01-01'\n * }, { async: true });\n *\n * // Poll for status\n * const { data: status } = await fluxbase.rpc.getStatus(asyncResult.execution_id);\n * ```\n */\nexport class FluxbaseRPC {\n  private fetch: RPCFetch;\n\n  constructor(fetch: RPCFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * List available RPC procedures (public, enabled)\n   *\n   * @param namespace - Optional namespace filter\n   * @returns Promise resolving to { data, error } tuple with array of procedure summaries\n   */\n  async list(namespace?: string): Promise<{\n    data: RPCProcedureSummary[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const params = namespace\n        ? `?namespace=${encodeURIComponent(namespace)}`\n        : \"\";\n      const response = await this.fetch.get<{\n        procedures: RPCProcedureSummary[];\n        count: number;\n      }>(`/api/v1/rpc/procedures${params}`);\n      return { data: response.procedures || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Invoke an RPC procedure\n   *\n   * @param name - Procedure name\n   * @param params - Optional parameters to pass to the procedure\n   * @param options - Optional invocation options\n   * @returns Promise resolving to { data, error } tuple with invocation response\n   *\n   * @example\n   * ```typescript\n   * // Synchronous invocation\n   * const { data, error } = await fluxbase.rpc.invoke('get-user-orders', {\n   *   user_id: '123',\n   *   limit: 10\n   * });\n   * console.log(data.result); // Query results\n   *\n   * // Asynchronous invocation\n   * const { data: asyncData } = await fluxbase.rpc.invoke('generate-report', {\n   *   year: 2024\n   * }, { async: true });\n   * console.log(asyncData.execution_id); // Use to poll status\n   * ```\n   */\n  async invoke<T = unknown>(\n    name: string,\n    params?: Record<string, unknown>,\n    options?: RPCInvokeOptions,\n  ): Promise<{ data: RPCInvokeResponse<T> | null; error: Error | null }> {\n    try {\n      const namespace = options?.namespace || \"default\";\n      const response = await this.fetch.post<RPCInvokeResponse<T>>(\n        `/api/v1/rpc/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n        {\n          params,\n          async: options?.async,\n        },\n        { timeout: options?.timeout },\n      );\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution status (for async invocations or checking history)\n   *\n   * @param executionId - The execution ID returned from async invoke\n   * @returns Promise resolving to { data, error } tuple with execution details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await fluxbase.rpc.getStatus('execution-uuid');\n   * if (data.status === 'completed') {\n   *   console.log('Result:', data.result);\n   * } else if (data.status === 'running') {\n   *   console.log('Still running...');\n   * }\n   * ```\n   */\n  async getStatus(executionId: string): Promise<{\n    data: RPCExecution | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.get<RPCExecution>(\n        `/api/v1/rpc/executions/${encodeURIComponent(executionId)}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution logs (for debugging and monitoring)\n   *\n   * @param executionId - The execution ID\n   * @param afterLine - Optional line number to get logs after (for polling)\n   * @returns Promise resolving to { data, error } tuple with execution logs\n   *\n   * @example\n   * ```typescript\n   * const { data: logs } = await fluxbase.rpc.getLogs('execution-uuid');\n   * for (const log of logs) {\n   *   console.log(`[${log.level}] ${log.message}`);\n   * }\n   * ```\n   */\n  async getLogs(\n    executionId: string,\n    afterLine?: number,\n  ): Promise<{ data: RPCExecutionLog[] | null; error: Error | null }> {\n    try {\n      const params = afterLine !== undefined ? `?after=${afterLine}` : \"\";\n      const response = await this.fetch.get<{\n        logs: RPCExecutionLog[];\n        count: number;\n      }>(\n        `/api/v1/rpc/executions/${encodeURIComponent(executionId)}/logs${params}`,\n      );\n      return { data: response.logs || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Poll for execution completion with exponential backoff\n   *\n   * @param executionId - The execution ID to poll\n   * @param options - Polling options\n   * @returns Promise resolving to final execution state\n   *\n   * @example\n   * ```typescript\n   * const { data: result } = await fluxbase.rpc.invoke('long-task', {}, { async: true });\n   * const { data: final } = await fluxbase.rpc.waitForCompletion(result.execution_id, {\n   *   maxWaitMs: 60000, // Wait up to 1 minute\n   *   onProgress: (exec) => console.log(`Status: ${exec.status}`)\n   * });\n   * console.log('Final result:', final.result);\n   * ```\n   */\n  async waitForCompletion(\n    executionId: string,\n    options?: {\n      /** Maximum time to wait in milliseconds (default: 30000) */\n      maxWaitMs?: number;\n      /** Initial polling interval in milliseconds (default: 500) */\n      initialIntervalMs?: number;\n      /** Maximum polling interval in milliseconds (default: 5000) */\n      maxIntervalMs?: number;\n      /** Callback for progress updates */\n      onProgress?: (execution: RPCExecution) => void;\n    },\n  ): Promise<{ data: RPCExecution | null; error: Error | null }> {\n    const maxWait = options?.maxWaitMs || 30000;\n    const initialInterval = options?.initialIntervalMs || 500;\n    const maxInterval = options?.maxIntervalMs || 5000;\n\n    const startTime = Date.now();\n    let interval = initialInterval;\n\n    while (Date.now() - startTime < maxWait) {\n      const { data: execution, error } = await this.getStatus(executionId);\n\n      if (error) {\n        return { data: null, error };\n      }\n\n      if (!execution) {\n        return { data: null, error: new Error(\"Execution not found\") };\n      }\n\n      if (options?.onProgress) {\n        options.onProgress(execution);\n      }\n\n      // Check for terminal states\n      if (\n        execution.status === \"completed\" ||\n        execution.status === \"failed\" ||\n        execution.status === \"cancelled\" ||\n        execution.status === \"timeout\"\n      ) {\n        return { data: execution, error: null };\n      }\n\n      // Wait before next poll with exponential backoff\n      await new Promise((resolve) => setTimeout(resolve, interval));\n      interval = Math.min(interval * 1.5, maxInterval);\n    }\n\n    return {\n      data: null,\n      error: new Error(\"Timeout waiting for execution to complete\"),\n    };\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  SystemSetting,\n  UpdateSystemSettingRequest,\n  ListSystemSettingsResponse,\n  AppSettings,\n  UpdateAppSettingsRequest,\n  CustomSetting,\n  SecretSettingMetadata,\n  EmailTemplate,\n  EmailTemplateType,\n  UpdateEmailTemplateRequest,\n  ListEmailTemplatesResponse,\n  EmailProviderSettings,\n  UpdateEmailProviderSettingsRequest,\n  TestEmailSettingsResponse,\n  TenantEmailProviderSettings,\n  UserSetting,\n  UserSettingWithSource,\n} from \"./types\";\n\n/**\n * System Settings Manager\n *\n * Manages low-level system settings with key-value storage.\n * For application-level settings, use AppSettingsManager instead.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.system\n *\n * // List all system settings\n * const { settings } = await settings.list()\n *\n * // Get specific setting\n * const setting = await settings.get('app.auth.enable_signup')\n *\n * // Update setting\n * await settings.update('app.auth.enable_signup', {\n *   value: { value: true },\n *   description: 'Enable user signup'\n * })\n *\n * // Delete setting\n * await settings.delete('app.auth.enable_signup')\n * ```\n */\nexport class SystemSettingsManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * List all system settings\n   *\n   * @returns Promise resolving to ListSystemSettingsResponse\n   *\n   * @example\n   * ```typescript\n   * const response = await client.admin.settings.system.list()\n   * console.log(response.settings)\n   * ```\n   */\n  async list(): Promise<ListSystemSettingsResponse> {\n    const settings = await this.fetch.get<SystemSetting[]>(\n      \"/api/v1/admin/system/settings\",\n    );\n    return { settings: Array.isArray(settings) ? settings : [] };\n  }\n\n  /**\n   * Get a specific system setting by key\n   *\n   * @param key - Setting key (e.g., 'app.auth.enable_signup')\n   * @returns Promise resolving to SystemSetting\n   *\n   * @example\n   * ```typescript\n   * const setting = await client.admin.settings.system.get('app.auth.enable_signup')\n   * console.log(setting.value)\n   * ```\n   */\n  async get(key: string): Promise<SystemSetting> {\n    return await this.fetch.get<SystemSetting>(\n      `/api/v1/admin/system/settings/${key}`,\n    );\n  }\n\n  /**\n   * Update or create a system setting\n   *\n   * @param key - Setting key\n   * @param request - Update request with value and optional description\n   * @returns Promise resolving to SystemSetting\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.admin.settings.system.update('app.auth.enable_signup', {\n   *   value: { value: true },\n   *   description: 'Enable user signup'\n   * })\n   * ```\n   */\n  async update(\n    key: string,\n    request: UpdateSystemSettingRequest,\n  ): Promise<SystemSetting> {\n    return await this.fetch.put<SystemSetting>(\n      `/api/v1/admin/system/settings/${key}`,\n      request,\n    );\n  }\n\n  /**\n   * Delete a system setting\n   *\n   * @param key - Setting key to delete\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.system.delete('app.auth.enable_signup')\n   * ```\n   */\n  async delete(key: string): Promise<void> {\n    await this.fetch.delete(`/api/v1/admin/system/settings/${key}`);\n  }\n}\n\n/**\n * Application Settings Manager\n *\n * Manages high-level application settings with a structured API.\n * Provides type-safe access to authentication, features, email, and security settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.app\n *\n * // Get all app settings\n * const appSettings = await settings.get()\n * console.log(appSettings.authentication.enable_signup)\n *\n * // Update specific settings\n * const updated = await settings.update({\n *   authentication: {\n *     enable_signup: true,\n *     password_min_length: 12\n *   }\n * })\n * ```\n */\nexport class AppSettingsManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Get all application settings\n   *\n   * Returns structured settings for authentication, features, email, and security.\n   *\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * const settings = await client.admin.settings.app.get()\n   *\n   * console.log('Signup enabled:', settings.authentication.enable_signup)\n   * console.log('Realtime enabled:', settings.features.enable_realtime)\n   * console.log('Email provider:', settings.email.provider)\n   * ```\n   */\n  async get(): Promise<AppSettings> {\n    return await this.fetch.get<AppSettings>(\"/api/v1/admin/app/settings\");\n  }\n\n  /**\n   * Update application settings\n   *\n   * Supports partial updates - only provide the fields you want to change.\n   *\n   * @param request - Settings to update (partial update supported)\n   * @returns Promise resolving to AppSettings - Updated settings\n   *\n   * @example\n   * ```typescript\n   * // Update authentication settings\n   * const updated = await client.admin.settings.app.update({\n   *   authentication: {\n   *     enable_signup: true,\n   *     password_min_length: 12\n   *   }\n   * })\n   *\n   * // Update multiple categories\n   * await client.admin.settings.app.update({\n   *   authentication: { enable_signup: false },\n   *   features: { enable_realtime: true },\n   *   security: { enable_global_rate_limit: true }\n   * })\n   * ```\n   */\n  async update(request: UpdateAppSettingsRequest): Promise<AppSettings> {\n    return await this.fetch.put<AppSettings>(\n      \"/api/v1/admin/app/settings\",\n      request,\n    );\n  }\n\n  /**\n   * Enable user signup\n   *\n   * Convenience method to enable user registration.\n   *\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.enableSignup()\n   * ```\n   */\n  async enableSignup(): Promise<AppSettings> {\n    return await this.update({\n      authentication: { enable_signup: true },\n    });\n  }\n\n  /**\n   * Disable user signup\n   *\n   * Convenience method to disable user registration.\n   *\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.disableSignup()\n   * ```\n   */\n  async disableSignup(): Promise<AppSettings> {\n    return await this.update({\n      authentication: { enable_signup: false },\n    });\n  }\n\n  /**\n   * Update password minimum length\n   *\n   * Convenience method to set password requirements.\n   *\n   * @param length - Minimum password length (8-128 characters)\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setPasswordMinLength(12)\n   * ```\n   */\n  async setPasswordMinLength(length: number): Promise<AppSettings> {\n    if (length < 8 || length > 128) {\n      throw new Error(\n        \"Password minimum length must be between 8 and 128 characters\",\n      );\n    }\n\n    return await this.update({\n      authentication: { password_min_length: length },\n    });\n  }\n\n  /**\n   * Enable or disable a feature\n   *\n   * Convenience method to toggle feature flags.\n   *\n   * @param feature - Feature name ('realtime' | 'storage' | 'functions')\n   * @param enabled - Whether to enable or disable the feature\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * // Enable realtime\n   * await client.admin.settings.app.setFeature('realtime', true)\n   *\n   * // Disable storage\n   * await client.admin.settings.app.setFeature('storage', false)\n   * ```\n   */\n  async setFeature(\n    feature: \"realtime\" | \"storage\" | \"functions\",\n    enabled: boolean,\n  ): Promise<AppSettings> {\n    const featureKey =\n      feature === \"realtime\"\n        ? \"enable_realtime\"\n        : feature === \"storage\"\n          ? \"enable_storage\"\n          : \"enable_functions\";\n\n    return await this.update({\n      features: { [featureKey]: enabled },\n    });\n  }\n\n  /**\n   * Enable or disable global rate limiting\n   *\n   * Convenience method to toggle global rate limiting.\n   *\n   * @param enabled - Whether to enable rate limiting\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setRateLimiting(true)\n   * ```\n   */\n  async setRateLimiting(enabled: boolean): Promise<AppSettings> {\n    return await this.update({\n      security: { enable_global_rate_limit: enabled },\n    });\n  }\n\n  /**\n   * Configure SMTP email provider\n   *\n   * Convenience method to set up SMTP email delivery.\n   *\n   * @param config - SMTP configuration\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.configureSMTP({\n   *   host: 'smtp.gmail.com',\n   *   port: 587,\n   *   username: 'your-email@gmail.com',\n   *   password: 'your-app-password',\n   *   use_tls: true,\n   *   from_address: 'noreply@yourapp.com',\n   *   from_name: 'Your App'\n   * })\n   * ```\n   */\n  async configureSMTP(config: {\n    host: string;\n    port: number;\n    username: string;\n    password: string;\n    use_tls: boolean;\n    from_address?: string;\n    from_name?: string;\n    reply_to_address?: string;\n  }): Promise<AppSettings> {\n    return await this.update({\n      email: {\n        enabled: true,\n        provider: \"smtp\",\n        from_address: config.from_address,\n        from_name: config.from_name,\n        reply_to_address: config.reply_to_address,\n        smtp: {\n          host: config.host,\n          port: config.port,\n          username: config.username,\n          password: config.password,\n          use_tls: config.use_tls,\n        },\n      },\n    });\n  }\n\n  /**\n   * Configure SendGrid email provider\n   *\n   * Convenience method to set up SendGrid email delivery.\n   *\n   * @param apiKey - SendGrid API key\n   * @param options - Optional from address, name, and reply-to\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.configureSendGrid('SG.xxx', {\n   *   from_address: 'noreply@yourapp.com',\n   *   from_name: 'Your App'\n   * })\n   * ```\n   */\n  async configureSendGrid(\n    apiKey: string,\n    options?: {\n      from_address?: string;\n      from_name?: string;\n      reply_to_address?: string;\n    },\n  ): Promise<AppSettings> {\n    return await this.update({\n      email: {\n        enabled: true,\n        provider: \"sendgrid\",\n        from_address: options?.from_address,\n        from_name: options?.from_name,\n        reply_to_address: options?.reply_to_address,\n        sendgrid: {\n          api_key: apiKey,\n        },\n      },\n    });\n  }\n\n  /**\n   * Configure Mailgun email provider\n   *\n   * Convenience method to set up Mailgun email delivery.\n   *\n   * @param apiKey - Mailgun API key\n   * @param domain - Mailgun domain\n   * @param options - Optional EU region flag and email addresses\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.configureMailgun('key-xxx', 'mg.yourapp.com', {\n   *   eu_region: false,\n   *   from_address: 'noreply@yourapp.com',\n   *   from_name: 'Your App'\n   * })\n   * ```\n   */\n  async configureMailgun(\n    apiKey: string,\n    domain: string,\n    options?: {\n      eu_region?: boolean;\n      from_address?: string;\n      from_name?: string;\n      reply_to_address?: string;\n    },\n  ): Promise<AppSettings> {\n    return await this.update({\n      email: {\n        enabled: true,\n        provider: \"mailgun\",\n        from_address: options?.from_address,\n        from_name: options?.from_name,\n        reply_to_address: options?.reply_to_address,\n        mailgun: {\n          api_key: apiKey,\n          domain: domain,\n          eu_region: options?.eu_region ?? false,\n        },\n      },\n    });\n  }\n\n  /**\n   * Configure AWS SES email provider\n   *\n   * Convenience method to set up AWS SES email delivery.\n   *\n   * @param accessKeyId - AWS access key ID\n   * @param secretAccessKey - AWS secret access key\n   * @param region - AWS region (e.g., 'us-east-1')\n   * @param options - Optional email addresses\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.configureSES(\n   *   'AKIAIOSFODNN7EXAMPLE',\n   *   'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n   *   'us-east-1',\n   *   {\n   *     from_address: 'noreply@yourapp.com',\n   *     from_name: 'Your App'\n   *   }\n   * )\n   * ```\n   */\n  async configureSES(\n    accessKeyId: string,\n    secretAccessKey: string,\n    region: string,\n    options?: {\n      from_address?: string;\n      from_name?: string;\n      reply_to_address?: string;\n    },\n  ): Promise<AppSettings> {\n    return await this.update({\n      email: {\n        enabled: true,\n        provider: \"ses\",\n        from_address: options?.from_address,\n        from_name: options?.from_name,\n        reply_to_address: options?.reply_to_address,\n        ses: {\n          access_key_id: accessKeyId,\n          secret_access_key: secretAccessKey,\n          region: region,\n        },\n      },\n    });\n  }\n\n  /**\n   * Enable or disable email functionality\n   *\n   * Convenience method to toggle email system on/off.\n   *\n   * @param enabled - Whether to enable email\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setEmailEnabled(true)\n   * ```\n   */\n  async setEmailEnabled(enabled: boolean): Promise<AppSettings> {\n    return await this.update({\n      email: { enabled },\n    });\n  }\n\n  /**\n   * Configure password complexity requirements\n   *\n   * Convenience method to set password validation rules.\n   *\n   * @param requirements - Password complexity requirements\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setPasswordComplexity({\n   *   min_length: 12,\n   *   require_uppercase: true,\n   *   require_lowercase: true,\n   *   require_number: true,\n   *   require_special: true\n   * })\n   * ```\n   */\n  async setPasswordComplexity(requirements: {\n    min_length?: number;\n    require_uppercase?: boolean;\n    require_lowercase?: boolean;\n    require_number?: boolean;\n    require_special?: boolean;\n  }): Promise<AppSettings> {\n    return await this.update({\n      authentication: {\n        password_min_length: requirements.min_length,\n        password_require_uppercase: requirements.require_uppercase,\n        password_require_lowercase: requirements.require_lowercase,\n        password_require_number: requirements.require_number,\n        password_require_special: requirements.require_special,\n      },\n    });\n  }\n\n  /**\n   * Configure session settings\n   *\n   * Convenience method to set session timeout and limits.\n   *\n   * @param timeoutMinutes - Session timeout in minutes (0 for no timeout)\n   * @param maxSessionsPerUser - Maximum concurrent sessions per user (0 for unlimited)\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * // 30 minute sessions, max 3 devices per user\n   * await client.admin.settings.app.setSessionSettings(30, 3)\n   * ```\n   */\n  async setSessionSettings(\n    timeoutMinutes: number,\n    maxSessionsPerUser: number,\n  ): Promise<AppSettings> {\n    return await this.update({\n      authentication: {\n        session_timeout_minutes: timeoutMinutes,\n        max_sessions_per_user: maxSessionsPerUser,\n      },\n    });\n  }\n\n  /**\n   * Enable or disable email verification requirement\n   *\n   * Convenience method to require email verification for new signups.\n   *\n   * @param required - Whether to require email verification\n   * @returns Promise resolving to AppSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setEmailVerificationRequired(true)\n   * ```\n   */\n  async setEmailVerificationRequired(required: boolean): Promise<AppSettings> {\n    return await this.update({\n      authentication: { require_email_verification: required },\n    });\n  }\n\n  // ===================================================================\n  // CUSTOM SETTINGS METHODS\n  // Flexible key-value storage for application-specific configuration\n  // ===================================================================\n\n  /**\n   * Get a specific custom setting's value only (without metadata)\n   *\n   * Convenience method that returns just the value field instead of the full CustomSetting object.\n   *\n   * @param key - Setting key (e.g., 'billing.tiers', 'features.beta_enabled')\n   * @returns Promise resolving to the setting's value\n   *\n   * @example\n   * ```typescript\n   * const tiers = await client.admin.settings.app.getSetting('billing.tiers')\n   * console.log(tiers) // { free: 1000, pro: 10000, enterprise: 100000 }\n   * ```\n   */\n  async getSetting(key: string): Promise<any> {\n    const setting = await this.fetch.get<CustomSetting>(\n      `/api/v1/admin/settings/custom/${key}`,\n    );\n    return setting.value;\n  }\n\n  /**\n   * Get multiple custom settings' values by keys\n   *\n   * Fetches multiple settings in a single request and returns only their values.\n   *\n   * @param keys - Array of setting keys to fetch\n   * @returns Promise resolving to object mapping keys to values\n   *\n   * @example\n   * ```typescript\n   * const values = await client.admin.settings.app.getSettings([\n   *   'billing.tiers',\n   *   'features.beta_enabled'\n   * ])\n   * console.log(values)\n   * // {\n   * //   'billing.tiers': { free: 1000, pro: 10000 },\n   * //   'features.beta_enabled': { enabled: true }\n   * // }\n   * ```\n   */\n  async getSettings(keys: string[]): Promise<Record<string, any>> {\n    const response = await this.fetch.post<CustomSetting[]>(\n      \"/api/v1/settings/batch\",\n      { keys },\n    );\n    return response.reduce(\n      (acc, setting) => {\n        acc[setting.key] = setting.value;\n        return acc;\n      },\n      {} as Record<string, any>,\n    );\n  }\n\n  /**\n   * Set or create a custom setting\n   *\n   * Creates a new custom setting or updates an existing one.\n   *\n   * @param key - Setting key\n   * @param value - Setting value (any JSON-serializable value)\n   * @param options - Optional configuration (description, is_public, is_secret, etc.)\n   * @returns Promise resolving to CustomSetting\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setSetting('billing.tiers', {\n   *   free: 1000,\n   *   pro: 10000,\n   *   enterprise: 100000\n   * }, {\n   *   description: 'API quotas per billing tier',\n   *   is_public: false\n   * })\n   * ```\n   */\n  async setSetting(\n    key: string,\n    value: any,\n    options?: {\n      description?: string;\n      is_public?: boolean;\n      is_secret?: boolean;\n      value_type?: string;\n    },\n  ): Promise<CustomSetting> {\n    // Backend expects value to be a JSON object (map[string]interface{})\n    // Wrap primitive values in { value: ... } to ensure valid format\n    const wrappedValue =\n      value !== null && typeof value === \"object\" && !Array.isArray(value)\n        ? value\n        : { value };\n\n    // Try to update first, if not found, create\n    try {\n      return await this.fetch.put<CustomSetting>(\n        `/api/v1/admin/settings/custom/${key}`,\n        {\n          value: wrappedValue,\n          value_type: options?.value_type || \"json\",\n          description: options?.description,\n          is_public: options?.is_public,\n          is_secret: options?.is_secret,\n        },\n      );\n    } catch (error: any) {\n      // If not found (404), create new setting\n      if (error.status === 404 || error.message?.includes(\"not found\")) {\n        return await this.fetch.post<CustomSetting>(\n          \"/api/v1/admin/settings/custom\",\n          {\n            key,\n            value: wrappedValue,\n            value_type: options?.value_type || \"json\",\n            description: options?.description,\n            is_public: options?.is_public ?? false,\n            is_secret: options?.is_secret ?? false,\n          },\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * List all custom settings\n   *\n   * @returns Promise resolving to array of CustomSetting objects\n   *\n   * @example\n   * ```typescript\n   * const settings = await client.admin.settings.app.listSettings()\n   * settings.forEach(s => console.log(s.key, s.value))\n   * ```\n   */\n  async listSettings(): Promise<CustomSetting[]> {\n    return await this.fetch.get<CustomSetting[]>(\n      \"/api/v1/admin/settings/custom\",\n    );\n  }\n\n  /**\n   * Delete a custom setting\n   *\n   * @param key - Setting key to delete\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.deleteSetting('billing.tiers')\n   * ```\n   */\n  async deleteSetting(key: string): Promise<void> {\n    await this.fetch.delete(`/api/v1/admin/settings/custom/${key}`);\n  }\n\n  // ============================================================================\n  // System Secret Settings (encrypted, server-side access only)\n  // ============================================================================\n\n  /**\n   * Set a system-level secret setting (encrypted)\n   *\n   * Creates or updates an encrypted system secret. The value is encrypted server-side\n   * and can only be accessed by edge functions, background jobs, or custom handlers.\n   * The SDK never returns the decrypted value.\n   *\n   * @param key - Secret key\n   * @param value - Secret value (will be encrypted server-side)\n   * @param options - Optional description\n   * @returns Promise resolving to SecretSettingMetadata (never includes the value)\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.setSecretSetting('stripe_api_key', 'sk-live-xxx', {\n   *   description: 'Stripe API key for payment processing'\n   * })\n   * ```\n   */\n  async setSecretSetting(\n    key: string,\n    value: string,\n    options?: { description?: string },\n  ): Promise<SecretSettingMetadata> {\n    // Try to update first, if not found, create\n    try {\n      return await this.fetch.put<SecretSettingMetadata>(\n        `/api/v1/admin/settings/custom/secret/${key}`,\n        {\n          value,\n          description: options?.description,\n        },\n      );\n    } catch (error: any) {\n      // If not found (404), create new secret\n      if (error.status === 404 || error.message?.includes(\"not found\")) {\n        return await this.fetch.post<SecretSettingMetadata>(\n          \"/api/v1/admin/settings/custom/secret\",\n          {\n            key,\n            value,\n            description: options?.description,\n          },\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get metadata for a system secret setting (never returns the value)\n   *\n   * @param key - Secret key\n   * @returns Promise resolving to SecretSettingMetadata\n   *\n   * @example\n   * ```typescript\n   * const metadata = await client.admin.settings.app.getSecretSetting('stripe_api_key')\n   * console.log(metadata.key, metadata.updated_at)\n   * // Note: metadata.value is never included\n   * ```\n   */\n  async getSecretSetting(key: string): Promise<SecretSettingMetadata> {\n    return await this.fetch.get<SecretSettingMetadata>(\n      `/api/v1/admin/settings/custom/secret/${key}`,\n    );\n  }\n\n  /**\n   * List all system secret settings (metadata only, never includes values)\n   *\n   * @returns Promise resolving to array of SecretSettingMetadata\n   *\n   * @example\n   * ```typescript\n   * const secrets = await client.admin.settings.app.listSecretSettings()\n   * secrets.forEach(s => console.log(s.key, s.description))\n   * ```\n   */\n  async listSecretSettings(): Promise<SecretSettingMetadata[]> {\n    return await this.fetch.get<SecretSettingMetadata[]>(\n      \"/api/v1/admin/settings/custom/secrets\",\n    );\n  }\n\n  /**\n   * Delete a system secret setting\n   *\n   * @param key - Secret key to delete\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.app.deleteSecretSetting('stripe_api_key')\n   * ```\n   */\n  async deleteSecretSetting(key: string): Promise<void> {\n    await this.fetch.delete(`/api/v1/admin/settings/custom/secret/${key}`);\n  }\n\n  /**\n   * Get the decrypted value of a user's secret setting\n   *\n   * This is a privileged operation that requires service_role.\n   * Use this to retrieve user-specific secrets when running as a service\n   * (e.g., in edge functions or background jobs).\n   *\n   * @param userId - The user ID whose secret to retrieve\n   * @param key - Secret key\n   * @returns Promise resolving to the decrypted secret value\n   *\n   * @example\n   * ```typescript\n   * // In an edge function, get a user's API key for validation\n   * const apiKey = await fluxbaseService.admin.settings.app.getUserSecretValue(\n   *   userId,\n   *   'owntracks_api_key'\n   * )\n   * if (apiKey !== providedKey) {\n   *   throw new Error('Invalid API key')\n   * }\n   * ```\n   */\n  async getUserSecretValue(userId: string, key: string): Promise<string> {\n    const response = await this.fetch.get<{ value: string }>(\n      `/api/v1/admin/settings/user/${encodeURIComponent(userId)}/secret/${encodeURIComponent(key)}/decrypt`,\n    );\n    return response.value;\n  }\n\n  /**\n   * Reset all application settings to their default values\n   *\n   * @returns Promise resolving to the default app settings\n   */\n  async reset(): Promise<AppSettings> {\n    return this.fetch.post<AppSettings>(\"/api/v1/admin/app/settings/reset\", {});\n  }\n}\n\n/**\n * Email Template Manager\n *\n * Manages email templates for authentication and user communication.\n * Supports customizing templates for magic links, email verification, password resets, and user invitations.\n *\n * @example\n * ```typescript\n * const templates = client.admin.emailTemplates\n *\n * // List all templates\n * const { templates: allTemplates } = await templates.list()\n *\n * // Get specific template\n * const magicLink = await templates.get('magic_link')\n *\n * // Update template\n * await templates.update('magic_link', {\n *   subject: 'Sign in to ' + '{{.AppName}}',\n *   html_body: '<html>Custom template with ' + '{{.MagicLink}}' + '</html>',\n *   text_body: 'Click here: ' + '{{.MagicLink}}'\n * })\n *\n * // Test template (sends to specified email)\n * await templates.test('magic_link', 'test@example.com')\n *\n * // Reset to default\n * await templates.reset('magic_link')\n * ```\n */\nexport class EmailTemplateManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * List all email templates\n   *\n   * @returns Promise resolving to ListEmailTemplatesResponse\n   *\n   * @example\n   * ```typescript\n   * const response = await client.admin.emailTemplates.list()\n   * console.log(response.templates)\n   * ```\n   */\n  async list(): Promise<ListEmailTemplatesResponse> {\n    const templates = await this.fetch.get<EmailTemplate[]>(\n      \"/api/v1/admin/email/templates\",\n    );\n    return { templates: Array.isArray(templates) ? templates : [] };\n  }\n\n  /**\n   * Get a specific email template by type\n   *\n   * @param type - Template type (magic_link | verify_email | reset_password | invite_user)\n   * @returns Promise resolving to EmailTemplate\n   *\n   * @example\n   * ```typescript\n   * const template = await client.admin.emailTemplates.get('magic_link')\n   * console.log(template.subject)\n   * console.log(template.html_body)\n   * ```\n   */\n  async get(type: EmailTemplateType): Promise<EmailTemplate> {\n    return await this.fetch.get<EmailTemplate>(\n      `/api/v1/admin/email/templates/${type}`,\n    );\n  }\n\n  /**\n   * Update an email template\n   *\n   * Available template variables:\n   * - magic_link: `{{.MagicLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n   * - verify_email: `{{.VerificationLink}}`, `{{.AppName}}`\n   * - reset_password: `{{.ResetLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n   * - invite_user: `{{.InviteLink}}`, `{{.AppName}}`, `{{.InviterName}}`\n   *\n   * @param type - Template type to update\n   * @param request - Update request with subject, html_body, and optional text_body\n   * @returns Promise resolving to EmailTemplate\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.admin.emailTemplates.update('magic_link', {\n   *   subject: 'Your Magic Link - Sign in to ' + '{{.AppName}}',\n   *   html_body: '<html><body><h1>Welcome!</h1><a href=\"' + '{{.MagicLink}}' + '\">Sign In</a></body></html>',\n   *   text_body: 'Click here to sign in: ' + '{{.MagicLink}}'\n   * })\n   * ```\n   */\n  async update(\n    type: EmailTemplateType,\n    request: UpdateEmailTemplateRequest,\n  ): Promise<EmailTemplate> {\n    return await this.fetch.put<EmailTemplate>(\n      `/api/v1/admin/email/templates/${type}`,\n      request,\n    );\n  }\n\n  /**\n   * Reset an email template to default\n   *\n   * Removes any customizations and restores the template to its original state.\n   *\n   * @param type - Template type to reset\n   * @returns Promise resolving to EmailTemplate - The default template\n   *\n   * @example\n   * ```typescript\n   * const defaultTemplate = await client.admin.emailTemplates.reset('magic_link')\n   * ```\n   */\n  async reset(type: EmailTemplateType): Promise<EmailTemplate> {\n    return await this.fetch.post<EmailTemplate>(\n      `/api/v1/admin/email/templates/${type}/reset`,\n      {},\n    );\n  }\n\n  /**\n   * Send a test email using the template\n   *\n   * Useful for previewing template changes before deploying to production.\n   *\n   * @param type - Template type to test\n   * @param recipientEmail - Email address to send test to\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * await client.admin.emailTemplates.test('magic_link', 'test@example.com')\n   * ```\n   */\n  async test(type: EmailTemplateType, recipientEmail: string): Promise<void> {\n    await this.fetch.post(`/api/v1/admin/email/templates/${type}/test`, {\n      recipient_email: recipientEmail,\n    });\n  }\n}\n\n/**\n * Email Settings Manager\n *\n * Manages email provider configuration including SMTP, SendGrid, Mailgun, and AWS SES.\n * Provides direct access to the email settings API with proper handling of sensitive credentials.\n *\n * @example\n * ```typescript\n * const email = client.admin.settings.email\n *\n * // Get current email settings\n * const settings = await email.get()\n * console.log(settings.provider) // 'smtp'\n * console.log(settings.smtp_password_set) // true (password is configured)\n *\n * // Update email settings\n * await email.update({\n *   provider: 'sendgrid',\n *   sendgrid_api_key: 'SG.xxx',\n *   from_address: 'noreply@yourapp.com'\n * })\n *\n * // Test email configuration\n * const result = await email.test('test@example.com')\n * console.log(result.success) // true\n *\n * // Convenience methods\n * await email.enable()\n * await email.disable()\n * await email.setProvider('smtp')\n * ```\n */\nexport class EmailSettingsManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Get current email provider settings\n   *\n   * Returns the current email configuration. Sensitive values (passwords, client keys)\n   * are not returned - instead, boolean flags indicate whether they are set.\n   *\n   * @returns Promise resolving to EmailProviderSettings\n   *\n   * @example\n   * ```typescript\n   * const settings = await client.admin.settings.email.get()\n   *\n   * console.log('Provider:', settings.provider)\n   * console.log('From:', settings.from_address)\n   * console.log('SMTP password configured:', settings.smtp_password_set)\n   *\n   * // Check for environment variable overrides\n   * if (settings._overrides.provider?.is_overridden) {\n   *   console.log('Provider is set by env var:', settings._overrides.provider.env_var)\n   * }\n   * ```\n   */\n  async get(): Promise<EmailProviderSettings> {\n    return await this.fetch.get<EmailProviderSettings>(\n      \"/api/v1/admin/email/settings\",\n    );\n  }\n\n  /**\n   * Update email provider settings\n   *\n   * Supports partial updates - only provide the fields you want to change.\n   * Secret fields (passwords, client keys) are only updated if provided.\n   *\n   * @param request - Settings to update (partial update supported)\n   * @returns Promise resolving to EmailProviderSettings - Updated settings\n   * @throws Error if a setting is overridden by an environment variable\n   *\n   * @example\n   * ```typescript\n   * // Configure SMTP\n   * await client.admin.settings.email.update({\n   *   enabled: true,\n   *   provider: 'smtp',\n   *   from_address: 'noreply@yourapp.com',\n   *   from_name: 'Your App',\n   *   smtp_host: 'smtp.gmail.com',\n   *   smtp_port: 587,\n   *   smtp_username: 'your-email@gmail.com',\n   *   smtp_password: 'your-app-password',\n   *   smtp_tls: true\n   * })\n   *\n   * // Configure SendGrid\n   * await client.admin.settings.email.update({\n   *   provider: 'sendgrid',\n   *   sendgrid_api_key: 'SG.xxx'\n   * })\n   *\n   * // Update just the from address (password unchanged)\n   * await client.admin.settings.email.update({\n   *   from_address: 'new-address@yourapp.com'\n   * })\n   * ```\n   */\n  async update(\n    request: UpdateEmailProviderSettingsRequest,\n  ): Promise<EmailProviderSettings> {\n    return await this.fetch.put<EmailProviderSettings>(\n      \"/api/v1/admin/email/settings\",\n      request,\n    );\n  }\n\n  /**\n   * Test email configuration by sending a test email\n   *\n   * Sends a test email to verify that the current email configuration is working.\n   *\n   * @param recipientEmail - Email address to send the test email to\n   * @returns Promise resolving to TestEmailSettingsResponse\n   * @throws Error if email sending fails\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   const result = await client.admin.settings.email.test('admin@yourapp.com')\n   *   console.log('Test email sent:', result.message)\n   * } catch (error) {\n   *   console.error('Email configuration error:', error.message)\n   * }\n   * ```\n   */\n  async test(recipientEmail: string): Promise<TestEmailSettingsResponse> {\n    return await this.fetch.post<TestEmailSettingsResponse>(\n      \"/api/v1/admin/email/settings/test\",\n      { recipient_email: recipientEmail },\n    );\n  }\n\n  /**\n   * Enable email functionality\n   *\n   * Convenience method to enable the email system.\n   *\n   * @returns Promise resolving to EmailProviderSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.email.enable()\n   * ```\n   */\n  async enable(): Promise<EmailProviderSettings> {\n    return await this.update({ enabled: true });\n  }\n\n  /**\n   * Disable email functionality\n   *\n   * Convenience method to disable the email system.\n   *\n   * @returns Promise resolving to EmailProviderSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.email.disable()\n   * ```\n   */\n  async disable(): Promise<EmailProviderSettings> {\n    return await this.update({ enabled: false });\n  }\n\n  /**\n   * Set the email provider\n   *\n   * Convenience method to change the email provider.\n   * Note: You'll also need to configure the provider-specific settings.\n   *\n   * @param provider - The email provider to use\n   * @returns Promise resolving to EmailProviderSettings\n   *\n   * @example\n   * ```typescript\n   * await client.admin.settings.email.setProvider('sendgrid')\n   * ```\n   */\n  async setProvider(\n    provider: \"smtp\" | \"sendgrid\" | \"mailgun\" | \"ses\",\n  ): Promise<EmailProviderSettings> {\n    return await this.update({ provider });\n  }\n\n  // Tenant-scoped methods\n\n  /**\n   * Get tenant-level email settings (resolved through cascade)\n   *\n   * Returns email settings resolved for the current tenant context,\n   * including source information for each field.\n   *\n   * @returns Promise resolving to TenantEmailProviderSettings\n   */\n  async getForTenant(): Promise<TenantEmailProviderSettings> {\n    return await this.fetch.get<TenantEmailProviderSettings>(\n      \"/api/v1/admin/email/settings/tenant\",\n    );\n  }\n\n  /**\n   * Update tenant-level email settings\n   *\n   * Only provided fields are updated. These override instance-level defaults.\n   *\n   * @param request - Settings to update\n   * @returns Promise resolving to TenantEmailProviderSettings\n   */\n  async updateForTenant(\n    request: UpdateEmailProviderSettingsRequest,\n  ): Promise<TenantEmailProviderSettings> {\n    return await this.fetch.put<TenantEmailProviderSettings>(\n      \"/api/v1/admin/email/settings/tenant\",\n      request,\n    );\n  }\n\n  /**\n   * Delete a tenant-level email setting override\n   *\n   * Removes the tenant override for a specific field, reverting to the instance default.\n   *\n   * @param field - The field name to remove the override for\n   * @returns Promise resolving to TenantEmailProviderSettings\n   */\n  async deleteTenantOverride(\n    field: string,\n  ): Promise<TenantEmailProviderSettings> {\n    return await this.fetch.delete<TenantEmailProviderSettings>(\n      `/api/v1/admin/email/settings/tenant/${field}`,\n    );\n  }\n\n  /**\n   * Test tenant-level email configuration\n   *\n   * @param recipientEmail - Email address to send the test email to\n   * @returns Promise resolving to TestEmailSettingsResponse\n   */\n  async testForTenant(\n    recipientEmail: string,\n  ): Promise<TestEmailSettingsResponse> {\n    return await this.fetch.post<TestEmailSettingsResponse>(\n      \"/api/v1/admin/email/settings/tenant/test\",\n      { recipient_email: recipientEmail },\n    );\n  }\n}\n\n/**\n * Settings Manager\n *\n * Provides access to system-level, application-level, and email settings.\n * AppSettingsManager handles both structured framework settings and custom key-value settings.\n * EmailSettingsManager provides direct access to email provider configuration.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings\n *\n * // Access system settings\n * const systemSettings = await settings.system.list()\n *\n * // Access app settings (structured)\n * const appSettings = await settings.app.get()\n * await settings.app.enableSignup()\n *\n * // Access custom settings (key-value)\n * await settings.app.setSetting('billing.tiers', { free: 1000, pro: 10000 })\n * const tiers = await settings.app.getSetting('billing.tiers')\n *\n * // Access email settings\n * const emailSettings = await settings.email.get()\n * await settings.email.update({ provider: 'sendgrid', sendgrid_api_key: 'SG.xxx' })\n * await settings.email.test('admin@yourapp.com')\n * ```\n */\nexport class FluxbaseSettings {\n  public system: SystemSettingsManager;\n  public app: AppSettingsManager;\n  public email: EmailSettingsManager;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.system = new SystemSettingsManager(fetch);\n    this.app = new AppSettingsManager(fetch);\n    this.email = new EmailSettingsManager(fetch);\n  }\n}\n\n/**\n * Public Settings Client\n *\n * Provides read-only access to public settings for non-admin users.\n * Access is controlled by RLS policies on the app.settings table.\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(url, userToken)\n *\n * // Get single public setting\n * const betaEnabled = await client.settings.get('features.beta_enabled')\n * console.log(betaEnabled) // { enabled: true }\n *\n * // Get multiple public settings\n * const values = await client.settings.getMany([\n *   'features.beta_enabled',\n *   'features.dark_mode',\n *   'public.app_version'\n * ])\n * console.log(values)\n * // {\n * //   'features.beta_enabled': { enabled: true },\n * //   'features.dark_mode': { enabled: false },\n * //   'public.app_version': '1.0.0'\n * // }\n * ```\n */\nexport class SettingsClient {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Get a single setting's value\n   *\n   * Returns only the value field of the setting.\n   * Access is controlled by RLS policies - will return 403 if the user\n   * doesn't have permission to read the setting.\n   *\n   * @param key - Setting key (e.g., 'features.beta_enabled')\n   * @returns Promise resolving to the setting's value\n   * @throws Error if setting doesn't exist or user lacks permission\n   *\n   * @example\n   * ```typescript\n   * // Get public setting (any user)\n   * const value = await client.settings.get('features.beta_enabled')\n   * console.log(value) // { enabled: true }\n   *\n   * // Get restricted setting (requires permission)\n   * try {\n   *   const secret = await client.settings.get('internal.api_key')\n   * } catch (error) {\n   *   console.error('Access denied:', error)\n   * }\n   * ```\n   */\n  async get(key: string): Promise<any> {\n    const response = await this.fetch.get<{ value: any }>(\n      `/api/v1/settings/${encodeURIComponent(key)}`,\n    );\n    return response.value;\n  }\n\n  /**\n   * Get multiple settings' values by keys\n   *\n   * Fetches multiple settings in a single request.\n   * Only returns settings the user has permission to read based on RLS policies.\n   * Settings the user can't access will be omitted from the result (no error thrown).\n   *\n   * @param keys - Array of setting keys to fetch\n   * @returns Promise resolving to object mapping keys to values\n   *\n   * @example\n   * ```typescript\n   * const values = await client.settings.getMany([\n   *   'features.beta_enabled',  // public - will be returned\n   *   'features.dark_mode',      // public - will be returned\n   *   'internal.api_key'         // secret - will be omitted\n   * ])\n   * console.log(values)\n   * // {\n   * //   'features.beta_enabled': { enabled: true },\n   * //   'features.dark_mode': { enabled: false }\n   * //   // 'internal.api_key' is omitted (no error)\n   * // }\n   * ```\n   */\n  async getMany(keys: string[]): Promise<Record<string, any>> {\n    const response = await this.fetch.post<Array<{ key: string; value: any }>>(\n      \"/api/v1/settings/batch\",\n      { keys },\n    );\n    return response.reduce(\n      (acc, setting) => {\n        acc[setting.key] = setting.value;\n        return acc;\n      },\n      {} as Record<string, any>,\n    );\n  }\n\n  // ============================================================================\n  // User Secret Settings (encrypted, user-specific, server-side access only)\n  // ============================================================================\n\n  /**\n   * Set a user secret setting (encrypted)\n   *\n   * Creates or updates an encrypted secret that belongs to the current user.\n   * The value is encrypted server-side with a user-specific key and can only be\n   * accessed by edge functions, background jobs, or custom handlers running on\n   * behalf of this user. Even admins cannot see the decrypted value.\n   *\n   * @param key - Secret key\n   * @param value - Secret value (will be encrypted server-side)\n   * @param options - Optional description\n   * @returns Promise resolving to SecretSettingMetadata (never includes the value)\n   *\n   * @example\n   * ```typescript\n   * // Store user's API key for a third-party service\n   * await client.settings.setSecret('openai_api_key', 'sk-abc123', {\n   *   description: 'My OpenAI API key'\n   * })\n   * ```\n   */\n  async setSecret(\n    key: string,\n    value: string,\n    options?: { description?: string },\n  ): Promise<SecretSettingMetadata> {\n    // Try to update first, if not found, create\n    try {\n      return await this.fetch.put<SecretSettingMetadata>(\n        `/api/v1/settings/secret/${encodeURIComponent(key)}`,\n        {\n          value,\n          description: options?.description,\n        },\n      );\n    } catch (error: any) {\n      // If not found (404), create new secret\n      if (error.status === 404 || error.message?.includes(\"not found\")) {\n        return await this.fetch.post<SecretSettingMetadata>(\n          \"/api/v1/settings/secret/\",\n          {\n            key,\n            value,\n            description: options?.description,\n          },\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get metadata for a user secret setting (never returns the value)\n   *\n   * @param key - Secret key\n   * @returns Promise resolving to SecretSettingMetadata\n   *\n   * @example\n   * ```typescript\n   * const metadata = await client.settings.getSecret('openai_api_key')\n   * console.log(metadata.key, metadata.updated_at)\n   * // Note: The actual secret value is never returned\n   * ```\n   */\n  async getSecret(key: string): Promise<SecretSettingMetadata> {\n    return await this.fetch.get<SecretSettingMetadata>(\n      `/api/v1/settings/secret/${encodeURIComponent(key)}`,\n    );\n  }\n\n  /**\n   * List all user's secret settings (metadata only, never includes values)\n   *\n   * @returns Promise resolving to array of SecretSettingMetadata\n   *\n   * @example\n   * ```typescript\n   * const secrets = await client.settings.listSecrets()\n   * secrets.forEach(s => console.log(s.key, s.description))\n   * ```\n   */\n  async listSecrets(): Promise<SecretSettingMetadata[]> {\n    return await this.fetch.get<SecretSettingMetadata[]>(\n      \"/api/v1/settings/secret/\",\n    );\n  }\n\n  /**\n   * Delete a user secret setting\n   *\n   * @param key - Secret key to delete\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * await client.settings.deleteSecret('openai_api_key')\n   * ```\n   */\n  async deleteSecret(key: string): Promise<void> {\n    await this.fetch.delete(\n      `/api/v1/settings/secret/${encodeURIComponent(key)}`,\n    );\n  }\n\n  // ============================================================================\n  // User Settings (non-encrypted, with system fallback support)\n  // These methods mirror the edge function secrets helper pattern for regular settings\n  // ============================================================================\n\n  /**\n   * Get a setting with user -> system fallback\n   *\n   * First checks for a user-specific setting, then falls back to system default.\n   * Returns both the value and the source (\"user\" or \"system\").\n   *\n   * @param key - Setting key (e.g., 'theme', 'notifications.email')\n   * @returns Promise resolving to UserSettingWithSource with value and source\n   * @throws Error if setting doesn't exist in either user or system\n   *\n   * @example\n   * ```typescript\n   * // Get theme with fallback to system default\n   * const { value, source } = await client.settings.getSetting('theme')\n   * console.log(value)   // { mode: 'dark' }\n   * console.log(source)  // 'system' (from system default)\n   *\n   * // After user sets their own theme\n   * const { value, source } = await client.settings.getSetting('theme')\n   * console.log(source)  // 'user' (user's own setting)\n   * ```\n   */\n  async getSetting(key: string): Promise<UserSettingWithSource> {\n    return await this.fetch.get<UserSettingWithSource>(\n      `/api/v1/settings/user/${encodeURIComponent(key)}`,\n    );\n  }\n\n  /**\n   * Get only the user's own setting (no fallback to system)\n   *\n   * Returns the user's own setting for this key, or throws if not found.\n   * Use this when you specifically want to check if the user has set a value.\n   *\n   * @param key - Setting key\n   * @returns Promise resolving to UserSetting\n   * @throws Error if user has no setting with this key\n   *\n   * @example\n   * ```typescript\n   * // Check if user has set their own theme\n   * try {\n   *   const setting = await client.settings.getUserSetting('theme')\n   *   console.log('User theme:', setting.value)\n   * } catch (e) {\n   *   console.log('User has not set a theme')\n   * }\n   * ```\n   */\n  async getUserSetting(key: string): Promise<UserSetting> {\n    return await this.fetch.get<UserSetting>(\n      `/api/v1/settings/user/own/${encodeURIComponent(key)}`,\n    );\n  }\n\n  /**\n   * Get a system-level setting (no user override)\n   *\n   * Returns the system default for this key, ignoring any user-specific value.\n   * Useful for reading default configurations.\n   *\n   * @param key - Setting key\n   * @returns Promise resolving to the setting value\n   * @throws Error if system setting doesn't exist\n   *\n   * @example\n   * ```typescript\n   * // Get system default theme\n   * const { value } = await client.settings.getSystemSetting('theme')\n   * console.log('System default theme:', value)\n   * ```\n   */\n  async getSystemSetting(\n    key: string,\n  ): Promise<{ key: string; value: Record<string, unknown> }> {\n    return await this.fetch.get<{\n      key: string;\n      value: Record<string, unknown>;\n    }>(`/api/v1/settings/user/system/${encodeURIComponent(key)}`);\n  }\n\n  /**\n   * Set a user setting (create or update)\n   *\n   * Creates or updates a non-encrypted user setting.\n   * This value will override any system default when using getSetting().\n   *\n   * @param key - Setting key\n   * @param value - Setting value (any JSON-serializable object)\n   * @param options - Optional description\n   * @returns Promise resolving to UserSetting\n   *\n   * @example\n   * ```typescript\n   * // Set user's theme preference\n   * await client.settings.setSetting('theme', { mode: 'dark', accent: 'blue' })\n   *\n   * // Set with description\n   * await client.settings.setSetting('notifications', { email: true, push: false }, {\n   *   description: 'User notification preferences'\n   * })\n   * ```\n   */\n  async setSetting(\n    key: string,\n    value: Record<string, unknown>,\n    options?: { description?: string },\n  ): Promise<UserSetting> {\n    return await this.fetch.put<UserSetting>(\n      `/api/v1/settings/user/${encodeURIComponent(key)}`,\n      {\n        value,\n        description: options?.description,\n      },\n    );\n  }\n\n  /**\n   * List all user's own settings\n   *\n   * Returns all non-encrypted settings the current user has set.\n   * Does not include system defaults.\n   *\n   * @returns Promise resolving to array of UserSetting\n   *\n   * @example\n   * ```typescript\n   * const settings = await client.settings.listSettings()\n   * settings.forEach(s => console.log(s.key, s.value))\n   * ```\n   */\n  async listSettings(): Promise<UserSetting[]> {\n    return await this.fetch.get<UserSetting[]>(\"/api/v1/settings/user/list\");\n  }\n\n  /**\n   * Delete a user setting\n   *\n   * Removes the user's own setting, reverting to system default (if any).\n   *\n   * @param key - Setting key to delete\n   * @returns Promise<void>\n   *\n   * @example\n   * ```typescript\n   * // Remove user's theme preference, revert to system default\n   * await client.settings.deleteSetting('theme')\n   * ```\n   */\n  async deleteSetting(key: string): Promise<void> {\n    await this.fetch.delete(`/api/v1/settings/user/${encodeURIComponent(key)}`);\n  }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n  CreateSchemaRequest,\n  CreateSchemaResponse,\n  CreateTableRequest,\n  CreateTableResponse,\n  DeleteTableResponse,\n  ListSchemasResponse,\n  ListTablesResponse,\n  CreateColumnRequest,\n} from './types'\n\n/**\n * DDL (Data Definition Language) Manager\n *\n * Provides methods for managing database schemas and tables programmatically.\n * This includes creating schemas, creating tables with custom columns, listing\n * schemas and tables, and deleting tables.\n *\n * @example\n * ```typescript\n * const ddl = client.admin.ddl\n *\n * // Create a new schema\n * await ddl.createSchema('analytics')\n *\n * // Create a table with columns\n * await ddl.createTable('analytics', 'events', [\n *   { name: 'id', type: 'UUID', primaryKey: true, defaultValue: 'gen_random_uuid()' },\n *   { name: 'user_id', type: 'UUID', nullable: false },\n *   { name: 'event_name', type: 'TEXT', nullable: false },\n *   { name: 'event_data', type: 'JSONB' },\n *   { name: 'created_at', type: 'TIMESTAMPTZ', defaultValue: 'NOW()' }\n * ])\n *\n * // List all schemas\n * const { schemas } = await ddl.listSchemas()\n *\n * // List all tables in a schema\n * const { tables } = await ddl.listTables('analytics')\n *\n * // Delete a table\n * await ddl.deleteTable('analytics', 'events')\n * ```\n */\nexport class DDLManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Create a new database schema\n   *\n   * Creates a new schema in the database. Schemas are used to organize tables\n   * into logical groups and provide namespace isolation.\n   *\n   * @param name - Schema name (must be valid PostgreSQL identifier)\n   * @returns Promise resolving to CreateSchemaResponse\n   *\n   * @example\n   * ```typescript\n   * // Create a schema for analytics data\n   * const result = await client.admin.ddl.createSchema('analytics')\n   * console.log(result.message) // \"Schema created successfully\"\n   * console.log(result.schema)  // \"analytics\"\n   * ```\n   */\n  async createSchema(name: string): Promise<CreateSchemaResponse> {\n    const request: CreateSchemaRequest = { name }\n    return await this.fetch.post<CreateSchemaResponse>('/api/v1/admin/ddl/schemas', request)\n  }\n\n  /**\n   * List all database schemas\n   *\n   * Retrieves a list of all schemas in the database. This includes both\n   * system schemas (like 'public', 'pg_catalog') and user-created schemas.\n   *\n   * @returns Promise resolving to ListSchemasResponse\n   *\n   * @example\n   * ```typescript\n   * const { schemas } = await client.admin.ddl.listSchemas()\n   *\n   * schemas.forEach(schema => {\n   *   console.log(`Schema: ${schema.name}, Owner: ${schema.owner}`)\n   * })\n   * ```\n   */\n  async listSchemas(): Promise<ListSchemasResponse> {\n    return await this.fetch.get<ListSchemasResponse>('/api/v1/admin/ddl/schemas')\n  }\n\n  /**\n   * Create a new table in a schema\n   *\n   * Creates a new table with the specified columns. Supports various column\n   * options including primary keys, nullability, data types, and default values.\n   *\n   * @param schema - Schema name where the table will be created\n   * @param name - Table name (must be valid PostgreSQL identifier)\n   * @param columns - Array of column definitions\n   * @returns Promise resolving to CreateTableResponse\n   *\n   * @example\n   * ```typescript\n   * // Create a users table\n   * await client.admin.ddl.createTable('public', 'users', [\n   *   {\n   *     name: 'id',\n   *     type: 'UUID',\n   *     primaryKey: true,\n   *     defaultValue: 'gen_random_uuid()'\n   *   },\n   *   {\n   *     name: 'email',\n   *     type: 'TEXT',\n   *     nullable: false\n   *   },\n   *   {\n   *     name: 'name',\n   *     type: 'TEXT'\n   *   },\n   *   {\n   *     name: 'created_at',\n   *     type: 'TIMESTAMPTZ',\n   *     nullable: false,\n   *     defaultValue: 'NOW()'\n   *   }\n   * ])\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Create a products table with JSONB metadata\n   * await client.admin.ddl.createTable('public', 'products', [\n   *   { name: 'id', type: 'SERIAL', primaryKey: true },\n   *   { name: 'name', type: 'TEXT', nullable: false },\n   *   { name: 'price', type: 'DECIMAL(10,2)', nullable: false },\n   *   { name: 'metadata', type: 'JSONB' },\n   *   { name: 'in_stock', type: 'BOOLEAN', defaultValue: 'true' }\n   * ])\n   * ```\n   */\n  async createTable(schema: string, name: string, columns: CreateColumnRequest[]): Promise<CreateTableResponse> {\n    const request: CreateTableRequest = { schema, name, columns }\n    return await this.fetch.post<CreateTableResponse>('/api/v1/admin/ddl/tables', request)\n  }\n\n  /**\n   * List all tables in the database or a specific schema\n   *\n   * Retrieves a list of all tables. If a schema is specified, only tables\n   * from that schema are returned. Otherwise, all tables from all schemas\n   * are returned.\n   *\n   * @param schema - Optional schema name to filter tables\n   * @returns Promise resolving to ListTablesResponse\n   *\n   * @example\n   * ```typescript\n   * // List all tables in the public schema\n   * const { tables } = await client.admin.ddl.listTables('public')\n   *\n   * tables.forEach(table => {\n   *   console.log(`Table: ${table.schema}.${table.name}`)\n   *   table.columns?.forEach(col => {\n   *     console.log(`  - ${col.name}: ${col.type}`)\n   *   })\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // List all tables across all schemas\n   * const { tables } = await client.admin.ddl.listTables()\n   *\n   * const tablesBySchema = tables.reduce((acc, table) => {\n   *   if (!acc[table.schema]) acc[table.schema] = []\n   *   acc[table.schema].push(table.name)\n   *   return acc\n   * }, {} as Record<string, string[]>)\n   *\n   * console.log(tablesBySchema)\n   * ```\n   */\n  async listTables(schema?: string): Promise<ListTablesResponse> {\n    const params = schema ? `?schema=${encodeURIComponent(schema)}` : ''\n    return await this.fetch.get<ListTablesResponse>(`/api/v1/admin/ddl/tables${params}`)\n  }\n\n  /**\n   * Delete a table from a schema\n   *\n   * Permanently deletes a table and all its data. This operation cannot be undone.\n   *\n   * @param schema - Schema name containing the table\n   * @param name - Table name to delete\n   * @returns Promise resolving to DeleteTableResponse\n   *\n   * @example\n   * ```typescript\n   * // Delete a table\n   * const result = await client.admin.ddl.deleteTable('public', 'old_data')\n   * console.log(result.message) // \"Table deleted successfully\"\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Safe deletion with confirmation\n   * const confirm = await askUser('Are you sure you want to delete this table?')\n   * if (confirm) {\n   *   await client.admin.ddl.deleteTable('analytics', 'events')\n   *   console.log('Table deleted')\n   * }\n   * ```\n   */\n  async deleteTable(schema: string, name: string): Promise<DeleteTableResponse> {\n    return await this.fetch.delete<DeleteTableResponse>(\n      `/api/v1/admin/ddl/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}`\n    )\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  OAuthProvider,\n  CreateOAuthProviderRequest,\n  CreateOAuthProviderResponse,\n  UpdateOAuthProviderRequest,\n  UpdateOAuthProviderResponse,\n  DeleteOAuthProviderResponse,\n  AuthSettings,\n  UpdateAuthSettingsRequest,\n  UpdateAuthSettingsResponse,\n} from \"./types\";\n\n/**\n * OAuth Provider Manager\n *\n * Manages OAuth provider configurations for third-party authentication.\n * Supports both built-in providers (Google, GitHub, etc.) and custom OAuth2 providers.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // List all OAuth providers\n * const { providers } = await oauth.listProviders()\n *\n * // Create a new provider\n * await oauth.createProvider({\n *   provider_name: 'github',\n *   display_name: 'GitHub',\n *   enabled: true,\n *   client_id: 'your-client-id',\n *   client_secret: 'your-client-secret',\n *   redirect_url: 'https://yourapp.com/auth/callback',\n *   scopes: ['user:email', 'read:user'],\n *   is_custom: false\n * })\n *\n * // Update a provider\n * await oauth.updateProvider('provider-id', {\n *   enabled: false\n * })\n *\n * // Delete a provider\n * await oauth.deleteProvider('provider-id')\n * ```\n */\nexport class OAuthProviderManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * List all OAuth providers\n   *\n   * Retrieves all configured OAuth providers including both enabled and disabled providers.\n   * Note: Client secrets are not included in the response for security reasons.\n   *\n   * @returns Promise resolving to ListOAuthProvidersResponse\n   *\n   * @example\n   * ```typescript\n   * const { providers } = await client.admin.oauth.listProviders()\n   *\n   * providers.forEach(provider => {\n   *   console.log(`${provider.display_name}: ${provider.enabled ? 'enabled' : 'disabled'}`)\n   * })\n   * ```\n   */\n  async listProviders(): Promise<OAuthProvider[]> {\n    const providers = await this.fetch.get<OAuthProvider[]>(\n      \"/api/v1/admin/oauth/providers\",\n    );\n    return Array.isArray(providers) ? providers : [];\n  }\n\n  /**\n   * Get a specific OAuth provider by ID\n   *\n   * Retrieves detailed configuration for a single OAuth provider.\n   * Note: Client secret is not included in the response.\n   *\n   * @param providerId - Provider ID (UUID)\n   * @returns Promise resolving to OAuthProvider\n   *\n   * @example\n   * ```typescript\n   * const provider = await client.admin.oauth.getProvider('provider-uuid')\n   *\n   * console.log('Provider:', provider.display_name)\n   * console.log('Scopes:', provider.scopes.join(', '))\n   * console.log('Redirect URL:', provider.redirect_url)\n   * ```\n   */\n  async getProvider(providerId: string): Promise<OAuthProvider> {\n    return await this.fetch.get<OAuthProvider>(\n      `/api/v1/admin/oauth/providers/${providerId}`,\n    );\n  }\n\n  /**\n   * Create a new OAuth provider\n   *\n   * Creates a new OAuth provider configuration. For built-in providers (Google, GitHub, etc.),\n   * set `is_custom` to false. For custom OAuth2 providers, set `is_custom` to true and provide\n   * the authorization, token, and user info URLs.\n   *\n   * @param request - OAuth provider configuration\n   * @returns Promise resolving to CreateOAuthProviderResponse\n   *\n   * @example\n   * ```typescript\n   * // Create GitHub provider\n   * const result = await client.admin.oauth.createProvider({\n   *   provider_name: 'github',\n   *   display_name: 'GitHub',\n   *   enabled: true,\n   *   client_id: process.env.GITHUB_CLIENT_ID,\n   *   client_secret: process.env.GITHUB_CLIENT_SECRET,\n   *   redirect_url: 'https://yourapp.com/auth/callback',\n   *   scopes: ['user:email', 'read:user'],\n   *   is_custom: false\n   * })\n   *\n   * console.log('Provider created:', result.id)\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Create custom OAuth2 provider\n   * await client.admin.oauth.createProvider({\n   *   provider_name: 'custom_sso',\n   *   display_name: 'Custom SSO',\n   *   enabled: true,\n   *   client_id: 'client-id',\n   *   client_secret: 'client-secret',\n   *   redirect_url: 'https://yourapp.com/auth/callback',\n   *   scopes: ['openid', 'profile', 'email', 'offline_access'],\n   *   is_custom: true,\n   *   authorization_url: 'https://sso.example.com/oauth/authorize',\n   *   token_url: 'https://sso.example.com/oauth/token',\n   *   user_info_url: 'https://sso.example.com/oauth/userinfo'\n   * })\n   * ```\n   */\n  async createProvider(\n    request: CreateOAuthProviderRequest,\n  ): Promise<CreateOAuthProviderResponse> {\n    return await this.fetch.post<CreateOAuthProviderResponse>(\n      \"/api/v1/admin/oauth/providers\",\n      request,\n    );\n  }\n\n  /**\n   * Update an existing OAuth provider\n   *\n   * Updates an OAuth provider configuration. All fields are optional - only provided fields\n   * will be updated. To update the client secret, provide a non-empty value.\n   *\n   * @param providerId - Provider ID (UUID)\n   * @param request - Fields to update\n   * @returns Promise resolving to UpdateOAuthProviderResponse\n   *\n   * @example\n   * ```typescript\n   * // Disable a provider\n   * await client.admin.oauth.updateProvider('provider-id', {\n   *   enabled: false\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Update scopes and redirect URL\n   * await client.admin.oauth.updateProvider('provider-id', {\n   *   scopes: ['user:email', 'read:user', 'read:org'],\n   *   redirect_url: 'https://newdomain.com/auth/callback'\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Rotate client secret\n   * await client.admin.oauth.updateProvider('provider-id', {\n   *   client_id: 'new-client-id',\n   *   client_secret: 'new-client-secret'\n   * })\n   * ```\n   */\n  async updateProvider(\n    providerId: string,\n    request: UpdateOAuthProviderRequest,\n  ): Promise<UpdateOAuthProviderResponse> {\n    return await this.fetch.put<UpdateOAuthProviderResponse>(\n      `/api/v1/admin/oauth/providers/${providerId}`,\n      request,\n    );\n  }\n\n  /**\n   * Delete an OAuth provider\n   *\n   * Permanently deletes an OAuth provider configuration. This will prevent users from\n   * authenticating with this provider.\n   *\n   * @param providerId - Provider ID (UUID) to delete\n   * @returns Promise resolving to DeleteOAuthProviderResponse\n   *\n   * @example\n   * ```typescript\n   * await client.admin.oauth.deleteProvider('provider-id')\n   * console.log('Provider deleted')\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Safe deletion with confirmation\n   * const provider = await client.admin.oauth.getProvider('provider-id')\n   * const confirmed = await confirm(`Delete ${provider.display_name}?`)\n   *\n   * if (confirmed) {\n   *   await client.admin.oauth.deleteProvider('provider-id')\n   * }\n   * ```\n   */\n  async deleteProvider(\n    providerId: string,\n  ): Promise<DeleteOAuthProviderResponse> {\n    return await this.fetch.delete<DeleteOAuthProviderResponse>(\n      `/api/v1/admin/oauth/providers/${providerId}`,\n    );\n  }\n\n  /**\n   * Enable an OAuth provider\n   *\n   * Convenience method to enable a provider.\n   *\n   * @param providerId - Provider ID (UUID)\n   * @returns Promise resolving to UpdateOAuthProviderResponse\n   *\n   * @example\n   * ```typescript\n   * await client.admin.oauth.enableProvider('provider-id')\n   * ```\n   */\n  async enableProvider(\n    providerId: string,\n  ): Promise<UpdateOAuthProviderResponse> {\n    return await this.updateProvider(providerId, { enabled: true });\n  }\n\n  /**\n   * Disable an OAuth provider\n   *\n   * Convenience method to disable a provider.\n   *\n   * @param providerId - Provider ID (UUID)\n   * @returns Promise resolving to UpdateOAuthProviderResponse\n   *\n   * @example\n   * ```typescript\n   * await client.admin.oauth.disableProvider('provider-id')\n   * ```\n   */\n  async disableProvider(\n    providerId: string,\n  ): Promise<UpdateOAuthProviderResponse> {\n    return await this.updateProvider(providerId, { enabled: false });\n  }\n}\n\n/**\n * Authentication Settings Manager\n *\n * Manages global authentication settings including password requirements, session timeouts,\n * and signup configuration.\n *\n * @example\n * ```typescript\n * const authSettings = client.admin.authSettings\n *\n * // Get current settings\n * const settings = await authSettings.get()\n *\n * // Update settings\n * await authSettings.update({\n *   password_min_length: 12,\n *   password_require_uppercase: true,\n *   session_timeout_minutes: 120\n * })\n * ```\n */\nexport class AuthSettingsManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Get current authentication settings\n   *\n   * Retrieves all authentication configuration settings.\n   *\n   * @returns Promise resolving to AuthSettings\n   *\n   * @example\n   * ```typescript\n   * const settings = await client.admin.authSettings.get()\n   *\n   * console.log('Password min length:', settings.password_min_length)\n   * console.log('Signup enabled:', settings.enable_signup)\n   * console.log('Session timeout:', settings.session_timeout_minutes, 'minutes')\n   * ```\n   */\n  async get(): Promise<AuthSettings> {\n    return await this.fetch.get<AuthSettings>(\"/api/v1/admin/auth/settings\");\n  }\n\n  /**\n   * Update authentication settings\n   *\n   * Updates one or more authentication settings. All fields are optional - only provided\n   * fields will be updated.\n   *\n   * @param request - Settings to update\n   * @returns Promise resolving to UpdateAuthSettingsResponse\n   *\n   * @example\n   * ```typescript\n   * // Strengthen password requirements\n   * await client.admin.authSettings.update({\n   *   password_min_length: 16,\n   *   password_require_uppercase: true,\n   *   password_require_lowercase: true,\n   *   password_require_number: true,\n   *   password_require_special: true\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Extend session timeout\n   * await client.admin.authSettings.update({\n   *   session_timeout_minutes: 240,\n   *   max_sessions_per_user: 10\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Disable email verification during development\n   * await client.admin.authSettings.update({\n   *   require_email_verification: false\n   * })\n   * ```\n   */\n  async update(\n    request: UpdateAuthSettingsRequest,\n  ): Promise<UpdateAuthSettingsResponse> {\n    return await this.fetch.put<UpdateAuthSettingsResponse>(\n      \"/api/v1/admin/auth/settings\",\n      request,\n    );\n  }\n}\n\n/**\n * OAuth Configuration Manager\n *\n * Root manager providing access to OAuth provider and authentication settings management.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // Manage OAuth providers\n * const providers = await oauth.providers.listProviders()\n *\n * // Manage auth settings\n * const settings = await oauth.authSettings.get()\n * ```\n */\nexport class FluxbaseOAuth {\n  public providers: OAuthProviderManager;\n  public authSettings: AuthSettingsManager;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.providers = new OAuthProviderManager(fetch);\n    this.authSettings = new AuthSettingsManager(fetch);\n  }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n  ImpersonateUserRequest,\n  ImpersonateAnonRequest,\n  ImpersonateServiceRequest,\n  StartImpersonationResponse,\n  StopImpersonationResponse,\n  GetImpersonationResponse,\n  ListImpersonationSessionsOptions,\n  ListImpersonationSessionsResponse,\n} from './types'\n\n/**\n * Impersonation Manager\n *\n * Manages user impersonation for debugging, testing RLS policies, and customer support.\n * Allows admins to view data as different users, anonymous visitors, or with service role permissions.\n *\n * All impersonation sessions are logged in the audit trail for security and compliance.\n *\n * @example\n * ```typescript\n * const impersonation = client.admin.impersonation\n *\n * // Impersonate a specific user\n * const { session, access_token } = await impersonation.impersonateUser({\n *   target_user_id: 'user-uuid',\n *   reason: 'Support ticket #1234'\n * })\n *\n * // Impersonate anonymous user\n * await impersonation.impersonateAnon({\n *   reason: 'Testing public data access'\n * })\n *\n * // Impersonate with service role\n * await impersonation.impersonateService({\n *   reason: 'Administrative query'\n * })\n *\n * // Stop impersonation\n * await impersonation.stop()\n * ```\n */\nexport class ImpersonationManager {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Impersonate a specific user\n   *\n   * Start an impersonation session as a specific user. This allows you to see data\n   * exactly as that user would see it, respecting all RLS policies and permissions.\n   *\n   * @param request - Impersonation request with target user ID and reason\n   * @returns Promise resolving to impersonation session with access token\n   *\n   * @example\n   * ```typescript\n   * const result = await client.admin.impersonation.impersonateUser({\n   *   target_user_id: 'user-123',\n   *   reason: 'Support ticket #5678 - user reports missing data'\n   * })\n   *\n   * console.log('Impersonating:', result.target_user.email)\n   * console.log('Session ID:', result.session.id)\n   *\n   * // Use the access token for subsequent requests\n   * // (typically handled automatically by the SDK)\n   * ```\n   */\n  async impersonateUser(request: ImpersonateUserRequest): Promise<StartImpersonationResponse> {\n    return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate', request)\n  }\n\n  /**\n   * Impersonate anonymous user\n   *\n   * Start an impersonation session as an unauthenticated user. This allows you to see\n   * what data is publicly accessible and test RLS policies for anonymous access.\n   *\n   * @param request - Impersonation request with reason\n   * @returns Promise resolving to impersonation session with access token\n   *\n   * @example\n   * ```typescript\n   * await client.admin.impersonation.impersonateAnon({\n   *   reason: 'Testing public data access for blog posts'\n   * })\n   *\n   * // Now all queries will use anonymous permissions\n   * const publicPosts = await client.from('posts').select('*')\n   * console.log('Public posts:', publicPosts.length)\n   * ```\n   */\n  async impersonateAnon(request: ImpersonateAnonRequest): Promise<StartImpersonationResponse> {\n    return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/anon', request)\n  }\n\n  /**\n   * Impersonate with service role\n   *\n   * Start an impersonation session with service-level permissions. This provides elevated\n   * access that may bypass RLS policies, useful for administrative operations.\n   *\n   * @param request - Impersonation request with reason\n   * @returns Promise resolving to impersonation session with access token\n   *\n   * @example\n   * ```typescript\n   * await client.admin.impersonation.impersonateService({\n   *   reason: 'Administrative data cleanup'\n   * })\n   *\n   * // Now all queries will use service role permissions\n   * const allRecords = await client.from('sensitive_data').select('*')\n   * console.log('All records:', allRecords.length)\n   * ```\n   */\n  async impersonateService(request: ImpersonateServiceRequest): Promise<StartImpersonationResponse> {\n    return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/service', request)\n  }\n\n  /**\n   * Stop impersonation\n   *\n   * Ends the current impersonation session and returns to admin context.\n   * The session is marked as ended in the audit trail.\n   *\n   * @returns Promise resolving to stop confirmation\n   *\n   * @example\n   * ```typescript\n   * await client.admin.impersonation.stop()\n   * console.log('Impersonation ended')\n   *\n   * // Subsequent queries will use admin permissions\n   * ```\n   */\n  async stop(): Promise<StopImpersonationResponse> {\n    return await this.fetch.delete<StopImpersonationResponse>('/api/v1/auth/impersonate')\n  }\n\n  /**\n   * Get current impersonation session\n   *\n   * Retrieves information about the active impersonation session, if any.\n   *\n   * @returns Promise resolving to current impersonation session or null\n   *\n   * @example\n   * ```typescript\n   * const current = await client.admin.impersonation.getCurrent()\n   *\n   * if (current.session) {\n   *   console.log('Currently impersonating:', current.target_user?.email)\n   *   console.log('Reason:', current.session.reason)\n   *   console.log('Started:', current.session.started_at)\n   * } else {\n   *   console.log('No active impersonation')\n   * }\n   * ```\n   */\n  async getCurrent(): Promise<GetImpersonationResponse> {\n    return await this.fetch.get<GetImpersonationResponse>('/api/v1/auth/impersonate')\n  }\n\n  /**\n   * List impersonation sessions (audit trail)\n   *\n   * Retrieves a list of impersonation sessions for audit and compliance purposes.\n   * Can be filtered by admin user, target user, type, and active status.\n   *\n   * @param options - Filter and pagination options\n   * @returns Promise resolving to list of impersonation sessions\n   *\n   * @example\n   * ```typescript\n   * // List all sessions\n   * const { sessions, total } = await client.admin.impersonation.listSessions()\n   * console.log(`Total sessions: ${total}`)\n   *\n   * // List active sessions only\n   * const active = await client.admin.impersonation.listSessions({\n   *   is_active: true\n   * })\n   * console.log('Active sessions:', active.sessions.length)\n   *\n   * // List sessions for a specific admin\n   * const adminSessions = await client.admin.impersonation.listSessions({\n   *   admin_user_id: 'admin-uuid',\n   *   limit: 50\n   * })\n   *\n   * // List user impersonation sessions only\n   * const userSessions = await client.admin.impersonation.listSessions({\n   *   impersonation_type: 'user',\n   *   offset: 0,\n   *   limit: 100\n   * })\n   * ```\n   *\n   * @example\n   * ```typescript\n   * // Audit trail: Find who impersonated a specific user\n   * const userHistory = await client.admin.impersonation.listSessions({\n   *   target_user_id: 'user-uuid'\n   * })\n   *\n   * userHistory.sessions.forEach(session => {\n   *   console.log(`Admin ${session.admin_user_id} impersonated user`)\n   *   console.log(`Reason: ${session.reason}`)\n   *   console.log(`Duration: ${session.started_at} - ${session.ended_at}`)\n   * })\n   * ```\n   */\n  async listSessions(options: ListImpersonationSessionsOptions = {}): Promise<ListImpersonationSessionsResponse> {\n    const params = new URLSearchParams()\n\n    if (options.limit !== undefined) {\n      params.append('limit', String(options.limit))\n    }\n    if (options.offset !== undefined) {\n      params.append('offset', String(options.offset))\n    }\n    if (options.admin_user_id) {\n      params.append('admin_user_id', options.admin_user_id)\n    }\n    if (options.target_user_id) {\n      params.append('target_user_id', options.target_user_id)\n    }\n    if (options.impersonation_type) {\n      params.append('impersonation_type', options.impersonation_type)\n    }\n    if (options.is_active !== undefined) {\n      params.append('is_active', String(options.is_active))\n    }\n\n    const queryString = params.toString()\n    const url = queryString ? `/api/v1/auth/impersonate/sessions?${queryString}` : '/api/v1/auth/impersonate/sessions'\n\n    return await this.fetch.get<ListImpersonationSessionsResponse>(url)\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  // Client Keys\n  ClientKey,\n  CreateClientKeyRequest,\n  CreateClientKeyResponse,\n  DeleteClientKeyResponse,\n  ListClientKeysResponse,\n  RevokeClientKeyResponse,\n  UpdateClientKeyRequest,\n  // Webhooks\n  CreateWebhookRequest,\n  DeleteWebhookResponse,\n  ListWebhookDeliveriesResponse,\n  ListWebhooksResponse,\n  TestWebhookResponse,\n  UpdateWebhookRequest,\n  Webhook,\n  // Invitations\n  AcceptInvitationRequest,\n  AcceptInvitationResponse,\n  CreateInvitationRequest,\n  CreateInvitationResponse,\n  ListInvitationsOptions,\n  ListInvitationsResponse,\n  RevokeInvitationResponse,\n  ValidateInvitationResponse,\n} from \"./types\";\n\n/**\n * Client Keys management client\n *\n * Provides methods for managing client keys for service-to-service authentication.\n * Client keys allow external services to authenticate without user credentials.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a client key\n * const { client_key, key } = await client.management.clientKeys.create({\n *   name: 'Production Service',\n *   scopes: ['read:users', 'write:users'],\n *   rate_limit_per_minute: 100\n * })\n *\n * // List client keys\n * const { client_keys } = await client.management.clientKeys.list()\n * ```\n *\n * @category Management\n */\nexport class ClientKeysManager {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Create a new client key\n   *\n   * @param request - Client key configuration\n   * @returns Created client key with the full key value (only shown once)\n   *\n   * @example\n   * ```typescript\n   * const { client_key, key } = await client.management.clientKeys.create({\n   *   name: 'Production Service',\n   *   description: 'Client key for production service',\n   *   scopes: ['read:users', 'write:users'],\n   *   rate_limit_per_minute: 100,\n   *   expires_at: '2025-12-31T23:59:59Z'\n   * })\n   *\n   * // Store the key securely - it won't be shown again\n   * console.log('Client Key:', key)\n   * ```\n   */\n  async create(\n    request: CreateClientKeyRequest,\n  ): Promise<CreateClientKeyResponse> {\n    return await this.fetch.post<CreateClientKeyResponse>(\n      \"/api/v1/client-keys\",\n      request,\n    );\n  }\n\n  /**\n   * List all client keys for the authenticated user\n   *\n   * @returns List of client keys (without full key values)\n   *\n   * @example\n   * ```typescript\n   * const { client_keys, total } = await client.management.clientKeys.list()\n   *\n   * client_keys.forEach(key => {\n   *   console.log(`${key.name}: ${key.key_prefix}... (expires: ${key.expires_at})`)\n   * })\n   * ```\n   */\n  async list(): Promise<ListClientKeysResponse> {\n    return await this.fetch.get<ListClientKeysResponse>(\"/api/v1/client-keys\");\n  }\n\n  /**\n   * Get a specific client key by ID\n   *\n   * @param keyId - Client key ID\n   * @returns Client key details\n   *\n   * @example\n   * ```typescript\n   * const clientKey = await client.management.clientKeys.get('key-uuid')\n   * console.log('Last used:', clientKey.last_used_at)\n   * ```\n   */\n  async get(keyId: string): Promise<ClientKey> {\n    return await this.fetch.get<ClientKey>(`/api/v1/client-keys/${keyId}`);\n  }\n\n  /**\n   * Update a client key\n   *\n   * @param keyId - Client key ID\n   * @param updates - Fields to update\n   * @returns Updated client key\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.management.clientKeys.update('key-uuid', {\n   *   name: 'Updated Name',\n   *   rate_limit_per_minute: 200\n   * })\n   * ```\n   */\n  async update(\n    keyId: string,\n    updates: UpdateClientKeyRequest,\n  ): Promise<ClientKey> {\n    return await this.fetch.patch<ClientKey>(\n      `/api/v1/client-keys/${keyId}`,\n      updates,\n    );\n  }\n\n  /**\n   * Revoke a client key\n   *\n   * Revoked keys can no longer be used but remain in the system for audit purposes.\n   *\n   * @param keyId - Client key ID\n   * @returns Revocation confirmation\n   *\n   * @example\n   * ```typescript\n   * await client.management.clientKeys.revoke('key-uuid')\n   * console.log('Client key revoked')\n   * ```\n   */\n  async revoke(keyId: string): Promise<RevokeClientKeyResponse> {\n    return await this.fetch.post<RevokeClientKeyResponse>(\n      `/api/v1/client-keys/${keyId}/revoke`,\n      {},\n    );\n  }\n\n  /**\n   * Delete a client key\n   *\n   * Permanently removes the client key from the system.\n   *\n   * @param keyId - Client key ID\n   * @returns Deletion confirmation\n   *\n   * @example\n   * ```typescript\n   * await client.management.clientKeys.delete('key-uuid')\n   * console.log('Client key deleted')\n   * ```\n   */\n  async delete(keyId: string): Promise<DeleteClientKeyResponse> {\n    return await this.fetch.delete<DeleteClientKeyResponse>(\n      `/api/v1/client-keys/${keyId}`,\n    );\n  }\n}\n\n/**\n * @deprecated Use ClientKeysManager instead\n */\nexport const APIKeysManager = ClientKeysManager;\n\n/**\n * Webhooks management client\n *\n * Provides methods for managing webhooks to receive real-time event notifications.\n * Webhooks allow your application to be notified when events occur in Fluxbase.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a webhook\n * const webhook = await client.management.webhooks.create({\n *   url: 'https://myapp.com/webhook',\n *   events: ['user.created', 'user.updated'],\n *   secret: 'my-webhook-secret'\n * })\n *\n * // Test the webhook\n * const result = await client.management.webhooks.test(webhook.id)\n * ```\n *\n * @category Management\n */\nexport class WebhooksManager {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Create a new webhook\n   *\n   * @param request - Webhook configuration\n   * @returns Created webhook\n   *\n   * @example\n   * ```typescript\n   * const webhook = await client.management.webhooks.create({\n   *   url: 'https://myapp.com/webhook',\n   *   events: ['user.created', 'user.updated', 'user.deleted'],\n   *   description: 'User events webhook',\n   *   secret: 'my-webhook-secret'\n   * })\n   * ```\n   */\n  async create(request: CreateWebhookRequest): Promise<Webhook> {\n    return await this.fetch.post<Webhook>(\"/api/v1/webhooks\", request);\n  }\n\n  /**\n   * List all webhooks for the authenticated user\n   *\n   * @returns List of webhooks\n   *\n   * @example\n   * ```typescript\n   * const { webhooks, total } = await client.management.webhooks.list()\n   *\n   * webhooks.forEach(webhook => {\n   *   console.log(`${webhook.url}: ${webhook.is_active ? 'active' : 'inactive'}`)\n   * })\n   * ```\n   */\n  async list(): Promise<ListWebhooksResponse> {\n    return await this.fetch.get<ListWebhooksResponse>(\"/api/v1/webhooks\");\n  }\n\n  /**\n   * Get a specific webhook by ID\n   *\n   * @param webhookId - Webhook ID\n   * @returns Webhook details\n   *\n   * @example\n   * ```typescript\n   * const webhook = await client.management.webhooks.get('webhook-uuid')\n   * console.log('Events:', webhook.events)\n   * ```\n   */\n  async get(webhookId: string): Promise<Webhook> {\n    return await this.fetch.get<Webhook>(`/api/v1/webhooks/${webhookId}`);\n  }\n\n  /**\n   * Update a webhook\n   *\n   * @param webhookId - Webhook ID\n   * @param updates - Fields to update\n   * @returns Updated webhook\n   *\n   * @example\n   * ```typescript\n   * const updated = await client.management.webhooks.update('webhook-uuid', {\n   *   events: ['user.created', 'user.deleted'],\n   *   is_active: false\n   * })\n   * ```\n   */\n  async update(\n    webhookId: string,\n    updates: UpdateWebhookRequest,\n  ): Promise<Webhook> {\n    return await this.fetch.patch<Webhook>(\n      `/api/v1/webhooks/${webhookId}`,\n      updates,\n    );\n  }\n\n  /**\n   * Delete a webhook\n   *\n   * @param webhookId - Webhook ID\n   * @returns Deletion confirmation\n   *\n   * @example\n   * ```typescript\n   * await client.management.webhooks.delete('webhook-uuid')\n   * console.log('Webhook deleted')\n   * ```\n   */\n  async delete(webhookId: string): Promise<DeleteWebhookResponse> {\n    return await this.fetch.delete<DeleteWebhookResponse>(\n      `/api/v1/webhooks/${webhookId}`,\n    );\n  }\n\n  /**\n   * Test a webhook by sending a test payload\n   *\n   * @param webhookId - Webhook ID\n   * @returns Test result with status and response\n   *\n   * @example\n   * ```typescript\n   * const result = await client.management.webhooks.test('webhook-uuid')\n   *\n   * if (result.success) {\n   *   console.log('Webhook test successful')\n   * } else {\n   *   console.error('Webhook test failed:', result.error)\n   * }\n   * ```\n   */\n  async test(webhookId: string): Promise<TestWebhookResponse> {\n    return await this.fetch.post<TestWebhookResponse>(\n      `/api/v1/webhooks/${webhookId}/test`,\n      {},\n    );\n  }\n\n  /**\n   * List webhook delivery history\n   *\n   * @param webhookId - Webhook ID\n   * @param limit - Maximum number of deliveries to return (default: 50)\n   * @returns List of webhook deliveries\n   *\n   * @example\n   * ```typescript\n   * const { deliveries } = await client.management.webhooks.listDeliveries('webhook-uuid', 100)\n   *\n   * deliveries.forEach(delivery => {\n   *   console.log(`Event: ${delivery.event}, Status: ${delivery.status_code}`)\n   * })\n   * ```\n   */\n  async listDeliveries(\n    webhookId: string,\n    limit: number = 50,\n  ): Promise<ListWebhookDeliveriesResponse> {\n    return await this.fetch.get<ListWebhookDeliveriesResponse>(\n      `/api/v1/webhooks/${webhookId}/deliveries?limit=${limit}`,\n    );\n  }\n}\n\n/**\n * Invitations management client\n *\n * Provides methods for creating and managing user invitations.\n * Invitations allow admins to invite new users to join the platform.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.admin.login({ email: 'admin@example.com', password: 'password' })\n *\n * // Create an invitation\n * const invitation = await client.management.invitations.create({\n *   email: 'newuser@example.com',\n *   role: 'dashboard_user'\n * })\n *\n * console.log('Invite link:', invitation.invite_link)\n * ```\n *\n * @category Management\n */\nexport class InvitationsManager {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Create a new invitation (admin only)\n   *\n   * @param request - Invitation details\n   * @returns Created invitation with invite link\n   *\n   * @example\n   * ```typescript\n   * const invitation = await client.management.invitations.create({\n   *   email: 'newuser@example.com',\n   *   role: 'dashboard_user',\n   *   expiry_duration: 604800 // 7 days in seconds\n   * })\n   *\n   * // Share the invite link\n   * console.log('Send this link to the user:', invitation.invite_link)\n   * ```\n   */\n  async create(\n    request: CreateInvitationRequest,\n  ): Promise<CreateInvitationResponse> {\n    return await this.fetch.post<CreateInvitationResponse>(\n      \"/api/v1/admin/invitations\",\n      request,\n    );\n  }\n\n  /**\n   * List all invitations (admin only)\n   *\n   * @param options - Filter options\n   * @returns List of invitations\n   *\n   * @example\n   * ```typescript\n   * // List pending invitations only\n   * const { invitations } = await client.management.invitations.list({\n   *   include_accepted: false,\n   *   include_expired: false\n   * })\n   *\n   * // List all invitations including accepted and expired\n   * const all = await client.management.invitations.list({\n   *   include_accepted: true,\n   *   include_expired: true\n   * })\n   * ```\n   */\n  async list(\n    options: ListInvitationsOptions = {},\n  ): Promise<ListInvitationsResponse> {\n    const params = new URLSearchParams();\n\n    if (options.include_accepted !== undefined) {\n      params.append(\"include_accepted\", String(options.include_accepted));\n    }\n    if (options.include_expired !== undefined) {\n      params.append(\"include_expired\", String(options.include_expired));\n    }\n\n    const queryString = params.toString();\n    const url = queryString\n      ? `/api/v1/admin/invitations?${queryString}`\n      : \"/api/v1/admin/invitations\";\n\n    return await this.fetch.get<ListInvitationsResponse>(url);\n  }\n\n  /**\n   * Validate an invitation token (public endpoint)\n   *\n   * @param token - Invitation token\n   * @returns Validation result with invitation details\n   *\n   * @example\n   * ```typescript\n   * const result = await client.management.invitations.validate('invitation-token')\n   *\n   * if (result.valid) {\n   *   console.log('Valid invitation for:', result.invitation?.email)\n   * } else {\n   *   console.error('Invalid:', result.error)\n   * }\n   * ```\n   */\n  async validate(token: string): Promise<ValidateInvitationResponse> {\n    return await this.fetch.get<ValidateInvitationResponse>(\n      `/api/v1/invitations/${token}/validate`,\n    );\n  }\n\n  /**\n   * Accept an invitation and create a new user (public endpoint)\n   *\n   * @param token - Invitation token\n   * @param request - User details (password and name)\n   * @returns Created user with authentication tokens\n   *\n   * @example\n   * ```typescript\n   * const response = await client.management.invitations.accept('invitation-token', {\n   *   password: 'SecurePassword123!',\n   *   name: 'John Doe'\n   * })\n   *\n   * // Store tokens\n   * localStorage.setItem('access_token', response.access_token)\n   * console.log('Welcome:', response.user.name)\n   * ```\n   */\n  async accept(\n    token: string,\n    request: AcceptInvitationRequest,\n  ): Promise<AcceptInvitationResponse> {\n    return await this.fetch.post<AcceptInvitationResponse>(\n      `/api/v1/invitations/${token}/accept`,\n      request,\n    );\n  }\n\n  /**\n   * Revoke an invitation (admin only)\n   *\n   * @param token - Invitation token\n   * @returns Revocation confirmation\n   *\n   * @example\n   * ```typescript\n   * await client.management.invitations.revoke('invitation-token')\n   * console.log('Invitation revoked')\n   * ```\n   */\n  async revoke(token: string): Promise<RevokeInvitationResponse> {\n    return await this.fetch.delete<RevokeInvitationResponse>(\n      `/api/v1/admin/invitations/${token}`,\n    );\n  }\n}\n\n/**\n * Management client for client keys, webhooks, and invitations\n *\n * @category Management\n */\nexport class FluxbaseManagement {\n  /** Client Keys management */\n  public clientKeys: ClientKeysManager;\n\n  /** @deprecated Use clientKeys instead */\n  public apiKeys: ClientKeysManager;\n\n  /** Webhooks management */\n  public webhooks: WebhooksManager;\n\n  /** Invitations management */\n  public invitations: InvitationsManager;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.clientKeys = new ClientKeysManager(fetch);\n    this.apiKeys = this.clientKeys; // Backwards compatibility alias\n    this.webhooks = new WebhooksManager(fetch);\n    this.invitations = new InvitationsManager(fetch);\n  }\n}\n","/**\n * Shared bundling module for edge functions and jobs\n * Provides client-side bundling using esbuild for Deno runtime compatibility\n */\n\n// Optional esbuild import - will be dynamically loaded if available\nlet esbuild: typeof import(\"esbuild\") | null = null;\n\n// Optional fs import for reading deno.json\nlet fs: typeof import(\"fs\") | null = null;\n\n/**\n * Try to load esbuild for client-side bundling\n * Returns true if esbuild is available, false otherwise\n */\nexport async function loadEsbuild(): Promise<boolean> {\n  if (esbuild) return true;\n  try {\n    esbuild = await import(\"esbuild\");\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Get the loaded esbuild instance\n * @internal\n */\nexport function getEsbuild(): typeof import(\"esbuild\") | null {\n  return esbuild;\n}\n\n/**\n * Try to load fs module\n */\nasync function loadFs(): Promise<boolean> {\n  if (fs) return true;\n  try {\n    fs = await import(\"fs\");\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * esbuild plugin that marks Deno-specific imports as external\n * Use this when bundling functions/jobs with esbuild to handle npm:, https://, and jsr: imports\n *\n * @example\n * ```typescript\n * import { denoExternalPlugin } from '@nimbleflux/fluxbase-sdk'\n * import * as esbuild from 'esbuild'\n *\n * const result = await esbuild.build({\n *   entryPoints: ['./my-function.ts'],\n *   bundle: true,\n *   plugins: [denoExternalPlugin],\n *   // ... other options\n * })\n * ```\n */\nexport const denoExternalPlugin = {\n  name: \"deno-external\",\n  setup(build: {\n    onResolve: (\n      opts: { filter: RegExp },\n      cb: (args: { path: string }) => { path: string; external: boolean },\n    ) => void;\n  }) {\n    // Mark npm: imports as external - Deno will resolve them at runtime\n    build.onResolve({ filter: /^npm:/ }, (args) => ({\n      path: args.path,\n      external: true,\n    }));\n\n    // Mark https:// and http:// imports as external\n    build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n      path: args.path,\n      external: true,\n    }));\n\n    // Mark jsr: imports as external (Deno's JSR registry)\n    build.onResolve({ filter: /^jsr:/ }, (args) => ({\n      path: args.path,\n      external: true,\n    }));\n  },\n};\n\n/**\n * Load import map from a deno.json file\n *\n * @param denoJsonPath - Path to deno.json file\n * @returns Import map object or null if not found\n *\n * @example\n * ```typescript\n * const importMap = await loadImportMap('./deno.json')\n * const bundled = await bundleCode({\n *   code: myCode,\n *   importMap,\n * })\n * ```\n */\nexport async function loadImportMap(\n  denoJsonPath: string,\n): Promise<Record<string, string> | null> {\n  const hasFs = await loadFs();\n  if (!hasFs || !fs) {\n    console.warn(\"fs module not available, cannot load import map\");\n    return null;\n  }\n\n  try {\n    const content = fs.readFileSync(denoJsonPath, \"utf-8\");\n    const config = JSON.parse(content);\n    return config.imports || null;\n  } catch (error) {\n    console.warn(`Failed to load import map from ${denoJsonPath}:`, error);\n    return null;\n  }\n}\n\n/**\n * Options for bundling code\n */\nexport interface BundleOptions {\n  /** Entry point code */\n  code: string;\n  /** External modules to exclude from bundle */\n  external?: string[];\n  /** Source map generation */\n  sourcemap?: boolean;\n  /** Minify output */\n  minify?: boolean;\n  /** Import map from deno.json (maps aliases to npm: or file paths) */\n  importMap?: Record<string, string>;\n  /** Base directory for resolving relative imports (resolveDir in esbuild) */\n  baseDir?: string;\n  /** Additional paths to search for node_modules (useful when importing from parent directories) */\n  nodePaths?: string[];\n  /** Custom define values for esbuild (e.g., { 'process.env.NODE_ENV': '\"production\"' }) */\n  define?: Record<string, string>;\n}\n\n/**\n * Result of bundling code\n */\nexport interface BundleResult {\n  /** Bundled code */\n  code: string;\n  /** Source map (if enabled) */\n  sourceMap?: string;\n}\n\n/**\n * Bundle code using esbuild (client-side)\n *\n * Transforms and bundles TypeScript/JavaScript code into a single file\n * that can be executed by the Fluxbase Deno runtime.\n *\n * Requires esbuild as a peer dependency.\n *\n * @param options - Bundle options including source code\n * @returns Promise resolving to bundled code\n * @throws Error if esbuild is not available\n *\n * @example\n * ```typescript\n * import { bundleCode } from '@nimbleflux/fluxbase-sdk'\n *\n * const bundled = await bundleCode({\n *   code: `\n *     import { helper } from './utils'\n *     export default async function handler(req) {\n *       return helper(req.payload)\n *     }\n *   `,\n *   minify: true,\n * })\n *\n * // Use bundled code in sync\n * await client.admin.functions.sync({\n *   namespace: 'default',\n *   functions: [{\n *     name: 'my-function',\n *     code: bundled.code,\n *     is_pre_bundled: true,\n *   }]\n * })\n * ```\n */\nexport async function bundleCode(options: BundleOptions): Promise<BundleResult> {\n  const hasEsbuild = await loadEsbuild();\n  if (!hasEsbuild || !esbuild) {\n    throw new Error(\n      \"esbuild is required for bundling. Install it with: npm install esbuild\",\n    );\n  }\n\n  // Process import map to extract externals and aliases\n  const externals = [...(options.external ?? [])];\n  const alias: Record<string, string> = {};\n\n  if (options.importMap) {\n    for (const [key, value] of Object.entries(options.importMap)) {\n      // npm: imports should be marked as external - Deno will resolve them at runtime\n      if (value.startsWith(\"npm:\")) {\n        // Add the import key as external (e.g., \"@streamparser/json\")\n        externals.push(key);\n      } else if (\n        value.startsWith(\"https://\") ||\n        value.startsWith(\"http://\")\n      ) {\n        // URL imports should also be external - Deno will fetch them at runtime\n        externals.push(key);\n      } else if (\n        value.startsWith(\"/\") ||\n        value.startsWith(\"./\") ||\n        value.startsWith(\"../\")\n      ) {\n        // Local file paths - create alias for esbuild\n        alias[key] = value;\n      } else {\n        // Other imports (bare specifiers) - mark as external\n        externals.push(key);\n      }\n    }\n  }\n\n  // Create a plugin to handle Deno-specific imports (npm:, https://, http://)\n  const denoPlugin: import(\"esbuild\").Plugin = {\n    name: \"deno-external\",\n    setup(build) {\n      // Mark npm: imports as external\n      build.onResolve({ filter: /^npm:/ }, (args) => ({\n        path: args.path,\n        external: true,\n      }));\n\n      // Mark https:// and http:// imports as external\n      build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n        path: args.path,\n        external: true,\n      }));\n\n      // Mark jsr: imports as external (Deno's JSR registry)\n      build.onResolve({ filter: /^jsr:/ }, (args) => ({\n        path: args.path,\n        external: true,\n      }));\n    },\n  };\n\n  const resolveDir = options.baseDir || process.cwd?.() || \"/\";\n\n  const buildOptions: import(\"esbuild\").BuildOptions = {\n    stdin: {\n      contents: options.code,\n      loader: \"ts\",\n      resolveDir,\n    },\n    // Set absWorkingDir for consistent path resolution\n    absWorkingDir: resolveDir,\n    bundle: true,\n    write: false,\n    format: \"esm\",\n    // Use 'node' platform for better node_modules resolution (Deno supports Node APIs)\n    platform: \"node\",\n    target: \"esnext\",\n    minify: options.minify ?? false,\n    sourcemap: options.sourcemap ? \"inline\" : false,\n    external: externals,\n    plugins: [denoPlugin],\n    // Preserve handler export\n    treeShaking: true,\n    // Resolve .ts, .js, .mjs extensions\n    resolveExtensions: [\".ts\", \".tsx\", \".js\", \".mjs\", \".json\"],\n    // ESM conditions for better module resolution\n    conditions: [\"import\", \"module\"],\n  };\n\n  // Add alias if we have any\n  if (Object.keys(alias).length > 0) {\n    buildOptions.alias = alias;\n  }\n\n  // Add nodePaths for resolving modules from additional directories\n  if (options.nodePaths && options.nodePaths.length > 0) {\n    buildOptions.nodePaths = options.nodePaths;\n  }\n\n  // Add custom define values\n  if (options.define) {\n    buildOptions.define = options.define;\n  }\n\n  const result = await esbuild.build(buildOptions);\n\n  const output = result.outputFiles?.[0];\n  if (!output) {\n    throw new Error(\"Bundling failed: no output generated\");\n  }\n\n  return {\n    code: output.text,\n    sourceMap: options.sourcemap ? output.text : undefined,\n  };\n}\n","/**\n * Admin Functions module for managing edge functions\n * Provides administrative operations for function lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  EdgeFunction,\n  CreateFunctionRequest,\n  UpdateFunctionRequest,\n  EdgeFunctionExecution,\n  SyncFunctionsOptions,\n  SyncFunctionsResult,\n  FunctionSpec,\n} from \"./types\";\nimport {\n  bundleCode,\n  loadEsbuild,\n  loadImportMap,\n  denoExternalPlugin,\n  type BundleOptions,\n  type BundleResult,\n} from \"./bundling\";\n\n// Re-export bundling utilities for direct use\nexport { denoExternalPlugin, loadImportMap };\nexport type { BundleOptions, BundleResult };\n\n/**\n * Admin Functions manager for managing edge functions\n * Provides create, update, delete, and bulk sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminFunctions {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Create a new edge function\n   *\n   * @param request - Function configuration and code\n   * @returns Promise resolving to { data, error } tuple with created function metadata\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.create({\n   *   name: 'my-function',\n   *   code: 'export default async function handler(req) { return { hello: \"world\" } }',\n   *   enabled: true\n   * })\n   * ```\n   */\n  async create(\n    request: CreateFunctionRequest,\n  ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<EdgeFunction>(\n        \"/api/v1/functions\",\n        request,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all namespaces that have edge functions\n   *\n   * @returns Promise resolving to { data, error } tuple with array of namespace strings\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.listNamespaces()\n   * if (data) {\n   *   console.log('Available namespaces:', data)\n   * }\n   * ```\n   */\n  async listNamespaces(): Promise<{\n    data: string[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const response = await this.fetch.get<{ namespaces: string[] }>(\n        \"/api/v1/admin/functions/namespaces\",\n      );\n      return { data: response.namespaces || [\"default\"], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all edge functions (admin view)\n   *\n   * @param namespace - Optional namespace filter (if not provided, lists all public functions)\n   * @returns Promise resolving to { data, error } tuple with array of functions\n   *\n   * @example\n   * ```typescript\n   * // List all public functions\n   * const { data, error } = await client.admin.functions.list()\n   *\n   * // List functions in a specific namespace\n   * const { data, error } = await client.admin.functions.list('my-namespace')\n   * if (data) {\n   *   console.log('Functions:', data.map(f => f.name))\n   * }\n   * ```\n   */\n  async list(\n    namespace?: string,\n  ): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n    try {\n      const params = namespace ? `?namespace=${namespace}` : \"\";\n      const data = await this.fetch.get<EdgeFunction[]>(\n        `/api/v1/functions${params}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific edge function\n   *\n   * @param name - Function name\n   * @returns Promise resolving to { data, error } tuple with function metadata\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.get('my-function')\n   * if (data) {\n   *   console.log('Function version:', data.version)\n   * }\n   * ```\n   */\n  async get(\n    name: string,\n  ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<EdgeFunction>(\n        `/api/v1/functions/${name}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update an existing edge function\n   *\n   * @param name - Function name\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated function metadata\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.update('my-function', {\n   *   enabled: false,\n   *   description: 'Updated description'\n   * })\n   * ```\n   */\n  async update(\n    name: string,\n    updates: UpdateFunctionRequest,\n  ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<EdgeFunction>(\n        `/api/v1/functions/${name}`,\n        updates,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete an edge function\n   *\n   * @param name - Function name\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.delete('my-function')\n   * ```\n   */\n  async delete(name: string): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/functions/${name}`);\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution history for an edge function\n   *\n   * @param name - Function name\n   * @param limit - Maximum number of executions to return (optional)\n   * @returns Promise resolving to { data, error } tuple with execution records\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.getExecutions('my-function', 10)\n   * if (data) {\n   *   data.forEach(exec => {\n   *     console.log(`${exec.executed_at}: ${exec.status} (${exec.duration_ms}ms)`)\n   *   })\n   * }\n   * ```\n   */\n  async getExecutions(\n    name: string,\n    limit?: number,\n  ): Promise<{ data: EdgeFunctionExecution[] | null; error: Error | null }> {\n    try {\n      const params = limit ? `?limit=${limit}` : \"\";\n      const data = await this.fetch.get<EdgeFunctionExecution[]>(\n        `/api/v1/functions/${name}/executions${params}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Sync multiple functions to a namespace\n   *\n   * Bulk create/update/delete functions in a specific namespace. This is useful for\n   * deploying functions from your application to Fluxbase in Kubernetes or other\n   * container environments.\n   *\n   * Requires service_role or admin authentication.\n   *\n   * @param options - Sync configuration including namespace, functions, and options\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * // Sync functions to \"payment-service\" namespace\n   * const { data, error } = await client.admin.functions.sync({\n   *   namespace: 'payment-service',\n   *   functions: [\n   *     {\n   *       name: 'process-payment',\n   *       code: 'export default async function handler(req) { ... }',\n   *       enabled: true,\n   *       allow_net: true\n   *     },\n   *     {\n   *       name: 'refund-payment',\n   *       code: 'export default async function handler(req) { ... }',\n   *       enabled: true\n   *     }\n   *   ],\n   *   options: {\n   *     delete_missing: true  // Remove functions not in this list\n   *   }\n   * })\n   *\n   * if (data) {\n   *   console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n   * }\n   *\n   * // Dry run to preview changes\n   * const { data, error } = await client.admin.functions.sync({\n   *   namespace: 'myapp',\n   *   functions: [...],\n   *   options: { dry_run: true }\n   * })\n   * ```\n   */\n  async sync(\n    options: SyncFunctionsOptions,\n  ): Promise<{ data: SyncFunctionsResult | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<SyncFunctionsResult>(\n        \"/api/v1/admin/functions/sync\",\n        options,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Sync edge functions with automatic client-side bundling\n   *\n   * This is a convenience method that bundles all function code using esbuild\n   * before sending to the server. Requires esbuild as a peer dependency.\n   *\n   * @param options - Sync options including namespace and functions array\n   * @param bundleOptions - Optional bundling configuration\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.functions.syncWithBundling({\n   *   namespace: 'default',\n   *   functions: [\n   *     { name: 'hello', code: helloCode },\n   *     { name: 'goodbye', code: goodbyeCode },\n   *   ],\n   *   options: { delete_missing: true }\n   * })\n   * ```\n   */\n  async syncWithBundling(\n    options: SyncFunctionsOptions,\n    bundleOptions?: Partial<BundleOptions>,\n  ): Promise<{ data: SyncFunctionsResult | null; error: Error | null }> {\n    if (!options.functions || options.functions.length === 0) {\n      return this.sync(options);\n    }\n\n    // Check if esbuild is available\n    const hasEsbuild = await loadEsbuild();\n    if (!hasEsbuild) {\n      return {\n        data: null,\n        error: new Error(\n          \"esbuild is required for client-side bundling. Install it with: npm install esbuild\",\n        ),\n      };\n    }\n\n    try {\n      // Bundle each function\n      const bundledFunctions: FunctionSpec[] = await Promise.all(\n        options.functions.map(async (fn) => {\n          // Skip if already pre-bundled\n          if (fn.is_pre_bundled) {\n            return fn;\n          }\n\n          const bundled = await FluxbaseAdminFunctions.bundleCode({\n            // Apply global bundle options first\n            ...bundleOptions,\n            // Then override with per-function values (these take priority)\n            code: fn.code,\n            // Use function's sourceDir for resolving relative imports\n            baseDir: fn.sourceDir || bundleOptions?.baseDir,\n            // Use function's nodePaths for additional module resolution\n            nodePaths: fn.nodePaths || bundleOptions?.nodePaths,\n          });\n\n          return {\n            ...fn,\n            code: bundled.code,\n            original_code: fn.code,\n            is_pre_bundled: true,\n          };\n        }),\n      );\n\n      // Sync with pre-bundled code\n      return this.sync({\n        ...options,\n        functions: bundledFunctions,\n      });\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Bundle function code using esbuild (client-side)\n   *\n   * Transforms and bundles TypeScript/JavaScript code into a single file\n   * that can be executed by the Fluxbase edge functions runtime.\n   *\n   * Requires esbuild as a peer dependency.\n   *\n   * @param options - Bundle options including source code\n   * @returns Promise resolving to bundled code\n   * @throws Error if esbuild is not available\n   *\n   * @example\n   * ```typescript\n   * const bundled = await FluxbaseAdminFunctions.bundleCode({\n   *   code: `\n   *     import { helper } from './utils'\n   *     export default async function handler(req) {\n   *       return helper(req.body)\n   *     }\n   *   `,\n   *   minify: true,\n   * })\n   *\n   * // Use bundled code in sync\n   * await client.admin.functions.sync({\n   *   namespace: 'default',\n   *   functions: [{\n   *     name: 'my-function',\n   *     code: bundled.code,\n   *     is_pre_bundled: true,\n   *   }]\n   * })\n   * ```\n   */\n  static async bundleCode(options: BundleOptions): Promise<BundleResult> {\n    return bundleCode(options);\n  }\n}\n","/**\n * Admin Migrations module for managing database migrations\n * Provides API-based migration management without filesystem coupling\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  Migration,\n  CreateMigrationRequest,\n  UpdateMigrationRequest,\n  MigrationExecution,\n  SyncMigrationsOptions,\n  SyncMigrationsResult,\n} from \"./types\";\n\n/**\n * Admin Migrations manager for database migration operations\n * Provides create, update, delete, apply, rollback, and smart sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminMigrations {\n  private fetch: FluxbaseFetch;\n  private localMigrations: Map<string, CreateMigrationRequest> = new Map();\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Register a migration locally for smart sync\n   *\n   * Call this method to register migrations in your application code.\n   * When you call sync(), only new or changed migrations will be sent to the server.\n   *\n   * @param migration - Migration definition\n   * @returns { error } tuple (always succeeds unless validation fails)\n   *\n   * @example\n   * ```typescript\n   * // In your app initialization\n   * const { error: err1 } = client.admin.migrations.register({\n   *   name: '001_create_users_table',\n   *   namespace: 'myapp',\n   *   up_sql: 'CREATE TABLE app.users (...)',\n   *   down_sql: 'DROP TABLE app.users',\n   *   description: 'Initial users table'\n   * })\n   *\n   * const { error: err2 } = client.admin.migrations.register({\n   *   name: '002_add_posts_table',\n   *   namespace: 'myapp',\n   *   up_sql: 'CREATE TABLE app.posts (...)',\n   *   down_sql: 'DROP TABLE app.posts'\n   * })\n   *\n   * // Sync all registered migrations\n   * await client.admin.migrations.sync()\n   * ```\n   */\n  register(migration: CreateMigrationRequest): { error: Error | null } {\n    try {\n      // Basic validation\n      if (!migration.name || !migration.up_sql) {\n        return {\n          error: new Error(\"Migration name and up_sql are required\"),\n        };\n      }\n\n      const key = `${migration.namespace || \"default\"}:${migration.name}`;\n      this.localMigrations.set(key, migration);\n\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Trigger schema refresh to update the REST API cache\n   * Note: Server no longer restarts - cache is invalidated instantly\n   *\n   * @private\n   */\n  private async triggerSchemaRefresh(): Promise<void> {\n    const response = await this.fetch.post<{\n      message: string;\n      tables: number;\n      views: number;\n    }>(\"/api/v1/admin/schema/refresh\", {});\n    console.log(\n      `Schema cache refreshed: ${response.tables} tables, ${response.views} views`\n    );\n  }\n\n  /**\n   * Smart sync all registered migrations\n   *\n   * Automatically determines which migrations need to be created or updated by:\n   * 1. Fetching existing migrations from the server\n   * 2. Comparing content hashes to detect changes\n   * 3. Only sending new or changed migrations\n   *\n   * After successful sync, can optionally auto-apply new migrations and refresh\n   * the server's schema cache.\n   *\n   * @param options - Sync options\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * // Basic sync (idempotent - safe to call on every app startup)\n   * const { data, error } = await client.admin.migrations.sync()\n   * if (data) {\n   *   console.log(`Created: ${data.summary.created}, Updated: ${data.summary.updated}`)\n   * }\n   *\n   * // Sync with auto-apply (applies new migrations automatically)\n   * const { data, error } = await client.admin.migrations.sync({\n   *   auto_apply: true\n   * })\n   *\n   * // Dry run to preview changes without applying\n   * const { data, error } = await client.admin.migrations.sync({\n   *   dry_run: true\n   * })\n   * ```\n   */\n  async sync(\n    options: Partial<SyncMigrationsOptions> = {}\n  ): Promise<{ data: SyncMigrationsResult | null; error: Error | null }> {\n    try {\n      // Group migrations by namespace\n      const byNamespace = new Map<string, CreateMigrationRequest[]>();\n\n      for (const migration of this.localMigrations.values()) {\n        const ns = migration.namespace || \"default\";\n        if (!byNamespace.has(ns)) {\n          byNamespace.set(ns, []);\n        }\n        byNamespace.get(ns)!.push(migration);\n      }\n\n      // Sync each namespace\n      const results: SyncMigrationsResult[] = [];\n      const errors: Error[] = [];\n\n      for (const [namespace, migrations] of byNamespace) {\n        try {\n          const result = await this.fetch.post<SyncMigrationsResult>(\n            \"/api/v1/admin/migrations/sync\",\n            {\n              namespace,\n              migrations: migrations.map((m) => ({\n                name: m.name,\n                description: m.description,\n                up_sql: m.up_sql,\n                down_sql: m.down_sql,\n              })),\n              options: {\n                update_if_changed: options.update_if_changed ?? true,\n                auto_apply: options.auto_apply ?? false,\n                dry_run: options.dry_run ?? false,\n              },\n            }\n          );\n          results.push(result);\n        } catch (error) {\n          // If sync failed with errors (422), extract the sync result from error.details\n          const err = error as any;\n          if (err.status === 422 && err.details) {\n            // Server returned sync results with errors - include them\n            results.push(err.details as SyncMigrationsResult);\n            errors.push(err);\n          } else {\n            // Other errors (network, auth, etc.) - propagate them\n            throw error;\n          }\n        }\n      }\n\n      // Combine results\n      const combined: SyncMigrationsResult = {\n        message: results.map((r) => r.message).join(\"; \"),\n        namespace: Array.from(byNamespace.keys()).join(\", \"),\n        summary: {\n          created: results.reduce((sum, r) => sum + r.summary.created, 0),\n          updated: results.reduce((sum, r) => sum + r.summary.updated, 0),\n          unchanged: results.reduce((sum, r) => sum + r.summary.unchanged, 0),\n          skipped: results.reduce((sum, r) => sum + r.summary.skipped, 0),\n          applied: results.reduce((sum, r) => sum + r.summary.applied, 0),\n          errors: results.reduce((sum, r) => sum + r.summary.errors, 0),\n        },\n        details: {\n          created: results.flatMap((r) => r.details.created),\n          updated: results.flatMap((r) => r.details.updated),\n          unchanged: results.flatMap((r) => r.details.unchanged),\n          skipped: results.flatMap((r) => r.details.skipped),\n          applied: results.flatMap((r) => r.details.applied),\n          errors: results.flatMap((r) => r.details.errors),\n        },\n        dry_run: options.dry_run ?? false,\n        warnings: results.flatMap((r) => r.warnings || []),\n      };\n\n      // Note: Schema cache is automatically invalidated by the server after migrations are applied.\n      // We call triggerSchemaRefresh as a safeguard to ensure cache is up-to-date.\n      // This is now instant (no server restart required).\n      const migrationsAppliedSuccessfully =\n        combined.summary.applied > 0 && combined.summary.errors === 0;\n      if (!combined.dry_run && migrationsAppliedSuccessfully) {\n        try {\n          await this.triggerSchemaRefresh();\n        } catch (refreshError) {\n          // Log warning but don't fail the sync operation\n          // Cache is already invalidated server-side, so this is just a safeguard\n          console.warn(\"Schema refresh warning:\", refreshError);\n        }\n      }\n\n      // If there were errors during sync, return error with full details\n      if (errors.length > 0 || combined.summary.errors > 0) {\n        const error = new Error(combined.message) as any;\n        error.syncResult = combined;\n        error.details = combined.details.errors;\n        return { data: combined, error };\n      }\n\n      return { data: combined, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new migration\n   *\n   * @param request - Migration configuration\n   * @returns Promise resolving to { data, error } tuple with created migration\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.create({\n   *   namespace: 'myapp',\n   *   name: '001_create_users',\n   *   up_sql: 'CREATE TABLE app.users (id UUID PRIMARY KEY, email TEXT)',\n   *   down_sql: 'DROP TABLE app.users',\n   *   description: 'Create users table'\n   * })\n   * ```\n   */\n  async create(\n    request: CreateMigrationRequest\n  ): Promise<{ data: Migration | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<Migration>(\n        \"/api/v1/admin/migrations\",\n        request\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List migrations in a namespace\n   *\n   * @param namespace - Migration namespace (default: 'default')\n   * @param status - Filter by status: 'pending', 'applied', 'failed', 'rolled_back'\n   * @returns Promise resolving to { data, error } tuple with migrations array\n   *\n   * @example\n   * ```typescript\n   * // List all migrations\n   * const { data, error } = await client.admin.migrations.list('myapp')\n   *\n   * // List only pending migrations\n   * const { data, error } = await client.admin.migrations.list('myapp', 'pending')\n   * ```\n   */\n  async list(\n    namespace: string = \"default\",\n    status?: \"pending\" | \"applied\" | \"failed\" | \"rolled_back\"\n  ): Promise<{ data: Migration[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams({ namespace });\n      if (status) params.append(\"status\", status);\n\n      const data = await this.fetch.get<Migration[]>(\n        `/api/v1/admin/migrations?${params.toString()}`\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific migration\n   *\n   * @param name - Migration name\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple with migration details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.get('001_create_users', 'myapp')\n   * ```\n   */\n  async get(\n    name: string,\n    namespace: string = \"default\"\n  ): Promise<{ data: Migration | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams({ namespace });\n      const data = await this.fetch.get<Migration>(\n        `/api/v1/admin/migrations/${name}?${params.toString()}`\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a migration (only if status is pending)\n   *\n   * @param name - Migration name\n   * @param updates - Fields to update\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple with updated migration\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.update(\n   *   '001_create_users',\n   *   { description: 'Updated description' },\n   *   'myapp'\n   * )\n   * ```\n   */\n  async update(\n    name: string,\n    updates: UpdateMigrationRequest,\n    namespace: string = \"default\"\n  ): Promise<{ data: Migration | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams({ namespace });\n      const data = await this.fetch.put<Migration>(\n        `/api/v1/admin/migrations/${name}?${params.toString()}`,\n        updates\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a migration (only if status is pending)\n   *\n   * @param name - Migration name\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.delete('001_create_users', 'myapp')\n   * ```\n   */\n  async delete(\n    name: string,\n    namespace: string = \"default\"\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams({ namespace });\n      await this.fetch.delete(\n        `/api/v1/admin/migrations/${name}?${params.toString()}`\n      );\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Apply a specific migration\n   *\n   * @param name - Migration name\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple with result message\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.apply('001_create_users', 'myapp')\n   * if (data) {\n   *   console.log(data.message) // \"Migration applied successfully\"\n   * }\n   * ```\n   */\n  async apply(\n    name: string,\n    namespace: string = \"default\"\n  ): Promise<{ data: { message: string } | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<{ message: string }>(\n        `/api/v1/admin/migrations/${name}/apply`,\n        { namespace }\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Rollback a specific migration\n   *\n   * @param name - Migration name\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple with result message\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.rollback('001_create_users', 'myapp')\n   * ```\n   */\n  async rollback(\n    name: string,\n    namespace: string = \"default\"\n  ): Promise<{ data: { message: string } | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<{ message: string }>(\n        `/api/v1/admin/migrations/${name}/rollback`,\n        { namespace }\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Apply all pending migrations in order\n   *\n   * @param namespace - Migration namespace (default: 'default')\n   * @returns Promise resolving to { data, error } tuple with applied/failed counts\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.applyPending('myapp')\n   * if (data) {\n   *   console.log(`Applied: ${data.applied.length}, Failed: ${data.failed.length}`)\n   * }\n   * ```\n   */\n  async applyPending(namespace: string = \"default\"): Promise<{\n    data: { message: string; applied: string[]; failed: string[] } | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.post<{\n        message: string;\n        applied: string[];\n        failed: string[];\n      }>(\"/api/v1/admin/migrations/apply-pending\", { namespace });\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution history for a migration\n   *\n   * @param name - Migration name\n   * @param namespace - Migration namespace (default: 'default')\n   * @param limit - Maximum number of executions to return (default: 50, max: 100)\n   * @returns Promise resolving to { data, error } tuple with execution records\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.migrations.getExecutions(\n   *   '001_create_users',\n   *   'myapp',\n   *   10\n   * )\n   * if (data) {\n   *   data.forEach(exec => {\n   *     console.log(`${exec.executed_at}: ${exec.action} - ${exec.status}`)\n   *   })\n   * }\n   * ```\n   */\n  async getExecutions(\n    name: string,\n    namespace: string = \"default\",\n    limit: number = 50\n  ): Promise<{ data: MigrationExecution[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams({\n        namespace,\n        limit: limit.toString(),\n      });\n      const data = await this.fetch.get<MigrationExecution[]>(\n        `/api/v1/admin/migrations/${name}/executions?${params.toString()}`\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * Admin Jobs module for managing job functions and executions\n * Provides administrative operations for job lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  JobFunction,\n  Job,\n  JobStats,\n  JobWorker,\n  SyncJobsResult,\n  JobFunctionSpec,\n  SyncJobsOptions,\n} from \"./types\";\nimport {\n  bundleCode,\n  loadEsbuild,\n  loadImportMap,\n  denoExternalPlugin,\n  type BundleOptions,\n  type BundleResult,\n} from \"./bundling\";\n\n// Re-export bundling utilities for backwards compatibility\nexport { denoExternalPlugin, loadImportMap };\nexport type { BundleOptions, BundleResult };\n\n/**\n * Admin Jobs manager for managing background job functions\n * Provides create, update, delete, sync, and monitoring operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminJobs {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Create a new job function\n   *\n   * @param params - Job function configuration\n   * @returns Promise resolving to { data, error } tuple with created job function\n   */\n  async create(params: {\n    name: string;\n    code: string;\n    enabled?: boolean;\n    timeout_seconds?: number;\n    namespace?: string;\n  }): Promise<{ data: JobFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<JobFunction>(\n        \"/api/v1/admin/jobs/functions\",\n        params,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all namespaces that have job functions\n   *\n   * @returns Promise resolving to { data, error } tuple with array of namespace strings\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.listNamespaces()\n   * if (data) {\n   *   console.log('Available namespaces:', data)\n   * }\n   * ```\n   */\n  async listNamespaces(): Promise<{\n    data: string[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const response = await this.fetch.get<{ namespaces: string[] }>(\n        \"/api/v1/admin/jobs/namespaces\",\n      );\n      return { data: response.namespaces || [\"default\"], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all job functions (admin view)\n   *\n   * @param namespace - Optional namespace filter\n   * @returns Promise resolving to { data, error } tuple with array of job functions\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.list('default')\n   * if (data) {\n   *   console.log('Job functions:', data.map(f => f.name))\n   * }\n   * ```\n   */\n  async list(\n    namespace?: string,\n  ): Promise<{ data: JobFunction[] | null; error: Error | null }> {\n    try {\n      const params = namespace ? `?namespace=${namespace}` : \"\";\n      const data = await this.fetch.get<JobFunction[]>(\n        `/api/v1/admin/jobs/functions${params}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific job function\n   *\n   * @param namespace - Namespace\n   * @param name - Job function name\n   * @returns Promise resolving to { data, error } tuple with job function metadata\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.get('default', 'process-data')\n   * if (data) {\n   *   console.log('Job function version:', data.version)\n   * }\n   * ```\n   */\n  async get(\n    namespace: string,\n    name: string,\n  ): Promise<{ data: JobFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<JobFunction>(\n        `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a job function\n   *\n   * @param namespace - Namespace\n   * @param name - Job function name\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.delete('default', 'process-data')\n   * ```\n   */\n  async delete(\n    namespace: string,\n    name: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(\n        `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n      );\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update an existing job function\n   *\n   * @param namespace - Namespace\n   * @param name - Job function name\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated job function\n   */\n  async update(\n    namespace: string,\n    name: string,\n    updates: {\n      enabled?: boolean;\n      timeout_seconds?: number;\n      code?: string;\n    },\n  ): Promise<{ data: JobFunction | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<JobFunction>(\n        `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n        updates,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all jobs (executions) across all namespaces (admin view)\n   *\n   * @param filters - Optional filters (status, namespace, limit, offset)\n   * @returns Promise resolving to { data, error } tuple with array of jobs\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.listJobs({\n   *   status: 'running',\n   *   namespace: 'default',\n   *   limit: 50\n   * })\n   * if (data) {\n   *   data.forEach(job => {\n   *     console.log(`${job.job_name}: ${job.status}`)\n   *   })\n   * }\n   * ```\n   */\n  async listJobs(filters?: {\n    status?: string;\n    namespace?: string;\n    limit?: number;\n    offset?: number;\n    includeResult?: boolean;\n  }): Promise<{ data: Job[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n      if (filters?.status) params.append(\"status\", filters.status);\n      if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n      if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n      if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n      if (filters?.includeResult) params.append(\"include_result\", \"true\");\n\n      const queryString = params.toString();\n      const data = await this.fetch.get<Job[]>(\n        `/api/v1/admin/jobs/queue${queryString ? `?${queryString}` : \"\"}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific job (execution)\n   *\n   * @param jobId - Job ID\n   * @returns Promise resolving to { data, error } tuple with job details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.getJob('550e8400-e29b-41d4-a716-446655440000')\n   * if (data) {\n   *   console.log(`Job ${data.job_name}: ${data.status}`)\n   * }\n   * ```\n   */\n  async getJob(\n    jobId: string,\n  ): Promise<{ data: Job | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<Job>(\n        `/api/v1/admin/jobs/queue/${jobId}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Cancel a running or pending job\n   *\n   * @param jobId - Job ID\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/cancel`, {});\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Terminate a running job immediately\n   *\n   * @param jobId - Job ID\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.terminate('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async terminate(jobId: string): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/terminate`, {});\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Retry a failed job\n   *\n   * @param jobId - Job ID\n   * @returns Promise resolving to { data, error } tuple with new job\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async retry(\n    jobId: string,\n  ): Promise<{ data: Job | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<Job>(\n        `/api/v1/admin/jobs/queue/${jobId}/retry`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get job statistics\n   *\n   * @param namespace - Optional namespace filter\n   * @returns Promise resolving to { data, error } tuple with job stats\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.getStats('default')\n   * if (data) {\n   *   console.log(`Pending: ${data.pending}, Running: ${data.running}`)\n   * }\n   * ```\n   */\n  async getStats(\n    namespace?: string,\n  ): Promise<{ data: JobStats | null; error: Error | null }> {\n    try {\n      const params = namespace ? `?namespace=${namespace}` : \"\";\n      const data = await this.fetch.get<JobStats>(\n        `/api/v1/admin/jobs/stats${params}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List active workers\n   *\n   * @returns Promise resolving to { data, error } tuple with array of workers\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.listWorkers()\n   * if (data) {\n   *   data.forEach(worker => {\n   *     console.log(`Worker ${worker.id}: ${worker.current_jobs} jobs`)\n   *   })\n   * }\n   * ```\n   */\n  async listWorkers(): Promise<{\n    data: JobWorker[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.get<JobWorker[]>(\n        \"/api/v1/admin/jobs/workers\",\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Sync multiple job functions to a namespace\n   *\n   * Can sync from:\n   * 1. Filesystem (if no jobs provided) - loads from configured jobs directory\n   * 2. API payload (if jobs array provided) - syncs provided job specifications\n   *\n   * Requires service_role or admin authentication.\n   *\n   * @param options - Sync options including namespace and optional jobs array\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * // Sync from filesystem\n   * const { data, error } = await client.admin.jobs.sync({ namespace: 'default' })\n   *\n   * // Sync with pre-bundled code (client-side bundling)\n   * const bundled = await FluxbaseAdminJobs.bundleCode({ code: myJobCode })\n   * const { data, error } = await client.admin.jobs.sync({\n   *   namespace: 'default',\n   *   functions: [{\n   *     name: 'my-job',\n   *     code: bundled.code,\n   *     is_pre_bundled: true,\n   *     original_code: myJobCode,\n   *   }],\n   *   options: {\n   *     delete_missing: true, // Remove jobs not in this sync\n   *     dry_run: false,       // Preview changes without applying\n   *   }\n   * })\n   *\n   * if (data) {\n   *   console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n   * }\n   * ```\n   */\n  async sync(\n    options: SyncJobsOptions | string,\n  ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n    try {\n      // Support legacy string-only namespace argument\n      const syncOptions: SyncJobsOptions =\n        typeof options === \"string\" ? { namespace: options } : options;\n\n      const data = await this.fetch.post<SyncJobsResult>(\n        \"/api/v1/admin/jobs/sync\",\n        {\n          namespace: syncOptions.namespace,\n          jobs: syncOptions.functions,\n          options: {\n            delete_missing: syncOptions.options?.delete_missing ?? false,\n            dry_run: syncOptions.options?.dry_run ?? false,\n          },\n        },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Sync job functions with automatic client-side bundling\n   *\n   * This is a convenience method that bundles all job code using esbuild\n   * before sending to the server. Requires esbuild as a peer dependency.\n   *\n   * @param options - Sync options including namespace and jobs array\n   * @param bundleOptions - Optional bundling configuration\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.jobs.syncWithBundling({\n   *   namespace: 'default',\n   *   functions: [\n   *     { name: 'process-data', code: processDataCode },\n   *     { name: 'send-email', code: sendEmailCode },\n   *   ],\n   *   options: { delete_missing: true }\n   * })\n   * ```\n   */\n  async syncWithBundling(\n    options: SyncJobsOptions,\n    bundleOptions?: Partial<BundleOptions>,\n  ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n    if (!options.functions || options.functions.length === 0) {\n      return this.sync(options);\n    }\n\n    // Check if esbuild is available\n    const hasEsbuild = await loadEsbuild();\n    if (!hasEsbuild) {\n      return {\n        data: null,\n        error: new Error(\n          \"esbuild is required for client-side bundling. Install it with: npm install esbuild\",\n        ),\n      };\n    }\n\n    try {\n      // Bundle each function\n      const bundledFunctions: JobFunctionSpec[] = await Promise.all(\n        options.functions.map(async (fn) => {\n          // Skip if already pre-bundled\n          if (fn.is_pre_bundled) {\n            return fn;\n          }\n\n          const bundled = await FluxbaseAdminJobs.bundleCode({\n            // Apply global bundle options first\n            ...bundleOptions,\n            // Then override with per-function values (these take priority)\n            code: fn.code,\n            // Use function's sourceDir for resolving relative imports\n            baseDir: fn.sourceDir || bundleOptions?.baseDir,\n            // Use function's nodePaths for additional module resolution\n            nodePaths: fn.nodePaths || bundleOptions?.nodePaths,\n          });\n\n          return {\n            ...fn,\n            code: bundled.code,\n            original_code: fn.code,\n            is_pre_bundled: true,\n          };\n        }),\n      );\n\n      // Sync with pre-bundled code\n      return this.sync({\n        ...options,\n        functions: bundledFunctions,\n      });\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Bundle job code using esbuild (client-side)\n   *\n   * Transforms and bundles TypeScript/JavaScript code into a single file\n   * that can be executed by the Fluxbase jobs runtime.\n   *\n   * Requires esbuild as a peer dependency.\n   *\n   * @param options - Bundle options including source code\n   * @returns Promise resolving to bundled code\n   * @throws Error if esbuild is not available\n   *\n   * @example\n   * ```typescript\n   * const bundled = await FluxbaseAdminJobs.bundleCode({\n   *   code: `\n   *     import { helper } from './utils'\n   *     export async function handler(req) {\n   *       return helper(req.payload)\n   *     }\n   *   `,\n   *   minify: true,\n   * })\n   *\n   * // Use bundled code in sync\n   * await client.admin.jobs.sync({\n   *   namespace: 'default',\n   *   functions: [{\n   *     name: 'my-job',\n   *     code: bundled.code,\n   *     is_pre_bundled: true,\n   *   }]\n   * })\n   * ```\n   */\n  static async bundleCode(options: BundleOptions): Promise<BundleResult> {\n    return bundleCode(options);\n  }\n}\n","/**\n * Admin AI module for managing AI chatbots and providers\n * Provides administrative operations for chatbot lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  AIChatbot,\n  AIChatbotSummary,\n  AIProvider,\n  SyncChatbotsOptions,\n  SyncChatbotsResult,\n  ChatbotKnowledgeBaseLink,\n  LinkKnowledgeBaseRequest,\n  UpdateChatbotKnowledgeBaseRequest,\n  TableDetails,\n} from \"./types\";\n\n/**\n * Admin AI manager for managing AI chatbots and providers\n * Provides create, update, delete, sync, and monitoring operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminAI {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  // ============================================================================\n  // CHATBOT MANAGEMENT\n  // ============================================================================\n\n  /**\n   * List all chatbots (admin view)\n   *\n   * @param namespace - Optional namespace filter\n   * @returns Promise resolving to { data, error } tuple with array of chatbot summaries\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.listChatbots()\n   * if (data) {\n   *   console.log('Chatbots:', data.map(c => c.name))\n   * }\n   * ```\n   */\n  async listChatbots(\n    namespace?: string,\n  ): Promise<{ data: AIChatbotSummary[] | null; error: Error | null }> {\n    try {\n      const params = namespace ? `?namespace=${namespace}` : \"\";\n      const response = await this.fetch.get<{\n        chatbots: AIChatbotSummary[];\n        count: number;\n      }>(`/api/v1/admin/ai/chatbots${params}`);\n      return { data: response.chatbots || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific chatbot\n   *\n   * @param id - Chatbot ID\n   * @returns Promise resolving to { data, error } tuple with chatbot details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.getChatbot('uuid')\n   * if (data) {\n   *   console.log('Chatbot:', data.name)\n   * }\n   * ```\n   */\n  async getChatbot(\n    id: string,\n  ): Promise<{ data: AIChatbot | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<AIChatbot>(\n        `/api/v1/admin/ai/chatbots/${id}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Enable or disable a chatbot\n   *\n   * @param id - Chatbot ID\n   * @param enabled - Whether to enable or disable\n   * @returns Promise resolving to { data, error } tuple with updated chatbot\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.toggleChatbot('uuid', true)\n   * ```\n   */\n  async toggleChatbot(\n    id: string,\n    enabled: boolean,\n  ): Promise<{ data: AIChatbot | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<AIChatbot>(\n        `/api/v1/admin/ai/chatbots/${id}/toggle`,\n        { enabled },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a chatbot\n   *\n   * @param id - Chatbot ID\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.deleteChatbot('uuid')\n   * ```\n   */\n  async deleteChatbot(\n    id: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/admin/ai/chatbots/${id}`);\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Sync chatbots from filesystem or API payload\n   *\n   * Can sync from:\n   * 1. Filesystem (if no chatbots provided) - loads from configured chatbots directory\n   * 2. API payload (if chatbots array provided) - syncs provided chatbot specifications\n   *\n   * Requires service_role or admin authentication.\n   *\n   * @param options - Sync options including namespace and optional chatbots array\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * // Sync from filesystem\n   * const { data, error } = await client.admin.ai.sync()\n   *\n   * // Sync with provided chatbot code\n   * const { data, error } = await client.admin.ai.sync({\n   *   namespace: 'default',\n   *   chatbots: [{\n   *     name: 'sql-assistant',\n   *     code: myChatbotCode,\n   *   }],\n   *   options: {\n   *     delete_missing: false, // Don't remove chatbots not in this sync\n   *     dry_run: false,        // Preview changes without applying\n   *   }\n   * })\n   *\n   * if (data) {\n   *   console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n   * }\n   * ```\n   */\n  async sync(\n    options?: SyncChatbotsOptions,\n  ): Promise<{ data: SyncChatbotsResult | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<SyncChatbotsResult>(\n        \"/api/v1/admin/ai/chatbots/sync\",\n        {\n          namespace: options?.namespace || \"default\",\n          chatbots: options?.chatbots,\n          options: {\n            delete_missing: options?.options?.delete_missing ?? false,\n            dry_run: options?.options?.dry_run ?? false,\n          },\n        },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ============================================================================\n  // PROVIDER MANAGEMENT\n  // ============================================================================\n\n  /**\n   * List all AI providers\n   *\n   * @returns Promise resolving to { data, error } tuple with array of providers\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.listProviders()\n   * if (data) {\n   *   console.log('Providers:', data.map(p => p.name))\n   * }\n   * ```\n   */\n  async listProviders(): Promise<{\n    data: AIProvider[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const response = await this.fetch.get<{\n        providers: AIProvider[];\n        count: number;\n      }>(\"/api/v1/admin/ai/providers\");\n      return { data: response.providers || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific AI provider\n   *\n   * @param id - Provider ID\n   * @returns Promise resolving to { data, error } tuple with provider details\n   */\n  async getProvider(\n    id: string,\n  ): Promise<{ data: AIProvider | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<AIProvider>(\n        `/api/v1/admin/ai/providers/${id}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new AI provider\n   *\n   * @param params - Provider configuration including name, provider_type, and optional config\n   * @returns Promise resolving to { data, error } tuple with created provider\n   */\n  async createProvider(params: {\n    name: string;\n    display_name?: string;\n    provider_type: string;\n    is_default?: boolean;\n    config?: Record<string, unknown>;\n  }): Promise<{ data: AIProvider | null; error: Error | null }> {\n    try {\n      const body: Record<string, unknown> = {\n        name: params.name,\n        provider_type: params.provider_type,\n      };\n      if (params.display_name !== undefined)\n        body.display_name = params.display_name;\n      if (params.is_default !== undefined) body.is_default = params.is_default;\n      if (params.config) {\n        body.config = normalizeConfig(params.config);\n      }\n      const data = await this.fetch.post<AIProvider>(\n        \"/api/v1/admin/ai/providers\",\n        body,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update an existing AI provider\n   *\n   * @param id - Provider ID\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated provider\n   */\n  async updateProvider(\n    id: string,\n    updates: {\n      display_name?: string;\n      enabled?: boolean;\n      config?: Record<string, unknown>;\n      embedding_model?: string | null;\n    },\n  ): Promise<{ data: AIProvider | null; error: Error | null }> {\n    try {\n      const body: Record<string, unknown> = { ...updates };\n      if (updates.config) {\n        body.config = normalizeConfig(updates.config);\n      }\n      const data = await this.fetch.put<AIProvider>(\n        `/api/v1/admin/ai/providers/${id}`,\n        body,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Set a provider as the default provider\n   *\n   * @param id - Provider ID\n   * @returns Promise resolving to { data, error } tuple with updated provider\n   */\n  async setDefaultProvider(\n    id: string,\n  ): Promise<{ data: AIProvider | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<AIProvider>(\n        `/api/v1/admin/ai/providers/${id}/default`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete an AI provider\n   *\n   * @param id - Provider ID\n   * @returns Promise resolving to { data, error } tuple\n   */\n  async deleteProvider(\n    id: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/admin/ai/providers/${id}`);\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Set a provider as the embedding provider\n   *\n   * @param id - Provider ID\n   * @returns Promise resolving to { data, error } tuple with updated provider\n   */\n  async setEmbeddingProvider(\n    id: string,\n  ): Promise<{\n    data: { use_for_embeddings: boolean } | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.put<{ use_for_embeddings: boolean }>(\n        `/api/v1/admin/ai/providers/${id}/embedding`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Clear the embedding provider assignment for a provider\n   *\n   * @param id - Provider ID\n   * @returns Promise resolving to { data, error } tuple\n   */\n  async clearEmbeddingProvider(\n    id: string,\n  ): Promise<{\n    data: { use_for_embeddings: boolean } | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.delete<{ use_for_embeddings: boolean }>(\n        `/api/v1/admin/ai/providers/${id}/embedding`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ============================================================================\n  // CHATBOT KNOWLEDGE BASE LINKING\n  // ============================================================================\n\n  /**\n   * List knowledge bases linked to a chatbot\n   *\n   * @param chatbotId - Chatbot ID\n   * @returns Promise resolving to { data, error } tuple with linked knowledge bases\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.listChatbotKnowledgeBases('chatbot-uuid')\n   * if (data) {\n   *   console.log('Linked KBs:', data.map(l => l.knowledge_base_id))\n   * }\n   * ```\n   */\n  async listChatbotKnowledgeBases(\n    chatbotId: string,\n  ): Promise<{ data: ChatbotKnowledgeBaseLink[] | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<{\n        knowledge_bases: ChatbotKnowledgeBaseLink[];\n        count: number;\n      }>(`/api/v1/admin/ai/chatbots/${chatbotId}/knowledge-bases`);\n      return { data: response.knowledge_bases || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Link a knowledge base to a chatbot\n   *\n   * @param chatbotId - Chatbot ID\n   * @param request - Link configuration\n   * @returns Promise resolving to { data, error } tuple with link details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.linkKnowledgeBase('chatbot-uuid', {\n   *   knowledge_base_id: 'kb-uuid',\n   *   priority: 1,\n   *   max_chunks: 5,\n   *   similarity_threshold: 0.7,\n   * })\n   * ```\n   */\n  async linkKnowledgeBase(\n    chatbotId: string,\n    request: LinkKnowledgeBaseRequest,\n  ): Promise<{ data: ChatbotKnowledgeBaseLink | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<ChatbotKnowledgeBaseLink>(\n        `/api/v1/admin/ai/chatbots/${chatbotId}/knowledge-bases`,\n        request,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a chatbot-knowledge base link\n   *\n   * @param chatbotId - Chatbot ID\n   * @param knowledgeBaseId - Knowledge base ID\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated link\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.updateChatbotKnowledgeBase(\n   *   'chatbot-uuid',\n   *   'kb-uuid',\n   *   { max_chunks: 10, enabled: true }\n   * )\n   * ```\n   */\n  async updateChatbotKnowledgeBase(\n    chatbotId: string,\n    knowledgeBaseId: string,\n    updates: UpdateChatbotKnowledgeBaseRequest,\n  ): Promise<{ data: ChatbotKnowledgeBaseLink | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<ChatbotKnowledgeBaseLink>(\n        `/api/v1/admin/ai/chatbots/${chatbotId}/knowledge-bases/${knowledgeBaseId}`,\n        updates,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Unlink a knowledge base from a chatbot\n   *\n   * @param chatbotId - Chatbot ID\n   * @param knowledgeBaseId - Knowledge base ID\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.unlinkKnowledgeBase('chatbot-uuid', 'kb-uuid')\n   * ```\n   */\n  async unlinkKnowledgeBase(\n    chatbotId: string,\n    knowledgeBaseId: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(\n        `/api/v1/admin/ai/chatbots/${chatbotId}/knowledge-bases/${knowledgeBaseId}`,\n      );\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ============================================================================\n  // TABLE DETAILS\n  // ============================================================================\n\n  /**\n   * Get detailed table information including columns\n   *\n   * Use this to discover available columns before exporting.\n   *\n   * @param schema - Schema name (e.g., 'public')\n   * @param table - Table name\n   * @returns Promise resolving to { data, error } tuple with table details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.ai.getTableDetails('public', 'users')\n   * if (data) {\n   *   console.log('Columns:', data.columns.map(c => c.name))\n   *   console.log('Primary key:', data.primary_key)\n   * }\n   * ```\n   */\n  async getTableDetails(\n    schema: string,\n    table: string,\n  ): Promise<{ data: TableDetails | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<TableDetails>(\n        `/api/v1/admin/ai/tables/${schema}/${table}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n\n/**\n * Normalize config values: convert non-strings to strings, drop null/undefined entries.\n */\nfunction normalizeConfig(\n  config: Record<string, unknown>,\n): Record<string, string> {\n  const result: Record<string, string> = {};\n  for (const [key, value] of Object.entries(config)) {\n    if (value === undefined || value === null) continue;\n    result[key] = String(value);\n  }\n  return result;\n}\n","/**\n * Admin RPC module for managing RPC procedures\n * Provides administrative operations for RPC procedure lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  RPCProcedure,\n  RPCProcedureSummary,\n  RPCExecution,\n  RPCExecutionLog,\n  SyncRPCOptions,\n  SyncRPCResult,\n  UpdateRPCProcedureRequest,\n  RPCExecutionFilters,\n} from \"./types\";\n\n/**\n * Admin RPC manager for managing RPC procedures\n * Provides sync, CRUD, and execution monitoring operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminRPC {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  // ============================================================================\n  // PROCEDURE MANAGEMENT\n  // ============================================================================\n\n  /**\n   * Sync RPC procedures from filesystem or API payload\n   *\n   * Can sync from:\n   * 1. Filesystem (if no procedures provided) - loads from configured procedures directory\n   * 2. API payload (if procedures array provided) - syncs provided procedure specifications\n   *\n   * Requires service_role or admin authentication.\n   *\n   * @param options - Sync options including namespace and optional procedures array\n   * @returns Promise resolving to { data, error } tuple with sync results\n   *\n   * @example\n   * ```typescript\n   * // Sync from filesystem\n   * const { data, error } = await client.admin.rpc.sync()\n   *\n   * // Sync with provided procedure code\n   * const { data, error } = await client.admin.rpc.sync({\n   *   namespace: 'default',\n   *   procedures: [{\n   *     name: 'get-user-orders',\n   *     code: myProcedureSQL,\n   *   }],\n   *   options: {\n   *     delete_missing: false, // Don't remove procedures not in this sync\n   *     dry_run: false,        // Preview changes without applying\n   *   }\n   * })\n   *\n   * if (data) {\n   *   console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n   * }\n   * ```\n   */\n  async sync(\n    options?: SyncRPCOptions,\n  ): Promise<{ data: SyncRPCResult | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<SyncRPCResult>(\n        \"/api/v1/admin/rpc/sync\",\n        {\n          namespace: options?.namespace || \"default\",\n          procedures: options?.procedures,\n          options: {\n            delete_missing: options?.options?.delete_missing ?? false,\n            dry_run: options?.options?.dry_run ?? false,\n          },\n        },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all RPC procedures (admin view)\n   *\n   * @param namespace - Optional namespace filter\n   * @returns Promise resolving to { data, error } tuple with array of procedure summaries\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.list()\n   * if (data) {\n   *   console.log('Procedures:', data.map(p => p.name))\n   * }\n   * ```\n   */\n  async list(\n    namespace?: string,\n  ): Promise<{ data: RPCProcedureSummary[] | null; error: Error | null }> {\n    try {\n      const params = namespace ? `?namespace=${encodeURIComponent(namespace)}` : \"\";\n      const response = await this.fetch.get<{ procedures: RPCProcedureSummary[]; count: number }>(\n        `/api/v1/admin/rpc/procedures${params}`,\n      );\n      return { data: response.procedures || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List all namespaces\n   *\n   * @returns Promise resolving to { data, error } tuple with array of namespace names\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.listNamespaces()\n   * if (data) {\n   *   console.log('Namespaces:', data)\n   * }\n   * ```\n   */\n  async listNamespaces(): Promise<{ data: string[] | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<{ namespaces: string[] }>(\n        \"/api/v1/admin/rpc/namespaces\",\n      );\n      return { data: response.namespaces || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific RPC procedure\n   *\n   * @param namespace - Procedure namespace\n   * @param name - Procedure name\n   * @returns Promise resolving to { data, error } tuple with procedure details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.get('default', 'get-user-orders')\n   * if (data) {\n   *   console.log('Procedure:', data.name)\n   *   console.log('SQL:', data.sql_query)\n   * }\n   * ```\n   */\n  async get(\n    namespace: string,\n    name: string,\n  ): Promise<{ data: RPCProcedure | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<RPCProcedure>(\n        `/api/v1/admin/rpc/procedures/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update an RPC procedure\n   *\n   * @param namespace - Procedure namespace\n   * @param name - Procedure name\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated procedure\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.update('default', 'get-user-orders', {\n   *   enabled: false,\n   *   max_execution_time_seconds: 60,\n   * })\n   * ```\n   */\n  async update(\n    namespace: string,\n    name: string,\n    updates: UpdateRPCProcedureRequest,\n  ): Promise<{ data: RPCProcedure | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<RPCProcedure>(\n        `/api/v1/admin/rpc/procedures/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n        updates,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Enable or disable an RPC procedure\n   *\n   * @param namespace - Procedure namespace\n   * @param name - Procedure name\n   * @param enabled - Whether to enable or disable\n   * @returns Promise resolving to { data, error } tuple with updated procedure\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.toggle('default', 'get-user-orders', true)\n   * ```\n   */\n  async toggle(\n    namespace: string,\n    name: string,\n    enabled: boolean,\n  ): Promise<{ data: RPCProcedure | null; error: Error | null }> {\n    return this.update(namespace, name, { enabled });\n  }\n\n  /**\n   * Delete an RPC procedure\n   *\n   * @param namespace - Procedure namespace\n   * @param name - Procedure name\n   * @returns Promise resolving to { data, error } tuple\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.delete('default', 'get-user-orders')\n   * ```\n   */\n  async delete(\n    namespace: string,\n    name: string,\n  ): Promise<{ data: null; error: Error | null }> {\n    try {\n      await this.fetch.delete(\n        `/api/v1/admin/rpc/procedures/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}`,\n      );\n      return { data: null, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ============================================================================\n  // EXECUTION MONITORING\n  // ============================================================================\n\n  /**\n   * List RPC executions with optional filters\n   *\n   * @param filters - Optional filters for namespace, procedure, status, user\n   * @returns Promise resolving to { data, error } tuple with array of executions\n   *\n   * @example\n   * ```typescript\n   * // List all executions\n   * const { data, error } = await client.admin.rpc.listExecutions()\n   *\n   * // List failed executions for a specific procedure\n   * const { data, error } = await client.admin.rpc.listExecutions({\n   *   namespace: 'default',\n   *   procedure: 'get-user-orders',\n   *   status: 'failed',\n   * })\n   * ```\n   */\n  async listExecutions(\n    filters?: RPCExecutionFilters,\n  ): Promise<{ data: RPCExecution[] | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n      if (filters?.namespace) params.set(\"namespace\", filters.namespace);\n      if (filters?.procedure) params.set(\"procedure_name\", filters.procedure);\n      if (filters?.status) params.set(\"status\", filters.status);\n      if (filters?.user_id) params.set(\"user_id\", filters.user_id);\n      if (filters?.limit) params.set(\"limit\", filters.limit.toString());\n      if (filters?.offset) params.set(\"offset\", filters.offset.toString());\n\n      const queryString = params.toString();\n      const path = queryString\n        ? `/api/v1/admin/rpc/executions?${queryString}`\n        : \"/api/v1/admin/rpc/executions\";\n\n      const response = await this.fetch.get<{ executions: RPCExecution[]; count: number }>(path);\n      return { data: response.executions || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific execution\n   *\n   * @param executionId - Execution ID\n   * @returns Promise resolving to { data, error } tuple with execution details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.getExecution('execution-uuid')\n   * if (data) {\n   *   console.log('Status:', data.status)\n   *   console.log('Duration:', data.duration_ms, 'ms')\n   * }\n   * ```\n   */\n  async getExecution(\n    executionId: string,\n  ): Promise<{ data: RPCExecution | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<RPCExecution>(\n        `/api/v1/admin/rpc/executions/${encodeURIComponent(executionId)}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get execution logs for a specific execution\n   *\n   * @param executionId - Execution ID\n   * @param afterLine - Optional line number to get logs after (for polling)\n   * @returns Promise resolving to { data, error } tuple with execution logs\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.getExecutionLogs('execution-uuid')\n   * if (data) {\n   *   for (const log of data) {\n   *     console.log(`[${log.level}] ${log.message}`)\n   *   }\n   * }\n   * ```\n   */\n  async getExecutionLogs(\n    executionId: string,\n    afterLine?: number,\n  ): Promise<{ data: RPCExecutionLog[] | null; error: Error | null }> {\n    try {\n      const params = afterLine !== undefined ? `?after=${afterLine}` : \"\";\n      const response = await this.fetch.get<{ logs: RPCExecutionLog[]; count: number }>(\n        `/api/v1/admin/rpc/executions/${encodeURIComponent(executionId)}/logs${params}`,\n      );\n      return { data: response.logs || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Cancel a running execution\n   *\n   * @param executionId - Execution ID\n   * @returns Promise resolving to { data, error } tuple with updated execution\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.rpc.cancelExecution('execution-uuid')\n   * ```\n   */\n  async cancelExecution(\n    executionId: string,\n  ): Promise<{ data: RPCExecution | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<RPCExecution>(\n        `/api/v1/admin/rpc/executions/${encodeURIComponent(executionId)}/cancel`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  AdminListBucketsResponse,\n  AdminListObjectsResponse,\n  AdminStorageObject,\n  DataResponse,\n  VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\n/**\n * Admin storage manager for bucket and object management\n */\nexport class FluxbaseAdminStorage {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  // ============================================================================\n  // Bucket Operations\n  // ============================================================================\n\n  /**\n   * List all storage buckets\n   *\n   * @returns List of buckets\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await admin.storage.listBuckets();\n   * if (data) {\n   *   console.log(`Found ${data.buckets.length} buckets`);\n   * }\n   * ```\n   */\n  async listBuckets(): Promise<DataResponse<AdminListBucketsResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<AdminListBucketsResponse>(\n        \"/api/v1/storage/buckets\"\n      );\n    });\n  }\n\n  /**\n   * Create a new storage bucket\n   *\n   * @param name - Bucket name\n   * @returns Success message\n   *\n   * @example\n   * ```typescript\n   * const { error } = await admin.storage.createBucket('my-bucket');\n   * if (!error) {\n   *   console.log('Bucket created');\n   * }\n   * ```\n   */\n  async createBucket(name: string): Promise<DataResponse<{ message: string }>> {\n    return wrapAsync(async () => {\n      return await this.fetch.post<{ message: string }>(\n        `/api/v1/storage/buckets/${encodeURIComponent(name)}`\n      );\n    });\n  }\n\n  /**\n   * Delete a storage bucket\n   *\n   * @param name - Bucket name\n   * @returns Success message\n   *\n   * @example\n   * ```typescript\n   * const { error } = await admin.storage.deleteBucket('my-bucket');\n   * if (!error) {\n   *   console.log('Bucket deleted');\n   * }\n   * ```\n   */\n  async deleteBucket(name: string): Promise<DataResponse<{ message: string }>> {\n    return wrapAsync(async () => {\n      return await this.fetch.delete<{ message: string }>(\n        `/api/v1/storage/buckets/${encodeURIComponent(name)}`\n      );\n    });\n  }\n\n  // ============================================================================\n  // Object Operations\n  // ============================================================================\n\n  /**\n   * List objects in a bucket\n   *\n   * @param bucket - Bucket name\n   * @param prefix - Optional path prefix to filter results\n   * @param delimiter - Optional delimiter for hierarchical listing (usually '/')\n   * @returns List of objects and prefixes (folders)\n   *\n   * @example\n   * ```typescript\n   * // List all objects in bucket\n   * const { data } = await admin.storage.listObjects('my-bucket');\n   *\n   * // List objects in a folder\n   * const { data } = await admin.storage.listObjects('my-bucket', 'folder/', '/');\n   * ```\n   */\n  async listObjects(\n    bucket: string,\n    prefix?: string,\n    delimiter?: string\n  ): Promise<DataResponse<AdminListObjectsResponse>> {\n    return wrapAsync(async () => {\n      const params = new URLSearchParams();\n      if (prefix) params.append(\"prefix\", prefix);\n      if (delimiter) params.append(\"delimiter\", delimiter);\n\n      const queryString = params.toString();\n      const url = `/api/v1/storage/${encodeURIComponent(bucket)}${queryString ? `?${queryString}` : \"\"}`;\n\n      return await this.fetch.get<AdminListObjectsResponse>(url);\n    });\n  }\n\n  /**\n   * Get object metadata\n   *\n   * @param bucket - Bucket name\n   * @param key - Object key (path)\n   * @returns Object metadata\n   *\n   * @example\n   * ```typescript\n   * const { data } = await admin.storage.getObjectMetadata('my-bucket', 'path/to/file.txt');\n   * if (data) {\n   *   console.log(`File size: ${data.size} bytes`);\n   * }\n   * ```\n   */\n  async getObjectMetadata(\n    bucket: string,\n    key: string\n  ): Promise<DataResponse<AdminStorageObject>> {\n    return wrapAsync(async () => {\n      const encodedKey = key\n        .split(\"/\")\n        .map((s) => encodeURIComponent(s))\n        .join(\"/\");\n\n      return await this.fetch.get<AdminStorageObject>(\n        `/api/v1/storage/${encodeURIComponent(bucket)}/${encodedKey}`,\n        {\n          headers: { \"X-Metadata-Only\": \"true\" },\n        }\n      );\n    });\n  }\n\n  /**\n   * Download an object as a Blob\n   *\n   * @param bucket - Bucket name\n   * @param key - Object key (path)\n   * @returns Object data as Blob\n   *\n   * @example\n   * ```typescript\n   * const { data: blob } = await admin.storage.downloadObject('my-bucket', 'file.pdf');\n   * if (blob) {\n   *   // Use the blob\n   *   const url = URL.createObjectURL(blob);\n   * }\n   * ```\n   */\n  async downloadObject(\n    bucket: string,\n    key: string\n  ): Promise<DataResponse<Blob>> {\n    return wrapAsync(async () => {\n      const encodedKey = key\n        .split(\"/\")\n        .map((s) => encodeURIComponent(s))\n        .join(\"/\");\n\n      const response = await this.fetch.getBlob(\n        `/api/v1/storage/${encodeURIComponent(bucket)}/${encodedKey}`\n      );\n      return response;\n    });\n  }\n\n  /**\n   * Delete an object\n   *\n   * @param bucket - Bucket name\n   * @param key - Object key (path)\n   *\n   * @example\n   * ```typescript\n   * const { error } = await admin.storage.deleteObject('my-bucket', 'path/to/file.txt');\n   * if (!error) {\n   *   console.log('Object deleted');\n   * }\n   * ```\n   */\n  async deleteObject(bucket: string, key: string): Promise<VoidResponse> {\n    return wrapAsyncVoid(async () => {\n      const encodedKey = key\n        .split(\"/\")\n        .map((s) => encodeURIComponent(s))\n        .join(\"/\");\n\n      await this.fetch.delete(\n        `/api/v1/storage/${encodeURIComponent(bucket)}/${encodedKey}`\n      );\n    });\n  }\n\n  /**\n   * Create a folder (empty object with directory content type)\n   *\n   * @param bucket - Bucket name\n   * @param folderPath - Folder path (should end with /)\n   *\n   * @example\n   * ```typescript\n   * const { error } = await admin.storage.createFolder('my-bucket', 'new-folder/');\n   * ```\n   */\n  async createFolder(bucket: string, folderPath: string): Promise<VoidResponse> {\n    return wrapAsyncVoid(async () => {\n      const encodedPath = folderPath\n        .split(\"/\")\n        .map((s) => encodeURIComponent(s))\n        .join(\"/\");\n\n      await this.fetch.post(\n        `/api/v1/storage/${encodeURIComponent(bucket)}/${encodedPath}`,\n        null,\n        {\n          headers: { \"Content-Type\": \"application/x-directory\" },\n        }\n      );\n    });\n  }\n\n  /**\n   * Generate a signed URL for a private object\n   *\n   * @param bucket - Bucket name\n   * @param key - Object key (path)\n   * @param expiresIn - URL expiration time in seconds\n   * @returns Signed URL and expiration info\n   *\n   * @example\n   * ```typescript\n   * const { data } = await admin.storage.generateSignedUrl('my-bucket', 'file.pdf', 3600);\n   * if (data) {\n   *   window.open(data.url);\n   * }\n   * ```\n   */\n  async generateSignedUrl(\n    bucket: string,\n    key: string,\n    expiresIn: number\n  ): Promise<DataResponse<{ url: string; expires_in: number }>> {\n    return wrapAsync(async () => {\n      const encodedKey = key\n        .split(\"/\")\n        .map((s) => encodeURIComponent(s))\n        .join(\"/\");\n\n      return await this.fetch.post<{ url: string; expires_in: number }>(\n        `/api/v1/storage/${encodeURIComponent(bucket)}/sign/${encodedKey}`,\n        { expires_in: expiresIn }\n      );\n    });\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  EnableRealtimeRequest,\n  EnableRealtimeResponse,\n  RealtimeTableStatus,\n  ListRealtimeTablesResponse,\n  UpdateRealtimeConfigRequest,\n} from \"./types\";\n\n/**\n * Realtime Admin Manager\n *\n * Provides methods for enabling and managing realtime subscriptions on database tables.\n * When enabled, changes to a table (INSERT, UPDATE, DELETE) are automatically broadcast\n * to WebSocket subscribers.\n *\n * @example\n * ```typescript\n * const realtime = client.admin.realtime\n *\n * // Enable realtime on a table\n * await realtime.enableRealtime('products')\n *\n * // Enable with options\n * await realtime.enableRealtime('orders', {\n *   events: ['INSERT', 'UPDATE'],\n *   exclude: ['internal_notes', 'raw_data']\n * })\n *\n * // List all realtime-enabled tables\n * const { tables } = await realtime.listTables()\n *\n * // Check status of a specific table\n * const status = await realtime.getStatus('public', 'products')\n *\n * // Disable realtime\n * await realtime.disableRealtime('public', 'products')\n * ```\n */\nexport class FluxbaseAdminRealtime {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * Enable realtime on a table\n   *\n   * Creates the necessary database triggers to broadcast changes to WebSocket subscribers.\n   * Also sets REPLICA IDENTITY FULL to include old values in UPDATE/DELETE events.\n   *\n   * @param table - Table name to enable realtime on\n   * @param options - Optional configuration\n   * @returns Promise resolving to EnableRealtimeResponse\n   *\n   * @example\n   * ```typescript\n   * // Enable realtime on products table (all events)\n   * await client.admin.realtime.enableRealtime('products')\n   *\n   * // Enable on a specific schema\n   * await client.admin.realtime.enableRealtime('orders', {\n   *   schema: 'sales'\n   * })\n   *\n   * // Enable specific events only\n   * await client.admin.realtime.enableRealtime('audit_log', {\n   *   events: ['INSERT'] // Only broadcast inserts\n   * })\n   *\n   * // Exclude large columns from notifications\n   * await client.admin.realtime.enableRealtime('posts', {\n   *   exclude: ['content', 'raw_html'] // Skip these in payload\n   * })\n   * ```\n   */\n  async enableRealtime(\n    table: string,\n    options?: {\n      schema?: string;\n      events?: (\"INSERT\" | \"UPDATE\" | \"DELETE\")[];\n      exclude?: string[];\n    },\n  ): Promise<EnableRealtimeResponse> {\n    const request: EnableRealtimeRequest = {\n      schema: options?.schema ?? \"public\",\n      table,\n      events: options?.events,\n      exclude: options?.exclude,\n    };\n    return await this.fetch.post<EnableRealtimeResponse>(\n      \"/api/v1/admin/realtime/tables\",\n      request,\n    );\n  }\n\n  /**\n   * Disable realtime on a table\n   *\n   * Removes the realtime trigger from a table. Existing subscribers will stop\n   * receiving updates for this table.\n   *\n   * @param schema - Schema name\n   * @param table - Table name\n   * @returns Promise resolving to success message\n   *\n   * @example\n   * ```typescript\n   * await client.admin.realtime.disableRealtime('public', 'products')\n   * console.log('Realtime disabled')\n   * ```\n   */\n  async disableRealtime(\n    schema: string,\n    table: string,\n  ): Promise<{ success: boolean; message: string }> {\n    return await this.fetch.delete<{ success: boolean; message: string }>(\n      `/api/v1/admin/realtime/tables/${encodeURIComponent(schema)}/${encodeURIComponent(table)}`,\n    );\n  }\n\n  /**\n   * List all realtime-enabled tables\n   *\n   * Returns a list of all tables that have realtime enabled, along with their\n   * configuration (events, excluded columns, etc.).\n   *\n   * @param options - Optional filter options\n   * @returns Promise resolving to ListRealtimeTablesResponse\n   *\n   * @example\n   * ```typescript\n   * // List all enabled tables\n   * const { tables, count } = await client.admin.realtime.listTables()\n   * console.log(`${count} tables have realtime enabled`)\n   *\n   * tables.forEach(t => {\n   *   console.log(`${t.schema}.${t.table}: ${t.events.join(', ')}`)\n   * })\n   *\n   * // Include disabled tables\n   * const all = await client.admin.realtime.listTables({ includeDisabled: true })\n   * ```\n   */\n  async listTables(options?: {\n    includeDisabled?: boolean;\n  }): Promise<ListRealtimeTablesResponse> {\n    const params = options?.includeDisabled ? \"?enabled=false\" : \"\";\n    return await this.fetch.get<ListRealtimeTablesResponse>(\n      `/api/v1/admin/realtime/tables${params}`,\n    );\n  }\n\n  /**\n   * Get realtime status for a specific table\n   *\n   * Returns the realtime configuration for a table, including whether it's enabled,\n   * which events are tracked, and which columns are excluded.\n   *\n   * @param schema - Schema name\n   * @param table - Table name\n   * @returns Promise resolving to RealtimeTableStatus\n   *\n   * @example\n   * ```typescript\n   * const status = await client.admin.realtime.getStatus('public', 'products')\n   *\n   * if (status.realtime_enabled) {\n   *   console.log('Events:', status.events.join(', '))\n   *   console.log('Excluded:', status.excluded_columns?.join(', ') || 'none')\n   * } else {\n   *   console.log('Realtime not enabled')\n   * }\n   * ```\n   */\n  async getStatus(schema: string, table: string): Promise<RealtimeTableStatus> {\n    return await this.fetch.get<RealtimeTableStatus>(\n      `/api/v1/admin/realtime/tables/${encodeURIComponent(schema)}/${encodeURIComponent(table)}`,\n    );\n  }\n\n  /**\n   * Update realtime configuration for a table\n   *\n   * Modifies the events or excluded columns for a realtime-enabled table\n   * without recreating the trigger.\n   *\n   * @param schema - Schema name\n   * @param table - Table name\n   * @param config - New configuration\n   * @returns Promise resolving to success message\n   *\n   * @example\n   * ```typescript\n   * // Change which events are tracked\n   * await client.admin.realtime.updateConfig('public', 'products', {\n   *   events: ['INSERT', 'UPDATE'] // Stop tracking deletes\n   * })\n   *\n   * // Update excluded columns\n   * await client.admin.realtime.updateConfig('public', 'posts', {\n   *   exclude: ['raw_content', 'search_vector']\n   * })\n   *\n   * // Clear excluded columns\n   * await client.admin.realtime.updateConfig('public', 'posts', {\n   *   exclude: [] // Include all columns again\n   * })\n   * ```\n   */\n  async updateConfig(\n    schema: string,\n    table: string,\n    config: UpdateRealtimeConfigRequest,\n  ): Promise<{ success: boolean; message: string }> {\n    return await this.fetch.patch<{ success: boolean; message: string }>(\n      `/api/v1/admin/realtime/tables/${encodeURIComponent(schema)}/${encodeURIComponent(table)}`,\n      config,\n    );\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  ServiceKey,\n  ServiceKeyWithKey,\n  CreateServiceKeyRequest,\n  UpdateServiceKeyRequest,\n  RevokeServiceKeyRequest,\n  DeprecateServiceKeyRequest,\n} from \"./types\";\n\n/**\n * Service Keys Manager\n *\n * Manages service keys (anon and service) for tenant databases.\n * Each tenant has their own auth.service_keys table.\n *\n * @example\n * ```typescript\n * // List all service keys\n * const { data, error } = await client.admin.serviceKeys.list()\n *\n * // Create a new service key\n * const { data, error } = await client.admin.serviceKeys.create({\n *   name: 'Production API Key',\n *   key_type: 'service',\n *   scopes: ['*']\n * })\n *\n * // Rotate a key\n * const { data, error } = await client.admin.serviceKeys.rotate('key-id')\n * ```\n *\n * @category Admin\n */\nexport class ServiceKeysManager {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * List all service keys\n   *\n   * @returns List of service keys\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.list()\n   * ```\n   */\n  async list(): Promise<{ data: ServiceKey[] | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<ServiceKey[]>(\"/api/v1/admin/service-keys\");\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a service key by ID\n   *\n   * @param id - Service key ID\n   * @returns Service key details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.get('key-id')\n   * ```\n   */\n  async get(\n    id: string,\n  ): Promise<{ data: ServiceKey | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<ServiceKey>(`/api/v1/admin/service-keys/${id}`);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new service key\n   *\n   * The full key value is only returned once - store it securely!\n   *\n   * @param request - Key creation options\n   * @returns Created key with full key value\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.create({\n   *   name: 'Production API Key',\n   *   key_type: 'service',\n   *   scopes: ['*'],\n   *   rate_limit_per_minute: 1000\n   * })\n   *\n   * if (data) {\n   *   // Store data.key securely - it won't be shown again!\n   *   console.log('Key created:', data.key)\n   * }\n   * ```\n   */\n  async create(\n    request: CreateServiceKeyRequest,\n  ): Promise<{ data: ServiceKeyWithKey | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<ServiceKeyWithKey>(\n        \"/api/v1/admin/service-keys\",\n        request,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a service key\n   *\n   * @param id - Service key ID\n   * @param request - Update options\n   * @returns Updated key\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.update('key-id', {\n   *   name: 'New Name',\n   *   rate_limit_per_minute: 2000\n   * })\n   * ```\n   */\n  async update(\n    id: string,\n    request: UpdateServiceKeyRequest,\n  ): Promise<{ data: ServiceKey | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.put<ServiceKey>(\n        `/api/v1/admin/service-keys/${id}`,\n        request,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a service key permanently\n   *\n   * @param id - Service key ID\n   * @returns Success or error\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.admin.serviceKeys.delete('key-id')\n   * ```\n   */\n  async delete(id: string): Promise<{ error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/admin/service-keys/${id}`);\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Disable a service key (temporarily)\n   *\n   * @param id - Service key ID\n   * @returns Success or error\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.admin.serviceKeys.disable('key-id')\n   * ```\n   */\n  async disable(id: string): Promise<{ error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/admin/service-keys/${id}/disable`, {});\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Enable a disabled service key\n   *\n   * @param id - Service key ID\n   * @returns Success or error\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.admin.serviceKeys.enable('key-id')\n   * ```\n   */\n  async enable(id: string): Promise<{ error: Error | null }> {\n    try {\n      await this.fetch.post(`/api/v1/admin/service-keys/${id}/enable`, {});\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Revoke a service key permanently (emergency)\n   *\n   * Use for immediate revocation when a key is compromised.\n   *\n   * @param id - Service key ID\n   * @param request - Revocation options\n   * @returns Success or error\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.admin.serviceKeys.revoke('key-id', {\n   *   reason: 'Key was compromised'\n   * })\n   * ```\n   */\n  async revoke(\n    id: string,\n    request?: RevokeServiceKeyRequest,\n  ): Promise<{ error: Error | null }> {\n    try {\n      const body = request?.reason\n        ? new URLSearchParams({ reason: request.reason })\n        : {};\n      await this.fetch.post(`/api/v1/admin/service-keys/${id}/revoke`, body);\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Deprecate a service key (graceful rotation)\n   *\n   * Marks the key for removal but keeps it active during grace period.\n   *\n   * @param id - Service key ID\n   * @param request - Deprecation options\n   * @returns Deprecation details\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.deprecate('key-id', {\n   *   reason: 'Rotating to new key',\n   *   grace_period_hours: 48\n   * })\n   * ```\n   */\n  async deprecate(\n    id: string,\n    request?: DeprecateServiceKeyRequest,\n  ): Promise<{\n    data: { deprecated_at: string; grace_period_ends_at: string } | null;\n    error: Error | null;\n  }> {\n    try {\n      const params = new URLSearchParams();\n      if (request?.grace_period_hours) {\n        params.set(\"grace_period_hours\", String(request.grace_period_hours));\n      }\n      const body = request?.grace_period_hours\n        ? Object.fromEntries(params)\n        : {};\n      const data = await this.fetch.post<{\n        deprecated_at: string;\n        grace_period_ends_at: string;\n      }>(`/api/v1/admin/service-keys/${id}/deprecate`, body);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Rotate a service key (create replacement)\n   *\n   * Creates a new key with the same settings and deprecates the old one.\n   * The new key is returned with its full value.\n   *\n   * @param id - Service key ID to rotate\n   * @returns New key with full key value\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.rotate('old-key-id')\n   *\n   * if (data) {\n   *   console.log('New key:', data.key)\n   *   console.log('Old key deprecated at:', data.deprecated_at)\n   * }\n   * ```\n   */\n  async rotate(\n    id: string,\n  ): Promise<{ data: ServiceKeyWithKey | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.post<ServiceKeyWithKey>(\n        `/api/v1/admin/service-keys/${id}/rotate`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get revocation history for a service key\n   *\n   * @param id - Service key ID\n   * @returns Revocation history\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.admin.serviceKeys.getRevocationHistory('key-id')\n   * ```\n   */\n  async getRevocationHistory(id: string): Promise<{\n    data: {\n      id: string;\n      name: string;\n      revoked_at: string;\n      revoked_by: string;\n      revocation_reason: string;\n    } | null;\n    error: Error | null;\n  }> {\n    try {\n      const data = await this.fetch.get<{\n        id: string;\n        name: string;\n        revoked_at: string;\n        revoked_by: string;\n        revocation_reason: string;\n      }>(`/api/v1/admin/service-keys/${id}/revocations`);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  AdminAuthResponse,\n  AdminLoginRequest,\n  AdminMeResponse,\n  AdminRefreshRequest,\n  AdminRefreshResponse,\n  AdminSetupRequest,\n  AdminSetupStatusResponse,\n  DeleteUserResponse,\n  EnrichedUser,\n  HealthResponse,\n  InviteUserRequest,\n  InviteUserResponse,\n  ListUsersOptions,\n  ListUsersResponse,\n  ResetUserPasswordResponse,\n  DataResponse,\n  VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\nimport { FluxbaseSettings, EmailTemplateManager } from \"./settings\";\nimport { DDLManager } from \"./ddl\";\nimport { FluxbaseOAuth } from \"./oauth\";\nimport { ImpersonationManager } from \"./impersonation\";\nimport { FluxbaseManagement } from \"./management\";\nimport { FluxbaseAdminFunctions } from \"./admin-functions\";\nimport { FluxbaseAdminMigrations } from \"./admin-migrations\";\nimport { FluxbaseAdminJobs } from \"./admin-jobs\";\nimport { FluxbaseAdminAI } from \"./admin-ai\";\nimport { FluxbaseAdminRPC } from \"./admin-rpc\";\nimport { FluxbaseAdminStorage } from \"./admin-storage\";\nimport { FluxbaseAdminRealtime } from \"./admin-realtime\";\nimport { ServiceKeysManager } from \"./admin-service-keys\";\n\n/**\n * Admin client for managing Fluxbase instance\n */\nexport class FluxbaseAdmin {\n  private fetch: FluxbaseFetch;\n  private adminToken: string | null = null;\n\n  /**\n   * Settings manager for system and application settings\n   */\n  public settings: FluxbaseSettings;\n\n  /**\n   * DDL manager for database schema and table operations\n   */\n  public ddl: DDLManager;\n\n  /**\n   * OAuth configuration manager for provider and auth settings\n   */\n  public oauth: FluxbaseOAuth;\n\n  /**\n   * Impersonation manager for user impersonation and audit trail\n   */\n  public impersonation: ImpersonationManager;\n\n  /**\n   * Management namespace for client keys, webhooks, and invitations\n   */\n  public management: FluxbaseManagement;\n\n  /**\n   * Email template manager for customizing authentication and notification emails\n   */\n  public emailTemplates: EmailTemplateManager;\n\n  /**\n   * Functions manager for edge function management (create, update, delete, sync)\n   */\n  public functions: FluxbaseAdminFunctions;\n\n  /**\n   * Jobs manager for background job management (create, update, delete, sync, monitoring)\n   */\n  public jobs: FluxbaseAdminJobs;\n\n  /**\n   * Migrations manager for database migration operations (create, apply, rollback, sync)\n   */\n  public migrations: FluxbaseAdminMigrations;\n\n  /**\n   * AI manager for chatbot and provider management (create, update, delete, sync)\n   */\n  public ai: FluxbaseAdminAI;\n\n  /**\n   * RPC manager for procedure management (create, update, delete, sync, execution monitoring)\n   */\n  public rpc: FluxbaseAdminRPC;\n\n  /**\n   * Storage manager for bucket and object management (list, create, delete, signed URLs)\n   */\n  public storage: FluxbaseAdminStorage;\n\n  /**\n   * Realtime manager for enabling/disabling realtime on tables\n   */\n  public realtime: FluxbaseAdminRealtime;\n\n  /**\n   * Service keys manager for API key management (list, create, rotate, revoke)\n   */\n  public serviceKeys: ServiceKeysManager;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n    this.settings = new FluxbaseSettings(fetch);\n    this.ddl = new DDLManager(fetch);\n    this.oauth = new FluxbaseOAuth(fetch);\n    this.impersonation = new ImpersonationManager(fetch);\n    this.management = new FluxbaseManagement(fetch);\n    this.emailTemplates = new EmailTemplateManager(fetch);\n    this.functions = new FluxbaseAdminFunctions(fetch);\n    this.jobs = new FluxbaseAdminJobs(fetch);\n    this.migrations = new FluxbaseAdminMigrations(fetch);\n    this.ai = new FluxbaseAdminAI(fetch);\n    this.rpc = new FluxbaseAdminRPC(fetch);\n    this.storage = new FluxbaseAdminStorage(fetch);\n    this.realtime = new FluxbaseAdminRealtime(fetch);\n    this.serviceKeys = new ServiceKeysManager(fetch);\n  }\n\n  /**\n   * Set admin authentication token\n   */\n  setToken(token: string) {\n    this.adminToken = token;\n    this.fetch.setAuthToken(token);\n  }\n\n  /**\n   * Get current admin token\n   */\n  getToken(): string | null {\n    return this.adminToken;\n  }\n\n  /**\n   * Clear admin token\n   */\n  clearToken() {\n    this.adminToken = null;\n    this.fetch.setAuthToken(null);\n  }\n\n  // ============================================================================\n  // Health Check\n  // ============================================================================\n\n  /**\n   * Get system health status\n   *\n   * @returns Health status including database and realtime service status\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await admin.getHealth();\n   * if (data) {\n   *   console.log('Status:', data.status);\n   *   console.log('Database:', data.services.database);\n   *   console.log('Realtime:', data.services.realtime);\n   * }\n   * ```\n   */\n  async getHealth(): Promise<DataResponse<HealthResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<HealthResponse>(\"/health\");\n    });\n  }\n\n  // ============================================================================\n  // Admin Authentication\n  // ============================================================================\n\n  /**\n   * Check if initial admin setup is needed\n   *\n   * @returns Setup status indicating if initial setup is required\n   *\n   * @example\n   * ```typescript\n   * const status = await admin.getSetupStatus();\n   * if (status.needs_setup) {\n   *   console.log('Initial setup required');\n   * }\n   * ```\n   */\n  async getSetupStatus(): Promise<DataResponse<AdminSetupStatusResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<AdminSetupStatusResponse>(\n        \"/api/v1/admin/setup/status\",\n      );\n    });\n  }\n\n  /**\n   * Perform initial admin setup\n   *\n   * Creates the first admin user and completes initial setup.\n   * This endpoint can only be called once.\n   *\n   * @param request - Setup request containing email, password, and name\n   * @returns Authentication response with tokens\n   *\n   * @example\n   * ```typescript\n   * const response = await admin.setup({\n   *   email: 'admin@example.com',\n   *   password: 'SecurePassword123!',\n   *   name: 'Admin User'\n   * });\n   *\n   * // Store tokens\n   * localStorage.setItem('admin_token', response.access_token);\n   * ```\n   */\n  async setup(\n    request: AdminSetupRequest,\n  ): Promise<DataResponse<AdminAuthResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AdminAuthResponse>(\n        \"/api/v1/admin/setup\",\n        request,\n      );\n      this.setToken(response.access_token);\n      return response;\n    });\n  }\n\n  /**\n   * Admin login\n   *\n   * Authenticate as an admin user\n   *\n   * @param request - Login request containing email and password\n   * @returns Authentication response with tokens\n   *\n   * @example\n   * ```typescript\n   * const response = await admin.login({\n   *   email: 'admin@example.com',\n   *   password: 'password123'\n   * });\n   *\n   * // Token is automatically set in the client\n   * console.log('Logged in as:', response.user.email);\n   * ```\n   */\n  async login(\n    request: AdminLoginRequest,\n  ): Promise<DataResponse<AdminAuthResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AdminAuthResponse>(\n        \"/api/v1/admin/login\",\n        request,\n      );\n      this.setToken(response.access_token);\n      return response;\n    });\n  }\n\n  /**\n   * Refresh admin access token\n   *\n   * @param request - Refresh request containing the refresh token\n   * @returns New access and refresh tokens\n   *\n   * @example\n   * ```typescript\n   * const refreshToken = localStorage.getItem('admin_refresh_token');\n   * const response = await admin.refreshToken({ refresh_token: refreshToken });\n   *\n   * // Update stored tokens\n   * localStorage.setItem('admin_token', response.access_token);\n   * localStorage.setItem('admin_refresh_token', response.refresh_token);\n   * ```\n   */\n  async refreshToken(\n    request: AdminRefreshRequest,\n  ): Promise<DataResponse<AdminRefreshResponse>> {\n    return wrapAsync(async () => {\n      const response = await this.fetch.post<AdminRefreshResponse>(\n        \"/api/v1/admin/refresh\",\n        request,\n      );\n      this.setToken(response.access_token);\n      return response;\n    });\n  }\n\n  /**\n   * Admin logout\n   *\n   * Invalidates the current admin session\n   *\n   * @example\n   * ```typescript\n   * await admin.logout();\n   * localStorage.removeItem('admin_token');\n   * ```\n   */\n  async logout(): Promise<VoidResponse> {\n    return wrapAsyncVoid(async () => {\n      await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n      this.clearToken();\n    });\n  }\n\n  /**\n   * Get current admin user information\n   *\n   * @returns Current admin user details\n   *\n   * @example\n   * ```typescript\n   * const { user } = await admin.me();\n   * console.log('Logged in as:', user.email);\n   * console.log('Role:', user.role);\n   * ```\n   */\n  async me(): Promise<DataResponse<AdminMeResponse>> {\n    return wrapAsync(async () => {\n      return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\n    });\n  }\n\n  // ============================================================================\n  // User Management\n  // ============================================================================\n\n  /**\n   * List all users\n   *\n   * @param options - Filter and pagination options\n   * @returns List of users with metadata\n   *\n   * @example\n   * ```typescript\n   * // List all users\n   * const { users, total } = await admin.listUsers();\n   *\n   * // List with filters\n   * const result = await admin.listUsers({\n   *   exclude_admins: true,\n   *   search: 'john',\n   *   limit: 50,\n   *   type: 'app'\n   * });\n   * ```\n   */\n  async listUsers(\n    options: ListUsersOptions = {},\n  ): Promise<DataResponse<ListUsersResponse>> {\n    return wrapAsync(async () => {\n      const params = new URLSearchParams();\n\n      if (options.exclude_admins !== undefined) {\n        params.append(\"exclude_admins\", String(options.exclude_admins));\n      }\n      if (options.search) {\n        params.append(\"search\", options.search);\n      }\n      if (options.limit !== undefined) {\n        params.append(\"limit\", String(options.limit));\n      }\n      if (options.type) {\n        params.append(\"type\", options.type);\n      }\n\n      const queryString = params.toString();\n      const url = queryString\n        ? `/api/v1/admin/users?${queryString}`\n        : \"/api/v1/admin/users\";\n\n      return await this.fetch.get<ListUsersResponse>(url);\n    });\n  }\n\n  /**\n   * Get a user by ID\n   *\n   * Fetch a single user's details by their user ID\n   *\n   * @param userId - User ID to fetch\n   * @param type - User type ('app' or 'dashboard')\n   * @returns User details with metadata\n   *\n   * @example\n   * ```typescript\n   * // Get an app user\n   * const user = await admin.getUserById('user-123');\n   *\n   * // Get a dashboard user\n   * const dashboardUser = await admin.getUserById('admin-456', 'dashboard');\n   * console.log('User email:', dashboardUser.email);\n   * console.log('Last login:', dashboardUser.last_login_at);\n   * ```\n   */\n  async getUserById(\n    userId: string,\n    type: \"app\" | \"dashboard\" = \"app\",\n  ): Promise<DataResponse<EnrichedUser>> {\n    return wrapAsync(async () => {\n      const url = `/api/v1/admin/users/${userId}?type=${type}`;\n      return await this.fetch.get<EnrichedUser>(url);\n    });\n  }\n\n  /**\n   * Invite a new user\n   *\n   * Creates a new user and optionally sends an invitation email\n   *\n   * @param request - User invitation details\n   * @param type - User type ('app' or 'dashboard')\n   * @returns Created user and invitation details\n   *\n   * @example\n   * ```typescript\n   * const response = await admin.inviteUser({\n   *   email: 'newuser@example.com',\n   *   role: 'user',\n   *   send_email: true\n   * });\n   *\n   * console.log('User invited:', response.user.email);\n   * console.log('Invitation link:', response.invitation_link);\n   * ```\n   */\n  async inviteUser(\n    request: InviteUserRequest,\n    type: \"app\" | \"dashboard\" = \"app\",\n  ): Promise<DataResponse<InviteUserResponse>> {\n    return wrapAsync(async () => {\n      const url = `/api/v1/admin/users/invite?type=${type}`;\n      return await this.fetch.post<InviteUserResponse>(url, request);\n    });\n  }\n\n  /**\n   * Delete a user\n   *\n   * Permanently deletes a user and all associated data\n   *\n   * @param userId - User ID to delete\n   * @param type - User type ('app' or 'dashboard')\n   * @returns Deletion confirmation\n   *\n   * @example\n   * ```typescript\n   * await admin.deleteUser('user-uuid');\n   * console.log('User deleted');\n   * ```\n   */\n  async deleteUser(\n    userId: string,\n    type: \"app\" | \"dashboard\" = \"app\",\n  ): Promise<DataResponse<DeleteUserResponse>> {\n    return wrapAsync(async () => {\n      const url = `/api/v1/admin/users/${userId}?type=${type}`;\n      return await this.fetch.delete<DeleteUserResponse>(url);\n    });\n  }\n\n  /**\n   * Update user role\n   *\n   * Changes a user's role\n   *\n   * @param userId - User ID\n   * @param role - New role\n   * @param type - User type ('app' or 'dashboard')\n   * @returns Updated user\n   *\n   * @example\n   * ```typescript\n   * const user = await admin.updateUserRole('user-uuid', 'admin');\n   * console.log('User role updated:', user.role);\n   * ```\n   */\n  async updateUserRole(\n    userId: string,\n    role: string,\n    type: \"app\" | \"dashboard\" = \"app\",\n  ): Promise<DataResponse<EnrichedUser>> {\n    return wrapAsync(async () => {\n      const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n      return await this.fetch.patch<EnrichedUser>(url, { role });\n    });\n  }\n\n  /**\n   * Reset user password\n   *\n   * Generates a new password for the user and optionally sends it via email\n   *\n   * @param userId - User ID\n   * @param type - User type ('app' or 'dashboard')\n   * @returns Reset confirmation message\n   *\n   * @example\n   * ```typescript\n   * const response = await admin.resetUserPassword('user-uuid');\n   * console.log(response.message);\n   * ```\n   */\n  async resetUserPassword(\n    userId: string,\n    type: \"app\" | \"dashboard\" = \"app\",\n  ): Promise<DataResponse<ResetUserPasswordResponse>> {\n    return wrapAsync(async () => {\n      const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n      return await this.fetch.post<ResetUserPasswordResponse>(url, {});\n    });\n  }\n}\n","/**\n * Secrets Management module for Fluxbase SDK\n *\n * Provides methods for managing secrets that are injected into edge functions\n * and background jobs at runtime. Secrets are encrypted at rest and scoped\n * to either global or namespace level.\n *\n * @example\n * ```typescript\n * // Create a secret\n * const secret = await client.secrets.create({\n *   name: 'API_KEY',\n *   value: 'sk-your-api-key',\n *   scope: 'global'\n * })\n *\n * // Get secret by name\n * const secret = await client.secrets.get('API_KEY')\n *\n * // Update secret by name\n * await client.secrets.update('API_KEY', { value: 'new-value' })\n *\n * // List all secrets\n * const secrets = await client.secrets.list()\n * ```\n *\n * @category Secrets\n */\n\nimport type { FluxbaseFetch } from './fetch'\n\n/**\n * Represents a stored secret (metadata only, never includes value)\n */\nexport interface Secret {\n  id: string\n  name: string\n  scope: 'global' | 'namespace'\n  namespace?: string\n  description?: string\n  version: number\n  expires_at?: string\n  created_at: string\n  updated_at: string\n  created_by?: string\n  updated_by?: string\n}\n\n/**\n * Summary of a secret for list responses\n */\nexport interface SecretSummary {\n  id: string\n  name: string\n  scope: 'global' | 'namespace'\n  namespace?: string\n  description?: string\n  version: number\n  expires_at?: string\n  is_expired: boolean\n  created_at: string\n  updated_at: string\n  created_by?: string\n  updated_by?: string\n}\n\n/**\n * Represents a historical version of a secret\n */\nexport interface SecretVersion {\n  id: string\n  secret_id: string\n  version: number\n  created_at: string\n  created_by?: string\n}\n\n/**\n * Statistics about secrets\n */\nexport interface SecretStats {\n  total: number\n  expiring_soon: number\n  expired: number\n}\n\n/**\n * Request to create a new secret\n */\nexport interface CreateSecretRequest {\n  name: string\n  value: string\n  scope?: 'global' | 'namespace'\n  namespace?: string\n  description?: string\n  expires_at?: string\n}\n\n/**\n * Request to update an existing secret\n */\nexport interface UpdateSecretRequest {\n  value?: string\n  description?: string\n  expires_at?: string\n}\n\n/**\n * Options for listing secrets\n */\nexport interface ListSecretsOptions {\n  scope?: 'global' | 'namespace'\n  namespace?: string\n}\n\n/**\n * Options for name-based secret operations\n */\nexport interface SecretByNameOptions {\n  namespace?: string\n}\n\n/**\n * Secrets Manager for managing edge function and job secrets\n *\n * Provides both name-based (recommended) and UUID-based operations.\n * Name-based operations are more convenient for most use cases.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a global secret\n * const secret = await client.secrets.create({\n *   name: 'STRIPE_KEY',\n *   value: 'sk_live_xxx',\n *   description: 'Stripe production API key'\n * })\n *\n * // Create a namespace-scoped secret\n * await client.secrets.create({\n *   name: 'DATABASE_URL',\n *   value: 'postgres://...',\n *   scope: 'namespace',\n *   namespace: 'production'\n * })\n *\n * // Get secret by name\n * const secret = await client.secrets.get('STRIPE_KEY')\n *\n * // Get namespace-scoped secret\n * const secret = await client.secrets.get('DATABASE_URL', { namespace: 'production' })\n *\n * // Update secret\n * await client.secrets.update('STRIPE_KEY', { value: 'sk_live_new_key' })\n *\n * // List all secrets\n * const secrets = await client.secrets.list()\n *\n * // Get version history\n * const versions = await client.secrets.getVersions('STRIPE_KEY')\n *\n * // Rollback to previous version\n * await client.secrets.rollback('STRIPE_KEY', 1)\n *\n * // Delete secret\n * await client.secrets.delete('STRIPE_KEY')\n * ```\n *\n * @category Secrets\n */\nexport class SecretsManager {\n  private fetch: FluxbaseFetch\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch\n  }\n\n  /**\n   * Create a new secret\n   *\n   * Creates a new secret with the specified name, value, and scope.\n   * The value is encrypted at rest and never returned by the API.\n   *\n   * @param request - Secret creation request\n   * @returns Promise resolving to the created secret (metadata only)\n   *\n   * @example\n   * ```typescript\n   * // Create a global secret\n   * const secret = await client.secrets.create({\n   *   name: 'SENDGRID_API_KEY',\n   *   value: 'SG.xxx',\n   *   description: 'SendGrid API key for transactional emails'\n   * })\n   *\n   * // Create a namespace-scoped secret\n   * const secret = await client.secrets.create({\n   *   name: 'DATABASE_URL',\n   *   value: 'postgres://user:pass@host:5432/db',\n   *   scope: 'namespace',\n   *   namespace: 'production',\n   *   description: 'Production database URL'\n   * })\n   *\n   * // Create a secret with expiration\n   * const secret = await client.secrets.create({\n   *   name: 'TEMP_TOKEN',\n   *   value: 'xyz123',\n   *   expires_at: '2025-12-31T23:59:59Z'\n   * })\n   * ```\n   */\n  async create(request: CreateSecretRequest): Promise<Secret> {\n    return await this.fetch.post<Secret>('/api/v1/secrets', request)\n  }\n\n  /**\n   * Get a secret by name (metadata only, never includes value)\n   *\n   * @param name - Secret name\n   * @param options - Optional namespace for namespace-scoped secrets\n   * @returns Promise resolving to the secret\n   *\n   * @example\n   * ```typescript\n   * // Get a global secret\n   * const secret = await client.secrets.get('API_KEY')\n   *\n   * // Get a namespace-scoped secret\n   * const secret = await client.secrets.get('DATABASE_URL', { namespace: 'production' })\n   * ```\n   */\n  async get(name: string, options?: SecretByNameOptions): Promise<Secret> {\n    const params = new URLSearchParams()\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    return await this.fetch.get<Secret>(`/api/v1/secrets/by-name/${encodeURIComponent(name)}${query}`)\n  }\n\n  /**\n   * Update a secret by name\n   *\n   * Updates the secret's value, description, or expiration.\n   * Only provided fields will be updated.\n   *\n   * @param name - Secret name\n   * @param request - Update request\n   * @param options - Optional namespace for namespace-scoped secrets\n   * @returns Promise resolving to the updated secret\n   *\n   * @example\n   * ```typescript\n   * // Update secret value\n   * const secret = await client.secrets.update('API_KEY', { value: 'new-value' })\n   *\n   * // Update description\n   * const secret = await client.secrets.update('API_KEY', { description: 'Updated description' })\n   *\n   * // Update namespace-scoped secret\n   * const secret = await client.secrets.update('DATABASE_URL',\n   *   { value: 'postgres://new-host:5432/db' },\n   *   { namespace: 'production' }\n   * )\n   * ```\n   */\n  async update(name: string, request: UpdateSecretRequest, options?: SecretByNameOptions): Promise<Secret> {\n    const params = new URLSearchParams()\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    return await this.fetch.put<Secret>(`/api/v1/secrets/by-name/${encodeURIComponent(name)}${query}`, request)\n  }\n\n  /**\n   * Delete a secret by name\n   *\n   * Permanently deletes the secret and all its versions.\n   *\n   * @param name - Secret name\n   * @param options - Optional namespace for namespace-scoped secrets\n   * @returns Promise resolving when deletion is complete\n   *\n   * @example\n   * ```typescript\n   * // Delete a global secret\n   * await client.secrets.delete('OLD_API_KEY')\n   *\n   * // Delete a namespace-scoped secret\n   * await client.secrets.delete('DATABASE_URL', { namespace: 'staging' })\n   * ```\n   */\n  async delete(name: string, options?: SecretByNameOptions): Promise<void> {\n    const params = new URLSearchParams()\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    await this.fetch.delete(`/api/v1/secrets/by-name/${encodeURIComponent(name)}${query}`)\n  }\n\n  /**\n   * Get version history for a secret by name\n   *\n   * Returns all historical versions of the secret (values are never included).\n   *\n   * @param name - Secret name\n   * @param options - Optional namespace for namespace-scoped secrets\n   * @returns Promise resolving to array of secret versions\n   *\n   * @example\n   * ```typescript\n   * const versions = await client.secrets.getVersions('API_KEY')\n   *\n   * versions.forEach(v => {\n   *   console.log(`Version ${v.version} created at ${v.created_at}`)\n   * })\n   * ```\n   */\n  async getVersions(name: string, options?: SecretByNameOptions): Promise<SecretVersion[]> {\n    const params = new URLSearchParams()\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    return await this.fetch.get<SecretVersion[]>(`/api/v1/secrets/by-name/${encodeURIComponent(name)}/versions${query}`)\n  }\n\n  /**\n   * Rollback a secret to a previous version by name\n   *\n   * Restores the secret to a previous version's value.\n   * This creates a new version with the old value.\n   *\n   * @param name - Secret name\n   * @param version - Version number to rollback to\n   * @param options - Optional namespace for namespace-scoped secrets\n   * @returns Promise resolving to the updated secret\n   *\n   * @example\n   * ```typescript\n   * // Rollback to version 2\n   * const secret = await client.secrets.rollback('API_KEY', 2)\n   * console.log(`Secret now at version ${secret.version}`)\n   * ```\n   */\n  async rollback(name: string, version: number, options?: SecretByNameOptions): Promise<Secret> {\n    const params = new URLSearchParams()\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    return await this.fetch.post<Secret>(\n      `/api/v1/secrets/by-name/${encodeURIComponent(name)}/rollback/${version}${query}`,\n      {}\n    )\n  }\n\n  /**\n   * List all secrets (metadata only, never includes values)\n   *\n   * @param options - Filter options for scope and namespace\n   * @returns Promise resolving to array of secret summaries\n   *\n   * @example\n   * ```typescript\n   * // List all secrets\n   * const secrets = await client.secrets.list()\n   *\n   * // List only global secrets\n   * const secrets = await client.secrets.list({ scope: 'global' })\n   *\n   * // List secrets for a specific namespace\n   * const secrets = await client.secrets.list({ namespace: 'production' })\n   *\n   * secrets.forEach(s => {\n   *   console.log(`${s.name}: version ${s.version}, expired: ${s.is_expired}`)\n   * })\n   * ```\n   */\n  async list(options?: ListSecretsOptions): Promise<SecretSummary[]> {\n    const params = new URLSearchParams()\n    if (options?.scope) {\n      params.set('scope', options.scope)\n    }\n    if (options?.namespace) {\n      params.set('namespace', options.namespace)\n    }\n    const query = params.toString() ? `?${params.toString()}` : ''\n    return await this.fetch.get<SecretSummary[]>(`/api/v1/secrets${query}`)\n  }\n\n  /**\n   * Get statistics about secrets\n   *\n   * @returns Promise resolving to secret statistics\n   *\n   * @example\n   * ```typescript\n   * const stats = await client.secrets.stats()\n   * console.log(`Total: ${stats.total}, Expiring soon: ${stats.expiring_soon}, Expired: ${stats.expired}`)\n   * ```\n   */\n  async stats(): Promise<SecretStats> {\n    return await this.fetch.get<SecretStats>('/api/v1/secrets/stats')\n  }\n\n  // UUID-based methods for backward compatibility\n\n  /**\n   * Get a secret by ID (metadata only)\n   *\n   * @param id - Secret UUID\n   * @returns Promise resolving to the secret\n   *\n   * @example\n   * ```typescript\n   * const secret = await client.secrets.getById('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async getById(id: string): Promise<Secret> {\n    return await this.fetch.get<Secret>(`/api/v1/secrets/${encodeURIComponent(id)}`)\n  }\n\n  /**\n   * Update a secret by ID\n   *\n   * @param id - Secret UUID\n   * @param request - Update request\n   * @returns Promise resolving to the updated secret\n   *\n   * @example\n   * ```typescript\n   * const secret = await client.secrets.updateById('550e8400-e29b-41d4-a716-446655440000', {\n   *   value: 'new-value'\n   * })\n   * ```\n   */\n  async updateById(id: string, request: UpdateSecretRequest): Promise<Secret> {\n    return await this.fetch.put<Secret>(`/api/v1/secrets/${encodeURIComponent(id)}`, request)\n  }\n\n  /**\n   * Delete a secret by ID\n   *\n   * @param id - Secret UUID\n   * @returns Promise resolving when deletion is complete\n   *\n   * @example\n   * ```typescript\n   * await client.secrets.deleteById('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async deleteById(id: string): Promise<void> {\n    await this.fetch.delete(`/api/v1/secrets/${encodeURIComponent(id)}`)\n  }\n\n  /**\n   * Get version history for a secret by ID\n   *\n   * @param id - Secret UUID\n   * @returns Promise resolving to array of secret versions\n   *\n   * @example\n   * ```typescript\n   * const versions = await client.secrets.getVersionsById('550e8400-e29b-41d4-a716-446655440000')\n   * ```\n   */\n  async getVersionsById(id: string): Promise<SecretVersion[]> {\n    return await this.fetch.get<SecretVersion[]>(`/api/v1/secrets/${encodeURIComponent(id)}/versions`)\n  }\n\n  /**\n   * Rollback a secret to a previous version by ID\n   *\n   * @param id - Secret UUID\n   * @param version - Version number to rollback to\n   * @returns Promise resolving to the updated secret\n   *\n   * @example\n   * ```typescript\n   * const secret = await client.secrets.rollbackById('550e8400-e29b-41d4-a716-446655440000', 2)\n   * ```\n   */\n  async rollbackById(id: string, version: number): Promise<Secret> {\n    return await this.fetch.post<Secret>(`/api/v1/secrets/${encodeURIComponent(id)}/rollback/${version}`, {})\n  }\n}\n","/**\n * AI Chat module for interacting with AI chatbots\n * Provides WebSocket-based chat functionality with streaming support\n */\n\nimport type {\n  AIChatbotSummary,\n  AIChatbotLookupResponse,\n  AIChatClientMessage,\n  AIChatServerMessage,\n  AIUsageStats,\n  AIUserConversationDetail,\n  AIDailyQuotaSnapshot,\n  AIMatchedIntentRule,\n  ListConversationsOptions,\n  ListConversationsResult,\n  UpdateConversationOptions,\n} from \"./types\";\n\n/**\n * Event types for chat callbacks\n */\nexport type AIChatEventType =\n  | \"connected\"\n  | \"chat_started\"\n  | \"progress\"\n  | \"content\"\n  | \"query_result\"\n  | \"tool_result\"\n  | \"done\"\n  | \"error\"\n  | \"cancelled\"\n  | \"disconnected\";\n\n/**\n * Chat event data\n */\nexport interface AIChatEvent {\n  type: AIChatEventType;\n  conversationId?: string;\n  chatbot?: string;\n  step?: string;\n  message?: string;\n  delta?: string;\n  query?: string;\n  summary?: string;\n  rowCount?: number;\n  data?: Record<string, any>[];\n  usage?: AIUsageStats;\n  error?: string;\n  code?: string;\n}\n\n/**\n * Chat connection options\n */\nexport interface AIChatOptions {\n  /** WebSocket URL (defaults to ws://host/ai/ws) */\n  wsUrl?: string;\n  /** JWT token for authentication */\n  token?: string;\n  /** Callback for all events */\n  onEvent?: (event: AIChatEvent) => void;\n  /** Callback for content chunks (streaming) */\n  onContent?: (delta: string, conversationId: string) => void;\n  /** Callback for progress updates */\n  onProgress?: (step: string, message: string, conversationId: string) => void;\n  /** Callback for query results */\n  onQueryResult?: (\n    query: string,\n    summary: string,\n    rowCount: number,\n    data: Record<string, any>[],\n    conversationId: string,\n  ) => void;\n  /** Callback when message is complete */\n  onDone?: (\n    usage: AIUsageStats | undefined,\n    conversationId: string,\n    /**\n     * Turn metadata (Ask 2/4/5). Optional third argument — old callbacks\n     * that only declare two params keep working unchanged.\n     */\n    extras?: {\n      matched_intent_rules?: AIMatchedIntentRule[];\n      daily_quota?: AIDailyQuotaSnapshot;\n    },\n  ) => void;\n  /** Callback for errors */\n  onError?: (\n    error: string,\n    code: string | undefined,\n    conversationId: string | undefined,\n  ) => void;\n  /** Reconnect attempts (0 = no reconnect) */\n  reconnectAttempts?: number;\n  /** Reconnect delay in ms */\n  reconnectDelay?: number;\n  /** @internal Lookup function for smart namespace resolution */\n  _lookupChatbot?: (\n    name: string,\n  ) => Promise<{ data: AIChatbotLookupResponse | null; error: Error | null }>;\n}\n\n/**\n * AI Chat client for WebSocket-based chat with AI chatbots\n *\n * @example\n * ```typescript\n * const chat = new FluxbaseAIChat({\n *   wsUrl: 'ws://localhost:8080/ai/ws',\n *   token: 'my-jwt-token',\n *   onContent: (delta, convId) => {\n *     process.stdout.write(delta)\n *   },\n *   onProgress: (step, message) => {\n *     console.log(`[${step}] ${message}`)\n *   },\n *   onQueryResult: (query, summary, rowCount, data) => {\n *     console.log(`Query: ${query}`)\n *     console.log(`Result: ${summary} (${rowCount} rows)`)\n *   },\n *   onDone: (usage) => {\n *     console.log(`\\nTokens: ${usage?.total_tokens}`)\n *   },\n *   onError: (error, code) => {\n *     console.error(`Error: ${error} (${code})`)\n *   },\n * })\n *\n * await chat.connect()\n * const convId = await chat.startChat('sql-assistant')\n * await chat.sendMessage(convId, 'Show me the top 10 users by order count')\n * ```\n */\nexport class FluxbaseAIChat {\n  private ws: WebSocket | null = null;\n  private options: AIChatOptions;\n  private reconnectCount = 0;\n  private pendingStartResolve: ((convId: string) => void) | null = null;\n  private pendingStartReject: ((error: Error) => void) | null = null;\n  private accumulatedContent: Map<string, string> = new Map();\n\n  constructor(options: AIChatOptions) {\n    this.options = {\n      reconnectAttempts: 3,\n      reconnectDelay: 1000,\n      ...options,\n    };\n  }\n\n  /**\n   * Connect to the AI chat WebSocket\n   *\n   * @returns Promise that resolves when connected\n   */\n  async connect(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const url = this.buildWsUrl();\n\n      try {\n        this.ws = new WebSocket(url);\n\n        this.ws.onopen = () => {\n          this.reconnectCount = 0;\n          this.emitEvent({ type: \"connected\" });\n          resolve();\n        };\n\n        this.ws.onmessage = (event) => {\n          this.handleMessage(event.data);\n        };\n\n        this.ws.onclose = (event) => {\n          this.emitEvent({ type: \"disconnected\" });\n          this.handleClose(event);\n        };\n\n        this.ws.onerror = () => {\n          reject(new Error(\"WebSocket connection failed\"));\n        };\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Disconnect from the AI chat WebSocket\n   */\n  disconnect(): void {\n    if (this.ws) {\n      this.ws.close();\n      this.ws = null;\n    }\n  }\n\n  /**\n   * Check if connected\n   */\n  isConnected(): boolean {\n    return this.ws?.readyState === WebSocket.OPEN;\n  }\n\n  /**\n   * Start a new chat session with a chatbot\n   *\n   * @param chatbot - Chatbot name\n   * @param namespace - Optional namespace. If not provided and a lookup function is available,\n   *                    performs smart resolution:\n   *                    - If exactly one chatbot with this name exists, uses it\n   *                    - If multiple exist, tries \"default\" namespace\n   *                    - If ambiguous and not in default, throws error with available namespaces\n   *                    If no lookup function, falls back to \"default\" namespace.\n   * @param conversationId - Optional conversation ID to resume\n   * @param impersonateUserId - Optional user ID to impersonate (admin only)\n   * @returns Promise resolving to conversation ID\n   */\n  async startChat(\n    chatbot: string,\n    namespace?: string,\n    conversationId?: string,\n    impersonateUserId?: string,\n  ): Promise<string> {\n    if (!this.isConnected()) {\n      throw new Error(\"Not connected to AI chat\");\n    }\n\n    // If namespace is not provided, try smart lookup\n    let resolvedNamespace = namespace;\n    if (!resolvedNamespace && this.options._lookupChatbot) {\n      const { data, error } = await this.options._lookupChatbot(chatbot);\n      if (error) {\n        throw new Error(`Failed to lookup chatbot: ${error.message}`);\n      }\n      if (!data) {\n        throw new Error(`Chatbot '${chatbot}' not found`);\n      }\n      if (data.ambiguous) {\n        throw new Error(\n          `Chatbot '${chatbot}' exists in multiple namespaces: ${data.namespaces?.join(\", \")}. ` +\n            `Please specify the namespace explicitly.`,\n        );\n      }\n      if (data.chatbot) {\n        resolvedNamespace = data.chatbot.namespace;\n      } else if (data.error) {\n        throw new Error(data.error);\n      }\n    }\n\n    // Fall back to \"default\" if still not resolved\n    if (!resolvedNamespace) {\n      resolvedNamespace = \"default\";\n    }\n\n    return new Promise((resolve, reject) => {\n      this.pendingStartResolve = resolve;\n      this.pendingStartReject = reject;\n\n      const message: AIChatClientMessage = {\n        type: \"start_chat\",\n        chatbot,\n        namespace: resolvedNamespace,\n        conversation_id: conversationId,\n        impersonate_user_id: impersonateUserId,\n      };\n\n      this.ws!.send(JSON.stringify(message));\n    });\n  }\n\n  /**\n   * Send a message in a conversation\n   *\n   * @param conversationId - Conversation ID\n   * @param content - Message content\n   */\n  sendMessage(conversationId: string, content: string): void {\n    if (!this.isConnected()) {\n      throw new Error(\"Not connected to AI chat\");\n    }\n\n    // Reset accumulated content for this conversation\n    this.accumulatedContent.set(conversationId, \"\");\n\n    const message: AIChatClientMessage = {\n      type: \"message\",\n      conversation_id: conversationId,\n      content,\n    };\n\n    this.ws!.send(JSON.stringify(message));\n  }\n\n  /**\n   * Cancel an ongoing message generation\n   *\n   * @param conversationId - Conversation ID\n   */\n  cancel(conversationId: string): void {\n    if (!this.isConnected()) {\n      throw new Error(\"Not connected to AI chat\");\n    }\n\n    const message: AIChatClientMessage = {\n      type: \"cancel\",\n      conversation_id: conversationId,\n    };\n\n    this.ws!.send(JSON.stringify(message));\n  }\n\n  /**\n   * Get the full accumulated response content for a conversation\n   *\n   * @param conversationId - Conversation ID\n   * @returns Accumulated content string\n   */\n  getAccumulatedContent(conversationId: string): string {\n    return this.accumulatedContent.get(conversationId) || \"\";\n  }\n\n  private buildWsUrl(): string {\n    let url = this.options.wsUrl || \"/ai/ws\";\n\n    // Add token if provided\n    if (this.options.token) {\n      const separator = url.includes(\"?\") ? \"&\" : \"?\";\n      url = `${url}${separator}token=${encodeURIComponent(this.options.token)}`;\n    }\n\n    return url;\n  }\n\n  private handleMessage(data: string): void {\n    try {\n      const message: AIChatServerMessage = JSON.parse(data);\n      const event = this.serverMessageToEvent(message);\n\n      // Handle special cases\n      switch (message.type) {\n        case \"chat_started\":\n          if (this.pendingStartResolve && message.conversation_id) {\n            this.pendingStartResolve(message.conversation_id);\n            this.pendingStartResolve = null;\n            this.pendingStartReject = null;\n          }\n          break;\n\n        case \"content\":\n          if (message.conversation_id && message.delta) {\n            const current =\n              this.accumulatedContent.get(message.conversation_id) || \"\";\n            this.accumulatedContent.set(\n              message.conversation_id,\n              current + message.delta,\n            );\n            this.options.onContent?.(message.delta, message.conversation_id);\n          }\n          break;\n\n        case \"progress\":\n          if (message.step && message.message && message.conversation_id) {\n            this.options.onProgress?.(\n              message.step,\n              message.message,\n              message.conversation_id,\n            );\n          }\n          break;\n\n        case \"query_result\":\n          if (message.conversation_id) {\n            this.options.onQueryResult?.(\n              message.query || \"\",\n              message.summary || \"\",\n              message.row_count || 0,\n              message.data || [],\n              message.conversation_id,\n            );\n          }\n          break;\n\n        case \"tool_result\":\n          // If this tool_result contains query data, treat it as a query_result\n          if (\n            message.query !== undefined &&\n            message.data !== undefined &&\n            message.conversation_id\n          ) {\n            this.options.onQueryResult?.(\n              message.query,\n              message.summary || \"\",\n              message.row_count || 0,\n              message.data,\n              message.conversation_id,\n            );\n          }\n          break;\n\n        case \"done\":\n          if (message.conversation_id) {\n            this.options.onDone?.(\n              message.usage,\n              message.conversation_id,\n              {\n                matched_intent_rules: message.matched_intent_rules,\n                daily_quota: message.daily_quota,\n              },\n            );\n          }\n          break;\n\n        case \"error\":\n          if (this.pendingStartReject) {\n            this.pendingStartReject(\n              new Error(message.error || \"Unknown error\"),\n            );\n            this.pendingStartResolve = null;\n            this.pendingStartReject = null;\n          }\n          this.options.onError?.(\n            message.error || \"Unknown error\",\n            message.code,\n            message.conversation_id,\n          );\n          break;\n      }\n\n      // Always emit the general event\n      this.emitEvent(event);\n    } catch (error) {\n      console.error(\"Failed to parse AI chat message:\", error);\n    }\n  }\n\n  private serverMessageToEvent(message: AIChatServerMessage): AIChatEvent {\n    return {\n      type: message.type as AIChatEventType,\n      conversationId: message.conversation_id,\n      chatbot: message.chatbot,\n      step: message.step,\n      message: message.message,\n      delta: message.delta,\n      query: message.query,\n      summary: message.summary,\n      rowCount: message.row_count,\n      data: message.data,\n      usage: message.usage,\n      error: message.error,\n      code: message.code,\n    };\n  }\n\n  private emitEvent(event: AIChatEvent): void {\n    this.options.onEvent?.(event);\n  }\n\n  private handleClose(_event: CloseEvent): void {\n    // Attempt reconnect if configured\n    if (\n      this.options.reconnectAttempts &&\n      this.reconnectCount < this.options.reconnectAttempts\n    ) {\n      this.reconnectCount++;\n      setTimeout(() => {\n        this.connect().catch(() => {\n          // Reconnect failed, will try again if attempts remain\n        });\n      }, this.options.reconnectDelay);\n    }\n  }\n}\n\n/**\n * Fluxbase AI client for listing chatbots and managing conversations\n *\n * @example\n * ```typescript\n * const ai = new FluxbaseAI(fetchClient, 'ws://localhost:8080')\n *\n * // List available chatbots\n * const { data, error } = await ai.listChatbots()\n *\n * // Create a chat connection\n * const chat = ai.createChat({\n *   token: 'my-jwt-token',\n *   onContent: (delta) => process.stdout.write(delta),\n * })\n *\n * await chat.connect()\n * const convId = await chat.startChat('sql-assistant')\n * chat.sendMessage(convId, 'Show me recent orders')\n * ```\n */\nexport class FluxbaseAI {\n  private fetch: {\n    get: <T>(path: string) => Promise<T>;\n    patch: <T>(path: string, body?: unknown) => Promise<T>;\n    delete: (path: string) => Promise<void>;\n  };\n  private wsBaseUrl: string;\n\n  constructor(\n    fetch: {\n      get: <T>(path: string) => Promise<T>;\n      patch: <T>(path: string, body?: unknown) => Promise<T>;\n      delete: (path: string) => Promise<void>;\n    },\n    wsBaseUrl: string,\n  ) {\n    this.fetch = fetch;\n    this.wsBaseUrl = wsBaseUrl;\n  }\n\n  /**\n   * List available chatbots (public, enabled)\n   *\n   * @returns Promise resolving to { data, error } tuple with array of chatbot summaries\n   */\n  async listChatbots(namespace?: string): Promise<{\n    data: AIChatbotSummary[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const params = namespace ? `?namespace=${encodeURIComponent(namespace)}` : \"\";\n      const response = await this.fetch.get<{\n        chatbots: AIChatbotSummary[];\n        count: number;\n      }>(`/api/v1/ai/chatbots${params}`);\n      return { data: response.chatbots || [], error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get details of a specific chatbot\n   *\n   * @param id - Chatbot ID\n   * @returns Promise resolving to { data, error } tuple with chatbot details\n   */\n  async getChatbot(\n    id: string,\n  ): Promise<{ data: AIChatbotSummary | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<AIChatbotSummary>(\n        `/api/v1/ai/chatbots/${id}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Lookup a chatbot by name with smart namespace resolution\n   *\n   * Resolution logic:\n   * 1. If exactly one chatbot with this name exists -> returns it\n   * 2. If multiple exist -> tries \"default\" namespace first\n   * 3. If multiple exist and none in \"default\" -> returns ambiguous=true with namespaces list\n   *\n   * @param name - Chatbot name\n   * @returns Promise resolving to { data, error } tuple with lookup result\n   *\n   * @example\n   * ```typescript\n   * // Lookup chatbot by name\n   * const { data, error } = await ai.lookupChatbot('sql-assistant')\n   * if (data?.chatbot) {\n   *   console.log(`Found in namespace: ${data.chatbot.namespace}`)\n   * } else if (data?.ambiguous) {\n   *   console.log(`Chatbot exists in: ${data.namespaces?.join(', ')}`)\n   * }\n   * ```\n   */\n  async lookupChatbot(\n    name: string,\n  ): Promise<{ data: AIChatbotLookupResponse | null; error: Error | null }> {\n    try {\n      const data = await this.fetch.get<AIChatbotLookupResponse>(\n        `/api/v1/ai/chatbots/by-name/${encodeURIComponent(name)}`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new AI chat connection\n   *\n   * @param options - Chat connection options\n   * @returns FluxbaseAIChat instance\n   */\n  createChat(\n    options: Omit<AIChatOptions, \"wsUrl\" | \"_lookupChatbot\">,\n  ): FluxbaseAIChat {\n    return new FluxbaseAIChat({\n      ...options,\n      wsUrl: `${this.wsBaseUrl}/ai/ws`,\n      _lookupChatbot: (name: string) => this.lookupChatbot(name),\n    });\n  }\n\n  /**\n   * List the authenticated user's conversations\n   *\n   * @param options - Optional filters and pagination\n   * @returns Promise resolving to { data, error } tuple with conversations\n   *\n   * @example\n   * ```typescript\n   * // List all conversations\n   * const { data, error } = await ai.listConversations()\n   *\n   * // Filter by chatbot\n   * const { data, error } = await ai.listConversations({ chatbot: 'sql-assistant' })\n   *\n   * // With pagination\n   * const { data, error } = await ai.listConversations({ limit: 20, offset: 0 })\n   * ```\n   */\n  async listConversations(\n    options?: ListConversationsOptions,\n  ): Promise<{ data: ListConversationsResult | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n      if (options?.chatbot) params.set(\"chatbot\", options.chatbot);\n      if (options?.namespace) params.set(\"namespace\", options.namespace);\n      if (options?.limit !== undefined)\n        params.set(\"limit\", String(options.limit));\n      if (options?.offset !== undefined)\n        params.set(\"offset\", String(options.offset));\n\n      const queryString = params.toString();\n      const path = `/api/v1/ai/conversations${queryString ? `?${queryString}` : \"\"}`;\n\n      const response = await this.fetch.get<ListConversationsResult>(path);\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a single conversation with all messages\n   *\n   * @param id - Conversation ID\n   * @returns Promise resolving to { data, error } tuple with conversation detail\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await ai.getConversation('conv-uuid-123')\n   * if (data) {\n   *   console.log(`Title: ${data.title}`)\n   *   console.log(`Messages: ${data.messages.length}`)\n   * }\n   * ```\n   */\n  async getConversation(\n    id: string,\n  ): Promise<{ data: AIUserConversationDetail | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<AIUserConversationDetail>(\n        `/api/v1/ai/conversations/${id}`,\n      );\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a conversation\n   *\n   * @param id - Conversation ID\n   * @returns Promise resolving to { error } (null on success)\n   *\n   * @example\n   * ```typescript\n   * const { error } = await ai.deleteConversation('conv-uuid-123')\n   * if (!error) {\n   *   console.log('Conversation deleted')\n   * }\n   * ```\n   */\n  async deleteConversation(id: string): Promise<{ error: Error | null }> {\n    try {\n      await this.fetch.delete(`/api/v1/ai/conversations/${id}`);\n      return { error: null };\n    } catch (error) {\n      return { error: error as Error };\n    }\n  }\n\n  /**\n   * Update a conversation (currently supports title update only)\n   *\n   * @param id - Conversation ID\n   * @param updates - Fields to update\n   * @returns Promise resolving to { data, error } tuple with updated conversation\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await ai.updateConversation('conv-uuid-123', {\n   *   title: 'My custom conversation title'\n   * })\n   * ```\n   */\n  async updateConversation(\n    id: string,\n    updates: UpdateConversationOptions,\n  ): Promise<{ data: AIUserConversationDetail | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.patch<AIUserConversationDetail>(\n        `/api/v1/ai/conversations/${id}`,\n        updates,\n      );\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get the current user's daily quota for a chatbot (Ask 2).\n   *\n   * Returns requests used/limit and tokens used/limit, plus the RFC3339\n   * timestamp of when the counters reset. Best-effort: counters are in-memory\n   * and reset on server restart; per-instance in multi-replica deployments.\n   *\n   * For per-turn updates without an extra round-trip, read `daily_quota` from\n   * the `onDone` callback's third argument.\n   *\n   * @param chatbotId - Chatbot ID\n   * @returns Promise resolving to { data, error } with the quota snapshot\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await ai.getUsage('chatbot-uuid')\n   * if (data) {\n   *   console.log(`${data.requests.limit - data.requests.used} requests left today`)\n   *   console.log(`${data.tokens.limit - data.tokens.used} tokens left today`)\n   * }\n   * ```\n   */\n  async getUsage(\n    chatbotId: string,\n  ): Promise<{ data: AIDailyQuotaSnapshot | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<AIDailyQuotaSnapshot>(\n        `/api/v1/ai/usage/${chatbotId}`,\n      );\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * Vector search module for Fluxbase SDK\n * Provides convenience methods for vector similarity search using pgvector\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  EmbedRequest,\n  EmbedResponse,\n  FluxbaseResponse,\n  VectorSearchOptions,\n  VectorSearchResult,\n} from \"./types\";\n\n/**\n * FluxbaseVector provides vector search functionality using pgvector\n *\n * @example\n * ```typescript\n * // Embed text and search\n * const { data: results } = await client.vector.search({\n *   table: 'documents',\n *   column: 'embedding',\n *   query: 'How to use TypeScript?',\n *   match_count: 10\n * })\n *\n * // Embed text directly\n * const { data: embedding } = await client.vector.embed({ text: 'Hello world' })\n * ```\n */\nexport class FluxbaseVector {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Generate embeddings for text\n   *\n   * @example\n   * ```typescript\n   * // Single text\n   * const { data } = await client.vector.embed({\n   *   text: 'Hello world'\n   * })\n   * console.log(data.embeddings[0]) // [0.1, 0.2, ...]\n   *\n   * // Multiple texts\n   * const { data } = await client.vector.embed({\n   *   texts: ['Hello', 'World'],\n   *   model: 'text-embedding-3-small'\n   * })\n   * ```\n   */\n  async embed(request: EmbedRequest): Promise<FluxbaseResponse<EmbedResponse>> {\n    try {\n      const response = await this.fetch.request<EmbedResponse>(\n        \"/api/v1/vector/embed\",\n        {\n          method: \"POST\",\n          body: request,\n        }\n      );\n\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Search for similar vectors with automatic text embedding\n   *\n   * This is a convenience method that:\n   * 1. Embeds the query text automatically (if `query` is provided)\n   * 2. Performs vector similarity search\n   * 3. Returns results with distance scores\n   *\n   * @example\n   * ```typescript\n   * // Search with text query (auto-embedded)\n   * const { data } = await client.vector.search({\n   *   table: 'documents',\n   *   column: 'embedding',\n   *   query: 'How to use TypeScript?',\n   *   match_count: 10,\n   *   match_threshold: 0.8\n   * })\n   *\n   * // Search with pre-computed vector\n   * const { data } = await client.vector.search({\n   *   table: 'documents',\n   *   column: 'embedding',\n   *   vector: [0.1, 0.2, ...],\n   *   metric: 'cosine',\n   *   match_count: 10\n   * })\n   *\n   * // With additional filters\n   * const { data } = await client.vector.search({\n   *   table: 'documents',\n   *   column: 'embedding',\n   *   query: 'TypeScript tutorial',\n   *   filters: [\n   *     { column: 'status', operator: 'eq', value: 'published' }\n   *   ],\n   *   match_count: 10\n   * })\n   * ```\n   */\n  async search<T = Record<string, unknown>>(\n    options: VectorSearchOptions\n  ): Promise<FluxbaseResponse<VectorSearchResult<T>>> {\n    try {\n      const response = await this.fetch.request<VectorSearchResult<T>>(\n        \"/api/v1/vector/search\",\n        {\n          method: \"POST\",\n          body: {\n            table: options.table,\n            column: options.column,\n            query: options.query,\n            vector: options.vector,\n            metric: options.metric || \"cosine\",\n            match_threshold: options.match_threshold,\n            match_count: options.match_count,\n            select: options.select,\n            filters: options.filters,\n          },\n        }\n      );\n\n      return { data: response, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * Knowledge Base module for Fluxbase SDK\n * Provides RAG document management, semantic search, and knowledge graph operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  KnowledgeBaseSummary,\n  KnowledgeBase,\n  CreateKnowledgeBaseRequest,\n  UpdateKnowledgeBaseRequest,\n  KnowledgeBaseDocument,\n  AddDocumentRequest,\n  AddDocumentResponse,\n  UploadDocumentResponse,\n  UpdateDocumentRequest,\n  DeleteDocumentsByFilterRequest,\n  DeleteDocumentsByFilterResponse,\n  SearchKnowledgeBaseRequest,\n  SearchKnowledgeBaseResponse,\n  Entity,\n  EntityType,\n  EntityRelationship,\n  KnowledgeGraphData,\n  FluxbaseResponse,\n} from \"./types\";\n\n/**\n * FluxbaseKnowledgeBase provides knowledge base management for RAG applications\n *\n * @example\n * ```typescript\n * // List knowledge bases\n * const { data: kbs } = await client.knowledgeBase.list()\n *\n * // Create a knowledge base\n * const { data: kb } = await client.knowledgeBase.create({\n *   name: 'Product Docs',\n *   description: 'Product documentation for RAG'\n * })\n *\n * // Add a document\n * const { data } = await client.knowledgeBase.addDocument(kb.id, {\n *   title: 'Getting Started',\n *   content: 'Welcome to our product...'\n * })\n *\n * // Search the knowledge base\n * const { data: results } = await client.knowledgeBase.search(kb.id, {\n *   query: 'How to get started?'\n * })\n * ```\n *\n * @category AI\n */\nexport class FluxbaseKnowledgeBase {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  // ===========================================================================\n  // KNOWLEDGE BASE CRUD\n  // ===========================================================================\n\n  /**\n   * List all knowledge bases the user has access to\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.knowledgeBase.list()\n   * ```\n   */\n  async list(): Promise<FluxbaseResponse<KnowledgeBaseSummary[]>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBaseSummary[]>(\n        \"/api/v1/ai/knowledge-bases\",\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a knowledge base by ID\n   *\n   * @param id - Knowledge base ID\n   */\n  async get(id: string): Promise<FluxbaseResponse<KnowledgeBase>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBase>(\n        `/api/v1/ai/knowledge-bases/${id}`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new knowledge base\n   *\n   * @param request - Knowledge base configuration\n   * @example\n   * ```typescript\n   * const { data, error } = await client.knowledgeBase.create({\n   *   name: 'Product Docs',\n   *   description: 'Product documentation',\n   *   embedding_model: 'text-embedding-3-small',\n   *   chunk_size: 1000,\n   *   chunk_overlap: 200\n   * })\n   * ```\n   */\n  async create(\n    request: CreateKnowledgeBaseRequest,\n  ): Promise<FluxbaseResponse<KnowledgeBase>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBase>(\n        \"/api/v1/ai/knowledge-bases\",\n        { method: \"POST\", body: request },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a knowledge base\n   *\n   * @param id - Knowledge base ID\n   * @param updates - Fields to update\n   */\n  async update(\n    id: string,\n    updates: UpdateKnowledgeBaseRequest,\n  ): Promise<FluxbaseResponse<KnowledgeBase>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBase>(\n        `/api/v1/ai/knowledge-bases/${id}`,\n        { method: \"PATCH\", body: updates },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a knowledge base\n   *\n   * @param id - Knowledge base ID\n   */\n  async delete(id: string): Promise<{ data: boolean; error: Error | null }> {\n    try {\n      await this.fetch.request<void>(`/api/v1/ai/knowledge-bases/${id}`, {\n        method: \"DELETE\",\n      });\n      return { data: true, error: null };\n    } catch (error) {\n      return { data: false, error: error as Error };\n    }\n  }\n\n  // ===========================================================================\n  // DOCUMENT MANAGEMENT\n  // ===========================================================================\n\n  /**\n   * List documents in a knowledge base\n   *\n   * @param kbId - Knowledge base ID\n   */\n  async listDocuments(\n    kbId: string,\n  ): Promise<FluxbaseResponse<KnowledgeBaseDocument[]>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBaseDocument[]>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a single document\n   *\n   * @param kbId - Knowledge base ID\n   * @param docId - Document ID\n   */\n  async getDocument(\n    kbId: string,\n    docId: string,\n  ): Promise<FluxbaseResponse<KnowledgeBaseDocument>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBaseDocument>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents/${docId}`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Add a document with text content\n   *\n   * @param kbId - Knowledge base ID\n   * @param request - Document content and metadata\n   * @example\n   * ```typescript\n   * const { data } = await client.knowledgeBase.addDocument(kbId, {\n   *   title: 'API Reference',\n   *   content: 'The API supports REST and GraphQL...',\n   *   metadata: { category: 'reference' },\n   *   tags: ['api', 'reference']\n   * })\n   * ```\n   */\n  async addDocument(\n    kbId: string,\n    request: AddDocumentRequest,\n  ): Promise<FluxbaseResponse<AddDocumentResponse>> {\n    try {\n      const data = await this.fetch.request<AddDocumentResponse>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents`,\n        { method: \"POST\", body: request },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Upload a file as a document\n   *\n   * Supports: PDF, TXT, MD, HTML, CSV, DOCX, XLSX, RTF, EPUB, JSON (max 50MB)\n   *\n   * @param kbId - Knowledge base ID\n   * @param file - File to upload (File, Blob, or ArrayBuffer)\n   * @param filename - Name of the file\n   * @param metadata - Optional metadata\n   * @example\n   * ```typescript\n   * const file = new File(['content'], 'guide.pdf', { type: 'application/pdf' })\n   * const { data } = await client.knowledgeBase.uploadDocument(kbId, file, 'guide.pdf')\n   * ```\n   */\n  async uploadDocument(\n    kbId: string,\n    file: File | Blob | ArrayBuffer,\n    filename: string,\n    metadata?: Record<string, string>,\n  ): Promise<FluxbaseResponse<UploadDocumentResponse>> {\n    try {\n      const formData = new FormData();\n      formData.append(\"file\", file instanceof Blob ? file : new Blob([file]), filename);\n      if (metadata) {\n        for (const [key, value] of Object.entries(metadata)) {\n          formData.append(`metadata[${key}]`, value);\n        }\n      }\n      const data = await this.fetch.request<UploadDocumentResponse>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents/upload`,\n        { method: \"POST\", body: formData },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a document's metadata\n   *\n   * @param kbId - Knowledge base ID\n   * @param docId - Document ID\n   * @param updates - Fields to update\n   */\n  async updateDocument(\n    kbId: string,\n    docId: string,\n    updates: UpdateDocumentRequest,\n  ): Promise<FluxbaseResponse<KnowledgeBaseDocument>> {\n    try {\n      const data = await this.fetch.request<KnowledgeBaseDocument>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents/${docId}`,\n        { method: \"PATCH\", body: updates },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a document\n   *\n   * @param kbId - Knowledge base ID\n   * @param docId - Document ID\n   */\n  async deleteDocument(\n    kbId: string,\n    docId: string,\n  ): Promise<{ data: boolean; error: Error | null }> {\n    try {\n      await this.fetch.request<void>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents/${docId}`,\n        { method: \"DELETE\" },\n      );\n      return { data: true, error: null };\n    } catch (error) {\n      return { data: false, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete documents matching a filter (bulk operation)\n   *\n   * @param kbId - Knowledge base ID\n   * @param filter - Filter criteria (by tags and/or metadata)\n   */\n  async deleteDocumentsByFilter(\n    kbId: string,\n    filter: DeleteDocumentsByFilterRequest,\n  ): Promise<FluxbaseResponse<DeleteDocumentsByFilterResponse>> {\n    try {\n      const data = await this.fetch.request<DeleteDocumentsByFilterResponse>(\n        `/api/v1/ai/knowledge-bases/${kbId}/documents/delete-by-filter`,\n        { method: \"POST\", body: filter },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ===========================================================================\n  // SEARCH\n  // ===========================================================================\n\n  /**\n   * Search a knowledge base using semantic similarity\n   *\n   * Automatically embeds the query text and returns matching chunks.\n   *\n   * @param kbId - Knowledge base ID\n   * @param request - Search parameters\n   * @example\n   * ```typescript\n   * const { data, error } = await client.knowledgeBase.search(kbId, {\n   *   query: 'How to configure authentication?',\n   *   max_chunks: 5,\n   *   threshold: 0.8\n   * })\n   *\n   * data.results.forEach(result => {\n   *   console.log(result.document_title, result.similarity)\n   *   console.log(result.content)\n   * })\n   * ```\n   */\n  async search(\n    kbId: string,\n    request: SearchKnowledgeBaseRequest,\n  ): Promise<FluxbaseResponse<SearchKnowledgeBaseResponse>> {\n    try {\n      const data = await this.fetch.request<SearchKnowledgeBaseResponse>(\n        `/api/v1/ai/knowledge-bases/${kbId}/search`,\n        { method: \"POST\", body: request },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  // ===========================================================================\n  // ENTITIES & KNOWLEDGE GRAPH\n  // ===========================================================================\n\n  /**\n   * List entities in a knowledge base\n   *\n   * @param kbId - Knowledge base ID\n   * @param type - Optional entity type filter\n   */\n  async listEntities(\n    kbId: string,\n    type?: EntityType,\n  ): Promise<FluxbaseResponse<Entity[]>> {\n    try {\n      const params = type ? `?type=${type}` : \"\";\n      const data = await this.fetch.request<Entity[]>(\n        `/api/v1/ai/knowledge-bases/${kbId}/entities${params}`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Search entities by name\n   *\n   * @param kbId - Knowledge base ID\n   * @param query - Search query\n   */\n  async searchEntities(\n    kbId: string,\n    query: string,\n  ): Promise<FluxbaseResponse<Entity[]>> {\n    try {\n      const data = await this.fetch.request<Entity[]>(\n        `/api/v1/ai/knowledge-bases/${kbId}/entities/search?q=${encodeURIComponent(query)}`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get relationships for an entity\n   *\n   * @param kbId - Knowledge base ID\n   * @param entityId - Entity ID\n   */\n  async getEntityRelationships(\n    kbId: string,\n    entityId: string,\n  ): Promise<FluxbaseResponse<EntityRelationship[]>> {\n    try {\n      const data = await this.fetch.request<EntityRelationship[]>(\n        `/api/v1/ai/knowledge-bases/${kbId}/entities/${entityId}/relationships`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get the full knowledge graph for a knowledge base\n   *\n   * Returns all entities and relationships for visualization.\n   *\n   * @param kbId - Knowledge base ID\n   */\n  async getKnowledgeGraph(\n    kbId: string,\n  ): Promise<FluxbaseResponse<KnowledgeGraphData>> {\n    try {\n      const data = await this.fetch.request<KnowledgeGraphData>(\n        `/api/v1/ai/knowledge-bases/${kbId}/graph`,\n        { method: \"GET\" },\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * GraphQL client for Fluxbase\n *\n * Provides a type-safe interface for executing GraphQL queries and mutations\n * against the auto-generated GraphQL schema from your database tables.\n *\n * @example\n * ```typescript\n * import { createClient } from '@nimbleflux/fluxbase-sdk'\n *\n * const client = createClient({ url: 'http://localhost:8080' })\n *\n * // Execute a query\n * const { data, errors } = await client.graphql.query(`\n *   query GetUsers($limit: Int) {\n *     users(limit: $limit) {\n *       id\n *       email\n *       posts {\n *         title\n *       }\n *     }\n *   }\n * `, { limit: 10 })\n *\n * // Execute a mutation\n * const { data, errors } = await client.graphql.mutation(`\n *   mutation CreateUser($data: UserInput!) {\n *     insertUser(data: $data) {\n *       id\n *       email\n *     }\n *   }\n * `, { data: { email: 'user@example.com' } })\n * ```\n *\n * @category GraphQL\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\n\n/**\n * GraphQL error location in the query\n */\nexport interface GraphQLErrorLocation {\n  line: number;\n  column: number;\n}\n\n/**\n * GraphQL error returned from the server\n */\nexport interface GraphQLError {\n  message: string;\n  locations?: GraphQLErrorLocation[];\n  path?: (string | number)[];\n  extensions?: Record<string, unknown>;\n}\n\n/**\n * GraphQL response from the server\n */\nexport interface GraphQLResponse<T = unknown> {\n  data?: T;\n  errors?: GraphQLError[];\n}\n\n/**\n * Options for GraphQL requests\n */\nexport interface GraphQLRequestOptions {\n  /**\n   * Custom headers to include in the request\n   */\n  headers?: Record<string, string>;\n\n  /**\n   * Request timeout in milliseconds\n   */\n  timeout?: number;\n}\n\n/**\n * GraphQL client class for executing queries and mutations\n *\n * @category GraphQL\n */\nexport class FluxbaseGraphQL {\n  private fetch: FluxbaseFetch;\n\n  /**\n   * Create a new GraphQL client\n   * @param fetch - The HTTP client to use for requests\n   */\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * Execute a GraphQL query\n   *\n   * @typeParam T - The expected response data type\n   * @param query - The GraphQL query string\n   * @param variables - Variables to pass to the query\n   * @param options - Additional request options\n   * @returns Promise resolving to the GraphQL response\n   *\n   * @example\n   * ```typescript\n   * interface UsersQuery {\n   *   users: Array<{ id: string; email: string }>\n   * }\n   *\n   * const { data, errors } = await client.graphql.query<UsersQuery>(`\n   *   query {\n   *     users { id email }\n   *   }\n   * `)\n   *\n   * if (data) {\n   *   console.log(data.users)\n   * }\n   * ```\n   */\n  async query<T = unknown>(\n    query: string,\n    variables?: Record<string, unknown>,\n    options?: GraphQLRequestOptions\n  ): Promise<GraphQLResponse<T>> {\n    return this.execute<T>(query, variables, undefined, options);\n  }\n\n  /**\n   * Execute a GraphQL mutation\n   *\n   * @typeParam T - The expected response data type\n   * @param mutation - The GraphQL mutation string\n   * @param variables - Variables to pass to the mutation\n   * @param options - Additional request options\n   * @returns Promise resolving to the GraphQL response\n   *\n   * @example\n   * ```typescript\n   * interface CreateUserMutation {\n   *   insertUser: { id: string; email: string }\n   * }\n   *\n   * const { data, errors } = await client.graphql.mutation<CreateUserMutation>(`\n   *   mutation CreateUser($data: UserInput!) {\n   *     insertUser(data: $data) {\n   *       id\n   *       email\n   *     }\n   *   }\n   * `, { data: { email: 'user@example.com' } })\n   * ```\n   */\n  async mutation<T = unknown>(\n    mutation: string,\n    variables?: Record<string, unknown>,\n    options?: GraphQLRequestOptions\n  ): Promise<GraphQLResponse<T>> {\n    return this.execute<T>(mutation, variables, undefined, options);\n  }\n\n  /**\n   * Execute a GraphQL request with an operation name\n   *\n   * Use this when your query document contains multiple operations\n   * and you need to specify which one to execute.\n   *\n   * @typeParam T - The expected response data type\n   * @param query - The GraphQL document containing one or more operations\n   * @param variables - Variables to pass to the operation\n   * @param operationName - The name of the operation to execute\n   * @param options - Additional request options\n   * @returns Promise resolving to the GraphQL response\n   *\n   * @example\n   * ```typescript\n   * const { data } = await client.graphql.execute(`\n   *   query GetUser($id: ID!) {\n   *     user(id: $id) { id email }\n   *   }\n   *   query ListUsers {\n   *     users { id email }\n   *   }\n   * `, { id: '123' }, 'GetUser')\n   * ```\n   */\n  async execute<T = unknown>(\n    query: string,\n    variables?: Record<string, unknown>,\n    operationName?: string,\n    options?: GraphQLRequestOptions\n  ): Promise<GraphQLResponse<T>> {\n    const body: Record<string, unknown> = { query };\n\n    if (variables && Object.keys(variables).length > 0) {\n      body.variables = variables;\n    }\n\n    if (operationName) {\n      body.operationName = operationName;\n    }\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      ...options?.headers,\n    };\n\n    try {\n      const response = await this.fetch.post<GraphQLResponse<T>>(\n        \"/api/v1/graphql\",\n        body,\n        { headers }\n      );\n\n      // Return the GraphQL response (which may contain both data and errors)\n      return response || { errors: [{ message: \"No response received\" }] };\n    } catch (err) {\n      // Network or HTTP error\n      const message = err instanceof Error ? err.message : \"GraphQL request failed\";\n      return {\n        errors: [{ message }],\n      };\n    }\n  }\n\n  /**\n   * Fetch the GraphQL schema via introspection\n   *\n   * Returns the full schema information including types, fields, and directives.\n   * Useful for tooling and documentation.\n   *\n   * @param options - Additional request options\n   * @returns Promise resolving to the introspection result\n   *\n   * @example\n   * ```typescript\n   * const { data, errors } = await client.graphql.introspect()\n   *\n   * if (data) {\n   *   console.log('Types:', data.__schema.types.length)\n   * }\n   * ```\n   */\n  async introspect(\n    options?: GraphQLRequestOptions\n  ): Promise<GraphQLResponse<{ __schema: IntrospectionSchema }>> {\n    return this.query(INTROSPECTION_QUERY, undefined, options);\n  }\n}\n\n/**\n * GraphQL introspection schema type\n */\nexport interface IntrospectionSchema {\n  queryType: { name: string };\n  mutationType?: { name: string };\n  subscriptionType?: { name: string };\n  types: IntrospectionType[];\n  directives: IntrospectionDirective[];\n}\n\n/**\n * GraphQL introspection type\n */\nexport interface IntrospectionType {\n  kind: string;\n  name: string;\n  description?: string;\n  fields?: IntrospectionField[];\n  inputFields?: IntrospectionInputValue[];\n  interfaces?: IntrospectionTypeRef[];\n  enumValues?: IntrospectionEnumValue[];\n  possibleTypes?: IntrospectionTypeRef[];\n}\n\n/**\n * GraphQL introspection field\n */\nexport interface IntrospectionField {\n  name: string;\n  description?: string;\n  args: IntrospectionInputValue[];\n  type: IntrospectionTypeRef;\n  isDeprecated: boolean;\n  deprecationReason?: string;\n}\n\n/**\n * GraphQL introspection input value\n */\nexport interface IntrospectionInputValue {\n  name: string;\n  description?: string;\n  type: IntrospectionTypeRef;\n  defaultValue?: string;\n}\n\n/**\n * GraphQL introspection type reference\n */\nexport interface IntrospectionTypeRef {\n  kind: string;\n  name?: string;\n  ofType?: IntrospectionTypeRef;\n}\n\n/**\n * GraphQL introspection enum value\n */\nexport interface IntrospectionEnumValue {\n  name: string;\n  description?: string;\n  isDeprecated: boolean;\n  deprecationReason?: string;\n}\n\n/**\n * GraphQL introspection directive\n */\nexport interface IntrospectionDirective {\n  name: string;\n  description?: string;\n  locations: string[];\n  args: IntrospectionInputValue[];\n}\n\n/**\n * Standard GraphQL introspection query\n */\nconst INTROSPECTION_QUERY = `\nquery IntrospectionQuery {\n  __schema {\n    queryType { name }\n    mutationType { name }\n    subscriptionType { name }\n    types {\n      ...FullType\n    }\n    directives {\n      name\n      description\n      locations\n      args {\n        ...InputValue\n      }\n    }\n  }\n}\n\nfragment FullType on __Type {\n  kind\n  name\n  description\n  fields(includeDeprecated: true) {\n    name\n    description\n    args {\n      ...InputValue\n    }\n    type {\n      ...TypeRef\n    }\n    isDeprecated\n    deprecationReason\n  }\n  inputFields {\n    ...InputValue\n  }\n  interfaces {\n    ...TypeRef\n  }\n  enumValues(includeDeprecated: true) {\n    name\n    description\n    isDeprecated\n    deprecationReason\n  }\n  possibleTypes {\n    ...TypeRef\n  }\n}\n\nfragment InputValue on __InputValue {\n  name\n  description\n  type { ...TypeRef }\n  defaultValue\n}\n\nfragment TypeRef on __Type {\n  kind\n  name\n  ofType {\n    kind\n    name\n    ofType {\n      kind\n      name\n      ofType {\n        kind\n        name\n        ofType {\n          kind\n          name\n          ofType {\n            kind\n            name\n            ofType {\n              kind\n              name\n              ofType {\n                kind\n                name\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n`;\n","/**\n * Branching module for Fluxbase SDK\n * Provides database branching capabilities for development workflows\n *\n * @example\n * ```typescript\n * // List all branches\n * const { data, error } = await client.branching.list()\n *\n * // Create a new branch for feature development\n * const { data: branch } = await client.branching.create('feature/add-auth', {\n *   dataCloneMode: 'schema_only',\n *   expiresIn: '7d'\n * })\n *\n * // Get branch details\n * const { data: details } = await client.branching.get('feature/add-auth')\n *\n * // Reset branch to parent state\n * await client.branching.reset('feature/add-auth')\n *\n * // Delete branch when done\n * await client.branching.delete('feature/add-auth')\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  Branch,\n  BranchActivity,\n  BranchPoolStats,\n  CreateBranchOptions,\n  ListBranchesOptions,\n  ListBranchesResponse,\n} from \"./types\";\n\n/**\n * Branching client for database branch management\n *\n * Database branches allow you to create isolated copies of your database\n * for development, testing, and preview environments.\n *\n * @category Branching\n */\nexport class FluxbaseBranching {\n  private fetch: FluxbaseFetch;\n\n  constructor(fetch: FluxbaseFetch) {\n    this.fetch = fetch;\n  }\n\n  /**\n   * List all database branches\n   *\n   * @param options - Filter and pagination options\n   * @returns Promise resolving to { data, error } tuple with branches list\n   *\n   * @example\n   * ```typescript\n   * // List all branches\n   * const { data, error } = await client.branching.list()\n   *\n   * // Filter by status\n   * const { data } = await client.branching.list({ status: 'ready' })\n   *\n   * // Filter by type\n   * const { data } = await client.branching.list({ type: 'preview' })\n   *\n   * // Only show my branches\n   * const { data } = await client.branching.list({ mine: true })\n   *\n   * // Pagination\n   * const { data } = await client.branching.list({ limit: 10, offset: 20 })\n   * ```\n   */\n  async list(\n    options?: ListBranchesOptions,\n  ): Promise<{ data: ListBranchesResponse | null; error: Error | null }> {\n    try {\n      const params = new URLSearchParams();\n\n      if (options?.status) {\n        params.append(\"status\", options.status);\n      }\n      if (options?.type) {\n        params.append(\"type\", options.type);\n      }\n      if (options?.githubRepo) {\n        params.append(\"github_repo\", options.githubRepo);\n      }\n      if (options?.mine) {\n        params.append(\"mine\", \"true\");\n      }\n      if (options?.limit !== undefined) {\n        params.append(\"limit\", options.limit.toString());\n      }\n      if (options?.offset !== undefined) {\n        params.append(\"offset\", options.offset.toString());\n      }\n\n      const queryString = params.toString();\n      const url = `/api/v1/admin/branches${queryString ? `?${queryString}` : \"\"}`;\n\n      const response = await this.fetch.get<ListBranchesResponse>(url);\n      return { data: response, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Get a specific branch by ID or slug\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @returns Promise resolving to { data, error } tuple with branch details\n   *\n   * @example\n   * ```typescript\n   * // Get by slug\n   * const { data, error } = await client.branching.get('feature/add-auth')\n   *\n   * // Get by ID\n   * const { data } = await client.branching.get('123e4567-e89b-12d3-a456-426614174000')\n   * ```\n   */\n  async get(\n    idOrSlug: string,\n  ): Promise<{ data: Branch | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<Branch>(\n        `/api/v1/admin/branches/${encodeURIComponent(idOrSlug)}`,\n      );\n      return { data: response, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Create a new database branch\n   *\n   * @param name - Branch name (will be converted to a slug)\n   * @param options - Branch creation options\n   * @returns Promise resolving to { data, error } tuple with created branch\n   *\n   * @example\n   * ```typescript\n   * // Create a simple branch\n   * const { data, error } = await client.branching.create('feature/add-auth')\n   *\n   * // Create with options\n   * const { data } = await client.branching.create('feature/add-auth', {\n   *   dataCloneMode: 'schema_only',  // Don't clone data\n   *   expiresIn: '7d',               // Auto-delete after 7 days\n   *   type: 'persistent'             // Won't auto-delete on PR merge\n   * })\n   *\n   * // Create a PR preview branch\n   * const { data } = await client.branching.create('pr-123', {\n   *   type: 'preview',\n   *   githubPRNumber: 123,\n   *   githubRepo: 'owner/repo',\n   *   expiresIn: '7d'\n   * })\n   *\n   * // Clone with full data (for debugging)\n   * const { data } = await client.branching.create('debug-issue-456', {\n   *   dataCloneMode: 'full_clone'\n   * })\n   * ```\n   */\n  async create(\n    name: string,\n    options?: CreateBranchOptions,\n  ): Promise<{ data: Branch | null; error: Error | null }> {\n    try {\n      const body: Record<string, unknown> = { name };\n\n      if (options?.parentBranchId) {\n        body.parent_branch_id = options.parentBranchId;\n      }\n      if (options?.dataCloneMode) {\n        body.data_clone_mode = options.dataCloneMode;\n      }\n      if (options?.type) {\n        body.type = options.type;\n      }\n      if (options?.githubPRNumber !== undefined) {\n        body.github_pr_number = options.githubPRNumber;\n      }\n      if (options?.githubPRUrl) {\n        body.github_pr_url = options.githubPRUrl;\n      }\n      if (options?.githubRepo) {\n        body.github_repo = options.githubRepo;\n      }\n      if (options?.expiresIn) {\n        body.expires_in = options.expiresIn;\n      }\n\n      const response = await this.fetch.post<Branch>(\n        \"/api/v1/admin/branches\",\n        body,\n      );\n      return { data: response, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Delete a database branch\n   *\n   * This permanently deletes the branch database and all its data.\n   * Cannot delete the main branch.\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @returns Promise resolving to { error } (null on success)\n   *\n   * @example\n   * ```typescript\n   * // Delete a branch\n   * const { error } = await client.branching.delete('feature/add-auth')\n   *\n   * if (error) {\n   *   console.error('Failed to delete branch:', error.message)\n   * }\n   * ```\n   */\n  async delete(idOrSlug: string): Promise<{ error: Error | null }> {\n    try {\n      await this.fetch.delete(\n        `/api/v1/admin/branches/${encodeURIComponent(idOrSlug)}`,\n      );\n      return { error: null };\n    } catch (err) {\n      return { error: err as Error };\n    }\n  }\n\n  /**\n   * Reset a branch to its parent state\n   *\n   * This drops and recreates the branch database, resetting all data\n   * to match the parent branch. Cannot reset the main branch.\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @returns Promise resolving to { data, error } tuple with reset branch\n   *\n   * @example\n   * ```typescript\n   * // Reset a branch\n   * const { data, error } = await client.branching.reset('feature/add-auth')\n   *\n   * if (data) {\n   *   console.log('Branch reset, status:', data.status)\n   * }\n   * ```\n   */\n  async reset(\n    idOrSlug: string,\n  ): Promise<{ data: Branch | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.post<Branch>(\n        `/api/v1/admin/branches/${encodeURIComponent(idOrSlug)}/reset`,\n        {},\n      );\n      return { data: response, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Get activity log for a branch\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @param limit - Maximum number of entries to return (default: 50, max: 100)\n   * @returns Promise resolving to { data, error } tuple with activity entries\n   *\n   * @example\n   * ```typescript\n   * // Get recent activity\n   * const { data, error } = await client.branching.getActivity('feature/add-auth')\n   *\n   * if (data) {\n   *   for (const entry of data) {\n   *     console.log(`${entry.action}: ${entry.status}`)\n   *   }\n   * }\n   *\n   * // Get more entries\n   * const { data } = await client.branching.getActivity('feature/add-auth', 100)\n   * ```\n   */\n  async getActivity(\n    idOrSlug: string,\n    limit: number = 50,\n  ): Promise<{ data: BranchActivity[] | null; error: Error | null }> {\n    try {\n      const response = await this.fetch.get<{ activity: BranchActivity[] }>(\n        `/api/v1/admin/branches/${encodeURIComponent(idOrSlug)}/activity?limit=${limit}`,\n      );\n      return { data: response.activity, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Get connection pool statistics for all branches\n   *\n   * This is useful for monitoring and debugging branch connections.\n   *\n   * @returns Promise resolving to { data, error } tuple with pool stats\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.branching.getPoolStats()\n   *\n   * if (data) {\n   *   for (const pool of data) {\n   *     console.log(`${pool.slug}: ${pool.active_connections} active`)\n   *   }\n   * }\n   * ```\n   */\n  async getPoolStats(): Promise<{\n    data: BranchPoolStats[] | null;\n    error: Error | null;\n  }> {\n    try {\n      const response = await this.fetch.get<{ pools: BranchPoolStats[] }>(\n        \"/api/v1/admin/branches/stats/pools\",\n      );\n      return { data: response.pools, error: null };\n    } catch (err) {\n      return { data: null, error: err as Error };\n    }\n  }\n\n  /**\n   * Check if a branch exists\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @returns Promise resolving to true if branch exists, false otherwise\n   *\n   * @example\n   * ```typescript\n   * const exists = await client.branching.exists('feature/add-auth')\n   *\n   * if (!exists) {\n   *   await client.branching.create('feature/add-auth')\n   * }\n   * ```\n   */\n  async exists(idOrSlug: string): Promise<boolean> {\n    const { data, error } = await this.get(idOrSlug);\n    return !error && data !== null;\n  }\n\n  /**\n   * Wait for a branch to be ready\n   *\n   * Polls the branch status until it reaches 'ready' or an error state.\n   *\n   * @param idOrSlug - Branch ID (UUID) or slug\n   * @param options - Polling options\n   * @returns Promise resolving to { data, error } tuple with ready branch\n   *\n   * @example\n   * ```typescript\n   * // Create branch and wait for it to be ready\n   * const { data: branch } = await client.branching.create('feature/add-auth')\n   *\n   * const { data: ready, error } = await client.branching.waitForReady(branch!.slug, {\n   *   timeout: 60000,     // 60 seconds\n   *   pollInterval: 1000  // Check every second\n   * })\n   *\n   * if (ready) {\n   *   console.log('Branch is ready!')\n   * }\n   * ```\n   */\n  async waitForReady(\n    idOrSlug: string,\n    options?: {\n      /** Timeout in milliseconds (default: 30000) */\n      timeout?: number;\n      /** Poll interval in milliseconds (default: 1000) */\n      pollInterval?: number;\n    },\n  ): Promise<{ data: Branch | null; error: Error | null }> {\n    const timeout = options?.timeout ?? 30000;\n    const pollInterval = options?.pollInterval ?? 1000;\n    const startTime = Date.now();\n\n    while (Date.now() - startTime < timeout) {\n      const { data, error } = await this.get(idOrSlug);\n\n      if (error) {\n        return { data: null, error };\n      }\n\n      if (!data) {\n        return { data: null, error: new Error(\"Branch not found\") };\n      }\n\n      if (data.status === \"ready\") {\n        return { data, error: null };\n      }\n\n      if (data.status === \"error\") {\n        return {\n          data: null,\n          error: new Error(data.error_message ?? \"Branch creation failed\"),\n        };\n      }\n\n      if (data.status === \"deleted\" || data.status === \"deleting\") {\n        return {\n          data: null,\n          error: new Error(\"Branch was deleted\"),\n        };\n      }\n\n      // Wait before next poll\n      await new Promise((resolve) => setTimeout(resolve, pollInterval));\n    }\n\n    return {\n      data: null,\n      error: new Error(\n        `Timeout waiting for branch to be ready after ${timeout}ms`,\n      ),\n    };\n  }\n}\n","/**\n * FluxbaseTenant - Multi-tenant management module\n *\n * Provides methods for managing tenants and admin assignments.\n * With database-per-tenant architecture, each tenant has its own isolated database.\n */\nimport { FluxbaseFetch } from \"./fetch\";\nimport type {\n  Tenant,\n  TenantAdminAssignment,\n  TenantWithRole,\n  CreateTenantOptions,\n  UpdateTenantOptions,\n  AssignAdminOptions,\n} from \"./types\";\n\nimport type { FluxbaseResponse } from \"./types\";\n\n/**\n * FluxbaseTenant provides multi-tenant management functionality\n *\n * @example\n * ```typescript\n * // List tenants I have access to\n * const { data } = await client.tenant.listMine()\n *\n * // Get tenant details\n * const { data } = await client.tenant.get('tenant-id')\n *\n * // Create a tenant (instance admin only)\n * const { data } = await client.tenant.create({\n *   slug: 'acme-corp',\n *   name: 'Acme Corporation'\n * })\n *\n * // Assign admin to tenant (tenant admin only)\n * await client.tenant.assignAdmin('tenant-id', {\n *   user_id: 'user-id'\n * })\n * ```\n *\n * @category Multi-Tenancy\n */\nexport class FluxbaseTenant {\n  constructor(private fetch: FluxbaseFetch) {}\n\n  /**\n   * List all tenants (instance admin only)\n   *\n   * @returns Promise with tenants list or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.list()\n   * ```\n   */\n  async list(): Promise<FluxbaseResponse<Tenant[]>> {\n    try {\n      const data = await this.fetch.get<Tenant[]>(\"/api/v1/admin/tenants\");\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List tenants the current user has access to\n   *\n   * @returns Promise with tenants and user's role in each\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.listMine()\n   * // data: [{ id: '...', slug: 'acme', name: 'Acme', my_role: 'tenant_admin', status: 'active' }]\n   * ```\n   */\n  async listMine(): Promise<FluxbaseResponse<TenantWithRole[]>> {\n    try {\n      const data = await this.fetch.get<TenantWithRole[]>(\"/api/v1/admin/tenants/mine\");\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Get a tenant by ID\n   *\n   * @param id - Tenant ID\n   * @returns Promise with tenant details or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.get('tenant-id')\n   * ```\n   */\n  async get(id: string): Promise<FluxbaseResponse<Tenant>> {\n    try {\n      const data = await this.fetch.get<Tenant>(`/api/v1/admin/tenants/${id}`);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Create a new tenant (instance admin only)\n   *\n   * This creates a new isolated database for the tenant.\n   *\n   * @param options - Tenant creation options\n   * @returns Promise with created tenant or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.create({\n   *   slug: 'acme-corp',\n   *   name: 'Acme Corporation',\n   *   metadata: { plan: 'enterprise' }\n   * })\n   * ```\n   */\n  async create(\n    options: CreateTenantOptions,\n  ): Promise<FluxbaseResponse<Tenant>> {\n    try {\n      const data = await this.fetch.post<Tenant>(\"/api/v1/admin/tenants\", options);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Update a tenant (tenant admin only)\n   *\n   * @param id - Tenant ID\n   * @param options - Update options\n   * @returns Promise with updated tenant or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.update('tenant-id', {\n   *   name: 'New Name'\n   * })\n   * ```\n   */\n  async update(\n    id: string,\n    options: UpdateTenantOptions,\n  ): Promise<FluxbaseResponse<Tenant>> {\n    try {\n      const data = await this.fetch.patch<Tenant>(`/api/v1/admin/tenants/${id}`, options);\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Delete a tenant (instance admin only)\n   *\n   * This permanently deletes the tenant's database and all its data.\n   * Cannot delete the default tenant.\n   *\n   * @param id - Tenant ID\n   * @returns Promise that resolves when deleted\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.tenant.delete('tenant-id')\n   * ```\n   */\n  async delete(id: string): Promise<FluxbaseResponse<void>> {\n    try {\n      await this.fetch.delete(`/api/v1/admin/tenants/${id}`);\n      return { data: undefined, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Migrate a tenant database to the latest schema (instance admin only)\n   *\n   * @param id - Tenant ID\n   * @returns Promise with migration status or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.migrate('tenant-id')\n   * // data: { status: 'migrated' }\n   * ```\n   */\n  async migrate(id: string): Promise<FluxbaseResponse<{ status: string }>> {\n    try {\n      const data = await this.fetch.post<{ status: string }>(\n        `/api/v1/admin/tenants/${id}/migrate`,\n        {},\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * List admins of a tenant\n   *\n   * @param tenantId - Tenant ID\n   * @returns Promise with admin list or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.listAdmins('tenant-id')\n   * // data: [{ id: '...', tenant_id: '...', user_id: '...', email: 'admin@example.com' }]\n   * ```\n   */\n  async listAdmins(\n    tenantId: string,\n  ): Promise<FluxbaseResponse<TenantAdminAssignment[]>> {\n    try {\n      const data = await this.fetch.get<TenantAdminAssignment[]>(\n        `/api/v1/admin/tenants/${tenantId}/admins`,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Assign an admin to a tenant (tenant admin only)\n   *\n   * @param tenantId - Tenant ID\n   * @param options - Admin assignment options\n   * @returns Promise with created assignment or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.tenant.assignAdmin('tenant-id', {\n   *   user_id: 'user-id'\n   * })\n   * ```\n   */\n  async assignAdmin(\n    tenantId: string,\n    options: AssignAdminOptions,\n  ): Promise<FluxbaseResponse<TenantAdminAssignment>> {\n    try {\n      const data = await this.fetch.post<TenantAdminAssignment>(\n        `/api/v1/admin/tenants/${tenantId}/admins`,\n        options,\n      );\n      return { data, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n\n  /**\n   * Remove an admin from a tenant (tenant admin only)\n   *\n   * @param tenantId - Tenant ID\n   * @param userId - User ID\n   * @returns Promise that resolves when removed\n   *\n   * @example\n   * ```typescript\n   * const { error } = await client.tenant.removeAdmin('tenant-id', 'user-id')\n   * ```\n   */\n  async removeAdmin(\n    tenantId: string,\n    userId: string,\n  ): Promise<FluxbaseResponse<void>> {\n    try {\n      await this.fetch.delete(`/api/v1/admin/tenants/${tenantId}/admins/${userId}`);\n      return { data: undefined, error: null };\n    } catch (error) {\n      return { data: null, error: error as Error };\n    }\n  }\n}\n","/**\n * PostgreSQL query builder for Fluxbase SDK\n * Inspired by Supabase's PostgREST client\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n  CountType,\n  FilterOperator,\n  OrderBy,\n  PostgrestResponse,\n  SelectOptions,\n  UpsertOptions,\n  VectorMetric,\n} from \"./types\";\n\n// Threshold for switching to POST-based queries (4KB)\nconst URL_LENGTH_THRESHOLD = 4096;\n\nexport class QueryBuilder<T = unknown>\n  implements PromiseLike<PostgrestResponse<T>>\n{\n  private fetch: FluxbaseFetch;\n  private table: string;\n  private schema?: string;\n  private selectQuery: string = \"*\";\n  private filters: Array<{\n    column: string;\n    operator: FilterOperator;\n    value: unknown;\n  }> = [];\n  private orFilters: string[] = [];\n  private andFilters: string[] = [];\n  private betweenFilters: Array<{\n    column: string;\n    min: unknown;\n    max: unknown;\n    negated: boolean;\n  }> = [];\n  private orderBys: OrderBy[] = [];\n  private limitValue?: number;\n  private offsetValue?: number;\n  private singleRow: boolean = false;\n  private maybeSingleRow: boolean = false;\n  private groupByColumns?: string[];\n  private operationType: \"select\" | \"insert\" | \"update\" | \"delete\" = \"select\";\n  private countType?: CountType;\n  private headOnly: boolean = false;\n  private isCountAggregation: boolean = false;\n  private insertData?: Partial<T> | Array<Partial<T>>;\n  private updateData?: Partial<T>;\n  private truncateValue?: number;\n\n  constructor(fetch: FluxbaseFetch, table: string, schema?: string) {\n    this.fetch = fetch;\n    this.table = table;\n    this.schema = schema;\n  }\n\n  /**\n   * Build the API path for this table, including schema if specified\n   */\n  private buildTablePath(): string {\n    return this.schema\n      ? `/api/v1/tables/${this.schema}/${this.table}`\n      : `/api/v1/tables/${this.table}`;\n  }\n\n  /**\n   * Select columns to return\n   * @example select('*')\n   * @example select('id, name, email')\n   * @example select('id, name, posts(title, content)')\n   * @example select('*', { count: 'exact' }) // Get exact count\n   * @example select('*', { count: 'exact', head: true }) // Get count only (no data)\n   */\n  select(columns: string = \"*\", options?: SelectOptions): this {\n    this.selectQuery = columns;\n    if (options?.count) {\n      this.countType = options.count;\n    }\n    if (options?.head) {\n      this.headOnly = true;\n    }\n    return this;\n  }\n\n  /**\n   * Insert a single row or multiple rows\n   */\n  insert(data: Partial<T> | Array<Partial<T>>): this {\n    this.operationType = \"insert\";\n    this.insertData = data;\n    return this;\n  }\n\n  /**\n   * Upsert (insert or update) rows (Supabase-compatible)\n   * @param data - Row(s) to upsert\n   * @param options - Upsert options (onConflict, ignoreDuplicates, defaultToNull)\n   */\n  async upsert(\n    data: Partial<T> | Array<Partial<T>>,\n    options?: UpsertOptions,\n  ): Promise<PostgrestResponse<T>> {\n    const body = Array.isArray(data) ? data : data;\n\n    // Build Prefer header based on options\n    const preferValues: string[] = [];\n\n    if (options?.ignoreDuplicates) {\n      preferValues.push(\"resolution=ignore-duplicates\");\n    } else {\n      preferValues.push(\"resolution=merge-duplicates\");\n    }\n\n    if (options?.defaultToNull) {\n      preferValues.push(\"missing=default\");\n    }\n\n    const headers: Record<string, string> = {\n      Prefer: preferValues.join(\",\"),\n    };\n\n    // Add onConflict as query parameter if specified\n    let path = this.buildTablePath();\n    if (options?.onConflict) {\n      path += `?on_conflict=${encodeURIComponent(options.onConflict)}`;\n    }\n\n    const response = await this.fetch.post<T>(path, body, { headers });\n\n    return {\n      data: response,\n      error: null,\n      count: Array.isArray(data) ? data.length : 1,\n      status: 201,\n      statusText: \"Created\",\n    };\n  }\n\n  /**\n   * Update rows matching the filters\n   */\n  update(data: Partial<T>): this {\n    this.operationType = \"update\";\n    this.updateData = data;\n    return this;\n  }\n\n  /**\n   * Delete rows matching the filters\n   */\n  delete(): this {\n    this.operationType = \"delete\";\n    return this;\n  }\n\n  /**\n   * Equal to\n   */\n  eq(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"eq\", value });\n    return this;\n  }\n\n  /**\n   * Not equal to\n   */\n  neq(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"neq\", value });\n    return this;\n  }\n\n  /**\n   * Greater than\n   */\n  gt(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"gt\", value });\n    return this;\n  }\n\n  /**\n   * Greater than or equal to\n   */\n  gte(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"gte\", value });\n    return this;\n  }\n\n  /**\n   * Less than\n   */\n  lt(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"lt\", value });\n    return this;\n  }\n\n  /**\n   * Less than or equal to\n   */\n  lte(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"lte\", value });\n    return this;\n  }\n\n  /**\n   * Pattern matching (case-sensitive)\n   */\n  like(column: string, pattern: string): this {\n    this.filters.push({ column, operator: \"like\", value: pattern });\n    return this;\n  }\n\n  /**\n   * Pattern matching (case-insensitive)\n   */\n  ilike(column: string, pattern: string): this {\n    this.filters.push({ column, operator: \"ilike\", value: pattern });\n    return this;\n  }\n\n  /**\n   * Check if value is null or not null\n   */\n  is(column: string, value: null | boolean): this {\n    this.filters.push({ column, operator: \"is\", value });\n    return this;\n  }\n\n  /**\n   * Check if value is in array\n   */\n  in(column: string, values: unknown[]): this {\n    this.filters.push({ column, operator: \"in\", value: values });\n    return this;\n  }\n\n  /**\n   * Contains (for arrays and JSONB)\n   */\n  contains(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"cs\", value });\n    return this;\n  }\n\n  /**\n   * Full-text search\n   */\n  textSearch(column: string, query: string): this {\n    this.filters.push({ column, operator: \"fts\", value: query });\n    return this;\n  }\n\n  /**\n   * Negate a filter condition (Supabase-compatible)\n   * @example not('status', 'eq', 'deleted')\n   * @example not('completed_at', 'is', null)\n   */\n  not(column: string, operator: FilterOperator, value: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"not\" as FilterOperator,\n      value: `${operator}.${this.formatValue(value)}`,\n    });\n    return this;\n  }\n\n  /**\n   * Apply OR logic to filters (Supabase-compatible)\n   * @example or('status.eq.active,status.eq.pending')\n   * @example or('id.eq.2,name.eq.Han')\n   */\n  or(filters: string): this {\n    this.orFilters.push(filters);\n    return this;\n  }\n\n  /**\n   * Apply AND logic to filters (Supabase-compatible)\n   * Groups multiple conditions that must all be true\n   * @example and('status.eq.active,verified.eq.true')\n   * @example and('age.gte.18,age.lte.65')\n   */\n  and(filters: string): this {\n    this.andFilters.push(filters);\n    return this;\n  }\n\n  /**\n   * Match multiple columns with exact values (Supabase-compatible)\n   * Shorthand for multiple .eq() calls\n   * @example match({ id: 1, status: 'active', role: 'admin' })\n   */\n  match(conditions: Record<string, unknown>): this {\n    for (const [column, value] of Object.entries(conditions)) {\n      this.eq(column, value);\n    }\n    return this;\n  }\n\n  /**\n   * Generic filter method using PostgREST syntax (Supabase-compatible)\n   * @example filter('name', 'in', '(\"Han\",\"Yoda\")')\n   * @example filter('age', 'gte', '18')\n   * @example filter('recorded_at', 'between', ['2024-01-01', '2024-01-10'])\n   * @example filter('recorded_at', 'not.between', ['2024-01-01', '2024-01-10'])\n   */\n  filter(column: string, operator: FilterOperator, value: unknown): this {\n    // Handle special compound operators\n    if (operator === \"between\" || operator === \"not.between\") {\n      const [min, max] = this.validateBetweenValue(value, operator);\n      this.betweenFilters.push({\n        column,\n        min,\n        max,\n        negated: operator === \"not.between\",\n      });\n      return this;\n    }\n\n    this.filters.push({ column, operator, value });\n    return this;\n  }\n\n  /**\n   * Check if column is contained by value (Supabase-compatible)\n   * For arrays and JSONB\n   * @example containedBy('tags', '[\"news\",\"update\"]')\n   */\n  containedBy(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"cd\", value });\n    return this;\n  }\n\n  /**\n   * Check if arrays have common elements (Supabase-compatible)\n   * @example overlaps('tags', '[\"news\",\"sports\"]')\n   */\n  overlaps(column: string, value: unknown): this {\n    this.filters.push({ column, operator: \"ov\", value });\n    return this;\n  }\n\n  /**\n   * Filter column value within an inclusive range (BETWEEN)\n   * Generates: AND (column >= min AND column <= max)\n   *\n   * @param column - Column name to filter\n   * @param min - Minimum value (inclusive)\n   * @param max - Maximum value (inclusive)\n   * @example between('recorded_at', '2024-01-01', '2024-01-10')\n   * @example between('price', 10, 100)\n   */\n  between(column: string, min: unknown, max: unknown): this {\n    return this.filter(column, \"between\", [min, max]);\n  }\n\n  /**\n   * Filter column value outside an inclusive range (NOT BETWEEN)\n   * Generates: OR (column < min OR column > max)\n   * Multiple notBetween calls on the same column AND together\n   *\n   * @param column - Column name to filter\n   * @param min - Minimum value of excluded range\n   * @param max - Maximum value of excluded range\n   * @example notBetween('recorded_at', '2024-01-01', '2024-01-10')\n   * @example notBetween('price', 0, 10) // Excludes items priced 0-10\n   */\n  notBetween(column: string, min: unknown, max: unknown): this {\n    return this.filter(column, \"not.between\", [min, max]);\n  }\n\n  // PostGIS Spatial Query Methods\n\n  /**\n   * Check if geometries intersect (PostGIS ST_Intersects)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test intersection with\n   * @example intersects('location', { type: 'Point', coordinates: [-122.4, 37.8] })\n   */\n  intersects(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_intersects\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Check if geometry A contains geometry B (PostGIS ST_Contains)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test containment\n   * @example contains('region', { type: 'Point', coordinates: [-122.4, 37.8] })\n   */\n  stContains(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_contains\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Check if geometry A is within geometry B (PostGIS ST_Within)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test containment within\n   * @example within('point', { type: 'Polygon', coordinates: [[...]] })\n   */\n  within(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_within\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Check if geometries touch (PostGIS ST_Touches)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test touching\n   * @example touches('boundary', { type: 'LineString', coordinates: [[...]] })\n   */\n  touches(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_touches\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Check if geometries cross (PostGIS ST_Crosses)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test crossing\n   * @example crosses('road', { type: 'LineString', coordinates: [[...]] })\n   */\n  crosses(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_crosses\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Check if geometries spatially overlap (PostGIS ST_Overlaps)\n   * @param column - Column containing geometry/geography data\n   * @param geojson - GeoJSON object to test overlap\n   * @example stOverlaps('area', { type: 'Polygon', coordinates: [[...]] })\n   */\n  stOverlaps(column: string, geojson: unknown): this {\n    this.filters.push({\n      column,\n      operator: \"st_overlaps\" as FilterOperator,\n      value: geojson,\n    });\n    return this;\n  }\n\n  /**\n   * Order results\n   */\n  order(\n    column: string,\n    options?: { ascending?: boolean; nullsFirst?: boolean },\n  ): this {\n    this.orderBys.push({\n      column,\n      direction: options?.ascending === false ? \"desc\" : \"asc\",\n      nulls: options?.nullsFirst ? \"first\" : \"last\",\n    });\n    return this;\n  }\n\n  /**\n   * Order results by vector similarity (pgvector)\n   * Results are ordered by distance (ascending = closest first)\n   *\n   * @example\n   * ```typescript\n   * // Order by cosine similarity (closest matches first)\n   * const { data } = await client\n   *   .from('documents')\n   *   .select('id, title, content')\n   *   .orderByVector('embedding', queryVector, 'cosine')\n   *   .limit(10)\n   * ```\n   *\n   * @param column - The vector column to order by\n   * @param vector - The query vector to compare against\n   * @param metric - Distance metric: 'l2' (euclidean), 'cosine', or 'inner_product'\n   * @param options - Optional: { ascending?: boolean } - defaults to true (closest first)\n   */\n  orderByVector(\n    column: string,\n    vector: number[],\n    metric: VectorMetric = \"cosine\",\n    options?: { ascending?: boolean },\n  ): this {\n    const opMap: Record<VectorMetric, \"vec_l2\" | \"vec_cos\" | \"vec_ip\"> = {\n      l2: \"vec_l2\",\n      cosine: \"vec_cos\",\n      inner_product: \"vec_ip\",\n    };\n\n    this.orderBys.push({\n      column,\n      direction: options?.ascending === false ? \"desc\" : \"asc\",\n      vectorOp: opMap[metric],\n      vectorValue: vector,\n    });\n    return this;\n  }\n\n  /**\n   * Filter by vector similarity (pgvector)\n   * This is a convenience method that adds a vector filter using the specified distance metric.\n   * Typically used with orderByVector() for similarity search.\n   *\n   * @example\n   * ```typescript\n   * // Find the 10 most similar documents\n   * const { data } = await client\n   *   .from('documents')\n   *   .select('id, title, content')\n   *   .vectorSearch('embedding', queryVector, 'cosine')\n   *   .limit(10)\n   *\n   * // Combine with other filters\n   * const { data } = await client\n   *   .from('documents')\n   *   .select('id, title, content')\n   *   .eq('status', 'published')\n   *   .vectorSearch('embedding', queryVector)\n   *   .limit(10)\n   * ```\n   *\n   * @param column - The vector column to search\n   * @param vector - The query vector\n   * @param metric - Distance metric: 'l2' (euclidean), 'cosine', or 'inner_product'\n   */\n  vectorSearch(\n    column: string,\n    vector: number[],\n    metric: VectorMetric = \"cosine\",\n  ): this {\n    const opMap: Record<VectorMetric, FilterOperator> = {\n      l2: \"vec_l2\",\n      cosine: \"vec_cos\",\n      inner_product: \"vec_ip\",\n    };\n\n    // Add the filter (this will be used to generate ORDER BY clause)\n    this.filters.push({\n      column,\n      operator: opMap[metric],\n      value: vector,\n    });\n\n    // Also add ordering by vector similarity (ascending - lower distance = more similar)\n    this.orderByVector(column, vector, metric, { ascending: true });\n\n    return this;\n  }\n\n  /**\n   * Limit number of rows returned\n   */\n  limit(count: number): this {\n    this.limitValue = count;\n    return this;\n  }\n\n  /**\n   * Skip rows\n   */\n  offset(count: number): this {\n    this.offsetValue = count;\n    return this;\n  }\n\n  /**\n   * Truncate text columns to specified length\n   * Useful for browsing tables with large text fields\n   * @example truncate(500) // Truncate text columns to 500 characters\n   */\n  truncate(length: number): this {\n    this.truncateValue = length;\n    return this;\n  }\n\n  /**\n   * Return a single row (adds limit(1))\n   * Errors if no rows found\n   */\n  single(): this {\n    this.singleRow = true;\n    this.limitValue = 1;\n    return this;\n  }\n\n  /**\n   * Return a single row or null (adds limit(1))\n   * Does not error if no rows found (Supabase-compatible)\n   * @example\n   * ```typescript\n   * // Returns null instead of erroring when no row exists\n   * const { data, error } = await client\n   *   .from('users')\n   *   .select('*')\n   *   .eq('id', 999)\n   *   .maybeSingle()\n   * // data will be null if no row found\n   * ```\n   */\n  maybeSingle(): this {\n    this.maybeSingleRow = true;\n    this.limitValue = 1;\n    return this;\n  }\n\n  /**\n   * Range selection (pagination)\n   */\n  range(from: number, to: number): this {\n    this.offsetValue = from;\n    this.limitValue = to - from + 1;\n    return this;\n  }\n\n  /**\n   * Group results by one or more columns (for use with aggregations)\n   *\n   * @param columns - Column name(s) to group by\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Group by single column\n   * const { data } = await client.from('orders')\n   *   .count('*')\n   *   .groupBy('status')\n   *   .execute()\n   *\n   * // Group by multiple columns\n   * const { data } = await client.from('sales')\n   *   .sum('amount')\n   *   .groupBy(['region', 'product_category'])\n   *   .execute()\n   * ```\n   *\n   * @category Aggregation\n   */\n  groupBy(columns: string | string[]): this {\n    this.groupByColumns = Array.isArray(columns) ? columns : [columns];\n    return this;\n  }\n\n  /**\n   * Count rows or a specific column\n   *\n   * @param column - Column to count (default: '*' for row count)\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Count all rows\n   * const { data } = await client.from('users').count().execute()\n   * // Returns: { count: 150 }\n   *\n   * // Count non-null values in a column\n   * const { data } = await client.from('orders').count('completed_at').execute()\n   *\n   * // Count with grouping\n   * const { data } = await client.from('products')\n   *   .count('*')\n   *   .groupBy('category')\n   *   .execute()\n   * // Returns: [{ category: 'electronics', count: 45 }, { category: 'books', count: 23 }]\n   * ```\n   *\n   * @category Aggregation\n   */\n  count(column: string = \"*\"): this {\n    this.selectQuery = `count(${column})`;\n    this.isCountAggregation = true;\n    return this;\n  }\n\n  /**\n   * Calculate the sum of a numeric column\n   *\n   * @param column - Column to sum\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Sum all prices\n   * const { data } = await client.from('products').sum('price').execute()\n   * // Returns: { sum_price: 15420.50 }\n   *\n   * // Sum by category\n   * const { data } = await client.from('orders')\n   *   .sum('total')\n   *   .groupBy('status')\n   *   .execute()\n   * // Returns: [{ status: 'completed', sum_total: 12500 }, { status: 'pending', sum_total: 3200 }]\n   * ```\n   *\n   * @category Aggregation\n   */\n  sum(column: string): this {\n    this.selectQuery = `sum(${column})`;\n    return this;\n  }\n\n  /**\n   * Calculate the average of a numeric column\n   *\n   * @param column - Column to average\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Average price\n   * const { data } = await client.from('products').avg('price').execute()\n   * // Returns: { avg_price: 129.99 }\n   *\n   * // Average by category\n   * const { data } = await client.from('products')\n   *   .avg('price')\n   *   .groupBy('category')\n   *   .execute()\n   * ```\n   *\n   * @category Aggregation\n   */\n  avg(column: string): this {\n    this.selectQuery = `avg(${column})`;\n    return this;\n  }\n\n  /**\n   * Find the minimum value in a column\n   *\n   * @param column - Column to find minimum value\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Find lowest price\n   * const { data } = await client.from('products').min('price').execute()\n   * // Returns: { min_price: 9.99 }\n   *\n   * // Find earliest date\n   * const { data } = await client.from('orders').min('created_at').execute()\n   * ```\n   *\n   * @category Aggregation\n   */\n  min(column: string): this {\n    this.selectQuery = `min(${column})`;\n    return this;\n  }\n\n  /**\n   * Find the maximum value in a column\n   *\n   * @param column - Column to find maximum value\n   * @returns Query builder for chaining\n   *\n   * @example\n   * ```typescript\n   * // Find highest price\n   * const { data } = await client.from('products').max('price').execute()\n   * // Returns: { max_price: 1999.99 }\n   *\n   * // Find most recent order\n   * const { data } = await client.from('orders').max('created_at').execute()\n   * ```\n   *\n   * @category Aggregation\n   */\n  max(column: string): this {\n    this.selectQuery = `max(${column})`;\n    return this;\n  }\n\n  /**\n   * Insert multiple rows in a single request (batch insert)\n   *\n   * This is a convenience method that explicitly shows intent for batch operations.\n   * Internally calls `insert()` with an array.\n   *\n   * @param rows - Array of row objects to insert\n   * @returns Promise with the inserted rows\n   *\n   * @example\n   * ```typescript\n   * // Insert multiple users at once\n   * const { data } = await client.from('users').insertMany([\n   *   { name: 'Alice', email: 'alice@example.com' },\n   *   { name: 'Bob', email: 'bob@example.com' },\n   *   { name: 'Charlie', email: 'charlie@example.com' }\n   * ])\n   * ```\n   *\n   * @category Batch Operations\n   */\n  async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n    return this.insert(rows).execute();\n  }\n\n  /**\n   * Update multiple rows matching the filters (batch update)\n   *\n   * Updates all rows that match the current query filters.\n   * This is a convenience method that explicitly shows intent for batch operations.\n   *\n   * @param data - Data to update matching rows with\n   * @returns Promise with the updated rows\n   *\n   * @example\n   * ```typescript\n   * // Apply discount to all electronics\n   * const { data } = await client.from('products')\n   *   .eq('category', 'electronics')\n   *   .updateMany({ discount: 10, updated_at: new Date() })\n   *\n   * // Mark all pending orders as processing\n   * const { data } = await client.from('orders')\n   *   .eq('status', 'pending')\n   *   .updateMany({ status: 'processing' })\n   * ```\n   *\n   * @category Batch Operations\n   */\n  async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n    return this.update(data).execute();\n  }\n\n  /**\n   * Delete multiple rows matching the filters (batch delete)\n   *\n   * Deletes all rows that match the current query filters.\n   * This is a convenience method that explicitly shows intent for batch operations.\n   *\n   * @returns Promise confirming deletion\n   *\n   * @example\n   * ```typescript\n   * // Delete all inactive users\n   * await client.from('users')\n   *   .eq('active', false)\n   *   .deleteMany()\n   *\n   * // Delete old logs\n   * await client.from('logs')\n   *   .lt('created_at', '2024-01-01')\n   *   .deleteMany()\n   * ```\n   *\n   * @category Batch Operations\n   */\n  async deleteMany(): Promise<PostgrestResponse<null>> {\n    return this.delete().execute() as Promise<PostgrestResponse<null>>;\n  }\n\n  /**\n   * Execute the query and return results\n   */\n  async execute(): Promise<PostgrestResponse<T>> {\n    try {\n      // Handle INSERT operation\n      if (this.operationType === \"insert\") {\n        if (!this.insertData) {\n          throw new Error(\"Insert data is required for insert operation\");\n        }\n        const body = Array.isArray(this.insertData)\n          ? this.insertData\n          : this.insertData;\n        const response = await this.fetch.post<T>(this.buildTablePath(), body);\n\n        return {\n          data: response,\n          error: null,\n          count: Array.isArray(this.insertData) ? this.insertData.length : 1,\n          status: 201,\n          statusText: \"Created\",\n        };\n      }\n\n      // Handle UPDATE operation\n      if (this.operationType === \"update\") {\n        if (!this.updateData) {\n          throw new Error(\"Update data is required for update operation\");\n        }\n        const queryString = this.buildQueryString();\n        const path = `${this.buildTablePath()}${queryString}`;\n        const response = await this.fetch.patch<T>(path, this.updateData);\n\n        return {\n          data: response,\n          error: null,\n          count: null,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      // Handle DELETE operation\n      if (this.operationType === \"delete\") {\n        const queryString = this.buildQueryString();\n        const path = `${this.buildTablePath()}${queryString}`;\n        await this.fetch.delete(path);\n\n        return {\n          data: null,\n          error: null,\n          count: null,\n          status: 204,\n          statusText: \"No Content\",\n        } as PostgrestResponse<T>;\n      }\n\n      // Handle SELECT operation (default)\n      // Check if we should use POST-based query (for complex filters exceeding URL limits)\n      if (this.shouldUsePostQuery()) {\n        return this.executePostQuery();\n      }\n\n      const queryString = this.buildQueryString();\n      const path = `${this.buildTablePath()}${queryString}`;\n\n      // When count is requested, use getWithHeaders to access Content-Range header\n      if (this.countType) {\n        const response = await this.fetch.getWithHeaders<T | T[]>(path);\n        const serverCount = this.parseContentRangeCount(response.headers);\n        const data = response.data;\n\n        // Handle head-only request (only return count, no data)\n        if (this.headOnly) {\n          return {\n            data: null,\n            error: null,\n            count: serverCount,\n            status: response.status,\n            statusText: \"OK\",\n          };\n        }\n\n        // Handle single row response with count\n        if (this.singleRow) {\n          if (Array.isArray(data) && data.length === 0) {\n            return {\n              data: null,\n              error: { message: \"No rows found\", code: \"PGRST116\" },\n              count: serverCount ?? 0,\n              status: 404,\n              statusText: \"Not Found\",\n            };\n          }\n          const singleData = Array.isArray(data) ? data[0] : data;\n          return {\n            data: singleData as T,\n            error: null,\n            count: serverCount ?? 1,\n            status: 200,\n            statusText: \"OK\",\n          };\n        }\n\n        // Handle maybeSingle row response with count\n        if (this.maybeSingleRow) {\n          if (Array.isArray(data) && data.length === 0) {\n            return {\n              data: null,\n              error: null,\n              count: serverCount ?? 0,\n              status: 200,\n              statusText: \"OK\",\n            };\n          }\n          const singleData = Array.isArray(data) ? data[0] : data;\n          return {\n            data: singleData as T,\n            error: null,\n            count: serverCount ?? 1,\n            status: 200,\n            statusText: \"OK\",\n          };\n        }\n\n        // Normal response with server count\n        return {\n          data: data as T,\n          error: null,\n          count: serverCount ?? (Array.isArray(data) ? data.length : null),\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      // Standard path without count - use regular get\n      const data = await this.fetch.get<T | T[]>(path);\n\n      // Handle count aggregation response - extract count from data[0].count\n      // Skip if using groupBy (return full array instead)\n      if (this.isCountAggregation && !this.groupByColumns) {\n        if (Array.isArray(data) && data.length === 1) {\n          const countData = data[0] as { count?: number };\n          if (countData && typeof countData.count === \"number\") {\n            return {\n              data: data as T,\n              error: null,\n              count: countData.count,\n              status: 200,\n              statusText: \"OK\",\n            };\n          }\n        }\n        // Handle empty result for count aggregation\n        if (Array.isArray(data) && data.length === 0) {\n          return {\n            data: data as T,\n            error: null,\n            count: 0,\n            status: 200,\n            statusText: \"OK\",\n          };\n        }\n      }\n\n      // Handle single row response\n      if (this.singleRow) {\n        if (Array.isArray(data) && data.length === 0) {\n          return {\n            data: null,\n            error: { message: \"No rows found\", code: \"PGRST116\" },\n            count: 0,\n            status: 404,\n            statusText: \"Not Found\",\n          };\n        }\n        const singleData = Array.isArray(data) ? data[0] : data;\n        return {\n          data: singleData as T,\n          error: null,\n          count: 1,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      // Handle maybeSingle row response (returns null instead of error when no rows found)\n      if (this.maybeSingleRow) {\n        if (Array.isArray(data) && data.length === 0) {\n          return {\n            data: null,\n            error: null,\n            count: 0,\n            status: 200,\n            statusText: \"OK\",\n          };\n        }\n        const singleData = Array.isArray(data) ? data[0] : data;\n        return {\n          data: singleData as T,\n          error: null,\n          count: 1,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      return {\n        data: data as T,\n        error: null,\n        count: Array.isArray(data) ? data.length : null,\n        status: 200,\n        statusText: \"OK\",\n      };\n    } catch (err) {\n      const error = err as Error;\n      return {\n        data: null,\n        error: {\n          message: error.message,\n          code: \"PGRST000\",\n        },\n        count: null,\n        status: 500,\n        statusText: \"Internal Server Error\",\n      };\n    }\n  }\n\n  /**\n   * Execute the query and throw an error if one occurs (Supabase-compatible)\n   * Returns the data directly instead of { data, error } wrapper\n   *\n   * @throws {Error} If the query fails or returns an error\n   * @example\n   * ```typescript\n   * // Throws error instead of returning { data, error }\n   * try {\n   *   const user = await client\n   *     .from('users')\n   *     .select('*')\n   *     .eq('id', 1)\n   *     .single()\n   *     .throwOnError()\n   * } catch (error) {\n   *   console.error('Query failed:', error)\n   * }\n   * ```\n   */\n  async throwOnError(): Promise<T> {\n    const response = await this.execute();\n\n    if (response.error) {\n      const error = new Error(response.error.message);\n      // Preserve error code if available\n      if (response.error.code) {\n        (error as any).code = response.error.code;\n      }\n      throw error;\n    }\n\n    return response.data as T;\n  }\n\n  /**\n   * Make QueryBuilder awaitable (implements PromiseLike)\n   * This allows using `await client.from('table').select()` without calling `.execute()`\n   *\n   * @example\n   * ```typescript\n   * // Without .execute() (new way)\n   * const { data } = await client.from('users').select('*')\n   *\n   * // With .execute() (old way, still supported)\n   * const { data } = await client.from('users').select('*').execute()\n   * ```\n   */\n  then<TResult1 = PostgrestResponse<T>, TResult2 = never>(\n    onfulfilled?:\n      | ((value: PostgrestResponse<T>) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): PromiseLike<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected);\n  }\n\n  /**\n   * Build the query string from filters, ordering, etc.\n   */\n  private buildQueryString(): string {\n    const params = new URLSearchParams();\n\n    // Select\n    if (this.selectQuery && this.selectQuery !== \"*\") {\n      params.append(\"select\", this.selectQuery);\n    }\n\n    // Filters\n    for (const filter of this.filters) {\n      params.append(\n        filter.column,\n        `${filter.operator}.${this.formatValue(filter.value)}`,\n      );\n    }\n\n    // Collect all OR expressions that need to be ANDed together\n    // This includes explicit orFilters and negated betweenFilters\n    const orExpressions: string[] = [];\n\n    // OR Filters (explicit .or() calls)\n    for (const orFilter of this.orFilters) {\n      orExpressions.push(`or(${orFilter})`);\n    }\n\n    // Between Filters - collect negated ones as OR expressions\n    for (const bf of this.betweenFilters) {\n      const minFormatted = this.formatValue(bf.min);\n      const maxFormatted = this.formatValue(bf.max);\n\n      if (bf.negated) {\n        // not.between: or(column.lt.min,column.gt.max)\n        // This generates: WHERE column < min OR column > max\n        orExpressions.push(\n          `or(${bf.column}.lt.${minFormatted},${bf.column}.gt.${maxFormatted})`,\n        );\n      } else {\n        // between: column=gte.min&column=lte.max (two separate filters ANDed)\n        // This generates: WHERE column >= min AND column <= max\n        params.append(bf.column, `gte.${minFormatted}`);\n        params.append(bf.column, `lte.${maxFormatted}`);\n      }\n    }\n\n    // Combine OR expressions efficiently\n    if (orExpressions.length === 1) {\n      // Single OR - use simple or= format (strip outer \"or(\" wrapper)\n      const expr = orExpressions[0]!;\n      const inner = expr.replace(/^or\\(/, \"(\");\n      params.append(\"or\", inner);\n    } else if (orExpressions.length > 1) {\n      // Multiple ORs - combine into single and= parameter with nested or() expressions\n      // This significantly reduces URL length for complex filter sets\n      params.append(\"and\", `(${orExpressions.join(\",\")})`);\n    }\n\n    // AND Filters (explicit .and() calls)\n    for (const andFilter of this.andFilters) {\n      params.append(\"and\", `(${andFilter})`);\n    }\n\n    // Group By\n    if (this.groupByColumns && this.groupByColumns.length > 0) {\n      params.append(\"group_by\", this.groupByColumns.join(\",\"));\n    }\n\n    // Order\n    if (this.orderBys.length > 0) {\n      const orderStr = this.orderBys\n        .map((o) => {\n          if (o.vectorOp && o.vectorValue) {\n            // Vector ordering: column.vec_op.[vector].direction\n            const vectorStr = `[${o.vectorValue.join(\",\")}]`;\n            return `${o.column}.${o.vectorOp}.${vectorStr}.${o.direction}`;\n          }\n          // Standard ordering: column.direction.nulls\n          return `${o.column}.${o.direction}${o.nulls ? `.nulls${o.nulls}` : \"\"}`;\n        })\n        .join(\",\");\n      params.append(\"order\", orderStr);\n    }\n\n    // Limit\n    if (this.limitValue !== undefined) {\n      params.append(\"limit\", String(this.limitValue));\n    }\n\n    // Offset\n    if (this.offsetValue !== undefined) {\n      params.append(\"offset\", String(this.offsetValue));\n    }\n\n    // Count - request server to return total count in Content-Range header\n    if (this.countType) {\n      params.append(\"count\", this.countType);\n    }\n\n    // Truncate - truncate text columns to specified length\n    if (this.truncateValue !== undefined) {\n      params.append(\"truncate\", String(this.truncateValue));\n    }\n\n    const queryString = params.toString();\n    return queryString ? `?${queryString}` : \"\";\n  }\n\n  /**\n   * Format a value for the query string\n   */\n  private formatValue(value: unknown): string {\n    if (value === null) {\n      return \"null\";\n    }\n    if (typeof value === \"boolean\") {\n      return value ? \"true\" : \"false\";\n    }\n    if (Array.isArray(value)) {\n      return `(${value.map((v) => this.formatValue(v)).join(\",\")})`;\n    }\n    if (typeof value === \"object\") {\n      return JSON.stringify(value);\n    }\n    return String(value);\n  }\n\n  /**\n   * Validate between filter value - must be array of exactly 2 elements\n   * @throws Error if value is invalid\n   */\n  private validateBetweenValue(\n    value: unknown,\n    operator: string,\n  ): [unknown, unknown] {\n    if (!Array.isArray(value)) {\n      throw new Error(\n        `Invalid value for '${operator}' operator: expected array of [min, max], got ${typeof value}`,\n      );\n    }\n    if (value.length !== 2) {\n      throw new Error(\n        `Invalid value for '${operator}' operator: expected array with exactly 2 elements [min, max], got ${value.length} elements`,\n      );\n    }\n    const [min, max] = value;\n    if (min === null || min === undefined) {\n      throw new Error(\n        `Invalid value for '${operator}' operator: min value cannot be null or undefined`,\n      );\n    }\n    if (max === null || max === undefined) {\n      throw new Error(\n        `Invalid value for '${operator}' operator: max value cannot be null or undefined`,\n      );\n    }\n    return [min, max];\n  }\n\n  /**\n   * Parse the Content-Range header to extract the total count\n   * Header format: \"0-999/50000\" or \"* /50000\" (when no rows returned)\n   */\n  private parseContentRangeCount(headers: Headers): number | null {\n    const contentRange = headers.get(\"Content-Range\");\n    if (!contentRange) {\n      return null;\n    }\n    // Match the total count after the slash: \"0-999/50000\" -> \"50000\"\n    const match = contentRange.match(/\\/(\\d+)$/);\n    if (match && match[1]) {\n      return parseInt(match[1], 10);\n    }\n    return null;\n  }\n\n  /**\n   * Check if the query should use POST-based query endpoint\n   * Returns true if the query string would exceed the URL length threshold\n   */\n  private shouldUsePostQuery(): boolean {\n    const queryString = this.buildQueryString();\n    return queryString.length > URL_LENGTH_THRESHOLD;\n  }\n\n  /**\n   * Execute a SELECT query using the POST /query endpoint\n   * Used when query parameters would exceed URL length limits\n   */\n  private async executePostQuery(): Promise<PostgrestResponse<T>> {\n    const body = this.buildQueryBody();\n    const path = `${this.buildTablePath()}/query`;\n\n    // When count is requested, use postWithHeaders to access Content-Range header\n    if (this.countType) {\n      const response = await this.fetch.postWithHeaders<T | T[]>(path, body);\n      const serverCount = this.parseContentRangeCount(response.headers);\n      const data = response.data;\n\n      // Handle head-only request (only return count, no data)\n      if (this.headOnly) {\n        return {\n          data: null,\n          error: null,\n          count: serverCount,\n          status: response.status,\n          statusText: \"OK\",\n        };\n      }\n\n      // Handle single row response with count\n      if (this.singleRow) {\n        if (Array.isArray(data) && data.length === 0) {\n          return {\n            data: null,\n            error: { message: \"No rows found\", code: \"PGRST116\" },\n            count: serverCount ?? 0,\n            status: 404,\n            statusText: \"Not Found\",\n          };\n        }\n        const singleData = Array.isArray(data) ? data[0] : data;\n        return {\n          data: singleData as T,\n          error: null,\n          count: serverCount ?? 1,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      // Handle maybeSingle row response with count\n      if (this.maybeSingleRow) {\n        if (Array.isArray(data) && data.length === 0) {\n          return {\n            data: null,\n            error: null,\n            count: serverCount ?? 0,\n            status: 200,\n            statusText: \"OK\",\n          };\n        }\n        const singleData = Array.isArray(data) ? data[0] : data;\n        return {\n          data: singleData as T,\n          error: null,\n          count: serverCount ?? 1,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n\n      // Normal response with server count\n      return {\n        data: data as T,\n        error: null,\n        count: serverCount ?? (Array.isArray(data) ? data.length : null),\n        status: 200,\n        statusText: \"OK\",\n      };\n    }\n\n    // Standard path without count - use regular post\n    const data = await this.fetch.post<T | T[]>(path, body);\n\n    // Handle single row response\n    if (this.singleRow) {\n      if (Array.isArray(data) && data.length === 0) {\n        return {\n          data: null,\n          error: { message: \"No rows found\", code: \"PGRST116\" },\n          count: 0,\n          status: 404,\n          statusText: \"Not Found\",\n        };\n      }\n      const singleData = Array.isArray(data) ? data[0] : data;\n      return {\n        data: singleData as T,\n        error: null,\n        count: 1,\n        status: 200,\n        statusText: \"OK\",\n      };\n    }\n\n    // Handle maybeSingle row response\n    if (this.maybeSingleRow) {\n      if (Array.isArray(data) && data.length === 0) {\n        return {\n          data: null,\n          error: null,\n          count: 0,\n          status: 200,\n          statusText: \"OK\",\n        };\n      }\n      const singleData = Array.isArray(data) ? data[0] : data;\n      return {\n        data: singleData as T,\n        error: null,\n        count: 1,\n        status: 200,\n        statusText: \"OK\",\n      };\n    }\n\n    // Normal response\n    return {\n      data: data as T,\n      error: null,\n      count: Array.isArray(data) ? data.length : null,\n      status: 200,\n      statusText: \"OK\",\n    };\n  }\n\n  /**\n   * Build the request body for POST-based queries\n   * Used when query parameters would exceed URL length limits\n   */\n  private buildQueryBody(): PostQueryRequestBody {\n    return {\n      select: this.selectQuery !== \"*\" ? this.selectQuery : undefined,\n      filters: this.filters.map((f) => ({\n        column: f.column,\n        operator: f.operator,\n        value: f.value,\n      })),\n      orFilters: this.orFilters,\n      andFilters: this.andFilters,\n      betweenFilters: this.betweenFilters.map((bf) => ({\n        column: bf.column,\n        min: bf.min,\n        max: bf.max,\n        negated: bf.negated,\n      })),\n      order: this.orderBys.map((o) => ({\n        column: o.column,\n        direction: o.direction,\n        nulls: o.nulls,\n        vectorOp: o.vectorOp,\n        vectorValue: o.vectorValue,\n      })),\n      limit: this.limitValue,\n      offset: this.offsetValue,\n      count: this.countType,\n      groupBy: this.groupByColumns,\n    };\n  }\n}\n\n/**\n * Request body structure for POST-based queries\n * Mirrors the backend PostQueryRequest structure\n */\ninterface PostQueryRequestBody {\n  select?: string;\n  filters?: Array<{\n    column: string;\n    operator: string;\n    value: unknown;\n  }>;\n  orFilters?: string[];\n  andFilters?: string[];\n  betweenFilters?: Array<{\n    column: string;\n    min: unknown;\n    max: unknown;\n    negated: boolean;\n  }>;\n  order?: Array<{\n    column: string;\n    direction: string;\n    nulls?: string;\n    vectorOp?: string;\n    vectorValue?: number[];\n  }>;\n  limit?: number;\n  offset?: number;\n  count?: string;\n  groupBy?: string[];\n}\n","/**\n * Schema-scoped query builder for accessing tables in non-public schemas.\n *\n * @example\n * ```typescript\n * // Query the logging.entries table\n * const { data } = await client\n *   .schema('logging')\n *   .from('entries')\n *   .select('*')\n *   .execute();\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport { QueryBuilder } from \"./query-builder\";\n\nexport class SchemaQueryBuilder {\n  constructor(\n    private fetch: FluxbaseFetch,\n    private schemaName: string,\n  ) {}\n\n  /**\n   * Create a query builder for a table in this schema\n   *\n   * @param table - The table name (without schema prefix)\n   * @returns A query builder instance for constructing and executing queries\n   */\n  from<T = unknown>(table: string): QueryBuilder<T> {\n    return new QueryBuilder<T>(this.fetch, table, this.schemaName);\n  }\n}\n","/**\n * Main Fluxbase client for interacting with the Fluxbase backend.\n *\n * This client provides access to all Fluxbase features including:\n * - Database operations via PostgREST-compatible API\n * - Authentication and user management\n * - Real-time subscriptions via WebSockets\n * - File storage and management\n * - Edge functions for serverless compute\n * - PostgreSQL function calls (RPC)\n *\n * @example\n * ```typescript\n * import { createClient } from '@nimbleflux/fluxbase-sdk'\n *\n * const client = createClient({\n *   url: 'http://localhost:8080',\n *   auth: {\n *     token: 'your-jwt-token',\n *     autoRefresh: true\n *   }\n * })\n *\n * // Query database\n * const { data } = await client.from('users').select('*').execute()\n *\n * // Invoke edge function\n * const { data, error } = await client.functions.invoke('hello-world', {\n *   body: { name: 'Alice' }\n * })\n *\n * // Subscribe to realtime changes\n * client.realtime.subscribe('users', (payload) => {\n *   console.log('Change:', payload)\n * })\n * ```\n *\n * @category Client\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\nimport { FluxbaseAuth } from \"./auth\";\nimport { FluxbaseRealtime } from \"./realtime\";\nimport { FluxbaseStorage } from \"./storage\";\nimport { FluxbaseFunctions } from \"./functions\";\nimport { FluxbaseJobs } from \"./jobs\";\nimport { FluxbaseRPC } from \"./rpc\";\nimport { FluxbaseAdmin } from \"./admin\";\nimport { FluxbaseManagement } from \"./management\";\nimport { SettingsClient } from \"./settings\";\nimport { SecretsManager } from \"./secrets\";\nimport { FluxbaseAI } from \"./ai\";\nimport { FluxbaseVector } from \"./vector\";\nimport { FluxbaseKnowledgeBase } from \"./knowledge-base\";\nimport { FluxbaseGraphQL } from \"./graphql\";\nimport { FluxbaseBranching } from \"./branching\";\nimport { FluxbaseTenant } from \"./tenant\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { SchemaQueryBuilder } from \"./schema-query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Callable RPC type - can be called directly (Supabase-compatible) or access methods\n * @category RPC\n */\nexport type CallableRPC = {\n  /**\n   * Call a PostgreSQL function (RPC) - Supabase compatible\n   * Uses 'default' namespace\n   *\n   * @param fn - Function name\n   * @param params - Function parameters\n   * @returns Promise with data or error\n   *\n   * @example\n   * ```typescript\n   * const { data, error } = await client.rpc('get_user_orders', { user_id: '123' })\n   * ```\n   */\n  <T = unknown>(\n    fn: string,\n    params?: Record<string, unknown>,\n  ): Promise<{ data: T | null; error: Error | null }>;\n} & FluxbaseRPC;\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient<\n  Database = unknown,\n  _SchemaName extends string & keyof Database = string & keyof Database,\n> {\n  /** Internal HTTP client for making requests */\n  private fetch: FluxbaseFetch;\n\n  /** Client options */\n  private options?: FluxbaseClientOptions;\n\n  /** Authentication module for user management */\n  public auth: FluxbaseAuth;\n\n  /** Realtime module for WebSocket subscriptions */\n  public realtime: FluxbaseRealtime;\n\n  /** Storage module for file operations */\n  public storage: FluxbaseStorage;\n\n  /** Functions module for invoking and managing edge functions */\n  public functions: FluxbaseFunctions;\n\n  /** Jobs module for submitting and monitoring background jobs */\n  public jobs: FluxbaseJobs;\n\n  /** Admin module for instance management (requires admin authentication) */\n  public admin: FluxbaseAdmin;\n\n  /** Management module for client keys, webhooks, and invitations */\n  public management: FluxbaseManagement;\n\n  /** Settings module for reading public application settings (respects RLS policies) */\n  public settings: SettingsClient;\n\n  /** Secrets module for managing edge function and job secrets */\n  public secrets: SecretsManager;\n\n  /** AI module for chatbots and conversation history */\n  public ai: FluxbaseAI;\n\n  /** Knowledge Base module for RAG document management and search */\n  public knowledgeBase: FluxbaseKnowledgeBase;\n\n  /**\n   * Vector search module for pgvector similarity search\n   *\n   * Provides convenience methods for vector similarity search:\n   * - `embed()` - Generate embeddings from text\n   * - `search()` - Search for similar vectors with auto-embedding\n   *\n   * @example\n   * ```typescript\n   * // Search with automatic embedding\n   * const { data } = await client.vector.search({\n   *   table: 'documents',\n   *   column: 'embedding',\n   *   query: 'How to use TypeScript?',\n   *   match_count: 10\n   * })\n   *\n   * // Generate embeddings\n   * const { data } = await client.vector.embed({ text: 'Hello world' })\n   * ```\n   *\n   * Note: For more control, use the QueryBuilder methods:\n   * - `vectorSearch()` - Filter and order by vector similarity\n   * - `orderByVector()` - Order results by vector distance\n   *\n   * @category Vector Search\n   */\n  public vector: FluxbaseVector;\n\n  /**\n   * GraphQL module for executing queries and mutations\n   *\n   * Provides a type-safe interface for the auto-generated GraphQL schema\n   * from your database tables.\n   *\n   * @example\n   * ```typescript\n   * // Execute a query\n   * const { data, errors } = await client.graphql.query(`\n   *   query GetUsers($limit: Int) {\n   *     users(limit: $limit) {\n   *       id\n   *       email\n   *     }\n   *   }\n   * `, { limit: 10 })\n   *\n   * // Execute a mutation\n   * const { data, errors } = await client.graphql.mutation(`\n   *   mutation CreateUser($data: UserInput!) {\n   *     insertUser(data: $data) {\n   *       id\n   *       email\n   *     }\n   *   }\n   * `, { data: { email: 'user@example.com' } })\n   * ```\n   *\n   * @category GraphQL\n   */\n  public graphql: FluxbaseGraphQL;\n\n  /**\n   * Branching module for database branch management\n   *\n   * Database branches allow you to create isolated copies of your database\n   * for development, testing, and preview environments.\n   *\n   * @example\n   * ```typescript\n   * // List all branches\n   * const { data } = await client.branching.list()\n   *\n   * // Create a feature branch\n   * const { data: branch } = await client.branching.create('feature/add-auth', {\n   *   dataCloneMode: 'schema_only',\n   *   expiresIn: '7d'\n   * })\n   *\n   * // Reset branch to parent state\n   * await client.branching.reset('feature/add-auth')\n   *\n   * // Delete when done\n   * await client.branching.delete('feature/add-auth')\n   * ```\n   *\n   * @category Branching\n   */\n  public branching: FluxbaseBranching;\n\n  /**\n   * RPC module for calling PostgreSQL functions - Supabase compatible\n   *\n   * Can be called directly (Supabase-style) or access methods like invoke(), list(), getStatus()\n   *\n   * @example\n   * ```typescript\n   * // Supabase-style direct call (uses 'default' namespace)\n   * const { data, error } = await client.rpc('get_user_orders', { user_id: '123' })\n   *\n   * // With full options\n   * const { data, error } = await client.rpc.invoke('get_user_orders', { user_id: '123' }, {\n   *   namespace: 'custom',\n   *   async: true\n   * })\n   *\n   * // List available procedures\n   * const { data: procedures } = await client.rpc.list()\n   * ```\n   *\n   * @category RPC\n   */\n  public rpc: CallableRPC;\n\n  /**\n   * Tenant management module for multi-tenant operations\n   *\n   * @example\n   * ```typescript\n   * // List tenants I have access to\n   * const { data } = await client.tenant.listMine()\n   *\n   * // Create a new tenant (instance admin only)\n   * const { data } = await client.tenant.create({\n   *   slug: 'acme-corp',\n   *   name: 'Acme Corporation'\n   * })\n   *\n   * // Get tenant details\n   * const { data } = await client.tenant.get('tenant-id')\n   *\n   * // Add a member to a tenant (tenant admin only)\n   * await client.tenant.addMember('tenant-id', {\n   *   user_id: 'user-id',\n   *   role: 'tenant_member'\n   * })\n   * ```\n   *\n   * @category Multi-Tenancy\n   */\n  public tenant: FluxbaseTenant;\n\n  /** Current tenant ID (from X-FB-Tenant header or JWT claim) */\n  private _tenantId?: string;\n\n  /**\n   * Create a new Fluxbase client instance\n   *\n   * @param fluxbaseUrl - The URL of your Fluxbase instance\n   * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using scripts/generate-keys.sh\n   * @param options - Additional client configuration options\n   *\n   * @example\n   * ```typescript\n   * const client = new FluxbaseClient(\n   *   'http://localhost:8080',\n   *   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',  // Anon JWT token\n   *   { timeout: 30000 }\n   * )\n   * ```\n   */\n  constructor(\n    protected fluxbaseUrl: string,\n    protected fluxbaseKey: string,\n    options?: FluxbaseClientOptions,\n  ) {\n    // Store options for creating tenant-scoped clients\n    this.options = options;\n\n    // Prepare headers with anon key\n    const headers = {\n      apikey: fluxbaseKey,\n      Authorization: `Bearer ${fluxbaseKey}`,\n      ...options?.headers,\n    };\n\n    // Initialize HTTP client\n    this.fetch = new FluxbaseFetch(fluxbaseUrl, {\n      headers,\n      timeout: options?.timeout,\n      debug: options?.debug,\n    });\n\n    // Store anon key for auth restoration (when user signs out, restore anon key auth)\n    this.fetch.setAnonKey(fluxbaseKey);\n\n    // Initialize auth module\n    this.auth = new FluxbaseAuth(\n      this.fetch,\n      options?.auth?.autoRefresh ?? true,\n      options?.auth?.persist ?? true,\n    );\n\n    // Set auth token if provided\n    if (options?.auth?.token) {\n      this.fetch.setAuthToken(options.auth.token);\n    }\n\n    // Initialize realtime module\n    this.realtime = new FluxbaseRealtime(\n      fluxbaseUrl,\n      options?.auth?.token || null,\n    );\n\n    // Initialize storage module\n    this.storage = new FluxbaseStorage(this.fetch);\n\n    // Initialize functions module\n    this.functions = new FluxbaseFunctions(this.fetch);\n\n    // Initialize jobs module (pass serviceRole flag for onBehalfOf support)\n    this.jobs = new FluxbaseJobs(this.fetch, options?.serviceRole ?? false);\n\n    // Initialize admin module\n    this.admin = new FluxbaseAdmin(this.fetch);\n\n    // Initialize management module\n    this.management = new FluxbaseManagement(this.fetch);\n\n    // Initialize settings module (public read-only access with RLS)\n    this.settings = new SettingsClient(this.fetch);\n\n    // Initialize secrets module\n    this.secrets = new SecretsManager(this.fetch);\n\n    // Initialize AI module\n    // Convert HTTP URL to WebSocket URL (http(s) -> ws(s))\n    const wsProtocol = fluxbaseUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n    const wsBaseUrl = fluxbaseUrl.replace(/^https?:/, wsProtocol + \":\");\n    this.ai = new FluxbaseAI(this.fetch, wsBaseUrl);\n\n    // Initialize vector search module\n    this.vector = new FluxbaseVector(this.fetch);\n\n    // Initialize knowledge base module\n    this.knowledgeBase = new FluxbaseKnowledgeBase(this.fetch);\n\n    // Initialize GraphQL module\n    this.graphql = new FluxbaseGraphQL(this.fetch);\n\n    // Initialize branching module\n    this.branching = new FluxbaseBranching(this.fetch);\n\n    // Initialize RPC module with callable wrapper (Supabase-compatible)\n    const rpcInstance = new FluxbaseRPC(this.fetch);\n\n    // Create callable function that wraps invoke() for Supabase-style calls\n    const rpcCallable = async <T = unknown>(\n      fn: string,\n      params?: Record<string, unknown>,\n    ): Promise<{ data: T | null; error: Error | null }> => {\n      const result = await rpcInstance.invoke<T>(fn, params);\n      return {\n        data: (result.data?.result as T) ?? null,\n        error: result.error,\n      };\n    };\n\n    // Attach FluxbaseRPC methods to callable function\n    Object.assign(rpcCallable, {\n      invoke: rpcInstance.invoke.bind(rpcInstance),\n      list: rpcInstance.list.bind(rpcInstance),\n      getStatus: rpcInstance.getStatus.bind(rpcInstance),\n      getLogs: rpcInstance.getLogs.bind(rpcInstance),\n      waitForCompletion: rpcInstance.waitForCompletion.bind(rpcInstance),\n    });\n\n    this.rpc = rpcCallable as CallableRPC;\n\n    this.tenant = new FluxbaseTenant(this.fetch);\n\n    // Subscribe to auth changes to update realtime token\n    this.setupAuthSync();\n  }\n\n  /**\n   * Create a query builder for a database table\n   *\n   * @param table - The table name (can include schema, e.g., 'public.users')\n   * @returns A query builder instance for constructing and executing queries\n   *\n   * @example\n   * ```typescript\n   * // Simple select\n   * const { data } = await client.from('users').select('*').execute()\n   *\n   * // With filters\n   * const { data } = await client.from('products')\n   *   .select('id, name, price')\n   *   .gt('price', 100)\n   *   .eq('category', 'electronics')\n   *   .execute()\n   *\n   * // Insert\n   * await client.from('users').insert({ name: 'John', email: 'john@example.com' }).execute()\n   * ```\n   *\n   * @category Database\n   */\n  from<T = unknown>(table: string): QueryBuilder<T> {\n    return new QueryBuilder<T>(this.fetch, table);\n  }\n\n  /**\n   * Access a specific database schema\n   *\n   * Use this to query tables in non-public schemas.\n   *\n   * @param schemaName - The schema name (e.g., 'jobs', 'analytics')\n   * @returns A schema query builder for constructing queries on that schema\n   *\n   * @example\n   * ```typescript\n   * // Query the logging.entries table\n   * const { data } = await client\n   *   .schema('logging')\n   *   .from('entries')\n   *   .select('*')\n   *   .eq('execution_id', executionId)\n   *   .execute()\n   *\n   * // Insert into a custom schema table\n   * await client\n   *   .schema('analytics')\n   *   .from('events')\n   *   .insert({ event_type: 'click', data: {} })\n   *   .execute()\n   * ```\n   *\n   * @category Database\n   */\n  schema(schemaName: string): SchemaQueryBuilder {\n    return new SchemaQueryBuilder(this.fetch, schemaName);\n  }\n\n  /**\n   * Sync auth state with realtime connections\n   * @internal\n   */\n  private setupAuthSync() {\n    // When auth token changes, update realtime\n    const originalSetAuthToken = this.fetch.setAuthToken.bind(this.fetch);\n    this.fetch.setAuthToken = (token: string | null) => {\n      originalSetAuthToken(token);\n      this.realtime.setAuth(token);\n    };\n\n    // Set up token refresh callback for realtime connections\n    // This is called when WebSocket connections detect an expired token\n    this.realtime.setTokenRefreshCallback(async () => {\n      const result = await this.auth.refreshSession();\n      if (result.error || !result.data?.session) {\n        console.error(\n          \"[Fluxbase] Failed to refresh token for realtime:\",\n          result.error,\n        );\n        return null;\n      }\n      return result.data.session.access_token;\n    });\n  }\n\n  /**\n   * Get the current authentication token\n   *\n   * @returns The current JWT access token, or null if not authenticated\n   *\n   * @category Authentication\n   */\n  getAuthToken(): string | null {\n    return this.auth.getAccessToken();\n  }\n\n  /**\n   * Set a new authentication token\n   *\n   * This updates both the HTTP client and realtime connection with the new token.\n   *\n   * @param token - The JWT access token to set, or null to clear authentication\n   *\n   * @category Authentication\n   */\n  setAuthToken(token: string | null) {\n    this.fetch.setAuthToken(token);\n    this.realtime.setAuth(token);\n  }\n\n  /**\n   * Get the current tenant ID\n   *\n   * Returns the tenant ID from X-FB-Tenant header or JWT claim, or default tenant.\n   *\n   * @returns The current tenant ID, or undefined if not set\n   *\n   * @category Multi-Tenancy\n   */\n  getTenantId(): string | undefined {\n    return this._tenantId;\n  }\n\n  /**\n   * Set the tenant context for all subsequent requests\n   *\n   * This adds the X-FB-Tenant header to all HTTP requests and updates\n   * the realtime connection to filter by tenant.\n   *\n   * @param tenantId - The tenant ID to use for scoping\n   *\n   * @example\n   * ```typescript\n   * // Switch to a specific tenant\n   * client.setTenant('tenant-uuid-here')\n   *\n   * // All subsequent requests will be scoped to this tenant\n   * const { data } = await client.from('users').select('*').execute()\n   * ```\n   *\n   * @category Multi-Tenancy\n   */\n  setTenant(tenantId: string | undefined) {\n    this._tenantId = tenantId;\n    if (tenantId) {\n      this.fetch.setHeader(\"X-FB-Tenant\", tenantId);\n    } else {\n      this.fetch.removeHeader(\"X-FB-Tenant\");\n    }\n  }\n\n  /**\n   * Register a callback that is called before every request.\n   * The callback receives the headers object and can modify it in place.\n   * This is useful for dynamically injecting headers at request time\n   * (e.g., reading tenant context from an external store).\n   *\n   * The callback runs after static headers are merged, so it can override them.\n   *\n   * @param callback - A function that receives the headers object, or null to remove\n   *\n   * @category Advanced\n   */\n  setBeforeRequestCallback(\n    callback: ((headers: Record<string, string>) => void) | null,\n  ) {\n    this.fetch.setBeforeRequestCallback(callback);\n  }\n\n  /**\n   * Create a new client scoped to a specific tenant\n   *\n   * This returns a new client instance with the tenant context set.\n   * The original client is not modified.\n   *\n   * @param tenantId - The tenant ID to scope to\n   * @returns A new FluxbaseClient instance scoped to the tenant\n   *\n   * @example\n   * ```typescript\n   * // Create a tenant-scoped client\n   * const tenantClient = client.forTenant('tenant-uuid')\n   *\n   * // Use the scoped client for tenant-specific operations\n   * const { data } = await tenantClient.from('users').select('*').execute()\n   * ```\n   *\n   * @category Multi-Tenancy\n   */\n  forTenant(tenantId: string): FluxbaseClient<Database, _SchemaName> {\n    const options: FluxbaseClientOptions = {\n      ...this.options,\n      headers: {\n        ...this.options?.headers,\n        \"X-FB-Tenant\": tenantId,\n      },\n    };\n\n    const scopedClient = new FluxbaseClient<Database, _SchemaName>(\n      this.fluxbaseUrl,\n      this.fluxbaseKey,\n      options,\n    );\n    scopedClient._tenantId = tenantId;\n\n    return scopedClient;\n  }\n\n  /**\n   * Create or get a realtime channel (Supabase-compatible)\n   *\n   * @param name - Channel name\n   * @param config - Optional channel configuration\n   * @returns RealtimeChannel instance\n   *\n   * @example\n   * ```typescript\n   * const channel = client.channel('room-1', {\n   *   broadcast: { self: true },\n   *   presence: { key: 'user-123' }\n   * })\n   *   .on('broadcast', { event: 'message' }, (payload) => {\n   *     console.log('Message:', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @category Realtime\n   */\n  channel(name: string, config?: import(\"./types\").RealtimeChannelConfig) {\n    return this.realtime.channel(name, config);\n  }\n\n  /**\n   * Remove a realtime channel (Supabase-compatible)\n   *\n   * @param channel - The channel to remove\n   * @returns Promise resolving to status\n   *\n   * @example\n   * ```typescript\n   * const channel = client.channel('room-1')\n   * await client.removeChannel(channel)\n   * ```\n   *\n   * @category Realtime\n   */\n  removeChannel(channel: import(\"./realtime\").RealtimeChannel) {\n    return this.realtime.removeChannel(channel);\n  }\n\n  /**\n   * Get the internal HTTP client\n   *\n   * Use this for advanced scenarios like making custom API calls or admin operations.\n   *\n   * @returns The internal FluxbaseFetch instance\n   *\n   * @example\n   * ```typescript\n   * // Make a custom API call\n   * const data = await client.http.get('/api/custom-endpoint')\n   * ```\n   *\n   * @category Advanced\n   */\n  get http(): FluxbaseFetch {\n    return this.fetch;\n  }\n}\n\n// Deno type declaration for env access\ndeclare const Deno:\n  | {\n      env: {\n        get(name: string): string | undefined;\n      };\n    }\n  | undefined;\n\n/**\n * Get environment variable (works in Node.js, Deno, and browser with globalThis)\n * @internal\n */\nfunction getEnvVar(name: string): string | undefined {\n  // Node.js\n  if (typeof process !== \"undefined\" && process.env) {\n    return process.env[name];\n  }\n  // Deno\n  if (typeof Deno !== \"undefined\" && Deno?.env) {\n    return Deno.env.get(name);\n  }\n  return undefined;\n}\n\n/**\n * Create a new Fluxbase client instance (Supabase-compatible)\n *\n * This function signature is identical to Supabase's createClient, making migration seamless.\n *\n * When called without arguments (or with undefined values), the function will attempt to\n * read from environment variables:\n * - `FLUXBASE_URL` - The URL of your Fluxbase instance\n * - `FLUXBASE_ANON_KEY` or `FLUXBASE_JOB_TOKEN` or `FLUXBASE_SERVICE_TOKEN` - The API key/token\n *\n * This is useful in:\n * - Server-side environments where env vars are set\n * - Fluxbase job functions where tokens are automatically provided\n * - Edge functions with configured environment\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance (optional if FLUXBASE_URL env var is set)\n * @param fluxbaseKey - The anon key or JWT token (optional if env var is set)\n * @param options - Optional client configuration\n * @returns A configured Fluxbase client instance with full TypeScript support\n *\n * @example\n * ```typescript\n * import { createClient } from '@nimbleflux/fluxbase-sdk'\n *\n * // Initialize with anon key (identical to Supabase)\n * const client = createClient(\n *   'http://localhost:8080',\n *   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'  // Anon JWT token\n * )\n *\n * // With additional options\n * const client = createClient(\n *   'http://localhost:8080',\n *   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n *   { timeout: 30000, debug: true }\n * )\n *\n * // In a Fluxbase job function (reads from env vars automatically)\n * const client = createClient()\n *\n * // With TypeScript database types\n * const client = createClient<Database>(\n *   'http://localhost:8080',\n *   'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * )\n * ```\n *\n * @category Client\n */\nexport function createClient<\n  Database = unknown,\n  SchemaName extends string & keyof Database = string & keyof Database,\n>(\n  fluxbaseUrl?: string,\n  fluxbaseKey?: string,\n  options?: FluxbaseClientOptions,\n): FluxbaseClient<Database, SchemaName> {\n  // Resolve URL from argument or environment variable\n  const url =\n    fluxbaseUrl ||\n    getEnvVar(\"FLUXBASE_URL\") ||\n    getEnvVar(\"NEXT_PUBLIC_FLUXBASE_URL\") ||\n    getEnvVar(\"VITE_FLUXBASE_URL\");\n\n  // Resolve key from argument or environment variables (try multiple common names)\n  // Track if it's a service role token\n  const resolvedKey =\n    fluxbaseKey ||\n    getEnvVar(\"FLUXBASE_SERVICE_TOKEN\") ||\n    getEnvVar(\"FLUXBASE_ANON_KEY\") ||\n    getEnvVar(\"FLUXBASE_JOB_TOKEN\") ||\n    getEnvVar(\"NEXT_PUBLIC_FLUXBASE_ANON_KEY\") ||\n    getEnvVar(\"VITE_FLUXBASE_ANON_KEY\");\n\n  // Detect if this is a service role client\n  let isServiceRole = options?.serviceRole ?? false;\n  // Also check if the service token env var was used (when key wasn't provided directly)\n  if (!fluxbaseKey && getEnvVar(\"FLUXBASE_SERVICE_TOKEN\")) {\n    isServiceRole = true;\n  }\n\n  // Allow explicit service role detection via options\n  if (options?.serviceRole !== undefined) {\n    isServiceRole = options.serviceRole;\n  }\n\n  if (!url) {\n    throw new Error(\n      \"Fluxbase URL is required. Pass it as the first argument or set FLUXBASE_URL environment variable.\",\n    );\n  }\n\n  if (!resolvedKey) {\n    throw new Error(\n      \"Fluxbase key is required. Pass it as the second argument or set FLUXBASE_ANON_KEY environment variable.\",\n    );\n  }\n\n  return new FluxbaseClient<Database, SchemaName>(url, resolvedKey, {\n    ...options,\n    serviceRole: isServiceRole,\n  });\n}\n","/**\n * Type guard utilities for Fluxbase SDK\n * Provides runtime type checking and type narrowing for response types\n */\n\nimport type {\n  FluxbaseResponse,\n  FluxbaseAuthResponse,\n  PostgrestResponse,\n  PostgrestError,\n  AuthResponseData,\n} from './types'\n\n// ============================================================================\n// FluxbaseResponse Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if a FluxbaseResponse is an error response\n *\n * @param response - The response to check\n * @returns true if the response is an error (data is null, error is not null)\n *\n * @example\n * ```typescript\n * const result = await client.auth.signIn(credentials)\n *\n * if (isFluxbaseError(result)) {\n *   // TypeScript knows: result.error is Error, result.data is null\n *   console.error('Sign in failed:', result.error.message)\n *   return\n * }\n *\n * // TypeScript knows: result.data is T, result.error is null\n * console.log('Signed in as:', result.data.user.email)\n * ```\n */\nexport function isFluxbaseError<T>(\n  response: FluxbaseResponse<T>\n): response is { data: null; error: Error } {\n  return response.error !== null\n}\n\n/**\n * Type guard to check if a FluxbaseResponse is a success response\n *\n * @param response - The response to check\n * @returns true if the response is successful (data is not null, error is null)\n *\n * @example\n * ```typescript\n * const result = await client.from('users').select('*').execute()\n *\n * if (isFluxbaseSuccess(result)) {\n *   // TypeScript knows: result.data is T, result.error is null\n *   result.data.forEach(user => console.log(user.name))\n * }\n * ```\n */\nexport function isFluxbaseSuccess<T>(\n  response: FluxbaseResponse<T>\n): response is { data: T; error: null } {\n  return response.error === null\n}\n\n// ============================================================================\n// FluxbaseAuthResponse Type Guards (specialized for auth)\n// ============================================================================\n\n/**\n * Type guard to check if an auth response is an error\n *\n * @param response - The auth response to check\n * @returns true if the auth operation failed\n *\n * @example\n * ```typescript\n * const result = await client.auth.signUp(credentials)\n *\n * if (isAuthError(result)) {\n *   console.error('Sign up failed:', result.error.message)\n *   return\n * }\n *\n * // TypeScript knows result.data contains user and session\n * console.log('Welcome,', result.data.user.email)\n * ```\n */\nexport function isAuthError(\n  response: FluxbaseAuthResponse\n): response is { data: null; error: Error } {\n  return response.error !== null\n}\n\n/**\n * Type guard to check if an auth response is successful\n *\n * @param response - The auth response to check\n * @returns true if the auth operation succeeded\n */\nexport function isAuthSuccess(\n  response: FluxbaseAuthResponse\n): response is { data: AuthResponseData; error: null } {\n  return response.error === null\n}\n\n// ============================================================================\n// PostgrestResponse Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if a PostgrestResponse has an error\n *\n * @param response - The Postgrest response to check\n * @returns true if the response contains an error\n *\n * @example\n * ```typescript\n * const response = await client.from('products').select('*').execute()\n *\n * if (hasPostgrestError(response)) {\n *   // TypeScript knows: response.error is PostgrestError\n *   console.error('Query failed:', response.error.message)\n *   if (response.error.hint) {\n *     console.log('Hint:', response.error.hint)\n *   }\n *   return\n * }\n *\n * // TypeScript knows: response.data is T (not null)\n * console.log('Found', response.data.length, 'products')\n * ```\n */\nexport function hasPostgrestError<T>(\n  response: PostgrestResponse<T>\n): response is PostgrestResponse<T> & { error: PostgrestError; data: null } {\n  return response.error !== null\n}\n\n/**\n * Type guard to check if a PostgrestResponse is successful (has data)\n *\n * @param response - The Postgrest response to check\n * @returns true if the response has data and no error\n */\nexport function isPostgrestSuccess<T>(\n  response: PostgrestResponse<T>\n): response is PostgrestResponse<T> & { data: T; error: null } {\n  return response.error === null && response.data !== null\n}\n\n// ============================================================================\n// Utility Type Guards for unknown narrowing\n// ============================================================================\n\n/**\n * Type guard to check if a value is a non-null object\n * Useful for narrowing unknown types from API responses\n *\n * @param value - The value to check\n * @returns true if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Type guard to check if a value is an array\n * Useful for narrowing unknown types from API responses\n *\n * @param value - The value to check\n * @returns true if value is an array\n */\nexport function isArray(value: unknown): value is unknown[] {\n  return Array.isArray(value)\n}\n\n/**\n * Type guard to check if a value is a string\n *\n * @param value - The value to check\n * @returns true if value is a string\n */\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string'\n}\n\n/**\n * Type guard to check if a value is a number\n *\n * @param value - The value to check\n * @returns true if value is a number (excludes NaN)\n */\nexport function isNumber(value: unknown): value is number {\n  return typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * Type guard to check if a value is a boolean\n *\n * @param value - The value to check\n * @returns true if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean'\n}\n\n/**\n * Assert that a value is of type T, throwing if validation fails\n *\n * @param value - The value to assert\n * @param validator - A type guard function to validate the value\n * @param errorMessage - Optional custom error message\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * const response = await client.functions.invoke('get-user')\n * assertType(response.data, isObject, 'Expected user object')\n * // Now response.data is typed as Record<string, unknown>\n * ```\n */\nexport function assertType<T>(\n  value: unknown,\n  validator: (v: unknown) => v is T,\n  errorMessage = 'Type assertion failed'\n): asserts value is T {\n  if (!validator(value)) {\n    throw new Error(errorMessage)\n  }\n}\n"]}