{"version":3,"sources":["../src/index.ts","../src/http.ts","../src/auth.ts","../src/realtime.ts","../src/jwt.ts","../src/foundation.ts"],"sourcesContent":["export { createFoundation } from './foundation'\nexport { registerAuthProvider } from './auth'\n\nexport type {\n  Foundation,\n  FoundationConfig,\n  FullConfig,\n  User,\n  FileMetadata,\n  EntityChangeEvent,\n  AuthClient,\n  AuthProvider,\n  AuthService,\n  SignInResult,\n  SignInStep,\n  SignUpResult,\n  SignUpStep,\n  DbService,\n  FilesService,\n  AccountService,\n  BillingDefaults,\n  BillingService,\n  BillingPlan,\n  CheckoutSessionStatus,\n  AccountSubscription,\n  AccountSubscriptionSubject,\n  ConfigPlan,\n  IntegrationService,\n  Integration,\n  IntegrationConnection,\n  IntegrationDetail,\n  OAuthService,\n  OAuthClient,\n  OAuthConsentParams,\n  OpenApiService,\n  LogService\n} from './types'\n","/**\n * HTTP layer for Foundation API calls.\n * Handles request construction, response unwrapping, and error extraction.\n */\n\n/**\n * Unwrap backend response envelope.\n * The API wraps responses in { response: ... } or { data: ... }.\n */\nexport function unwrapResponse(json: Record<string, unknown>): unknown {\n  if (json?.response !== undefined) return json.response\n  if (json?.data !== undefined) return json.data\n  return json\n}\n\n/**\n * Extract a meaningful error from a failed API response.\n */\nexport function extractError(status: number, body: Record<string, unknown>): Error {\n  const errorObj = body?.error as Record<string, unknown> | undefined\n\n  if (errorObj) {\n    let message = errorObj.message as string || 'Unknown error'\n    const details = errorObj.details as Array<{ field?: string; message?: string }> | undefined\n    if (details?.length) {\n      const detailMessages = details\n        .map(d => d.field ? `${d.field}: ${d.message}` : d.message)\n        .join(', ')\n      message = message ? `${message} ${detailMessages}` : detailMessages\n    }\n    return Object.assign(new Error(message), {\n      code: errorObj.code,\n      type: errorObj.code,\n      details,\n      status\n    })\n  }\n\n  const customMessage = (body?.data as Record<string, unknown>)?.message || body?.message\n  if (customMessage) {\n    return Object.assign(new Error(customMessage as string), { status })\n  }\n\n  return Object.assign(new Error(`HTTP ${status}`), { status })\n}\n\nexport interface HttpClientConfig {\n  appId: string\n  tenantId: string\n  version: string\n  getToken: () => Promise<string>\n}\n\nexport function createHttpClient(config: HttpClientConfig) {\n  function headers(token: string): Record<string, string> {\n    return {\n      'X-Foundation-Mvp-Application-Id': config.appId,\n      'X-Foundation-Mvp-Tenant-Id': config.tenantId,\n      'X-Foundation-Mvp-Application-Version': config.version,\n      'Content-Type': 'application/json',\n      'Authorization': `Bearer ${token}`\n    }\n  }\n\n  async function request(\n    baseUrl: string,\n    path: string,\n    method: string,\n    options: { params?: Record<string, unknown>; body?: unknown } = {}\n  ): Promise<unknown> {\n    const token = await config.getToken()\n    const hdrs = headers(token)\n\n    let url = `${baseUrl}${path}`\n    if (options.params) {\n      const searchParams = new URLSearchParams()\n      for (const [key, value] of Object.entries(options.params)) {\n        if (value !== undefined && value !== null) {\n          searchParams.set(key, String(value))\n        }\n      }\n      const qs = searchParams.toString()\n      if (qs) url += `?${qs}`\n    }\n\n    const fetchOptions: RequestInit = { method, headers: hdrs }\n    if (options.body !== undefined) {\n      fetchOptions.body = JSON.stringify(options.body)\n    }\n\n    const response = await fetch(url, fetchOptions)\n\n    if (!response.ok) {\n      let body: Record<string, unknown> = {}\n      try { body = await response.json() } catch { /* no json body */ }\n      throw extractError(response.status, body)\n    }\n\n    if (response.status === 204) return null\n\n    const json = await response.json()\n    return unwrapResponse(json as Record<string, unknown>)\n  }\n\n  /** Raw fetch with auth headers but no unwrapping (for S3 uploads etc.) */\n  async function rawFetch(url: string, options: RequestInit = {}): Promise<Response> {\n    return fetch(url, options)\n  }\n\n  return { request, rawFetch, headers }\n}\n\nexport type HttpClient = ReturnType<typeof createHttpClient>\n","/**\n * Auth core — provider registry and AuthService wrapper.\n * Provider implementations live in auth-auth0.ts and auth-cognito.ts.\n */\nimport type { AuthClient, AuthService, AuthProvider, AuthProviderContext, SignInResult, User } from './types'\n\nconst MAX_LISTENERS = 100\n\n/**\n * How long the password given to `signUp` stays in memory so `confirmSignUp` can\n * complete the sign-in itself. Long enough to cover reading a code out of an email,\n * short enough that an abandoned signup does not leave a password sitting in a tab\n * for the rest of the session.\n */\nconst PENDING_SIGN_UP_TTL_MS = 15 * 60 * 1000\n\n// --- Provider registry ---\n\nconst providers = new Map<string, AuthProvider>()\n\nexport function registerAuthProvider(name: string, factory: AuthProvider) {\n  providers.set(name, factory)\n}\n\n// Built-in \"none\" provider\nregisterAuthProvider('none', async () => ({\n  login: async () => {},\n  logout: async () => {},\n  getUser: async () => undefined,\n  getTokenSilently: async () => 'none',\n  isAuthenticated: async () => true\n}))\n\nexport interface AuthProviderConfig {\n  provider: string\n  [key: string]: unknown\n}\n\n/**\n * Validate the auth config block handed to a provider factory before it\n * touches the underlying auth library. The block comes from the backend's\n * public init response, not from local options — so a mismatch means the\n * backend isn't configured for this provider, and configuring the library\n * with empty values would only fail later with an unrelated-looking error.\n */\nexport function assertProviderConfig(\n  config: Record<string, unknown>,\n  provider: string,\n  requiredKeys: readonly string[]\n): Record<string, unknown> {\n  const reported = typeof config.provider === 'string' && config.provider ? config.provider : undefined\n  if (reported !== provider) {\n    throw new Error(\n      `[foundation-sdk] createFoundation was given the \"${provider}\" auth provider, but the backend ` +\n      `config endpoint reports provider \"${reported ?? 'none'}\". Auth factories are configured from ` +\n      `the init response, not local options. Set authenticationProvider: \"${provider}\" in the backend ` +\n      `config.json and redeploy (app:deploy) so /api/v1/public/init returns the ${provider} auth config.`\n    )\n  }\n  const block = config[provider]\n  const record = block && typeof block === 'object' ? block as Record<string, unknown> : undefined\n  const missing = requiredKeys.filter(key => {\n    const value = record?.[key]\n    return typeof value !== 'string' || value.trim() === ''\n  })\n  if (!record || missing.length > 0) {\n    throw new Error(\n      `[foundation-sdk] The backend reports provider \"${provider}\" but its config block is incomplete ` +\n      `(missing or empty: ${missing.join(', ')}). Check the ${provider} settings in the backend ` +\n      `config.json and redeploy (app:deploy) so /api/v1/public/init returns the full ${provider} config.`\n    )\n  }\n  return record\n}\n\nexport async function createAuthClient(config: AuthProviderConfig, ctx: AuthProviderContext): Promise<AuthClient> {\n  const factory = providers.get(config.provider)\n  if (!factory) {\n    throw new Error(\n      `Auth provider \"${config.provider}\" not registered. ` +\n      `Import \"foundation-sdk/${config.provider}\" to register it.`\n    )\n  }\n  return factory(config, ctx)\n}\n\n// --- AuthService wrapper ---\n\nexport interface AuthServiceOptions {\n  /** Sign in automatically after a successful `confirmSignUp`. Default true. */\n  autoSignInAfterConfirm?: boolean\n}\n\nexport function createAuthService(\n  client: AuthClient,\n  options: AuthServiceOptions = {}\n): AuthService & { _initUser(): Promise<void> } {\n  const autoSignInAfterConfirm = options.autoSignInAfterConfirm !== false\n  let user: User | null = null\n  const listeners: Array<(user: User | null) => void> = []\n\n  /**\n   * A confirmation code proves the user owns the address, but confirming does not\n   * create a session — so without this the caller has to bounce them to a login form\n   * to retype the password they entered a minute earlier. The credentials live in this\n   * closure only: never localStorage, never sessionStorage, never a cookie. They are\n   * dropped the moment they are used, superseded by another auth call, or stale.\n   */\n  let pendingSignUp: { email: string; password: string; expiresAt: number } | null = null\n  let pendingSignUpTimer: ReturnType<typeof setTimeout> | null = null\n\n  function clearPendingSignUp(): void {\n    pendingSignUp = null\n    if (pendingSignUpTimer !== null) {\n      clearTimeout(pendingSignUpTimer)\n      pendingSignUpTimer = null\n    }\n  }\n\n  function rememberPendingSignUp(email: string, password: string): void {\n    clearPendingSignUp()\n    if (!autoSignInAfterConfirm || !email || !password) return\n    pendingSignUp = { email, password, expiresAt: Date.now() + PENDING_SIGN_UP_TTL_MS }\n    pendingSignUpTimer = setTimeout(clearPendingSignUp, PENDING_SIGN_UP_TTL_MS)\n    // Background tabs throttle timers and Node would hold the process open for one,\n    // so `expiresAt` is the guard that actually decides; the timer only scrubs early.\n    const handle = pendingSignUpTimer as unknown as { unref?: () => void }\n    if (typeof handle.unref === 'function') handle.unref()\n  }\n\n  /** Returns the held credentials for `email` exactly once, then forgets them. */\n  function takePendingSignUp(email: string): { email: string; password: string } | null {\n    const pending = pendingSignUp\n    clearPendingSignUp()\n    if (!pending || pending.expiresAt <= Date.now()) return null\n    // Compare loosely (Cognito treats email aliases case-insensitively) but sign in with\n    // the username signUp actually used, which is the one the pool has a record for.\n    if (pending.email.trim().toLowerCase() !== email.trim().toLowerCase()) return null\n    return { email: pending.email, password: pending.password }\n  }\n\n  function notifyListeners() {\n    listeners.forEach(fn => { try { fn(user) } catch { /* */ } })\n  }\n\n  async function refreshUser() {\n    const authUser = await client.getUser()\n    user = authUser ? { id: authUser.id, email: authUser.email, name: authUser.name, picture: authUser.picture } : null\n  }\n\n  return {\n    get user() { return user },\n    get isAuthenticated() { return !!user },\n\n    async getToken() {\n      return client.getTokenSilently()\n    },\n\n    async login(options) {\n      await client.login(options)\n      await refreshUser()\n      notifyListeners()\n    },\n\n    async logout(options) {\n      clearPendingSignUp()\n      await client.logout(options)\n      user = null\n      notifyListeners()\n    },\n\n    async handleCallback(url?) {\n      if (!client.handleCallback) throw new Error('handleCallback not supported by this auth provider')\n      await client.handleCallback(url)\n      await refreshUser()\n      notifyListeners()\n    },\n\n    async signIn(email, password) {\n      if (!client.signIn) throw new Error('signIn not supported by this auth provider')\n      // An explicit sign-in supersedes whatever signUp left behind, success or not.\n      clearPendingSignUp()\n      const result = await client.signIn(email, password)\n      // Only refresh user state if the sign-in actually completed.\n      // If a provider returns isSignedIn: false with a next step (e.g. CONFIRM_SIGN_UP),\n      // the user isn't really signed in and we shouldn't populate the user ref.\n      if (result.isSignedIn) {\n        await refreshUser()\n        notifyListeners()\n      }\n      return result\n    },\n\n    async signUp(email, password, metadata) {\n      if (!client.signUp) throw new Error('signUp not supported by this auth provider')\n      const result = await client.signUp(email, password, metadata)\n      rememberPendingSignUp(email, password)\n      return result\n    },\n\n    async confirmSignUp(email, code) {\n      if (!client.confirmSignUp) throw new Error('confirmSignUp not supported by this auth provider')\n      await client.confirmSignUp(email, code)\n\n      const pending = takePendingSignUp(email)\n      if (!pending || !client.signIn) return { isSignedIn: false }\n\n      let result: SignInResult\n      try {\n        result = await client.signIn(pending.email, pending.password)\n      } catch {\n        // The account is confirmed — that is what this call promised, and turning a\n        // failed convenience sign-in into a thrown confirmation would make the caller\n        // replay a code that is already spent. Report no session and let them show\n        // the sign-in form.\n        return { isSignedIn: false }\n      }\n      if (result.isSignedIn) {\n        await refreshUser()\n        notifyListeners()\n      }\n      return result\n    },\n\n    async resendSignUpCode(email) {\n      if (!client.resendSignUpCode) throw new Error('resendSignUpCode not supported by this auth provider')\n      await client.resendSignUpCode(email)\n    },\n\n    async forgotPassword(email) {\n      if (!client.forgotPassword) throw new Error('forgotPassword not supported by this auth provider')\n      await client.forgotPassword(email)\n    },\n\n    async resetPassword(email, code, newPassword) {\n      if (!client.resetPassword) throw new Error('resetPassword not supported by this auth provider')\n      // Whatever signUp handed us is stale the moment the password changes.\n      clearPendingSignUp()\n      await client.resetPassword(email, code, newPassword)\n    },\n\n    onChange(callback) {\n      if (listeners.length >= MAX_LISTENERS) {\n        console.warn('[Foundation SDK] Auth listener limit reached.')\n        return () => {}\n      }\n      listeners.push(callback)\n      return () => {\n        const idx = listeners.indexOf(callback)\n        if (idx > -1) listeners.splice(idx, 1)\n      }\n    },\n\n    async _initUser() {\n      const authenticated = await client.isAuthenticated()\n      if (authenticated) await refreshUser()\n    }\n  }\n}\n","/**\n * Realtime entity-change client for the Foundation SDK.\n *\n * Maintains a single shared WebSocket to the backend's realtime endpoint\n * (the `websocketBaseUrl` JWT claim). The socket is opened lazily on the\n * first subscriber and closed on the last unsubscribe. Server-initiated\n * drops are normal (API Gateway ~10 min idle timeout, 2 h connection TTL),\n * so the client heartbeats and reconnects with exponential backoff, always\n * re-reading the endpoint and auth token from a fresh JWT.\n *\n * Wire protocol (verified against Core):\n * - Connect: `${websocketBaseUrl}?authorizationToken=<raw JWT>` (Lambda\n *   authorizer reads the `authorizationToken` query-string param).\n * - Heartbeat: send `{\"action\":\"ping\"}`, server answers\n *   `{\"action\":\"pong\",\"timestamp\":...}` on the $default route.\n * - Push: `{ type: \"entity.created\"|\"entity.modified\"|\"entity.deleted\",\n *   entityId, resource, id, __namespace, timestamp }`.\n */\nimport type { EntityChangeEvent } from './types'\n\nexport const PING_INTERVAL_MS = 5 * 60 * 1000\nexport const PONG_TIMEOUT_MS = 30 * 1000\nexport const BACKOFF_BASE_MS = 1000\nexport const BACKOFF_CAP_MS = 30 * 1000\nexport const DEDUP_CACHE_SIZE = 100\n\nconst WS_OPEN = 1\n\n/** Minimal structural view of a WebSocket, so the client works with any\n *  spec-compliant implementation (browser, happy-dom, test mocks). */\ninterface WebSocketLike {\n  readyState: number\n  send(data: string): void\n  close(code?: number, reason?: string): void\n  onopen: (() => void) | null\n  onmessage: ((event: { data: unknown }) => void) | null\n  onclose: ((event: { code: number; reason: string }) => void) | null\n  onerror: (() => void) | null\n}\n\ntype WebSocketConstructor = new (url: string) => WebSocketLike\n\nfunction resolveWebSocketConstructor(): WebSocketConstructor | undefined {\n  const globalScope = globalThis as { WebSocket?: unknown }\n  return typeof globalScope.WebSocket === 'function'\n    ? (globalScope.WebSocket as WebSocketConstructor)\n    : undefined\n}\n\nexport interface RealtimeClientOptions {\n  /** Returns a fresh JWT. Called on every (re)connect attempt — never cached,\n   *  because the previous token may have expired (the 2 h TTL case). */\n  getToken: () => Promise<string>\n  /** Extracts the realtime endpoint from a token (the `websocketBaseUrl`\n   *  claim). Returns '' when the backend has no realtime support. */\n  getWebsocketBaseUrl: (token: string) => string\n  /** Diagnostics sink; the client never throws from background activity. */\n  warn: (message: string, context?: Record<string, unknown>) => void\n}\n\nexport interface RealtimeClient {\n  /** Register a listener for entity-change events. Opens the shared socket\n   *  on the first subscriber; the returned function unsubscribes (idempotent)\n   *  and closes the socket when the last subscriber leaves. */\n  subscribe(listener: (event: EntityChangeEvent) => void): () => void\n}\n\nexport function createRealtimeClient(options: RealtimeClientOptions): RealtimeClient {\n  const listeners: Array<(event: EntityChangeEvent) => void> = []\n\n  let socket: WebSocketLike | null = null\n  /** Bumped to invalidate in-flight connects (e.g. unsubscribe during token fetch). */\n  let connectGeneration = 0\n  /** Generation of the connect currently awaiting a token, or null. */\n  let activeConnectGeneration: number | null = null\n  let reconnectAttempts = 0\n  let reconnectTimer: ReturnType<typeof setTimeout> | null = null\n  let pingTimer: ReturnType<typeof setInterval> | null = null\n  let pongTimer: ReturnType<typeof setTimeout> | null = null\n  /** Token acquisition failed (logged out); cleared by the next subscribe. */\n  let suspended = false\n  /** No WebSocket global, or the backend has no websocketBaseUrl claim. */\n  let permanentlyDisabled = false\n  let onlineListener: (() => void) | null = null\n\n  /** Insertion-ordered bounded cache for duplicate-delivery suppression. */\n  const seenEventKeys = new Set<string>()\n\n  function clearReconnectTimer(): void {\n    if (reconnectTimer !== null) {\n      clearTimeout(reconnectTimer)\n      reconnectTimer = null\n    }\n  }\n\n  function stopHeartbeat(): void {\n    if (pingTimer !== null) {\n      clearInterval(pingTimer)\n      pingTimer = null\n    }\n    if (pongTimer !== null) {\n      clearTimeout(pongTimer)\n      pongTimer = null\n    }\n  }\n\n  function startHeartbeat(ws: WebSocketLike): void {\n    stopHeartbeat()\n    pingTimer = setInterval(() => {\n      if (ws !== socket || ws.readyState !== WS_OPEN) return\n      try {\n        ws.send(JSON.stringify({ action: 'ping' }))\n      } catch (err) {\n        options.warn('Realtime heartbeat send failed', { error: String(err) })\n        return\n      }\n      if (pongTimer === null) {\n        pongTimer = setTimeout(() => {\n          pongTimer = null\n          if (ws !== socket) return\n          options.warn('Realtime heartbeat timed out; reconnecting')\n          // Closing triggers onclose, which drives the reconnect.\n          try { ws.close(4000, 'heartbeat timeout') } catch { /* already closed */ }\n        }, PONG_TIMEOUT_MS)\n      }\n    }, PING_INTERVAL_MS)\n  }\n\n  function backoffDelay(attempt: number): number {\n    const capped = Math.min(BACKOFF_CAP_MS, BACKOFF_BASE_MS * 2 ** attempt)\n    // Jitter: uniform in [capped/2, capped] to avoid thundering herds.\n    return capped / 2 + Math.random() * (capped / 2)\n  }\n\n  function scheduleReconnect(): void {\n    if (reconnectTimer !== null || permanentlyDisabled || suspended || listeners.length === 0) return\n    const delay = backoffDelay(reconnectAttempts)\n    reconnectAttempts += 1\n    reconnectTimer = setTimeout(() => {\n      reconnectTimer = null\n      void connect()\n    }, delay)\n  }\n\n  function dispatch(event: EntityChangeEvent): void {\n    // Snapshot: listeners may (un)subscribe from within a callback.\n    for (const listener of [...listeners]) {\n      try {\n        listener(event)\n      } catch (err) {\n        options.warn('Realtime listener threw', { error: String(err) })\n      }\n    }\n  }\n\n  function rememberEventKey(key: string): boolean {\n    if (seenEventKeys.has(key)) return false\n    seenEventKeys.add(key)\n    if (seenEventKeys.size > DEDUP_CACHE_SIZE) {\n      const oldest = seenEventKeys.values().next().value\n      if (oldest !== undefined) seenEventKeys.delete(oldest)\n    }\n    return true\n  }\n\n  function handleMessage(data: unknown): void {\n    if (typeof data !== 'string') return\n    let parsed: unknown\n    try {\n      parsed = JSON.parse(data)\n    } catch {\n      return // malformed frame — ignore\n    }\n    if (parsed === null || typeof parsed !== 'object') return\n    const message = parsed as Record<string, unknown>\n\n    if (message.action === 'pong') {\n      if (pongTimer !== null) {\n        clearTimeout(pongTimer)\n        pongTimer = null\n      }\n      return\n    }\n    // Other action responses (echo, error) are not entity events.\n    if (typeof message.action === 'string') return\n\n    const wireType = message.type\n    if (typeof wireType !== 'string' || !wireType.startsWith('entity.')) return\n\n    // DynamoDB streams + Lambda retries can double-deliver.\n    const key = `${wireType}:${String(message.entityId ?? '')}:${String(message.id ?? '')}:${String(message.timestamp ?? '')}`\n    if (!rememberEventKey(key)) return\n\n    const event: EntityChangeEvent = { changeType: wireType.slice('entity.'.length) }\n    if (typeof message.entityId === 'string') event.entityId = message.entityId\n    if (typeof message.resource === 'string') event.resource = message.resource\n    if (typeof message.id === 'string') event.id = message.id\n    if (typeof message.__namespace === 'string') event.namespace = message.__namespace\n    if (typeof message.timestamp === 'number') event.timestamp = message.timestamp\n    dispatch(event)\n  }\n\n  function handleClose(): void {\n    stopHeartbeat()\n    socket = null\n    if (listeners.length === 0) return // client-initiated close — stay down\n    scheduleReconnect()\n  }\n\n  async function connect(): Promise<void> {\n    if (permanentlyDisabled || suspended || socket !== null || listeners.length === 0) return\n    if (activeConnectGeneration === connectGeneration) return // already connecting\n    const generation = connectGeneration\n    activeConnectGeneration = generation\n    const finish = (): void => {\n      if (activeConnectGeneration === generation) activeConnectGeneration = null\n    }\n\n    let token: string\n    try {\n      token = await options.getToken()\n    } catch (err) {\n      finish()\n      if (generation !== connectGeneration) return // unsubscribed meanwhile\n      suspended = true\n      options.warn(\n        'Realtime paused: could not obtain an auth token (are you logged out?). ' +\n        'It will retry on the next subscribe.',\n        { error: String(err) }\n      )\n      return\n    }\n    finish()\n    if (generation !== connectGeneration || socket !== null || listeners.length === 0) return\n\n    const WebSocketCtor = resolveWebSocketConstructor()\n    if (!WebSocketCtor) {\n      permanentlyDisabled = true\n      options.warn('Realtime disabled: no WebSocket implementation in this environment (SSR/Node). Listeners stay registered but will never fire.')\n      return\n    }\n\n    let baseUrl = ''\n    try {\n      baseUrl = options.getWebsocketBaseUrl(token)\n    } catch {\n      baseUrl = ''\n    }\n    if (!baseUrl) {\n      permanentlyDisabled = true\n      options.warn('Realtime disabled: the backend token has no websocketBaseUrl claim (realtime not deployed). Listeners stay registered but will never fire.')\n      return\n    }\n\n    let ws: WebSocketLike\n    try {\n      ws = new WebSocketCtor(`${baseUrl}?authorizationToken=${encodeURIComponent(token)}`)\n    } catch (err) {\n      options.warn('Realtime connect failed', { error: String(err) })\n      scheduleReconnect()\n      return\n    }\n    socket = ws\n\n    ws.onopen = () => {\n      if (ws !== socket) return\n      reconnectAttempts = 0\n      startHeartbeat(ws)\n    }\n    ws.onmessage = (event) => {\n      if (ws !== socket) return\n      handleMessage(event.data)\n    }\n    ws.onerror = () => {\n      // A close event always follows an error; reconnection is driven there.\n    }\n    ws.onclose = () => {\n      if (ws !== socket) return\n      handleClose()\n    }\n  }\n\n  function handleOnline(): void {\n    // Network is back — short-circuit any pending backoff.\n    if (reconnectTimer === null) return\n    clearReconnectTimer()\n    reconnectAttempts = 0\n    void connect()\n  }\n\n  function addOnlineListener(): void {\n    if (onlineListener !== null) return\n    if (typeof window === 'undefined' || typeof window.addEventListener !== 'function') return\n    onlineListener = () => handleOnline()\n    window.addEventListener('online', onlineListener)\n  }\n\n  function removeOnlineListener(): void {\n    if (onlineListener === null) return\n    if (typeof window !== 'undefined' && typeof window.removeEventListener === 'function') {\n      window.removeEventListener('online', onlineListener)\n    }\n    onlineListener = null\n  }\n\n  function deactivate(): void {\n    connectGeneration += 1 // invalidate any in-flight connect\n    clearReconnectTimer()\n    reconnectAttempts = 0\n    stopHeartbeat()\n    removeOnlineListener()\n    const ws = socket\n    socket = null // handlers of this socket become no-ops (guarded by ws !== socket)\n    if (ws !== null) {\n      try {\n        ws.close(1000, 'no subscribers')\n      } catch { /* already closed */ }\n    }\n  }\n\n  return {\n    subscribe(listener) {\n      listeners.push(listener)\n      if (listeners.length === 1) addOnlineListener()\n      suspended = false // a fresh subscribe restarts after token failures\n      void connect()\n\n      let removed = false\n      return () => {\n        if (removed) return // double-unsubscribe is a no-op\n        removed = true\n        const index = listeners.indexOf(listener)\n        if (index > -1) listeners.splice(index, 1)\n        if (listeners.length === 0) deactivate()\n      }\n    }\n  }\n}\n","export interface JwtClaims {\n  sub: string\n  apiBaseUrl: string\n  accountBaseUrl: string\n  websocketBaseUrl: string\n  userId: string\n  namespace?: string\n}\n\nexport function parseJwt(token: string): JwtClaims {\n  if (!token) {\n    throw new Error('Token parsing failed: Missing auth token')\n  }\n\n  try {\n    // Auth0 tokens can have query params appended: \"jwt?param=value\"\n    const [jwtPart, queryPart] = token.split('?')\n\n    const parts = jwtPart.split('.')\n    if (parts.length !== 3) {\n      throw new Error('Invalid JWT format')\n    }\n\n    const payloadStr = atob(parts[1])\n    const jwtPayload = JSON.parse(payloadStr)\n\n    // Merge query params if present\n    if (queryPart) {\n      const params = new URLSearchParams(queryPart)\n      params.forEach((value, key) => {\n        jwtPayload[key] = value\n      })\n    }\n\n    const apiBaseUrl = jwtPayload['BaseApplication/apiBaseUrl']\n    if (!apiBaseUrl) {\n      throw new Error('Token missing apiBaseUrl')\n    }\n\n    const websocketBaseUrl = jwtPayload['BaseApplication/websocketBaseUrl'] || ''\n    const accountBaseUrl = jwtPayload['BaseApplication/accountBaseUrl'] || apiBaseUrl\n\n    return {\n      sub: jwtPayload.sub || '',\n      apiBaseUrl,\n      accountBaseUrl,\n      websocketBaseUrl,\n      userId: jwtPayload['BaseApplication/userId'] || '',\n      namespace: jwtPayload['BaseApplication/namespace']\n    }\n  } catch (err) {\n    if (err instanceof Error && err.message.startsWith('Token')) {\n      throw err\n    }\n    const message = err instanceof Error ? err.message : 'Failed to parse token'\n    throw new Error(`Token parsing failed: ${message}`)\n  }\n}\n","/**\n * Foundation SDK — typed API client for the Foundation platform.\n *\n * One input: a config URL. The SDK fetches it, discovers auth, API URLs,\n * features, plans, theme, connectors — everything. Self-configuring.\n */\nimport type {\n  Foundation,\n  FoundationConfig,\n  FullConfig,\n  AuthService,\n  DbService,\n  FilesService,\n  AccountService,\n  BillingDefaults,\n  BillingService,\n  BillingPlan,\n  CheckoutSessionStatus,\n  AccountSubscription,\n  ConfigPlan,\n  IntegrationService,\n  Integration,\n  IntegrationConnection,\n  IntegrationDetail,\n  OAuthService,\n  OpenApiService,\n  LogService,\n} from './types'\nimport { createHttpClient, unwrapResponse, type HttpClient } from './http'\nimport { createAuthClient, createAuthService, type AuthProviderConfig } from './auth'\nimport { createRealtimeClient } from './realtime'\nimport { parseJwt } from './jwt'\n\nexport async function createFoundation(options: FoundationConfig): Promise<Foundation> {\n  // 1. Resolve config URL — foundation-env.json wins if it exists (deployed env)\n  let configUrl = options.configUrl\n  let resolvedAppId = options.appId\n  let resolvedTenantId = options.tenantId\n\n  try {\n    const envResponse = await fetch('/foundation-env.json')\n    if (envResponse.ok) {\n      const env = await envResponse.json()\n      if (env.configUrl) {\n        configUrl = env.configUrl\n        resolvedAppId = env.applicationId || resolvedAppId\n        resolvedTenantId = env.applicationTenant || resolvedTenantId\n        // Real env — clear dev-only baseUrl override\n        options.baseUrl = undefined\n      }\n    }\n  } catch { /* no env file — use passed options */ }\n\n  if (!configUrl) {\n    throw new Error('No configUrl provided and /foundation-env.json not found')\n  }\n\n  // 2. Fetch public config\n  const configHeaders: Record<string, string> = { 'Accept': 'application/json', 'Cache-Control': 'no-cache' }\n  if (resolvedAppId) configHeaders['X-Foundation-Mvp-Application-Id'] = resolvedAppId\n  if (resolvedTenantId) configHeaders['X-Foundation-Mvp-Tenant-Id'] = resolvedTenantId\n\n  const publicConfigResponse = await fetch(configUrl, { headers: configHeaders })\n  if (!publicConfigResponse.ok) {\n    throw new Error(`Failed to fetch config: ${publicConfigResponse.statusText}`)\n  }\n  const rawPublicConfig = await publicConfigResponse.json()\n  const publicConfig = rawPublicConfig.data ?? rawPublicConfig\n\n  // 2. Determine API URLs (pre-auth fallback from public config; JWT-based URLs resolved lazily after auth)\n  const authConfig: AuthProviderConfig = publicConfig.auth || { provider: 'none' }\n  const appId = resolvedAppId || publicConfig.app?.id || publicConfig.tenant?.identifier || ''\n  const tenantId = resolvedTenantId || publicConfig.tenant?.identifier || ''\n  const version = publicConfig.app?.version || publicConfig.core?.version || '0.0.0'\n\n  let apiBaseUrl = ''\n  let accountBaseUrl = ''\n\n  if (options.baseUrl) {\n    apiBaseUrl = options.baseUrl\n    accountBaseUrl = options.baseUrl\n  } else if ((authConfig as Record<string, any>).apiUrls?.apiBaseUrl) {\n    const apiUrls = (authConfig as Record<string, any>).apiUrls\n    apiBaseUrl = apiUrls.apiBaseUrl\n    accountBaseUrl = apiUrls.accountBaseUrl || apiBaseUrl\n  }\n  // else: will be resolved from JWT after auth\n\n  // 3. Set up auth with context for backend endpoint calls\n  const authCtx = { apiBaseUrl, accountBaseUrl, appId, tenantId, version }\n  let authClient: import('./types').AuthClient\n\n  if (options.auth && typeof options.auth === 'function') {\n    authClient = await options.auth(authConfig, authCtx)\n  } else if (options.auth) {\n    authClient = options.auth as import('./types').AuthClient\n  } else {\n    authClient = await createAuthClient(authConfig, authCtx)\n  }\n  const authServiceRaw = createAuthService(authClient, { autoSignInAfterConfirm: options.autoSignInAfterConfirm })\n  const authService = authServiceRaw as AuthService & { _initUser(): Promise<void> }\n  await authService._initUser()\n\n  // 4. Resolve API URLs from JWT if not already known\n  if (!apiBaseUrl) {\n    const token = await authClient.getTokenSilently()\n    const claims = parseJwt(token)\n    apiBaseUrl = claims.apiBaseUrl\n    accountBaseUrl = claims.accountBaseUrl\n    // Update context for any later use (though providers have already been constructed)\n    authCtx.apiBaseUrl = apiBaseUrl\n    authCtx.accountBaseUrl = accountBaseUrl\n  }\n\n  const http = createHttpClient({\n    appId,\n    tenantId,\n    version,\n    getToken: () => authClient.getTokenSilently()\n  })\n\n  // 5. Fetch backend config (authenticated)\n  let backendConfig: Record<string, unknown> = {}\n  try {\n    const cfg = await http.request(apiBaseUrl, '/api/v1/config/init', 'GET')\n    backendConfig = (cfg || {}) as Record<string, unknown>\n  } catch (err) {\n    console.warn('[Foundation SDK] Backend config fetch failed:', err)\n  }\n\n  // 6. Merge configs\n  const mergedConfig = { ...publicConfig, ...backendConfig }\n\n  // Determine namespace from JWT if available\n  let namespace = ''\n  try {\n    const token = await authClient.getTokenSilently()\n    if (token && token !== 'none') {\n      const claims = parseJwt(token)\n      namespace = claims.namespace || ''\n    }\n  } catch { /* no token yet */ }\n\n  // 7. Build config service\n  const config: FullConfig = {\n    get app() {\n      const app = mergedConfig.app as Record<string, unknown> || {}\n      return {\n        id: (app.id || appId) as string,\n        name: (app.name || '') as string,\n        version: (app.version || version) as string,\n        environment: (app.environment || '') as string,\n        ...app\n      }\n    },\n    get features() { return (mergedConfig.features || {}) as Record<string, unknown> },\n    get plans() { return (mergedConfig.plans || []) as ConfigPlan[] },\n    get theme() {\n      const theme = mergedConfig.theme as Record<string, unknown> || {}\n      return {\n        colors: (theme.colors || {}) as Record<string, string>,\n        dark: (theme.dark || {}) as Record<string, string>,\n        defaultColorScheme: theme.defaultColorScheme as string | undefined\n      }\n    },\n    get connectors() { return (mergedConfig.connectors || {}) as Record<string, unknown> },\n    get resources() { return (mergedConfig.resources || {}) as Record<string, string> },\n    get auth() {\n      const { provider, ...rest } = authConfig\n      return { provider, ...rest } as { provider: string; [key: string]: unknown }\n    },\n    get raw() { return mergedConfig }\n  }\n\n  // 8. Build services\n  const db = createDbService(http, apiBaseUrl)\n  const files = createFilesService(http, apiBaseUrl, namespace)\n  const account = createAccountService(http, accountBaseUrl)\n  const billing = createBillingService(http, accountBaseUrl, options.billing)\n  const integration = createIntegrationService(http, apiBaseUrl, accountBaseUrl, namespace)\n  const oauth = createOAuthService(http, apiBaseUrl)\n  const openapi = createOpenApiService(http, apiBaseUrl)\n  const log = createLogService()\n\n  // Realtime entity-change events over WebSocket (lazy: connects on first subscriber)\n  const realtime = createRealtimeClient({\n    getToken: () => authClient.getTokenSilently(),\n    getWebsocketBaseUrl: (token) => {\n      try {\n        return parseJwt(token).websocketBaseUrl\n      } catch {\n        return ''\n      }\n    },\n    warn: (message, context) => console.warn(`[Foundation SDK] ${message}`, context ?? '')\n  })\n\n  const foundation: Foundation = {\n    get ready() { return Promise.resolve() },\n    get isReady() { return true },\n    auth: authService,\n    db,\n    files,\n    integration,\n    account,\n    billing,\n    config,\n    oauth,\n    openapi,\n    log,\n    on(event, callback) {\n      if (event === 'entity.changed') {\n        return realtime.subscribe(callback)\n      }\n      return () => {}\n    }\n  }\n\n  return foundation\n}\n\n// --- Service factories ---\n\nexport function createDbService(http: HttpClient, apiBase: string): DbService {\n  return {\n    async list(entity, options = {}) {\n      const { template, filters, limit, cursor, orderBy, orderDir } = options\n      const params: Record<string, unknown> = { ...filters }\n      // Explicit template option wins over a `query` key smuggled into filters\n      if (template) params.query = template\n      if (limit) params.limit = limit\n      if (cursor) params.next = cursor\n      if (orderBy) params.orderBy = orderBy\n      if (orderDir) params.orderDir = orderDir\n      return http.request(apiBase, `/api/v1/core/${entity}`, 'GET', { params }) as Promise<any>\n    },\n    async get(entity, id) {\n      return http.request(apiBase, `/api/v1/core/${entity}`, 'GET', { params: { id } }) as Promise<any>\n    },\n    async create(entity, data) {\n      return http.request(apiBase, `/api/v1/core/${entity}`, 'POST', { body: data }) as Promise<any>\n    },\n    async update(entity, id, updates) {\n      return http.request(apiBase, `/api/v1/core/${entity}`, 'PUT', { body: { id, ...updates } }) as Promise<any>\n    },\n    async save(entity, data) {\n      try {\n        return await http.request(apiBase, `/api/v1/core/${entity}`, 'PUT', { body: data }) as Promise<any>\n      } catch {\n        return http.request(apiBase, `/api/v1/core/${entity}`, 'POST', { body: data }) as Promise<any>\n      }\n    },\n    async delete(entity, id) {\n      await http.request(apiBase, `/api/v1/core/${entity}`, 'DELETE', { body: { id } })\n    }\n  }\n}\n\nasync function computeSha256Base64(data: ArrayBuffer): Promise<string> {\n  if (typeof crypto === 'undefined' || !crypto.subtle) {\n    throw new Error(\n      'Cannot compute the file\\'s SHA-256 hash: crypto.subtle is unavailable. ' +\n      'Browsers only expose it in secure contexts (HTTPS or localhost). ' +\n      'Serve the page over HTTPS, or pass a base64-encoded sha256 to upload() yourself.'\n    )\n  }\n  const digest = await crypto.subtle.digest('SHA-256', data)\n  let binary = ''\n  for (const byte of new Uint8Array(digest)) {\n    binary += String.fromCharCode(byte)\n  }\n  return btoa(binary)\n}\n\nexport function createFilesService(http: HttpClient, apiBase: string, namespace: string): FilesService {\n  return {\n    async initiate(options) {\n      return http.request(apiBase, '/api/v1/core/upload', 'POST', {\n        body: { ...options, __namespace: namespace }\n      }) as Promise<any>\n    },\n    async upload(options) {\n      let fileData: ArrayBuffer\n      if (options.file instanceof ArrayBuffer) {\n        fileData = options.file\n      } else {\n        fileData = await options.file.arrayBuffer()\n      }\n\n      const sha256 = options.sha256 ?? await computeSha256Base64(fileData)\n\n      const uploadData = await http.request(apiBase, '/api/v1/core/upload', 'POST', {\n        body: { name: options.name, contentType: options.contentType, contentLength: fileData.byteLength, sha256, __namespace: namespace }\n      }) as { id: string; name: string; signedUrl: string; signedData: Record<string, string> }\n\n      if (!uploadData.signedUrl || !uploadData.signedData) {\n        throw new Error('Missing signedUrl or signedData in response')\n      }\n\n      const formData = new FormData()\n      Object.entries(uploadData.signedData).forEach(([key, value]) => {\n        formData.append(key, value)\n      })\n      formData.append('file', new Blob([fileData], { type: options.contentType }), options.name)\n\n      const s3Response = await fetch(uploadData.signedUrl, { method: 'POST', body: formData })\n      if (s3Response.status !== 204) {\n        throw new Error(`S3 upload failed: ${s3Response.status}`)\n      }\n\n      return { id: uploadData.id, name: uploadData.name, status: 'uploaded', s3UploadComplete: true }\n    },\n    async get(fileId) {\n      return http.request(apiBase, '/api/v1/core/files', 'GET', {\n        params: { id: fileId, __namespace: namespace }\n      }) as Promise<any>\n    },\n    async delete(fileId) {\n      await http.request(apiBase, `/api/v1/core/files/${fileId}`, 'DELETE')\n    },\n    async list(options = {}) {\n      const params: Record<string, unknown> = { __namespace: namespace }\n      if (options.limit) params.limit = options.limit\n      if (options.cursor) params.cursor = options.cursor\n      const result = await http.request(apiBase, '/api/v1/core/files', 'GET', { params }) as {\n        items?: unknown[]; next?: string\n      }\n      return { items: result?.items || [], nextCursor: result?.next } as any\n    }\n  }\n}\n\nexport function createBillingService(\n  http: HttpClient,\n  accountBase: string,\n  defaults: BillingDefaults = {}\n): BillingService {\n  return {\n    async plans() {\n      const result = await http.request(accountBase, '/api/v1/accounts/billing/plans', 'GET') as { plans?: BillingPlan[] }\n      return result?.plans ?? []\n    },\n    async checkout(planId, options = {}) {\n      if (!planId) {\n        throw new Error(\"billing.checkout requires a planId (Stripe price id)\")\n      }\n      const body: Record<string, unknown> = { planId }\n      // Resolution: per-call > SDK config > omit (backend convention applies).\n      const successUrl = options.successUrl ?? defaults.successUrl\n      const cancelUrl = options.cancelUrl ?? defaults.cancelUrl\n      if (successUrl) body.successUrl = successUrl\n      if (cancelUrl) body.cancelUrl = cancelUrl\n      return http.request(accountBase, '/api/v1/accounts/billing/checkout', 'POST', { body }) as Promise<{ url: string }>\n    },\n    async portal(options = {}) {\n      if (options.flow === 'subscription_update_confirm' && !options.targetPriceId) {\n        throw new Error(\"billing.portal flow 'subscription_update_confirm' requires targetPriceId\")\n      }\n      const body: Record<string, unknown> = {}\n      const returnUrl = options.returnUrl ?? defaults.returnUrl\n      if (returnUrl) body.returnUrl = returnUrl\n      if (options.flow) body.flow = options.flow\n      if (options.targetPriceId) body.targetPriceId = options.targetPriceId\n      return http.request(accountBase, '/api/v1/accounts/billing/customer-portal', 'POST', { body }) as Promise<{ url: string }>\n    },\n    async lookupSession(sessionId) {\n      if (!sessionId) {\n        throw new Error(\"billing.lookupSession requires a sessionId\")\n      }\n      return http.request(accountBase, '/api/v1/accounts/billing/lookup-session', 'GET', {\n        params: { sessionId }\n      }) as Promise<CheckoutSessionStatus>\n    },\n    async subscriptions() {\n      const result = await http.request(accountBase, '/api/v1/accounts/billing/subscriptions', 'GET') as { subscriptions?: AccountSubscription[] }\n      return result?.subscriptions ?? []\n    }\n  }\n}\n\nfunction createAccountService(http: HttpClient, accountBase: string): AccountService {\n  return {\n    async get() {\n      return http.request(accountBase, '/api/v1/accounts/account', 'GET') as Promise<any>\n    },\n    async update(data) {\n      await http.request(accountBase, '/api/v1/accounts/account', 'PUT', { body: { user: data } })\n    },\n    async usage() {\n      return http.request(accountBase, '/api/v1/accounts/account/usage', 'GET') as Promise<any>\n    },\n    async resendVerification() {\n      await http.request(accountBase, '/api/v1/accounts/account/resend-verification', 'POST')\n    }\n  }\n}\n\nfunction createIntegrationService(http: HttpClient, apiBase: string, accountBase: string, namespace: string): IntegrationService {\n  const service: IntegrationService = {\n    async list() {\n      return http.request(apiBase, '/api/v1/config/connectors', 'GET') as Promise<any>\n    },\n    async connections() {\n      return http.request(apiBase, '/api/v1/core/integrations', 'GET', {\n        params: { query: 'default', __namespace: namespace }\n      }) as Promise<any>\n    },\n    async all() {\n      const [rawCatalog, rawConnections] = await Promise.all([\n        service.list(),\n        service.connections()\n      ])\n\n      const catalog = (Array.isArray(rawCatalog) ? rawCatalog : (rawCatalog as any)?.items || []) as Integration[]\n      const connections = (Array.isArray(rawConnections) ? rawConnections : (rawConnections as any)?.items || []) as IntegrationConnection[]\n\n      const bySource = new Map<string, IntegrationConnection[]>()\n      for (const conn of connections) {\n        const source = conn.source || conn.id\n        if (!bySource.has(source)) bySource.set(source, [])\n        bySource.get(source)!.push(conn)\n      }\n\n      return catalog.map(item => {\n        const conns = bySource.get(item.id) || []\n        return {\n          ...item,\n          connections: conns,\n          connected: conns.some(c => c.connected),\n          connectionCount: conns.filter(c => c.connected).length\n        } as IntegrationDetail\n      })\n    },\n    async status(source) {\n      const conns = await service.connections()\n      const items = (Array.isArray(conns) ? conns : (conns as any)?.items || []) as IntegrationConnection[]\n      const filtered = items.filter(c => c.source === source && c.connected)\n      return { connected: filtered.length > 0, connections: filtered }\n    },\n    async connect(source) {\n      return http.request(accountBase, `/api/v1/accounts/integrations/${source}/initialize`, 'POST', {\n        body: { __namespace: namespace }\n      }) as Promise<any>\n    },\n    async disconnect(source, configurationId) {\n      await http.request(accountBase, `/api/v1/accounts/integrations/${source}/remove`, 'POST', {\n        body: { configurationId }\n      })\n    }\n  }\n  return service\n}\n\nfunction createOAuthService(http: HttpClient, apiBase: string): OAuthService {\n  return {\n    async getClient(clientId) {\n      return http.request(apiBase, '/api/v1/core/oauth-clients', 'GET', {\n        params: { id: clientId }\n      }) as Promise<any>\n    },\n    async authorizeConsent(params) {\n      return http.request(apiBase, '/api/v1/oauth/authorize-consent', 'POST', {\n        body: params\n      }) as Promise<any>\n    }\n  }\n}\n\nfunction createOpenApiService(http: HttpClient, apiBase: string): OpenApiService {\n  return {\n    async get() {\n      return http.request(apiBase, '/api/v1/config/openapi', 'GET') as Promise<any>\n    }\n  }\n}\n\nfunction createLogService(): LogService {\n  return {\n    info: (message, context) => console.log(`[Foundation] ${message}`, context ?? ''),\n    warn: (message, context) => console.warn(`[Foundation] ${message}`, context ?? ''),\n    error: (message, context) => console.error(`[Foundation] ${message}`, context ?? ''),\n    event: (event, data) => console.log(`[Foundation Event] ${event}`, data ?? '')\n  }\n}\n"],"mappings":"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","names":["src_exports","__export","createFoundation","registerAuthProvider","__toCommonJS","unwrapResponse","json","extractError","status","body","errorObj","message","details","detailMessages","d","customMessage","createHttpClient","config","headers","token","request","baseUrl","path","method","options","hdrs","url","searchParams","key","value","qs","fetchOptions","response","rawFetch","providers","registerAuthProvider","name","factory","createAuthClient","config","ctx","factory","providers","createAuthService","client","options","autoSignInAfterConfirm","user","listeners","pendingSignUp","pendingSignUpTimer","clearPendingSignUp","rememberPendingSignUp","email","password","handle","takePendingSignUp","pending","notifyListeners","fn","refreshUser","authUser","url","result","metadata","code","newPassword","callback","idx","resolveWebSocketConstructor","globalScope","createRealtimeClient","options","listeners","socket","connectGeneration","activeConnectGeneration","reconnectAttempts","reconnectTimer","pingTimer","pongTimer","suspended","permanentlyDisabled","onlineListener","seenEventKeys","clearReconnectTimer","stopHeartbeat","startHeartbeat","ws","err","backoffDelay","attempt","capped","scheduleReconnect","delay","connect","dispatch","event","listener","rememberEventKey","key","oldest","handleMessage","data","parsed","message","wireType","handleClose","generation","finish","token","WebSocketCtor","baseUrl","handleOnline","addOnlineListener","removeOnlineListener","deactivate","removed","index","parseJwt","token","jwtPart","queryPart","parts","payloadStr","jwtPayload","value","key","apiBaseUrl","websocketBaseUrl","accountBaseUrl","err","message","createFoundation","options","configUrl","resolvedAppId","resolvedTenantId","envResponse","env","configHeaders","publicConfigResponse","rawPublicConfig","publicConfig","authConfig","appId","tenantId","version","apiBaseUrl","accountBaseUrl","apiUrls","authCtx","authClient","createAuthClient","authService","createAuthService","token","claims","parseJwt","http","createHttpClient","backendConfig","err","mergedConfig","namespace","config","app","theme","provider","rest","db","createDbService","files","createFilesService","account","createAccountService","billing","createBillingService","integration","createIntegrationService","oauth","createOAuthService","openapi","createOpenApiService","log","createLogService","realtime","createRealtimeClient","message","context","event","callback","apiBase","entity","template","filters","limit","cursor","orderBy","orderDir","params","id","data","updates","computeSha256Base64","digest","binary","byte","fileData","sha256","uploadData","formData","key","value","s3Response","fileId","result","accountBase","defaults","planId","body","successUrl","cancelUrl","returnUrl","sessionId","service","rawCatalog","rawConnections","catalog","connections","bySource","conn","source","item","conns","c","filtered","configurationId","clientId"]}