@olbrain/js-sdk 1.0.1 → 1.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/index.ts","../src/core/client.ts","../src/core/exceptions.ts","../src/core/utils.ts","../src/core/streaming.ts"],"sourcesContent":["/**\n * Olbrain JavaScript SDK\n * Main entry point for core API exports\n */\n\n// Export client\nexport { AgentClient } from './core/client';\n\n// Export types\nexport type {\n AgentConfig,\n CreateSessionOptions,\n SessionUpdates,\n SendOptions,\n TokenUsage,\n SessionInfo,\n SessionStats,\n ChatResponse,\n Message,\n MessageCallback,\n ErrorCallback,\n StreamConfig,\n WidgetConfig,\n} from './core/types';\n\n// Export error classes\nexport {\n OlbrainError,\n AuthenticationError,\n SessionNotFoundError,\n RateLimitError,\n NetworkError,\n ValidationError,\n StreamingError,\n} from './core/exceptions';\n\n// Version\nexport const VERSION = '1.0.0';\n","/**\n * Main AgentClient class for communicating with Olbrain agents\n */\n\nimport {\n AgentConfig,\n CreateSessionOptions,\n SessionUpdates,\n SendOptions,\n ChatResponse,\n Message,\n MessageCallback,\n SessionInfo,\n SessionStats,\n ErrorCallback,\n} from './types';\nimport {\n OlbrainError,\n AuthenticationError,\n SessionNotFoundError,\n RateLimitError,\n NetworkError,\n ValidationError,\n} from './exceptions';\nimport { validateApiKey, validateAgentId, formatAuthHeader } from './utils';\nimport { StreamManager } from './streaming';\n\nconst DEFAULT_BASE_URL = 'https://olbrain-agent-cloud-768934887465.us-central1.run.app';\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Main API client for interacting with Olbrain agents\n */\nexport class AgentClient {\n private config: Required<AgentConfig>;\n private streamManager: StreamManager;\n\n constructor(config: AgentConfig) {\n validateApiKey(config.apiKey);\n validateAgentId(config.agentId);\n\n this.config = {\n agentId: config.agentId,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || DEFAULT_BASE_URL,\n };\n\n this.streamManager = new StreamManager();\n }\n\n /**\n * Create a new session\n */\n async createSession(options?: CreateSessionOptions): Promise<string> {\n const payload: Record<string, any> = {\n message: options?.title || 'Chat Session',\n response_mode: 'sync',\n mode: 'production',\n };\n\n if (options?.userId) {\n payload.user_id = options.userId;\n }\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this._request('POST', '/api/agent/webhook', payload);\n\n if (!response.session_id) {\n throw new OlbrainError('Failed to create session: no session_id returned');\n }\n\n return response.session_id;\n }\n\n /**\n * Get session information\n * @note May not be implemented on all backends\n */\n async getSession(sessionId: string): Promise<SessionInfo> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_session_info',\n });\n\n return this._parseSessionInfo(response);\n } catch (error) {\n // Fallback: return basic session info\n console.warn('get_session_info not available, returning basic info');\n return {\n sessionId,\n title: 'Session',\n status: 'active',\n createdAt: new Date().toISOString(),\n messageCount: 0,\n metadata: {},\n };\n }\n }\n\n /**\n * Update session information\n * @note May not be implemented on all backends\n */\n async updateSession(sessionId: string, updates: SessionUpdates): Promise<SessionInfo> {\n try {\n const payload: Record<string, any> = {\n session_id: sessionId,\n action: 'update_session',\n };\n\n if (updates.title !== undefined) payload.title = updates.title;\n if (updates.status !== undefined) payload.status = updates.status;\n if (updates.metadata !== undefined) payload.metadata = updates.metadata;\n\n const response = await this._request('POST', '/api/agent/webhook', payload);\n\n return this._parseSessionInfo(response);\n } catch (error) {\n console.warn('update_session not available');\n throw error;\n }\n }\n\n /**\n * Delete a session\n * @note May not be implemented on all backends\n */\n async deleteSession(sessionId: string): Promise<void> {\n try {\n await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'delete_session',\n });\n } catch (error) {\n console.warn('delete_session not available');\n throw error;\n }\n }\n\n /**\n * Get messages from a session\n * @note May not be implemented on all backends\n */\n async getMessages(sessionId: string, limit?: number): Promise<Message[]> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_messages',\n limit: limit || 100,\n });\n\n return (response.messages || []).map((msg: any) => ({\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp,\n metadata: msg.metadata,\n }));\n } catch (error) {\n console.warn('get_messages not available');\n return [];\n }\n }\n\n /**\n * Get session statistics\n * @note May not be implemented on all backends\n */\n async getSessionStats(sessionId: string): Promise<SessionStats> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_stats',\n });\n\n return {\n sessionId: response.session_id,\n messageCount: response.message_count,\n totalTokens: response.total_tokens,\n createdAt: response.created_at,\n lastMessageAt: response.last_message_at,\n };\n } catch (error) {\n console.warn('get_stats not available');\n return {\n sessionId,\n messageCount: 0,\n totalTokens: 0,\n createdAt: new Date().toISOString(),\n };\n }\n }\n\n /**\n * Send a message and wait for response\n */\n async sendAndWait(\n sessionId: string,\n message: string,\n options?: SendOptions\n ): Promise<ChatResponse> {\n if (!message) {\n throw new ValidationError('Message cannot be empty');\n }\n\n const payload: Record<string, any> = {\n session_id: sessionId,\n message: message.trim(),\n response_mode: 'sync',\n };\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const timeout = options?.timeout || DEFAULT_TIMEOUT_MS;\n\n const response = await this._request(\n 'POST',\n '/api/agent/webhook',\n payload,\n timeout\n );\n\n return {\n text: response.response || response.text || '',\n sessionId: response.session_id,\n success: response.success !== false,\n tokenUsage: response.token_usage ? {\n promptTokens: response.token_usage.prompt_tokens,\n completionTokens: response.token_usage.completion_tokens,\n totalTokens: response.token_usage.total_tokens,\n cost: response.token_usage.cost,\n } : undefined,\n modelUsed: response.model_used,\n responseTimeMs: response.response_time_ms,\n error: response.error,\n };\n }\n\n /**\n * Send a message (fire and forget)\n */\n async send(sessionId: string, message: string): Promise<void> {\n if (!message) {\n throw new ValidationError('Message cannot be empty');\n }\n\n await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n message: message.trim(),\n response_mode: 'sync',\n });\n }\n\n /**\n * Start listening for messages via SSE streaming\n */\n async listen(\n sessionId: string,\n onMessage: MessageCallback,\n onError?: ErrorCallback\n ): Promise<void> {\n await this.streamManager.startStream(\n sessionId,\n {\n sessionId,\n apiKey: this.config.apiKey,\n agentId: this.config.agentId,\n baseUrl: this.config.baseUrl,\n },\n onMessage,\n onError\n );\n }\n\n /**\n * Stop listening for messages\n */\n stopListening(sessionId: string): void {\n this.streamManager.stopStream(sessionId);\n }\n\n /**\n * Close client and clean up resources\n */\n close(): void {\n this.streamManager.stopAllStreams();\n }\n\n /**\n * Helper method to make HTTP requests\n */\n private async _request(\n method: string,\n path: string,\n payload?: any,\n timeout: number = DEFAULT_TIMEOUT_MS\n ): Promise<any> {\n const url = `${this.config.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': formatAuthHeader(this.config.apiKey),\n 'X-Agent-ID': this.config.agentId,\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.error || errorData.message || response.statusText;\n\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(errorMessage);\n } else if (response.status === 404) {\n throw new SessionNotFoundError(payload?.session_id || 'unknown');\n } else if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new RateLimitError(errorMessage, retryAfter ? parseInt(retryAfter) : undefined);\n } else if (response.status >= 500) {\n throw new NetworkError(errorMessage, response.status);\n } else {\n throw new NetworkError(errorMessage, response.status);\n }\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OlbrainError) {\n throw error;\n }\n\n if (error instanceof TypeError) {\n if (error.message.includes('aborted')) {\n throw new OlbrainError(`Request timeout after ${timeout}ms`);\n }\n throw new NetworkError(error.message);\n }\n\n throw error;\n }\n }\n\n /**\n * Helper to parse session info from response\n */\n private _parseSessionInfo(data: any): SessionInfo {\n return {\n sessionId: data.session_id,\n title: data.title,\n status: data.status || 'active',\n createdAt: data.created_at,\n messageCount: data.message_count || 0,\n userId: data.user_id,\n metadata: data.metadata || {},\n };\n }\n}\n","/**\n * Error classes for Olbrain SDK\n */\n\n/**\n * Base error class for all Olbrain errors\n */\nexport class OlbrainError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OlbrainError';\n Object.setPrototypeOf(this, OlbrainError.prototype);\n }\n}\n\n/**\n * Raised when authentication fails (invalid API key, missing auth header, etc.)\n */\nexport class AuthenticationError extends OlbrainError {\n constructor(message: string = 'Authentication failed') {\n super(message);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Raised when a session is not found\n */\nexport class SessionNotFoundError extends OlbrainError {\n sessionId: string;\n\n constructor(sessionId: string) {\n super(`Session not found: ${sessionId}`);\n this.name = 'SessionNotFoundError';\n this.sessionId = sessionId;\n Object.setPrototypeOf(this, SessionNotFoundError.prototype);\n }\n}\n\n/**\n * Raised when rate limit is exceeded\n */\nexport class RateLimitError extends OlbrainError {\n retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super(message);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Raised when a network error occurs\n */\nexport class NetworkError extends OlbrainError {\n statusCode?: number;\n\n constructor(message: string = 'Network error', statusCode?: number) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Raised when input validation fails\n */\nexport class ValidationError extends OlbrainError {\n constructor(message: string = 'Validation error') {\n super(message);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Raised when streaming connection fails\n */\nexport class StreamingError extends OlbrainError {\n constructor(message: string = 'Streaming error') {\n super(message);\n this.name = 'StreamingError';\n Object.setPrototypeOf(this, StreamingError.prototype);\n }\n}\n","/**\n * Utility functions for the Olbrain SDK\n */\n\nimport { ValidationError } from './exceptions';\n\n/**\n * Validates API key format\n */\nexport function validateApiKey(apiKey: string): void {\n if (!apiKey) {\n throw new ValidationError('API key is required');\n }\n\n const validPrefixes = ['sk_live_', 'org_live_', 'sk_', 'org_'];\n if (!validPrefixes.some(prefix => apiKey.startsWith(prefix))) {\n throw new ValidationError(\n 'Invalid API key format. Must start with sk_, org_, sk_live_, or org_live_'\n );\n }\n}\n\n/**\n * Validates agent ID format\n */\nexport function validateAgentId(agentId: string): void {\n if (!agentId) {\n throw new ValidationError('Agent ID is required');\n }\n}\n\n/**\n * Formats authorization header value\n */\nexport function formatAuthHeader(apiKey: string): string {\n return `Bearer ${apiKey}`;\n}\n\n/**\n * Generates session storage key\n */\nexport function getSessionStorageKey(sessionId: string): string {\n return `olbrain_session_${sessionId}`;\n}\n\n/**\n * Delay utility for testing and retries\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Exponential backoff calculator\n */\nexport function getExponentialBackoffDelay(\n attempt: number,\n baseDelay: number = 5000,\n maxDelay: number = 60000\n): number {\n const delay = baseDelay * Math.pow(2, attempt);\n return Math.min(delay, maxDelay);\n}\n\n/**\n * Check if running in browser environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return typeof process !== 'undefined' && process.versions && process.versions.node;\n}\n\n/**\n * Get appropriate EventSource implementation\n */\nexport async function getEventSourceImpl(): Promise<typeof EventSource> {\n if (isBrowser()) {\n return EventSource;\n }\n\n if (isNode()) {\n try {\n // Try to import the eventsource package for Node.js\n const { EventSource: NodeEventSource } = await import('eventsource');\n return NodeEventSource as any;\n } catch {\n throw new Error(\n 'EventSource not available in Node.js. Install \"eventsource\" package: npm install eventsource'\n );\n }\n }\n\n throw new Error('EventSource not available in this environment');\n}\n","/**\n * Streaming support for real-time message delivery via Server-Sent Events (SSE)\n */\n\nimport { StreamConfig, Message, MessageCallback, ErrorCallback } from './types';\nimport { StreamingError } from './exceptions';\nimport {\n formatAuthHeader,\n delay,\n getExponentialBackoffDelay,\n getEventSourceImpl,\n} from './utils';\n\n/**\n * Handles SSE streaming for a session\n */\nexport class MessageStream {\n private config: StreamConfig;\n private onMessage: MessageCallback;\n private onError?: ErrorCallback;\n private eventSource?: EventSource;\n private isRunning: boolean = false;\n private reconnectAttempt: number = 0;\n private reconnectTimeout?: NodeJS.Timeout;\n\n constructor(config: StreamConfig, onMessage: MessageCallback, onError?: ErrorCallback) {\n this.config = config;\n this.onMessage = onMessage;\n this.onError = onError;\n }\n\n /**\n * Start the streaming connection\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.reconnectAttempt = 0;\n await this._connect();\n }\n\n /**\n * Stop the streaming connection\n */\n stop(): void {\n this.isRunning = false;\n this._cleanup();\n }\n\n /**\n * Establish SSE connection\n */\n private async _connect(): Promise<void> {\n try {\n const EventSourceImpl = await getEventSourceImpl();\n const url = `${this.config.baseUrl}/sessions/${this.config.sessionId}/stream`;\n const headers: Record<string, string> = {\n 'Authorization': formatAuthHeader(this.config.apiKey),\n 'X-Agent-ID': this.config.agentId,\n };\n\n // Create EventSource with headers\n this.eventSource = new EventSourceImpl(url, { headers });\n\n // Handle incoming messages\n this.eventSource.addEventListener('message', (event: any) => {\n this._handleMessage(event);\n });\n\n // Handle ping/keepalive\n this.eventSource.addEventListener('ping', () => {\n // Skip keepalive messages\n });\n\n // Handle errors\n this.eventSource.addEventListener('error', () => {\n this._handleConnectionError();\n });\n\n this.reconnectAttempt = 0;\n } catch (error) {\n this._handleConnectionError();\n }\n }\n\n /**\n * Handle incoming message event\n */\n private _handleMessage(event: any): void {\n if (!event.data) {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Skip ping/keepalive messages\n if (data.type === 'ping' || data.type === 'keepalive') {\n return;\n }\n\n // Parse and deliver message\n if (data.role && data.content) {\n const message: Message = {\n role: data.role,\n content: data.content,\n timestamp: data.timestamp || new Date().toISOString(),\n metadata: data.metadata,\n };\n\n this.onMessage(message);\n }\n } catch (error) {\n if (this.onError) {\n this.onError(\n new StreamingError(`Failed to parse message: ${(error as Error).message}`)\n );\n }\n }\n }\n\n /**\n * Handle connection errors and attempt reconnection\n */\n private _handleConnectionError(): void {\n if (!this.isRunning) {\n return;\n }\n\n this._cleanup();\n\n // Calculate backoff delay\n const delay = getExponentialBackoffDelay(this.reconnectAttempt);\n\n if (this.onError) {\n this.onError(\n new StreamingError(\n `Connection lost. Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt + 1})`\n )\n );\n }\n\n this.reconnectAttempt++;\n\n // Schedule reconnection\n this.reconnectTimeout = setTimeout(async () => {\n if (this.isRunning) {\n await this._connect();\n }\n }, delay);\n }\n\n /**\n * Clean up resources\n */\n private _cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = undefined;\n }\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n }\n}\n\n/**\n * Manages multiple message streams for different sessions\n */\nexport class StreamManager {\n private streams: Map<string, MessageStream> = new Map();\n\n /**\n * Start streaming for a session\n */\n async startStream(\n sessionId: string,\n config: StreamConfig,\n onMessage: MessageCallback,\n onError?: ErrorCallback\n ): Promise<void> {\n // Stop existing stream if any\n this.stopStream(sessionId);\n\n const stream = new MessageStream(config, onMessage, onError);\n this.streams.set(sessionId, stream);\n\n await stream.start();\n }\n\n /**\n * Stop streaming for a session\n */\n stopStream(sessionId: string): void {\n const stream = this.streams.get(sessionId);\n if (stream) {\n stream.stop();\n this.streams.delete(sessionId);\n }\n }\n\n /**\n * Stop all streams\n */\n stopAllStreams(): void {\n for (const stream of this.streams.values()) {\n stream.stop();\n }\n this.streams.clear();\n }\n\n /**\n * Check if a stream is running\n */\n isStreamRunning(sessionId: string): boolean {\n return this.streams.has(sessionId);\n }\n}\n"],"mappings":";;;;;AAAA;;;ACAA;;;ACAA;AAOO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;AAKO,IAAM,sBAAN,MAAM,6BAA4B,aAAa;AAAA,EACpD,YAAY,UAAkB,yBAAyB;AACrD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;AAKO,IAAM,uBAAN,MAAM,8BAA6B,aAAa;AAAA,EAGrD,YAAY,WAAmB;AAC7B,UAAM,sBAAsB,SAAS,EAAE;AACvC,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,WAAO,eAAe,MAAM,sBAAqB,SAAS;AAAA,EAC5D;AACF;AAKO,IAAM,iBAAN,MAAM,wBAAuB,aAAa;AAAA,EAG/C,YAAY,UAAkB,uBAAuB,YAAqB;AACxE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO,eAAe,MAAM,gBAAe,SAAS;AAAA,EACtD;AACF;AAKO,IAAM,eAAN,MAAM,sBAAqB,aAAa;AAAA,EAG7C,YAAY,UAAkB,iBAAiB,YAAqB;AAClE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;AAKO,IAAM,kBAAN,MAAM,yBAAwB,aAAa;AAAA,EAChD,YAAY,UAAkB,oBAAoB;AAChD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,iBAAgB,SAAS;AAAA,EACvD;AACF;AAKO,IAAM,iBAAN,MAAM,wBAAuB,aAAa;AAAA,EAC/C,YAAY,UAAkB,mBAAmB;AAC/C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,gBAAe,SAAS;AAAA,EACtD;AACF;;;ACxFA;AASO,SAAS,eAAe,QAAsB;AACnD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,qBAAqB;AAAA,EACjD;AAEA,QAAM,gBAAgB,CAAC,YAAY,aAAa,OAAO,MAAM;AAC7D,MAAI,CAAC,cAAc,KAAK,YAAU,OAAO,WAAW,MAAM,CAAC,GAAG;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,SAAuB;AACrD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,gBAAgB,sBAAsB;AAAA,EAClD;AACF;AAKO,SAAS,iBAAiB,QAAwB;AACvD,SAAO,UAAU,MAAM;AACzB;AAmBO,SAAS,2BACd,SACA,YAAoB,KACpB,WAAmB,KACX;AACR,QAAMA,SAAQ,YAAY,KAAK,IAAI,GAAG,OAAO;AAC7C,SAAO,KAAK,IAAIA,QAAO,QAAQ;AACjC;AAKO,SAAS,YAAqB;AACnC,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAKO,SAAS,SAAkB;AAChC,SAAO,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS;AAChF;AAKA,eAAsB,qBAAkD;AACtE,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,GAAG;AACZ,QAAI;AAEF,YAAM,EAAE,aAAa,gBAAgB,IAAI,MAAM,OAAO,4BAAa;AACnE,aAAO;AAAA,IACT,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,+CAA+C;AACjE;;;ACnGA;AAgBO,IAAM,gBAAN,MAAoB;AAAA,EASzB,YAAY,QAAsB,WAA4B,SAAyB;AAJvF,SAAQ,YAAqB;AAC7B,SAAQ,mBAA2B;AAIjC,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAEA,SAAK,YAAY;AACjB,SAAK,mBAAmB;AACxB,UAAM,KAAK,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAA0B;AACtC,QAAI;AACF,YAAM,kBAAkB,MAAM,mBAAmB;AACjD,YAAM,MAAM,GAAG,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,SAAS;AACpE,YAAM,UAAkC;AAAA,QACtC,iBAAiB,iBAAiB,KAAK,OAAO,MAAM;AAAA,QACpD,cAAc,KAAK,OAAO;AAAA,MAC5B;AAGA,WAAK,cAAc,IAAI,gBAAgB,KAAK,EAAE,QAAQ,CAAC;AAGvD,WAAK,YAAY,iBAAiB,WAAW,CAAC,UAAe;AAC3D,aAAK,eAAe,KAAK;AAAA,MAC3B,CAAC;AAGD,WAAK,YAAY,iBAAiB,QAAQ,MAAM;AAAA,MAEhD,CAAC;AAGD,WAAK,YAAY,iBAAiB,SAAS,MAAM;AAC/C,aAAK,uBAAuB;AAAA,MAC9B,CAAC;AAED,WAAK,mBAAmB;AAAA,IAC1B,SAAS,OAAO;AACd,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAkB;AACvC,QAAI,CAAC,MAAM,MAAM;AACf;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAGlC,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa;AACrD;AAAA,MACF;AAGA,UAAI,KAAK,QAAQ,KAAK,SAAS;AAC7B,cAAM,UAAmB;AAAA,UACvB,MAAM,KAAK;AAAA,UACX,SAAS,KAAK;AAAA,UACd,WAAW,KAAK,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpD,UAAU,KAAK;AAAA,QACjB;AAEA,aAAK,UAAU,OAAO;AAAA,MACxB;AAAA,IACF,SAAS,OAAO;AACd,UAAI,KAAK,SAAS;AAChB,aAAK;AAAA,UACH,IAAI,eAAe,4BAA6B,MAAgB,OAAO,EAAE;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAA+B;AACrC,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAEA,SAAK,SAAS;AAGd,UAAMC,SAAQ,2BAA2B,KAAK,gBAAgB;AAE9D,QAAI,KAAK,SAAS;AAChB,WAAK;AAAA,QACH,IAAI;AAAA,UACF,oCAAoCA,MAAK,eAAe,KAAK,mBAAmB,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAEA,SAAK;AAGL,SAAK,mBAAmB,WAAW,YAAY;AAC7C,UAAI,KAAK,WAAW;AAClB,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF,GAAGA,MAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACvB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAEA,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,gBAAgB;AAClC,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AACF;AAKO,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACL,SAAQ,UAAsC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtD,MAAM,YACJ,WACA,QACA,WACA,SACe;AAEf,SAAK,WAAW,SAAS;AAEzB,UAAM,SAAS,IAAI,cAAc,QAAQ,WAAW,OAAO;AAC3D,SAAK,QAAQ,IAAI,WAAW,MAAM;AAElC,UAAM,OAAO,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAyB;AAClC,UAAM,SAAS,KAAK,QAAQ,IAAI,SAAS;AACzC,QAAI,QAAQ;AACV,aAAO,KAAK;AACZ,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,aAAO,KAAK;AAAA,IACd;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAA4B;AAC1C,WAAO,KAAK,QAAQ,IAAI,SAAS;AAAA,EACnC;AACF;;;AHnMA,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAKpB,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,QAAqB;AAC/B,mBAAe,OAAO,MAAM;AAC5B,oBAAgB,OAAO,OAAO;AAE9B,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO,WAAW;AAAA,IAC7B;AAEA,SAAK,gBAAgB,IAAI,cAAc;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAiD;AACnE,UAAM,UAA+B;AAAA,MACnC,SAAS,SAAS,SAAS;AAAA,MAC3B,eAAe;AAAA,MACf,MAAM;AAAA,IACR;AAEA,QAAI,SAAS,QAAQ;AACnB,cAAQ,UAAU,QAAQ;AAAA,IAC5B;AACA,QAAI,SAAS,UAAU;AACrB,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAEA,UAAM,WAAW,MAAM,KAAK,SAAS,QAAQ,sBAAsB,OAAO;AAE1E,QAAI,CAAC,SAAS,YAAY;AACxB,YAAM,IAAI,aAAa,kDAAkD;AAAA,IAC3E;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,WAAyC;AACxD,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,SAAS,QAAQ,sBAAsB;AAAA,QACjE,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAED,aAAO,KAAK,kBAAkB,QAAQ;AAAA,IACxC,SAAS,OAAO;AAEd,cAAQ,KAAK,sDAAsD;AACnE,aAAO;AAAA,QACL;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,cAAc;AAAA,QACd,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,WAAmB,SAA+C;AACpF,QAAI;AACF,YAAM,UAA+B;AAAA,QACnC,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAEA,UAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,UAAI,QAAQ,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC3D,UAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAE/D,YAAM,WAAW,MAAM,KAAK,SAAS,QAAQ,sBAAsB,OAAO;AAE1E,aAAO,KAAK,kBAAkB,QAAQ;AAAA,IACxC,SAAS,OAAO;AACd,cAAQ,KAAK,8BAA8B;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,WAAkC;AACpD,QAAI;AACF,YAAM,KAAK,SAAS,QAAQ,sBAAsB;AAAA,QAChD,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,8BAA8B;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,WAAmB,OAAoC;AACvE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,SAAS,QAAQ,sBAAsB;AAAA,QACjE,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,SAAS;AAAA,MAClB,CAAC;AAED,cAAQ,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,SAAc;AAAA,QAClD,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,QACf,UAAU,IAAI;AAAA,MAChB,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,cAAQ,KAAK,4BAA4B;AACzC,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,WAA0C;AAC9D,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,SAAS,QAAQ,sBAAsB;AAAA,QACjE,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV,CAAC;AAED,aAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,cAAc,SAAS;AAAA,QACvB,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA,QACpB,eAAe,SAAS;AAAA,MAC1B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,yBAAyB;AACtC,aAAO;AAAA,QACL;AAAA,QACA,cAAc;AAAA,QACd,aAAa;AAAA,QACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,WACA,SACA,SACuB;AACvB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,gBAAgB,yBAAyB;AAAA,IACrD;AAEA,UAAM,UAA+B;AAAA,MACnC,YAAY;AAAA,MACZ,SAAS,QAAQ,KAAK;AAAA,MACtB,eAAe;AAAA,IACjB;AAEA,QAAI,SAAS,UAAU;AACrB,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAEA,UAAM,UAAU,SAAS,WAAW;AAEpC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,SAAS,YAAY,SAAS,QAAQ;AAAA,MAC5C,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS,YAAY;AAAA,MAC9B,YAAY,SAAS,cAAc;AAAA,QACjC,cAAc,SAAS,YAAY;AAAA,QACnC,kBAAkB,SAAS,YAAY;AAAA,QACvC,aAAa,SAAS,YAAY;AAAA,QAClC,MAAM,SAAS,YAAY;AAAA,MAC7B,IAAI;AAAA,MACJ,WAAW,SAAS;AAAA,MACpB,gBAAgB,SAAS;AAAA,MACzB,OAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,WAAmB,SAAgC;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,gBAAgB,yBAAyB;AAAA,IACrD;AAEA,UAAM,KAAK,SAAS,QAAQ,sBAAsB;AAAA,MAChD,YAAY;AAAA,MACZ,SAAS,QAAQ,KAAK;AAAA,MACtB,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,WACA,WACA,SACe;AACf,UAAM,KAAK,cAAc;AAAA,MACvB;AAAA,MACA;AAAA,QACE;AAAA,QACA,QAAQ,KAAK,OAAO;AAAA,QACpB,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,WAAyB;AACrC,SAAK,cAAc,WAAW,SAAS;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,cAAc,eAAe;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SACZ,QACA,MACA,SACA,UAAkB,oBACJ;AACd,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,IAAI;AACzC,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,iBAAiB,iBAAiB,KAAK,OAAO,MAAM;AAAA,MACpD,cAAc,KAAK,OAAO;AAAA,IAC5B;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE9D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA,MAAM,UAAU,KAAK,UAAU,OAAO,IAAI;AAAA,QAC1C,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,SAAS;AAGtB,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,cAAM,eAAe,UAAU,SAAS,UAAU,WAAW,SAAS;AAEtE,YAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,gBAAM,IAAI,oBAAoB,YAAY;AAAA,QAC5C,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI,qBAAqB,SAAS,cAAc,SAAS;AAAA,QACjE,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,gBAAM,IAAI,eAAe,cAAc,aAAa,SAAS,UAAU,IAAI,MAAS;AAAA,QACtF,WAAW,SAAS,UAAU,KAAK;AACjC,gBAAM,IAAI,aAAa,cAAc,SAAS,MAAM;AAAA,QACtD,OAAO;AACL,gBAAM,IAAI,aAAa,cAAc,SAAS,MAAM;AAAA,QACtD;AAAA,MACF;AAEA,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,SAAS,OAAO;AACd,mBAAa,SAAS;AAEtB,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AAEA,UAAI,iBAAiB,WAAW;AAC9B,YAAI,MAAM,QAAQ,SAAS,SAAS,GAAG;AACrC,gBAAM,IAAI,aAAa,yBAAyB,OAAO,IAAI;AAAA,QAC7D;AACA,cAAM,IAAI,aAAa,MAAM,OAAO;AAAA,MACtC;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAwB;AAChD,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK,UAAU;AAAA,MACvB,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK,iBAAiB;AAAA,MACpC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,YAAY,CAAC;AAAA,IAC9B;AAAA,EACF;AACF;;;ADhVO,IAAM,UAAU;","names":["delay","delay"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/client.ts","../src/core/exceptions.ts","../src/core/utils.ts","../src/core/streaming.ts","../src/core/olbrain.ts"],"sourcesContent":["/**\n * Olbrain JavaScript SDK\n * Main entry point for core API exports\n */\n\n// Export client\nexport { AgentClient } from './core/client';\n\nexport { Olbrain } from './core/olbrain';\nexport type { OlbrainConfig, Run, RunSummary, Approval, ResolveInput, ResolveResult } from './core/olbrain';\n\n// Export types\nexport type {\n AgentConfig,\n CreateSessionOptions,\n SessionUpdates,\n SendOptions,\n TokenUsage,\n SessionInfo,\n SessionStats,\n ChatResponse,\n Message,\n MessageCallback,\n ErrorCallback,\n StreamConfig,\n WidgetConfig,\n} from './core/types';\n\n// Export error classes\nexport {\n OlbrainError,\n AuthenticationError,\n SessionNotFoundError,\n RateLimitError,\n NetworkError,\n ValidationError,\n StreamingError,\n ApiError,\n NotFoundError,\n BillingError,\n} from './core/exceptions';\n\n// Version\nexport const VERSION = '1.2.0';\n","/**\n * Main AgentClient class for communicating with Olbrain agents\n */\n\nimport {\n AgentConfig,\n CreateSessionOptions,\n SessionUpdates,\n SendOptions,\n ChatResponse,\n Message,\n MessageCallback,\n SessionInfo,\n SessionStats,\n ErrorCallback,\n} from './types';\nimport {\n OlbrainError,\n AuthenticationError,\n SessionNotFoundError,\n RateLimitError,\n NetworkError,\n ValidationError,\n} from './exceptions';\nimport { validateApiKey, validateAgentId, formatAuthHeader } from './utils';\nimport { StreamManager } from './streaming';\n\nconst DEFAULT_BASE_URL = 'https://olbrain-agent-cloud-768934887465.us-central1.run.app';\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Main API client for interacting with Olbrain agents\n */\nexport class AgentClient {\n private config: Required<AgentConfig>;\n private streamManager: StreamManager;\n\n constructor(config: AgentConfig) {\n validateApiKey(config.apiKey);\n validateAgentId(config.agentId);\n\n this.config = {\n agentId: config.agentId,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || DEFAULT_BASE_URL,\n };\n\n this.streamManager = new StreamManager();\n }\n\n /**\n * Create a new session\n */\n async createSession(options?: CreateSessionOptions): Promise<string> {\n const payload: Record<string, any> = {\n message: options?.title || 'Chat Session',\n response_mode: 'sync',\n mode: 'production',\n };\n\n if (options?.userId) {\n payload.user_id = options.userId;\n }\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const response = await this._request('POST', '/api/agent/webhook', payload);\n\n if (!response.session_id) {\n throw new OlbrainError('Failed to create session: no session_id returned');\n }\n\n return response.session_id;\n }\n\n /**\n * Get session information\n * @note May not be implemented on all backends\n */\n async getSession(sessionId: string): Promise<SessionInfo> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_session_info',\n });\n\n return this._parseSessionInfo(response);\n } catch (error) {\n // Fallback: return basic session info\n console.warn('get_session_info not available, returning basic info');\n return {\n sessionId,\n title: 'Session',\n status: 'active',\n createdAt: new Date().toISOString(),\n messageCount: 0,\n metadata: {},\n };\n }\n }\n\n /**\n * Update session information\n * @note May not be implemented on all backends\n */\n async updateSession(sessionId: string, updates: SessionUpdates): Promise<SessionInfo> {\n try {\n const payload: Record<string, any> = {\n session_id: sessionId,\n action: 'update_session',\n };\n\n if (updates.title !== undefined) payload.title = updates.title;\n if (updates.status !== undefined) payload.status = updates.status;\n if (updates.metadata !== undefined) payload.metadata = updates.metadata;\n\n const response = await this._request('POST', '/api/agent/webhook', payload);\n\n return this._parseSessionInfo(response);\n } catch (error) {\n console.warn('update_session not available');\n throw error;\n }\n }\n\n /**\n * Delete a session\n * @note May not be implemented on all backends\n */\n async deleteSession(sessionId: string): Promise<void> {\n try {\n await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'delete_session',\n });\n } catch (error) {\n console.warn('delete_session not available');\n throw error;\n }\n }\n\n /**\n * Get messages from a session\n * @note May not be implemented on all backends\n */\n async getMessages(sessionId: string, limit?: number): Promise<Message[]> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_messages',\n limit: limit || 100,\n });\n\n return (response.messages || []).map((msg: any) => ({\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp,\n metadata: msg.metadata,\n }));\n } catch (error) {\n console.warn('get_messages not available');\n return [];\n }\n }\n\n /**\n * Get session statistics\n * @note May not be implemented on all backends\n */\n async getSessionStats(sessionId: string): Promise<SessionStats> {\n try {\n const response = await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n action: 'get_stats',\n });\n\n return {\n sessionId: response.session_id,\n messageCount: response.message_count,\n totalTokens: response.total_tokens,\n createdAt: response.created_at,\n lastMessageAt: response.last_message_at,\n };\n } catch (error) {\n console.warn('get_stats not available');\n return {\n sessionId,\n messageCount: 0,\n totalTokens: 0,\n createdAt: new Date().toISOString(),\n };\n }\n }\n\n /**\n * Send a message and wait for response\n */\n async sendAndWait(\n sessionId: string,\n message: string,\n options?: SendOptions\n ): Promise<ChatResponse> {\n if (!message) {\n throw new ValidationError('Message cannot be empty');\n }\n\n const payload: Record<string, any> = {\n session_id: sessionId,\n message: message.trim(),\n response_mode: 'sync',\n };\n\n if (options?.metadata) {\n payload.metadata = options.metadata;\n }\n\n const timeout = options?.timeout || DEFAULT_TIMEOUT_MS;\n\n const response = await this._request(\n 'POST',\n '/api/agent/webhook',\n payload,\n timeout\n );\n\n return {\n text: response.response || response.text || '',\n sessionId: response.session_id,\n success: response.success !== false,\n tokenUsage: response.token_usage ? {\n promptTokens: response.token_usage.prompt_tokens,\n completionTokens: response.token_usage.completion_tokens,\n totalTokens: response.token_usage.total_tokens,\n cost: response.token_usage.cost,\n } : undefined,\n modelUsed: response.model_used,\n responseTimeMs: response.response_time_ms,\n error: response.error,\n };\n }\n\n /**\n * Send a message (fire and forget)\n */\n async send(sessionId: string, message: string): Promise<void> {\n if (!message) {\n throw new ValidationError('Message cannot be empty');\n }\n\n await this._request('POST', '/api/agent/webhook', {\n session_id: sessionId,\n message: message.trim(),\n response_mode: 'sync',\n });\n }\n\n /**\n * Start listening for messages via SSE streaming\n */\n async listen(\n sessionId: string,\n onMessage: MessageCallback,\n onError?: ErrorCallback\n ): Promise<void> {\n await this.streamManager.startStream(\n sessionId,\n {\n sessionId,\n apiKey: this.config.apiKey,\n agentId: this.config.agentId,\n baseUrl: this.config.baseUrl,\n },\n onMessage,\n onError\n );\n }\n\n /**\n * Stop listening for messages\n */\n stopListening(sessionId: string): void {\n this.streamManager.stopStream(sessionId);\n }\n\n /**\n * Close client and clean up resources\n */\n close(): void {\n this.streamManager.stopAllStreams();\n }\n\n /**\n * Helper method to make HTTP requests\n */\n private async _request(\n method: string,\n path: string,\n payload?: any,\n timeout: number = DEFAULT_TIMEOUT_MS\n ): Promise<any> {\n const url = `${this.config.baseUrl}${path}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': formatAuthHeader(this.config.apiKey),\n 'X-Agent-ID': this.config.agentId,\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.error || errorData.message || response.statusText;\n\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(errorMessage);\n } else if (response.status === 404) {\n throw new SessionNotFoundError(payload?.session_id || 'unknown');\n } else if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n throw new RateLimitError(errorMessage, retryAfter ? parseInt(retryAfter) : undefined);\n } else if (response.status >= 500) {\n throw new NetworkError(errorMessage, response.status);\n } else {\n throw new NetworkError(errorMessage, response.status);\n }\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OlbrainError) {\n throw error;\n }\n\n if (error instanceof TypeError) {\n if (error.message.includes('aborted')) {\n throw new OlbrainError(`Request timeout after ${timeout}ms`);\n }\n throw new NetworkError(error.message);\n }\n\n throw error;\n }\n }\n\n /**\n * Helper to parse session info from response\n */\n private _parseSessionInfo(data: any): SessionInfo {\n return {\n sessionId: data.session_id,\n title: data.title,\n status: data.status || 'active',\n createdAt: data.created_at,\n messageCount: data.message_count || 0,\n userId: data.user_id,\n metadata: data.metadata || {},\n };\n }\n}\n","/**\n * Error classes for Olbrain SDK\n */\n\n/**\n * Base error class for all Olbrain errors\n */\nexport class OlbrainError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OlbrainError';\n Object.setPrototypeOf(this, OlbrainError.prototype);\n }\n}\n\n/**\n * Raised when authentication fails (invalid API key, missing auth header, etc.)\n */\nexport class AuthenticationError extends OlbrainError {\n constructor(message: string = 'Authentication failed') {\n super(message);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * Raised when a session is not found\n */\nexport class SessionNotFoundError extends OlbrainError {\n sessionId: string;\n\n constructor(sessionId: string) {\n super(`Session not found: ${sessionId}`);\n this.name = 'SessionNotFoundError';\n this.sessionId = sessionId;\n Object.setPrototypeOf(this, SessionNotFoundError.prototype);\n }\n}\n\n/**\n * Raised when rate limit is exceeded\n */\nexport class RateLimitError extends OlbrainError {\n retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super(message);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Raised when a network error occurs\n */\nexport class NetworkError extends OlbrainError {\n statusCode?: number;\n\n constructor(message: string = 'Network error', statusCode?: number) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Raised when input validation fails\n */\nexport class ValidationError extends OlbrainError {\n constructor(message: string = 'Validation error') {\n super(message);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Raised when streaming connection fails\n */\nexport class StreamingError extends OlbrainError {\n constructor(message: string = 'Streaming error') {\n super(message);\n this.name = 'StreamingError';\n Object.setPrototypeOf(this, StreamingError.prototype);\n }\n}\n\n/** An error the API answered with: its HTTP status and machine-readable code. */\nexport class ApiError extends OlbrainError {\n status: number;\n code: string;\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n this.code = code;\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(code: string = 'not_found', message: string = 'Not found') {\n super(404, code, message);\n this.name = 'NotFoundError';\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n\n/** The organization can't pay for this run (balance, credit limit or subscription). */\nexport class BillingError extends ApiError {\n constructor(status: number, code: string, message: string) {\n super(status, code, message);\n this.name = 'BillingError';\n Object.setPrototypeOf(this, BillingError.prototype);\n }\n}\n","/**\n * Utility functions for the Olbrain SDK\n */\n\nimport { ValidationError } from './exceptions';\n\n/**\n * Validates API key format\n */\nexport function validateApiKey(apiKey: string): void {\n if (!apiKey) {\n throw new ValidationError('API key is required');\n }\n\n const validPrefixes = ['ak_', 'sk_live_', 'org_live_', 'sk_', 'org_'];\n if (!validPrefixes.some(prefix => apiKey.startsWith(prefix))) {\n throw new ValidationError(\n 'Invalid API key format. Must start with ak_, sk_, org_, sk_live_, or org_live_'\n );\n }\n}\n\n/**\n * Validates agent ID format\n */\nexport function validateAgentId(agentId: string): void {\n if (!agentId) {\n throw new ValidationError('Agent ID is required');\n }\n}\n\n/**\n * Formats authorization header value\n */\nexport function formatAuthHeader(apiKey: string): string {\n return `Bearer ${apiKey}`;\n}\n\n/**\n * Generates session storage key\n */\nexport function getSessionStorageKey(sessionId: string): string {\n return `olbrain_session_${sessionId}`;\n}\n\n/**\n * Delay utility for testing and retries\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Exponential backoff calculator\n */\nexport function getExponentialBackoffDelay(\n attempt: number,\n baseDelay: number = 5000,\n maxDelay: number = 60000\n): number {\n const delay = baseDelay * Math.pow(2, attempt);\n return Math.min(delay, maxDelay);\n}\n\n/**\n * Check if running in browser environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * Check if running in Node.js environment\n */\nexport function isNode(): boolean {\n return typeof process !== 'undefined' && !!process.versions?.node;\n}\n\n/**\n * Get appropriate EventSource implementation\n */\nexport async function getEventSourceImpl(): Promise<typeof EventSource> {\n if (isBrowser()) {\n return EventSource;\n }\n\n if (isNode()) {\n try {\n // Try to import the eventsource package for Node.js\n const { EventSource: NodeEventSource } = await import('eventsource');\n return NodeEventSource as any;\n } catch {\n throw new Error(\n 'EventSource not available in Node.js. Install \"eventsource\" package: npm install eventsource'\n );\n }\n }\n\n throw new Error('EventSource not available in this environment');\n}\n","/**\n * Streaming support for real-time message delivery via Server-Sent Events (SSE)\n */\n\nimport { StreamConfig, Message, MessageCallback, ErrorCallback } from './types';\nimport { StreamingError } from './exceptions';\nimport {\n formatAuthHeader,\n delay,\n getExponentialBackoffDelay,\n getEventSourceImpl,\n} from './utils';\n\n/**\n * Handles SSE streaming for a session\n */\nexport class MessageStream {\n private config: StreamConfig;\n private onMessage: MessageCallback;\n private onError?: ErrorCallback;\n private eventSource?: EventSource;\n private isRunning: boolean = false;\n private reconnectAttempt: number = 0;\n private reconnectTimeout?: NodeJS.Timeout;\n\n constructor(config: StreamConfig, onMessage: MessageCallback, onError?: ErrorCallback) {\n this.config = config;\n this.onMessage = onMessage;\n this.onError = onError;\n }\n\n /**\n * Start the streaming connection\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.reconnectAttempt = 0;\n await this._connect();\n }\n\n /**\n * Stop the streaming connection\n */\n stop(): void {\n this.isRunning = false;\n this._cleanup();\n }\n\n /**\n * Establish SSE connection\n */\n private async _connect(): Promise<void> {\n try {\n const EventSourceImpl = await getEventSourceImpl();\n const url = `${this.config.baseUrl}/sessions/${this.config.sessionId}/stream`;\n const headers: Record<string, string> = {\n 'Authorization': formatAuthHeader(this.config.apiKey),\n 'X-Agent-ID': this.config.agentId,\n };\n\n // Browsers ignore `headers`; only the Node `eventsource` polyfill honours it\n this.eventSource = new EventSourceImpl(url, { headers } as EventSourceInit);\n\n // Handle incoming messages\n this.eventSource.addEventListener('message', (event: any) => {\n this._handleMessage(event);\n });\n\n // Handle ping/keepalive\n this.eventSource.addEventListener('ping', () => {\n // Skip keepalive messages\n });\n\n // Handle errors\n this.eventSource.addEventListener('error', () => {\n this._handleConnectionError();\n });\n\n this.reconnectAttempt = 0;\n } catch (error) {\n this._handleConnectionError();\n }\n }\n\n /**\n * Handle incoming message event\n */\n private _handleMessage(event: any): void {\n if (!event.data) {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Skip ping/keepalive messages\n if (data.type === 'ping' || data.type === 'keepalive') {\n return;\n }\n\n // Parse and deliver message\n if (data.role && data.content) {\n const message: Message = {\n role: data.role,\n content: data.content,\n timestamp: data.timestamp || new Date().toISOString(),\n metadata: data.metadata,\n };\n\n this.onMessage(message);\n }\n } catch (error) {\n if (this.onError) {\n this.onError(\n new StreamingError(`Failed to parse message: ${(error as Error).message}`)\n );\n }\n }\n }\n\n /**\n * Handle connection errors and attempt reconnection\n */\n private _handleConnectionError(): void {\n if (!this.isRunning) {\n return;\n }\n\n this._cleanup();\n\n // Calculate backoff delay\n const delay = getExponentialBackoffDelay(this.reconnectAttempt);\n\n if (this.onError) {\n this.onError(\n new StreamingError(\n `Connection lost. Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt + 1})`\n )\n );\n }\n\n this.reconnectAttempt++;\n\n // Schedule reconnection\n this.reconnectTimeout = setTimeout(async () => {\n if (this.isRunning) {\n await this._connect();\n }\n }, delay);\n }\n\n /**\n * Clean up resources\n */\n private _cleanup(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = undefined;\n }\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n }\n}\n\n/**\n * Manages multiple message streams for different sessions\n */\nexport class StreamManager {\n private streams: Map<string, MessageStream> = new Map();\n\n /**\n * Start streaming for a session\n */\n async startStream(\n sessionId: string,\n config: StreamConfig,\n onMessage: MessageCallback,\n onError?: ErrorCallback\n ): Promise<void> {\n // Stop existing stream if any\n this.stopStream(sessionId);\n\n const stream = new MessageStream(config, onMessage, onError);\n this.streams.set(sessionId, stream);\n\n await stream.start();\n }\n\n /**\n * Stop streaming for a session\n */\n stopStream(sessionId: string): void {\n const stream = this.streams.get(sessionId);\n if (stream) {\n stream.stop();\n this.streams.delete(sessionId);\n }\n }\n\n /**\n * Stop all streams\n */\n stopAllStreams(): void {\n for (const stream of this.streams.values()) {\n stream.stop();\n }\n this.streams.clear();\n }\n\n /**\n * Check if a stream is running\n */\n isStreamRunning(sessionId: string): boolean {\n return this.streams.has(sessionId);\n }\n}\n","/**\n * Olbrain's Agent API: run workflow agents, read and control their runs, and\n * resolve their approvals — with an access key (servers, scripts) or an\n * Olbrain sign-in (front ends such as screens.olbrain.com).\n */\nimport {\n ApiError, AuthenticationError, BillingError, NetworkError, NotFoundError, RateLimitError, ValidationError,\n} from './exceptions';\n\nexport interface OlbrainConfig {\n /** An Olbrain access key, ak_… Give this or getIdToken. */\n apiKey?: string;\n /** Returns the signed-in user's Firebase ID token; called before every request. */\n getIdToken?: () => Promise<string>;\n /** Defaults to https://webhook.olbrain.com */\n baseUrl?: string;\n timeoutMs?: number;\n}\n\nexport interface RunSummary { total_processed: number; successful: number; failed: number; exceptions: number; skipped: number; }\n\nexport interface Run {\n run_id: string;\n status: string;\n progress_percent?: number;\n started_at?: string | null;\n completed_at?: string | null;\n duration_seconds?: number | null;\n error?: string | null;\n summary?: RunSummary | null;\n [key: string]: unknown;\n}\n\nexport interface Approval {\n exception_id: string;\n step_id: string;\n item_id?: string | null;\n data?: Record<string, unknown> | null;\n error: string;\n requires_human_review: boolean;\n blocking: boolean;\n}\n\nexport interface ResolveInput {\n exceptionId: string;\n resolution: 'approved' | 'rejected' | 'modified';\n /** Only with resolution \"modified\". */\n modifiedData?: Record<string, unknown>;\n}\n\nexport interface ResolveResult { exception_id: string; resolution: string; all_resolved: boolean; resumed: boolean; }\n\nconst DEFAULT_BASE_URL = 'https://webhook.olbrain.com';\nconst BILLING_CODES = new Set([\n 'insufficient_funds', 'credit_limit_exceeded', 'subscription_suspended', 'subscription_inactive', 'billing_unavailable',\n]);\nconst enc = encodeURIComponent;\n\nexport class Olbrain {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n\n constructor(private readonly config: OlbrainConfig) {\n if (!config || Boolean(config.apiKey) === Boolean(config.getIdToken)) {\n throw new ValidationError('Give exactly one of apiKey or getIdToken');\n }\n if (config.apiKey && !config.apiKey.startsWith('ak_')) {\n throw new ValidationError('apiKey must be an Olbrain access key (ak_…)');\n }\n this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.timeoutMs = config.timeoutMs ?? 30000;\n }\n\n readonly workflows = {\n run: async (agentId: string, input: { payload?: unknown; variables?: Record<string, unknown> } = {}) => {\n const out = await this.request<{ run_id: string; status: string }>('POST', `/api/workflows/${enc(agentId)}/trigger`, input);\n return { runId: out.run_id, status: out.status };\n },\n };\n\n readonly runs = {\n list: (agentId: string, opts: { status?: string; limit?: number } = {}) => {\n const q = new URLSearchParams();\n if (opts.limit !== undefined) q.set('limit', String(opts.limit));\n if (opts.status) q.set('status', opts.status);\n const qs = q.toString();\n return this.request<Run[]>('GET', `/api/agents/${enc(agentId)}/runs${qs ? `?${qs}` : ''}`);\n },\n get: (agentId: string, runId: string) => this.request<Run>('GET', `/api/agents/${enc(agentId)}/runs/${enc(runId)}`),\n cancel: (agentId: string, runId: string) => this.control(agentId, runId, 'cancel'),\n pause: (agentId: string, runId: string) => this.control(agentId, runId, 'pause'),\n retry: (agentId: string, runId: string) => this.control(agentId, runId, 'retry'),\n resume: (agentId: string, runId: string) => this.control(agentId, runId, 'resume'),\n };\n\n readonly approvals = {\n list: (agentId: string, runId: string) =>\n this.request<Approval[]>('GET', `/api/agents/${enc(agentId)}/runs/${enc(runId)}/approvals`),\n resolve: (agentId: string, runId: string, input: ResolveInput) =>\n this.request<ResolveResult>('POST', `/api/agents/${enc(agentId)}/runs/${enc(runId)}/approvals/resolve`, {\n exception_id: input.exceptionId,\n resolution: input.resolution,\n ...(input.modifiedData ? { modified_data: input.modifiedData } : {}),\n }),\n };\n\n private control(agentId: string, runId: string, verb: 'cancel' | 'pause' | 'retry' | 'resume') {\n return this.request<Record<string, unknown>>('POST', `/api/agents/${enc(agentId)}/runs/${enc(runId)}/${verb}`);\n }\n\n private async request<T>(method: 'GET' | 'POST', path: string, body?: unknown): Promise<T> {\n const token = this.config.apiKey ?? (await this.config.getIdToken!());\n const headers: Record<string, string> = { Authorization: `Bearer ${token}` };\n if (body !== undefined) headers['Content-Type'] = 'application/json';\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n method, headers, body: body === undefined ? undefined : JSON.stringify(body), signal: controller.signal,\n });\n } catch (err) {\n const e = err as Error;\n throw new NetworkError(e?.name === 'AbortError' ? `Request timed out after ${this.timeoutMs}ms` : e?.message || 'Network error');\n } finally {\n clearTimeout(timer);\n }\n const data: any = await res.json().catch(() => undefined);\n if (res.ok) return data as T;\n // Our API: {error:{code,message}}. Runtime errors pass through as FastAPI {detail: string | {code,message} | [...]}.\n const detail = data?.detail;\n const pick = (k: 'code' | 'message'): string | undefined =>\n [data?.error?.[k], typeof detail === 'object' && !Array.isArray(detail) ? detail?.[k] : undefined, data?.[k]]\n .find((v) => typeof v === 'string' && v);\n const code: string = pick('code') ?? 'error';\n const message: string = data?.error?.message\n ?? (typeof detail === 'string' && detail ? detail : undefined)\n ?? pick('message')\n ?? (res.statusText || 'Request failed');\n if (BILLING_CODES.has(code)) throw new BillingError(res.status, code, message);\n if (res.status === 401) throw new AuthenticationError(message);\n if (res.status === 404) throw new NotFoundError(code, message);\n if (res.status === 429) {\n const retryAfter = Number(res.headers.get('Retry-After'));\n throw new RateLimitError(message, Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : undefined);\n }\n throw new ApiError(res.status, code, message);\n }\n}\n"],"mappings":"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","names":["delay","delay","DEFAULT_BASE_URL"]}
package/dist/widget.d.ts CHANGED
@@ -191,6 +191,87 @@ declare class AgentClient {
191
191
  private _parseSessionInfo;
192
192
  }
193
193
 
194
+ interface OlbrainConfig {
195
+ /** An Olbrain access key, ak_… Give this or getIdToken. */
196
+ apiKey?: string;
197
+ /** Returns the signed-in user's Firebase ID token; called before every request. */
198
+ getIdToken?: () => Promise<string>;
199
+ /** Defaults to https://webhook.olbrain.com */
200
+ baseUrl?: string;
201
+ timeoutMs?: number;
202
+ }
203
+ interface RunSummary {
204
+ total_processed: number;
205
+ successful: number;
206
+ failed: number;
207
+ exceptions: number;
208
+ skipped: number;
209
+ }
210
+ interface Run {
211
+ run_id: string;
212
+ status: string;
213
+ progress_percent?: number;
214
+ started_at?: string | null;
215
+ completed_at?: string | null;
216
+ duration_seconds?: number | null;
217
+ error?: string | null;
218
+ summary?: RunSummary | null;
219
+ [key: string]: unknown;
220
+ }
221
+ interface Approval {
222
+ exception_id: string;
223
+ step_id: string;
224
+ item_id?: string | null;
225
+ data?: Record<string, unknown> | null;
226
+ error: string;
227
+ requires_human_review: boolean;
228
+ blocking: boolean;
229
+ }
230
+ interface ResolveInput {
231
+ exceptionId: string;
232
+ resolution: 'approved' | 'rejected' | 'modified';
233
+ /** Only with resolution "modified". */
234
+ modifiedData?: Record<string, unknown>;
235
+ }
236
+ interface ResolveResult {
237
+ exception_id: string;
238
+ resolution: string;
239
+ all_resolved: boolean;
240
+ resumed: boolean;
241
+ }
242
+ declare class Olbrain {
243
+ private readonly config;
244
+ private readonly baseUrl;
245
+ private readonly timeoutMs;
246
+ constructor(config: OlbrainConfig);
247
+ readonly workflows: {
248
+ run: (agentId: string, input?: {
249
+ payload?: unknown;
250
+ variables?: Record<string, unknown>;
251
+ }) => Promise<{
252
+ runId: string;
253
+ status: string;
254
+ }>;
255
+ };
256
+ readonly runs: {
257
+ list: (agentId: string, opts?: {
258
+ status?: string;
259
+ limit?: number;
260
+ }) => Promise<Run[]>;
261
+ get: (agentId: string, runId: string) => Promise<Run>;
262
+ cancel: (agentId: string, runId: string) => Promise<Record<string, unknown>>;
263
+ pause: (agentId: string, runId: string) => Promise<Record<string, unknown>>;
264
+ retry: (agentId: string, runId: string) => Promise<Record<string, unknown>>;
265
+ resume: (agentId: string, runId: string) => Promise<Record<string, unknown>>;
266
+ };
267
+ readonly approvals: {
268
+ list: (agentId: string, runId: string) => Promise<Approval[]>;
269
+ resolve: (agentId: string, runId: string, input: ResolveInput) => Promise<ResolveResult>;
270
+ };
271
+ private control;
272
+ private request;
273
+ }
274
+
194
275
  /**
195
276
  * Error classes for Olbrain SDK
196
277
  */
@@ -239,13 +320,26 @@ declare class ValidationError extends OlbrainError {
239
320
  declare class StreamingError extends OlbrainError {
240
321
  constructor(message?: string);
241
322
  }
323
+ /** An error the API answered with: its HTTP status and machine-readable code. */
324
+ declare class ApiError extends OlbrainError {
325
+ status: number;
326
+ code: string;
327
+ constructor(status: number, code: string, message: string);
328
+ }
329
+ declare class NotFoundError extends ApiError {
330
+ constructor(code?: string, message?: string);
331
+ }
332
+ /** The organization can't pay for this run (balance, credit limit or subscription). */
333
+ declare class BillingError extends ApiError {
334
+ constructor(status: number, code: string, message: string);
335
+ }
242
336
 
243
337
  /**
244
338
  * Olbrain JavaScript SDK
245
339
  * Main entry point for core API exports
246
340
  */
247
341
 
248
- declare const VERSION = "1.0.0";
342
+ declare const VERSION = "1.2.0";
249
343
 
250
344
  /**
251
345
  * ChatWidget - Ready-to-use chat widget component
@@ -342,4 +436,4 @@ declare class ChatWidget {
342
436
  private _getStoredSessionId;
343
437
  }
344
438
 
345
- export { AgentClient, type AgentConfig, AuthenticationError, type ChatResponse, ChatWidget, type CreateSessionOptions, type ErrorCallback, type Message, type MessageCallback, NetworkError, OlbrainError, RateLimitError, type SendOptions, type SessionInfo, SessionNotFoundError, type SessionStats, type SessionUpdates, type StreamConfig, StreamingError, type TokenUsage, VERSION, ValidationError, type WidgetConfig };
439
+ export { AgentClient, type AgentConfig, ApiError, type Approval, AuthenticationError, BillingError, type ChatResponse, ChatWidget, type CreateSessionOptions, type ErrorCallback, type Message, type MessageCallback, NetworkError, NotFoundError, Olbrain, type OlbrainConfig, OlbrainError, RateLimitError, type ResolveInput, type ResolveResult, type Run, type RunSummary, type SendOptions, type SessionInfo, SessionNotFoundError, type SessionStats, type SessionUpdates, type StreamConfig, StreamingError, type TokenUsage, VERSION, ValidationError, type WidgetConfig };