@omnikit-ai/sdk 2.0.10 → 2.2.0

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 2.5 models\n 'gemini-2.5-flash-lite': 'vertex_ai/gemini-2.5-flash-lite',\n 'gemini-2.5-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-2.5-pro': 'vertex_ai/gemini-2.5-pro',\n // Gemini 3 models\n 'gemini-3-flash': 'vertex_ai/gemini-3-flash-preview',\n 'gemini-3-pro': 'vertex_ai/gemini-3-pro-preview',\n // Legacy aliases (for backward compatibility)\n 'gemini-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-pro': 'vertex_ai/gemini-2.5-pro',\n 'gemini-pro-3': 'vertex_ai/gemini-3-pro-preview',\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 // Initialize built-in services synchronously (no backend fetch needed)\n // This ensures services like UploadFile, SendEmail, etc. are always available\n this.initializeBuiltInServices();\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 this.ensureInitialized().catch(err => {\n console.warn('[Omnikit SDK] Background initialization failed:', err);\n });\n }\n\n /**\n * Initialize built-in services with their definitions\n * These services don't require backend schema - they're defined in the SDK\n */\n private initializeBuiltInServices(): void {\n const builtInServices: ServiceDefinition[] = [\n {\n name: 'SendEmail',\n path: '/services/email',\n description: 'Send an email',\n method: 'POST',\n params: { to: 'string', subject: 'string', body: 'string' }\n },\n {\n name: 'InvokeLLM',\n path: '/services/llm',\n description: 'Invoke a language model',\n method: 'POST',\n params: { messages: 'array', model: 'string' }\n },\n {\n name: 'GenerateImage',\n path: '/services/images',\n description: 'Generate an image from a prompt',\n method: 'POST',\n async: true,\n params: { prompt: 'string' }\n },\n {\n name: 'GenerateSpeech',\n path: '/services/speech',\n description: 'Generate speech from text',\n method: 'POST',\n async: true,\n params: { text: 'string' }\n },\n {\n name: 'GenerateVideo',\n path: '/services/video',\n description: 'Generate a video from a prompt',\n method: 'POST',\n async: true,\n params: { prompt: 'string' }\n },\n {\n name: 'ExtractData',\n path: '/services/extract-text',\n description: 'Extract structured data from text or files',\n method: 'POST',\n async: true,\n params: { file_url: 'string' }\n },\n {\n name: 'SendSMS',\n path: '/services/sms',\n description: 'Send an SMS message',\n method: 'POST',\n params: { to: 'string', body: 'string' }\n },\n {\n name: 'UploadFile',\n path: '/services/files',\n description: 'Upload a file (public)',\n method: 'POST',\n params: { file: 'File' }\n },\n {\n name: 'UploadPrivateFile',\n path: '/services/files/private',\n description: 'Upload a private file',\n method: 'POST',\n params: { file: 'File' }\n },\n {\n name: 'CreateFileSignedUrl',\n path: '/services/files/signed-url',\n description: 'Create a signed URL for a private file',\n method: 'POST',\n params: { file_uri: 'string' }\n }\n ];\n\n // Create service methods from definitions\n builtInServices.forEach(service => {\n this._services[service.name] = this.createServiceMethod(service);\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 collections.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 * Helper method to access a collection by name.\n * Provides a more intuitive API: omnikit.collection('user').list()\n * This is an alternative to: omnikit.collections.user.list()\n *\n * @param name - Collection name (case-insensitive, supports PascalCase, camelCase, snake_case)\n * @returns CollectionClass with CRUD methods\n *\n * @example\n * ```typescript\n * // All of these work:\n * await omnikit.collection('user').list()\n * await omnikit.collection('User').list()\n * await omnikit.collection('chatbot').list()\n * await omnikit.collection('Chatbot').list()\n * ```\n */\n collection(name: string): CollectionClass {\n return this.collections[name];\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\n if (typeof window !== 'undefined') {\n // For public apps: use login modal if available (shows overlay instead of redirect)\n // The modal is registered by LoginModalProvider in main.jsx\n if (window.__omnikit_openLoginModal) {\n window.__omnikit_openLoginModal(fullReturnUrl);\n return;\n }\n\n // Fallback: redirect to login page (for non-public apps or if modal not available)\n const encodedReturnUrl = encodeURIComponent(fullReturnUrl);\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 /**\n * Normalize service name to PascalCase for backend lookup.\n * Supports both camelCase (sendEmail) and PascalCase (SendEmail).\n */\n function normalizeServiceName(name: string): string {\n if (!name) return name;\n // Convert first character to uppercase (camelCase → PascalCase)\n return name.charAt(0).toUpperCase() + name.slice(1);\n }\n\n return new Proxy({}, {\n get(target, serviceName: string) {\n if (typeof serviceName === 'string' && !serviceName.startsWith('_')) {\n // Normalize to PascalCase for backend lookup (supports sendEmail → SendEmail)\n const normalizedName = normalizeServiceName(serviceName);\n\n // Special handling for CheckJobStatus\n if (normalizedName === '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 (normalizedName === '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 (normalizedName === '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 (use normalized name)\n const method = client._services[normalizedName];\n if (method) {\n // Call with service token if needed\n response = await method(params, useServiceToken);\n } else {\n // Fallback for unknown services (should rarely be reached)\n // Built-in services are initialized in constructor via initializeBuiltInServices()\n // This fallback exists for custom services or edge cases\n throw new OmnikitError(\n `Service '${serviceName}' not found. Known services: SendEmail, InvokeLLM, GenerateImage, GenerateSpeech, GenerateVideo, ExtractData, SendSMS, UploadFile, UploadPrivateFile, CreateFileSignedUrl (camelCase also supported)`,\n 404,\n 'SERVICE_NOT_FOUND'\n );\n }\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractData, 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 * 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/connectors.ts","../src/client.ts","../src/analytics.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 - Connectors Module\n *\n * Provides access to connected external services (Slack, Google Calendar, Notion, etc.)\n * Like Base44's connectors module - allows backend functions to get access tokens\n * for making direct API calls to external services.\n *\n * SECURITY: getAccessToken requires service token authentication.\n * Only available to backend functions, not frontend code.\n */\n\nexport type ConnectorType = 'slack' | 'google_calendar' | 'notion' | 'salesforce';\n\nexport interface ConnectorAccessTokenResponse {\n success: boolean;\n access_token: string;\n connector_type: string;\n external_workspace_id?: string;\n external_workspace_name?: string;\n}\n\nexport interface ConnectorStatusResponse {\n success: boolean;\n connector?: {\n connector_type: string;\n status: string;\n external_workspace_id?: string;\n external_workspace_name?: string;\n external_user_email?: string;\n };\n}\n\nexport interface ConnectorsModule {\n /**\n * Get access token for a connector.\n *\n * SECURITY: Requires service token authentication.\n * Only available in backend functions, not frontend code.\n *\n * @example\n * ```typescript\n * // In a backend function\n * const { access_token } = await omnikit.connectors.getAccessToken('slack');\n *\n * // Make direct Slack API call\n * const response = await fetch('https://slack.com/api/chat.postMessage', {\n * method: 'POST',\n * headers: {\n * 'Authorization': `Bearer ${access_token}`,\n * 'Content-Type': 'application/json',\n * },\n * body: JSON.stringify({\n * channel: '#general',\n * text: 'Hello from Omnikit!'\n * })\n * });\n * ```\n */\n getAccessToken(connectorType: ConnectorType): Promise<ConnectorAccessTokenResponse>;\n\n /**\n * Check if a connector is connected.\n */\n isConnected(connectorType: ConnectorType): Promise<boolean>;\n\n /**\n * Get connector status and info.\n */\n getStatus(connectorType: ConnectorType): Promise<ConnectorStatusResponse>;\n}\n\n/**\n * Create connectors module for the SDK client.\n *\n * @internal\n */\nexport function createConnectorsModule(\n makeRequest: (url: string, method: string, data?: any, options?: any) => Promise<any>,\n appId: string,\n baseUrl: string,\n getServiceToken: () => string | null\n): ConnectorsModule {\n return {\n async getAccessToken(connectorType: ConnectorType): Promise<ConnectorAccessTokenResponse> {\n const serviceToken = getServiceToken();\n if (!serviceToken) {\n throw new Error(\n 'Service token is required to get connector access token. ' +\n 'This method is only available in backend functions. ' +\n 'Make sure you created the client with a serviceToken.'\n );\n }\n\n return makeRequest(\n `${baseUrl}/apps/${appId}/connectors/${connectorType}/access-token`,\n 'GET',\n null,\n { useServiceToken: true }\n );\n },\n\n async isConnected(connectorType: ConnectorType): Promise<boolean> {\n try {\n const response = await makeRequest(\n `${baseUrl}/apps/${appId}/connectors/${connectorType}`,\n 'GET'\n );\n return response?.connector?.status === 'connected';\n } catch {\n return false;\n }\n },\n\n async getStatus(connectorType: ConnectorType): Promise<ConnectorStatusResponse> {\n try {\n const response = await makeRequest(\n `${baseUrl}/apps/${appId}/connectors/${connectorType}`,\n 'GET'\n );\n return {\n success: true,\n connector: response?.connector,\n };\n } catch (error) {\n return {\n success: false,\n };\n }\n },\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 { createConnectorsModule, type ConnectorsModule } from './connectors';\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 2.5 models\n 'gemini-2.5-flash-lite': 'vertex_ai/gemini-2.5-flash-lite',\n 'gemini-2.5-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-2.5-pro': 'vertex_ai/gemini-2.5-pro',\n // Gemini 3 models\n 'gemini-3-flash': 'vertex_ai/gemini-3-flash-preview',\n 'gemini-3-pro': 'vertex_ai/gemini-3-pro-preview',\n // Legacy aliases (for backward compatibility)\n 'gemini-flash': 'vertex_ai/gemini-2.5-flash',\n 'gemini-pro': 'vertex_ai/gemini-2.5-pro',\n 'gemini-pro-3': 'vertex_ai/gemini-3-pro-preview',\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 private _connectors?: ConnectorsModule;\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 // Initialize built-in services synchronously (no backend fetch needed)\n // This ensures services like UploadFile, SendEmail, etc. are always available\n this.initializeBuiltInServices();\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 this.ensureInitialized().catch(err => {\n console.warn('[Omnikit SDK] Background initialization failed:', err);\n });\n }\n\n /**\n * Initialize built-in services with their definitions\n * These services don't require backend schema - they're defined in the SDK\n */\n private initializeBuiltInServices(): void {\n const builtInServices: ServiceDefinition[] = [\n {\n name: 'SendEmail',\n path: '/services/email',\n description: 'Send an email',\n method: 'POST',\n params: { to: 'string', subject: 'string', body: 'string' }\n },\n {\n name: 'InvokeLLM',\n path: '/services/llm',\n description: 'Invoke a language model',\n method: 'POST',\n params: { messages: 'array', model: 'string' }\n },\n {\n name: 'GenerateImage',\n path: '/services/images',\n description: 'Generate an image from a prompt',\n method: 'POST',\n async: true,\n params: { prompt: 'string' }\n },\n {\n name: 'GenerateSpeech',\n path: '/services/speech',\n description: 'Generate speech from text',\n method: 'POST',\n async: true,\n params: { text: 'string' }\n },\n {\n name: 'GenerateVideo',\n path: '/services/video',\n description: 'Generate a video from a prompt',\n method: 'POST',\n async: true,\n params: { prompt: 'string' }\n },\n {\n name: 'ExtractData',\n path: '/services/extract-text',\n description: 'Extract structured data from text or files',\n method: 'POST',\n async: true,\n params: { file_url: 'string' }\n },\n {\n name: 'SendSMS',\n path: '/services/sms',\n description: 'Send an SMS message',\n method: 'POST',\n params: { to: 'string', body: 'string' }\n },\n {\n name: 'UploadFile',\n path: '/services/files',\n description: 'Upload a file (public)',\n method: 'POST',\n params: { file: 'File' }\n },\n {\n name: 'UploadPrivateFile',\n path: '/services/files/private',\n description: 'Upload a private file',\n method: 'POST',\n params: { file: 'File' }\n },\n {\n name: 'CreateFileSignedUrl',\n path: '/services/files/signed-url',\n description: 'Create a signed URL for a private file',\n method: 'POST',\n params: { file_uri: 'string' }\n }\n ];\n\n // Create service methods from definitions\n builtInServices.forEach(service => {\n this._services[service.name] = this.createServiceMethod(service);\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 collections.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 * Helper method to access a collection by name.\n * Provides a more intuitive API: omnikit.collection('user').list()\n * This is an alternative to: omnikit.collections.user.list()\n *\n * @param name - Collection name (case-insensitive, supports PascalCase, camelCase, snake_case)\n * @returns CollectionClass with CRUD methods\n *\n * @example\n * ```typescript\n * // All of these work:\n * await omnikit.collection('user').list()\n * await omnikit.collection('User').list()\n * await omnikit.collection('chatbot').list()\n * await omnikit.collection('Chatbot').list()\n * ```\n */\n collection(name: string): CollectionClass {\n return this.collections[name];\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 * Service-level operations (elevated privileges).\n * Only available when serviceToken is provided (e.g., via createServerClient).\n */\n get service(): ServiceRoleClient {\n if (!this._serviceToken) {\n throw new OmnikitError(\n 'Service token is required. Use createServerClient(req) in backend functions.',\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 connectors: this.connectors, // Connectors module (requires service token)\n // Note: auth not available in service role for security\n };\n\n return this._asServiceRole;\n }\n\n /**\n * @deprecated Use service instead\n */\n get asServiceRole(): ServiceRoleClient {\n return this.service;\n }\n\n /**\n * Lazy getter for connectors module\n * Like Base44's connectors - provides access to external service tokens\n *\n * SECURITY: getAccessToken requires service token authentication.\n * Only use in backend functions, not frontend code.\n *\n * @example\n * ```typescript\n * // In a backend function\n * const { access_token } = await omnikit.connectors.getAccessToken('slack');\n *\n * // Make direct Slack API call\n * const response = await fetch('https://slack.com/api/chat.postMessage', {\n * method: 'POST',\n * headers: { Authorization: `Bearer ${access_token}` },\n * body: JSON.stringify({ channel: '#general', text: 'Hello!' })\n * });\n * ```\n */\n get connectors(): ConnectorsModule {\n if (!this._connectors) {\n this._connectors = createConnectorsModule(\n this.makeRequest.bind(this),\n this.appId,\n this.baseUrl,\n () => this._serviceToken\n );\n }\n return this._connectors;\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\n if (typeof window !== 'undefined') {\n // For public apps: use login modal if available (shows overlay instead of redirect)\n // The modal is registered by LoginModalProvider in main.jsx\n if (window.__omnikit_openLoginModal) {\n window.__omnikit_openLoginModal(fullReturnUrl);\n return;\n }\n\n // Fallback: redirect to login page (for non-public apps or if modal not available)\n const encodedReturnUrl = encodeURIComponent(fullReturnUrl);\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 /**\n * Normalize service name to PascalCase for backend lookup.\n * Supports both camelCase (sendEmail) and PascalCase (SendEmail).\n */\n function normalizeServiceName(name: string): string {\n if (!name) return name;\n // Convert first character to uppercase (camelCase → PascalCase)\n return name.charAt(0).toUpperCase() + name.slice(1);\n }\n\n return new Proxy({}, {\n get(target, serviceName: string) {\n if (typeof serviceName === 'string' && !serviceName.startsWith('_')) {\n // Normalize to PascalCase for backend lookup (supports sendEmail → SendEmail)\n const normalizedName = normalizeServiceName(serviceName);\n\n // Special handling for CheckJobStatus\n if (normalizedName === '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 (normalizedName === '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 (normalizedName === '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 (use normalized name)\n const method = client._services[normalizedName];\n if (method) {\n // Call with service token if needed\n response = await method(params, useServiceToken);\n } else {\n // Fallback for unknown services (should rarely be reached)\n // Built-in services are initialized in constructor via initializeBuiltInServices()\n // This fallback exists for custom services or edge cases\n throw new OmnikitError(\n `Service '${serviceName}' not found. Known services: SendEmail, InvokeLLM, GenerateImage, GenerateSpeech, GenerateVideo, ExtractData, SendSMS, UploadFile, UploadPrivateFile, CreateFileSignedUrl (camelCase also supported)`,\n 404,\n 'SERVICE_NOT_FOUND'\n );\n }\n\n // Auto-poll for async job responses (GenerateImage, GenerateSpeech, ExtractData, 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 * 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\n/**\n * Request object interface for createServerClient.\n * Matches Deno/Node HTTP request interface.\n */\ninterface ServerRequest {\n headers: {\n get?(name: string): string | null;\n [key: string]: any;\n };\n}\n\n/**\n * Create an Omnikit client for server-side (backend function) use.\n *\n * Extracts authentication tokens from HTTP headers injected by the Omnikit platform:\n * - Authorization: Bearer <user_jwt> (identifies the user making the request)\n * - X-Omnikit-Service-Authorization: <service_token> (for privileged operations)\n * - X-Omnikit-App-Id: <app_id> (identifies the app)\n * - X-Omnikit-Server-Url: <server_url> (API server URL)\n *\n * SECURITY: The service token is injected at runtime by the platform,\n * ensuring it cannot be leaked through source code.\n *\n * @example\n * ```typescript\n * // In a backend function (Deno Edge Function)\n * import { createServerClient } from '@omnikit-ai/sdk';\n *\n * Deno.serve(async (req) => {\n * const omnikit = createServerClient(req);\n *\n * // Access user data (user JWT auth)\n * const currentUser = await omnikit.auth.me();\n *\n * // Access connectors (requires service token)\n * const { access_token } = await omnikit.service.connectors.getAccessToken('slack');\n *\n * // Make direct Slack API call\n * await fetch('https://slack.com/api/chat.postMessage', {\n * headers: { Authorization: `Bearer ${access_token}` },\n * body: JSON.stringify({ channel: '#general', text: `Hello from ${currentUser.email}!` })\n * });\n *\n * return new Response(JSON.stringify({ success: true }));\n * });\n * ```\n *\n * @param request - HTTP request object with headers\n * @returns Omnikit client configured with tokens from headers\n */\nexport function createServerClient(request: ServerRequest): OmnikitClient {\n // Extract headers - support both get() method (Deno/Fetch) and direct access (Node)\n const getHeader = (name: string): string | null => {\n if (typeof request.headers.get === 'function') {\n return request.headers.get(name);\n }\n // Fallback for plain object headers (Node.js, etc.)\n return request.headers[name] || request.headers[name.toLowerCase()] || null;\n };\n\n // Extract authentication tokens from headers\n const authHeader = getHeader('Authorization') || getHeader('authorization');\n const userToken = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;\n\n const serviceToken = getHeader('X-Omnikit-Service-Authorization') ||\n getHeader('x-omnikit-service-authorization');\n\n const appId = getHeader('X-Omnikit-App-Id') ||\n getHeader('x-omnikit-app-id');\n\n const serverUrl = getHeader('X-Omnikit-Server-Url') ||\n getHeader('x-omnikit-server-url') ||\n 'https://omnikit.ai/api';\n\n if (!appId) {\n throw new OmnikitError(\n 'X-Omnikit-App-Id header is required. This function should be invoked through the Omnikit platform.',\n 400,\n 'MISSING_APP_ID'\n );\n }\n\n // Create client with extracted tokens\n return createClient({\n appId,\n serverUrl,\n token: userToken || undefined,\n serviceToken: serviceToken || undefined,\n autoInitAuth: false, // Don't auto-detect from localStorage in backend\n });\n}\n\n/**\n * @deprecated Use createServerClient instead\n */\nexport const createClientFromRequest = createServerClient;\n","/**\n * Omnikit Analytics Module\n *\n * Provides automatic event tracking for generated apps.\n * Supports page views, errors, auth events, and custom events.\n *\n * @example\n * ```typescript\n * import { Analytics } from '@omnikit/sdk';\n *\n * const analytics = new Analytics({\n * appId: 'your-app-id',\n * apiUrl: 'https://api.omnikit.ai'\n * });\n *\n * // Log events\n * analytics.logPageView('/dashboard');\n * analytics.logEvent('button_click', { action: 'submit' });\n * ```\n */\n\nexport interface EventPayload {\n page_name?: string;\n action?: string;\n inputs?: Record<string, any>;\n metadata?: Record<string, any>;\n error_message?: string;\n error_stack?: string;\n}\n\nexport interface AnalyticsConfig {\n appId: string;\n apiUrl: string;\n sessionId?: string;\n userId?: string;\n enabled?: boolean;\n}\n\ninterface QueuedEvent {\n eventType: string;\n payload: EventPayload;\n timestamp: number;\n}\n\nconst STORAGE_KEY = 'omnikit_session';\nconst SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\nconst FLUSH_INTERVAL = 5000; // 5 seconds\nconst MAX_RETRIES = 3;\n\nexport class Analytics {\n private config: AnalyticsConfig;\n private sessionId: string;\n private userId?: string;\n private eventQueue: QueuedEvent[] = [];\n private flushTimer?: ReturnType<typeof setInterval>;\n private enabled: boolean;\n\n constructor(config: AnalyticsConfig) {\n this.config = config;\n this.enabled = config.enabled !== false;\n this.sessionId = config.sessionId || this.initSession();\n this.userId = config.userId;\n\n if (this.enabled && typeof window !== 'undefined') {\n // Start flush timer\n this.startFlushTimer();\n\n // Flush on page unload\n window.addEventListener('beforeunload', () => this.flush());\n window.addEventListener('pagehide', () => this.flush());\n }\n }\n\n // ==========================================================================\n // Session Management\n // ==========================================================================\n\n private initSession(): string {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return this.generateId();\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const { id, timestamp } = JSON.parse(stored);\n if (Date.now() - timestamp < SESSION_TIMEOUT) {\n // Refresh timestamp\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n id,\n timestamp: Date.now()\n }));\n return id;\n }\n }\n } catch {\n // localStorage not available or corrupted\n }\n\n // Create new session\n const newId = this.generateId();\n this.saveSession(newId);\n return newId;\n }\n\n private generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n private saveSession(id: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n id,\n timestamp: Date.now()\n }));\n } catch {\n // localStorage full or not available\n }\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Start a new session (e.g., after logout)\n */\n startNewSession(): string {\n this.sessionId = this.generateId();\n this.saveSession(this.sessionId);\n return this.sessionId;\n }\n\n // ==========================================================================\n // User Identification\n // ==========================================================================\n\n /**\n * Associate events with a user ID\n */\n setUserId(userId: string): void {\n this.userId = userId;\n }\n\n /**\n * Clear user association (e.g., on logout)\n */\n clearUserId(): void {\n this.userId = undefined;\n }\n\n // ==========================================================================\n // Core Logging Methods\n // ==========================================================================\n\n /**\n * Log a custom event\n */\n async logEvent(eventType: string, payload: EventPayload = {}): Promise<void> {\n if (!this.enabled) return;\n\n this.eventQueue.push({\n eventType,\n payload,\n timestamp: Date.now()\n });\n\n // Flush immediately for errors (they're important)\n if (eventType === 'error' || eventType === 'api_error') {\n await this.flush();\n }\n }\n\n /**\n * Log a page view event\n */\n async logPageView(pageName: string, metadata?: Record<string, any>): Promise<void> {\n if (!this.enabled) return;\n\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const referrer = typeof document !== 'undefined' ? document.referrer : '';\n\n await this.logEvent('page_view', {\n page_name: pageName,\n metadata: {\n url,\n referrer,\n ...metadata\n }\n });\n }\n\n /**\n * Log an error event\n */\n async logError(error: Error, componentStack?: string): Promise<void> {\n if (!this.enabled) return;\n\n const url = typeof window !== 'undefined' ? window.location.href : '';\n\n await this.logEvent('error', {\n error_message: error.message,\n error_stack: error.stack,\n metadata: {\n name: error.name,\n component_stack: componentStack,\n url\n }\n });\n }\n\n /**\n * Log an API error event\n */\n async logApiError(\n endpoint: string,\n statusCode: number,\n errorMessage: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n if (!this.enabled) return;\n\n await this.logEvent('api_error', {\n error_message: errorMessage,\n metadata: {\n endpoint,\n status_code: statusCode,\n ...metadata\n }\n });\n }\n\n // ==========================================================================\n // Event Batching & Flushing\n // ==========================================================================\n\n private startFlushTimer(): void {\n if (this.flushTimer) return;\n\n this.flushTimer = setInterval(() => {\n if (this.eventQueue.length > 0) {\n this.flush();\n }\n }, FLUSH_INTERVAL);\n }\n\n /**\n * Flush all queued events to the server\n */\n async flush(): Promise<void> {\n if (this.eventQueue.length === 0) return;\n\n // Take all events from queue\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n // Send each event (could batch in future)\n const sendPromises = events.map(({ eventType, payload }) =>\n this.sendEvent(eventType, payload)\n );\n\n await Promise.allSettled(sendPromises);\n }\n\n private async sendEvent(eventType: string, payload: EventPayload): Promise<void> {\n const pageName = payload.page_name || (typeof window !== 'undefined' ? window.location.pathname : '/');\n const url = `${this.config.apiUrl}/api/app-logs/${this.config.appId}/log-event`;\n\n const body = {\n session_id: this.sessionId,\n user_id: this.userId,\n event_type: eventType,\n page_name: pageName,\n action: payload.action,\n inputs: payload.inputs,\n metadata: payload.metadata,\n is_error: eventType === 'error' || eventType === 'api_error',\n error_message: payload.error_message,\n error_stack: payload.error_stack\n };\n\n // Retry logic with exponential backoff\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n keepalive: true // Ensures request completes even on page unload\n });\n\n if (response.ok) {\n return; // Success\n }\n\n // Don't retry on client errors (4xx)\n if (response.status >= 400 && response.status < 500) {\n console.warn(`[Omnikit Analytics] Event rejected: ${response.status}`);\n return;\n }\n } catch (err) {\n // Network error, will retry\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < MAX_RETRIES - 1) {\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n\n // All retries failed - silently drop event\n console.warn('[Omnikit Analytics] Failed to send event after retries');\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n /**\n * Enable or disable analytics\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n if (enabled && typeof window !== 'undefined') {\n this.startFlushTimer();\n } else if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n /**\n * Check if analytics is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = undefined;\n }\n // Flush remaining events\n this.flush();\n }\n}\n\n// Convenience function for creating analytics instance\nexport function createAnalytics(config: AnalyticsConfig): Analytics {\n return new Analytics(config);\n}\n"]}