@omnikit-ai/sdk 2.0.5 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-utils.ts","../src/live-voice.ts","../src/client.ts"],"names":["isBrowser"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Authentication utility functions for Omnikit SDK\n * Provides helpers for token management\n */\n\n// App-specific localStorage key to prevent token sharing between apps\n// Format: omnikit_token_{appId} for app-specific isolation\nlet ACCESS_TOKEN_KEY = 'access_token'; // Default fallback for backwards compatibility\nconst TOKEN_URL_PARAM = 'token';\n\n/**\n * Set the app-specific localStorage key for tokens\n * This ensures each app has its own isolated token storage\n * Called by APIClient during initialization\n * @param appId - The app ID to use for the storage key\n */\nexport function setAccessTokenKey(appId: string): void {\n ACCESS_TOKEN_KEY = `omnikit_token_${appId}`;\n}\n\n/**\n * Check if code is running in browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n}\n\n/**\n * Get access token from URL parameters\n * @returns Token string or null if not found\n */\nfunction getTokenFromUrl(): string | null {\n if (!isBrowser()) return null;\n\n try {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(TOKEN_URL_PARAM);\n } catch (error) {\n console.warn('Failed to get token from URL:', error);\n return null;\n }\n}\n\n/**\n * Get access token from localStorage\n * @returns Token string or null if not found\n */\nfunction getTokenFromStorage(): string | null {\n if (!isBrowser()) return null;\n\n try {\n return localStorage.getItem(ACCESS_TOKEN_KEY);\n } catch (error) {\n console.warn('Failed to get token from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Check if token exists in URL parameters\n * @returns True if token is present in URL\n */\nexport function isTokenInUrl(): boolean {\n return getTokenFromUrl() !== null;\n}\n\n/**\n * Remove token from URL without page reload\n * Cleans up the URL after token has been saved to localStorage\n */\nexport function cleanTokenFromUrl(): void {\n if (!isBrowser()) return;\n\n try {\n const url = new URL(window.location.href);\n if (url.searchParams.has(TOKEN_URL_PARAM)) {\n url.searchParams.delete(TOKEN_URL_PARAM);\n window.history.replaceState({}, '', url.toString());\n }\n } catch (error) {\n console.warn('Failed to clean token from URL:', error);\n }\n}\n\n/**\n * Get OAuth token from URL hash fragment\n * Checks for _auth_token (primary) from OAuth callback\n * Hash fragments are more secure than query params (not sent to server)\n * @returns Token string or null if not found\n */\nfunction getTokenFromHash(): string | null {\n if (!isBrowser()) return null;\n\n const hash = window.location.hash;\n if (!hash) return null;\n\n try {\n // Remove # prefix and parse as URLSearchParams\n const params = new URLSearchParams(hash.substring(1));\n // Check for _auth_token (used by OAuth callback)\n return params.get('_auth_token');\n } catch (error) {\n console.warn('Failed to get token from hash:', error);\n return null;\n }\n}\n\n/**\n * Remove OAuth token from URL hash without page reload\n * Cleans up the hash after token has been saved to localStorage\n */\nexport function cleanTokenFromHash(): void {\n if (!isBrowser()) return;\n\n try {\n // Remove hash entirely, keeping only path and query string\n window.history.replaceState(\n null,\n '',\n window.location.pathname + window.location.search\n );\n } catch (error) {\n console.warn('Failed to clean token from hash:', error);\n }\n}\n\n/**\n * Save access token to localStorage\n * @param token - The access token to save\n */\nexport function saveAccessToken(token: string): void {\n if (!isBrowser()) {\n console.warn('Cannot save token: not in browser environment');\n return;\n }\n\n try {\n localStorage.setItem(ACCESS_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save token to localStorage:', error);\n }\n}\n\n/**\n * Remove access token from localStorage\n * Call this on logout to clear the saved token\n */\nexport function removeAccessToken(): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.removeItem(ACCESS_TOKEN_KEY);\n } catch (error) {\n console.warn('Failed to remove token from localStorage:', error);\n }\n}\n\n/**\n * Get access token from URL or localStorage (cookie-less auth for CSRF protection)\n *\n * Priority:\n * 1. Check URL hash fragment (e.g., #_auth_token=xxx from OAuth redirect - most secure)\n * 2. Check URL query parameters (e.g., ?token=xxx - legacy support)\n * 3. Check localStorage (previously saved token)\n *\n * If token is found in URL (hash or query), it will be automatically saved to localStorage\n * and removed from the URL to prevent token exposure in browser history.\n *\n * @returns The access token or null if not found\n *\n * @example\n * ```typescript\n * import { createClient, getAccessToken } from '@omnikit/sdk';\n *\n * const omnikit = createClient({\n * appId: 'your-app-id',\n * token: getAccessToken() // Auto-retrieves from URL or localStorage\n * });\n * ```\n */\nexport function getAccessToken(): string | null {\n // Priority 1: Check URL hash (OAuth callback: #_auth_token=xxx)\n // Hash fragments are more secure - not sent to server in HTTP requests\n const hashToken = getTokenFromHash();\n if (hashToken) {\n // Save to localStorage for future use\n saveAccessToken(hashToken);\n\n // Clean hash to prevent token exposure in browser history\n cleanTokenFromHash();\n\n console.log('✅ OAuth token captured from URL hash');\n\n // Dispatch auth-change event so AuthGate can re-check auth state\n // This triggers a re-render after OAuth callback\n if (isBrowser()) {\n window.dispatchEvent(new CustomEvent('omnikit:auth-change'));\n }\n\n return hashToken;\n }\n\n // Priority 2: Check URL query params (legacy: ?token=xxx)\n const urlToken = getTokenFromUrl();\n if (urlToken) {\n // Save to localStorage for future use\n saveAccessToken(urlToken);\n\n // Clean URL to prevent token exposure in browser history\n cleanTokenFromUrl();\n\n // Dispatch auth-change event so AuthGate can re-check auth state\n if (isBrowser()) {\n window.dispatchEvent(new CustomEvent('omnikit:auth-change'));\n }\n\n return urlToken;\n }\n\n // Priority 3: Fall back to localStorage\n // No cookies used (cookie-less auth for CSRF protection)\n return getTokenFromStorage();\n}\n\n/**\n * Set access token (saves to localStorage)\n * Alias for saveAccessToken for consistency with getAccessToken\n * @param token - The access token to set\n */\nexport function setAccessToken(token: string): void {\n saveAccessToken(token);\n}\n","/**\n * Live Voice Session Implementation\n *\n * Manages real-time bidirectional voice communication with Gemini Live API.\n * Handles microphone capture, audio playback, and WebSocket communication.\n */\n\nimport type {\n LiveVoiceConfig,\n LiveVoiceSession,\n LiveVoiceStatus,\n LiveVoiceServerMessage,\n} from './types';\nimport { OmnikitError } from './client';\n\n// Audio configuration\nconst INPUT_SAMPLE_RATE = 16000; // 16kHz for input (browser → Gemini)\nconst OUTPUT_SAMPLE_RATE = 24000; // 24kHz for output (Gemini → browser)\nconst CHUNK_SIZE = 4096; // Audio chunk size for capture\n\n/**\n * Implementation of LiveVoiceSession\n */\nexport class LiveVoiceSessionImpl implements LiveVoiceSession {\n private ws: WebSocket | null = null;\n private audioContext: AudioContext | null = null;\n private mediaStream: MediaStream | null = null;\n private scriptProcessor: ScriptProcessorNode | null = null;\n private sourceNode: MediaStreamAudioSourceNode | null = null;\n private gainNode: GainNode | null = null;\n\n // Audio playback queue\n private playbackQueue: Float32Array[] = [];\n private isPlaying = false;\n\n // Session state\n private _isActive = false;\n private _status: LiveVoiceStatus = 'idle';\n private _sessionId: string | null = null;\n\n // Client reference for building WebSocket URL\n private baseUrl: string;\n private appId: string;\n private token: string | null;\n\n constructor(\n baseUrl: string,\n appId: string,\n token: string | null,\n private config?: LiveVoiceConfig\n ) {\n this.baseUrl = baseUrl;\n this.appId = appId;\n this.token = token;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n get status(): LiveVoiceStatus {\n return this._status;\n }\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Start the voice session\n */\n async start(): Promise<void> {\n if (this._isActive) {\n throw new OmnikitError('Session already active', 400, 'SESSION_ACTIVE');\n }\n\n this.setStatus('connecting');\n\n try {\n // 1. Request microphone permission\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: INPUT_SAMPLE_RATE,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n }\n });\n\n // 2. Set up AudioContext for capture and playback\n this.audioContext = new AudioContext({ sampleRate: OUTPUT_SAMPLE_RATE });\n\n // 3. Build WebSocket URL\n const wsUrl = this.buildWebSocketUrl();\n\n // 4. Connect WebSocket\n await this.connectWebSocket(wsUrl);\n\n // 5. Set up audio capture pipeline\n await this.setupAudioCapture();\n\n this._isActive = true;\n\n } catch (error) {\n this.setStatus('error');\n this.config?.onError?.(error as Error);\n\n // Clean up partial setup\n await this.cleanup();\n\n throw error;\n }\n }\n\n /**\n * Stop the voice session\n */\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n // Send end message to server\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'end' }));\n }\n\n await this.cleanup();\n }\n\n /**\n * Interrupt the AI while speaking\n */\n interrupt(): void {\n if (!this._isActive || !this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n // Clear playback queue\n this.playbackQueue = [];\n\n // Send interrupt signal to server\n this.ws.send(JSON.stringify({ type: 'interrupt' }));\n }\n\n /**\n * Build WebSocket URL with auth and config\n */\n private buildWebSocketUrl(): string {\n // Convert HTTP URL to WebSocket URL\n const wsProtocol = this.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const wsBase = this.baseUrl.replace(/^https?/, wsProtocol);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n\n if (this.token) {\n params.set('token', this.token);\n }\n\n if (this.config?.systemInstruction) {\n params.set('system_instruction', this.config.systemInstruction);\n }\n\n if (this.config?.voice) {\n params.set('voice', this.config.voice);\n }\n\n return `${wsBase}/apps/${this.appId}/live-voice?${params.toString()}`;\n }\n\n /**\n * Connect to WebSocket server\n */\n private connectWebSocket(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n const timeoutId = setTimeout(() => {\n reject(new OmnikitError('WebSocket connection timeout', 408, 'CONNECT_TIMEOUT'));\n }, 10000);\n\n this.ws.onopen = () => {\n clearTimeout(timeoutId);\n // Wait for session_started message before resolving\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event);\n\n // Resolve after receiving session_started\n if (this._sessionId && this._status === 'listening') {\n resolve();\n }\n };\n\n this.ws.onerror = (event) => {\n clearTimeout(timeoutId);\n const error = new OmnikitError('WebSocket connection error', 500, 'WS_ERROR');\n reject(error);\n };\n\n this.ws.onclose = (event) => {\n clearTimeout(timeoutId);\n\n if (this._isActive) {\n // Unexpected close\n this.setStatus('disconnected');\n this.config?.onError?.(new OmnikitError(\n `Connection closed: ${event.reason || 'Unknown reason'}`,\n event.code,\n 'CONNECTION_CLOSED'\n ));\n this.cleanup();\n }\n };\n });\n }\n\n /**\n * Handle incoming WebSocket messages\n */\n private handleMessage(event: MessageEvent): void {\n // Binary data = audio\n if (event.data instanceof ArrayBuffer) {\n this.handleAudioData(event.data);\n return;\n }\n\n // JSON control message\n try {\n const message: LiveVoiceServerMessage = JSON.parse(event.data);\n\n switch (message.type) {\n case 'session_started':\n this._sessionId = message.session_id || null;\n this.setStatus('listening');\n this.config?.onSessionStarted?.(this._sessionId!);\n break;\n\n case 'session_ended':\n this.config?.onSessionEnded?.(message.duration_seconds || 0);\n this.cleanup();\n break;\n\n case 'transcript':\n if (message.text && message.role) {\n this.config?.onTranscript?.(message.text, message.role);\n }\n break;\n\n case 'status':\n if (message.status) {\n this.setStatus(message.status);\n }\n break;\n\n case 'error':\n const error = new OmnikitError(\n message.message || 'Unknown error',\n 500,\n message.code\n );\n this.config?.onError?.(error);\n break;\n }\n } catch (e) {\n console.warn('[LiveVoice] Failed to parse message:', e);\n }\n }\n\n /**\n * Handle incoming audio data from Gemini\n */\n private handleAudioData(arrayBuffer: ArrayBuffer): void {\n if (!this.audioContext) return;\n\n // Update status to speaking\n if (this._status !== 'speaking') {\n this.setStatus('speaking');\n }\n\n // Convert PCM to Float32Array\n const pcmData = new Int16Array(arrayBuffer);\n const floatData = new Float32Array(pcmData.length);\n\n for (let i = 0; i < pcmData.length; i++) {\n // Convert 16-bit PCM to float [-1, 1]\n floatData[i] = pcmData[i] / 32768;\n }\n\n // Add to playback queue\n this.playbackQueue.push(floatData);\n\n // Start playback if not already playing\n if (!this.isPlaying) {\n this.playNextChunk();\n }\n }\n\n /**\n * Play next audio chunk from queue\n */\n private playNextChunk(): void {\n if (!this.audioContext || this.playbackQueue.length === 0) {\n this.isPlaying = false;\n\n // If queue is empty and we were speaking, switch back to listening\n if (this._status === 'speaking') {\n this.setStatus('listening');\n }\n return;\n }\n\n this.isPlaying = true;\n\n const floatData = this.playbackQueue.shift()!;\n\n // Create AudioBuffer\n const audioBuffer = this.audioContext.createBuffer(\n 1, // mono\n floatData.length,\n OUTPUT_SAMPLE_RATE\n );\n audioBuffer.getChannelData(0).set(floatData);\n\n // Create buffer source and play\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n source.onended = () => {\n // Play next chunk when this one finishes\n this.playNextChunk();\n };\n\n source.start();\n }\n\n /**\n * Set up audio capture from microphone\n */\n private async setupAudioCapture(): Promise<void> {\n if (!this.audioContext || !this.mediaStream) return;\n\n // Create source node from microphone\n this.sourceNode = this.audioContext.createMediaStreamSource(this.mediaStream);\n\n // Create script processor for capturing PCM data\n // Note: ScriptProcessorNode is deprecated but AudioWorklet requires separate file\n // For simplicity, we use ScriptProcessorNode here\n this.scriptProcessor = this.audioContext.createScriptProcessor(CHUNK_SIZE, 1, 1);\n\n // Resampler state for converting from browser sample rate to 16kHz\n const inputSampleRate = this.audioContext.sampleRate;\n let resampleBuffer: number[] = [];\n\n this.scriptProcessor.onaudioprocess = (event) => {\n if (!this._isActive || !this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n const inputData = event.inputBuffer.getChannelData(0);\n\n // Resample to 16kHz if necessary\n const resampledData = this.resample(inputData, inputSampleRate, INPUT_SAMPLE_RATE);\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(resampledData.length);\n for (let i = 0; i < resampledData.length; i++) {\n // Clamp and convert to 16-bit\n const sample = Math.max(-1, Math.min(1, resampledData[i]));\n pcmData[i] = sample < 0 ? sample * 32768 : sample * 32767;\n }\n\n // Send to WebSocket as binary\n this.ws.send(pcmData.buffer);\n };\n\n // Connect nodes: microphone → processor → (output muted)\n this.sourceNode.connect(this.scriptProcessor);\n this.scriptProcessor.connect(this.audioContext.destination);\n\n // Mute the output (we don't want to hear ourselves)\n this.gainNode = this.audioContext.createGain();\n this.gainNode.gain.value = 0;\n this.scriptProcessor.disconnect();\n this.scriptProcessor.connect(this.gainNode);\n this.gainNode.connect(this.audioContext.destination);\n }\n\n /**\n * Simple linear resampling\n */\n private resample(inputData: Float32Array, inputRate: number, outputRate: number): Float32Array {\n if (inputRate === outputRate) {\n return inputData;\n }\n\n const ratio = inputRate / outputRate;\n const outputLength = Math.floor(inputData.length / ratio);\n const output = new Float32Array(outputLength);\n\n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i * ratio;\n const srcIndexFloor = Math.floor(srcIndex);\n const srcIndexCeil = Math.min(srcIndexFloor + 1, inputData.length - 1);\n const fraction = srcIndex - srcIndexFloor;\n\n // Linear interpolation\n output[i] = inputData[srcIndexFloor] * (1 - fraction) + inputData[srcIndexCeil] * fraction;\n }\n\n return output;\n }\n\n /**\n * Update status and notify callback\n */\n private setStatus(status: LiveVoiceStatus): void {\n if (this._status !== status) {\n this._status = status;\n this.config?.onStatusChange?.(status);\n }\n }\n\n /**\n * Clean up all resources\n */\n private async cleanup(): Promise<void> {\n this._isActive = false;\n this.playbackQueue = [];\n this.isPlaying = false;\n\n // Disconnect audio nodes\n if (this.scriptProcessor) {\n this.scriptProcessor.disconnect();\n this.scriptProcessor = null;\n }\n\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode = null;\n }\n\n if (this.gainNode) {\n this.gainNode.disconnect();\n this.gainNode = null;\n }\n\n // Stop media stream tracks\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n\n // Close audio context\n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n\n // Close WebSocket\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'Session ended');\n }\n this.ws = null;\n }\n\n this._sessionId = null;\n this.setStatus('idle');\n }\n}\n","/**\n * Omnikit SDK v2.0 - Main Client\n *\n * Features:\n * - Auto-initialization on first use (no explicit initialize() required)\n * - Service role pattern for admin operations\n * - Automatic token detection from URL or localStorage\n * - Simplified integration access (no .call() needed)\n * - Enhanced collection operations (bulkCreate, bulkDelete, import, deleteAll)\n * - Improved auth module (isAuthenticated, me, updateMe)\n */\n\nimport { getAccessToken, saveAccessToken, removeAccessToken as clearStoredToken, setAccessTokenKey } from './auth-utils';\nimport { LiveVoiceSessionImpl } from './live-voice';\nimport type {\n OmnikitConfig,\n OmnikitClient,\n AppSchema,\n CollectionDefinition,\n CollectionField,\n CollectionRecord,\n CollectionClass,\n QueryOptions,\n ListOptions,\n AuthModule,\n AuthResponse,\n UserInfo,\n ServiceRoleClient,\n RequestOptions,\n BulkResult,\n ImportResult,\n ServicesSchema,\n ServiceDefinition,\n TemplateDefinition,\n IntegrationSchema,\n IntegrationPackage,\n IntegrationEndpoint,\n IntegrationMethod,\n OmnikitError as IOmnikitError,\n AsyncOptions,\n AsyncJobStatusResponse,\n AsyncJobCreatedResponse,\n LiveVoiceConfig,\n LiveVoiceSession,\n LLMParams,\n LLMStreamResult,\n LLMStreamEvent,\n} from './types';\n\n/**\n * Model name mapping for InvokeLLM\n * Maps friendly names to full Vertex AI model names\n */\nconst LLM_MODEL_MAP: Record<string, string> = {\n 'gemini-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-pro': 'vertex_ai/gemini-2.5-pro',\n};\n\n/**\n * Map friendly model name to full model name\n */\nfunction mapLLMModel(model: string | undefined): string | undefined {\n if (!model) return undefined;\n return LLM_MODEL_MAP[model] || model;\n}\n\n/**\n * Makes arrays forgiving for .items access\n * Handles cases where AI generates code expecting response.items\n * Both patterns work: arr.map(...) and arr.items.map(...)\n */\nfunction makeArrayForgiving<T>(arr: T[]): T[] & { items: T[] } {\n if (!Array.isArray(arr)) return arr as any;\n\n Object.defineProperty(arr, 'items', {\n get() { return this; },\n enumerable: false,\n configurable: true\n });\n\n return arr as T[] & { items: T[] };\n}\n\n/**\n * Enhanced error class with helper methods\n */\nexport class OmnikitError extends Error implements IOmnikitError {\n status?: number;\n code?: string;\n data?: any;\n isAuthError?: boolean;\n\n constructor(message: string, status?: number, code?: string, data?: any) {\n super(message);\n this.name = 'OmnikitError';\n this.status = status;\n this.code = code;\n this.data = data;\n this.isAuthError = status === 401 || status === 403;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, OmnikitError);\n }\n }\n\n isNotFound(): boolean {\n return this.status === 404;\n }\n\n isForbidden(): boolean {\n return this.status === 403;\n }\n\n isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n isBadRequest(): boolean {\n return this.status === 400;\n }\n\n isServerError(): boolean {\n return this.status !== undefined && this.status >= 500;\n }\n}\n\n/**\n * Main API Client Implementation\n */\n// localStorage key for metadata cache\nconst getMetadataCacheKey = (appId: string) => `omnikit_metadata_${appId}`;\n\nexport class APIClient implements OmnikitClient {\n appId: string;\n baseUrl: string;\n\n private userToken: string | null = null;\n private _serviceToken: string | null = null;\n private _apiKey: string | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n private _collections: Record<string, CollectionClass> = {};\n private _services: Record<string, IntegrationMethod> = {}; // New flat services\n private _integrations: Record<string, Record<string, IntegrationMethod>> = {}; // Legacy nested structure\n private _auth!: AuthModule;\n private _asServiceRole?: ServiceRoleClient;\n\n // Cached metadata for instant access (no flicker)\n private _metadata: {\n id: string;\n name: string;\n logoUrl: string;\n thumbnailUrl: string;\n visibility: string;\n platformAuthProviders: string[];\n };\n\n // Callbacks for metadata updates (for React re-render triggers)\n private _metadataListeners: Set<() => void> = new Set();\n\n // Callbacks for user state changes (for React auth state sync)\n private _userListeners: Set<(user: UserInfo | null) => void> = new Set();\n\n constructor(config: OmnikitConfig) {\n this.appId = config.appId;\n this.baseUrl = config.serverUrl || config.baseUrl || 'http://localhost:8001/api';\n\n // Store service token if provided\n this._serviceToken = config.serviceToken || null;\n\n // Store API key if provided (for backend function auth)\n this._apiKey = config.apiKey || null;\n\n // Check if running in browser environment\n const isBrowser = typeof window !== 'undefined' && typeof localStorage !== 'undefined';\n\n // Initialize metadata: localStorage cache > initial config > empty defaults\n this._metadata = this.loadCachedMetadata(config.initialMetadata);\n\n // IMPORTANT: Set app-specific localStorage key BEFORE any token operations\n // This ensures each app has isolated token storage (prevents cross-app auth pollution)\n // Only run in browser environments\n if (isBrowser) {\n setAccessTokenKey(this.appId);\n }\n\n // Auto-detect user token if not provided and autoInitAuth is enabled (default true)\n const autoInitAuth = config.autoInitAuth !== false; // Default to true\n if (config.token) {\n this.userToken = config.token;\n // Save to localStorage for future use (uses app-specific key) - browser only\n if (isBrowser) {\n saveAccessToken(config.token);\n }\n } else if (autoInitAuth && isBrowser) {\n // Try to get token from URL or localStorage (uses app-specific key) - browser only\n const detectedToken = getAccessToken();\n if (detectedToken) {\n this.userToken = detectedToken;\n }\n }\n\n // Eager initialization: Start fetching app schema and metadata immediately\n // This ensures appMetadata.name/logoUrl are populated ASAP (no explicit init needed)\n // First render uses localStorage cache, background fetch updates for subsequent access\n // Services use static mappings - no schema fetch needed for them\n this.ensureInitialized().catch(err => {\n console.warn('[Omnikit SDK] Background initialization failed:', err);\n });\n }\n\n /**\n * Load metadata from localStorage cache, falling back to initial config\n * Guards localStorage access for Deno/Node compatibility\n */\n private loadCachedMetadata(initialMetadata?: { name?: string; logoUrl?: string; thumbnailUrl?: string }) {\n // Try localStorage first (most recent server data) - browser only\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n const cached = localStorage.getItem(getMetadataCacheKey(this.appId));\n if (cached) {\n const parsed = JSON.parse(cached);\n return {\n id: this.appId,\n name: parsed.name || '',\n logoUrl: parsed.logoUrl || '',\n thumbnailUrl: parsed.thumbnailUrl || '',\n visibility: parsed.visibility || 'private',\n platformAuthProviders: parsed.platformAuthProviders || ['google'],\n };\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n }\n\n // Fall back to initial config (build-time values)\n return {\n id: this.appId,\n name: initialMetadata?.name || '',\n logoUrl: initialMetadata?.logoUrl || '',\n thumbnailUrl: initialMetadata?.thumbnailUrl || '',\n visibility: 'private', // Default to private, updated after fetch\n platformAuthProviders: ['google'], // Default to Google only\n };\n }\n\n /**\n * Update metadata cache in localStorage\n * IMPORTANT: Mutate in place to preserve object reference for exports\n */\n private updateMetadataCache(data: { name?: string; logoUrl?: string; thumbnailUrl?: string; visibility?: string; platformAuthProviders?: string[] }) {\n // Mutate in place - do NOT replace the object!\n // This preserves the reference exported in entities.js\n this._metadata.name = data.name || this._metadata.name;\n this._metadata.logoUrl = data.logoUrl || this._metadata.logoUrl;\n this._metadata.thumbnailUrl = data.thumbnailUrl || this._metadata.thumbnailUrl;\n this._metadata.visibility = data.visibility || this._metadata.visibility || 'private';\n this._metadata.platformAuthProviders = data.platformAuthProviders || this._metadata.platformAuthProviders || ['google'];\n\n // Only cache in browser environments (Deno/Node don't have localStorage)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(getMetadataCacheKey(this.appId), JSON.stringify(this._metadata));\n } catch (e) {\n // Ignore localStorage errors\n }\n }\n\n // Notify listeners (triggers React re-renders)\n this._metadataListeners.forEach(callback => callback());\n }\n\n /**\n * App metadata - available instantly without API call (no flicker!)\n */\n get metadata() {\n return this._metadata;\n }\n\n /**\n * Subscribe to metadata updates (for React components to trigger re-render)\n * @returns Unsubscribe function\n */\n onMetadataChange(callback: () => void): () => void {\n this._metadataListeners.add(callback);\n return () => this._metadataListeners.delete(callback);\n }\n\n /**\n * Subscribe to user state changes (for React auth state sync)\n * Called when user logs in, logs out, or updates profile\n * @returns Unsubscribe function\n */\n onUserChange(callback: (user: UserInfo | null) => void): () => void {\n this._userListeners.add(callback);\n return () => this._userListeners.delete(callback);\n }\n\n /**\n * Emit user change event to all listeners\n */\n private emitUserChange(user: UserInfo | null): void {\n this._userListeners.forEach(cb => {\n try {\n cb(user);\n } catch (e) {\n console.error('[Omnikit SDK] User listener error:', e);\n }\n });\n }\n\n /**\n * Lazy getter for collections - auto-initializes on first access\n */\n get collections(): Record<string, CollectionClass> {\n return this.createCollectionsProxy(false); // User collections\n }\n\n /**\n * @deprecated Use collections instead. This alias exists for backward compatibility.\n */\n get entities(): Record<string, CollectionClass> {\n return this.collections;\n }\n\n /**\n * Lazy getter for services (new flat structure) - auto-initializes on first access\n * Usage: omnikit.services.SendEmail({ to, subject, body })\n */\n get services(): Record<string, IntegrationMethod> {\n return this.createServicesProxy(false); // User services\n }\n\n /**\n * @deprecated Use services instead for flat access\n * Lazy getter for integrations - auto-initializes on first access\n */\n get integrations(): Record<string, Record<string, IntegrationMethod>> {\n return this.createIntegrationsProxy(false); // User integrations\n }\n\n /**\n * Lazy getter for auth - auto-initializes on first access\n */\n get auth(): AuthModule {\n return this.createAuthProxy();\n }\n\n /**\n * Lazy getter for service role operations\n * Only available when serviceToken is provided\n */\n get asServiceRole(): ServiceRoleClient {\n if (!this._serviceToken) {\n throw new OmnikitError(\n 'Service token is required to use asServiceRole. Provide serviceToken in config.',\n 403,\n 'SERVICE_TOKEN_REQUIRED'\n );\n }\n\n // Return cached instance if already created\n if (this._asServiceRole) {\n return this._asServiceRole;\n }\n\n // Create service role client with elevated privileges\n this._asServiceRole = {\n collections: this.createCollectionsProxy(true), // Service role collections\n services: this.createServicesProxy(true), // Service role services (new flat structure)\n integrations: this.createIntegrationsProxy(true), // Service role integrations (legacy)\n // Note: auth not available in service role for security\n };\n\n return this._asServiceRole;\n }\n\n /**\n * Create auth proxy that auto-initializes\n */\n private createAuthProxy(): AuthModule {\n const client = this;\n\n const authHandler: AuthModule = {\n async isAuthenticated(): Promise<boolean> {\n await client.ensureInitialized();\n try {\n // Pass app_id to check app-specific access (ensures deleted users are logged out)\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/is-authenticated?app_id=${client.appId}`,\n 'GET'\n );\n return response?.authenticated === true;\n } catch (error) {\n return false;\n }\n },\n\n async me(): Promise<UserInfo> {\n await client.ensureInitialized();\n // Get app user (from app-specific database)\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'GET'\n );\n // Emit user change event for React state sync\n client.emitUserChange(response);\n return response;\n },\n\n login(returnUrl?: string): void {\n // Redirect to app's own login page (backend-served)\n // The backend handles login based on app visibility settings\n const fullReturnUrl = returnUrl || (typeof window !== 'undefined' ? window.location.href : '/');\n const encodedReturnUrl = encodeURIComponent(fullReturnUrl);\n\n if (typeof window !== 'undefined') {\n // Determine correct login path based on current URL\n const currentPath = window.location.pathname;\n\n // Check if we're accessing via /api/sites/{app_id}/ (direct access)\n const apiSitesMatch = currentPath.match(/^\\/api\\/sites\\/([^\\/]+)/);\n if (apiSitesMatch) {\n // Direct API access - use full path\n window.location.href = `/api/sites/${client.appId}/login?return_url=${encodedReturnUrl}`;\n } else {\n // Subdomain or other access - use relative /login\n window.location.href = `/login?return_url=${encodedReturnUrl}`;\n }\n }\n },\n\n /**\n * Request a passwordless login code to email\n */\n async requestLoginCode(email: string, returnUrl?: string): Promise<{ success: boolean; message?: string }> {\n return await client.makeRequest(\n `${client.baseUrl}/auth/email/request-code`,\n 'POST',\n { email, return_url: returnUrl }\n );\n },\n\n /**\n * Verify the login code and set the session token\n */\n async verifyLoginCode(email: string, code: string): Promise<AuthResponse> {\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/email/verify-code`,\n 'POST',\n { email, code }\n );\n\n if (response.access_token) {\n client.setAuthToken(response.access_token);\n // Fetch user info and emit change event so AuthGate re-renders\n try {\n const user = await this.me();\n client.emitUserChange(user);\n } catch (e) {\n // Still emit with null to trigger re-render, me() will be called again by AuthGate\n client.emitUserChange(null);\n }\n }\n\n return response;\n },\n\n /**\n * Get available OAuth providers for this app\n * Returns both platform providers (zero-config) and custom SSO providers\n */\n async getAvailableProviders(): Promise<import('./types').OAuthProvidersResponse> {\n await client.ensureInitialized();\n\n try {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/auth/providers`,\n 'GET'\n );\n return response;\n } catch (error) {\n throw new OmnikitError(\n 'Failed to fetch available OAuth providers',\n (error as any).status || 500,\n 'PROVIDERS_FETCH_FAILED'\n );\n }\n },\n\n /**\n * Initiate OAuth login with any provider\n * Redirects to the backend OAuth endpoint for the specified provider\n */\n loginWithProvider(providerId: string, returnUrl?: string): void {\n const currentUrl = returnUrl || (typeof window !== 'undefined' ? window.location.href : '/');\n const redirectUrl = `${client.baseUrl}/auth/${providerId}?redirect_url=${encodeURIComponent(currentUrl)}`;\n\n if (typeof window !== 'undefined') {\n // Check if we are running inside an iframe\n const inIframe = window.self !== window.top;\n\n if (inIframe) {\n // In an iframe, standard redirect flow often fails for OAuth (X-Frame-Options)\n // Open in a popup instead\n const width = 600;\n const height = 700;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n \n const popup = window.open(\n redirectUrl, \n 'oauth_popup', \n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes,status=yes`\n );\n\n if (popup) {\n // Poll for token in localStorage (since popup and iframe share origin in many cases)\n const checkTimer = setInterval(() => {\n // Check if token appeared\n const token = getAccessToken();\n if (token) {\n clearInterval(checkTimer);\n popup.close();\n // Reload to pick up the authenticated state\n window.location.reload();\n return;\n }\n\n if (popup.closed) {\n clearInterval(checkTimer);\n // Check one last time\n const finalToken = getAccessToken();\n if (finalToken) {\n window.location.reload();\n }\n }\n }, 1000);\n return;\n }\n // If popup blocked, fall back to redirect\n }\n\n window.location.href = redirectUrl;\n } else {\n throw new OmnikitError('loginWithProvider() can only be called in browser environment', 400, 'NOT_BROWSER');\n }\n },\n\n /**\n * Initiate Google OAuth Login\n * @deprecated Use loginWithProvider(\"google\", returnUrl) instead\n * Redirects to the backend OAuth endpoint\n */\n loginWithGoogle(returnUrl?: string): void {\n console.warn('loginWithGoogle() is deprecated. Use loginWithProvider(\"google\", returnUrl) instead.');\n this.loginWithProvider('google', returnUrl);\n },\n\n async logout(): Promise<void> {\n await client.makeRequest(\n `${client.baseUrl}/auth/logout`,\n 'POST'\n );\n client.clearAuthToken();\n // Emit user change event for React state sync (AuthGate subscribes to this)\n client.emitUserChange(null);\n },\n\n async refreshToken(): Promise<AuthResponse> {\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/refresh`,\n 'POST'\n );\n\n if (response.access_token || response.token) {\n const newToken = response.access_token || response.token;\n client.setAuthToken(newToken);\n }\n\n return response;\n },\n\n async updateMe(data: Partial<UserInfo>): Promise<UserInfo> {\n await client.ensureInitialized();\n // Update app user profile (app-specific)\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n data\n );\n // Emit user change event for React state sync\n client.emitUserChange(response);\n return response;\n },\n\n // Alias for updateMe with clearer naming\n async updateProfile(data: Partial<UserInfo>): Promise<UserInfo> {\n return this.updateMe(data);\n },\n\n // Backward compatibility\n async getCurrentUser(): Promise<UserInfo> {\n return this.me();\n },\n\n // Subscribe to user state changes (for React auth state sync)\n onUserChange(callback: (user: UserInfo | null) => void): () => void {\n return client.onUserChange(callback);\n }\n };\n\n return authHandler;\n }\n\n /**\n * Convert PascalCase to snake_case\n * Example: PdfDocument -> pdf_document, UserProfile -> user_profile\n */\n private toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before capitals\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, ''); // Remove leading underscore\n }\n\n /**\n * Create collections proxy that auto-initializes\n * @param useServiceToken - Whether to use service token for requests\n */\n private createCollectionsProxy(useServiceToken: boolean): Record<string, CollectionClass> {\n const client = this;\n\n return new Proxy({}, {\n get(target, collectionName: string) {\n if (typeof collectionName === 'string' && !collectionName.startsWith('_')) {\n // Return proxy that auto-initializes and calls collection methods\n return new Proxy({}, {\n get(obj, method: string) {\n if (typeof method === 'string') {\n return async function(...args: any[]) {\n await client.ensureInitialized();\n // Convert PascalCase to snake_case for lookup (e.g., PdfDocument -> pdf_document)\n const normalizedCollectionName = client.toSnakeCase(collectionName);\n const collection = client._collections[normalizedCollectionName];\n if (!collection) {\n throw new OmnikitError(\n `Collection '${collectionName}' not found in app schema`,\n 404,\n 'COLLECTION_NOT_FOUND'\n );\n }\n\n // Check if method exists on collection\n if (typeof (collection as any)[method] !== 'function') {\n const availableMethods = [\n 'get(id)', 'list(options?)', 'filter(filters?)', 'findOne(filters?)',\n 'create(data)', 'update(id, data)', 'delete(id)', 'count(filters?)',\n 'bulkCreate(items)', 'bulkDelete(ids)', 'import(file, format)', 'deleteAll(confirm)'\n ];\n throw new OmnikitError(\n `Method '${method}()' does not exist on collection '${collectionName}'.\\n\\n` +\n `Available methods:\\n${availableMethods.map(m => ` - ${m}`).join('\\n')}\\n\\n` +\n `Common mistake: There is NO 'read()' method. Use 'list()' instead.\\n` +\n `Example: await ${collectionName}.list({ limit: 100, sort: '-created_at' })`,\n 400,\n 'METHOD_NOT_FOUND'\n );\n }\n\n // Call the collection method with service token context if needed\n if (useServiceToken) {\n // Temporarily set context to use service token\n const originalGetToken = client.getAuthToken.bind(client);\n client.getAuthToken = () => client._serviceToken;\n try {\n const result = await (collection as any)[method](...args);\n client.getAuthToken = originalGetToken;\n return result;\n } catch (error) {\n client.getAuthToken = originalGetToken;\n throw error;\n }\n } else {\n return (collection as any)[method](...args);\n }\n };\n }\n return undefined;\n }\n }) as any;\n }\n return (target as any)[collectionName];\n }\n });\n }\n\n /**\n * Poll for job completion with progress callbacks\n * @param jobId - Job ID to poll\n * @param options - Async options (onStatusChange, pollInterval, timeout)\n * @returns Final job result\n */\n private async pollJobUntilComplete(\n jobId: string,\n options?: AsyncOptions\n ): Promise<any> {\n const pollInterval = options?.pollInterval || 2000;\n const timeout = options?.timeout || 300000; // 5 minutes default\n const startTime = Date.now();\n\n while (true) {\n // Check job status\n const status: AsyncJobStatusResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}/jobs/${jobId}`,\n 'GET'\n );\n\n // Report status changes if callback provided\n if (options?.onStatusChange) {\n options.onStatusChange(status.status, status.status_message);\n }\n\n // Check for completion\n if (status.status === 'completed') {\n return status.result;\n }\n\n // Check for failure\n if (status.status === 'failed') {\n throw new OmnikitError(\n status.error || 'Job failed',\n 500,\n 'JOB_FAILED',\n { job_id: jobId, status }\n );\n }\n\n // Check for cancellation\n if (status.status === 'cancelled') {\n throw new OmnikitError(\n 'Job was cancelled',\n 400,\n 'JOB_CANCELLED',\n { job_id: jobId }\n );\n }\n\n // Check timeout\n if (Date.now() - startTime > timeout) {\n throw new OmnikitError(\n `Job timed out after ${timeout / 1000} seconds`,\n 408,\n 'JOB_TIMEOUT',\n { job_id: jobId }\n );\n }\n\n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n }\n\n /**\n * Stream LLM response token by token via SSE\n * @param params - LLM request parameters with streaming callbacks\n * @returns Promise that resolves to the complete response string\n */\n private async streamLLMResponse(params: LLMParams): Promise<string> {\n await this.ensureInitialized();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const token = this.getAuthToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n if (this._serviceToken) {\n headers['X-Service-Token'] = this._serviceToken;\n }\n\n if (this._apiKey) {\n headers['X-API-Key'] = this._apiKey;\n }\n\n // Build request body without callback functions\n const requestBody: Record<string, any> = {\n ...params,\n stream: true,\n // Map friendly model names to full model names\n model: mapLLMModel(params.model),\n // Remove callback functions from request body\n onToken: undefined,\n onComplete: undefined,\n onError: undefined,\n };\n\n // Clean up undefined values\n Object.keys(requestBody).forEach(key => {\n if (requestBody[key] === undefined) {\n delete requestBody[key];\n }\n });\n\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/services/llm`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `LLM streaming failed: ${response.statusText}`;\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.detail || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n const err = new OmnikitError(errorMessage, response.status, 'STREAM_ERROR');\n params.onError?.(err);\n throw err;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n const err = new OmnikitError('No response body', 500, 'NO_BODY');\n params.onError?.(err);\n throw err;\n }\n\n const decoder = new TextDecoder();\n let fullResponse = '';\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE events from buffer\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const event: LLMStreamEvent = JSON.parse(line.slice(6));\n\n if (event.type === 'token' && event.content) {\n fullResponse += event.content;\n params.onToken?.(event.content);\n } else if (event.type === 'done') {\n params.onComplete?.({\n result: event.result || fullResponse,\n model_used: event.model_used || '',\n usage: event.usage,\n });\n } else if (event.type === 'error') {\n const err = new OmnikitError(\n event.message || 'Stream error',\n 500,\n 'STREAM_ERROR'\n );\n params.onError?.(err);\n throw err;\n }\n } catch (parseError) {\n // Ignore malformed SSE lines (but don't ignore OmnikitError)\n if (parseError instanceof OmnikitError) {\n throw parseError;\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return fullResponse;\n }\n\n /**\n * Create services proxy that auto-initializes (new flat structure)\n * @param useServiceToken - Whether to use service token for requests\n */\n private createServicesProxy(useServiceToken: boolean): Record<string, IntegrationMethod> {\n const client = this;\n\n return new Proxy({}, {\n get(target, serviceName: string) {\n if (typeof serviceName === 'string' && !serviceName.startsWith('_')) {\n // Special handling for CheckJobStatus\n if (serviceName === 'CheckJobStatus') {\n return async function(params?: { job_id: string }): Promise<AsyncJobStatusResponse> {\n await client.ensureInitialized();\n if (!params?.job_id) {\n throw new OmnikitError(\n 'job_id is required for CheckJobStatus',\n 400,\n 'MISSING_JOB_ID'\n );\n }\n\n return client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/jobs/${params.job_id}`,\n 'GET'\n );\n };\n }\n\n // Special handling for DownloadPrivateFile - triggers browser download via backend proxy\n if (serviceName === 'DownloadPrivateFile') {\n return async function(params?: { file_uri: string; filename?: string }): Promise<void> {\n await client.ensureInitialized();\n if (!params?.file_uri) {\n throw new OmnikitError(\n 'file_uri is required for DownloadPrivateFile',\n 400,\n 'MISSING_FILE_URI'\n );\n }\n\n // Build the download URL with query params\n const downloadUrl = new URL(`${client.baseUrl}/apps/${client.appId}/services/files/download`);\n downloadUrl.searchParams.set('file_uri', params.file_uri);\n if (params.filename) {\n downloadUrl.searchParams.set('filename', params.filename);\n }\n\n // Add auth token to URL for the download\n const token = client.getAuthToken();\n if (token) {\n downloadUrl.searchParams.set('token', token);\n }\n\n // Trigger download by opening in new window/tab\n // The backend sets Content-Disposition: attachment to force download\n window.open(downloadUrl.toString(), '_blank');\n };\n }\n\n // Standard service method handling with auto-polling for async methods\n return async function(params?: Record<string, any>, asyncOptions?: AsyncOptions) {\n // Initialize to load collections (services use static mappings)\n await client.ensureInitialized();\n\n // Special handling for InvokeLLM\n if (serviceName === 'InvokeLLM') {\n // Map friendly model names to full model names\n if (params?.model) {\n params = { ...params, model: mapLLMModel(params.model) };\n }\n // Handle streaming\n if (params?.stream) {\n return client.streamLLMResponse(params as LLMParams);\n }\n }\n\n let response;\n\n // Check if method exists in loaded services\n const method = client._services[serviceName];\n if (method) {\n // Call with service token if needed\n response = await method(params, useServiceToken);\n } else {\n // Direct API call fallback (for skipInit mode or before schema loaded)\n // Map service names to their API paths\n const servicePathMap: Record<string, string> = {\n 'SendEmail': 'email/send',\n 'InvokeLLM': 'llm/invoke',\n 'GenerateImage': 'image/generate',\n 'GenerateSpeech': 'speech/generate',\n 'GenerateVideo': 'video/generate',\n 'ExtractData': 'extract/data',\n 'SendSMS': 'sms/send',\n 'UploadFile': 'storage/upload',\n 'UploadPrivateFile': 'storage/upload-private',\n 'CreateFileSignedUrl': 'storage/signed-url',\n };\n\n const servicePath = servicePathMap[serviceName];\n if (!servicePath) {\n throw new OmnikitError(\n `Service '${serviceName}' not found. Known services: ${Object.keys(servicePathMap).join(', ')}`,\n 404,\n 'SERVICE_NOT_FOUND'\n );\n }\n\n // Build headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Use API key for server-to-server auth, otherwise user token\n if (client._apiKey) {\n headers['X-API-Key'] = client._apiKey;\n } else if (client.userToken) {\n headers['Authorization'] = `Bearer ${client.userToken}`;\n }\n\n // Make direct API call\n const fetchResponse = await fetch(\n `${client.baseUrl}/apps/${client.appId}/integrations/${servicePath}`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(params || {}),\n }\n );\n\n if (!fetchResponse.ok) {\n const error = await fetchResponse.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || `Service call failed: ${fetchResponse.statusText}`,\n fetchResponse.status,\n 'SERVICE_CALL_FAILED'\n );\n }\n\n response = await fetchResponse.json();\n }\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractText, etc.)\n if (response && response.async && response.job_id) {\n // If user wants to return immediately with job_id\n if (asyncOptions?.returnJobId) {\n return response as AsyncJobCreatedResponse;\n }\n\n // Otherwise, poll for completion automatically\n return client.pollJobUntilComplete(response.job_id, asyncOptions);\n }\n\n // Sync response - return as-is\n return response;\n };\n }\n return (target as any)[serviceName];\n }\n });\n }\n\n /**\n * @deprecated Use createServicesProxy instead\n * Create integrations proxy that auto-initializes\n * @param useServiceToken - Whether to use service token for requests\n */\n private createIntegrationsProxy(useServiceToken: boolean): Record<string, Record<string, IntegrationMethod>> {\n const client = this;\n\n return new Proxy({}, {\n get(target, packageName: string) {\n if (typeof packageName === 'string' && !packageName.startsWith('_')) {\n // Return proxy for integration package methods\n return new Proxy({}, {\n get(obj, methodName: string) {\n if (typeof methodName === 'string') {\n // Note: InvokeLLM now uses the standard async handler below\n // All integrations (LLM, Email, SMS, Image, Speech, etc.) are now async\n // and return { async: true, job_id: ... } which triggers auto-polling\n\n // Special handling for CheckJobStatus\n if (methodName === 'CheckJobStatus') {\n return async function(params?: { job_id: string }): Promise<AsyncJobStatusResponse> {\n await client.ensureInitialized();\n if (!params?.job_id) {\n throw new OmnikitError(\n 'job_id is required for CheckJobStatus',\n 400,\n 'MISSING_JOB_ID'\n );\n }\n\n return client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/jobs/${params.job_id}`,\n 'GET'\n );\n };\n }\n\n // Standard integration method handling with auto-polling for async methods\n return async function(params?: Record<string, any>, asyncOptions?: AsyncOptions) {\n await client.ensureInitialized();\n\n // Special handling for InvokeLLM\n if (methodName === 'InvokeLLM') {\n // Map friendly model names to full model names\n if (params?.model) {\n params = { ...params, model: mapLLMModel(params.model) };\n }\n }\n\n const integrationPackage = client._integrations[packageName];\n if (!integrationPackage) {\n throw new OmnikitError(\n `Integration package '${packageName}' not found`,\n 404,\n 'INTEGRATION_NOT_FOUND'\n );\n }\n\n const method = integrationPackage[methodName];\n if (!method) {\n throw new OmnikitError(\n `Integration method '${methodName}' not found in package '${packageName}'`,\n 404,\n 'INTEGRATION_METHOD_NOT_FOUND'\n );\n }\n\n // Call with service token if needed\n const response = await method(params, useServiceToken);\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractData, GenerateVideo)\n if (response && response.async && response.job_id) {\n // If user wants to return immediately with job_id\n if (asyncOptions?.returnJobId) {\n return response as AsyncJobCreatedResponse;\n }\n\n // Otherwise, poll for completion automatically\n return client.pollJobUntilComplete(response.job_id, asyncOptions);\n }\n\n // Sync response - return as-is\n return response;\n };\n }\n return undefined;\n }\n }) as any;\n }\n return (target as any)[packageName];\n }\n });\n }\n\n /**\n * Ensure SDK is initialized (auto-initializes once on first call)\n */\n async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n // If initialization is in progress, wait for it\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // Start initialization\n this.initPromise = this.initialize();\n await this.initPromise;\n this.initPromise = null;\n }\n\n /**\n * Initialize SDK by fetching app schema (for collections and metadata)\n * Services use static mappings - no schema fetch needed\n * This happens automatically on first use - no need to call explicitly\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Fetch app schema only (services use static mappings, no fetch needed)\n const appSchema = await this.fetchAppSchema();\n\n // Update metadata cache with fresh data from server\n // This ensures appMetadata.name, logoUrl, and visibility are available\n if (appSchema.app) {\n this.updateMetadataCache({\n name: appSchema.app.name,\n logoUrl: appSchema.app.logo_url,\n thumbnailUrl: appSchema.app.thumbnail_url,\n visibility: appSchema.app.visibility,\n platformAuthProviders: (appSchema.app as any).platform_auth_providers,\n });\n }\n\n // Create collection classes\n if (appSchema.entities) {\n this.createCollections(appSchema.entities);\n }\n\n // Services use static mappings in createServicesProxy - no schema needed\n\n this.initialized = true;\n } catch (error) {\n console.error('Failed to initialize Omnikit SDK:', error);\n throw new OmnikitError(\n `SDK initialization failed: ${(error as Error).message}`,\n 500,\n 'INIT_FAILED',\n error\n );\n }\n }\n\n /**\n * Fetch app schema from backend\n */\n private async fetchAppSchema(): Promise<AppSchema> {\n const response = await fetch(`${this.baseUrl}/apps/${this.appId}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch app schema: ${response.statusText}`);\n }\n return await response.json();\n }\n\n /**\n * Fetch integration schema from backend\n * Returns ServicesSchema (new flat format) or IntegrationSchema (legacy)\n */\n private async fetchIntegrationSchema(): Promise<ServicesSchema | IntegrationSchema | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/services`\n );\n if (!response.ok) {\n return null; // Integration schema is optional\n }\n return await response.json();\n } catch (error) {\n // Integration schema is optional, don't fail initialization\n return null;\n }\n }\n\n /**\n * Create collection classes from schema\n */\n private createCollections(collectionsData: CollectionDefinition[] | Record<string, CollectionDefinition>): void {\n // Handle both array and object formats\n const collections: Record<string, CollectionDefinition> = Array.isArray(collectionsData)\n ? collectionsData.reduce((acc, collection) => ({ ...acc, [collection.name]: collection }), {} as Record<string, CollectionDefinition>)\n : collectionsData;\n\n Object.entries(collections).forEach(([collectionName, collectionDef]) => {\n // Store collections with lowercase keys to match MongoDB collection names\n // This allows PascalCase imports (e.g., Todo) to work with lowercase MongoDB collections (e.g., todo)\n this._collections[collectionName.toLowerCase()] = this.createCollectionClass(collectionName, collectionDef);\n });\n }\n\n /**\n * Create a single collection class with all CRUD operations\n * Automatically enhances User collection with convenience methods\n */\n private createCollectionClass(collectionName: string, collectionDef: CollectionDefinition): CollectionClass {\n const client = this;\n const isUserCollection = collectionName.toLowerCase() === 'user';\n\n // Base collection class with standard CRUD operations\n const baseCollection: any = {\n // Get single record by ID\n async get(id: string): Promise<CollectionRecord> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'GET'\n );\n return response;\n },\n\n // List all records with MongoDB/Mongoose-style filtering\n async list(...args: any[]): Promise<CollectionRecord[]> {\n const queryParams = new URLSearchParams();\n\n // Detect signature: list(filter, options) vs list(options)\n let filter: Record<string, any> | undefined;\n let options: ListOptions | undefined;\n\n if (args.length === 0) {\n // No arguments: list all\n filter = undefined;\n options = undefined;\n } else if (args.length === 1) {\n // Single argument: check if it's old-style QueryOptions or new-style filter\n const arg = args[0];\n if (arg && (arg.q !== undefined || arg.sort !== undefined || arg.limit !== undefined || arg.offset !== undefined || arg._count !== undefined)) {\n // Old style: { q: {...}, sort: '...', limit: ... }\n // Pass through as-is for backward compatibility\n Object.entries(arg).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n });\n } else {\n // New style: treat as filter object\n filter = arg;\n options = undefined;\n }\n } else if (args.length === 2) {\n // Two arguments: list(filter, options) - MongoDB/Mongoose style\n [filter, options] = args;\n }\n\n // Process new-style MongoDB/Mongoose parameters\n if (filter !== undefined || options !== undefined) {\n // Add filter as 'q' parameter\n if (filter && Object.keys(filter).length > 0) {\n queryParams.append('q', JSON.stringify(filter));\n }\n\n // Process options\n if (options) {\n // Handle sort (convert object to string if needed)\n if (options.sort !== undefined) {\n let sortString: string;\n if (typeof options.sort === 'object') {\n // Convert { field: -1 } to '-field' or { field: 1 } to 'field'\n const sortField = Object.keys(options.sort)[0];\n const sortOrder = options.sort[sortField];\n sortString = sortOrder === -1 ? `-${sortField}` : sortField;\n } else {\n // Already a string\n sortString = options.sort;\n }\n queryParams.append('sort', sortString);\n }\n\n // Handle limit and offset\n if (options.limit !== undefined) {\n queryParams.append('limit', String(options.limit));\n }\n if (options.offset !== undefined) {\n queryParams.append('offset', String(options.offset));\n }\n }\n }\n\n const url = queryParams.toString()\n ? `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?${queryParams}`\n : `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}`;\n\n const response = await client.makeRequest(url, 'GET');\n return makeArrayForgiving(Array.isArray(response) ? response : []);\n },\n\n // Filter records by query (alias for list)\n async filter(...args: any[]): Promise<CollectionRecord[]> {\n return this.list(...args);\n },\n\n // Find single record matching query\n async findOne(...args: any[]): Promise<CollectionRecord | null> {\n // Support both MongoDB style and old style\n if (args.length === 0) {\n const results = await this.list({}, { limit: 1 });\n return results[0] || null;\n } else if (args.length === 1) {\n const arg = args[0];\n // Check if old style QueryOptions or new style filter\n if (arg && (arg.q !== undefined || arg._count !== undefined)) {\n // Old style\n const results = await this.list({ ...arg, limit: 1 });\n return results[0] || null;\n } else {\n // New style: treat as filter\n const results = await this.list(arg, { limit: 1 });\n return results[0] || null;\n }\n } else {\n // Two arguments: findOne(filter, options)\n const [filter, options] = args;\n const results = await this.list(filter, { ...options, limit: 1 });\n return results[0] || null;\n }\n },\n\n // Create new record\n async create(data: Partial<CollectionRecord>): Promise<CollectionRecord> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}`,\n 'POST',\n data\n );\n return response;\n },\n\n // Update existing record (overridden for User collection)\n async update(...args: any[]): Promise<CollectionRecord> {\n if (isUserCollection) {\n // Smart update for User collection\n if (args.length === 1) {\n // Single argument: update current user via auth.updateMe()\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n args[0]\n );\n return response;\n } else if (args.length === 2) {\n // Two arguments: update specific user by ID\n const [id, data] = args;\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'PATCH',\n data\n );\n return response;\n } else {\n throw new OmnikitError(\n 'User.update() expects 1 argument (current user data) or 2 arguments (id, data)',\n 400,\n 'INVALID_ARGUMENTS'\n );\n }\n } else {\n // Standard update for other collections\n const [id, data] = args;\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'PATCH',\n data\n );\n return response;\n }\n },\n\n // Delete record by ID\n async delete(id: string): Promise<boolean> {\n await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'DELETE'\n );\n return true;\n },\n\n // Count records matching query\n async count(...args: any[]): Promise<number> {\n const queryParams = new URLSearchParams();\n\n // Support both MongoDB style and old style\n if (args.length === 0) {\n // No filter\n queryParams.append('_count', 'true');\n } else if (args.length === 1) {\n const arg = args[0];\n // Check if old style QueryOptions or new style filter\n if (arg && (arg.q !== undefined || arg.sort !== undefined)) {\n // Old style: pass through as-is\n Object.entries(arg).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n });\n } else {\n // New style: treat as filter\n if (arg && Object.keys(arg).length > 0) {\n queryParams.append('q', JSON.stringify(arg));\n }\n }\n queryParams.append('_count', 'true');\n } else if (args.length === 2) {\n // Two arguments: count(filter, options) - but we only use filter for count\n const [filter] = args;\n if (filter && Object.keys(filter).length > 0) {\n queryParams.append('q', JSON.stringify(filter));\n }\n queryParams.append('_count', 'true');\n }\n\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?${queryParams}`,\n 'GET'\n );\n\n return response.total || response.count || 0;\n },\n\n // Bulk create multiple records\n async bulkCreate(items: Partial<CollectionRecord>[]): Promise<BulkResult> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/bulk`,\n 'POST',\n { items }\n );\n return response;\n },\n\n // Bulk delete multiple records by ID\n async bulkDelete(ids: string[]): Promise<BulkResult> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/bulk-delete`,\n 'POST',\n ids\n );\n return response;\n },\n\n // Import records from CSV or JSON file\n async import(file: File, format: 'csv' | 'json'): Promise<ImportResult> {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('format', format);\n\n const response = await client.makeRequestWithFormData(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/import`,\n formData\n );\n return response;\n },\n\n // Delete all records (requires explicit confirmation)\n async deleteAll(confirm: boolean): Promise<BulkResult> {\n if (!confirm) {\n throw new OmnikitError(\n 'deleteAll requires explicit confirmation. Pass true to confirm.',\n 400,\n 'CONFIRMATION_REQUIRED'\n );\n }\n\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?confirm=true`,\n 'DELETE'\n );\n return response;\n },\n\n // Backward compatibility: findById → get\n async findById(id: string): Promise<CollectionRecord> {\n console.warn('findById() is deprecated. Use get() instead.');\n return this.get(id);\n }\n };\n\n // Add User-specific convenience methods\n if (isUserCollection) {\n baseCollection.me = async (): Promise<CollectionRecord> => {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'GET'\n );\n return response;\n };\n\n baseCollection.updateMe = async (data: Partial<CollectionRecord>): Promise<CollectionRecord> => {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n data\n );\n return response;\n };\n }\n\n return baseCollection as CollectionClass;\n }\n\n /**\n * Create services from new flat schema (recommended)\n * Services are exposed as omnikit.services.ServiceName\n */\n private createServicesFromSchema(schema: ServicesSchema): void {\n // Create flat services (new structure)\n schema.services.forEach((service: ServiceDefinition) => {\n // Service name comes directly from backend (e.g., \"SendEmail\", \"InvokeLLM\")\n this._services[service.name] = this.createServiceMethod(service);\n });\n\n // Also populate legacy _integrations.BuiltIn for backward compatibility\n this._integrations['BuiltIn'] = {};\n schema.services.forEach((service: ServiceDefinition) => {\n this._integrations['BuiltIn'][service.name] = this._services[service.name];\n });\n }\n\n /**\n * Create a service method from ServiceDefinition\n */\n private createServiceMethod(service: ServiceDefinition): IntegrationMethod {\n const client = this;\n const { path, method = 'POST', path_params } = service;\n\n return async (params?: Record<string, any>, useServiceToken?: boolean): Promise<any> => {\n // BULLETPROOF FIX: If params is a File directly (e.g., UploadFile(file) instead of UploadFile({ file })),\n // automatically wrap it in the correct format\n let normalizedParams = params;\n if (params instanceof File) {\n console.warn('[Omnikit SDK] UploadFile called with File directly. Auto-wrapping to { file }. Please use UploadFile({ file }) for best practice.');\n normalizedParams = { file: params };\n }\n\n // Build URL with path parameter substitution\n let finalPath = path;\n const remainingParams = { ...normalizedParams };\n\n // Substitute path parameters (e.g., {operation_name})\n if (path_params && path_params.length > 0 && normalizedParams) {\n path_params.forEach((paramName: string) => {\n if (normalizedParams[paramName] !== undefined) {\n finalPath = finalPath.replace(`{${paramName}}`, String(normalizedParams[paramName]));\n delete remainingParams[paramName]; // Remove from body/query params\n }\n });\n }\n\n const fullUrl = `${client.baseUrl}/apps/${client.appId}${finalPath}`;\n\n // Handle file uploads using presigned URL flow (zero backend load)\n if (remainingParams && remainingParams.file instanceof File) {\n return client.handleFileUpload(remainingParams.file, path, useServiceToken);\n }\n\n // Make the request\n const response = await client.makeRequest(\n fullUrl,\n method,\n method === 'GET' ? undefined : remainingParams,\n {\n useServiceToken,\n queryParams: method === 'GET' ? remainingParams : undefined\n }\n );\n\n // Apply normalization\n return client.normalizeIntegrationResponse(response, path);\n };\n }\n\n /**\n * Handle file upload via presigned URL flow\n * Supports both public and private file uploads based on path\n */\n private async handleFileUpload(file: File, path: string, useServiceToken?: boolean): Promise<any> {\n const isPrivate = path.includes('/files/private');\n const initEndpoint = isPrivate ? '/services/files/private/init' : '/services/files/init';\n const completeEndpoint = isPrivate ? '/services/files/private/complete' : '/services/files/complete';\n\n // Step 1: Get presigned URL from backend\n const initResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}${initEndpoint}`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url } = initResponse;\n\n // Step 2: Upload file directly to R2 (bypasses backend entirely)\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion\n const completeResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}${completeEndpoint}/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // For private files, don't normalize (return file_uri as-is)\n // For public files, apply URL normalization\n if (isPrivate) {\n return completeResponse;\n }\n return this.normalizeIntegrationResponse(completeResponse, path);\n }\n\n /**\n * @deprecated Use createServicesFromSchema instead\n * Create integration methods from legacy backend schema\n */\n private createIntegrationsFromSchema(schema: IntegrationSchema): void {\n schema.installed_packages.forEach((pkg: IntegrationPackage) => {\n const packageName = pkg.package_name;\n this._integrations[packageName] = {};\n\n pkg.endpoints.forEach((endpoint) => {\n const methodName = this.formatMethodName(endpoint.name);\n // Pass the full endpoint object (not just path) to support method types and path params\n this._integrations[packageName][methodName] = this.createIntegrationMethod(endpoint);\n // Also add to _services for new access pattern\n this._services[methodName] = this._integrations[packageName][methodName];\n });\n });\n }\n\n /**\n * @deprecated Backend now returns final method names\n * Format endpoint name to PascalCase method name (legacy)\n */\n private formatMethodName(name: string): string {\n // Convert names like \"email\" → \"SendEmail\", \"llm\" → \"InvokeLLM\"\n const methodMap: Record<string, string> = {\n 'email': 'SendEmail',\n 'llm': 'InvokeLLM',\n 'files': 'UploadFile',\n 'files/private': 'UploadPrivateFile',\n 'files/signed-url': 'CreateFileSignedUrl',\n 'images': 'GenerateImage',\n 'speech': 'GenerateSpeech',\n 'video': 'GenerateVideo',\n 'video_status': 'CheckVideoStatus',\n 'extract-text': 'ExtractData',\n 'extract-text_status': 'CheckExtractStatus',\n 'sms': 'SendSMS'\n };\n\n return methodMap[name] || name.charAt(0).toUpperCase() + name.slice(1);\n }\n\n /**\n * Create integration method that calls backend endpoint\n */\n private createIntegrationMethod(endpoint: IntegrationEndpoint): IntegrationMethod {\n const client = this;\n const { path, method = 'POST', path_params = [] } = endpoint;\n\n return async (params?: Record<string, any>, useServiceToken?: boolean): Promise<any> => {\n // BULLETPROOF FIX: If params is a File directly (e.g., UploadFile(file) instead of UploadFile({ file })),\n // automatically wrap it in the correct format\n let normalizedParams = params;\n if (params instanceof File) {\n console.warn('[Omnikit SDK] UploadFile called with File directly. Auto-wrapping to { file }. Please use UploadFile({ file }) for best practice.');\n normalizedParams = { file: params };\n }\n\n // Build URL with path parameter substitution\n let finalPath = path;\n const remainingParams = { ...normalizedParams };\n\n // Substitute path parameters (e.g., {operation_name})\n if (path_params && path_params.length > 0 && normalizedParams) {\n path_params.forEach((paramName: string) => {\n if (normalizedParams[paramName] !== undefined) {\n finalPath = finalPath.replace(`{${paramName}}`, String(normalizedParams[paramName]));\n delete remainingParams[paramName]; // Remove from body/query params\n }\n });\n }\n\n const fullUrl = `${client.baseUrl}/apps/${client.appId}${finalPath}`;\n\n // Handle PRIVATE file uploads (returns file_uri, not file_url)\n if (path.includes('/services/files/private') && remainingParams && remainingParams.file instanceof File) {\n const file = remainingParams.file as File;\n\n try {\n // Step 1: Get presigned URL from backend (private endpoint)\n const initResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/private/init`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url, file_uri } = initResponse;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload private file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion (private endpoint)\n const completeResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/private/complete/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // Return response with file_uri (no URL normalization for private files)\n return completeResponse;\n\n } catch (error) {\n if (error instanceof OmnikitError) {\n throw error;\n }\n throw new OmnikitError(\n `Private file upload failed: ${(error as Error).message}`,\n 500,\n 'UPLOAD_ERROR',\n error\n );\n }\n }\n\n // Handle PUBLIC file uploads using presigned URL flow (zero backend load)\n if (remainingParams && remainingParams.file instanceof File) {\n const file = remainingParams.file as File;\n\n try {\n // Step 1: Get presigned URL from backend\n const initResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/init`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url, public_url } = initResponse;\n\n // Step 2: Upload file directly to R2 (bypasses backend entirely)\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion\n const completeResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/complete/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // Apply normalization to file upload responses\n return client.normalizeIntegrationResponse(completeResponse, path);\n\n } catch (error) {\n // If it's already an OmnikitError, rethrow\n if (error instanceof OmnikitError) {\n throw error;\n }\n // Wrap other errors\n throw new OmnikitError(\n `File upload failed: ${(error as Error).message}`,\n 500,\n 'UPLOAD_ERROR',\n error\n );\n }\n }\n\n // For GET requests, don't send body (params will be ignored or should be in URL)\n // For POST/PUT/PATCH, send params as JSON body\n const response = await client.makeRequest(\n fullUrl,\n method,\n method === 'GET' ? null : remainingParams,\n { useServiceToken }\n );\n\n // BULLETPROOF FIX: Normalize response to add common aliases\n // This prevents runtime errors when AI generates code like response.content instead of response.result\n return client.normalizeIntegrationResponse(response, path);\n };\n }\n\n /**\n * Normalize integration response to add common aliases for bulletproof access\n * Prevents runtime errors from AI-generated code using wrong property names\n */\n private normalizeIntegrationResponse(response: any, path: string): any {\n if (!response || typeof response !== 'object') {\n return response;\n }\n\n // Create a new object with the response data\n const normalized = { ...response };\n\n // LLM response: add .content as alias for .result\n if (path.includes('/services/llm') && 'result' in normalized && !('content' in normalized)) {\n Object.defineProperty(normalized, 'content', {\n get() { return this.result; },\n enumerable: false // Don't show in JSON.stringify or Object.keys\n });\n }\n\n // UploadFile response: add .url as alias for .file_url\n if (path.includes('/services/files') && 'file_url' in normalized && !('url' in normalized)) {\n Object.defineProperty(normalized, 'url', {\n get() { return this.file_url; },\n enumerable: false\n });\n }\n\n // GenerateSpeech response: add .audio_url as alias for .url\n if (path.includes('/services/speech') && 'url' in normalized && !('audio_url' in normalized)) {\n Object.defineProperty(normalized, 'audio_url', {\n get() { return this.url; },\n enumerable: false\n });\n }\n\n // ExtractData response: add .text as shortcut for first result's text\n if (path.includes('/services/extract') && 'results' in normalized && Array.isArray(normalized.results)) {\n if (!('text' in normalized)) {\n Object.defineProperty(normalized, 'text', {\n get() {\n const firstSuccess = this.results?.find((r: any) => r.success);\n return firstSuccess?.text || '';\n },\n enumerable: false\n });\n }\n }\n\n return normalized;\n }\n\n /**\n * HTTP request helper with JSON\n */\n async makeRequest(\n url: string,\n method: string = 'GET',\n data: any = null,\n options?: RequestOptions\n ): Promise<any> {\n // Build URL with query params for GET requests\n let finalUrl = url;\n if (options?.queryParams && Object.keys(options.queryParams).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(options.queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n finalUrl = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`;\n }\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n // Removed credentials: 'include' to prevent sending cookies (switching to pure Bearer token)\n };\n\n // Add user auth token (always send user token in Authorization)\n const userToken = this.getAuthToken();\n if (userToken) {\n (fetchOptions.headers as Record<string, string>).Authorization = `Bearer ${userToken}`;\n }\n\n // Add service token if available (send in X-Service-Token header)\n if (this._serviceToken) {\n (fetchOptions.headers as Record<string, string>)['X-Service-Token'] = this._serviceToken;\n }\n\n // Add API key if available (for backend function auth)\n if (this._apiKey) {\n (fetchOptions.headers as Record<string, string>)['X-API-Key'] = this._apiKey;\n }\n\n // Add additional headers\n if (options?.headers) {\n Object.assign(fetchOptions.headers as Record<string, string>, options.headers);\n }\n\n // Add body for POST/PUT/PATCH requests\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n fetchOptions.body = JSON.stringify(data);\n }\n\n const response = await fetch(finalUrl, fetchOptions);\n\n // Handle 401 Unauthorized - Clear token and throw\n if (response.status === 401) {\n this.clearAuthToken();\n throw new OmnikitError(\n 'Authentication required or token expired',\n 401,\n 'UNAUTHORIZED'\n );\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || error.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n error.code || 'HTTP_ERROR',\n error\n );\n }\n\n // Handle empty responses\n if (response.status === 204 || method === 'DELETE') {\n return null;\n }\n\n return await response.json();\n }\n\n /**\n * HTTP request helper with FormData (for file uploads)\n */\n private async makeRequestWithFormData(\n url: string,\n formData: FormData,\n useServiceToken?: boolean\n ): Promise<any> {\n const fetchOptions: RequestInit = {\n method: 'POST',\n body: formData,\n headers: {} as Record<string, string>,\n // Removed credentials: 'include'\n };\n\n // Add user auth token (always send user token in Authorization)\n const userToken = this.getAuthToken();\n if (userToken) {\n (fetchOptions.headers as Record<string, string>).Authorization = `Bearer ${userToken}`;\n }\n\n // Add service token if available (send in X-Service-Token header)\n if (this._serviceToken) {\n (fetchOptions.headers as Record<string, string>)['X-Service-Token'] = this._serviceToken;\n }\n\n // Add API key if available (for backend function auth)\n if (this._apiKey) {\n (fetchOptions.headers as Record<string, string>)['X-API-Key'] = this._apiKey;\n }\n\n // Don't set Content-Type for FormData - browser will set it with boundary\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || error.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n error.code || 'HTTP_ERROR',\n error\n );\n }\n\n return await response.json();\n }\n\n /**\n * Get app metadata (for internal use)\n */\n async getAppMetadata(): Promise<AppSchema> {\n const response = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}`,\n 'GET'\n );\n\n // Update metadata cache with fresh data from server\n if (response?.app || response?.name) {\n const app = response.app || response;\n this.updateMetadataCache({\n name: app.name,\n logoUrl: app.logo_url,\n thumbnailUrl: app.thumbnail_url,\n });\n }\n\n return response;\n }\n\n /**\n * Set auth token\n */\n setAuthToken(token: string): void {\n this.userToken = token;\n saveAccessToken(token);\n }\n\n /**\n * Get current auth token\n */\n getAuthToken(): string | null {\n return this.userToken;\n }\n\n /**\n * Clear auth token\n */\n clearAuthToken(): void {\n this.userToken = null;\n clearStoredToken();\n }\n\n /**\n * Create a live voice session for real-time voice conversation with AI.\n *\n * The session manages WebSocket communication, microphone capture, and audio playback.\n *\n * @example\n * ```typescript\n * const session = omnikit.createLiveVoiceSession({\n * systemInstruction: 'You are a helpful assistant.',\n * voice: 'Puck',\n * onTranscript: (text, role) => console.log(`${role}: ${text}`),\n * onStatusChange: (status) => console.log(`Status: ${status}`),\n * onError: (error) => console.error(error),\n * });\n *\n * await session.start();\n * // ... user speaks, AI responds ...\n * await session.stop();\n * ```\n *\n * @param config - Optional configuration for the voice session\n * @returns A LiveVoiceSession object to control the session\n */\n createLiveVoiceSession(config?: LiveVoiceConfig): LiveVoiceSession {\n return new LiveVoiceSessionImpl(\n this.baseUrl,\n this.appId,\n this.getAuthToken(),\n config\n );\n }\n\n /**\n * Invoke a backend function by name.\n *\n * Backend functions are deployed to Supabase Edge Functions and can be invoked\n * from the frontend using this method.\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const result = await omnikit.invokeFunction('processPayment', {\n * amount: 100,\n * userId: 'abc123'\n * });\n * console.log(result.transactionId); // Direct access to function response\n * ```\n *\n * @param functionName - Name of the function to invoke (matches filename without .js)\n * @param body - Optional request body to send to the function\n * @returns Response data from the function (unwrapped)\n * @throws Error if the function invocation fails\n */\n async invokeFunction(functionName: string, body?: Record<string, any>): Promise<any> {\n await this.ensureInitialized();\n\n const response = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}/functions/invoke/${functionName}`,\n 'POST',\n { body }\n );\n\n // Unwrap the response - return the function's actual response data\n // The backend wraps responses in { success, status_code, data, error, execution_time_ms }\n if (response && typeof response === 'object') {\n if (response.success === false && response.error) {\n throw new Error(response.error);\n }\n // Return the actual function response data\n if ('data' in response) {\n return response.data;\n }\n }\n\n return response;\n }\n\n /**\n * Get a secret value at runtime (for backend functions).\n *\n * This method securely fetches secrets from the Omnikit API using the app's API key.\n * Use this in Supabase Edge Functions instead of storing secrets in Supabase's\n * environment variables to ensure proper isolation between apps.\n *\n * @example\n * ```typescript\n * // In a backend function (Deno Edge Function)\n * const omnikit = createClient({\n * appId: __OMNIKIT_APP_ID__,\n * serverUrl: __OMNIKIT_API_URL__,\n * apiKey: __OMNIKIT_API_KEY__,\n * });\n *\n * const stripeKey = await omnikit.getSecret('STRIPE_SECRET_KEY');\n * const stripe = new Stripe(stripeKey);\n * ```\n *\n * @param secretName - Name of the secret to retrieve\n * @returns The decrypted secret value\n * @throws Error if the secret is not found or API key is invalid\n */\n async getSecret(secretName: string): Promise<string> {\n if (!this._apiKey) {\n throw new OmnikitError(\n 'API key is required to fetch secrets. Provide apiKey in config.',\n 403,\n 'API_KEY_REQUIRED'\n );\n }\n\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/secrets/${secretName}/value`,\n {\n method: 'GET',\n headers: {\n 'X-API-Key': this._apiKey,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || `Failed to fetch secret: ${response.statusText}`,\n response.status,\n 'SECRET_FETCH_FAILED'\n );\n }\n\n const data = await response.json();\n return data.value;\n }\n}\n\n/**\n * Factory function to create an Omnikit client\n *\n * @example\n * ```typescript\n * import { createClient } from '@omnikit/sdk';\n *\n * const omnikit = createClient({\n * appId: 'your-app-id',\n * // token auto-detected from URL or localStorage\n * });\n *\n * // Ready to use immediately - no initialize() needed!\n * const users = await omnikit.collections.User.list();\n * ```\n */\nexport function createClient(config: OmnikitConfig): OmnikitClient {\n return new APIClient(config) as OmnikitClient;\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-utils.ts","../src/live-voice.ts","../src/client.ts"],"names":["isBrowser"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Authentication utility functions for Omnikit SDK\n * Provides helpers for token management\n */\n\n// App-specific localStorage key to prevent token sharing between apps\n// Format: omnikit_token_{appId} for app-specific isolation\nlet ACCESS_TOKEN_KEY = 'access_token'; // Default fallback for backwards compatibility\nconst TOKEN_URL_PARAM = 'token';\n\n/**\n * Set the app-specific localStorage key for tokens\n * This ensures each app has its own isolated token storage\n * Called by APIClient during initialization\n * @param appId - The app ID to use for the storage key\n */\nexport function setAccessTokenKey(appId: string): void {\n ACCESS_TOKEN_KEY = `omnikit_token_${appId}`;\n}\n\n/**\n * Check if code is running in browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n}\n\n/**\n * Get access token from URL parameters\n * @returns Token string or null if not found\n */\nfunction getTokenFromUrl(): string | null {\n if (!isBrowser()) return null;\n\n try {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(TOKEN_URL_PARAM);\n } catch (error) {\n console.warn('Failed to get token from URL:', error);\n return null;\n }\n}\n\n/**\n * Get access token from localStorage\n * @returns Token string or null if not found\n */\nfunction getTokenFromStorage(): string | null {\n if (!isBrowser()) return null;\n\n try {\n return localStorage.getItem(ACCESS_TOKEN_KEY);\n } catch (error) {\n console.warn('Failed to get token from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Check if token exists in URL parameters\n * @returns True if token is present in URL\n */\nexport function isTokenInUrl(): boolean {\n return getTokenFromUrl() !== null;\n}\n\n/**\n * Remove token from URL without page reload\n * Cleans up the URL after token has been saved to localStorage\n */\nexport function cleanTokenFromUrl(): void {\n if (!isBrowser()) return;\n\n try {\n const url = new URL(window.location.href);\n if (url.searchParams.has(TOKEN_URL_PARAM)) {\n url.searchParams.delete(TOKEN_URL_PARAM);\n window.history.replaceState({}, '', url.toString());\n }\n } catch (error) {\n console.warn('Failed to clean token from URL:', error);\n }\n}\n\n/**\n * Get OAuth token from URL hash fragment\n * Checks for _auth_token (primary) from OAuth callback\n * Hash fragments are more secure than query params (not sent to server)\n * @returns Token string or null if not found\n */\nfunction getTokenFromHash(): string | null {\n if (!isBrowser()) return null;\n\n const hash = window.location.hash;\n if (!hash) return null;\n\n try {\n // Remove # prefix and parse as URLSearchParams\n const params = new URLSearchParams(hash.substring(1));\n // Check for _auth_token (used by OAuth callback)\n return params.get('_auth_token');\n } catch (error) {\n console.warn('Failed to get token from hash:', error);\n return null;\n }\n}\n\n/**\n * Remove OAuth token from URL hash without page reload\n * Cleans up the hash after token has been saved to localStorage\n */\nexport function cleanTokenFromHash(): void {\n if (!isBrowser()) return;\n\n try {\n // Remove hash entirely, keeping only path and query string\n window.history.replaceState(\n null,\n '',\n window.location.pathname + window.location.search\n );\n } catch (error) {\n console.warn('Failed to clean token from hash:', error);\n }\n}\n\n/**\n * Save access token to localStorage\n * @param token - The access token to save\n */\nexport function saveAccessToken(token: string): void {\n if (!isBrowser()) {\n console.warn('Cannot save token: not in browser environment');\n return;\n }\n\n try {\n localStorage.setItem(ACCESS_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save token to localStorage:', error);\n }\n}\n\n/**\n * Remove access token from localStorage\n * Call this on logout to clear the saved token\n */\nexport function removeAccessToken(): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.removeItem(ACCESS_TOKEN_KEY);\n } catch (error) {\n console.warn('Failed to remove token from localStorage:', error);\n }\n}\n\n/**\n * Get access token from URL or localStorage (cookie-less auth for CSRF protection)\n *\n * Priority:\n * 1. Check URL hash fragment (e.g., #_auth_token=xxx from OAuth redirect - most secure)\n * 2. Check URL query parameters (e.g., ?token=xxx - legacy support)\n * 3. Check localStorage (previously saved token)\n *\n * If token is found in URL (hash or query), it will be automatically saved to localStorage\n * and removed from the URL to prevent token exposure in browser history.\n *\n * @returns The access token or null if not found\n *\n * @example\n * ```typescript\n * import { createClient, getAccessToken } from '@omnikit/sdk';\n *\n * const omnikit = createClient({\n * appId: 'your-app-id',\n * token: getAccessToken() // Auto-retrieves from URL or localStorage\n * });\n * ```\n */\nexport function getAccessToken(): string | null {\n // Priority 1: Check URL hash (OAuth callback: #_auth_token=xxx)\n // Hash fragments are more secure - not sent to server in HTTP requests\n const hashToken = getTokenFromHash();\n if (hashToken) {\n // Save to localStorage for future use\n saveAccessToken(hashToken);\n\n // Clean hash to prevent token exposure in browser history\n cleanTokenFromHash();\n\n console.log('✅ OAuth token captured from URL hash');\n\n // Dispatch auth-change event so AuthGate can re-check auth state\n // This triggers a re-render after OAuth callback\n if (isBrowser()) {\n window.dispatchEvent(new CustomEvent('omnikit:auth-change'));\n }\n\n return hashToken;\n }\n\n // Priority 2: Check URL query params (legacy: ?token=xxx)\n const urlToken = getTokenFromUrl();\n if (urlToken) {\n // Save to localStorage for future use\n saveAccessToken(urlToken);\n\n // Clean URL to prevent token exposure in browser history\n cleanTokenFromUrl();\n\n // Dispatch auth-change event so AuthGate can re-check auth state\n if (isBrowser()) {\n window.dispatchEvent(new CustomEvent('omnikit:auth-change'));\n }\n\n return urlToken;\n }\n\n // Priority 3: Fall back to localStorage\n // No cookies used (cookie-less auth for CSRF protection)\n return getTokenFromStorage();\n}\n\n/**\n * Set access token (saves to localStorage)\n * Alias for saveAccessToken for consistency with getAccessToken\n * @param token - The access token to set\n */\nexport function setAccessToken(token: string): void {\n saveAccessToken(token);\n}\n","/**\n * Live Voice Session Implementation\n *\n * Manages real-time bidirectional voice communication with Gemini Live API.\n * Handles microphone capture, audio playback, and WebSocket communication.\n */\n\nimport type {\n LiveVoiceConfig,\n LiveVoiceSession,\n LiveVoiceStatus,\n LiveVoiceServerMessage,\n} from './types';\nimport { OmnikitError } from './client';\n\n// Audio configuration\nconst INPUT_SAMPLE_RATE = 16000; // 16kHz for input (browser → Gemini)\nconst OUTPUT_SAMPLE_RATE = 24000; // 24kHz for output (Gemini → browser)\nconst CHUNK_SIZE = 4096; // Audio chunk size for capture\n\n/**\n * Implementation of LiveVoiceSession\n */\nexport class LiveVoiceSessionImpl implements LiveVoiceSession {\n private ws: WebSocket | null = null;\n private audioContext: AudioContext | null = null;\n private mediaStream: MediaStream | null = null;\n private scriptProcessor: ScriptProcessorNode | null = null;\n private sourceNode: MediaStreamAudioSourceNode | null = null;\n private gainNode: GainNode | null = null;\n\n // Audio playback queue\n private playbackQueue: Float32Array[] = [];\n private isPlaying = false;\n\n // Session state\n private _isActive = false;\n private _status: LiveVoiceStatus = 'idle';\n private _sessionId: string | null = null;\n\n // Client reference for building WebSocket URL\n private baseUrl: string;\n private appId: string;\n private token: string | null;\n\n constructor(\n baseUrl: string,\n appId: string,\n token: string | null,\n private config?: LiveVoiceConfig\n ) {\n this.baseUrl = baseUrl;\n this.appId = appId;\n this.token = token;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n get status(): LiveVoiceStatus {\n return this._status;\n }\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Start the voice session\n */\n async start(): Promise<void> {\n if (this._isActive) {\n throw new OmnikitError('Session already active', 400, 'SESSION_ACTIVE');\n }\n\n this.setStatus('connecting');\n\n try {\n // 1. Request microphone permission\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: INPUT_SAMPLE_RATE,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n }\n });\n\n // 2. Set up AudioContext for capture and playback\n this.audioContext = new AudioContext({ sampleRate: OUTPUT_SAMPLE_RATE });\n\n // 3. Build WebSocket URL\n const wsUrl = this.buildWebSocketUrl();\n\n // 4. Connect WebSocket\n await this.connectWebSocket(wsUrl);\n\n // 5. Set up audio capture pipeline\n await this.setupAudioCapture();\n\n this._isActive = true;\n\n } catch (error) {\n this.setStatus('error');\n this.config?.onError?.(error as Error);\n\n // Clean up partial setup\n await this.cleanup();\n\n throw error;\n }\n }\n\n /**\n * Stop the voice session\n */\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n // Send end message to server\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify({ type: 'end' }));\n }\n\n await this.cleanup();\n }\n\n /**\n * Interrupt the AI while speaking\n */\n interrupt(): void {\n if (!this._isActive || !this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n // Clear playback queue\n this.playbackQueue = [];\n\n // Send interrupt signal to server\n this.ws.send(JSON.stringify({ type: 'interrupt' }));\n }\n\n /**\n * Build WebSocket URL with auth and config\n */\n private buildWebSocketUrl(): string {\n // Convert HTTP URL to WebSocket URL\n const wsProtocol = this.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const wsBase = this.baseUrl.replace(/^https?/, wsProtocol);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n\n if (this.token) {\n params.set('token', this.token);\n }\n\n if (this.config?.systemInstruction) {\n params.set('system_instruction', this.config.systemInstruction);\n }\n\n if (this.config?.voice) {\n params.set('voice', this.config.voice);\n }\n\n return `${wsBase}/apps/${this.appId}/live-voice?${params.toString()}`;\n }\n\n /**\n * Connect to WebSocket server\n */\n private connectWebSocket(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n const timeoutId = setTimeout(() => {\n reject(new OmnikitError('WebSocket connection timeout', 408, 'CONNECT_TIMEOUT'));\n }, 10000);\n\n this.ws.onopen = () => {\n clearTimeout(timeoutId);\n // Wait for session_started message before resolving\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event);\n\n // Resolve after receiving session_started\n if (this._sessionId && this._status === 'listening') {\n resolve();\n }\n };\n\n this.ws.onerror = (event) => {\n clearTimeout(timeoutId);\n const error = new OmnikitError('WebSocket connection error', 500, 'WS_ERROR');\n reject(error);\n };\n\n this.ws.onclose = (event) => {\n clearTimeout(timeoutId);\n\n if (this._isActive) {\n // Unexpected close\n this.setStatus('disconnected');\n this.config?.onError?.(new OmnikitError(\n `Connection closed: ${event.reason || 'Unknown reason'}`,\n event.code,\n 'CONNECTION_CLOSED'\n ));\n this.cleanup();\n }\n };\n });\n }\n\n /**\n * Handle incoming WebSocket messages\n */\n private handleMessage(event: MessageEvent): void {\n // Binary data = audio\n if (event.data instanceof ArrayBuffer) {\n this.handleAudioData(event.data);\n return;\n }\n\n // JSON control message\n try {\n const message: LiveVoiceServerMessage = JSON.parse(event.data);\n\n switch (message.type) {\n case 'session_started':\n this._sessionId = message.session_id || null;\n this.setStatus('listening');\n this.config?.onSessionStarted?.(this._sessionId!);\n break;\n\n case 'session_ended':\n this.config?.onSessionEnded?.(message.duration_seconds || 0);\n this.cleanup();\n break;\n\n case 'transcript':\n if (message.text && message.role) {\n this.config?.onTranscript?.(message.text, message.role);\n }\n break;\n\n case 'status':\n if (message.status) {\n this.setStatus(message.status);\n }\n break;\n\n case 'error':\n const error = new OmnikitError(\n message.message || 'Unknown error',\n 500,\n message.code\n );\n this.config?.onError?.(error);\n break;\n }\n } catch (e) {\n console.warn('[LiveVoice] Failed to parse message:', e);\n }\n }\n\n /**\n * Handle incoming audio data from Gemini\n */\n private handleAudioData(arrayBuffer: ArrayBuffer): void {\n if (!this.audioContext) return;\n\n // Update status to speaking\n if (this._status !== 'speaking') {\n this.setStatus('speaking');\n }\n\n // Convert PCM to Float32Array\n const pcmData = new Int16Array(arrayBuffer);\n const floatData = new Float32Array(pcmData.length);\n\n for (let i = 0; i < pcmData.length; i++) {\n // Convert 16-bit PCM to float [-1, 1]\n floatData[i] = pcmData[i] / 32768;\n }\n\n // Add to playback queue\n this.playbackQueue.push(floatData);\n\n // Start playback if not already playing\n if (!this.isPlaying) {\n this.playNextChunk();\n }\n }\n\n /**\n * Play next audio chunk from queue\n */\n private playNextChunk(): void {\n if (!this.audioContext || this.playbackQueue.length === 0) {\n this.isPlaying = false;\n\n // If queue is empty and we were speaking, switch back to listening\n if (this._status === 'speaking') {\n this.setStatus('listening');\n }\n return;\n }\n\n this.isPlaying = true;\n\n const floatData = this.playbackQueue.shift()!;\n\n // Create AudioBuffer\n const audioBuffer = this.audioContext.createBuffer(\n 1, // mono\n floatData.length,\n OUTPUT_SAMPLE_RATE\n );\n audioBuffer.getChannelData(0).set(floatData);\n\n // Create buffer source and play\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n source.onended = () => {\n // Play next chunk when this one finishes\n this.playNextChunk();\n };\n\n source.start();\n }\n\n /**\n * Set up audio capture from microphone\n */\n private async setupAudioCapture(): Promise<void> {\n if (!this.audioContext || !this.mediaStream) return;\n\n // Create source node from microphone\n this.sourceNode = this.audioContext.createMediaStreamSource(this.mediaStream);\n\n // Create script processor for capturing PCM data\n // Note: ScriptProcessorNode is deprecated but AudioWorklet requires separate file\n // For simplicity, we use ScriptProcessorNode here\n this.scriptProcessor = this.audioContext.createScriptProcessor(CHUNK_SIZE, 1, 1);\n\n // Resampler state for converting from browser sample rate to 16kHz\n const inputSampleRate = this.audioContext.sampleRate;\n let resampleBuffer: number[] = [];\n\n this.scriptProcessor.onaudioprocess = (event) => {\n if (!this._isActive || !this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n const inputData = event.inputBuffer.getChannelData(0);\n\n // Resample to 16kHz if necessary\n const resampledData = this.resample(inputData, inputSampleRate, INPUT_SAMPLE_RATE);\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(resampledData.length);\n for (let i = 0; i < resampledData.length; i++) {\n // Clamp and convert to 16-bit\n const sample = Math.max(-1, Math.min(1, resampledData[i]));\n pcmData[i] = sample < 0 ? sample * 32768 : sample * 32767;\n }\n\n // Send to WebSocket as binary\n this.ws.send(pcmData.buffer);\n };\n\n // Connect nodes: microphone → processor → (output muted)\n this.sourceNode.connect(this.scriptProcessor);\n this.scriptProcessor.connect(this.audioContext.destination);\n\n // Mute the output (we don't want to hear ourselves)\n this.gainNode = this.audioContext.createGain();\n this.gainNode.gain.value = 0;\n this.scriptProcessor.disconnect();\n this.scriptProcessor.connect(this.gainNode);\n this.gainNode.connect(this.audioContext.destination);\n }\n\n /**\n * Simple linear resampling\n */\n private resample(inputData: Float32Array, inputRate: number, outputRate: number): Float32Array {\n if (inputRate === outputRate) {\n return inputData;\n }\n\n const ratio = inputRate / outputRate;\n const outputLength = Math.floor(inputData.length / ratio);\n const output = new Float32Array(outputLength);\n\n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i * ratio;\n const srcIndexFloor = Math.floor(srcIndex);\n const srcIndexCeil = Math.min(srcIndexFloor + 1, inputData.length - 1);\n const fraction = srcIndex - srcIndexFloor;\n\n // Linear interpolation\n output[i] = inputData[srcIndexFloor] * (1 - fraction) + inputData[srcIndexCeil] * fraction;\n }\n\n return output;\n }\n\n /**\n * Update status and notify callback\n */\n private setStatus(status: LiveVoiceStatus): void {\n if (this._status !== status) {\n this._status = status;\n this.config?.onStatusChange?.(status);\n }\n }\n\n /**\n * Clean up all resources\n */\n private async cleanup(): Promise<void> {\n this._isActive = false;\n this.playbackQueue = [];\n this.isPlaying = false;\n\n // Disconnect audio nodes\n if (this.scriptProcessor) {\n this.scriptProcessor.disconnect();\n this.scriptProcessor = null;\n }\n\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode = null;\n }\n\n if (this.gainNode) {\n this.gainNode.disconnect();\n this.gainNode = null;\n }\n\n // Stop media stream tracks\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n\n // Close audio context\n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n\n // Close WebSocket\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'Session ended');\n }\n this.ws = null;\n }\n\n this._sessionId = null;\n this.setStatus('idle');\n }\n}\n","/**\n * Omnikit SDK v2.0 - Main Client\n *\n * Features:\n * - Auto-initialization on first use (no explicit initialize() required)\n * - Service role pattern for admin operations\n * - Automatic token detection from URL or localStorage\n * - Simplified integration access (no .call() needed)\n * - Enhanced collection operations (bulkCreate, bulkDelete, import, deleteAll)\n * - Improved auth module (isAuthenticated, me, updateMe)\n */\n\nimport { getAccessToken, saveAccessToken, removeAccessToken as clearStoredToken, setAccessTokenKey } from './auth-utils';\nimport { LiveVoiceSessionImpl } from './live-voice';\nimport type {\n OmnikitConfig,\n OmnikitClient,\n AppSchema,\n CollectionDefinition,\n CollectionField,\n CollectionRecord,\n CollectionClass,\n QueryOptions,\n ListOptions,\n AuthModule,\n AuthResponse,\n UserInfo,\n ServiceRoleClient,\n RequestOptions,\n BulkResult,\n ImportResult,\n ServicesSchema,\n ServiceDefinition,\n TemplateDefinition,\n IntegrationSchema,\n IntegrationPackage,\n IntegrationEndpoint,\n IntegrationMethod,\n OmnikitError as IOmnikitError,\n AsyncOptions,\n AsyncJobStatusResponse,\n AsyncJobCreatedResponse,\n LiveVoiceConfig,\n LiveVoiceSession,\n LLMParams,\n LLMStreamResult,\n LLMStreamEvent,\n} from './types';\n\n/**\n * Model name mapping for InvokeLLM\n * Maps friendly names to full Vertex AI model names\n */\nconst LLM_MODEL_MAP: Record<string, string> = {\n 'gemini-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-pro': 'vertex_ai/gemini-2.5-pro',\n};\n\n/**\n * Map friendly model name to full model name\n */\nfunction mapLLMModel(model: string | undefined): string | undefined {\n if (!model) return undefined;\n return LLM_MODEL_MAP[model] || model;\n}\n\n/**\n * Makes arrays forgiving for .items access\n * Handles cases where AI generates code expecting response.items\n * Both patterns work: arr.map(...) and arr.items.map(...)\n */\nfunction makeArrayForgiving<T>(arr: T[]): T[] & { items: T[] } {\n if (!Array.isArray(arr)) return arr as any;\n\n Object.defineProperty(arr, 'items', {\n get() { return this; },\n enumerable: false,\n configurable: true\n });\n\n return arr as T[] & { items: T[] };\n}\n\n/**\n * Enhanced error class with helper methods\n */\nexport class OmnikitError extends Error implements IOmnikitError {\n status?: number;\n code?: string;\n data?: any;\n isAuthError?: boolean;\n\n constructor(message: string, status?: number, code?: string, data?: any) {\n super(message);\n this.name = 'OmnikitError';\n this.status = status;\n this.code = code;\n this.data = data;\n this.isAuthError = status === 401 || status === 403;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, OmnikitError);\n }\n }\n\n isNotFound(): boolean {\n return this.status === 404;\n }\n\n isForbidden(): boolean {\n return this.status === 403;\n }\n\n isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n isBadRequest(): boolean {\n return this.status === 400;\n }\n\n isServerError(): boolean {\n return this.status !== undefined && this.status >= 500;\n }\n}\n\n/**\n * Main API Client Implementation\n */\n// localStorage key for metadata cache\nconst getMetadataCacheKey = (appId: string) => `omnikit_metadata_${appId}`;\n\nexport class APIClient implements OmnikitClient {\n appId: string;\n baseUrl: string;\n\n private userToken: string | null = null;\n private _serviceToken: string | null = null;\n private _apiKey: string | null = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n private _collections: Record<string, CollectionClass> = {};\n private _services: Record<string, IntegrationMethod> = {}; // New flat services\n private _integrations: Record<string, Record<string, IntegrationMethod>> = {}; // Legacy nested structure\n private _auth!: AuthModule;\n private _asServiceRole?: ServiceRoleClient;\n\n // Cached metadata for instant access (no flicker)\n private _metadata: {\n id: string;\n name: string;\n logoUrl: string;\n thumbnailUrl: string;\n visibility: string;\n platformAuthProviders: string[];\n };\n\n // Callbacks for metadata updates (for React re-render triggers)\n private _metadataListeners: Set<() => void> = new Set();\n\n // Callbacks for user state changes (for React auth state sync)\n private _userListeners: Set<(user: UserInfo | null) => void> = new Set();\n\n constructor(config: OmnikitConfig) {\n this.appId = config.appId;\n this.baseUrl = config.serverUrl || config.baseUrl || 'http://localhost:8001/api';\n\n // Store service token if provided\n this._serviceToken = config.serviceToken || null;\n\n // Store API key if provided (for backend function auth)\n this._apiKey = config.apiKey || null;\n\n // Check if running in browser environment\n const isBrowser = typeof window !== 'undefined' && typeof localStorage !== 'undefined';\n\n // Initialize metadata: localStorage cache > initial config > empty defaults\n this._metadata = this.loadCachedMetadata(config.initialMetadata);\n\n // IMPORTANT: Set app-specific localStorage key BEFORE any token operations\n // This ensures each app has isolated token storage (prevents cross-app auth pollution)\n // Only run in browser environments\n if (isBrowser) {\n setAccessTokenKey(this.appId);\n }\n\n // Auto-detect user token if not provided and autoInitAuth is enabled (default true)\n const autoInitAuth = config.autoInitAuth !== false; // Default to true\n if (config.token) {\n this.userToken = config.token;\n // Save to localStorage for future use (uses app-specific key) - browser only\n if (isBrowser) {\n saveAccessToken(config.token);\n }\n } else if (autoInitAuth && isBrowser) {\n // Try to get token from URL or localStorage (uses app-specific key) - browser only\n const detectedToken = getAccessToken();\n if (detectedToken) {\n this.userToken = detectedToken;\n }\n }\n\n // Eager initialization: Start fetching app schema and metadata immediately\n // This ensures appMetadata.name/logoUrl are populated ASAP (no explicit init needed)\n // First render uses localStorage cache, background fetch updates for subsequent access\n // Services use static mappings - no schema fetch needed for them\n this.ensureInitialized().catch(err => {\n console.warn('[Omnikit SDK] Background initialization failed:', err);\n });\n }\n\n /**\n * Load metadata from localStorage cache, falling back to initial config\n * Guards localStorage access for Deno/Node compatibility\n */\n private loadCachedMetadata(initialMetadata?: { name?: string; logoUrl?: string; thumbnailUrl?: string }) {\n // Try localStorage first (most recent server data) - browser only\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n const cached = localStorage.getItem(getMetadataCacheKey(this.appId));\n if (cached) {\n const parsed = JSON.parse(cached);\n return {\n id: this.appId,\n name: parsed.name || '',\n logoUrl: parsed.logoUrl || '',\n thumbnailUrl: parsed.thumbnailUrl || '',\n visibility: parsed.visibility || 'private',\n platformAuthProviders: parsed.platformAuthProviders || ['google'],\n };\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n }\n\n // Fall back to initial config (build-time values)\n return {\n id: this.appId,\n name: initialMetadata?.name || '',\n logoUrl: initialMetadata?.logoUrl || '',\n thumbnailUrl: initialMetadata?.thumbnailUrl || '',\n visibility: 'private', // Default to private, updated after fetch\n platformAuthProviders: ['google'], // Default to Google only\n };\n }\n\n /**\n * Update metadata cache in localStorage\n * IMPORTANT: Mutate in place to preserve object reference for exports\n */\n private updateMetadataCache(data: { name?: string; logoUrl?: string; thumbnailUrl?: string; visibility?: string; platformAuthProviders?: string[] }) {\n // Mutate in place - do NOT replace the object!\n // This preserves the reference exported in entities.js\n this._metadata.name = data.name || this._metadata.name;\n this._metadata.logoUrl = data.logoUrl || this._metadata.logoUrl;\n this._metadata.thumbnailUrl = data.thumbnailUrl || this._metadata.thumbnailUrl;\n this._metadata.visibility = data.visibility || this._metadata.visibility || 'private';\n this._metadata.platformAuthProviders = data.platformAuthProviders || this._metadata.platformAuthProviders || ['google'];\n\n // Only cache in browser environments (Deno/Node don't have localStorage)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(getMetadataCacheKey(this.appId), JSON.stringify(this._metadata));\n } catch (e) {\n // Ignore localStorage errors\n }\n }\n\n // Notify listeners (triggers React re-renders)\n this._metadataListeners.forEach(callback => callback());\n }\n\n /**\n * App metadata - available instantly without API call (no flicker!)\n */\n get metadata() {\n return this._metadata;\n }\n\n /**\n * Subscribe to metadata updates (for React components to trigger re-render)\n * @returns Unsubscribe function\n */\n onMetadataChange(callback: () => void): () => void {\n this._metadataListeners.add(callback);\n return () => this._metadataListeners.delete(callback);\n }\n\n /**\n * Subscribe to user state changes (for React auth state sync)\n * Called when user logs in, logs out, or updates profile\n * @returns Unsubscribe function\n */\n onUserChange(callback: (user: UserInfo | null) => void): () => void {\n this._userListeners.add(callback);\n return () => this._userListeners.delete(callback);\n }\n\n /**\n * Emit user change event to all listeners\n */\n private emitUserChange(user: UserInfo | null): void {\n this._userListeners.forEach(cb => {\n try {\n cb(user);\n } catch (e) {\n console.error('[Omnikit SDK] User listener error:', e);\n }\n });\n }\n\n /**\n * Lazy getter for collections - auto-initializes on first access\n */\n get collections(): Record<string, CollectionClass> {\n return this.createCollectionsProxy(false); // User collections\n }\n\n /**\n * @deprecated Use collections instead. This alias exists for backward compatibility.\n */\n get entities(): Record<string, CollectionClass> {\n return this.collections;\n }\n\n /**\n * Lazy getter for services (new flat structure) - auto-initializes on first access\n * Usage: omnikit.services.SendEmail({ to, subject, body })\n */\n get services(): Record<string, IntegrationMethod> {\n return this.createServicesProxy(false); // User services\n }\n\n /**\n * @deprecated Use services instead for flat access\n * Lazy getter for integrations - auto-initializes on first access\n */\n get integrations(): Record<string, Record<string, IntegrationMethod>> {\n return this.createIntegrationsProxy(false); // User integrations\n }\n\n /**\n * Lazy getter for auth - auto-initializes on first access\n */\n get auth(): AuthModule {\n return this.createAuthProxy();\n }\n\n /**\n * Lazy getter for service role operations\n * Only available when serviceToken is provided\n */\n get asServiceRole(): ServiceRoleClient {\n if (!this._serviceToken) {\n throw new OmnikitError(\n 'Service token is required to use asServiceRole. Provide serviceToken in config.',\n 403,\n 'SERVICE_TOKEN_REQUIRED'\n );\n }\n\n // Return cached instance if already created\n if (this._asServiceRole) {\n return this._asServiceRole;\n }\n\n // Create service role client with elevated privileges\n this._asServiceRole = {\n collections: this.createCollectionsProxy(true), // Service role collections\n services: this.createServicesProxy(true), // Service role services (new flat structure)\n integrations: this.createIntegrationsProxy(true), // Service role integrations (legacy)\n // Note: auth not available in service role for security\n };\n\n return this._asServiceRole;\n }\n\n /**\n * Create auth proxy that auto-initializes\n */\n private createAuthProxy(): AuthModule {\n const client = this;\n\n const authHandler: AuthModule = {\n async isAuthenticated(): Promise<boolean> {\n await client.ensureInitialized();\n try {\n // Pass app_id to check app-specific access (ensures deleted users are logged out)\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/is-authenticated?app_id=${client.appId}`,\n 'GET'\n );\n return response?.authenticated === true;\n } catch (error) {\n return false;\n }\n },\n\n async me(): Promise<UserInfo> {\n await client.ensureInitialized();\n // Get app user (from app-specific database)\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'GET'\n );\n // Emit user change event for React state sync\n client.emitUserChange(response);\n return response;\n },\n\n login(returnUrl?: string): void {\n // Redirect to app's own login page (backend-served)\n // The backend handles login based on app visibility settings\n const fullReturnUrl = returnUrl || (typeof window !== 'undefined' ? window.location.href : '/');\n const encodedReturnUrl = encodeURIComponent(fullReturnUrl);\n\n if (typeof window !== 'undefined') {\n // Determine correct login path based on current URL\n const currentPath = window.location.pathname;\n\n // Check if we're accessing via /api/sites/{app_id}/ (direct access)\n const apiSitesMatch = currentPath.match(/^\\/api\\/sites\\/([^\\/]+)/);\n if (apiSitesMatch) {\n // Direct API access - use full path\n window.location.href = `/api/sites/${client.appId}/login?return_url=${encodedReturnUrl}`;\n } else {\n // Subdomain or other access - use relative /login\n window.location.href = `/login?return_url=${encodedReturnUrl}`;\n }\n }\n },\n\n /**\n * Request a passwordless login code to email\n */\n async requestLoginCode(email: string, returnUrl?: string): Promise<{ success: boolean; message?: string }> {\n return await client.makeRequest(\n `${client.baseUrl}/auth/email/request-code`,\n 'POST',\n { email, return_url: returnUrl }\n );\n },\n\n /**\n * Verify the login code and set the session token\n */\n async verifyLoginCode(email: string, code: string): Promise<AuthResponse> {\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/email/verify-code`,\n 'POST',\n { email, code }\n );\n\n if (response.access_token) {\n client.setAuthToken(response.access_token);\n // Fetch user info and emit change event so AuthGate re-renders\n try {\n const user = await this.me();\n client.emitUserChange(user);\n } catch (e) {\n // Still emit with null to trigger re-render, me() will be called again by AuthGate\n client.emitUserChange(null);\n }\n }\n\n return response;\n },\n\n /**\n * Get available OAuth providers for this app\n * Returns both platform providers (zero-config) and custom SSO providers\n */\n async getAvailableProviders(): Promise<import('./types').OAuthProvidersResponse> {\n await client.ensureInitialized();\n\n try {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/auth/providers`,\n 'GET'\n );\n return response;\n } catch (error) {\n throw new OmnikitError(\n 'Failed to fetch available OAuth providers',\n (error as any).status || 500,\n 'PROVIDERS_FETCH_FAILED'\n );\n }\n },\n\n /**\n * Initiate OAuth login with any provider\n * Redirects to the backend OAuth endpoint for the specified provider\n */\n loginWithProvider(providerId: string, returnUrl?: string): void {\n const currentUrl = returnUrl || (typeof window !== 'undefined' ? window.location.href : '/');\n const redirectUrl = `${client.baseUrl}/auth/${providerId}?redirect_url=${encodeURIComponent(currentUrl)}`;\n\n if (typeof window !== 'undefined') {\n // Check if we are running inside an iframe\n const inIframe = window.self !== window.top;\n\n if (inIframe) {\n // In an iframe, standard redirect flow often fails for OAuth (X-Frame-Options)\n // Open in a popup instead\n const width = 600;\n const height = 700;\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - height / 2;\n \n const popup = window.open(\n redirectUrl, \n 'oauth_popup', \n `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes,status=yes`\n );\n\n if (popup) {\n // Poll for token in localStorage (since popup and iframe share origin in many cases)\n const checkTimer = setInterval(() => {\n // Check if token appeared\n const token = getAccessToken();\n if (token) {\n clearInterval(checkTimer);\n popup.close();\n // Reload to pick up the authenticated state\n window.location.reload();\n return;\n }\n\n if (popup.closed) {\n clearInterval(checkTimer);\n // Check one last time\n const finalToken = getAccessToken();\n if (finalToken) {\n window.location.reload();\n }\n }\n }, 1000);\n return;\n }\n // If popup blocked, fall back to redirect\n }\n\n window.location.href = redirectUrl;\n } else {\n throw new OmnikitError('loginWithProvider() can only be called in browser environment', 400, 'NOT_BROWSER');\n }\n },\n\n /**\n * Initiate Google OAuth Login\n * @deprecated Use loginWithProvider(\"google\", returnUrl) instead\n * Redirects to the backend OAuth endpoint\n */\n loginWithGoogle(returnUrl?: string): void {\n console.warn('loginWithGoogle() is deprecated. Use loginWithProvider(\"google\", returnUrl) instead.');\n this.loginWithProvider('google', returnUrl);\n },\n\n async logout(): Promise<void> {\n await client.makeRequest(\n `${client.baseUrl}/auth/logout`,\n 'POST'\n );\n client.clearAuthToken();\n // Emit user change event for React state sync (AuthGate subscribes to this)\n client.emitUserChange(null);\n },\n\n async refreshToken(): Promise<AuthResponse> {\n const response = await client.makeRequest(\n `${client.baseUrl}/auth/refresh`,\n 'POST'\n );\n\n if (response.access_token || response.token) {\n const newToken = response.access_token || response.token;\n client.setAuthToken(newToken);\n }\n\n return response;\n },\n\n async updateMe(data: Partial<UserInfo>): Promise<UserInfo> {\n await client.ensureInitialized();\n // Update app user profile (app-specific)\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n data\n );\n // Emit user change event for React state sync\n client.emitUserChange(response);\n return response;\n },\n\n // Alias for updateMe with clearer naming\n async updateProfile(data: Partial<UserInfo>): Promise<UserInfo> {\n return this.updateMe(data);\n },\n\n // Backward compatibility\n async getCurrentUser(): Promise<UserInfo> {\n return this.me();\n },\n\n // Subscribe to user state changes (for React auth state sync)\n onUserChange(callback: (user: UserInfo | null) => void): () => void {\n return client.onUserChange(callback);\n }\n };\n\n return authHandler;\n }\n\n /**\n * Convert PascalCase to snake_case\n * Example: PdfDocument -> pdf_document, UserProfile -> user_profile\n */\n private toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1') // Add underscore before capitals\n .toLowerCase() // Convert to lowercase\n .replace(/^_/, ''); // Remove leading underscore\n }\n\n /**\n * Create collections proxy that auto-initializes\n * @param useServiceToken - Whether to use service token for requests\n */\n private createCollectionsProxy(useServiceToken: boolean): Record<string, CollectionClass> {\n const client = this;\n\n return new Proxy({}, {\n get(target, collectionName: string) {\n if (typeof collectionName === 'string' && !collectionName.startsWith('_')) {\n // Return proxy that auto-initializes and calls collection methods\n return new Proxy({}, {\n get(obj, method: string) {\n if (typeof method === 'string') {\n return async function(...args: any[]) {\n await client.ensureInitialized();\n // Convert PascalCase to snake_case for lookup (e.g., PdfDocument -> pdf_document)\n const normalizedCollectionName = client.toSnakeCase(collectionName);\n const collection = client._collections[normalizedCollectionName];\n if (!collection) {\n throw new OmnikitError(\n `Collection '${collectionName}' not found in app schema`,\n 404,\n 'COLLECTION_NOT_FOUND'\n );\n }\n\n // Check if method exists on collection\n if (typeof (collection as any)[method] !== 'function') {\n const availableMethods = [\n 'get(id)', 'list(options?)', 'filter(filters?)', 'findOne(filters?)',\n 'create(data)', 'update(id, data)', 'delete(id)', 'count(filters?)',\n 'bulkCreate(items)', 'bulkDelete(ids)', 'import(file, format)', 'deleteAll(confirm)'\n ];\n throw new OmnikitError(\n `Method '${method}()' does not exist on collection '${collectionName}'.\\n\\n` +\n `Available methods:\\n${availableMethods.map(m => ` - ${m}`).join('\\n')}\\n\\n` +\n `Common mistake: There is NO 'read()' method. Use 'list()' instead.\\n` +\n `Example: await ${collectionName}.list({ limit: 100, sort: '-created_at' })`,\n 400,\n 'METHOD_NOT_FOUND'\n );\n }\n\n // Call the collection method with service token context if needed\n if (useServiceToken) {\n // Temporarily set context to use service token\n const originalGetToken = client.getAuthToken.bind(client);\n client.getAuthToken = () => client._serviceToken;\n try {\n const result = await (collection as any)[method](...args);\n client.getAuthToken = originalGetToken;\n return result;\n } catch (error) {\n client.getAuthToken = originalGetToken;\n throw error;\n }\n } else {\n return (collection as any)[method](...args);\n }\n };\n }\n return undefined;\n }\n }) as any;\n }\n return (target as any)[collectionName];\n }\n });\n }\n\n /**\n * Poll for job completion with progress callbacks\n * @param jobId - Job ID to poll\n * @param options - Async options (onStatusChange, pollInterval, timeout)\n * @returns Final job result\n */\n private async pollJobUntilComplete(\n jobId: string,\n options?: AsyncOptions\n ): Promise<any> {\n const pollInterval = options?.pollInterval || 2000;\n const timeout = options?.timeout || 300000; // 5 minutes default\n const startTime = Date.now();\n\n while (true) {\n // Check job status\n const status: AsyncJobStatusResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}/jobs/${jobId}`,\n 'GET'\n );\n\n // Report status changes if callback provided\n if (options?.onStatusChange) {\n options.onStatusChange(status.status, status.status_message);\n }\n\n // Check for completion\n if (status.status === 'completed') {\n return status.result;\n }\n\n // Check for failure\n if (status.status === 'failed') {\n throw new OmnikitError(\n status.error || 'Job failed',\n 500,\n 'JOB_FAILED',\n { job_id: jobId, status }\n );\n }\n\n // Check for cancellation\n if (status.status === 'cancelled') {\n throw new OmnikitError(\n 'Job was cancelled',\n 400,\n 'JOB_CANCELLED',\n { job_id: jobId }\n );\n }\n\n // Check timeout\n if (Date.now() - startTime > timeout) {\n throw new OmnikitError(\n `Job timed out after ${timeout / 1000} seconds`,\n 408,\n 'JOB_TIMEOUT',\n { job_id: jobId }\n );\n }\n\n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n }\n\n /**\n * Stream LLM response token by token via SSE\n * @param params - LLM request parameters with streaming callbacks\n * @returns Promise that resolves to the complete response string\n */\n private async streamLLMResponse(params: LLMParams): Promise<string> {\n await this.ensureInitialized();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const token = this.getAuthToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n if (this._serviceToken) {\n headers['X-Service-Token'] = this._serviceToken;\n }\n\n if (this._apiKey) {\n headers['X-API-Key'] = this._apiKey;\n }\n\n // Build request body without callback functions\n const requestBody: Record<string, any> = {\n ...params,\n stream: true,\n // Map friendly model names to full model names\n model: mapLLMModel(params.model),\n // Remove callback functions from request body\n onToken: undefined,\n onComplete: undefined,\n onError: undefined,\n };\n\n // Clean up undefined values\n Object.keys(requestBody).forEach(key => {\n if (requestBody[key] === undefined) {\n delete requestBody[key];\n }\n });\n\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/services/llm`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `LLM streaming failed: ${response.statusText}`;\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.detail || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n const err = new OmnikitError(errorMessage, response.status, 'STREAM_ERROR');\n params.onError?.(err);\n throw err;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n const err = new OmnikitError('No response body', 500, 'NO_BODY');\n params.onError?.(err);\n throw err;\n }\n\n const decoder = new TextDecoder();\n let fullResponse = '';\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE events from buffer\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const event: LLMStreamEvent = JSON.parse(line.slice(6));\n\n if (event.type === 'token' && event.content) {\n fullResponse += event.content;\n params.onToken?.(event.content);\n } else if (event.type === 'done') {\n params.onComplete?.({\n result: event.result || fullResponse,\n model_used: event.model_used || '',\n usage: event.usage,\n });\n } else if (event.type === 'error') {\n const err = new OmnikitError(\n event.message || 'Stream error',\n 500,\n 'STREAM_ERROR'\n );\n params.onError?.(err);\n throw err;\n }\n } catch (parseError) {\n // Ignore malformed SSE lines (but don't ignore OmnikitError)\n if (parseError instanceof OmnikitError) {\n throw parseError;\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return fullResponse;\n }\n\n /**\n * Create services proxy that auto-initializes (new flat structure)\n * @param useServiceToken - Whether to use service token for requests\n */\n private createServicesProxy(useServiceToken: boolean): Record<string, IntegrationMethod> {\n const client = this;\n\n return new Proxy({}, {\n get(target, serviceName: string) {\n if (typeof serviceName === 'string' && !serviceName.startsWith('_')) {\n // Special handling for CheckJobStatus\n if (serviceName === 'CheckJobStatus') {\n return async function(params?: { job_id: string }): Promise<AsyncJobStatusResponse> {\n await client.ensureInitialized();\n if (!params?.job_id) {\n throw new OmnikitError(\n 'job_id is required for CheckJobStatus',\n 400,\n 'MISSING_JOB_ID'\n );\n }\n\n return client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/jobs/${params.job_id}`,\n 'GET'\n );\n };\n }\n\n // Special handling for DownloadPrivateFile - triggers browser download via backend proxy\n if (serviceName === 'DownloadPrivateFile') {\n return async function(params?: { file_uri: string; filename?: string }): Promise<void> {\n await client.ensureInitialized();\n if (!params?.file_uri) {\n throw new OmnikitError(\n 'file_uri is required for DownloadPrivateFile',\n 400,\n 'MISSING_FILE_URI'\n );\n }\n\n // Build the download URL with query params\n const downloadUrl = new URL(`${client.baseUrl}/apps/${client.appId}/services/files/download`);\n downloadUrl.searchParams.set('file_uri', params.file_uri);\n if (params.filename) {\n downloadUrl.searchParams.set('filename', params.filename);\n }\n\n // Add auth token to URL for the download\n const token = client.getAuthToken();\n if (token) {\n downloadUrl.searchParams.set('token', token);\n }\n\n // Trigger download by opening in new window/tab\n // The backend sets Content-Disposition: attachment to force download\n window.open(downloadUrl.toString(), '_blank');\n };\n }\n\n // Standard service method handling with auto-polling for async methods\n return async function(params?: Record<string, any>, asyncOptions?: AsyncOptions) {\n // Initialize to load collections (services use static mappings)\n await client.ensureInitialized();\n\n // Special handling for InvokeLLM\n if (serviceName === 'InvokeLLM') {\n // Map friendly model names to full model names\n if (params?.model) {\n params = { ...params, model: mapLLMModel(params.model) };\n }\n // Handle streaming\n if (params?.stream) {\n return client.streamLLMResponse(params as LLMParams);\n }\n }\n\n let response;\n\n // Check if method exists in loaded services\n const method = client._services[serviceName];\n if (method) {\n // Call with service token if needed\n response = await method(params, useServiceToken);\n } else {\n // Direct API call fallback (services use static mappings)\n // Map service names to their API paths under /services/\n const servicePathMap: Record<string, string> = {\n 'SendEmail': 'services/email',\n 'InvokeLLM': 'services/llm',\n 'GenerateImage': 'services/images',\n 'GenerateSpeech': 'services/speech',\n 'GenerateVideo': 'services/video',\n 'ExtractData': 'services/extract-text',\n 'SendSMS': 'services/sms',\n 'UploadFile': 'services/files',\n 'UploadPrivateFile': 'services/files/private/init',\n 'CreateFileSignedUrl': 'services/files/signed-url',\n };\n\n const servicePath = servicePathMap[serviceName];\n if (!servicePath) {\n throw new OmnikitError(\n `Service '${serviceName}' not found. Known services: ${Object.keys(servicePathMap).join(', ')}`,\n 404,\n 'SERVICE_NOT_FOUND'\n );\n }\n\n // Build headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Use API key for server-to-server auth, otherwise user token\n if (client._apiKey) {\n headers['X-API-Key'] = client._apiKey;\n } else if (client.userToken) {\n headers['Authorization'] = `Bearer ${client.userToken}`;\n }\n\n // Make direct API call\n const fetchResponse = await fetch(\n `${client.baseUrl}/apps/${client.appId}/${servicePath}`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(params || {}),\n }\n );\n\n if (!fetchResponse.ok) {\n const error = await fetchResponse.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || `Service call failed: ${fetchResponse.statusText}`,\n fetchResponse.status,\n 'SERVICE_CALL_FAILED'\n );\n }\n\n response = await fetchResponse.json();\n }\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractText, etc.)\n if (response && response.async && response.job_id) {\n // If user wants to return immediately with job_id\n if (asyncOptions?.returnJobId) {\n return response as AsyncJobCreatedResponse;\n }\n\n // Otherwise, poll for completion automatically\n return client.pollJobUntilComplete(response.job_id, asyncOptions);\n }\n\n // Sync response - return as-is\n return response;\n };\n }\n return (target as any)[serviceName];\n }\n });\n }\n\n /**\n * @deprecated Use createServicesProxy instead\n * Create integrations proxy that auto-initializes\n * @param useServiceToken - Whether to use service token for requests\n */\n private createIntegrationsProxy(useServiceToken: boolean): Record<string, Record<string, IntegrationMethod>> {\n const client = this;\n\n return new Proxy({}, {\n get(target, packageName: string) {\n if (typeof packageName === 'string' && !packageName.startsWith('_')) {\n // Return proxy for integration package methods\n return new Proxy({}, {\n get(obj, methodName: string) {\n if (typeof methodName === 'string') {\n // Note: InvokeLLM now uses the standard async handler below\n // All integrations (LLM, Email, SMS, Image, Speech, etc.) are now async\n // and return { async: true, job_id: ... } which triggers auto-polling\n\n // Special handling for CheckJobStatus\n if (methodName === 'CheckJobStatus') {\n return async function(params?: { job_id: string }): Promise<AsyncJobStatusResponse> {\n await client.ensureInitialized();\n if (!params?.job_id) {\n throw new OmnikitError(\n 'job_id is required for CheckJobStatus',\n 400,\n 'MISSING_JOB_ID'\n );\n }\n\n return client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/jobs/${params.job_id}`,\n 'GET'\n );\n };\n }\n\n // Standard integration method handling with auto-polling for async methods\n return async function(params?: Record<string, any>, asyncOptions?: AsyncOptions) {\n await client.ensureInitialized();\n\n // Special handling for InvokeLLM\n if (methodName === 'InvokeLLM') {\n // Map friendly model names to full model names\n if (params?.model) {\n params = { ...params, model: mapLLMModel(params.model) };\n }\n }\n\n const integrationPackage = client._integrations[packageName];\n if (!integrationPackage) {\n throw new OmnikitError(\n `Integration package '${packageName}' not found`,\n 404,\n 'INTEGRATION_NOT_FOUND'\n );\n }\n\n const method = integrationPackage[methodName];\n if (!method) {\n throw new OmnikitError(\n `Integration method '${methodName}' not found in package '${packageName}'`,\n 404,\n 'INTEGRATION_METHOD_NOT_FOUND'\n );\n }\n\n // Call with service token if needed\n const response = await method(params, useServiceToken);\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractData, GenerateVideo)\n if (response && response.async && response.job_id) {\n // If user wants to return immediately with job_id\n if (asyncOptions?.returnJobId) {\n return response as AsyncJobCreatedResponse;\n }\n\n // Otherwise, poll for completion automatically\n return client.pollJobUntilComplete(response.job_id, asyncOptions);\n }\n\n // Sync response - return as-is\n return response;\n };\n }\n return undefined;\n }\n }) as any;\n }\n return (target as any)[packageName];\n }\n });\n }\n\n /**\n * Ensure SDK is initialized (auto-initializes once on first call)\n */\n async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n // If initialization is in progress, wait for it\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // Start initialization\n this.initPromise = this.initialize();\n await this.initPromise;\n this.initPromise = null;\n }\n\n /**\n * Initialize SDK by fetching app schema (for collections and metadata)\n * Services use static mappings - no schema fetch needed\n * This happens automatically on first use - no need to call explicitly\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Fetch app schema only (services use static mappings, no fetch needed)\n const appSchema = await this.fetchAppSchema();\n\n // Update metadata cache with fresh data from server\n // This ensures appMetadata.name, logoUrl, and visibility are available\n if (appSchema.app) {\n this.updateMetadataCache({\n name: appSchema.app.name,\n logoUrl: appSchema.app.logo_url,\n thumbnailUrl: appSchema.app.thumbnail_url,\n visibility: appSchema.app.visibility,\n platformAuthProviders: (appSchema.app as any).platform_auth_providers,\n });\n }\n\n // Create collection classes\n if (appSchema.entities) {\n this.createCollections(appSchema.entities);\n }\n\n // Services use static mappings in createServicesProxy - no schema needed\n\n this.initialized = true;\n } catch (error) {\n console.error('Failed to initialize Omnikit SDK:', error);\n throw new OmnikitError(\n `SDK initialization failed: ${(error as Error).message}`,\n 500,\n 'INIT_FAILED',\n error\n );\n }\n }\n\n /**\n * Fetch app schema from backend\n */\n private async fetchAppSchema(): Promise<AppSchema> {\n const response = await fetch(`${this.baseUrl}/apps/${this.appId}`);\n if (!response.ok) {\n throw new Error(`Failed to fetch app schema: ${response.statusText}`);\n }\n return await response.json();\n }\n\n /**\n * Fetch integration schema from backend\n * Returns ServicesSchema (new flat format) or IntegrationSchema (legacy)\n */\n private async fetchIntegrationSchema(): Promise<ServicesSchema | IntegrationSchema | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/services`\n );\n if (!response.ok) {\n return null; // Integration schema is optional\n }\n return await response.json();\n } catch (error) {\n // Integration schema is optional, don't fail initialization\n return null;\n }\n }\n\n /**\n * Create collection classes from schema\n */\n private createCollections(collectionsData: CollectionDefinition[] | Record<string, CollectionDefinition>): void {\n // Handle both array and object formats\n const collections: Record<string, CollectionDefinition> = Array.isArray(collectionsData)\n ? collectionsData.reduce((acc, collection) => ({ ...acc, [collection.name]: collection }), {} as Record<string, CollectionDefinition>)\n : collectionsData;\n\n Object.entries(collections).forEach(([collectionName, collectionDef]) => {\n // Store collections with lowercase keys to match MongoDB collection names\n // This allows PascalCase imports (e.g., Todo) to work with lowercase MongoDB collections (e.g., todo)\n this._collections[collectionName.toLowerCase()] = this.createCollectionClass(collectionName, collectionDef);\n });\n }\n\n /**\n * Create a single collection class with all CRUD operations\n * Automatically enhances User collection with convenience methods\n */\n private createCollectionClass(collectionName: string, collectionDef: CollectionDefinition): CollectionClass {\n const client = this;\n const isUserCollection = collectionName.toLowerCase() === 'user';\n\n // Base collection class with standard CRUD operations\n const baseCollection: any = {\n // Get single record by ID\n async get(id: string): Promise<CollectionRecord> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'GET'\n );\n return response;\n },\n\n // List all records with MongoDB/Mongoose-style filtering\n async list(...args: any[]): Promise<CollectionRecord[]> {\n const queryParams = new URLSearchParams();\n\n // Detect signature: list(filter, options) vs list(options)\n let filter: Record<string, any> | undefined;\n let options: ListOptions | undefined;\n\n if (args.length === 0) {\n // No arguments: list all\n filter = undefined;\n options = undefined;\n } else if (args.length === 1) {\n // Single argument: check if it's old-style QueryOptions or new-style filter\n const arg = args[0];\n if (arg && (arg.q !== undefined || arg.sort !== undefined || arg.limit !== undefined || arg.offset !== undefined || arg._count !== undefined)) {\n // Old style: { q: {...}, sort: '...', limit: ... }\n // Pass through as-is for backward compatibility\n Object.entries(arg).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n });\n } else {\n // New style: treat as filter object\n filter = arg;\n options = undefined;\n }\n } else if (args.length === 2) {\n // Two arguments: list(filter, options) - MongoDB/Mongoose style\n [filter, options] = args;\n }\n\n // Process new-style MongoDB/Mongoose parameters\n if (filter !== undefined || options !== undefined) {\n // Add filter as 'q' parameter\n if (filter && Object.keys(filter).length > 0) {\n queryParams.append('q', JSON.stringify(filter));\n }\n\n // Process options\n if (options) {\n // Handle sort (convert object to string if needed)\n if (options.sort !== undefined) {\n let sortString: string;\n if (typeof options.sort === 'object') {\n // Convert { field: -1 } to '-field' or { field: 1 } to 'field'\n const sortField = Object.keys(options.sort)[0];\n const sortOrder = options.sort[sortField];\n sortString = sortOrder === -1 ? `-${sortField}` : sortField;\n } else {\n // Already a string\n sortString = options.sort;\n }\n queryParams.append('sort', sortString);\n }\n\n // Handle limit and offset\n if (options.limit !== undefined) {\n queryParams.append('limit', String(options.limit));\n }\n if (options.offset !== undefined) {\n queryParams.append('offset', String(options.offset));\n }\n }\n }\n\n const url = queryParams.toString()\n ? `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?${queryParams}`\n : `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}`;\n\n const response = await client.makeRequest(url, 'GET');\n return makeArrayForgiving(Array.isArray(response) ? response : []);\n },\n\n // Filter records by query (alias for list)\n async filter(...args: any[]): Promise<CollectionRecord[]> {\n return this.list(...args);\n },\n\n // Find single record matching query\n async findOne(...args: any[]): Promise<CollectionRecord | null> {\n // Support both MongoDB style and old style\n if (args.length === 0) {\n const results = await this.list({}, { limit: 1 });\n return results[0] || null;\n } else if (args.length === 1) {\n const arg = args[0];\n // Check if old style QueryOptions or new style filter\n if (arg && (arg.q !== undefined || arg._count !== undefined)) {\n // Old style\n const results = await this.list({ ...arg, limit: 1 });\n return results[0] || null;\n } else {\n // New style: treat as filter\n const results = await this.list(arg, { limit: 1 });\n return results[0] || null;\n }\n } else {\n // Two arguments: findOne(filter, options)\n const [filter, options] = args;\n const results = await this.list(filter, { ...options, limit: 1 });\n return results[0] || null;\n }\n },\n\n // Create new record\n async create(data: Partial<CollectionRecord>): Promise<CollectionRecord> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}`,\n 'POST',\n data\n );\n return response;\n },\n\n // Update existing record (overridden for User collection)\n async update(...args: any[]): Promise<CollectionRecord> {\n if (isUserCollection) {\n // Smart update for User collection\n if (args.length === 1) {\n // Single argument: update current user via auth.updateMe()\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n args[0]\n );\n return response;\n } else if (args.length === 2) {\n // Two arguments: update specific user by ID\n const [id, data] = args;\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'PATCH',\n data\n );\n return response;\n } else {\n throw new OmnikitError(\n 'User.update() expects 1 argument (current user data) or 2 arguments (id, data)',\n 400,\n 'INVALID_ARGUMENTS'\n );\n }\n } else {\n // Standard update for other collections\n const [id, data] = args;\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'PATCH',\n data\n );\n return response;\n }\n },\n\n // Delete record by ID\n async delete(id: string): Promise<boolean> {\n await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/${id}`,\n 'DELETE'\n );\n return true;\n },\n\n // Count records matching query\n async count(...args: any[]): Promise<number> {\n const queryParams = new URLSearchParams();\n\n // Support both MongoDB style and old style\n if (args.length === 0) {\n // No filter\n queryParams.append('_count', 'true');\n } else if (args.length === 1) {\n const arg = args[0];\n // Check if old style QueryOptions or new style filter\n if (arg && (arg.q !== undefined || arg.sort !== undefined)) {\n // Old style: pass through as-is\n Object.entries(arg).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n });\n } else {\n // New style: treat as filter\n if (arg && Object.keys(arg).length > 0) {\n queryParams.append('q', JSON.stringify(arg));\n }\n }\n queryParams.append('_count', 'true');\n } else if (args.length === 2) {\n // Two arguments: count(filter, options) - but we only use filter for count\n const [filter] = args;\n if (filter && Object.keys(filter).length > 0) {\n queryParams.append('q', JSON.stringify(filter));\n }\n queryParams.append('_count', 'true');\n }\n\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?${queryParams}`,\n 'GET'\n );\n\n return response.total || response.count || 0;\n },\n\n // Bulk create multiple records\n async bulkCreate(items: Partial<CollectionRecord>[]): Promise<BulkResult> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/bulk`,\n 'POST',\n { items }\n );\n return response;\n },\n\n // Bulk delete multiple records by ID\n async bulkDelete(ids: string[]): Promise<BulkResult> {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/bulk-delete`,\n 'POST',\n ids\n );\n return response;\n },\n\n // Import records from CSV or JSON file\n async import(file: File, format: 'csv' | 'json'): Promise<ImportResult> {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('format', format);\n\n const response = await client.makeRequestWithFormData(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}/import`,\n formData\n );\n return response;\n },\n\n // Delete all records (requires explicit confirmation)\n async deleteAll(confirm: boolean): Promise<BulkResult> {\n if (!confirm) {\n throw new OmnikitError(\n 'deleteAll requires explicit confirmation. Pass true to confirm.',\n 400,\n 'CONFIRMATION_REQUIRED'\n );\n }\n\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/${collectionName}?confirm=true`,\n 'DELETE'\n );\n return response;\n },\n\n // Backward compatibility: findById → get\n async findById(id: string): Promise<CollectionRecord> {\n console.warn('findById() is deprecated. Use get() instead.');\n return this.get(id);\n }\n };\n\n // Add User-specific convenience methods\n if (isUserCollection) {\n baseCollection.me = async (): Promise<CollectionRecord> => {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'GET'\n );\n return response;\n };\n\n baseCollection.updateMe = async (data: Partial<CollectionRecord>): Promise<CollectionRecord> => {\n const response = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/collections/user/me`,\n 'PUT',\n data\n );\n return response;\n };\n }\n\n return baseCollection as CollectionClass;\n }\n\n /**\n * Create services from new flat schema (recommended)\n * Services are exposed as omnikit.services.ServiceName\n */\n private createServicesFromSchema(schema: ServicesSchema): void {\n // Create flat services (new structure)\n schema.services.forEach((service: ServiceDefinition) => {\n // Service name comes directly from backend (e.g., \"SendEmail\", \"InvokeLLM\")\n this._services[service.name] = this.createServiceMethod(service);\n });\n\n // Also populate legacy _integrations.BuiltIn for backward compatibility\n this._integrations['BuiltIn'] = {};\n schema.services.forEach((service: ServiceDefinition) => {\n this._integrations['BuiltIn'][service.name] = this._services[service.name];\n });\n }\n\n /**\n * Create a service method from ServiceDefinition\n */\n private createServiceMethod(service: ServiceDefinition): IntegrationMethod {\n const client = this;\n const { path, method = 'POST', path_params } = service;\n\n return async (params?: Record<string, any>, useServiceToken?: boolean): Promise<any> => {\n // BULLETPROOF FIX: If params is a File directly (e.g., UploadFile(file) instead of UploadFile({ file })),\n // automatically wrap it in the correct format\n let normalizedParams = params;\n if (params instanceof File) {\n console.warn('[Omnikit SDK] UploadFile called with File directly. Auto-wrapping to { file }. Please use UploadFile({ file }) for best practice.');\n normalizedParams = { file: params };\n }\n\n // Build URL with path parameter substitution\n let finalPath = path;\n const remainingParams = { ...normalizedParams };\n\n // Substitute path parameters (e.g., {operation_name})\n if (path_params && path_params.length > 0 && normalizedParams) {\n path_params.forEach((paramName: string) => {\n if (normalizedParams[paramName] !== undefined) {\n finalPath = finalPath.replace(`{${paramName}}`, String(normalizedParams[paramName]));\n delete remainingParams[paramName]; // Remove from body/query params\n }\n });\n }\n\n const fullUrl = `${client.baseUrl}/apps/${client.appId}${finalPath}`;\n\n // Handle file uploads using presigned URL flow (zero backend load)\n if (remainingParams && remainingParams.file instanceof File) {\n return client.handleFileUpload(remainingParams.file, path, useServiceToken);\n }\n\n // Make the request\n const response = await client.makeRequest(\n fullUrl,\n method,\n method === 'GET' ? undefined : remainingParams,\n {\n useServiceToken,\n queryParams: method === 'GET' ? remainingParams : undefined\n }\n );\n\n // Apply normalization\n return client.normalizeIntegrationResponse(response, path);\n };\n }\n\n /**\n * Handle file upload via presigned URL flow\n * Supports both public and private file uploads based on path\n */\n private async handleFileUpload(file: File, path: string, useServiceToken?: boolean): Promise<any> {\n const isPrivate = path.includes('/files/private');\n const initEndpoint = isPrivate ? '/services/files/private/init' : '/services/files/init';\n const completeEndpoint = isPrivate ? '/services/files/private/complete' : '/services/files/complete';\n\n // Step 1: Get presigned URL from backend\n const initResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}${initEndpoint}`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url } = initResponse;\n\n // Step 2: Upload file directly to R2 (bypasses backend entirely)\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion\n const completeResponse = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}${completeEndpoint}/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // For private files, don't normalize (return file_uri as-is)\n // For public files, apply URL normalization\n if (isPrivate) {\n return completeResponse;\n }\n return this.normalizeIntegrationResponse(completeResponse, path);\n }\n\n /**\n * @deprecated Use createServicesFromSchema instead\n * Create integration methods from legacy backend schema\n */\n private createIntegrationsFromSchema(schema: IntegrationSchema): void {\n schema.installed_packages.forEach((pkg: IntegrationPackage) => {\n const packageName = pkg.package_name;\n this._integrations[packageName] = {};\n\n pkg.endpoints.forEach((endpoint) => {\n const methodName = this.formatMethodName(endpoint.name);\n // Pass the full endpoint object (not just path) to support method types and path params\n this._integrations[packageName][methodName] = this.createIntegrationMethod(endpoint);\n // Also add to _services for new access pattern\n this._services[methodName] = this._integrations[packageName][methodName];\n });\n });\n }\n\n /**\n * @deprecated Backend now returns final method names\n * Format endpoint name to PascalCase method name (legacy)\n */\n private formatMethodName(name: string): string {\n // Convert names like \"email\" → \"SendEmail\", \"llm\" → \"InvokeLLM\"\n const methodMap: Record<string, string> = {\n 'email': 'SendEmail',\n 'llm': 'InvokeLLM',\n 'files': 'UploadFile',\n 'files/private': 'UploadPrivateFile',\n 'files/signed-url': 'CreateFileSignedUrl',\n 'images': 'GenerateImage',\n 'speech': 'GenerateSpeech',\n 'video': 'GenerateVideo',\n 'video_status': 'CheckVideoStatus',\n 'extract-text': 'ExtractData',\n 'extract-text_status': 'CheckExtractStatus',\n 'sms': 'SendSMS'\n };\n\n return methodMap[name] || name.charAt(0).toUpperCase() + name.slice(1);\n }\n\n /**\n * Create integration method that calls backend endpoint\n */\n private createIntegrationMethod(endpoint: IntegrationEndpoint): IntegrationMethod {\n const client = this;\n const { path, method = 'POST', path_params = [] } = endpoint;\n\n return async (params?: Record<string, any>, useServiceToken?: boolean): Promise<any> => {\n // BULLETPROOF FIX: If params is a File directly (e.g., UploadFile(file) instead of UploadFile({ file })),\n // automatically wrap it in the correct format\n let normalizedParams = params;\n if (params instanceof File) {\n console.warn('[Omnikit SDK] UploadFile called with File directly. Auto-wrapping to { file }. Please use UploadFile({ file }) for best practice.');\n normalizedParams = { file: params };\n }\n\n // Build URL with path parameter substitution\n let finalPath = path;\n const remainingParams = { ...normalizedParams };\n\n // Substitute path parameters (e.g., {operation_name})\n if (path_params && path_params.length > 0 && normalizedParams) {\n path_params.forEach((paramName: string) => {\n if (normalizedParams[paramName] !== undefined) {\n finalPath = finalPath.replace(`{${paramName}}`, String(normalizedParams[paramName]));\n delete remainingParams[paramName]; // Remove from body/query params\n }\n });\n }\n\n const fullUrl = `${client.baseUrl}/apps/${client.appId}${finalPath}`;\n\n // Handle PRIVATE file uploads (returns file_uri, not file_url)\n if (path.includes('/services/files/private') && remainingParams && remainingParams.file instanceof File) {\n const file = remainingParams.file as File;\n\n try {\n // Step 1: Get presigned URL from backend (private endpoint)\n const initResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/private/init`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url, file_uri } = initResponse;\n\n // Step 2: Upload file directly to R2\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload private file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion (private endpoint)\n const completeResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/private/complete/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // Return response with file_uri (no URL normalization for private files)\n return completeResponse;\n\n } catch (error) {\n if (error instanceof OmnikitError) {\n throw error;\n }\n throw new OmnikitError(\n `Private file upload failed: ${(error as Error).message}`,\n 500,\n 'UPLOAD_ERROR',\n error\n );\n }\n }\n\n // Handle PUBLIC file uploads using presigned URL flow (zero backend load)\n if (remainingParams && remainingParams.file instanceof File) {\n const file = remainingParams.file as File;\n\n try {\n // Step 1: Get presigned URL from backend\n const initResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/init`,\n 'POST',\n {\n filename: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size\n },\n { useServiceToken }\n );\n\n const { file_id, upload_url, public_url } = initResponse;\n\n // Step 2: Upload file directly to R2 (bypasses backend entirely)\n const uploadResponse = await fetch(upload_url, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type || 'application/octet-stream'\n }\n });\n\n if (!uploadResponse.ok) {\n throw new OmnikitError(\n `Failed to upload file to storage: ${uploadResponse.statusText}`,\n uploadResponse.status,\n 'UPLOAD_FAILED'\n );\n }\n\n // Step 3: Confirm upload completion\n const completeResponse = await client.makeRequest(\n `${client.baseUrl}/apps/${client.appId}/services/files/complete/${file_id}`,\n 'POST',\n null,\n { useServiceToken }\n );\n\n // Apply normalization to file upload responses\n return client.normalizeIntegrationResponse(completeResponse, path);\n\n } catch (error) {\n // If it's already an OmnikitError, rethrow\n if (error instanceof OmnikitError) {\n throw error;\n }\n // Wrap other errors\n throw new OmnikitError(\n `File upload failed: ${(error as Error).message}`,\n 500,\n 'UPLOAD_ERROR',\n error\n );\n }\n }\n\n // For GET requests, don't send body (params will be ignored or should be in URL)\n // For POST/PUT/PATCH, send params as JSON body\n const response = await client.makeRequest(\n fullUrl,\n method,\n method === 'GET' ? null : remainingParams,\n { useServiceToken }\n );\n\n // BULLETPROOF FIX: Normalize response to add common aliases\n // This prevents runtime errors when AI generates code like response.content instead of response.result\n return client.normalizeIntegrationResponse(response, path);\n };\n }\n\n /**\n * Normalize integration response to add common aliases for bulletproof access\n * Prevents runtime errors from AI-generated code using wrong property names\n */\n private normalizeIntegrationResponse(response: any, path: string): any {\n if (!response || typeof response !== 'object') {\n return response;\n }\n\n // Create a new object with the response data\n const normalized = { ...response };\n\n // LLM response: add .content as alias for .result\n if (path.includes('/services/llm') && 'result' in normalized && !('content' in normalized)) {\n Object.defineProperty(normalized, 'content', {\n get() { return this.result; },\n enumerable: false // Don't show in JSON.stringify or Object.keys\n });\n }\n\n // UploadFile response: add .url as alias for .file_url\n if (path.includes('/services/files') && 'file_url' in normalized && !('url' in normalized)) {\n Object.defineProperty(normalized, 'url', {\n get() { return this.file_url; },\n enumerable: false\n });\n }\n\n // GenerateSpeech response: add .audio_url as alias for .url\n if (path.includes('/services/speech') && 'url' in normalized && !('audio_url' in normalized)) {\n Object.defineProperty(normalized, 'audio_url', {\n get() { return this.url; },\n enumerable: false\n });\n }\n\n // ExtractData response: add .text as shortcut for first result's text\n if (path.includes('/services/extract') && 'results' in normalized && Array.isArray(normalized.results)) {\n if (!('text' in normalized)) {\n Object.defineProperty(normalized, 'text', {\n get() {\n const firstSuccess = this.results?.find((r: any) => r.success);\n return firstSuccess?.text || '';\n },\n enumerable: false\n });\n }\n }\n\n return normalized;\n }\n\n /**\n * HTTP request helper with JSON\n */\n async makeRequest(\n url: string,\n method: string = 'GET',\n data: any = null,\n options?: RequestOptions\n ): Promise<any> {\n // Build URL with query params for GET requests\n let finalUrl = url;\n if (options?.queryParams && Object.keys(options.queryParams).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(options.queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n finalUrl = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`;\n }\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n // Removed credentials: 'include' to prevent sending cookies (switching to pure Bearer token)\n };\n\n // Add user auth token (always send user token in Authorization)\n const userToken = this.getAuthToken();\n if (userToken) {\n (fetchOptions.headers as Record<string, string>).Authorization = `Bearer ${userToken}`;\n }\n\n // Add service token if available (send in X-Service-Token header)\n if (this._serviceToken) {\n (fetchOptions.headers as Record<string, string>)['X-Service-Token'] = this._serviceToken;\n }\n\n // Add API key if available (for backend function auth)\n if (this._apiKey) {\n (fetchOptions.headers as Record<string, string>)['X-API-Key'] = this._apiKey;\n }\n\n // Add additional headers\n if (options?.headers) {\n Object.assign(fetchOptions.headers as Record<string, string>, options.headers);\n }\n\n // Add body for POST/PUT/PATCH requests\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n fetchOptions.body = JSON.stringify(data);\n }\n\n const response = await fetch(finalUrl, fetchOptions);\n\n // Handle 401 Unauthorized - Clear token and throw\n if (response.status === 401) {\n this.clearAuthToken();\n throw new OmnikitError(\n 'Authentication required or token expired',\n 401,\n 'UNAUTHORIZED'\n );\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || error.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n error.code || 'HTTP_ERROR',\n error\n );\n }\n\n // Handle empty responses\n if (response.status === 204 || method === 'DELETE') {\n return null;\n }\n\n return await response.json();\n }\n\n /**\n * HTTP request helper with FormData (for file uploads)\n */\n private async makeRequestWithFormData(\n url: string,\n formData: FormData,\n useServiceToken?: boolean\n ): Promise<any> {\n const fetchOptions: RequestInit = {\n method: 'POST',\n body: formData,\n headers: {} as Record<string, string>,\n // Removed credentials: 'include'\n };\n\n // Add user auth token (always send user token in Authorization)\n const userToken = this.getAuthToken();\n if (userToken) {\n (fetchOptions.headers as Record<string, string>).Authorization = `Bearer ${userToken}`;\n }\n\n // Add service token if available (send in X-Service-Token header)\n if (this._serviceToken) {\n (fetchOptions.headers as Record<string, string>)['X-Service-Token'] = this._serviceToken;\n }\n\n // Add API key if available (for backend function auth)\n if (this._apiKey) {\n (fetchOptions.headers as Record<string, string>)['X-API-Key'] = this._apiKey;\n }\n\n // Don't set Content-Type for FormData - browser will set it with boundary\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || error.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n error.code || 'HTTP_ERROR',\n error\n );\n }\n\n return await response.json();\n }\n\n /**\n * Get app metadata (for internal use)\n */\n async getAppMetadata(): Promise<AppSchema> {\n const response = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}`,\n 'GET'\n );\n\n // Update metadata cache with fresh data from server\n if (response?.app || response?.name) {\n const app = response.app || response;\n this.updateMetadataCache({\n name: app.name,\n logoUrl: app.logo_url,\n thumbnailUrl: app.thumbnail_url,\n });\n }\n\n return response;\n }\n\n /**\n * Set auth token\n */\n setAuthToken(token: string): void {\n this.userToken = token;\n saveAccessToken(token);\n }\n\n /**\n * Get current auth token\n */\n getAuthToken(): string | null {\n return this.userToken;\n }\n\n /**\n * Clear auth token\n */\n clearAuthToken(): void {\n this.userToken = null;\n clearStoredToken();\n }\n\n /**\n * Create a live voice session for real-time voice conversation with AI.\n *\n * The session manages WebSocket communication, microphone capture, and audio playback.\n *\n * @example\n * ```typescript\n * const session = omnikit.createLiveVoiceSession({\n * systemInstruction: 'You are a helpful assistant.',\n * voice: 'Puck',\n * onTranscript: (text, role) => console.log(`${role}: ${text}`),\n * onStatusChange: (status) => console.log(`Status: ${status}`),\n * onError: (error) => console.error(error),\n * });\n *\n * await session.start();\n * // ... user speaks, AI responds ...\n * await session.stop();\n * ```\n *\n * @param config - Optional configuration for the voice session\n * @returns A LiveVoiceSession object to control the session\n */\n createLiveVoiceSession(config?: LiveVoiceConfig): LiveVoiceSession {\n return new LiveVoiceSessionImpl(\n this.baseUrl,\n this.appId,\n this.getAuthToken(),\n config\n );\n }\n\n /**\n * Invoke a backend function by name.\n *\n * Backend functions are deployed to Supabase Edge Functions and can be invoked\n * from the frontend using this method.\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const result = await omnikit.invokeFunction('processPayment', {\n * amount: 100,\n * userId: 'abc123'\n * });\n * console.log(result.transactionId); // Direct access to function response\n * ```\n *\n * @param functionName - Name of the function to invoke (matches filename without .js)\n * @param body - Optional request body to send to the function\n * @returns Response data from the function (unwrapped)\n * @throws Error if the function invocation fails\n */\n async invokeFunction(functionName: string, body?: Record<string, any>): Promise<any> {\n await this.ensureInitialized();\n\n const response = await this.makeRequest(\n `${this.baseUrl}/apps/${this.appId}/functions/invoke/${functionName}`,\n 'POST',\n { body }\n );\n\n // Unwrap the response - return the function's actual response data\n // The backend wraps responses in { success, status_code, data, error, execution_time_ms }\n if (response && typeof response === 'object') {\n if (response.success === false && response.error) {\n throw new Error(response.error);\n }\n // Return the actual function response data\n if ('data' in response) {\n return response.data;\n }\n }\n\n return response;\n }\n\n /**\n * Get a secret value at runtime (for backend functions).\n *\n * This method securely fetches secrets from the Omnikit API using the app's API key.\n * Use this in Supabase Edge Functions instead of storing secrets in Supabase's\n * environment variables to ensure proper isolation between apps.\n *\n * @example\n * ```typescript\n * // In a backend function (Deno Edge Function)\n * const omnikit = createClient({\n * appId: __OMNIKIT_APP_ID__,\n * serverUrl: __OMNIKIT_API_URL__,\n * apiKey: __OMNIKIT_API_KEY__,\n * });\n *\n * const stripeKey = await omnikit.getSecret('STRIPE_SECRET_KEY');\n * const stripe = new Stripe(stripeKey);\n * ```\n *\n * @param secretName - Name of the secret to retrieve\n * @returns The decrypted secret value\n * @throws Error if the secret is not found or API key is invalid\n */\n async getSecret(secretName: string): Promise<string> {\n if (!this._apiKey) {\n throw new OmnikitError(\n 'API key is required to fetch secrets. Provide apiKey in config.',\n 403,\n 'API_KEY_REQUIRED'\n );\n }\n\n const response = await fetch(\n `${this.baseUrl}/apps/${this.appId}/secrets/${secretName}/value`,\n {\n method: 'GET',\n headers: {\n 'X-API-Key': this._apiKey,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new OmnikitError(\n error.detail || `Failed to fetch secret: ${response.statusText}`,\n response.status,\n 'SECRET_FETCH_FAILED'\n );\n }\n\n const data = await response.json();\n return data.value;\n }\n}\n\n/**\n * Factory function to create an Omnikit client\n *\n * @example\n * ```typescript\n * import { createClient } from '@omnikit/sdk';\n *\n * const omnikit = createClient({\n * appId: 'your-app-id',\n * // token auto-detected from URL or localStorage\n * });\n *\n * // Ready to use immediately - no initialize() needed!\n * const users = await omnikit.collections.User.list();\n * ```\n */\nexport function createClient(config: OmnikitConfig): OmnikitClient {\n return new APIClient(config) as OmnikitClient;\n}\n"]}