@olbrain/js-sdk 1.0.0 → 1.0.1

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.
@@ -1604,7 +1604,12 @@ var OlbrainWidget = (() => {
1604
1604
  this.isOpen ? this.close() : this.open();
1605
1605
  this.toggleBtn?.classList.toggle("hidden", this.isOpen);
1606
1606
  });
1607
- this.chatWidget?.querySelector(".olbrain-close-btn")?.addEventListener("click", () => this.close());
1607
+ this.chatWidget?.querySelector(".olbrain-close-btn")?.addEventListener("click", () => {
1608
+ this.close();
1609
+ if (this.toggleBtn) {
1610
+ this.toggleBtn.classList.remove("hidden");
1611
+ }
1612
+ });
1608
1613
  this.sendBtn?.addEventListener("click", () => {
1609
1614
  if (this.messageInput) {
1610
1615
  this.sendMessage(this.messageInput.value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/eventsource/lib/eventsource.js","../src/widget.ts","../src/core/exceptions.ts","../src/core/utils.ts","../src/core/streaming.ts","../src/core/client.ts","../src/index.ts","../src/widget/templates.ts","../src/widget/styles.ts","../src/widget/ChatWidget.ts"],"sourcesContent":["var parse = require('url').parse\nvar events = require('events')\nvar https = require('https')\nvar http = require('http')\nvar util = require('util')\n\nvar httpsOptions = [\n 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers',\n 'rejectUnauthorized', 'secureProtocol', 'servername', 'checkServerIdentity'\n]\n\nvar bom = [239, 187, 191]\nvar colon = 58\nvar space = 32\nvar lineFeed = 10\nvar carriageReturn = 13\n// Beyond 256KB we could not observe any gain in performance\nvar maxBufferAheadAllocation = 1024 * 256\n// Headers matching the pattern should be removed when redirecting to different origin\nvar reUnsafeHeader = /^(cookie|authorization)$/i\n\nfunction hasBom (buf) {\n return bom.every(function (charCode, index) {\n return buf[index] === charCode\n })\n}\n\n/**\n * Creates a new EventSource object\n *\n * @param {String} url the URL to which to connect\n * @param {Object} [eventSourceInitDict] extra init params. See README for details.\n * @api public\n **/\nfunction EventSource (url, eventSourceInitDict) {\n var readyState = EventSource.CONNECTING\n var headers = eventSourceInitDict && eventSourceInitDict.headers\n var hasNewOrigin = false\n Object.defineProperty(this, 'readyState', {\n get: function () {\n return readyState\n }\n })\n\n Object.defineProperty(this, 'url', {\n get: function () {\n return url\n }\n })\n\n var self = this\n self.reconnectInterval = 1000\n self.connectionInProgress = false\n\n function onConnectionClosed (message) {\n if (readyState === EventSource.CLOSED) return\n readyState = EventSource.CONNECTING\n _emit('error', new Event('error', {message: message}))\n\n // The url may have been changed by a temporary redirect. If that's the case,\n // revert it now, and flag that we are no longer pointing to a new origin\n if (reconnectUrl) {\n url = reconnectUrl\n reconnectUrl = null\n hasNewOrigin = false\n }\n setTimeout(function () {\n if (readyState !== EventSource.CONNECTING || self.connectionInProgress) {\n return\n }\n self.connectionInProgress = true\n connect()\n }, self.reconnectInterval)\n }\n\n var req\n var lastEventId = ''\n if (headers && headers['Last-Event-ID']) {\n lastEventId = headers['Last-Event-ID']\n delete headers['Last-Event-ID']\n }\n\n var discardTrailingNewline = false\n var data = ''\n var eventName = ''\n\n var reconnectUrl = null\n\n function connect () {\n var options = parse(url)\n var isSecure = options.protocol === 'https:'\n options.headers = { 'Cache-Control': 'no-cache', 'Accept': 'text/event-stream' }\n if (lastEventId) options.headers['Last-Event-ID'] = lastEventId\n if (headers) {\n var reqHeaders = hasNewOrigin ? removeUnsafeHeaders(headers) : headers\n for (var i in reqHeaders) {\n var header = reqHeaders[i]\n if (header) {\n options.headers[i] = header\n }\n }\n }\n\n // Legacy: this should be specified as `eventSourceInitDict.https.rejectUnauthorized`,\n // but for now exists as a backwards-compatibility layer\n options.rejectUnauthorized = !(eventSourceInitDict && !eventSourceInitDict.rejectUnauthorized)\n\n if (eventSourceInitDict && eventSourceInitDict.createConnection !== undefined) {\n options.createConnection = eventSourceInitDict.createConnection\n }\n\n // If specify http proxy, make the request to sent to the proxy server,\n // and include the original url in path and Host headers\n var useProxy = eventSourceInitDict && eventSourceInitDict.proxy\n if (useProxy) {\n var proxy = parse(eventSourceInitDict.proxy)\n isSecure = proxy.protocol === 'https:'\n\n options.protocol = isSecure ? 'https:' : 'http:'\n options.path = url\n options.headers.Host = options.host\n options.hostname = proxy.hostname\n options.host = proxy.host\n options.port = proxy.port\n }\n\n // If https options are specified, merge them into the request options\n if (eventSourceInitDict && eventSourceInitDict.https) {\n for (var optName in eventSourceInitDict.https) {\n if (httpsOptions.indexOf(optName) === -1) {\n continue\n }\n\n var option = eventSourceInitDict.https[optName]\n if (option !== undefined) {\n options[optName] = option\n }\n }\n }\n\n // Pass this on to the XHR\n if (eventSourceInitDict && eventSourceInitDict.withCredentials !== undefined) {\n options.withCredentials = eventSourceInitDict.withCredentials\n }\n\n req = (isSecure ? https : http).request(options, function (res) {\n self.connectionInProgress = false\n // Handle HTTP errors\n if (res.statusCode === 500 || res.statusCode === 502 || res.statusCode === 503 || res.statusCode === 504) {\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n onConnectionClosed()\n return\n }\n\n // Handle HTTP redirects\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307) {\n var location = res.headers.location\n if (!location) {\n // Server sent redirect response without Location header.\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n return\n }\n var prevOrigin = new URL(url).origin\n var nextOrigin = new URL(location).origin\n hasNewOrigin = prevOrigin !== nextOrigin\n if (res.statusCode === 307) reconnectUrl = url\n url = location\n process.nextTick(connect)\n return\n }\n\n if (res.statusCode !== 200) {\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n return self.close()\n }\n\n readyState = EventSource.OPEN\n res.on('close', function () {\n res.removeAllListeners('close')\n res.removeAllListeners('end')\n onConnectionClosed()\n })\n\n res.on('end', function () {\n res.removeAllListeners('close')\n res.removeAllListeners('end')\n onConnectionClosed()\n })\n _emit('open', new Event('open'))\n\n // text/event-stream parser adapted from webkit's\n // Source/WebCore/page/EventSource.cpp\n var buf\n var newBuffer\n var startingPos = 0\n var startingFieldLength = -1\n var newBufferSize = 0\n var bytesUsed = 0\n\n res.on('data', function (chunk) {\n if (!buf) {\n buf = chunk\n if (hasBom(buf)) {\n buf = buf.slice(bom.length)\n }\n bytesUsed = buf.length\n } else {\n if (chunk.length > buf.length - bytesUsed) {\n newBufferSize = (buf.length * 2) + chunk.length\n if (newBufferSize > maxBufferAheadAllocation) {\n newBufferSize = buf.length + chunk.length + maxBufferAheadAllocation\n }\n newBuffer = Buffer.alloc(newBufferSize)\n buf.copy(newBuffer, 0, 0, bytesUsed)\n buf = newBuffer\n }\n chunk.copy(buf, bytesUsed)\n bytesUsed += chunk.length\n }\n\n var pos = 0\n var length = bytesUsed\n\n while (pos < length) {\n if (discardTrailingNewline) {\n if (buf[pos] === lineFeed) {\n ++pos\n }\n discardTrailingNewline = false\n }\n\n var lineLength = -1\n var fieldLength = startingFieldLength\n var c\n\n for (var i = startingPos; lineLength < 0 && i < length; ++i) {\n c = buf[i]\n if (c === colon) {\n if (fieldLength < 0) {\n fieldLength = i - pos\n }\n } else if (c === carriageReturn) {\n discardTrailingNewline = true\n lineLength = i - pos\n } else if (c === lineFeed) {\n lineLength = i - pos\n }\n }\n\n if (lineLength < 0) {\n startingPos = length - pos\n startingFieldLength = fieldLength\n break\n } else {\n startingPos = 0\n startingFieldLength = -1\n }\n\n parseEventStreamLine(buf, pos, fieldLength, lineLength)\n\n pos += lineLength + 1\n }\n\n if (pos === length) {\n buf = void 0\n bytesUsed = 0\n } else if (pos > 0) {\n buf = buf.slice(pos, bytesUsed)\n bytesUsed = buf.length\n }\n })\n })\n\n req.on('error', function (err) {\n self.connectionInProgress = false\n onConnectionClosed(err.message)\n })\n\n if (req.setNoDelay) req.setNoDelay(true)\n req.end()\n }\n\n connect()\n\n function _emit () {\n if (self.listeners(arguments[0]).length > 0) {\n self.emit.apply(self, arguments)\n }\n }\n\n this._close = function () {\n if (readyState === EventSource.CLOSED) return\n readyState = EventSource.CLOSED\n if (req.abort) req.abort()\n if (req.xhr && req.xhr.abort) req.xhr.abort()\n }\n\n function parseEventStreamLine (buf, pos, fieldLength, lineLength) {\n if (lineLength === 0) {\n if (data.length > 0) {\n var type = eventName || 'message'\n _emit(type, new MessageEvent(type, {\n data: data.slice(0, -1), // remove trailing newline\n lastEventId: lastEventId,\n origin: new URL(url).origin\n }))\n data = ''\n }\n eventName = void 0\n } else if (fieldLength > 0) {\n var noValue = fieldLength < 0\n var step = 0\n var field = buf.slice(pos, pos + (noValue ? lineLength : fieldLength)).toString()\n\n if (noValue) {\n step = lineLength\n } else if (buf[pos + fieldLength + 1] !== space) {\n step = fieldLength + 1\n } else {\n step = fieldLength + 2\n }\n pos += step\n\n var valueLength = lineLength - step\n var value = buf.slice(pos, pos + valueLength).toString()\n\n if (field === 'data') {\n data += value + '\\n'\n } else if (field === 'event') {\n eventName = value\n } else if (field === 'id') {\n lastEventId = value\n } else if (field === 'retry') {\n var retry = parseInt(value, 10)\n if (!Number.isNaN(retry)) {\n self.reconnectInterval = retry\n }\n }\n }\n }\n}\n\nmodule.exports = EventSource\n\nutil.inherits(EventSource, events.EventEmitter)\nEventSource.prototype.constructor = EventSource; // make stacktraces readable\n\n['open', 'error', 'message'].forEach(function (method) {\n Object.defineProperty(EventSource.prototype, 'on' + method, {\n /**\n * Returns the current listener\n *\n * @return {Mixed} the set function or undefined\n * @api private\n */\n get: function get () {\n var listener = this.listeners(method)[0]\n return listener ? (listener._listener ? listener._listener : listener) : undefined\n },\n\n /**\n * Start listening for events\n *\n * @param {Function} listener the listener\n * @return {Mixed} the set function or undefined\n * @api private\n */\n set: function set (listener) {\n this.removeAllListeners(method)\n this.addEventListener(method, listener)\n }\n })\n})\n\n/**\n * Ready states\n */\nObject.defineProperty(EventSource, 'CONNECTING', {enumerable: true, value: 0})\nObject.defineProperty(EventSource, 'OPEN', {enumerable: true, value: 1})\nObject.defineProperty(EventSource, 'CLOSED', {enumerable: true, value: 2})\n\nEventSource.prototype.CONNECTING = 0\nEventSource.prototype.OPEN = 1\nEventSource.prototype.CLOSED = 2\n\n/**\n * Closes the connection, if one is made, and sets the readyState attribute to 2 (closed)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventSource/close\n * @api public\n */\nEventSource.prototype.close = function () {\n this._close()\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using addEventListener.\n *\n * @param {String} type A string representing the event type to listen out for\n * @param {Function} listener callback\n * @see https://developer.mozilla.org/en/DOM/element.addEventListener\n * @see http://dev.w3.org/html5/websockets/#the-websocket-interface\n * @api public\n */\nEventSource.prototype.addEventListener = function addEventListener (type, listener) {\n if (typeof listener === 'function') {\n // store a reference so we can return the original function again\n listener._listener = listener\n this.on(type, listener)\n }\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using dispatchEvent.\n *\n * @param {Event} event An event to be dispatched\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent\n * @api public\n */\nEventSource.prototype.dispatchEvent = function dispatchEvent (event) {\n if (!event.type) {\n throw new Error('UNSPECIFIED_EVENT_TYPE_ERR')\n }\n // if event is instance of an CustomEvent (or has 'details' property),\n // send the detail object as the payload for the event\n this.emit(event.type, event.detail)\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using removeEventListener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {Function} listener callback\n * @see https://developer.mozilla.org/en/DOM/element.removeEventListener\n * @see http://dev.w3.org/html5/websockets/#the-websocket-interface\n * @api public\n */\nEventSource.prototype.removeEventListener = function removeEventListener (type, listener) {\n if (typeof listener === 'function') {\n listener._listener = undefined\n this.removeListener(type, listener)\n }\n}\n\n/**\n * W3C Event\n *\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#interface-Event\n * @api private\n */\nfunction Event (type, optionalProperties) {\n Object.defineProperty(this, 'type', { writable: false, value: type, enumerable: true })\n if (optionalProperties) {\n for (var f in optionalProperties) {\n if (optionalProperties.hasOwnProperty(f)) {\n Object.defineProperty(this, f, { writable: false, value: optionalProperties[f], enumerable: true })\n }\n }\n }\n}\n\n/**\n * W3C MessageEvent\n *\n * @see http://www.w3.org/TR/webmessaging/#event-definitions\n * @api private\n */\nfunction MessageEvent (type, eventInitDict) {\n Object.defineProperty(this, 'type', { writable: false, value: type, enumerable: true })\n for (var f in eventInitDict) {\n if (eventInitDict.hasOwnProperty(f)) {\n Object.defineProperty(this, f, { writable: false, value: eventInitDict[f], enumerable: true })\n }\n }\n}\n\n/**\n * Returns a new object of headers that does not include any authorization and cookie headers\n *\n * @param {Object} headers An object of headers ({[headerName]: headerValue})\n * @return {Object} a new object of headers\n * @api private\n */\nfunction removeUnsafeHeaders (headers) {\n var safe = {}\n for (var key in headers) {\n if (reUnsafeHeader.test(key)) {\n continue\n }\n\n safe[key] = headers[key]\n }\n\n return safe\n}\n","/**\n * Olbrain JavaScript SDK - Widget Entry Point\n * Exports both ChatWidget component and core API\n */\n\n// Export everything from core\nexport * from './index';\n\n// Export widget\nexport { ChatWidget } from './widget/ChatWidget';\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","/**\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 * 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 * HTML templates for the chat widget\n */\n\nexport interface TemplateConfig {\n title: string;\n greeting: string;\n placeholder: string;\n theme: 'light' | 'dark' | 'auto';\n}\n\n/**\n * Main widget container template\n */\nexport function widgetContainerTemplate(config: TemplateConfig): string {\n const theme = config.theme === 'auto' ? 'light' : config.theme;\n return `\n <div class=\"olbrain-widget-container\" data-theme=\"${theme}\">\n <div class=\"olbrain-chat-widget\">\n <div class=\"olbrain-chat-header\">\n <div class=\"olbrain-chat-title\">${escapeHtml(config.title)}</div>\n <button class=\"olbrain-close-btn\" aria-label=\"Close chat\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M15.898 4.045l-5.307 5.307 5.307 5.307c.39.39.39 1.025 0 1.415-.195.195-.45.292-.707.292-.257 0-.512-.097-.707-.292l-5.307-5.307-5.307 5.307c-.195.195-.45.292-.707.292-.257 0-.512-.097-.707-.292-.39-.39-.39-1.025 0-1.415l5.307-5.307-5.307-5.307c-.39-.39-.39-1.025 0-1.415.39-.39 1.025-.39 1.415 0l5.307 5.307 5.307-5.307c.39-.39 1.025-.39 1.415 0 .39.39.39 1.025 0 1.415z\"/>\n </svg>\n </button>\n </div>\n <div class=\"olbrain-messages-container\"></div>\n <div class=\"olbrain-input-area\">\n <input\n type=\"text\"\n class=\"olbrain-message-input\"\n placeholder=\"${escapeHtml(config.placeholder)}\"\n aria-label=\"Message input\"\n />\n <button class=\"olbrain-send-btn\" aria-label=\"Send message\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M16.6915026,12.4744748 L3.50612381,13.2599618 C3.19218622,13.2599618 3.03521743,13.4170592 3.03521743,13.5741566 L1.15159189,17.8274344 C0.8376543,18.6129214 0.99,19.3984083 1.77946707,20 C2.41,20.52 3.50612381,20.3429026 4.13399899,20.0274254 L21.714504,3.40596059 C22.6563168,2.59128963 22.6563168,0.9563 21.714504,0.1416 L4.13399899,-0.4800539 C3.50612381,-0.4800539 2.40880848,0.0729863 1.77946707,0.7844625 C0.994041701,1.5699495 0.837158534,2.35644751 1.15159189,3.1419345 L3.03521743,7.39521227 C3.03521743,7.55230969 3.34915502,7.70940711 3.50612381,7.70940711 L16.6915026,8.49489406 C16.6915026,8.49489406 17.1272231,8.49489406 17.1272231,8.99410899 L17.1272231,11.8231405 C17.1272231,12.3223555 16.6915026,12.4744748 16.6915026,12.4744748 Z\"/>\n </svg>\n </button>\n </div>\n </div>\n <button class=\"olbrain-toggle-btn\" aria-label=\"Toggle chat widget\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/>\n </svg>\n </button>\n </div>\n `;\n}\n\n/**\n * User message template\n */\nexport function userMessageTemplate(content: string, timestamp: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-user\">\n <div class=\"olbrain-message-content\">${escapeHtml(content)}</div>\n <div class=\"olbrain-message-time\">${formatTime(timestamp)}</div>\n </div>\n `;\n}\n\n/**\n * Assistant message template\n */\nexport function assistantMessageTemplate(content: string, timestamp: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-assistant\">\n <div class=\"olbrain-message-content\">${escapeHtml(content)}</div>\n <div class=\"olbrain-message-time\">${formatTime(timestamp)}</div>\n </div>\n `;\n}\n\n/**\n * Typing indicator template\n */\nexport function typingIndicatorTemplate(): string {\n return `\n <div class=\"olbrain-message olbrain-message-assistant\">\n <div class=\"olbrain-typing-indicator\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </div>\n `;\n}\n\n/**\n * Error message template\n */\nexport function errorMessageTemplate(error: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-error\">\n <div class=\"olbrain-message-content\">Error: ${escapeHtml(error)}</div>\n </div>\n `;\n}\n\n/**\n * Welcome/greeting template\n */\nexport function greetingTemplate(greeting: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-greeting\">\n <div class=\"olbrain-message-content\">${escapeHtml(greeting)}</div>\n </div>\n `;\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nfunction escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Format timestamp to readable time\n */\nfunction formatTime(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${hours}:${minutes}`;\n } catch {\n return '';\n }\n}\n","/**\n * CSS styles for the chat widget\n * Exported as a string to be injected dynamically (no external stylesheet needed)\n */\n\nexport interface StyleConfig {\n primaryColor: string;\n theme: 'light' | 'dark' | 'auto';\n}\n\n/**\n * Generate widget CSS with customizable colors\n */\nexport function generateStyles(config: StyleConfig): string {\n const primary = config.primaryColor || '#4f46e5';\n const isDark = config.theme === 'dark';\n\n const bgColor = isDark ? '#1f2937' : '#ffffff';\n const textColor = isDark ? '#f3f4f6' : '#111827';\n const borderColor = isDark ? '#374151' : '#e5e7eb';\n const hoverBg = isDark ? '#111827' : '#f9fafb';\n\n return `\n .olbrain-widget-container {\n --primary-color: ${primary};\n --bg-color: ${bgColor};\n --text-color: ${textColor};\n --border-color: ${borderColor};\n --hover-bg: ${hoverBg};\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .olbrain-widget-container * {\n box-sizing: border-box;\n }\n\n .olbrain-widget-container[data-theme=\"dark\"] {\n color-scheme: dark;\n }\n\n .olbrain-widget-container[data-theme=\"light\"] {\n color-scheme: light;\n }\n\n /* Toggle Button */\n .olbrain-toggle-btn {\n position: fixed;\n bottom: 24px;\n right: 24px;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background-color: var(--primary-color);\n border: none;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transition: all 0.3s ease;\n z-index: 999999;\n }\n\n .olbrain-toggle-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n }\n\n .olbrain-toggle-btn:active {\n transform: scale(0.95);\n }\n\n .olbrain-toggle-btn.hidden {\n display: none;\n }\n\n /* Chat Widget Container */\n .olbrain-chat-widget {\n position: fixed;\n bottom: 100px;\n right: 24px;\n width: 420px;\n max-width: calc(100vw - 32px);\n height: 600px;\n max-height: calc(100vh - 140px);\n background-color: var(--bg-color);\n border-radius: 12px;\n box-shadow: 0 5px 40px rgba(0, 0, 0, 0.16);\n display: flex;\n flex-direction: column;\n z-index: 999998;\n animation: slideUp 0.3s ease;\n opacity: 0;\n pointer-events: none;\n transform: translateY(20px);\n }\n\n .olbrain-chat-widget.open {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0);\n }\n\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Chat Header */\n .olbrain-chat-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--border-color);\n border-radius: 12px 12px 0 0;\n background: linear-gradient(135deg, var(--primary-color), color-mix(in srgb, var(--primary-color) 80%, black));\n color: white;\n }\n\n .olbrain-chat-title {\n font-size: 16px;\n font-weight: 600;\n }\n\n .olbrain-close-btn {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .olbrain-close-btn:hover {\n background-color: rgba(255, 255, 255, 0.2);\n }\n\n /* Messages Container */\n .olbrain-messages-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background-color: var(--bg-color);\n }\n\n .olbrain-messages-container::-webkit-scrollbar {\n width: 6px;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-thumb {\n background: var(--border-color);\n border-radius: 3px;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--border-color) 80%, black);\n }\n\n /* Message */\n .olbrain-message {\n display: flex;\n flex-direction: column;\n gap: 4px;\n animation: fadeIn 0.3s ease;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .olbrain-message-content {\n max-width: 85%;\n padding: 12px 16px;\n border-radius: 8px;\n word-wrap: break-word;\n line-height: 1.4;\n font-size: 14px;\n }\n\n /* User Message */\n .olbrain-message-user .olbrain-message-content {\n background-color: var(--primary-color);\n color: white;\n align-self: flex-end;\n border-radius: 18px 18px 4px 18px;\n }\n\n /* Assistant Message */\n .olbrain-message-assistant .olbrain-message-content {\n background-color: var(--hover-bg);\n color: var(--text-color);\n align-self: flex-start;\n border-radius: 18px 18px 18px 4px;\n }\n\n /* Greeting Message */\n .olbrain-message-greeting .olbrain-message-content {\n background-color: transparent;\n color: var(--text-color);\n align-self: center;\n font-style: italic;\n opacity: 0.7;\n padding: 8px 12px;\n }\n\n /* Error Message */\n .olbrain-message-error .olbrain-message-content {\n background-color: #fee;\n color: #c33;\n align-self: flex-start;\n }\n\n .olbrain-message-time {\n font-size: 12px;\n color: var(--text-color);\n opacity: 0.6;\n padding: 0 16px;\n }\n\n /* Typing Indicator */\n .olbrain-typing-indicator {\n display: flex;\n gap: 4px;\n padding: 12px 16px;\n }\n\n .olbrain-typing-indicator span {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: var(--text-color);\n opacity: 0.4;\n animation: typing 1.4s infinite;\n }\n\n .olbrain-typing-indicator span:nth-child(2) {\n animation-delay: 0.2s;\n }\n\n .olbrain-typing-indicator span:nth-child(3) {\n animation-delay: 0.4s;\n }\n\n @keyframes typing {\n 0%, 60%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 30% {\n opacity: 1;\n transform: translateY(-10px);\n }\n }\n\n /* Input Area */\n .olbrain-input-area {\n display: flex;\n gap: 8px;\n padding: 16px;\n border-top: 1px solid var(--border-color);\n background-color: var(--bg-color);\n border-radius: 0 0 12px 12px;\n }\n\n .olbrain-message-input {\n flex: 1;\n border: 1px solid var(--border-color);\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 14px;\n font-family: inherit;\n background-color: var(--hover-bg);\n color: var(--text-color);\n transition: border-color 0.2s;\n }\n\n .olbrain-message-input:focus {\n outline: none;\n border-color: var(--primary-color);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 20%, transparent);\n }\n\n .olbrain-message-input::placeholder {\n color: var(--text-color);\n opacity: 0.5;\n }\n\n .olbrain-send-btn {\n background-color: var(--primary-color);\n border: none;\n color: white;\n border-radius: 8px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .olbrain-send-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--primary-color) 30%, transparent);\n }\n\n .olbrain-send-btn:active {\n transform: scale(0.95);\n }\n\n .olbrain-send-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Mobile Responsive */\n @media (max-width: 480px) {\n .olbrain-chat-widget {\n width: calc(100vw - 32px);\n height: calc(100vh - 140px);\n bottom: 100px;\n right: 16px;\n border-radius: 8px;\n }\n\n .olbrain-toggle-btn {\n width: 48px;\n height: 48px;\n bottom: 20px;\n right: 16px;\n }\n\n .olbrain-message-content {\n max-width: 90%;\n }\n }\n `;\n}\n","/**\n * ChatWidget - Ready-to-use chat widget component\n * Combines AgentClient with UI for one-line integration\n */\n\nimport { AgentClient } from '../core/client';\nimport { WidgetConfig, Message } from '../core/types';\nimport {\n widgetContainerTemplate,\n userMessageTemplate,\n assistantMessageTemplate,\n typingIndicatorTemplate,\n errorMessageTemplate,\n greetingTemplate,\n} from './templates';\nimport { generateStyles } from './styles';\n\nconst DEFAULT_GREETING = 'Hi! How can I help you today?';\nconst DEFAULT_TITLE = 'Chat with us';\nconst DEFAULT_PLACEHOLDER = 'Type your message...';\nconst DEFAULT_PRIMARY_COLOR = '#4f46e5';\nconst SESSION_STORAGE_KEY = 'olbrain_widget_session_id';\n\n/**\n * Ready-to-use chat widget for websites\n */\nexport class ChatWidget {\n private config: Required<WidgetConfig>;\n private client: AgentClient;\n private sessionId: string | null = null;\n private container: HTMLElement | null = null;\n private chatWidget: HTMLElement | null = null;\n private toggleBtn: HTMLElement | null = null;\n private messagesContainer: HTMLElement | null = null;\n private messageInput: HTMLInputElement | null = null;\n private sendBtn: HTMLButtonElement | null = null;\n private isOpen: boolean = false;\n private isWaitingForResponse: boolean = false;\n\n constructor(config: WidgetConfig) {\n this.config = this._normalizeConfig(config);\n this.client = new AgentClient({\n agentId: config.agentId,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n }\n\n /**\n * Mount widget to the page\n */\n async mount(target?: HTMLElement | string): Promise<void> {\n // Load styles\n this._injectStyles();\n\n // Find or create container\n if (target) {\n if (typeof target === 'string') {\n this.container = document.querySelector(target);\n if (!this.container) {\n throw new Error(`Element with selector \"${target}\" not found`);\n }\n } else {\n this.container = target;\n }\n } else {\n this.container = document.body;\n }\n\n // Render widget\n this._render();\n this._attachEventListeners();\n\n // Load or create session\n await this._initializeSession();\n\n // Show greeting message\n this._showGreeting();\n\n // Auto-open if configured\n if (this.config.autoOpen) {\n this.open();\n }\n }\n\n /**\n * Unmount widget from the page\n */\n unmount(): void {\n this.client.stopListening(this.sessionId || '');\n this.client.close();\n\n if (this.container) {\n const wrapper = this.container.querySelector('.olbrain-widget-container');\n if (wrapper) {\n wrapper.remove();\n }\n }\n\n this.container = null;\n }\n\n /**\n * Open chat window\n */\n open(): void {\n if (this.chatWidget) {\n this.chatWidget.classList.add('open');\n this.isOpen = true;\n if (this.messageInput) {\n this.messageInput.focus();\n }\n }\n }\n\n /**\n * Close chat window\n */\n close(): void {\n if (this.chatWidget) {\n this.chatWidget.classList.remove('open');\n this.isOpen = false;\n }\n }\n\n /**\n * Send a message\n */\n async sendMessage(text: string): Promise<void> {\n if (!text.trim() || !this.sessionId || this.isWaitingForResponse) {\n return;\n }\n\n // Add user message to UI\n this._addMessageToUI(text, 'user');\n\n // Clear input\n if (this.messageInput) {\n this.messageInput.value = '';\n }\n\n this.isWaitingForResponse = true;\n\n try {\n // Show typing indicator\n this._showTypingIndicator();\n\n // Send message and get response\n const response = await this.client.sendAndWait(this.sessionId, text);\n\n // Remove typing indicator\n this._removeTypingIndicator();\n\n if (response.success && response.text) {\n this._addMessageToUI(response.text, 'assistant');\n } else if (response.error) {\n this._showError(response.error);\n }\n } catch (error) {\n this._removeTypingIndicator();\n this._showError((error as Error).message);\n } finally {\n this.isWaitingForResponse = false;\n }\n }\n\n /**\n * Normalize configuration with defaults\n */\n private _normalizeConfig(config: WidgetConfig): Required<WidgetConfig> {\n return {\n agentId: config.agentId,\n apiKey: config.apiKey,\n position: config.position || 'bottom-right',\n theme: config.theme || 'auto',\n primaryColor: config.primaryColor || DEFAULT_PRIMARY_COLOR,\n title: config.title || DEFAULT_TITLE,\n greeting: config.greeting || DEFAULT_GREETING,\n placeholder: config.placeholder || DEFAULT_PLACEHOLDER,\n autoOpen: config.autoOpen ?? false,\n persistSession: config.persistSession ?? true,\n target: config.target || document.body,\n onMessage: config.onMessage || (() => {}),\n baseUrl: config.baseUrl || '',\n };\n }\n\n /**\n * Inject widget styles into the page\n */\n private _injectStyles(): void {\n // Check if styles already injected\n if (document.getElementById('olbrain-widget-styles')) {\n return;\n }\n\n const styleEl = document.createElement('style');\n styleEl.id = 'olbrain-widget-styles';\n styleEl.textContent = generateStyles({\n primaryColor: this.config.primaryColor,\n theme: this.config.theme,\n });\n\n document.head.appendChild(styleEl);\n }\n\n /**\n * Render widget HTML\n */\n private _render(): void {\n if (!this.container) return;\n\n const html = widgetContainerTemplate({\n title: this.config.title,\n greeting: this.config.greeting,\n placeholder: this.config.placeholder,\n theme: this.config.theme,\n });\n\n this.container.insertAdjacentHTML('beforeend', html);\n\n // Get references to widget elements\n const wrapper = this.container.querySelector('.olbrain-widget-container');\n if (wrapper) {\n this.chatWidget = wrapper.querySelector('.olbrain-chat-widget');\n this.toggleBtn = wrapper.querySelector('.olbrain-toggle-btn');\n this.messagesContainer = wrapper.querySelector('.olbrain-messages-container');\n this.messageInput = wrapper.querySelector('.olbrain-message-input');\n this.sendBtn = wrapper.querySelector('.olbrain-send-btn');\n }\n }\n\n /**\n * Attach event listeners\n */\n private _attachEventListeners(): void {\n // Toggle button\n this.toggleBtn?.addEventListener('click', () => {\n this.isOpen ? this.close() : this.open();\n this.toggleBtn?.classList.toggle('hidden', this.isOpen);\n });\n\n // Close button\n this.chatWidget\n ?.querySelector('.olbrain-close-btn')\n ?.addEventListener('click', () => this.close());\n\n // Send button\n this.sendBtn?.addEventListener('click', () => {\n if (this.messageInput) {\n this.sendMessage(this.messageInput.value);\n }\n });\n\n // Message input enter key\n this.messageInput?.addEventListener('keypress', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (this.messageInput) {\n this.sendMessage(this.messageInput.value);\n }\n }\n });\n\n // Disable send button while waiting\n this.messageInput?.addEventListener('input', () => {\n if (this.sendBtn) {\n this.sendBtn.disabled = this.isWaitingForResponse;\n }\n });\n }\n\n /**\n * Initialize session (load or create)\n */\n private async _initializeSession(): Promise<void> {\n // Try to load saved session\n if (this.config.persistSession) {\n const savedSessionId = this._getStoredSessionId();\n if (savedSessionId) {\n try {\n await this.client.getSession(savedSessionId);\n this.sessionId = savedSessionId;\n return;\n } catch {\n // Session invalid, create new one\n }\n }\n }\n\n // Create new session\n try {\n this.sessionId = await this.client.createSession({\n title: 'Widget Chat Session',\n metadata: {\n source: 'chat_widget',\n },\n });\n\n if (this.config.persistSession) {\n this._storeSessionId(this.sessionId);\n }\n } catch (error) {\n this._showError(`Failed to create session: ${(error as Error).message}`);\n }\n }\n\n /**\n * Show greeting message\n */\n private _showGreeting(): void {\n if (this.messagesContainer) {\n const html = greetingTemplate(this.config.greeting);\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n }\n\n /**\n * Add message to UI\n */\n private _addMessageToUI(content: string, role: 'user' | 'assistant'): void {\n if (!this.messagesContainer) return;\n\n const timestamp = new Date().toISOString();\n const html =\n role === 'user'\n ? userMessageTemplate(content, timestamp)\n : assistantMessageTemplate(content, timestamp);\n\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n\n // Call custom callback if provided\n if (this.config.onMessage) {\n this.config.onMessage({\n role,\n content,\n timestamp,\n metadata: {},\n });\n }\n }\n\n /**\n * Show typing indicator\n */\n private _showTypingIndicator(): void {\n if (!this.messagesContainer) return;\n\n const html = typingIndicatorTemplate();\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n\n /**\n * Remove typing indicator\n */\n private _removeTypingIndicator(): void {\n const indicator = this.messagesContainer?.querySelector('.olbrain-typing-indicator');\n if (indicator) {\n indicator.closest('.olbrain-message')?.remove();\n }\n }\n\n /**\n * Show error message\n */\n private _showError(error: string): void {\n if (!this.messagesContainer) return;\n\n const html = errorMessageTemplate(error);\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n\n /**\n * Scroll to bottom of messages\n */\n private _scrollToBottom(): void {\n if (this.messagesContainer) {\n setTimeout(() => {\n this.messagesContainer!.scrollTop = this.messagesContainer!.scrollHeight;\n }, 0);\n }\n }\n\n /**\n * Store session ID in localStorage\n */\n private _storeSessionId(sessionId: string): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(SESSION_STORAGE_KEY, sessionId);\n }\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Get stored session ID from localStorage\n */\n private _getStoredSessionId(): string | null {\n try {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem(SESSION_STORAGE_KEY);\n }\n } catch {\n // localStorage not available\n }\n return null;\n }\n}\n"],"mappings":"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ACZ,OAAO;AAAA,sBACL,SAAS;AAAA,wBACP,WAAW;AAAA,oBACf,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["EventSource","i","delay","delay"]}
1
+ {"version":3,"sources":["../node_modules/eventsource/lib/eventsource.js","../src/widget.ts","../src/core/exceptions.ts","../src/core/utils.ts","../src/core/streaming.ts","../src/core/client.ts","../src/index.ts","../src/widget/templates.ts","../src/widget/styles.ts","../src/widget/ChatWidget.ts"],"sourcesContent":["var parse = require('url').parse\nvar events = require('events')\nvar https = require('https')\nvar http = require('http')\nvar util = require('util')\n\nvar httpsOptions = [\n 'pfx', 'key', 'passphrase', 'cert', 'ca', 'ciphers',\n 'rejectUnauthorized', 'secureProtocol', 'servername', 'checkServerIdentity'\n]\n\nvar bom = [239, 187, 191]\nvar colon = 58\nvar space = 32\nvar lineFeed = 10\nvar carriageReturn = 13\n// Beyond 256KB we could not observe any gain in performance\nvar maxBufferAheadAllocation = 1024 * 256\n// Headers matching the pattern should be removed when redirecting to different origin\nvar reUnsafeHeader = /^(cookie|authorization)$/i\n\nfunction hasBom (buf) {\n return bom.every(function (charCode, index) {\n return buf[index] === charCode\n })\n}\n\n/**\n * Creates a new EventSource object\n *\n * @param {String} url the URL to which to connect\n * @param {Object} [eventSourceInitDict] extra init params. See README for details.\n * @api public\n **/\nfunction EventSource (url, eventSourceInitDict) {\n var readyState = EventSource.CONNECTING\n var headers = eventSourceInitDict && eventSourceInitDict.headers\n var hasNewOrigin = false\n Object.defineProperty(this, 'readyState', {\n get: function () {\n return readyState\n }\n })\n\n Object.defineProperty(this, 'url', {\n get: function () {\n return url\n }\n })\n\n var self = this\n self.reconnectInterval = 1000\n self.connectionInProgress = false\n\n function onConnectionClosed (message) {\n if (readyState === EventSource.CLOSED) return\n readyState = EventSource.CONNECTING\n _emit('error', new Event('error', {message: message}))\n\n // The url may have been changed by a temporary redirect. If that's the case,\n // revert it now, and flag that we are no longer pointing to a new origin\n if (reconnectUrl) {\n url = reconnectUrl\n reconnectUrl = null\n hasNewOrigin = false\n }\n setTimeout(function () {\n if (readyState !== EventSource.CONNECTING || self.connectionInProgress) {\n return\n }\n self.connectionInProgress = true\n connect()\n }, self.reconnectInterval)\n }\n\n var req\n var lastEventId = ''\n if (headers && headers['Last-Event-ID']) {\n lastEventId = headers['Last-Event-ID']\n delete headers['Last-Event-ID']\n }\n\n var discardTrailingNewline = false\n var data = ''\n var eventName = ''\n\n var reconnectUrl = null\n\n function connect () {\n var options = parse(url)\n var isSecure = options.protocol === 'https:'\n options.headers = { 'Cache-Control': 'no-cache', 'Accept': 'text/event-stream' }\n if (lastEventId) options.headers['Last-Event-ID'] = lastEventId\n if (headers) {\n var reqHeaders = hasNewOrigin ? removeUnsafeHeaders(headers) : headers\n for (var i in reqHeaders) {\n var header = reqHeaders[i]\n if (header) {\n options.headers[i] = header\n }\n }\n }\n\n // Legacy: this should be specified as `eventSourceInitDict.https.rejectUnauthorized`,\n // but for now exists as a backwards-compatibility layer\n options.rejectUnauthorized = !(eventSourceInitDict && !eventSourceInitDict.rejectUnauthorized)\n\n if (eventSourceInitDict && eventSourceInitDict.createConnection !== undefined) {\n options.createConnection = eventSourceInitDict.createConnection\n }\n\n // If specify http proxy, make the request to sent to the proxy server,\n // and include the original url in path and Host headers\n var useProxy = eventSourceInitDict && eventSourceInitDict.proxy\n if (useProxy) {\n var proxy = parse(eventSourceInitDict.proxy)\n isSecure = proxy.protocol === 'https:'\n\n options.protocol = isSecure ? 'https:' : 'http:'\n options.path = url\n options.headers.Host = options.host\n options.hostname = proxy.hostname\n options.host = proxy.host\n options.port = proxy.port\n }\n\n // If https options are specified, merge them into the request options\n if (eventSourceInitDict && eventSourceInitDict.https) {\n for (var optName in eventSourceInitDict.https) {\n if (httpsOptions.indexOf(optName) === -1) {\n continue\n }\n\n var option = eventSourceInitDict.https[optName]\n if (option !== undefined) {\n options[optName] = option\n }\n }\n }\n\n // Pass this on to the XHR\n if (eventSourceInitDict && eventSourceInitDict.withCredentials !== undefined) {\n options.withCredentials = eventSourceInitDict.withCredentials\n }\n\n req = (isSecure ? https : http).request(options, function (res) {\n self.connectionInProgress = false\n // Handle HTTP errors\n if (res.statusCode === 500 || res.statusCode === 502 || res.statusCode === 503 || res.statusCode === 504) {\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n onConnectionClosed()\n return\n }\n\n // Handle HTTP redirects\n if (res.statusCode === 301 || res.statusCode === 302 || res.statusCode === 307) {\n var location = res.headers.location\n if (!location) {\n // Server sent redirect response without Location header.\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n return\n }\n var prevOrigin = new URL(url).origin\n var nextOrigin = new URL(location).origin\n hasNewOrigin = prevOrigin !== nextOrigin\n if (res.statusCode === 307) reconnectUrl = url\n url = location\n process.nextTick(connect)\n return\n }\n\n if (res.statusCode !== 200) {\n _emit('error', new Event('error', {status: res.statusCode, message: res.statusMessage}))\n return self.close()\n }\n\n readyState = EventSource.OPEN\n res.on('close', function () {\n res.removeAllListeners('close')\n res.removeAllListeners('end')\n onConnectionClosed()\n })\n\n res.on('end', function () {\n res.removeAllListeners('close')\n res.removeAllListeners('end')\n onConnectionClosed()\n })\n _emit('open', new Event('open'))\n\n // text/event-stream parser adapted from webkit's\n // Source/WebCore/page/EventSource.cpp\n var buf\n var newBuffer\n var startingPos = 0\n var startingFieldLength = -1\n var newBufferSize = 0\n var bytesUsed = 0\n\n res.on('data', function (chunk) {\n if (!buf) {\n buf = chunk\n if (hasBom(buf)) {\n buf = buf.slice(bom.length)\n }\n bytesUsed = buf.length\n } else {\n if (chunk.length > buf.length - bytesUsed) {\n newBufferSize = (buf.length * 2) + chunk.length\n if (newBufferSize > maxBufferAheadAllocation) {\n newBufferSize = buf.length + chunk.length + maxBufferAheadAllocation\n }\n newBuffer = Buffer.alloc(newBufferSize)\n buf.copy(newBuffer, 0, 0, bytesUsed)\n buf = newBuffer\n }\n chunk.copy(buf, bytesUsed)\n bytesUsed += chunk.length\n }\n\n var pos = 0\n var length = bytesUsed\n\n while (pos < length) {\n if (discardTrailingNewline) {\n if (buf[pos] === lineFeed) {\n ++pos\n }\n discardTrailingNewline = false\n }\n\n var lineLength = -1\n var fieldLength = startingFieldLength\n var c\n\n for (var i = startingPos; lineLength < 0 && i < length; ++i) {\n c = buf[i]\n if (c === colon) {\n if (fieldLength < 0) {\n fieldLength = i - pos\n }\n } else if (c === carriageReturn) {\n discardTrailingNewline = true\n lineLength = i - pos\n } else if (c === lineFeed) {\n lineLength = i - pos\n }\n }\n\n if (lineLength < 0) {\n startingPos = length - pos\n startingFieldLength = fieldLength\n break\n } else {\n startingPos = 0\n startingFieldLength = -1\n }\n\n parseEventStreamLine(buf, pos, fieldLength, lineLength)\n\n pos += lineLength + 1\n }\n\n if (pos === length) {\n buf = void 0\n bytesUsed = 0\n } else if (pos > 0) {\n buf = buf.slice(pos, bytesUsed)\n bytesUsed = buf.length\n }\n })\n })\n\n req.on('error', function (err) {\n self.connectionInProgress = false\n onConnectionClosed(err.message)\n })\n\n if (req.setNoDelay) req.setNoDelay(true)\n req.end()\n }\n\n connect()\n\n function _emit () {\n if (self.listeners(arguments[0]).length > 0) {\n self.emit.apply(self, arguments)\n }\n }\n\n this._close = function () {\n if (readyState === EventSource.CLOSED) return\n readyState = EventSource.CLOSED\n if (req.abort) req.abort()\n if (req.xhr && req.xhr.abort) req.xhr.abort()\n }\n\n function parseEventStreamLine (buf, pos, fieldLength, lineLength) {\n if (lineLength === 0) {\n if (data.length > 0) {\n var type = eventName || 'message'\n _emit(type, new MessageEvent(type, {\n data: data.slice(0, -1), // remove trailing newline\n lastEventId: lastEventId,\n origin: new URL(url).origin\n }))\n data = ''\n }\n eventName = void 0\n } else if (fieldLength > 0) {\n var noValue = fieldLength < 0\n var step = 0\n var field = buf.slice(pos, pos + (noValue ? lineLength : fieldLength)).toString()\n\n if (noValue) {\n step = lineLength\n } else if (buf[pos + fieldLength + 1] !== space) {\n step = fieldLength + 1\n } else {\n step = fieldLength + 2\n }\n pos += step\n\n var valueLength = lineLength - step\n var value = buf.slice(pos, pos + valueLength).toString()\n\n if (field === 'data') {\n data += value + '\\n'\n } else if (field === 'event') {\n eventName = value\n } else if (field === 'id') {\n lastEventId = value\n } else if (field === 'retry') {\n var retry = parseInt(value, 10)\n if (!Number.isNaN(retry)) {\n self.reconnectInterval = retry\n }\n }\n }\n }\n}\n\nmodule.exports = EventSource\n\nutil.inherits(EventSource, events.EventEmitter)\nEventSource.prototype.constructor = EventSource; // make stacktraces readable\n\n['open', 'error', 'message'].forEach(function (method) {\n Object.defineProperty(EventSource.prototype, 'on' + method, {\n /**\n * Returns the current listener\n *\n * @return {Mixed} the set function or undefined\n * @api private\n */\n get: function get () {\n var listener = this.listeners(method)[0]\n return listener ? (listener._listener ? listener._listener : listener) : undefined\n },\n\n /**\n * Start listening for events\n *\n * @param {Function} listener the listener\n * @return {Mixed} the set function or undefined\n * @api private\n */\n set: function set (listener) {\n this.removeAllListeners(method)\n this.addEventListener(method, listener)\n }\n })\n})\n\n/**\n * Ready states\n */\nObject.defineProperty(EventSource, 'CONNECTING', {enumerable: true, value: 0})\nObject.defineProperty(EventSource, 'OPEN', {enumerable: true, value: 1})\nObject.defineProperty(EventSource, 'CLOSED', {enumerable: true, value: 2})\n\nEventSource.prototype.CONNECTING = 0\nEventSource.prototype.OPEN = 1\nEventSource.prototype.CLOSED = 2\n\n/**\n * Closes the connection, if one is made, and sets the readyState attribute to 2 (closed)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventSource/close\n * @api public\n */\nEventSource.prototype.close = function () {\n this._close()\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using addEventListener.\n *\n * @param {String} type A string representing the event type to listen out for\n * @param {Function} listener callback\n * @see https://developer.mozilla.org/en/DOM/element.addEventListener\n * @see http://dev.w3.org/html5/websockets/#the-websocket-interface\n * @api public\n */\nEventSource.prototype.addEventListener = function addEventListener (type, listener) {\n if (typeof listener === 'function') {\n // store a reference so we can return the original function again\n listener._listener = listener\n this.on(type, listener)\n }\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using dispatchEvent.\n *\n * @param {Event} event An event to be dispatched\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent\n * @api public\n */\nEventSource.prototype.dispatchEvent = function dispatchEvent (event) {\n if (!event.type) {\n throw new Error('UNSPECIFIED_EVENT_TYPE_ERR')\n }\n // if event is instance of an CustomEvent (or has 'details' property),\n // send the detail object as the payload for the event\n this.emit(event.type, event.detail)\n}\n\n/**\n * Emulates the W3C Browser based WebSocket interface using removeEventListener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {Function} listener callback\n * @see https://developer.mozilla.org/en/DOM/element.removeEventListener\n * @see http://dev.w3.org/html5/websockets/#the-websocket-interface\n * @api public\n */\nEventSource.prototype.removeEventListener = function removeEventListener (type, listener) {\n if (typeof listener === 'function') {\n listener._listener = undefined\n this.removeListener(type, listener)\n }\n}\n\n/**\n * W3C Event\n *\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#interface-Event\n * @api private\n */\nfunction Event (type, optionalProperties) {\n Object.defineProperty(this, 'type', { writable: false, value: type, enumerable: true })\n if (optionalProperties) {\n for (var f in optionalProperties) {\n if (optionalProperties.hasOwnProperty(f)) {\n Object.defineProperty(this, f, { writable: false, value: optionalProperties[f], enumerable: true })\n }\n }\n }\n}\n\n/**\n * W3C MessageEvent\n *\n * @see http://www.w3.org/TR/webmessaging/#event-definitions\n * @api private\n */\nfunction MessageEvent (type, eventInitDict) {\n Object.defineProperty(this, 'type', { writable: false, value: type, enumerable: true })\n for (var f in eventInitDict) {\n if (eventInitDict.hasOwnProperty(f)) {\n Object.defineProperty(this, f, { writable: false, value: eventInitDict[f], enumerable: true })\n }\n }\n}\n\n/**\n * Returns a new object of headers that does not include any authorization and cookie headers\n *\n * @param {Object} headers An object of headers ({[headerName]: headerValue})\n * @return {Object} a new object of headers\n * @api private\n */\nfunction removeUnsafeHeaders (headers) {\n var safe = {}\n for (var key in headers) {\n if (reUnsafeHeader.test(key)) {\n continue\n }\n\n safe[key] = headers[key]\n }\n\n return safe\n}\n","/**\n * Olbrain JavaScript SDK - Widget Entry Point\n * Exports both ChatWidget component and core API\n */\n\n// Export everything from core\nexport * from './index';\n\n// Export widget\nexport { ChatWidget } from './widget/ChatWidget';\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","/**\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 * 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 * HTML templates for the chat widget\n */\n\nexport interface TemplateConfig {\n title: string;\n greeting: string;\n placeholder: string;\n theme: 'light' | 'dark' | 'auto';\n}\n\n/**\n * Main widget container template\n */\nexport function widgetContainerTemplate(config: TemplateConfig): string {\n const theme = config.theme === 'auto' ? 'light' : config.theme;\n return `\n <div class=\"olbrain-widget-container\" data-theme=\"${theme}\">\n <div class=\"olbrain-chat-widget\">\n <div class=\"olbrain-chat-header\">\n <div class=\"olbrain-chat-title\">${escapeHtml(config.title)}</div>\n <button class=\"olbrain-close-btn\" aria-label=\"Close chat\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M15.898 4.045l-5.307 5.307 5.307 5.307c.39.39.39 1.025 0 1.415-.195.195-.45.292-.707.292-.257 0-.512-.097-.707-.292l-5.307-5.307-5.307 5.307c-.195.195-.45.292-.707.292-.257 0-.512-.097-.707-.292-.39-.39-.39-1.025 0-1.415l5.307-5.307-5.307-5.307c-.39-.39-.39-1.025 0-1.415.39-.39 1.025-.39 1.415 0l5.307 5.307 5.307-5.307c.39-.39 1.025-.39 1.415 0 .39.39.39 1.025 0 1.415z\"/>\n </svg>\n </button>\n </div>\n <div class=\"olbrain-messages-container\"></div>\n <div class=\"olbrain-input-area\">\n <input\n type=\"text\"\n class=\"olbrain-message-input\"\n placeholder=\"${escapeHtml(config.placeholder)}\"\n aria-label=\"Message input\"\n />\n <button class=\"olbrain-send-btn\" aria-label=\"Send message\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M16.6915026,12.4744748 L3.50612381,13.2599618 C3.19218622,13.2599618 3.03521743,13.4170592 3.03521743,13.5741566 L1.15159189,17.8274344 C0.8376543,18.6129214 0.99,19.3984083 1.77946707,20 C2.41,20.52 3.50612381,20.3429026 4.13399899,20.0274254 L21.714504,3.40596059 C22.6563168,2.59128963 22.6563168,0.9563 21.714504,0.1416 L4.13399899,-0.4800539 C3.50612381,-0.4800539 2.40880848,0.0729863 1.77946707,0.7844625 C0.994041701,1.5699495 0.837158534,2.35644751 1.15159189,3.1419345 L3.03521743,7.39521227 C3.03521743,7.55230969 3.34915502,7.70940711 3.50612381,7.70940711 L16.6915026,8.49489406 C16.6915026,8.49489406 17.1272231,8.49489406 17.1272231,8.99410899 L17.1272231,11.8231405 C17.1272231,12.3223555 16.6915026,12.4744748 16.6915026,12.4744748 Z\"/>\n </svg>\n </button>\n </div>\n </div>\n <button class=\"olbrain-toggle-btn\" aria-label=\"Toggle chat widget\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/>\n </svg>\n </button>\n </div>\n `;\n}\n\n/**\n * User message template\n */\nexport function userMessageTemplate(content: string, timestamp: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-user\">\n <div class=\"olbrain-message-content\">${escapeHtml(content)}</div>\n <div class=\"olbrain-message-time\">${formatTime(timestamp)}</div>\n </div>\n `;\n}\n\n/**\n * Assistant message template\n */\nexport function assistantMessageTemplate(content: string, timestamp: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-assistant\">\n <div class=\"olbrain-message-content\">${escapeHtml(content)}</div>\n <div class=\"olbrain-message-time\">${formatTime(timestamp)}</div>\n </div>\n `;\n}\n\n/**\n * Typing indicator template\n */\nexport function typingIndicatorTemplate(): string {\n return `\n <div class=\"olbrain-message olbrain-message-assistant\">\n <div class=\"olbrain-typing-indicator\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n </div>\n `;\n}\n\n/**\n * Error message template\n */\nexport function errorMessageTemplate(error: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-error\">\n <div class=\"olbrain-message-content\">Error: ${escapeHtml(error)}</div>\n </div>\n `;\n}\n\n/**\n * Welcome/greeting template\n */\nexport function greetingTemplate(greeting: string): string {\n return `\n <div class=\"olbrain-message olbrain-message-greeting\">\n <div class=\"olbrain-message-content\">${escapeHtml(greeting)}</div>\n </div>\n `;\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nfunction escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Format timestamp to readable time\n */\nfunction formatTime(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n const hours = date.getHours().toString().padStart(2, '0');\n const minutes = date.getMinutes().toString().padStart(2, '0');\n return `${hours}:${minutes}`;\n } catch {\n return '';\n }\n}\n","/**\n * CSS styles for the chat widget\n * Exported as a string to be injected dynamically (no external stylesheet needed)\n */\n\nexport interface StyleConfig {\n primaryColor: string;\n theme: 'light' | 'dark' | 'auto';\n}\n\n/**\n * Generate widget CSS with customizable colors\n */\nexport function generateStyles(config: StyleConfig): string {\n const primary = config.primaryColor || '#4f46e5';\n const isDark = config.theme === 'dark';\n\n const bgColor = isDark ? '#1f2937' : '#ffffff';\n const textColor = isDark ? '#f3f4f6' : '#111827';\n const borderColor = isDark ? '#374151' : '#e5e7eb';\n const hoverBg = isDark ? '#111827' : '#f9fafb';\n\n return `\n .olbrain-widget-container {\n --primary-color: ${primary};\n --bg-color: ${bgColor};\n --text-color: ${textColor};\n --border-color: ${borderColor};\n --hover-bg: ${hoverBg};\n\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .olbrain-widget-container * {\n box-sizing: border-box;\n }\n\n .olbrain-widget-container[data-theme=\"dark\"] {\n color-scheme: dark;\n }\n\n .olbrain-widget-container[data-theme=\"light\"] {\n color-scheme: light;\n }\n\n /* Toggle Button */\n .olbrain-toggle-btn {\n position: fixed;\n bottom: 24px;\n right: 24px;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background-color: var(--primary-color);\n border: none;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transition: all 0.3s ease;\n z-index: 999999;\n }\n\n .olbrain-toggle-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n }\n\n .olbrain-toggle-btn:active {\n transform: scale(0.95);\n }\n\n .olbrain-toggle-btn.hidden {\n display: none;\n }\n\n /* Chat Widget Container */\n .olbrain-chat-widget {\n position: fixed;\n bottom: 100px;\n right: 24px;\n width: 420px;\n max-width: calc(100vw - 32px);\n height: 600px;\n max-height: calc(100vh - 140px);\n background-color: var(--bg-color);\n border-radius: 12px;\n box-shadow: 0 5px 40px rgba(0, 0, 0, 0.16);\n display: flex;\n flex-direction: column;\n z-index: 999998;\n animation: slideUp 0.3s ease;\n opacity: 0;\n pointer-events: none;\n transform: translateY(20px);\n }\n\n .olbrain-chat-widget.open {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0);\n }\n\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Chat Header */\n .olbrain-chat-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--border-color);\n border-radius: 12px 12px 0 0;\n background: linear-gradient(135deg, var(--primary-color), color-mix(in srgb, var(--primary-color) 80%, black));\n color: white;\n }\n\n .olbrain-chat-title {\n font-size: 16px;\n font-weight: 600;\n }\n\n .olbrain-close-btn {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n\n .olbrain-close-btn:hover {\n background-color: rgba(255, 255, 255, 0.2);\n }\n\n /* Messages Container */\n .olbrain-messages-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background-color: var(--bg-color);\n }\n\n .olbrain-messages-container::-webkit-scrollbar {\n width: 6px;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-thumb {\n background: var(--border-color);\n border-radius: 3px;\n }\n\n .olbrain-messages-container::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--border-color) 80%, black);\n }\n\n /* Message */\n .olbrain-message {\n display: flex;\n flex-direction: column;\n gap: 4px;\n animation: fadeIn 0.3s ease;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .olbrain-message-content {\n max-width: 85%;\n padding: 12px 16px;\n border-radius: 8px;\n word-wrap: break-word;\n line-height: 1.4;\n font-size: 14px;\n }\n\n /* User Message */\n .olbrain-message-user .olbrain-message-content {\n background-color: var(--primary-color);\n color: white;\n align-self: flex-end;\n border-radius: 18px 18px 4px 18px;\n }\n\n /* Assistant Message */\n .olbrain-message-assistant .olbrain-message-content {\n background-color: var(--hover-bg);\n color: var(--text-color);\n align-self: flex-start;\n border-radius: 18px 18px 18px 4px;\n }\n\n /* Greeting Message */\n .olbrain-message-greeting .olbrain-message-content {\n background-color: transparent;\n color: var(--text-color);\n align-self: center;\n font-style: italic;\n opacity: 0.7;\n padding: 8px 12px;\n }\n\n /* Error Message */\n .olbrain-message-error .olbrain-message-content {\n background-color: #fee;\n color: #c33;\n align-self: flex-start;\n }\n\n .olbrain-message-time {\n font-size: 12px;\n color: var(--text-color);\n opacity: 0.6;\n padding: 0 16px;\n }\n\n /* Typing Indicator */\n .olbrain-typing-indicator {\n display: flex;\n gap: 4px;\n padding: 12px 16px;\n }\n\n .olbrain-typing-indicator span {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: var(--text-color);\n opacity: 0.4;\n animation: typing 1.4s infinite;\n }\n\n .olbrain-typing-indicator span:nth-child(2) {\n animation-delay: 0.2s;\n }\n\n .olbrain-typing-indicator span:nth-child(3) {\n animation-delay: 0.4s;\n }\n\n @keyframes typing {\n 0%, 60%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 30% {\n opacity: 1;\n transform: translateY(-10px);\n }\n }\n\n /* Input Area */\n .olbrain-input-area {\n display: flex;\n gap: 8px;\n padding: 16px;\n border-top: 1px solid var(--border-color);\n background-color: var(--bg-color);\n border-radius: 0 0 12px 12px;\n }\n\n .olbrain-message-input {\n flex: 1;\n border: 1px solid var(--border-color);\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 14px;\n font-family: inherit;\n background-color: var(--hover-bg);\n color: var(--text-color);\n transition: border-color 0.2s;\n }\n\n .olbrain-message-input:focus {\n outline: none;\n border-color: var(--primary-color);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 20%, transparent);\n }\n\n .olbrain-message-input::placeholder {\n color: var(--text-color);\n opacity: 0.5;\n }\n\n .olbrain-send-btn {\n background-color: var(--primary-color);\n border: none;\n color: white;\n border-radius: 8px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .olbrain-send-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--primary-color) 30%, transparent);\n }\n\n .olbrain-send-btn:active {\n transform: scale(0.95);\n }\n\n .olbrain-send-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Mobile Responsive */\n @media (max-width: 480px) {\n .olbrain-chat-widget {\n width: calc(100vw - 32px);\n height: calc(100vh - 140px);\n bottom: 100px;\n right: 16px;\n border-radius: 8px;\n }\n\n .olbrain-toggle-btn {\n width: 48px;\n height: 48px;\n bottom: 20px;\n right: 16px;\n }\n\n .olbrain-message-content {\n max-width: 90%;\n }\n }\n `;\n}\n","/**\n * ChatWidget - Ready-to-use chat widget component\n * Combines AgentClient with UI for one-line integration\n */\n\nimport { AgentClient } from '../core/client';\nimport { WidgetConfig, Message } from '../core/types';\nimport {\n widgetContainerTemplate,\n userMessageTemplate,\n assistantMessageTemplate,\n typingIndicatorTemplate,\n errorMessageTemplate,\n greetingTemplate,\n} from './templates';\nimport { generateStyles } from './styles';\n\nconst DEFAULT_GREETING = 'Hi! How can I help you today?';\nconst DEFAULT_TITLE = 'Chat with us';\nconst DEFAULT_PLACEHOLDER = 'Type your message...';\nconst DEFAULT_PRIMARY_COLOR = '#4f46e5';\nconst SESSION_STORAGE_KEY = 'olbrain_widget_session_id';\n\n/**\n * Ready-to-use chat widget for websites\n */\nexport class ChatWidget {\n private config: Required<WidgetConfig>;\n private client: AgentClient;\n private sessionId: string | null = null;\n private container: HTMLElement | null = null;\n private chatWidget: HTMLElement | null = null;\n private toggleBtn: HTMLElement | null = null;\n private messagesContainer: HTMLElement | null = null;\n private messageInput: HTMLInputElement | null = null;\n private sendBtn: HTMLButtonElement | null = null;\n private isOpen: boolean = false;\n private isWaitingForResponse: boolean = false;\n\n constructor(config: WidgetConfig) {\n this.config = this._normalizeConfig(config);\n this.client = new AgentClient({\n agentId: config.agentId,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n }\n\n /**\n * Mount widget to the page\n */\n async mount(target?: HTMLElement | string): Promise<void> {\n // Load styles\n this._injectStyles();\n\n // Find or create container\n if (target) {\n if (typeof target === 'string') {\n this.container = document.querySelector(target);\n if (!this.container) {\n throw new Error(`Element with selector \"${target}\" not found`);\n }\n } else {\n this.container = target;\n }\n } else {\n this.container = document.body;\n }\n\n // Render widget\n this._render();\n this._attachEventListeners();\n\n // Load or create session\n await this._initializeSession();\n\n // Show greeting message\n this._showGreeting();\n\n // Auto-open if configured\n if (this.config.autoOpen) {\n this.open();\n }\n }\n\n /**\n * Unmount widget from the page\n */\n unmount(): void {\n this.client.stopListening(this.sessionId || '');\n this.client.close();\n\n if (this.container) {\n const wrapper = this.container.querySelector('.olbrain-widget-container');\n if (wrapper) {\n wrapper.remove();\n }\n }\n\n this.container = null;\n }\n\n /**\n * Open chat window\n */\n open(): void {\n if (this.chatWidget) {\n this.chatWidget.classList.add('open');\n this.isOpen = true;\n if (this.messageInput) {\n this.messageInput.focus();\n }\n }\n }\n\n /**\n * Close chat window\n */\n close(): void {\n if (this.chatWidget) {\n this.chatWidget.classList.remove('open');\n this.isOpen = false;\n }\n }\n\n /**\n * Send a message\n */\n async sendMessage(text: string): Promise<void> {\n if (!text.trim() || !this.sessionId || this.isWaitingForResponse) {\n return;\n }\n\n // Add user message to UI\n this._addMessageToUI(text, 'user');\n\n // Clear input\n if (this.messageInput) {\n this.messageInput.value = '';\n }\n\n this.isWaitingForResponse = true;\n\n try {\n // Show typing indicator\n this._showTypingIndicator();\n\n // Send message and get response\n const response = await this.client.sendAndWait(this.sessionId, text);\n\n // Remove typing indicator\n this._removeTypingIndicator();\n\n if (response.success && response.text) {\n this._addMessageToUI(response.text, 'assistant');\n } else if (response.error) {\n this._showError(response.error);\n }\n } catch (error) {\n this._removeTypingIndicator();\n this._showError((error as Error).message);\n } finally {\n this.isWaitingForResponse = false;\n }\n }\n\n /**\n * Normalize configuration with defaults\n */\n private _normalizeConfig(config: WidgetConfig): Required<WidgetConfig> {\n return {\n agentId: config.agentId,\n apiKey: config.apiKey,\n position: config.position || 'bottom-right',\n theme: config.theme || 'auto',\n primaryColor: config.primaryColor || DEFAULT_PRIMARY_COLOR,\n title: config.title || DEFAULT_TITLE,\n greeting: config.greeting || DEFAULT_GREETING,\n placeholder: config.placeholder || DEFAULT_PLACEHOLDER,\n autoOpen: config.autoOpen ?? false,\n persistSession: config.persistSession ?? true,\n target: config.target || document.body,\n onMessage: config.onMessage || (() => {}),\n baseUrl: config.baseUrl || '',\n };\n }\n\n /**\n * Inject widget styles into the page\n */\n private _injectStyles(): void {\n // Check if styles already injected\n if (document.getElementById('olbrain-widget-styles')) {\n return;\n }\n\n const styleEl = document.createElement('style');\n styleEl.id = 'olbrain-widget-styles';\n styleEl.textContent = generateStyles({\n primaryColor: this.config.primaryColor,\n theme: this.config.theme,\n });\n\n document.head.appendChild(styleEl);\n }\n\n /**\n * Render widget HTML\n */\n private _render(): void {\n if (!this.container) return;\n\n const html = widgetContainerTemplate({\n title: this.config.title,\n greeting: this.config.greeting,\n placeholder: this.config.placeholder,\n theme: this.config.theme,\n });\n\n this.container.insertAdjacentHTML('beforeend', html);\n\n // Get references to widget elements\n const wrapper = this.container.querySelector('.olbrain-widget-container');\n if (wrapper) {\n this.chatWidget = wrapper.querySelector('.olbrain-chat-widget');\n this.toggleBtn = wrapper.querySelector('.olbrain-toggle-btn');\n this.messagesContainer = wrapper.querySelector('.olbrain-messages-container');\n this.messageInput = wrapper.querySelector('.olbrain-message-input');\n this.sendBtn = wrapper.querySelector('.olbrain-send-btn');\n }\n }\n\n /**\n * Attach event listeners\n */\n private _attachEventListeners(): void {\n // Toggle button\n this.toggleBtn?.addEventListener('click', () => {\n this.isOpen ? this.close() : this.open();\n this.toggleBtn?.classList.toggle('hidden', this.isOpen);\n });\n\n // Close button\n this.chatWidget\n ?.querySelector('.olbrain-close-btn')\n ?.addEventListener('click', () => {\n this.close();\n if (this.toggleBtn) {\n this.toggleBtn.classList.remove('hidden');\n }\n });\n\n // Send button\n this.sendBtn?.addEventListener('click', () => {\n if (this.messageInput) {\n this.sendMessage(this.messageInput.value);\n }\n });\n\n // Message input enter key\n this.messageInput?.addEventListener('keypress', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (this.messageInput) {\n this.sendMessage(this.messageInput.value);\n }\n }\n });\n\n // Disable send button while waiting\n this.messageInput?.addEventListener('input', () => {\n if (this.sendBtn) {\n this.sendBtn.disabled = this.isWaitingForResponse;\n }\n });\n }\n\n /**\n * Initialize session (load or create)\n */\n private async _initializeSession(): Promise<void> {\n // Try to load saved session\n if (this.config.persistSession) {\n const savedSessionId = this._getStoredSessionId();\n if (savedSessionId) {\n try {\n await this.client.getSession(savedSessionId);\n this.sessionId = savedSessionId;\n return;\n } catch {\n // Session invalid, create new one\n }\n }\n }\n\n // Create new session\n try {\n this.sessionId = await this.client.createSession({\n title: 'Widget Chat Session',\n metadata: {\n source: 'chat_widget',\n },\n });\n\n if (this.config.persistSession) {\n this._storeSessionId(this.sessionId);\n }\n } catch (error) {\n this._showError(`Failed to create session: ${(error as Error).message}`);\n }\n }\n\n /**\n * Show greeting message\n */\n private _showGreeting(): void {\n if (this.messagesContainer) {\n const html = greetingTemplate(this.config.greeting);\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n }\n\n /**\n * Add message to UI\n */\n private _addMessageToUI(content: string, role: 'user' | 'assistant'): void {\n if (!this.messagesContainer) return;\n\n const timestamp = new Date().toISOString();\n const html =\n role === 'user'\n ? userMessageTemplate(content, timestamp)\n : assistantMessageTemplate(content, timestamp);\n\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n\n // Call custom callback if provided\n if (this.config.onMessage) {\n this.config.onMessage({\n role,\n content,\n timestamp,\n metadata: {},\n });\n }\n }\n\n /**\n * Show typing indicator\n */\n private _showTypingIndicator(): void {\n if (!this.messagesContainer) return;\n\n const html = typingIndicatorTemplate();\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n\n /**\n * Remove typing indicator\n */\n private _removeTypingIndicator(): void {\n const indicator = this.messagesContainer?.querySelector('.olbrain-typing-indicator');\n if (indicator) {\n indicator.closest('.olbrain-message')?.remove();\n }\n }\n\n /**\n * Show error message\n */\n private _showError(error: string): void {\n if (!this.messagesContainer) return;\n\n const html = errorMessageTemplate(error);\n this.messagesContainer.insertAdjacentHTML('beforeend', html);\n this._scrollToBottom();\n }\n\n /**\n * Scroll to bottom of messages\n */\n private _scrollToBottom(): void {\n if (this.messagesContainer) {\n setTimeout(() => {\n this.messagesContainer!.scrollTop = this.messagesContainer!.scrollHeight;\n }, 0);\n }\n }\n\n /**\n * Store session ID in localStorage\n */\n private _storeSessionId(sessionId: string): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(SESSION_STORAGE_KEY, sessionId);\n }\n } catch {\n // localStorage not available\n }\n }\n\n /**\n * Get stored session ID from localStorage\n */\n private _getStoredSessionId(): string | null {\n try {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem(SESSION_STORAGE_KEY);\n }\n } catch {\n // localStorage not available\n }\n return null;\n }\n}\n"],"mappings":"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ACZ,OAAO;AAAA,sBACL,SAAS;AAAA,wBACP,WAAW;AAAA,oBACf,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["EventSource","i","delay","delay"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olbrain/js-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Official JavaScript SDK for Olbrain Agent Cloud - one-line integration for AI agent chatbots",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",