@navsi.ai/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +348 -0
- package/dist/chunk-427NHGTX.js +3 -0
- package/dist/chunk-427NHGTX.js.map +1 -0
- package/dist/chunk-6FUUG5WB.js +77 -0
- package/dist/chunk-6FUUG5WB.js.map +1 -0
- package/dist/chunk-EHZXIZIP.js +3752 -0
- package/dist/chunk-EHZXIZIP.js.map +1 -0
- package/dist/components/index.d.ts +66 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.d.ts +104 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +286 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/websocket/client.ts","../src/core/navigation/adapter.ts","../src/core/navigation/controller.ts","../src/core/scanner/dom-scanner.ts","../src/core/scanner/action-registry.ts","../src/core/scanner/page-context-builder.ts","../src/core/executor/dom-executor.ts","../src/core/executor/command-processor.ts","../src/core/bridge/server-action-bridge.ts","../src/components/ChatbotProvider.tsx","../src/components/ChatbotWidget.tsx"],"names":["createLogger","node","nav","jsx","React","useState","useRef","useMemo","useEffect","useCallback"],"mappings":"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","file":"chunk-EHZXIZIP.js","sourcesContent":["/**\n * WebSocket Client for AI Chatbot SDK\n * \n * Features:\n * - Auto-reconnection with exponential backoff\n * - Message queue for offline scenarios\n * - Heartbeat mechanism (ping/pong every 30s)\n * - Token refresh before expiry\n * - Connection state management\n */\n\nimport type {\n ClientMessage,\n ServerMessage,\n WebSocketEvents,\n} from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ConnectionState =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'failed';\n\nexport interface WebSocketClientConfig {\n /** WebSocket server URL */\n serverUrl: string;\n /** API key for authentication */\n apiKey: string;\n /** Enable auto-reconnection */\n autoReconnect?: boolean;\n /** Maximum reconnection attempts */\n maxReconnectAttempts?: number;\n /** Initial reconnection delay in ms */\n reconnectDelay?: number;\n /** Heartbeat interval in ms */\n heartbeatInterval?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\ntype EventCallback<T> = (data: T) => void;\n\n// ============================================================================\n// Message Queue\n// ============================================================================\n\nclass MessageQueue {\n private queue: ClientMessage[] = [];\n private readonly maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n enqueue(message: ClientMessage): void {\n if (this.queue.length >= this.maxSize) {\n this.queue.shift(); // Remove oldest message\n }\n this.queue.push(message);\n }\n\n dequeueAll(): ClientMessage[] {\n const messages = [...this.queue];\n this.queue = [];\n return messages;\n }\n\n get length(): number {\n return this.queue.length;\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n// ============================================================================\n// WebSocket Client\n// ============================================================================\n\nexport class WebSocketClient {\n private ws: WebSocket | null = null;\n private config: Required<WebSocketClientConfig>;\n private state: ConnectionState = 'disconnected';\n private logger = createLogger('SDK.WebSocket');\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private lastPongTime = 0;\n private messageQueue = new MessageQueue();\n private sessionId: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiresAt = 0;\n private tokenRefreshTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Event listeners\n private listeners: Map<keyof WebSocketEvents, Set<EventCallback<unknown>>> = new Map();\n\n constructor(config: WebSocketClientConfig) {\n this.config = {\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n autoReconnect: config.autoReconnect ?? true,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n reconnectDelay: config.reconnectDelay ?? 1000,\n heartbeatInterval: config.heartbeatInterval ?? 30000,\n debug: config.debug ?? false,\n };\n this.logger = createLogger('SDK.WebSocket', { enabled: this.config.debug, level: 'debug' });\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (this.state === 'connecting' || this.state === 'connected') {\n this.log('Already connected or connecting');\n return;\n }\n\n this.setState('connecting');\n this.createWebSocket();\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n this.cleanup();\n this.setState('disconnected');\n this.log('Disconnected');\n }\n\n /**\n * Send a message to the server\n */\n send(message: ClientMessage): void {\n if (this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n this.log('Sent message:', message.type, summarizeClientMessage(message));\n } else {\n // Queue message for later\n this.messageQueue.enqueue(message);\n this.log('Queued message (offline):', message.type, summarizeClientMessage(message));\n }\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.state === 'connected';\n }\n\n // ============================================================================\n // Event Handling\n // ============================================================================\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof WebSocketEvents>(\n event: K,\n callback: EventCallback<WebSocketEvents[K]>\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(event)?.delete(callback as EventCallback<unknown>);\n };\n }\n\n /**\n * Emit an event to all listeners\n */\n private emit<K extends keyof WebSocketEvents>(\n event: K,\n data: WebSocketEvents[K]\n ): void {\n this.listeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n this.logger.error(`Error in ${event} listener`, error);\n }\n });\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n private createWebSocket(): void {\n try {\n // Build URL with apiKey (required by server) and sessionId for reconnection\n const urlObj = new URL(this.config.serverUrl);\n urlObj.searchParams.set('apiKey', this.config.apiKey);\n if (this.sessionId) {\n urlObj.searchParams.set('sessionId', this.sessionId);\n }\n const url = urlObj.toString();\n\n this.ws = new WebSocket(url);\n\n this.ws.onopen = this.handleOpen.bind(this);\n this.ws.onmessage = this.handleMessage.bind(this);\n this.ws.onclose = this.handleClose.bind(this);\n this.ws.onerror = this.handleError.bind(this);\n } catch (error) {\n this.logger.error('Failed to create WebSocket', error);\n this.handleConnectionFailure();\n }\n }\n\n private handleOpen(): void {\n this.log('WebSocket connected, authenticating...');\n\n // Send authentication message\n this.ws?.send(JSON.stringify({\n type: 'auth',\n apiKey: this.config.apiKey,\n sessionId: this.sessionId,\n }));\n }\n\n private handleMessage(event: MessageEvent): void {\n try {\n const message = JSON.parse(event.data) as ServerMessage;\n this.log('Received message:', message.type);\n\n switch (message.type) {\n case 'connected':\n this.handleConnected();\n break;\n case 'auth_success':\n this.handleAuthSuccess(message);\n break;\n case 'auth_error':\n this.handleAuthError(message);\n break;\n case 'pong':\n this.handlePong(message);\n break;\n case 'token_refreshed':\n this.handleTokenRefreshed(message);\n break;\n default:\n // Forward to listeners\n this.emit('message', message);\n }\n } catch (error) {\n this.logger.warn('Failed to parse message', error);\n }\n }\n\n private handleClose(event: CloseEvent): void {\n this.log('WebSocket closed:', event.code, event.reason);\n this.stopHeartbeat();\n\n if (this.state !== 'disconnected') {\n this.emit('disconnected', { reason: event.reason, code: event.code });\n\n if (this.config.autoReconnect) {\n this.scheduleReconnect();\n } else {\n this.setState('disconnected');\n }\n }\n }\n\n private handleError(event: Event): void {\n this.logger.error('WebSocket error', event);\n this.emit('error', { error: new Error('WebSocket error') });\n }\n\n // ============================================================================\n // Authentication\n // ============================================================================\n\n private handleConnected(): void {\n this.log('Server connection acknowledged');\n }\n\n private handleAuthSuccess(message: {\n sessionId: string;\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n }): void {\n this.sessionId = message.sessionId;\n this.refreshToken = message.refreshToken;\n this.tokenExpiresAt = message.expiresAt;\n this.reconnectAttempts = 0;\n\n this.setState('connected');\n this.startHeartbeat();\n this.scheduleTokenRefresh();\n this.flushMessageQueue();\n\n this.emit('authenticated', {\n sessionId: message.sessionId,\n expiresAt: message.expiresAt,\n });\n this.emit('connected', { sessionId: message.sessionId });\n\n this.log('Authenticated successfully, session:', message.sessionId);\n }\n\n private handleAuthError(message: { error: string; code: string }): void {\n this.logger.warn('Authentication failed', message.error);\n this.emit('error', { error: new Error(message.error), code: message.code });\n this.disconnect();\n }\n\n // ============================================================================\n // Token Refresh\n // ============================================================================\n\n private scheduleTokenRefresh(): void {\n if (this.tokenRefreshTimeout) {\n clearTimeout(this.tokenRefreshTimeout);\n }\n\n // Refresh 5 minutes before expiry\n const refreshIn = Math.max(0, this.tokenExpiresAt - Date.now() - 5 * 60 * 1000);\n\n this.tokenRefreshTimeout = setTimeout(() => {\n this.refreshAccessToken();\n }, refreshIn);\n\n this.log('Token refresh scheduled in', Math.round(refreshIn / 1000), 'seconds');\n }\n\n private refreshAccessToken(): void {\n if (!this.refreshToken || this.state !== 'connected') {\n return;\n }\n\n this.log('Refreshing token...');\n this.ws?.send(JSON.stringify({\n type: 'token_refresh',\n refreshToken: this.refreshToken,\n }));\n }\n\n private handleTokenRefreshed(message: {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n }): void {\n this.refreshToken = message.refreshToken;\n this.tokenExpiresAt = message.expiresAt;\n this.scheduleTokenRefresh();\n\n this.emit('token_refreshed', { expiresAt: message.expiresAt });\n this.log('Token refreshed successfully');\n }\n\n // ============================================================================\n // Heartbeat\n // ============================================================================\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.lastPongTime = Date.now();\n\n this.heartbeatInterval = setInterval(() => {\n if (this.state !== 'connected') {\n return;\n }\n\n // Check if we received a pong recently\n if (Date.now() - this.lastPongTime > this.config.heartbeatInterval * 2) {\n this.logger.warn('Heartbeat timeout, reconnecting...');\n this.ws?.close();\n return;\n }\n\n // Send ping\n this.ws?.send(JSON.stringify({\n type: 'ping',\n timestamp: Date.now(),\n }));\n this.log('Sent ping');\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n private handlePong(message: { timestamp: number }): void {\n this.lastPongTime = Date.now();\n const latency = Date.now() - message.timestamp;\n this.log('Received pong, latency:', latency, 'ms');\n }\n\n // ============================================================================\n // Reconnection\n // ============================================================================\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.handleConnectionFailure();\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n // Exponential backoff with max of 30 seconds\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.log(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.config.maxReconnectAttempts})`);\n\n this.emit('reconnecting', {\n attempt: this.reconnectAttempts,\n maxAttempts: this.config.maxReconnectAttempts,\n });\n\n this.reconnectTimeout = setTimeout(() => {\n this.createWebSocket();\n }, delay);\n }\n\n private handleConnectionFailure(): void {\n this.setState('failed');\n this.emit('reconnect_failed', { reason: 'Max reconnection attempts reached' });\n this.logger.error('Connection failed - max reconnection attempts reached');\n }\n\n // ============================================================================\n // Message Queue\n // ============================================================================\n\n private flushMessageQueue(): void {\n const messages = this.messageQueue.dequeueAll();\n if (messages.length > 0) {\n this.log(`Flushing ${messages.length} queued messages`);\n messages.forEach((message) => this.send(message));\n }\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n private setState(state: ConnectionState): void {\n if (this.state !== state) {\n this.log('State:', this.state, '->', state);\n this.state = state;\n }\n }\n\n private cleanup(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.tokenRefreshTimeout) {\n clearTimeout(this.tokenRefreshTimeout);\n this.tokenRefreshTimeout = null;\n }\n\n this.stopHeartbeat();\n\n if (this.ws) {\n const ws = this.ws;\n // Detach handlers first to prevent any callbacks firing during close\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n this.ws = null;\n\n // Only close if the socket is OPEN or CONNECTING\n // readyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSING, 3 = CLOSED\n if (ws.readyState === WebSocket.CONNECTING || ws.readyState === WebSocket.OPEN) {\n try {\n ws.close(1000, 'Client disconnect');\n } catch {\n // Ignore errors from closing during connection setup (React StrictMode)\n }\n }\n }\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n// ============================================================================\n// Message Summarization\n// ============================================================================\n\nfunction summarizeClientMessage(message: ClientMessage): Record<string, unknown> {\n switch (message.type) {\n case 'message':\n return {\n messageId: message.messageId,\n mode: message.mode,\n length: message.content.length,\n route: message.context?.route,\n };\n case 'context':\n return {\n route: message.context?.route,\n actions: message.context?.actions?.length ?? 0,\n headings: message.context?.content?.headings?.length ?? 0,\n };\n case 'action_result':\n return {\n actionId: message.actionId,\n success: message.success,\n commandId: message.commandId,\n };\n case 'server_action_request':\n return {\n actionId: message.actionId,\n requestId: message.requestId,\n };\n case 'auth':\n return {\n hasSessionId: Boolean(message.sessionId),\n };\n case 'token_refresh':\n return {};\n case 'ping':\n return { timestamp: message.timestamp };\n default:\n return {};\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createWebSocketClient(config: WebSocketClientConfig): WebSocketClient {\n return new WebSocketClient(config);\n}\n","/**\n * Navigation Adapter Interface\n * \n * Abstract interface for routing library integration.\n * Companies can implement this for any routing solution:\n * - React Router v6\n * - Next.js Router\n * - Reach Router\n * - Custom routing\n */\n\nimport type { NavigationAdapter } from '@navsi.ai/shared';\n\n// Re-export the interface\nexport type { NavigationAdapter };\n\n/**\n * Default timeout for waiting for route changes (10 seconds)\n */\nexport const DEFAULT_ROUTE_TIMEOUT = 10000;\n\n/**\n * Create a simple in-memory navigation adapter\n * Useful for testing or non-SPA applications\n */\nexport function createMemoryAdapter(initialPath = '/'): NavigationAdapter {\n let currentPath = initialPath;\n const listeners = new Set<(path: string) => void>();\n\n return {\n navigate(path: string): void {\n currentPath = path;\n listeners.forEach((callback) => callback(path));\n },\n\n getCurrentPath(): string {\n return currentPath;\n },\n\n onRouteChange(callback: (path: string) => void): () => void {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n\n async waitForRoute(path: string, timeout = DEFAULT_ROUTE_TIMEOUT): Promise<boolean> {\n return new Promise((resolve) => {\n if (currentPath === path) {\n resolve(true);\n return;\n }\n\n const unsubscribe = this.onRouteChange((newPath) => {\n if (newPath === path) {\n unsubscribe();\n resolve(true);\n }\n });\n\n setTimeout(() => {\n unsubscribe();\n resolve(currentPath === path);\n }, timeout);\n });\n },\n };\n}\n","/**\n * Navigation Controller\n * \n * Coordinates navigation and DOM stability detection for cross-route actions.\n */\n\nimport type { NavigationAdapter, PageContext } from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\nexport interface NavigationControllerConfig {\n /** DOM stability quiet period in ms */\n domStabilityDelay?: number;\n /** Maximum wait time for DOM stability */\n domStabilityTimeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Called when DOM has become stable (e.g. to re-scan and update action registry) */\n onDOMStable?: () => void;\n}\n\ntype ResolvedNavigationControllerConfig = Omit<Required<NavigationControllerConfig>, 'onDOMStable'> & {\n onDOMStable?: () => void;\n};\n\nexport class NavigationController {\n private adapter: NavigationAdapter;\n private config: ResolvedNavigationControllerConfig;\n private scanCallback: (() => Promise<PageContext>) | null = null;\n private logger = createLogger('SDK.Navigation');\n\n constructor(adapter: NavigationAdapter, config: NavigationControllerConfig = {}) {\n this.adapter = adapter;\n this.config = {\n domStabilityDelay: config.domStabilityDelay ?? 300,\n domStabilityTimeout: config.domStabilityTimeout ?? 5000,\n debug: config.debug ?? false,\n onDOMStable: config.onDOMStable,\n };\n this.logger = createLogger('SDK.Navigation', { enabled: this.config.debug, level: 'debug' });\n }\n\n /**\n * Set the page scanner callback\n */\n setScanner(scanner: () => Promise<PageContext>): void {\n this.scanCallback = scanner;\n }\n\n /**\n * Get current route\n */\n getCurrentRoute(): string {\n return this.adapter.getCurrentPath();\n }\n\n /**\n * Navigate to a route and wait for it to load\n */\n async navigateTo(route: string, timeout?: number): Promise<boolean> {\n const currentRoute = this.adapter.getCurrentPath();\n\n if (currentRoute === route) {\n this.log('Already on route:', route);\n return true;\n }\n\n this.log('Navigating to:', route);\n this.adapter.navigate(route);\n\n const success = await this.adapter.waitForRoute(route, timeout);\n\n if (!success) {\n this.log('Navigation timeout for route:', route);\n }\n\n return success;\n }\n\n /**\n * Execute navigation and rescan page context\n */\n async executeNavigation(route: string): Promise<PageContext | null> {\n // Navigate to route\n const success = await this.navigateTo(route);\n\n if (!success) {\n this.log('Navigation failed to:', route);\n return null;\n }\n\n // Wait for DOM to stabilize\n await this.waitForDOMStable();\n\n // Rescan page context\n if (this.scanCallback) {\n const context = await this.scanCallback();\n this.log('Rescanned context on route:', route);\n return context;\n }\n\n return null;\n }\n\n /**\n * Wait for DOM to become stable after navigation\n * Uses MutationObserver to detect when DOM stops changing\n */\n async waitForDOMStable(): Promise<void> {\n this.logger.debug('Waiting for DOM stability', {\n delayMs: this.config.domStabilityDelay,\n timeoutMs: this.config.domStabilityTimeout,\n });\n const done = (): void => {\n this.config.onDOMStable?.();\n };\n\n return new Promise((resolve) => {\n let resolved = false;\n const resolveOnce = (): void => {\n if (resolved) return;\n resolved = true;\n done();\n resolve();\n };\n\n // Check if we're in a browser environment\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') {\n resolveOnce();\n return;\n }\n\n let mutationTimeout: ReturnType<typeof setTimeout>;\n let maxTimeout: ReturnType<typeof setTimeout>;\n const startTime = Date.now();\n\n const cleanup = () => {\n observer.disconnect();\n clearTimeout(mutationTimeout);\n clearTimeout(maxTimeout);\n };\n\n const observer = new MutationObserver(() => {\n // Reset the quiet period timer on each mutation\n clearTimeout(mutationTimeout);\n\n // Check if we've exceeded the maximum wait time\n if (Date.now() - startTime >= this.config.domStabilityTimeout) {\n cleanup();\n this.log('DOM stability timeout reached');\n resolveOnce();\n return;\n }\n\n // Wait for quiet period\n mutationTimeout = setTimeout(() => {\n cleanup();\n this.log('DOM is stable');\n resolveOnce();\n }, this.config.domStabilityDelay);\n });\n\n // Start observing\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: false, // Ignore attribute changes for stability\n });\n\n // Set initial quiet period timer\n mutationTimeout = setTimeout(() => {\n cleanup();\n this.log('DOM is stable (no initial mutations)');\n resolveOnce();\n }, this.config.domStabilityDelay);\n\n // Ensure we don't wait forever\n maxTimeout = setTimeout(() => {\n cleanup();\n this.log('DOM stability max timeout reached');\n resolveOnce();\n }, this.config.domStabilityTimeout);\n });\n }\n\n /**\n * Subscribe to route changes\n */\n onRouteChange(callback: (route: string) => void): () => void {\n return this.adapter.onRouteChange(callback);\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a navigation controller\n */\nexport function createNavigationController(\n adapter: NavigationAdapter,\n config?: NavigationControllerConfig\n): NavigationController {\n return new NavigationController(adapter, config);\n}\n","/**\n * DOM Scanner\n * \n * Auto-discovers interactive elements on the page.\n * Extracts semantic information for AI understanding.\n */\n\nimport type { ActionDefinition, ActionType } from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * CSS selectors for interactive elements\n */\nexport const INTERACTIVE_SELECTORS = [\n 'button:not([disabled])',\n 'a[href]:not([disabled])',\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable=\"true\"]',\n '[contenteditable=\"plaintext-only\"]',\n '[role=\"textbox\"]',\n '[role=\"searchbox\"]',\n '[role=\"combobox\"]',\n '[role=\"checkbox\"]',\n '[role=\"switch\"]',\n '[role=\"radio\"]',\n '[role=\"button\"]:not([disabled])',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[onclick]',\n '[data-chatbot-action]',\n];\n\n/**\n * Selectors for elements to ignore\n */\nexport const IGNORE_SELECTORS = [\n '[data-chatbot-ignore]',\n '[aria-hidden=\"true\"]',\n '[hidden]',\n '.chatbot-widget', // Legacy class\n '.navsi-chatbot-container', // Ignore our own widget\n '[type=\"password\"]', // Security: don't interact with password fields\n '[autocomplete*=\"cc-\"]', // Security: credit card fields\n];\n\n/**\n * Scanner configuration\n */\nexport interface DOMScannerConfig {\n /** Root element to scan (default: document.body) */\n root?: Element;\n /** Enable debug logging */\n debug?: boolean;\n /** Maximum actions to discover */\n maxActions?: number;\n /** Debounce delay for mutation scanning */\n debounceMs?: number;\n}\n\n/**\n * Narrow action types the DOM scanner can materialize into concrete DOM targets.\n * (Submit is modelled as a click on a submit button.)\n */\nexport type ScannableActionType = 'click' | 'type' | 'select' | 'scroll' | 'submit';\n\n/**\n * Detailed description of a concrete DOM action candidate discovered by the scanner.\n */\nexport interface ScannedElementAction {\n id: string;\n type: ScannableActionType;\n selector: string;\n /** Higher score = better match for the current goal */\n score: number;\n label: string;\n route: string;\n metadata: Record<string, string> | undefined;\n boundingRect: { x: number; y: number; width: number; height: number };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Generate a unique selector for an element\n */\nfunction generateSelector(element: Element): string {\n // Priority 1: data-chatbot-action attribute\n const chatbotAction = element.getAttribute('data-chatbot-action');\n if (chatbotAction) {\n return `[data-chatbot-action=\"${chatbotAction}\"]`;\n }\n\n // Priority 2: ID\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Priority 3: data-testid (stable under React/Vue re-renders)\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${CSS.escape(testId)}\"]`;\n }\n\n // Priority 4: aria-label (stable, good for buttons/links)\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) {\n const selector = `[aria-label=\"${CSS.escape(ariaLabel)}\"]`;\n const matches = document.querySelectorAll(selector);\n if (matches.length === 1) {\n return selector;\n }\n }\n\n // Priority 5: name (stable for form inputs)\n const name = (element as HTMLInputElement).getAttribute?.('name');\n if (name && /^(input|select|textarea|button)$/i.test(element.tagName)) {\n const selector = `${element.tagName.toLowerCase()}[name=\"${CSS.escape(name)}\"]`;\n const matches = document.querySelectorAll(selector);\n if (matches.length === 1) {\n return selector;\n }\n }\n\n // Priority 6: Unique class combination\n if (element.className && typeof element.className === 'string') {\n const classes = element.className.split(/\\s+/).filter(Boolean).slice(0, 3);\n if (classes.length > 0) {\n const selector = `${element.tagName.toLowerCase()}.${classes.map((c) => CSS.escape(c)).join('.')}`;\n const matches = document.querySelectorAll(selector);\n if (matches.length === 1) {\n return selector;\n }\n }\n }\n\n // Priority 7: Build path-based selector\n return buildPathSelector(element);\n}\n\n/**\n * Build a path-based selector from element to nearest ID\n */\nfunction buildPathSelector(element: Element): string {\n const path: string[] = [];\n let current: Element | null = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${CSS.escape(current.id)}`;\n path.unshift(selector);\n break;\n }\n\n // Get parent element with explicit type\n const parent: Element | null = current.parentElement;\n\n // Add nth-of-type if there are siblings with same tag\n if (parent) {\n const tagName = current.tagName;\n const children = parent.children;\n const sameTagSiblings: Element[] = [];\n\n for (let i = 0; i < children.length; i++) {\n if (children[i].tagName === tagName) {\n sameTagSiblings.push(children[i]);\n }\n }\n\n if (sameTagSiblings.length > 1) {\n const index = sameTagSiblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n\n path.unshift(selector);\n current = parent;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Check if element is visible\n */\nfunction isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (style.opacity === '0') return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) return false;\n\n if (element.closest('[aria-hidden=\"true\"]')) return false;\n\n return true;\n}\n\n/**\n * Simple similarity scorer between a discovered action and a textual goal.\n * Site-agnostic and deterministic – no ML or external dependencies.\n */\nfunction scoreActionForGoal(action: ActionDefinition, goalText: string): number {\n const goal = goalText.toLowerCase().trim();\n if (!goal) return 0;\n\n const label = action.label.toLowerCase();\n let score = 0;\n\n if (label === goal) score += 8;\n if (label.includes(goal)) score += 5;\n\n const metaContext = action.metadata?.context?.toLowerCase();\n const containerText = action.metadata?.containerText?.toLowerCase();\n\n if (metaContext && metaContext.includes(goal)) score += 3;\n if (containerText && containerText.includes(goal)) score += 2;\n\n // Slight preference for actions that were explicitly annotated\n if (action.isAutoDiscovered && action.priority && action.priority > 1) {\n score += 1;\n }\n\n return score;\n}\n\n/**\n * Check if element should be ignored\n */\nfunction shouldIgnore(element: Element): boolean {\n // Check direct ignore selectors\n for (const selector of IGNORE_SELECTORS) {\n if (element.matches(selector)) return true;\n if (element.closest(selector)) return true;\n }\n return false;\n}\n\n/**\n * Get action type from element\n */\nfunction getActionType(element: Element): ActionType {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role')?.toLowerCase();\n\n if (tagName === 'input') {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox' || type === 'radio') return 'click';\n return 'type';\n }\n\n if (tagName === 'textarea') return 'type';\n if (tagName === 'select') return 'select';\n\n if (role === 'textbox' || role === 'searchbox') return 'type';\n if (role === 'combobox') return 'click';\n if (role === 'checkbox' || role === 'radio' || role === 'switch') return 'click';\n\n return 'click';\n}\n\n/**\n * Extract label for an element\n */\nfunction extractLabel(element: Element): string {\n // Priority 1: data-chatbot-action name\n const chatbotAction = element.getAttribute('data-chatbot-action');\n if (chatbotAction) {\n return chatbotAction.replace(/-/g, ' ');\n }\n\n // Priority 2: aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // Priority 2.5: aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labelText = labelledBy\n .split(/\\s+/)\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean)\n .join(' ');\n if (labelText) return labelText;\n }\n\n // Priority 3: title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Priority 4: Text content (for buttons and links)\n const textContent = element.textContent?.trim();\n if (textContent && textContent.length < 50) {\n return textContent;\n }\n\n // Priority 5: placeholder (for inputs)\n const placeholder = element.getAttribute('placeholder');\n if (placeholder) return placeholder;\n\n // Priority 6: name attribute\n const name = element.getAttribute('name');\n if (name) return name.replace(/[-_]/g, ' ');\n\n // Priority 7: Associated label\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label?.textContent) return label.textContent.trim();\n }\n\n // Fallback\n return element.tagName.toLowerCase();\n}\n\n/** Semantic container selectors (HTML/ARIA only; no site-specific classes) for disambiguating duplicate labels */\nconst CONTAINER_SELECTORS = [\n 'tr',\n '[role=\"row\"]',\n 'article',\n '[role=\"listitem\"]',\n 'section',\n '[role=\"group\"]',\n 'main',\n '[role=\"region\"]',\n];\n\nconst MAX_CONTAINER_TEXT_LENGTH = 120;\n\n/**\n * Get text from the closest semantic container (row/card) for disambiguation\n */\nfunction getContainerText(element: Element): string | undefined {\n let current: Element | null = element;\n let depth = 0;\n const maxDepth = 8;\n\n while (current && current !== document.body && depth < maxDepth) {\n for (const sel of CONTAINER_SELECTORS) {\n try {\n if (current.matches(sel)) {\n const text = current.textContent?.trim().replace(/\\s+/g, ' ');\n if (text && text.length > 0) {\n return text.length > MAX_CONTAINER_TEXT_LENGTH\n ? text.slice(0, MAX_CONTAINER_TEXT_LENGTH) + '…'\n : text;\n }\n break;\n }\n } catch {\n // invalid selector, skip\n }\n }\n current = current.parentElement;\n depth++;\n }\n\n return undefined;\n}\n\n/**\n * Get nearby heading for context\n */\nfunction getNearbyHeading(element: Element): string | undefined {\n let current = element.parentElement;\n let depth = 0;\n const maxDepth = 5;\n\n while (current && depth < maxDepth) {\n // Look for heading in parent\n const heading = current.querySelector('h1, h2, h3, h4, h5, h6');\n if (heading?.textContent) {\n return heading.textContent.trim();\n }\n\n // Look for previous sibling headings\n let sibling = current.previousElementSibling;\n while (sibling) {\n if (/^H[1-6]$/.test(sibling.tagName)) {\n return sibling.textContent?.trim();\n }\n sibling = sibling.previousElementSibling;\n }\n\n current = current.parentElement;\n depth++;\n }\n\n return undefined;\n}\n\n// ============================================================================\n// DOM Scanner Class\n// ============================================================================\n\nexport class DOMScanner {\n private config: Required<DOMScannerConfig>;\n private mutationObserver: MutationObserver | null = null;\n private scanTimeout: ReturnType<typeof setTimeout> | null = null;\n private onChangeCallback: ((actions: ActionDefinition[]) => void) | null = null;\n private logger = createLogger('SDK.Scanner');\n\n constructor(config: DOMScannerConfig = {}) {\n this.config = {\n root: config.root ?? (typeof document !== 'undefined' ? document.body : null as unknown as Element),\n debug: config.debug ?? false,\n maxActions: config.maxActions ?? 100,\n debounceMs: config.debounceMs ?? 300,\n };\n this.logger = createLogger('SDK.Scanner', { enabled: this.config.debug, level: 'debug' });\n }\n\n /**\n * Scan the DOM for interactive elements\n */\n scan(): ActionDefinition[] {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const root = this.config.root ?? document.body;\n const actions: ActionDefinition[] = [];\n const currentRoute = typeof window !== 'undefined' ? window.location.pathname : '/';\n\n // Find all interactive elements\n const selector = INTERACTIVE_SELECTORS.join(', ');\n const elements = this.collectInteractiveElements(root, selector);\n\n this.log(`Found ${elements.length} potential interactive elements`);\n\n for (const element of elements) {\n // Skip if we've reached max\n if (actions.length >= this.config.maxActions) break;\n\n // Skip if should ignore\n if (shouldIgnore(element)) continue;\n\n // Skip if not visible\n if (!isVisible(element)) continue;\n\n // Create action definition\n const action = this.createElement(element, currentRoute);\n if (action) {\n actions.push(action);\n }\n }\n\n this.log(`Discovered ${actions.length} actions`);\n return actions;\n }\n\n /**\n * Create action definition from element\n */\n private createElement(element: Element, route: string): ActionDefinition | null {\n try {\n const selector = generateSelector(element);\n const label = extractLabel(element);\n const type = getActionType(element);\n const heading = getNearbyHeading(element);\n\n // Generate unique ID\n const id = `action_${btoa(selector).replace(/[^a-zA-Z0-9]/g, '').slice(0, 16)}`;\n\n const action: ActionDefinition = {\n id,\n type,\n selector,\n label,\n route,\n isAutoDiscovered: true,\n priority: element.hasAttribute('data-chatbot-action') ? 10 : 1,\n };\n\n // Add metadata (heading + container text for disambiguating duplicate labels)\n const containerText = getContainerText(element);\n if (heading || containerText) {\n action.metadata = {\n ...(heading ? { context: heading } : {}),\n ...(containerText ? { containerText } : {}),\n };\n }\n\n return action;\n } catch (error) {\n this.log('Error creating action:', error);\n return null;\n }\n }\n\n /**\n * Collect interactive elements from light DOM and open shadow roots.\n */\n private collectInteractiveElements(root: Element, selector: string): Element[] {\n const results = new Set<Element>();\n const roots: (Element | ShadowRoot)[] = [root];\n\n while (roots.length > 0) {\n const currentRoot = roots.shift();\n if (!currentRoot) {\n break;\n }\n const scope = currentRoot instanceof ShadowRoot ? currentRoot : currentRoot;\n const matches = scope.querySelectorAll(selector);\n for (const match of matches) {\n results.add(match);\n }\n\n const hostRoot = currentRoot instanceof ShadowRoot\n ? currentRoot\n : currentRoot;\n const hostElements = hostRoot.querySelectorAll('*');\n for (const host of hostElements) {\n const shadowRoot = (host as HTMLElement).shadowRoot;\n if (shadowRoot) {\n roots.push(shadowRoot);\n }\n }\n }\n\n return Array.from(results);\n }\n\n /**\n * Start observing DOM for changes. Disconnects any existing observer first.\n */\n observe(callback: (actions: ActionDefinition[]) => void): void {\n if (typeof MutationObserver === 'undefined') return;\n\n // Prevent duplicate observers (memory leak)\n this.disconnect();\n\n this.onChangeCallback = callback;\n\n this.mutationObserver = new MutationObserver(() => {\n this.debouncedScan();\n });\n\n this.mutationObserver.observe(this.config.root ?? document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['disabled', 'hidden', 'aria-hidden'],\n });\n }\n\n /**\n * Stop observing DOM\n */\n disconnect(): void {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n if (this.scanTimeout) {\n clearTimeout(this.scanTimeout);\n this.scanTimeout = null;\n }\n }\n\n /**\n * Debounced scan\n */\n private debouncedScan(): void {\n if (this.scanTimeout) {\n clearTimeout(this.scanTimeout);\n }\n\n this.scanTimeout = setTimeout(() => {\n const actions = this.scan();\n this.onChangeCallback?.(actions);\n }, this.config.debounceMs);\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a DOM scanner instance\n */\nexport function createDOMScanner(config?: DOMScannerConfig): DOMScanner {\n return new DOMScanner(config);\n}\n\n/**\n * Convenience helper: perform a one-off scan using a temporary DOMScanner instance.\n */\nexport function scanActions(config?: DOMScannerConfig): ActionDefinition[] {\n const scanner = new DOMScanner(config);\n return scanner.scan();\n}\n\n/**\n * Find the best matching concrete DOM actions for a textual goal.\n * This is intentionally lightweight and deterministic – it relies only on the\n * existing ActionDefinition data produced by the scanner.\n */\nexport function findBestActionsForGoal(\n goalText: string,\n options?: {\n types?: ScannableActionType[];\n maxResults?: number;\n config?: DOMScannerConfig;\n }\n): ScannedElementAction[] {\n const { types, maxResults = 10, config } = options ?? {};\n const actions = scanActions(config);\n\n const route = typeof window !== 'undefined' ? window.location.pathname : '/';\n\n const allowedTypes = types?.length\n ? new Set<ScannableActionType>(types)\n : undefined;\n\n const scored = actions\n .map((action) => {\n const score = scoreActionForGoal(action, goalText);\n if (score <= 0) return null;\n\n const type: ScannableActionType =\n (action.type as ScannableActionType) === 'click' ||\n (action.type as ScannableActionType) === 'type' ||\n (action.type as ScannableActionType) === 'select' ||\n (action.type as ScannableActionType) === 'scroll'\n ? (action.type as ScannableActionType)\n : 'click';\n\n if (allowedTypes && !allowedTypes.has(type)) {\n return null;\n }\n\n const el = typeof document !== 'undefined'\n ? document.querySelector(action.selector)\n : null;\n const rect = el ? (el as Element).getBoundingClientRect() : { x: 0, y: 0, width: 0, height: 0 };\n\n return {\n id: action.id,\n type,\n selector: action.selector,\n score,\n label: action.label,\n route: action.route || route,\n metadata: action.metadata ?? undefined,\n boundingRect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n },\n };\n })\n .filter((a): a is ScannedElementAction => a !== null);\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n","/**\n * Action Registry\n * \n * Manages all available actions (auto-discovered + manual + server actions).\n */\n\nimport type { ActionDefinition, ServerAction } from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ActionRegistryConfig {\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// ============================================================================\n// Action Registry Class\n// ============================================================================\n\nexport class ActionRegistry {\n private actionsByRoute = new Map<string, Map<string, ActionDefinition>>();\n private serverActions = new Map<string, ServerAction>();\n private manualActions = new Map<string, ActionDefinition>();\n private debug: boolean;\n private logger = createLogger('SDK.Registry');\n\n constructor(config: ActionRegistryConfig = {}) {\n this.debug = config.debug ?? false;\n this.logger = createLogger('SDK.Registry', { enabled: this.debug, level: 'debug' });\n }\n\n // ============================================================================\n // DOM Actions\n // ============================================================================\n\n /**\n * Register auto-discovered actions for a route\n */\n registerDiscoveredActions(route: string, actions: ActionDefinition[]): void {\n if (!this.actionsByRoute.has(route)) {\n this.actionsByRoute.set(route, new Map());\n }\n\n const routeActions = this.actionsByRoute.get(route)!;\n\n // Clear old auto-discovered actions\n for (const [id, action] of routeActions) {\n if (action.isAutoDiscovered) {\n routeActions.delete(id);\n }\n }\n\n // Add new actions\n for (const action of actions) {\n // Check if there's a manual override\n const manualAction = this.manualActions.get(action.id);\n if (manualAction) {\n routeActions.set(action.id, { ...action, ...manualAction });\n } else {\n routeActions.set(action.id, action);\n }\n }\n\n this.log(`Registered ${actions.length} discovered actions for route: ${route}`);\n }\n\n /**\n * Register a manual action definition (takes priority over auto-discovered)\n */\n registerManualAction(action: ActionDefinition): void {\n this.manualActions.set(action.id, action);\n\n // Update existing route actions if present\n const routeActions = this.actionsByRoute.get(action.route);\n if (routeActions?.has(action.id)) {\n const existing = routeActions.get(action.id)!;\n routeActions.set(action.id, { ...existing, ...action, isAutoDiscovered: false });\n }\n\n this.log(`Registered manual action: ${action.id}`);\n }\n\n /**\n * Get all actions for a route\n */\n getActionsForRoute(route: string): ActionDefinition[] {\n const routeActions = this.actionsByRoute.get(route);\n if (!routeActions) return [];\n\n return Array.from(routeActions.values())\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n /**\n * Find action by ID\n */\n findActionById(id: string): ActionDefinition | null {\n for (const routeActions of this.actionsByRoute.values()) {\n const action = routeActions.get(id);\n if (action) return action;\n }\n return null;\n }\n\n /**\n * Find action by selector on a specific route\n */\n findActionBySelector(route: string, selector: string): ActionDefinition | null {\n const routeActions = this.actionsByRoute.get(route);\n if (!routeActions) return null;\n\n for (const action of routeActions.values()) {\n if (action.selector === selector) return action;\n }\n return null;\n }\n\n /**\n * Find action by label (fuzzy match). When context is provided, prefer actions\n * whose metadata.containerText or metadata.context contains the context string.\n */\n findActionByLabel(route: string, label: string, context?: string): ActionDefinition | null {\n const routeActions = this.actionsByRoute.get(route);\n if (!routeActions) return null;\n\n const normalizedLabel = label.toLowerCase().trim();\n const normalizedContext = context?.toLowerCase().trim();\n\n const matchesContext = (action: ActionDefinition): boolean => {\n if (!normalizedContext) return true;\n const containerText = action.metadata?.containerText?.toLowerCase();\n const metaContext = action.metadata?.context?.toLowerCase();\n return (\n (containerText?.includes(normalizedContext) ?? false) ||\n (metaContext?.includes(normalizedContext) ?? false)\n );\n };\n\n // With context: prefer exact label + context match, then partial label + context\n if (normalizedContext) {\n for (const action of routeActions.values()) {\n if (action.label.toLowerCase() === normalizedLabel && matchesContext(action)) {\n return action;\n }\n }\n for (const action of routeActions.values()) {\n if (action.label.toLowerCase().includes(normalizedLabel) && matchesContext(action)) {\n return action;\n }\n }\n }\n\n // Exact match first (no context or no context match)\n for (const action of routeActions.values()) {\n if (action.label.toLowerCase() === normalizedLabel) {\n return action;\n }\n }\n\n // Partial match\n for (const action of routeActions.values()) {\n if (action.label.toLowerCase().includes(normalizedLabel)) {\n return action;\n }\n }\n\n return null;\n }\n\n /**\n * Clear actions for a route\n */\n clearRoute(route: string): void {\n this.actionsByRoute.delete(route);\n }\n\n /**\n * Clear all actions\n */\n clearAll(): void {\n this.actionsByRoute.clear();\n }\n\n // ============================================================================\n // Server Actions\n // ============================================================================\n\n /**\n * Register a server action\n */\n registerServerAction(action: ServerAction): void {\n this.serverActions.set(action.id, action);\n this.log(`Registered server action: ${action.id}`);\n }\n\n /**\n * Get all server actions\n */\n getServerActions(): ServerAction[] {\n return Array.from(this.serverActions.values());\n }\n\n /**\n * Find server action by ID\n */\n findServerActionById(id: string): ServerAction | null {\n return this.serverActions.get(id) ?? null;\n }\n\n /**\n * Find server action by name (fuzzy match)\n */\n findServerActionByName(name: string): ServerAction | null {\n const normalizedName = name.toLowerCase().trim();\n\n for (const action of this.serverActions.values()) {\n if (action.name.toLowerCase() === normalizedName) {\n return action;\n }\n }\n\n for (const action of this.serverActions.values()) {\n if (action.name.toLowerCase().includes(normalizedName)) {\n return action;\n }\n }\n\n return null;\n }\n\n /**\n * Remove a server action\n */\n removeServerAction(id: string): void {\n this.serverActions.delete(id);\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n /**\n * Get statistics\n */\n getStats(): { routes: number; actions: number; serverActions: number } {\n let totalActions = 0;\n for (const routeActions of this.actionsByRoute.values()) {\n totalActions += routeActions.size;\n }\n\n return {\n routes: this.actionsByRoute.size,\n actions: totalActions,\n serverActions: this.serverActions.size,\n };\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create an action registry\n */\nexport function createActionRegistry(config?: ActionRegistryConfig): ActionRegistry {\n return new ActionRegistry(config);\n}\n","/**\n * Page Context Builder\n * \n * Builds comprehensive page context for the AI engine.\n */\n\nimport type { PageContext, PageContent, FormContext, ActionDefinition, ServerAction } from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nexport interface PageContextBuilderConfig {\n /** Maximum content length */\n maxContentLength?: number;\n /** Maximum number of actions to include */\n maxActions?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Collapse repeated whitespace to a single space and trim. */\nfunction normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n// ============================================================================\n// Content Extraction\n// ============================================================================\n\n/**\n * Extract headings from the page\n */\nfunction extractHeadings(): string[] {\n if (typeof document === 'undefined') return [];\n\n const chatbotKeywords = ['chatbot', 'ai assistant', 'ask mode', 'navigate mode', 'navsi', 'intelligent agent'];\n const headings: string[] = [];\n const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6');\n\n for (const element of elements) {\n // Skip chatbot widget headings\n if (element.closest('.chatbot-widget') || element.closest('.navsi-chatbot-container')) continue;\n \n const text = element.textContent?.trim();\n if (text && text.length < 200) {\n // Filter out chatbot-related headings\n const lower = text.toLowerCase();\n const isChatbotRelated = chatbotKeywords.some((keyword) => lower.includes(keyword));\n if (!isChatbotRelated) {\n headings.push(text);\n }\n }\n }\n\n return headings.slice(0, 20); // Limit to 20 headings\n}\n\n/**\n * Extract main content summary\n */\nfunction extractMainContent(maxLength: number): string {\n if (typeof document === 'undefined') return '';\n\n // Try to find main content area\n const mainContent =\n document.querySelector('main') ??\n document.querySelector('[role=\"main\"]') ??\n document.querySelector('article') ??\n document.querySelector('.content') ??\n document.body;\n\n // Get text content, excluding scripts and styles\n const walker = document.createTreeWalker(\n mainContent,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n const parent = node.parentElement;\n if (!parent) return NodeFilter.FILTER_REJECT;\n\n const tagName = parent.tagName.toLowerCase();\n if (['script', 'style', 'noscript'].includes(tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n // Skip chatbot widget\n if (parent.closest('.chatbot-widget') || parent.closest('.navsi-chatbot-container')) {\n return NodeFilter.FILTER_REJECT;\n }\n\n return NodeFilter.FILTER_ACCEPT;\n },\n }\n );\n\n let content = '';\n let node: Node | null;\n\n while ((node = walker.nextNode()) && content.length < maxLength) {\n const text = node.textContent?.trim();\n if (text && text.length > 0) {\n content += text + ' ';\n }\n }\n\n return normalizeWhitespace(content).slice(0, maxLength);\n}\n\n/**\n * Extract forms from the page\n */\nfunction extractForms(): FormContext[] {\n if (typeof document === 'undefined') return [];\n\n const forms: FormContext[] = [];\n const formElements = document.querySelectorAll('form');\n\n for (const form of formElements) {\n // Skip chatbot widget forms\n if (form.closest('.chatbot-widget') || form.closest('.navsi-chatbot-container')) continue;\n\n const fields: FormContext['fields'] = [];\n\n // Get all form inputs\n const inputs = form.querySelectorAll('input, select, textarea');\n\n for (const input of inputs) {\n const element = input as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n if (element.type === 'hidden') continue;\n\n // Get label\n let label: string | undefined;\n if (element.id) {\n const labelElement = document.querySelector(`label[for=\"${element.id}\"]`);\n label = labelElement?.textContent?.trim();\n }\n if (!label && element.getAttribute('aria-label')) {\n label = element.getAttribute('aria-label') ?? undefined;\n }\n\n fields.push({\n name: element.name || element.id || '',\n type: element.type || element.tagName.toLowerCase(),\n label,\n placeholder: 'placeholder' in element ? (element as HTMLInputElement).placeholder : undefined,\n required: element.required,\n value: element.value || undefined,\n });\n }\n\n if (fields.length > 0) {\n forms.push({\n id: form.id || `form_${forms.length}`,\n name: form.name || undefined,\n action: form.action || undefined,\n method: form.method || undefined,\n fields,\n });\n }\n }\n\n return forms.slice(0, 10); // Limit to 10 forms\n}\n\n/**\n * Get meta description\n */\nfunction getMetaDescription(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n const meta = document.querySelector('meta[name=\"description\"]');\n return meta?.getAttribute('content') ?? undefined;\n}\n\n// ============================================================================\n// Page Context Builder Class\n// ============================================================================\n\nexport class PageContextBuilder {\n private config: Required<PageContextBuilderConfig>;\n private logger = createLogger('SDK.Context');\n\n constructor(config: PageContextBuilderConfig = {}) {\n this.config = {\n maxContentLength: config.maxContentLength ?? 2000,\n maxActions: config.maxActions ?? 50,\n debug: config.debug ?? false,\n };\n this.logger = createLogger('SDK.Context', { enabled: this.config.debug, level: 'debug' });\n }\n\n /**\n * Build page context\n */\n build(\n actions: ActionDefinition[],\n serverActions: ServerAction[],\n route?: string\n ): PageContext {\n const currentRoute = route ?? (typeof window !== 'undefined' ? window.location.pathname : '/');\n const title = typeof document !== 'undefined' ? document.title : '';\n\n // Extract page content\n const content: PageContent = {\n headings: extractHeadings(),\n mainContent: extractMainContent(this.config.maxContentLength),\n forms: extractForms(),\n metaDescription: getMetaDescription(),\n };\n\n // Limit actions\n const limitedActions = actions.slice(0, this.config.maxActions);\n\n // Build context\n const context: PageContext = {\n route: currentRoute,\n title,\n actions: limitedActions,\n serverActions,\n content,\n timestamp: Date.now(),\n };\n\n this.log('Built page context:', {\n route: context.route,\n title: context.title,\n actions: context.actions.length,\n serverActions: context.serverActions.length,\n headings: context.content.headings.length,\n forms: context.content.forms.length,\n });\n\n return context;\n }\n\n /**\n * Build minimal context (for rapid updates)\n */\n buildMinimal(\n actions: ActionDefinition[],\n serverActions: ServerAction[],\n route?: string\n ): PageContext {\n const currentRoute = route ?? (typeof window !== 'undefined' ? window.location.pathname : '/');\n\n return {\n route: currentRoute,\n title: typeof document !== 'undefined' ? document.title : '',\n actions: actions.slice(0, this.config.maxActions),\n serverActions,\n content: {\n headings: [],\n mainContent: '',\n forms: [],\n },\n timestamp: Date.now(),\n };\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a page context builder\n */\nexport function createPageContextBuilder(config?: PageContextBuilderConfig): PageContextBuilder {\n return new PageContextBuilder(config);\n}\n","/**\n * DOM Executor\n * \n * Executes actions on DOM elements (click, type, select, scroll).\n * Handles element location, visibility waiting, and error recovery.\n */\n\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ExecutionErrorCode =\n | 'ELEMENT_NOT_FOUND'\n | 'NOT_VISIBLE'\n | 'DISABLED'\n | 'TYPE_MISMATCH'\n | 'OPTION_NOT_FOUND'\n | 'NO_FORM'\n | 'INVALID_TARGET'\n | 'RUNTIME_ERROR';\n\nexport type ExecutionResult = {\n success: boolean;\n selector: string;\n action: string;\n duration: number;\n /** Optional, machine-readable error code for robust handling */\n errorCode?: ExecutionErrorCode;\n /** Human-readable error message */\n error?: string;\n /** Structured metadata about the action / target element */\n metadata?: Record<string, unknown>;\n};\n\nexport interface DOMExecutorConfig {\n /** Timeout for waiting for elements (ms) */\n elementTimeout?: number;\n /** Delay between keystrokes (ms) */\n typeDelay?: number;\n /** Whether to scroll element into view */\n scrollIntoView?: boolean;\n /** Highlight elements before interaction */\n highlightOnInteract?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Query selector across document and open shadow roots.\n * Prefer visible matches when requested.\n */\nfunction querySelectorDeep(\n selector: string,\n options?: { preferVisible?: boolean }\n): Element | null {\n const preferVisible = options?.preferVisible ?? false;\n const roots: (Document | ShadowRoot)[] = [document];\n let firstMatch: Element | null = null;\n\n while (roots.length > 0) {\n const root = roots.shift()!;\n const match = root.querySelector(selector);\n\n if (match) {\n if (!preferVisible) return match;\n if (isElementVisible(match)) return match;\n if (!firstMatch) firstMatch = match;\n }\n\n const hostRoot = root instanceof Document ? root.body ?? root.documentElement : root;\n if (!hostRoot) continue;\n\n const hosts = hostRoot.querySelectorAll('*');\n for (const host of hosts) {\n const shadowRoot = (host as HTMLElement).shadowRoot;\n if (shadowRoot) {\n roots.push(shadowRoot);\n }\n }\n }\n\n return preferVisible ? firstMatch : null;\n}\n\n/**\n * Wait for an element to appear (and optionally be visible)\n */\nasync function waitForElement(\n selector: string,\n timeout: number,\n requireVisible = true\n): Promise<Element | null> {\n const startTime = Date.now();\n\n const isReady = (element: Element | null): element is Element => {\n if (!element) return false;\n return !requireVisible || isElementVisible(element);\n };\n\n return new Promise((resolve) => {\n // Check immediately\n const element = querySelectorDeep(selector, { preferVisible: requireVisible });\n if (isReady(element)) {\n resolve(element);\n return;\n }\n\n // Set up observer\n const observer = new MutationObserver(() => {\n const el = querySelectorDeep(selector, { preferVisible: requireVisible });\n if (isReady(el)) {\n observer.disconnect();\n resolve(el);\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n\n // Timeout\n const checkInterval = setInterval(() => {\n const el = querySelectorDeep(selector, { preferVisible: requireVisible });\n if (isReady(el)) {\n clearInterval(checkInterval);\n observer.disconnect();\n resolve(el);\n }\n\n if (Date.now() - startTime >= timeout) {\n clearInterval(checkInterval);\n observer.disconnect();\n resolve(null);\n }\n }, 100);\n\n // Final timeout\n setTimeout(() => {\n clearInterval(checkInterval);\n observer.disconnect();\n const el = querySelectorDeep(selector, { preferVisible: requireVisible });\n resolve(isReady(el) ? el : null);\n }, timeout);\n });\n}\n\n/**\n * Check if element is visible within the viewport\n */\nfunction isElementVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (style.opacity === '0') return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) return false;\n\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const horizontallyVisible = rect.right > 0 && rect.left < viewportWidth;\n const verticallyVisible = rect.bottom > 0 && rect.top < viewportHeight;\n\n return horizontallyVisible && verticallyVisible;\n}\n\nfunction getElementCenter(element: Element): { x: number; y: number } {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n}\n\nfunction setNativeInputValue(element: HTMLInputElement | HTMLTextAreaElement, value: string): void {\n const prototype = element instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n if (setter) {\n setter.call(element, value);\n } else {\n element.value = value;\n }\n}\n\n/**\n * Scroll element into view\n */\nfunction scrollToElement(element: Element): void {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n });\n}\n\n/**\n * Flash highlight an element\n */\nfunction highlightElement(element: Element, duration = 500): void {\n const htmlElement = element as HTMLElement;\n const originalOutline = htmlElement.style.outline;\n const originalTransition = htmlElement.style.transition;\n\n htmlElement.style.transition = 'outline 0.2s ease';\n htmlElement.style.outline = '3px solid #6366f1';\n\n setTimeout(() => {\n htmlElement.style.outline = originalOutline;\n htmlElement.style.transition = originalTransition;\n }, duration);\n}\n\n/**\n * Simulate typing with realistic delays for input/textarea\n */\nasync function simulateTyping(\n element: HTMLInputElement | HTMLTextAreaElement,\n text: string,\n delay: number\n): Promise<void> {\n // Focus the element\n element.focus();\n\n // Clear existing content\n setNativeInputValue(element, '');\n element.dispatchEvent(new Event('input', { bubbles: true }));\n\n // Type each character\n for (const char of text) {\n // beforeinput for modern frameworks\n try {\n if (typeof InputEvent !== 'undefined') {\n element.dispatchEvent(\n new InputEvent('beforeinput', {\n bubbles: true,\n cancelable: true,\n data: char,\n inputType: 'insertText',\n } as InputEventInit)\n );\n }\n } catch {\n // ignore if InputEvent is not constructible\n }\n\n const nextValue = (element.value ?? '') + char;\n setNativeInputValue(element, nextValue);\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keydown', { key: char, bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keypress', { key: char, bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keyup', { key: char, bubbles: true }));\n\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n // Trigger change event\n element.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\n/**\n * Simulate typing into a contenteditable element\n */\nasync function simulateContentEditableTyping(\n element: HTMLElement,\n text: string,\n delay: number\n): Promise<void> {\n element.focus();\n\n element.textContent = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n\n for (const char of text) {\n try {\n if (typeof InputEvent !== 'undefined') {\n element.dispatchEvent(\n new InputEvent('beforeinput', {\n bubbles: true,\n cancelable: true,\n data: char,\n inputType: 'insertText',\n } as InputEventInit)\n );\n }\n } catch {\n // ignore if InputEvent is not constructible\n }\n\n element.textContent = (element.textContent ?? '') + char;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keydown', { key: char, bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keypress', { key: char, bubbles: true }));\n element.dispatchEvent(new KeyboardEvent('keyup', { key: char, bubbles: true }));\n\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\n/**\n * Collect structured metadata about the target element\n */\nfunction collectElementMetadata(element: Element): Record<string, unknown> {\n const rect = element.getBoundingClientRect();\n const tagName = element.tagName.toLowerCase();\n const attrs: Record<string, string> = {};\n\n if (element instanceof HTMLElement) {\n for (const attr of Array.from(element.attributes)) {\n if (\n attr.name.startsWith('data-') ||\n attr.name === 'aria-label' ||\n attr.name === 'name' ||\n attr.name === 'id'\n ) {\n attrs[attr.name] = attr.value;\n }\n }\n }\n\n return {\n tagName,\n text: (element.textContent ?? '').trim().slice(0, 80),\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n },\n attributes: attrs,\n };\n}\n\n// ============================================================================\n// DOM Executor Class\n// ============================================================================\n\nexport class DOMExecutor {\n private config: Required<DOMExecutorConfig>;\n private logger = createLogger('SDK.Executor');\n\n constructor(config: DOMExecutorConfig = {}) {\n this.config = {\n elementTimeout: config.elementTimeout ?? 6000,\n typeDelay: config.typeDelay ?? 30,\n scrollIntoView: config.scrollIntoView ?? true,\n highlightOnInteract: config.highlightOnInteract ?? true,\n debug: config.debug ?? false,\n };\n this.logger = createLogger('SDK.Executor', { enabled: this.config.debug, level: 'debug' });\n }\n\n /** Delay before retry on failure (ms) */\n private static readonly RETRY_DELAY_MS = 600;\n /** Maximum number of retry attempts */\n private static readonly MAX_RETRIES = 2;\n\n /**\n * Click an element (synthetic events + native click fallback; one retry on failure)\n * Prevents default behavior on links to avoid page reloads\n */\n async click(selector: string): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n const attempt = async (): Promise<ExecutionResult> => {\n const element = await waitForElement(selector, this.config.elementTimeout, true);\n\n if (!element) {\n return this.createResult(\n selector,\n 'click',\n startTime,\n false,\n 'Element not found',\n 'ELEMENT_NOT_FOUND'\n );\n }\n\n if (this.config.scrollIntoView) {\n scrollToElement(element);\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n if (this.config.highlightOnInteract) {\n highlightElement(element);\n }\n\n if (!isElementVisible(element)) {\n return this.createResult(\n selector,\n 'click',\n startTime,\n false,\n 'Element is not visible',\n 'NOT_VISIBLE',\n collectElementMetadata(element)\n );\n }\n\n const htmlElement = element as HTMLElement;\n\n // Disabled / aria-disabled guard\n const isDisabled =\n ((htmlElement as HTMLButtonElement | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement)\n .disabled === true) ||\n htmlElement.getAttribute('aria-disabled') === 'true';\n if (isDisabled) {\n return this.createResult(\n selector,\n 'click',\n startTime,\n false,\n 'Element is disabled',\n 'DISABLED',\n collectElementMetadata(element)\n );\n }\n\n htmlElement.focus();\n\n const { x, y } = getElementCenter(element);\n\n // Hover + pointer enter for compatibility with custom UI\n try {\n if (typeof PointerEvent !== 'undefined') {\n element.dispatchEvent(\n new PointerEvent('pointerover', { bubbles: true, cancelable: true, clientX: x, clientY: y })\n );\n element.dispatchEvent(\n new PointerEvent('pointerenter', { bubbles: true, cancelable: true, clientX: x, clientY: y })\n );\n element.dispatchEvent(\n new PointerEvent('pointermove', { bubbles: true, cancelable: true, clientX: x, clientY: y })\n );\n }\n } catch {\n // ignore if PointerEvent is not constructible\n }\n\n element.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n element.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n element.dispatchEvent(new MouseEvent('mousemove', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n\n // Pointer + mouse events for maximum framework compatibility\n try {\n if (typeof PointerEvent !== 'undefined') {\n element.dispatchEvent(\n new PointerEvent('pointerdown', {\n bubbles: true,\n cancelable: true,\n button: 0,\n clientX: x,\n clientY: y,\n })\n );\n element.dispatchEvent(\n new PointerEvent('pointerup', {\n bubbles: true,\n cancelable: true,\n button: 0,\n clientX: x,\n clientY: y,\n })\n );\n }\n } catch {\n // ignore if PointerEvent is not constructible\n }\n\n // Dispatch synthetic events first for compatibility, then native click\n // React Router's Link/NavLink components handle preventing default navigation internally\n // This approach ensures React Router can handle the navigation properly\n element.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n element.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n element.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, clientX: x, clientY: y }));\n \n // Native click() will properly trigger React Router's event handlers\n // React Router will prevent default navigation automatically for relative links\n htmlElement.click();\n\n this.log('Clicked:', selector);\n return this.createResult(\n selector,\n 'click',\n startTime,\n true,\n undefined,\n undefined,\n collectElementMetadata(element)\n );\n };\n\n const executeWithRetries = async (): Promise<ExecutionResult> => {\n let lastResult: ExecutionResult | null = null;\n for (let retry = 0; retry <= DOMExecutor.MAX_RETRIES; retry++) {\n if (retry > 0) {\n this.log(`Click retry ${retry}/${DOMExecutor.MAX_RETRIES} for:`, selector);\n await new Promise((r) => setTimeout(r, DOMExecutor.RETRY_DELAY_MS * retry));\n }\n try {\n lastResult = await attempt();\n if (lastResult.success) {\n return lastResult;\n }\n } catch (error) {\n lastResult = this.createResult(\n selector,\n 'click',\n startTime,\n false,\n String(error),\n 'RUNTIME_ERROR'\n );\n }\n }\n return lastResult!;\n };\n\n return executeWithRetries();\n }\n\n /**\n * Type text into an element (one retry on failure)\n */\n async type(selector: string, text: string, clearFirst = true): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n const attempt = async (): Promise<ExecutionResult> => {\n const element = await waitForElement(selector, this.config.elementTimeout, true);\n\n if (!element) {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element not found',\n 'ELEMENT_NOT_FOUND'\n );\n }\n\n if (!this.isTypeable(element)) {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element is not typeable',\n 'TYPE_MISMATCH',\n collectElementMetadata(element)\n );\n }\n\n if (this.config.scrollIntoView) {\n scrollToElement(element);\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n if (this.config.highlightOnInteract) {\n highlightElement(element);\n }\n\n const metadata = collectElementMetadata(element);\n\n if (!isElementVisible(element)) {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element is not visible',\n 'NOT_VISIBLE',\n metadata\n );\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const inputElement = element;\n\n // Disabled guard\n if (inputElement.disabled || inputElement.getAttribute('aria-disabled') === 'true') {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element is disabled',\n 'DISABLED',\n metadata\n );\n }\n\n if (clearFirst) {\n await simulateTyping(inputElement, text, this.config.typeDelay);\n } else {\n inputElement.focus();\n setNativeInputValue(inputElement, (inputElement.value ?? '') + text);\n inputElement.dispatchEvent(new Event('input', { bubbles: true }));\n inputElement.dispatchEvent(new Event('change', { bubbles: true }));\n }\n } else if (element instanceof HTMLElement && element.isContentEditable) {\n if (element.getAttribute('aria-disabled') === 'true') {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element is disabled',\n 'DISABLED',\n metadata\n );\n }\n\n await simulateContentEditableTyping(element, text, this.config.typeDelay);\n } else {\n return this.createResult(\n selector,\n 'type',\n startTime,\n false,\n 'Element is not a supported type target',\n 'TYPE_MISMATCH',\n metadata\n );\n }\n\n this.log('Typed into:', selector, 'text:', text.slice(0, 20) + (text.length > 20 ? '...' : ''));\n return this.createResult(\n selector,\n 'type',\n startTime,\n true,\n undefined,\n undefined,\n {\n ...metadata,\n textLength: text.length,\n }\n );\n };\n\n const executeWithRetries = async (): Promise<ExecutionResult> => {\n let lastResult: ExecutionResult | null = null;\n for (let retry = 0; retry <= DOMExecutor.MAX_RETRIES; retry++) {\n if (retry > 0) {\n this.log(`Type retry ${retry}/${DOMExecutor.MAX_RETRIES} for:`, selector);\n await new Promise((r) => setTimeout(r, DOMExecutor.RETRY_DELAY_MS * retry));\n }\n try {\n lastResult = await attempt();\n if (lastResult.success) {\n return lastResult;\n }\n } catch (error) {\n lastResult = this.createResult(\n selector,\n 'type',\n startTime,\n false,\n String(error),\n 'RUNTIME_ERROR'\n );\n }\n }\n return lastResult!;\n };\n\n return executeWithRetries();\n }\n\n /**\n * Select an option from a dropdown (one retry on failure)\n */\n async select(selector: string, value: string): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n const attempt = async (): Promise<ExecutionResult> => {\n const element = await waitForElement(selector, this.config.elementTimeout, true);\n\n if (!element) {\n return this.createResult(\n selector,\n 'select',\n startTime,\n false,\n 'Element not found',\n 'ELEMENT_NOT_FOUND'\n );\n }\n\n if (element.tagName.toLowerCase() !== 'select') {\n return this.createResult(\n selector,\n 'select',\n startTime,\n false,\n 'Element is not a select',\n 'TYPE_MISMATCH',\n collectElementMetadata(element)\n );\n }\n\n if (this.config.scrollIntoView) {\n scrollToElement(element);\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n if (this.config.highlightOnInteract) {\n highlightElement(element);\n }\n\n if (!isElementVisible(element)) {\n return this.createResult(\n selector,\n 'select',\n startTime,\n false,\n 'Element is not visible',\n 'NOT_VISIBLE',\n collectElementMetadata(element)\n );\n }\n\n const selectElement = element as HTMLSelectElement;\n\n if (selectElement.disabled || selectElement.getAttribute('aria-disabled') === 'true') {\n return this.createResult(\n selector,\n 'select',\n startTime,\n false,\n 'Element is disabled',\n 'DISABLED',\n collectElementMetadata(element)\n );\n }\n\n let found = false;\n for (const option of selectElement.options) {\n if (option.value === value || option.textContent?.toLowerCase().includes(value.toLowerCase())) {\n selectElement.value = option.value;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return this.createResult(\n selector,\n 'select',\n startTime,\n false,\n `Option not found: ${value}`,\n 'OPTION_NOT_FOUND',\n {\n ...collectElementMetadata(element),\n attemptedValue: value,\n }\n );\n }\n\n selectElement.dispatchEvent(new Event('input', { bubbles: true }));\n selectElement.dispatchEvent(new Event('change', { bubbles: true }));\n\n this.log('Selected:', selector, 'value:', value);\n return this.createResult(\n selector,\n 'select',\n startTime,\n true,\n undefined,\n undefined,\n {\n ...collectElementMetadata(element),\n selectedValue: value,\n }\n );\n };\n\n const executeWithRetries = async (): Promise<ExecutionResult> => {\n let lastResult: ExecutionResult | null = null;\n for (let retry = 0; retry <= DOMExecutor.MAX_RETRIES; retry++) {\n if (retry > 0) {\n this.log(`Select retry ${retry}/${DOMExecutor.MAX_RETRIES} for:`, selector);\n await new Promise((r) => setTimeout(r, DOMExecutor.RETRY_DELAY_MS * retry));\n }\n try {\n lastResult = await attempt();\n if (lastResult.success) {\n return lastResult;\n }\n } catch (error) {\n lastResult = this.createResult(\n selector,\n 'select',\n startTime,\n false,\n String(error),\n 'RUNTIME_ERROR'\n );\n }\n }\n return lastResult!;\n };\n\n return executeWithRetries();\n }\n\n /**\n * Scroll to an element or position\n */\n async scroll(target: string | { x: number; y: number }): Promise<ExecutionResult> {\n const startTime = Date.now();\n const selectorStr = typeof target === 'string' ? target : `${target.x},${target.y}`;\n\n try {\n if (typeof target === 'string') {\n const element = await waitForElement(target, this.config.elementTimeout, false);\n\n if (!element) {\n return this.createResult(\n selectorStr,\n 'scroll',\n startTime,\n false,\n 'Element not found',\n 'ELEMENT_NOT_FOUND'\n );\n }\n\n if (this.config.highlightOnInteract) {\n highlightElement(element);\n }\n\n scrollToElement(element);\n } else {\n window.scrollTo({\n left: target.x,\n top: target.y,\n behavior: 'smooth',\n });\n }\n\n this.log('Scrolled to:', target);\n return this.createResult(\n selectorStr,\n 'scroll',\n startTime,\n true,\n undefined,\n undefined,\n typeof target === 'string'\n ? (() => {\n const element = querySelectorDeep(target);\n return element ? collectElementMetadata(element) : { selector: target };\n })()\n : { position: target }\n );\n } catch (error) {\n return this.createResult(\n selectorStr,\n 'scroll',\n startTime,\n false,\n String(error),\n 'RUNTIME_ERROR'\n );\n }\n }\n\n /**\n * Submit a form\n */\n async submit(selector: string): Promise<ExecutionResult> {\n const startTime = Date.now();\n\n try {\n const element = await waitForElement(selector, this.config.elementTimeout, true);\n\n if (!element) {\n return this.createResult(\n selector,\n 'submit',\n startTime,\n false,\n 'Element not found',\n 'ELEMENT_NOT_FOUND'\n );\n }\n\n // Find form - either the element is a form, or find parent form\n const form = element.tagName.toLowerCase() === 'form'\n ? element as HTMLFormElement\n : element.closest('form');\n\n if (!form) {\n // Try to find a submit button and click it\n const submitButton = element.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n if (submitButton) {\n return this.click(this.generateSelector(submitButton));\n }\n return this.createResult(\n selector,\n 'submit',\n startTime,\n false,\n 'No form found',\n 'NO_FORM',\n collectElementMetadata(element)\n );\n }\n\n if (this.config.highlightOnInteract) {\n highlightElement(form);\n }\n\n // Submit the form with browser-native behavior\n const submitter = form.querySelector('button[type=\"submit\"], input[type=\"submit\"]') as HTMLElement | null;\n if (typeof form.requestSubmit === 'function') {\n form.requestSubmit(submitter ?? undefined);\n } else {\n const submitEvent = new Event('submit', { bubbles: true, cancelable: true });\n const shouldSubmit = form.dispatchEvent(submitEvent);\n if (shouldSubmit) {\n form.submit();\n }\n }\n\n this.log('Submitted form:', selector);\n return this.createResult(\n selector,\n 'submit',\n startTime,\n true,\n undefined,\n undefined,\n collectElementMetadata(form)\n );\n } catch (error) {\n return this.createResult(\n selector,\n 'submit',\n startTime,\n false,\n String(error),\n 'RUNTIME_ERROR'\n );\n }\n }\n\n /**\n * Check if element is typeable\n */\n private isTypeable(element: Element): boolean {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === 'input') {\n const type = (element as HTMLInputElement).type;\n return ['text', 'email', 'password', 'search', 'tel', 'url', 'number'].includes(type);\n }\n\n if (tagName === 'textarea') return true;\n if (element.hasAttribute('contenteditable')) return true;\n\n return false;\n }\n\n /**\n * Generate a selector for an element\n */\n private generateSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n\n const dataTestId = element.getAttribute('data-testid');\n if (dataTestId) return `[data-testid=\"${dataTestId}\"]`;\n\n return element.tagName.toLowerCase();\n }\n\n /**\n * Create execution result\n */\n private createResult(\n selector: string,\n action: string,\n startTime: number,\n success: boolean,\n error?: string,\n errorCode?: ExecutionErrorCode,\n metadata?: Record<string, unknown>\n ): ExecutionResult {\n if (!success) {\n this.logger.warn('Action failed', {\n action,\n selector,\n error,\n errorCode,\n metadata,\n });\n }\n return {\n success,\n selector,\n action,\n duration: Date.now() - startTime,\n errorCode,\n error,\n metadata,\n };\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a DOM executor\n */\nexport function createDOMExecutor(config?: DOMExecutorConfig): DOMExecutor {\n return new DOMExecutor(config);\n}\n","/**\n * Command Processor\n * \n * Executes AI-generated commands in sequence.\n * Handles navigation, DOM actions, and server actions.\n */\n\nimport type {\n Command,\n NavigateCommand,\n WaitForRouteCommand,\n ClickCommand,\n TypeCommand,\n SelectCommand,\n ScrollCommand,\n ServerActionCommand,\n ReportResultCommand,\n ExecutionState,\n} from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\nimport { DOMExecutor } from './dom-executor.js';\nimport { NavigationController } from '../navigation/controller.js';\nimport { ActionRegistry } from '../scanner/action-registry.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CommandProcessorConfig {\n /** Delay between commands (ms) */\n commandDelay?: number;\n /** Timeout for individual commands (ms) */\n commandTimeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\nexport interface CommandResult {\n command: Command;\n success: boolean;\n result?: unknown;\n error?: string;\n duration: number;\n}\n\nexport type CommandProcessorEvents = {\n stateChange: (state: ExecutionState) => void;\n commandStart: (command: Command, index: number) => void;\n commandComplete: (result: CommandResult) => void;\n complete: (results: CommandResult[]) => void;\n error: (error: Error) => void;\n};\n\n// ============================================================================\n// Command Processor Class\n// ============================================================================\n\nexport class CommandProcessor {\n private config: Required<CommandProcessorConfig>;\n private executor: DOMExecutor;\n private navController: NavigationController;\n private registry: ActionRegistry;\n private logger = createLogger('SDK.Processor');\n private isExecuting = false;\n private shouldAbort = false;\n private listeners = new Map<keyof CommandProcessorEvents, Set<(...args: unknown[]) => void>>();\n\n // Server action handler\n private serverActionHandler: ((actionId: string, params: Record<string, unknown>) => Promise<unknown>) | null = null;\n\n constructor(\n executor: DOMExecutor,\n navController: NavigationController,\n registry: ActionRegistry,\n config: CommandProcessorConfig = {}\n ) {\n this.executor = executor;\n this.navController = navController;\n this.registry = registry;\n this.config = {\n commandDelay: config.commandDelay ?? 650,\n commandTimeout: config.commandTimeout ?? 30000,\n debug: config.debug ?? false,\n };\n this.logger = createLogger('SDK.Processor', { enabled: this.config.debug, level: 'debug' });\n }\n\n /**\n * Set server action handler\n */\n setServerActionHandler(\n handler: (actionId: string, params: Record<string, unknown>) => Promise<unknown>\n ): void {\n this.serverActionHandler = handler;\n }\n\n /**\n * Execute a list of commands\n */\n async execute(commands: Command[]): Promise<CommandResult[]> {\n if (this.isExecuting) {\n throw new Error('Already executing commands');\n }\n\n this.isExecuting = true;\n this.shouldAbort = false;\n const results: CommandResult[] = [];\n let previousCommandType: string | null = null;\n\n try {\n for (let i = 0; i < commands.length; i++) {\n if (this.shouldAbort) {\n this.log('Execution aborted');\n break;\n }\n\n const command = commands[i];\n\n // Auto-insert wait_for_dom_stable before DOM actions if previous command was navigation\n const needsStability = ['click', 'type', 'select', 'scroll'].includes(command.type);\n const previousWasNavigation = previousCommandType && ['navigate', 'wait_for_route'].includes(previousCommandType);\n if (needsStability && previousWasNavigation) {\n this.log('Auto-waiting for DOM stability before:', command.type);\n await this.navController.waitForDOMStable();\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n // Emit state\n this.emit('stateChange', {\n isExecuting: true,\n currentCommand: command,\n currentIndex: i,\n totalCommands: commands.length,\n description: this.describeCommand(command),\n });\n\n this.emit('commandStart', command, i);\n\n // Execute command\n const result = await this.executeCommand(command);\n results.push(result);\n\n this.emit('commandComplete', result);\n\n previousCommandType = command.type;\n\n if (!result.success) {\n this.logger.warn('Command failed, stopping execution', {\n type: command.type,\n error: result.error,\n result: result.result,\n });\n break;\n }\n\n // Delay between commands\n if (i < commands.length - 1) {\n await new Promise((resolve) => setTimeout(resolve, this.config.commandDelay));\n }\n }\n\n this.emit('complete', results);\n return results;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.logger.error('Execution error', err);\n this.emit('error', err);\n throw err;\n } finally {\n this.isExecuting = false;\n this.emit('stateChange', {\n isExecuting: false,\n currentCommand: undefined,\n currentIndex: 0,\n totalCommands: commands.length,\n description: undefined,\n });\n }\n }\n\n /**\n * Abort current execution\n */\n abort(): void {\n this.shouldAbort = true;\n }\n\n /**\n * Get execution status\n */\n getIsExecuting(): boolean {\n return this.isExecuting;\n }\n\n /**\n * Execute a single command\n */\n private async executeCommand(command: Command): Promise<CommandResult> {\n const startTime = Date.now();\n\n try {\n switch (command.type) {\n case 'navigate':\n return await this.executeNavigate(command, startTime);\n\n case 'wait_for_route':\n return await this.executeWaitForRoute(command, startTime);\n\n case 'wait_for_dom_stable':\n return await this.executeWaitForDomStable(command, startTime);\n\n case 'scan_context':\n return await this.executeScanContext(command, startTime);\n\n case 'click':\n return await this.executeClick(command, startTime);\n\n case 'type':\n return await this.executeType(command, startTime);\n\n case 'select':\n return await this.executeSelect(command, startTime);\n\n case 'scroll':\n return await this.executeScroll(command, startTime);\n\n case 'server_action':\n return await this.executeServerAction(command, startTime);\n\n case 'report_result':\n return await this.executeReportResult(command, startTime);\n\n default:\n return this.createResult(command, startTime, false, `Unknown command type`);\n }\n } catch (error) {\n this.logger.error('Command execution error', {\n type: command.type,\n error: String(error),\n });\n return this.createResult(command, startTime, false, String(error));\n }\n }\n\n // ============================================================================\n // Command Executors\n // ============================================================================\n\n private async executeNavigate(command: NavigateCommand, startTime: number): Promise<CommandResult> {\n this.log('Navigating to:', command.target);\n\n const context = await this.navController.executeNavigation(command.target);\n\n if (!context) {\n return this.createResult(command, startTime, false, 'Navigation failed');\n }\n\n return this.createResult(command, startTime, true);\n }\n\n private async executeWaitForRoute(command: WaitForRouteCommand, startTime: number): Promise<CommandResult> {\n this.log('Waiting for route:', command.target);\n\n const success = await this.navController.navigateTo(command.target, command.timeout);\n\n return this.createResult(command, startTime, success, success ? undefined : 'Route timeout');\n }\n\n private async executeWaitForDomStable(command: Command, startTime: number): Promise<CommandResult> {\n this.log('Waiting for DOM to stabilize');\n\n await this.navController.waitForDOMStable();\n\n return this.createResult(command, startTime, true);\n }\n\n private async executeScanContext(command: Command, startTime: number): Promise<CommandResult> {\n this.log('Scanning page context');\n\n // This would trigger a rescan - the actual scanning happens in the ChatbotProvider\n return this.createResult(command, startTime, true);\n }\n\n private async executeClick(command: ClickCommand, startTime: number): Promise<CommandResult> {\n let selector = command.selector;\n const route = this.navController.getCurrentRoute();\n\n // Strategy 1: Use provided selector directly\n if (selector) {\n this.log('Clicking with selector:', selector);\n const result = await this.executor.click(selector);\n if (result.success) {\n return this.createResult(command, startTime, true);\n }\n // Selector failed - try to find by text as fallback\n this.log('Selector failed, trying text fallback:', command.text || selector);\n }\n\n // Strategy 2: If text is provided, resolve by label + context from registry\n if (command.text) {\n const action = this.registry.findActionByLabel(route, command.text, command.context);\n if (action && action.selector !== selector) {\n this.log('Found action by label, clicking:', action.selector);\n const result = await this.executor.click(action.selector);\n if (result.success) {\n return this.createResult(command, startTime, true);\n }\n }\n }\n\n // Strategy 3: Try finding element by data-chatbot-action attribute\n if (command.text) {\n const actionAttr = command.text.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const chatbotSelector = `[data-chatbot-action*=\"${actionAttr}\"]`;\n this.log('Trying data-chatbot-action selector:', chatbotSelector);\n const result = await this.executor.click(chatbotSelector);\n if (result.success) {\n return this.createResult(command, startTime, true);\n }\n }\n\n // Strategy 4: Try finding by aria-label\n if (command.text) {\n const ariaSelector = `[aria-label=\"${command.text}\"]`;\n this.log('Trying aria-label selector:', ariaSelector);\n const result = await this.executor.click(ariaSelector);\n if (result.success) {\n return this.createResult(command, startTime, true);\n }\n }\n\n // Strategy 5: Try finding by text content (button or link with matching text)\n if (command.text) {\n // Try common button/link patterns: buttons, links, elements with button role\n const textToFind = command.text.toLowerCase().trim();\n \n // Check all clickable elements for matching text\n const clickables = document.querySelectorAll('button, a, [role=\"button\"], [data-chatbot-action]');\n for (const el of clickables) {\n const elText = el.textContent?.toLowerCase().trim() || '';\n const ariaLabel = el.getAttribute('aria-label')?.toLowerCase().trim() || '';\n const chatbotAction = el.getAttribute('data-chatbot-action')?.toLowerCase().replace(/-/g, ' ') || '';\n \n if (elText === textToFind || ariaLabel === textToFind || elText.includes(textToFind) || \n chatbotAction === textToFind || chatbotAction.includes(textToFind.replace(/\\s+/g, '-'))) {\n // Generate a selector for this element\n let foundSelector = '';\n if (el.id) {\n foundSelector = `#${el.id}`;\n } else if (el.getAttribute('data-chatbot-action')) {\n foundSelector = `[data-chatbot-action=\"${el.getAttribute('data-chatbot-action')}\"]`;\n } else if (el.getAttribute('aria-label')) {\n foundSelector = `[aria-label=\"${el.getAttribute('aria-label')}\"]`;\n }\n \n if (foundSelector) {\n this.log('Found element by text content, clicking:', foundSelector);\n const result = await this.executor.click(foundSelector);\n if (result.success) {\n return this.createResult(command, startTime, true);\n }\n }\n }\n }\n }\n\n // All strategies failed\n const errorMsg = selector \n ? `Element not found or click failed: ${selector}` \n : `No selector found for: ${command.text || 'unknown'}`;\n return this.createResult(command, startTime, false, errorMsg);\n }\n\n private async executeType(command: TypeCommand, startTime: number): Promise<CommandResult> {\n let selector = command.selector;\n\n if (!selector && command.text) {\n const action = this.registry.findActionByLabel(\n this.navController.getCurrentRoute(),\n command.text\n );\n if (action) selector = action.selector;\n }\n\n if (!selector) {\n return this.createResult(command, startTime, false, 'No selector provided');\n }\n\n this.log('Typing into:', selector, 'value:', command.value);\n let result = await this.executor.type(selector, command.value, command.clear ?? true);\n\n if (!result.success && command.text && result.error?.includes('not found')) {\n const action = this.registry.findActionByLabel(\n this.navController.getCurrentRoute(),\n command.text\n );\n if (action) {\n result = await this.executor.type(action.selector, command.value, command.clear ?? true);\n }\n }\n\n return this.createResult(command, startTime, result.success, result.error);\n }\n\n private async executeSelect(command: SelectCommand, startTime: number): Promise<CommandResult> {\n let selector = command.selector;\n\n if (!selector && command.text) {\n const action = this.registry.findActionByLabel(\n this.navController.getCurrentRoute(),\n command.text\n );\n if (action) selector = action.selector;\n }\n\n if (!selector) {\n return this.createResult(command, startTime, false, 'No selector provided');\n }\n\n this.log('Selecting:', selector, 'value:', command.value);\n let result = await this.executor.select(selector, command.value);\n\n if (!result.success && command.text && result.error?.includes('not found')) {\n const action = this.registry.findActionByLabel(\n this.navController.getCurrentRoute(),\n command.text\n );\n if (action) {\n result = await this.executor.select(action.selector, command.value);\n }\n }\n\n return this.createResult(command, startTime, result.success, result.error);\n }\n\n private async executeScroll(command: ScrollCommand, startTime: number): Promise<CommandResult> {\n const target = command.selector ?? command.position ?? { x: 0, y: 0 };\n\n this.log('Scrolling to:', target);\n const result = await this.executor.scroll(target);\n\n return this.createResult(command, startTime, result.success, result.error);\n }\n\n private async executeServerAction(command: ServerActionCommand, startTime: number): Promise<CommandResult> {\n if (!this.serverActionHandler) {\n return this.createResult(command, startTime, false, 'No server action handler set');\n }\n\n const action = this.registry.findServerActionById(command.actionId);\n\n if (!action) {\n return this.createResult(command, startTime, false, `Server action not found: ${command.actionId}`);\n }\n\n this.log('Executing server action:', command.actionId);\n\n try {\n const result = await this.serverActionHandler(command.actionId, command.params);\n return this.createResult(command, startTime, true, undefined, result);\n } catch (error) {\n return this.createResult(command, startTime, false, String(error));\n }\n }\n\n private async executeReportResult(command: ReportResultCommand, startTime: number): Promise<CommandResult> {\n this.log('Report result command executed');\n\n // Report result is an end command - indicates task completion\n return this.createResult(command, startTime, true);\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n private createResult(\n command: Command,\n startTime: number,\n success: boolean,\n error?: string,\n result?: unknown\n ): CommandResult {\n return {\n command,\n success,\n result,\n error,\n duration: Date.now() - startTime,\n };\n }\n\n /**\n * Build a simple, human-readable description for the current command.\n * This is used by the widget to surface clear progress messages.\n */\n private describeCommand(command: Command): string {\n switch (command.type) {\n case 'click':\n return command.text\n ? `Click \"${command.text}\"`\n : `Click element${command.selector ? ` (${command.selector})` : ''}`;\n case 'type':\n return command.text\n ? `Type into \"${command.text}\"`\n : `Type into element${command.selector ? ` (${command.selector})` : ''}`;\n case 'select':\n return command.text\n ? `Select \"${command.value}\" in \"${command.text}\"`\n : `Select \"${command.value}\"${command.selector ? ` (${command.selector})` : ''}`;\n case 'scroll':\n if (command.selector) return `Scroll to element (${command.selector})`;\n if (command.position) return `Scroll to (${command.position.x}, ${command.position.y})`;\n return 'Scroll';\n case 'navigate':\n return `Navigate to \"${command.target}\"`;\n case 'wait_for_route':\n return `Wait for route \"${command.target}\"`;\n case 'wait_for_dom_stable':\n return 'Wait for page to finish loading';\n case 'scan_context':\n return 'Scan page for available actions';\n case 'server_action':\n return `Execute server action \"${command.actionId}\"`;\n case 'report_result':\n return 'Report result to server';\n default:\n return 'Execute action';\n }\n }\n\n /**\n * Subscribe to events\n */\n on<K extends keyof CommandProcessorEvents>(\n event: K,\n callback: CommandProcessorEvents[K]\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as (...args: unknown[]) => void);\n\n return () => {\n this.listeners.get(event)?.delete(callback as (...args: unknown[]) => void);\n };\n }\n\n private emit<K extends keyof CommandProcessorEvents>(\n event: K,\n ...args: Parameters<CommandProcessorEvents[K]>\n ): void {\n this.listeners.get(event)?.forEach((callback) => {\n try {\n callback(...args);\n } catch (error) {\n this.logger.error(`Error in ${event} listener`, error);\n }\n });\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a command processor\n */\nexport function createCommandProcessor(\n executor: DOMExecutor,\n navController: NavigationController,\n registry: ActionRegistry,\n config?: CommandProcessorConfig\n): CommandProcessor {\n return new CommandProcessor(executor, navController, registry, config);\n}\n","/**\n * Server Action Bridge\n * \n * Executes server actions via two modes:\n * 1. Handler Mode - Execute functions directly in the browser\n * 2. Webhook Mode - Make HTTP requests to backend endpoints\n */\n\nimport type {\n ServerAction,\n ServerActionContext,\n ServerActionResult,\n ServerActionHandler,\n} from '@navsi.ai/shared';\nimport { createLogger } from '@navsi.ai/shared';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ServerActionBridgeConfig {\n /** Default timeout for server actions (ms) */\n defaultTimeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom headers for webhook requests */\n webhookHeaders?: Record<string, string>;\n /** Base URL for relative webhook paths */\n baseUrl?: string;\n}\n\n// ============================================================================\n// Server Action Bridge Class\n// ============================================================================\n\nexport class ServerActionBridge {\n private config: Required<ServerActionBridgeConfig>;\n private actions = new Map<string, ServerAction>();\n private context: ServerActionContext | null = null;\n private logger = createLogger('SDK.ServerAction');\n\n constructor(config: ServerActionBridgeConfig = {}) {\n this.config = {\n defaultTimeout: config.defaultTimeout ?? 30000,\n debug: config.debug ?? false,\n webhookHeaders: config.webhookHeaders ?? {},\n baseUrl: config.baseUrl ?? '',\n };\n this.logger = createLogger('SDK.ServerAction', { enabled: this.config.debug, level: 'debug' });\n }\n\n /**\n * Set the execution context\n */\n setContext(context: ServerActionContext): void {\n this.context = context;\n }\n\n /**\n * Register a server action\n */\n register(action: ServerAction): void {\n this.actions.set(action.id, action);\n this.log(`Registered server action: ${action.id}`);\n }\n\n /**\n * Register multiple server actions\n */\n registerMany(actions: ServerAction[]): void {\n for (const action of actions) {\n this.register(action);\n }\n }\n\n /**\n * Unregister a server action\n */\n unregister(actionId: string): void {\n this.actions.delete(actionId);\n }\n\n /**\n * Get all registered actions\n */\n getActions(): ServerAction[] {\n return Array.from(this.actions.values());\n }\n\n /**\n * Get action by ID\n */\n getAction(actionId: string): ServerAction | undefined {\n return this.actions.get(actionId);\n }\n\n /**\n * Execute a server action\n */\n async execute(\n actionId: string,\n params: Record<string, unknown>\n ): Promise<ServerActionResult> {\n const action = this.actions.get(actionId);\n\n if (!action) {\n return {\n success: false,\n error: `Server action not found: ${actionId}`,\n };\n }\n\n if (!this.context) {\n return {\n success: false,\n error: 'No execution context set',\n };\n }\n\n // Validate required parameters\n const missingParams = action.parameters\n .filter((p) => p.required && !(p.name in params))\n .map((p) => p.name);\n\n if (missingParams.length > 0) {\n return {\n success: false,\n error: `Missing required parameters: ${missingParams.join(', ')}`,\n };\n }\n\n // Apply default values\n const finalParams = { ...params };\n for (const param of action.parameters) {\n if (!(param.name in finalParams) && param.defaultValue !== undefined) {\n finalParams[param.name] = param.defaultValue;\n }\n }\n\n this.log(`Executing server action: ${actionId}`, finalParams);\n\n try {\n // Determine execution mode\n if (action.handler) {\n return await this.executeHandler(action, finalParams);\n } else if (action.webhookUrl) {\n return await this.executeWebhook(action, finalParams);\n } else {\n return {\n success: false,\n error: 'Server action has no handler or webhookUrl',\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log(`Server action error: ${errorMessage}`);\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Execute handler mode action\n */\n private async executeHandler(\n action: ServerAction,\n params: Record<string, unknown>\n ): Promise<ServerActionResult> {\n if (!action.handler) {\n return { success: false, error: 'No handler defined' };\n }\n\n const timeout = action.timeout ?? this.config.defaultTimeout;\n\n // Execute with timeout\n const result = await Promise.race([\n action.handler(params, this.context!),\n new Promise<ServerActionResult>((_, reject) =>\n setTimeout(() => reject(new Error('Timeout')), timeout)\n ),\n ]);\n\n return result;\n }\n\n /**\n * Execute webhook mode action\n */\n private async executeWebhook(\n action: ServerAction,\n params: Record<string, unknown>\n ): Promise<ServerActionResult> {\n if (!action.webhookUrl) {\n return { success: false, error: 'No webhookUrl defined' };\n }\n\n const timeout = action.timeout ?? this.config.defaultTimeout;\n const url = action.webhookUrl.startsWith('http')\n ? action.webhookUrl\n : `${this.config.baseUrl}${action.webhookUrl}`;\n\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.webhookHeaders,\n };\n\n // Add HMAC signature if secret is provided\n if (action.webhookSecret) {\n const signature = await this.generateSignature(\n JSON.stringify(params),\n action.webhookSecret\n );\n headers['X-Signature'] = signature;\n }\n\n // Add context headers\n if (this.context) {\n headers['X-Session-Id'] = this.context.sessionId;\n if (this.context.authToken) {\n headers['Authorization'] = `Bearer ${this.context.authToken}`;\n }\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: 'POST',\n headers,\n body: JSON.stringify({\n actionId: action.id,\n params,\n context: {\n sessionId: this.context?.sessionId,\n userId: this.context?.userId,\n currentRoute: this.context?.currentRoute,\n },\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n this.logger.warn('Webhook failed', { actionId: action.id, status: response.status });\n return {\n success: false,\n error: `Webhook failed with status ${response.status}`,\n };\n }\n\n const data = await response.json();\n this.logger.debug('Webhook success', { actionId: action.id });\n return {\n success: true,\n data,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n return { success: false, error: 'Request timeout' };\n }\n\n throw error;\n }\n }\n\n /**\n * Generate HMAC signature for webhook\n */\n private async generateSignature(payload: string, secret: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));\n return btoa(String.fromCharCode(...new Uint8Array(signature)));\n }\n // Fallback: return empty signature (not secure, but works)\n return '';\n }\n\n private log(...args: unknown[]): void {\n this.logger.debug(...args);\n }\n}\n\n/**\n * Create a server action bridge\n */\nexport function createServerActionBridge(\n config?: ServerActionBridgeConfig\n): ServerActionBridge {\n return new ServerActionBridge(config);\n}\n\n/**\n * Helper to create a simple handler action\n */\nexport function createHandlerAction(\n id: string,\n name: string,\n description: string,\n handler: ServerActionHandler,\n options?: Partial<Omit<ServerAction, 'id' | 'name' | 'description' | 'handler'>>\n): ServerAction {\n return {\n id,\n name,\n description,\n handler,\n parameters: options?.parameters ?? [],\n ...options,\n };\n}\n\n/**\n * Helper to create a webhook action\n */\nexport function createWebhookAction(\n id: string,\n name: string,\n description: string,\n webhookUrl: string,\n options?: Partial<Omit<ServerAction, 'id' | 'name' | 'description' | 'webhookUrl'>>\n): ServerAction {\n return {\n id,\n name,\n description,\n webhookUrl,\n parameters: options?.parameters ?? [],\n ...options,\n };\n}\n","'use client';\n/**\n * ChatbotProvider Component\n * \n * Main provider component that initializes the chatbot SDK.\n * Manages WebSocket connection, message state, and provides context to children.\n */\n\nimport React, { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport type {\n Message,\n ChatMode,\n ConnectionState,\n ServerAction,\n ExecutionState,\n NavigationAdapter,\n WidgetConfig,\n FlatWidgetConfig,\n ServerMessage,\n PageContext,\n Command,\n} from '@navsi.ai/shared';\nimport { normalizeWidgetConfig, createMessageId, createLogger } from '@navsi.ai/shared';\nimport { ChatbotContext } from '../context/chatbot-context.js';\nimport { WebSocketClient } from '../core/websocket/client.js';\nimport { createMemoryAdapter } from '../core/navigation/adapter.js';\nimport { NavigationController } from '../core/navigation/controller.js';\nimport { DOMScanner } from '../core/scanner/dom-scanner.js';\nimport { ActionRegistry } from '../core/scanner/action-registry.js';\nimport { PageContextBuilder } from '../core/scanner/page-context-builder.js';\nimport { DOMExecutor } from '../core/executor/dom-executor.js';\nimport { CommandProcessor } from '../core/executor/command-processor.js';\nimport { ServerActionBridge } from '../core/bridge/server-action-bridge.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChatbotProviderProps {\n /** API key for authentication */\n apiKey: string;\n /** WebSocket server URL */\n serverUrl: string;\n /** Navigation adapter (defaults to memory adapter) */\n navigationAdapter?: NavigationAdapter;\n /** Server actions to register */\n serverActions?: ServerAction[];\n /** Widget config from API (flat shape). Fetched e.g. from GET /api/sdk/config. Takes precedence over options when merged. */\n config?: FlatWidgetConfig | null;\n /** Widget configuration (nested shape). Merged with config if both provided. */\n options?: Partial<WidgetConfig>;\n /** Optional list of available routes (included in page context for the AI) */\n routes?: string[];\n /** Enable debug mode */\n debug?: boolean;\n /** Auto-connect on mount */\n autoConnect?: boolean;\n /** Children components */\n children: React.ReactNode;\n}\n\n// ============================================================================\n// State Management\n// ============================================================================\n\ninterface ChatbotState {\n messages: Message[];\n mode: ChatMode;\n connectionState: ConnectionState;\n isExecuting: boolean;\n executionState: ExecutionState | null;\n error: Error | null;\n}\n\ntype ChatbotAction =\n | { type: 'ADD_MESSAGE'; message: Message }\n | { type: 'UPDATE_MESSAGE'; id: string; updates: Partial<Message> }\n | { type: 'SET_MESSAGES'; messages: Message[] }\n | { type: 'CLEAR_MESSAGES' }\n | { type: 'SET_MODE'; mode: ChatMode }\n | { type: 'SET_CONNECTION_STATE'; state: ConnectionState }\n | { type: 'SET_EXECUTING'; isExecuting: boolean }\n | { type: 'SET_EXECUTION_STATE'; state: ExecutionState | null }\n | { type: 'SET_ERROR'; error: Error | null }\n | { type: 'CLEAR_ERROR' };\n\n// Persist messages to localStorage (keep last 100 messages to prevent storage bloat)\nconst storageLogger = createLogger('SDK.Storage', { enabled: true, level: 'warn' });\n\n/** Debounce timer for persisting messages */\nlet persistDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction persistMessages(messages: Message[], storagePrefix = 'chatbot'): void {\n if (typeof window !== 'undefined') {\n // Debounce: persist at most every 500ms to avoid jank\n if (persistDebounceTimer) clearTimeout(persistDebounceTimer);\n persistDebounceTimer = setTimeout(() => {\n try {\n const messagesToSave = messages.slice(-100);\n localStorage.setItem(`${storagePrefix}-messages`, JSON.stringify(messagesToSave));\n } catch (e) {\n storageLogger.warn('Failed to save messages to localStorage', e);\n try {\n const messagesToSave = messages.slice(-50);\n localStorage.setItem(`${storagePrefix}-messages`, JSON.stringify(messagesToSave));\n } catch (e2) {\n storageLogger.warn('Failed to save even reduced messages', e2);\n }\n }\n }, 500);\n }\n}\n\nfunction chatbotReducer(state: ChatbotState, action: ChatbotAction): ChatbotState {\n let newState: ChatbotState;\n switch (action.type) {\n case 'ADD_MESSAGE': {\n newState = { ...state, messages: [...state.messages, action.message] };\n persistMessages(newState.messages);\n return newState;\n }\n case 'UPDATE_MESSAGE': {\n newState = {\n ...state,\n messages: state.messages.map((m) =>\n m.id === action.id ? { ...m, ...action.updates } : m\n ),\n };\n persistMessages(newState.messages);\n return newState;\n }\n case 'SET_MESSAGES': {\n newState = { ...state, messages: action.messages };\n persistMessages(newState.messages);\n return newState;\n }\n case 'CLEAR_MESSAGES': {\n newState = { ...state, messages: [] };\n persistMessages([]);\n return newState;\n }\n case 'SET_MODE':\n return { ...state, mode: action.mode };\n case 'SET_CONNECTION_STATE':\n return { ...state, connectionState: action.state };\n case 'SET_EXECUTING':\n return { ...state, isExecuting: action.isExecuting };\n case 'SET_EXECUTION_STATE':\n return { ...state, executionState: action.state };\n case 'SET_ERROR':\n return { ...state, error: action.error };\n case 'CLEAR_ERROR':\n return { ...state, error: null };\n default:\n return state;\n }\n}\n\n// Load initial state from localStorage if available\nfunction getInitialState(storagePrefix = 'chatbot'): ChatbotState {\n let messages: Message[] = [];\n let mode: ChatbotState['mode'] = 'ask';\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(`${storagePrefix}-messages`);\n if (saved) {\n messages = JSON.parse(saved);\n }\n } catch (e) {\n storageLogger.warn('Failed to load messages from localStorage', e);\n }\n const savedMode = localStorage.getItem(`${storagePrefix}-mode`);\n if (savedMode === 'ask' || savedMode === 'navigate') {\n mode = savedMode;\n }\n }\n return {\n messages,\n mode,\n connectionState: 'disconnected',\n isExecuting: false,\n executionState: null,\n error: null,\n };\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ChatbotProvider({\n apiKey,\n serverUrl,\n navigationAdapter,\n serverActions = [],\n config: configFromApi,\n options,\n routes,\n debug = false,\n autoConnect = true,\n children,\n}: ChatbotProviderProps): React.ReactElement {\n // Namespace localStorage keys by apiKey to prevent multi-tenant collisions\n const storagePrefix = useMemo(() => `chatbot-${apiKey.slice(0, 8)}`, [apiKey]);\n const logger = useMemo(() => createLogger('SDK', { enabled: debug, level: 'debug' }), [debug]);\n const normalizedFromApi = useMemo(() => normalizeWidgetConfig(configFromApi ?? undefined), [configFromApi]);\n const widgetConfig: Partial<WidgetConfig> = useMemo(() => {\n const base = { ...normalizedFromApi };\n if (options?.theme) {\n base.theme = { ...base.theme!, ...options.theme };\n }\n return {\n ...base,\n ...options,\n theme: base.theme,\n } as Partial<WidgetConfig>;\n }, [normalizedFromApi, options]);\n\n const [state, dispatch] = useReducer(chatbotReducer, storagePrefix, getInitialState);\n const messagesRef = useRef<Message[]>(state.messages);\n // Persist widget open state across navigation using localStorage\n const [isWidgetOpen, setWidgetOpen] = useState(() => {\n if (typeof window !== 'undefined') {\n const saved = localStorage.getItem(`${storagePrefix}-widget-open`);\n if (saved !== null) {\n return saved === 'true';\n }\n }\n return options?.defaultOpen ?? false;\n });\n\n /** User-selected voice/response language (e.g. 'en-US', 'hi-IN'). null = use config or default. */\n const [selectedVoiceLanguage, setSelectedVoiceLanguage] = useState<string | null>(null);\n const effectiveVoiceLanguage = selectedVoiceLanguage ?? widgetConfig?.voiceLanguage ?? undefined;\n\n // Apply default mode from widget config once on mount\n const defaultModeApplied = useRef(false);\n useEffect(() => {\n if (defaultModeApplied.current) return;\n const mode = widgetConfig.defaultMode;\n if (mode === 'ask' || mode === 'navigate') {\n dispatch({ type: 'SET_MODE', mode });\n defaultModeApplied.current = true;\n }\n }, [widgetConfig.defaultMode]);\n\n // Save widget open state to localStorage when it changes\n useEffect(() => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(`${storagePrefix}-widget-open`, String(isWidgetOpen));\n }\n }, [isWidgetOpen, storagePrefix]);\n\n useEffect(() => {\n messagesRef.current = state.messages;\n }, [state.messages]);\n\n // Persist mode to localStorage when it changes\n useEffect(() => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(`${storagePrefix}-mode`, state.mode);\n }\n }, [state.mode, storagePrefix]);\n\n // Refs for stable references\n const wsClientRef = useRef<WebSocketClient | null>(null);\n const navControllerRef = useRef<NavigationController | null>(null);\n const serverActionsRef = useRef<Map<string, ServerAction>>(new Map());\n const pageContextRef = useRef<PageContext | null>(null);\n const scannerRef = useRef<DOMScanner | null>(null);\n const registryRef = useRef<ActionRegistry | null>(null);\n const contextBuilderRef = useRef<PageContextBuilder | null>(null);\n const executorRef = useRef<DOMExecutor | null>(null);\n const commandProcessorRef = useRef<CommandProcessor | null>(null);\n const serverActionBridgeRef = useRef<ServerActionBridge | null>(null);\n const routesRef = useRef<string[] | undefined>(undefined);\n\n // Keep routes ref in sync for use in callbacks\n useEffect(() => {\n routesRef.current = routes;\n }, [routes]);\n\n // Initialize navigation adapter\n const adapter = useMemo(() => {\n return navigationAdapter ?? createMemoryAdapter();\n }, [navigationAdapter]);\n\n // Initialize WebSocket client\n useEffect(() => {\n const client = new WebSocketClient({\n serverUrl,\n apiKey,\n debug,\n });\n\n wsClientRef.current = client;\n\n // Set up event handlers\n client.on('connected', ({ sessionId }) => {\n log('Connected, session:', sessionId);\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'connected' });\n });\n\n client.on('authenticated', ({ sessionId }) => {\n const bridge = serverActionBridgeRef.current;\n const currentRoute = adapter.getCurrentPath();\n if (bridge) {\n bridge.setContext({\n sessionId,\n currentRoute,\n });\n }\n });\n\n client.on('disconnected', () => {\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'disconnected' });\n });\n\n client.on('reconnecting', ({ attempt, maxAttempts }) => {\n log(`Reconnecting ${attempt}/${maxAttempts}`);\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'reconnecting' });\n });\n\n client.on('reconnect_failed', () => {\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'failed' });\n dispatch({ type: 'SET_ERROR', error: new Error('Connection failed') });\n });\n\n client.on('error', ({ error }) => {\n dispatch({ type: 'SET_ERROR', error });\n });\n\n client.on('message', (message: ServerMessage) => {\n handleServerMessage(message);\n });\n\n // Auto-connect if enabled\n if (autoConnect) {\n client.connect();\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'connecting' });\n }\n\n return () => {\n client.disconnect();\n wsClientRef.current = null;\n };\n }, [serverUrl, apiKey, debug, autoConnect]);\n\n // Initialize scanning, registry, execution, and server actions (nav created here with onDOMStable)\n useEffect(() => {\n const registry = new ActionRegistry({ debug });\n const scanner = new DOMScanner({ debug });\n const builder = new PageContextBuilder({ debug });\n const executor = new DOMExecutor({ debug });\n const serverBridge = new ServerActionBridge({ debug });\n\n registryRef.current = registry;\n scannerRef.current = scanner;\n contextBuilderRef.current = builder;\n executorRef.current = executor;\n serverActionBridgeRef.current = serverBridge;\n\n const sendContext = (context: PageContext) => {\n pageContextRef.current = context;\n wsClientRef.current?.send({ type: 'context', context });\n };\n\n const updateBridgeContext = (route: string) => {\n serverBridge.setContext({\n sessionId: wsClientRef.current?.getSessionId() ?? '',\n currentRoute: route,\n });\n };\n\n const runFullScan = (): PageContext => {\n const nav = navControllerRef.current;\n const route = nav ? nav.getCurrentRoute() : (typeof window !== 'undefined' ? window.location.pathname : '/');\n const actions = scanner.scan();\n registry.registerDiscoveredActions(route, actions);\n const context: PageContext = {\n ...builder.build(actions, registry.getServerActions(), route),\n ...(routes?.length ? { routes } : {}),\n };\n updateBridgeContext(context.route);\n sendContext(context);\n return context;\n };\n\n const nav = new NavigationController(adapter, {\n debug,\n onDOMStable: () => runFullScan(),\n });\n navControllerRef.current = nav;\n nav.setScanner(async () => runFullScan());\n\n const processor = new CommandProcessor(executor, nav, registry, { debug });\n commandProcessorRef.current = processor;\n\n processor.setServerActionHandler(async (actionId, params) => {\n return serverBridge.execute(actionId, params);\n });\n\n const processorUnsubscribes: Array<() => void> = [];\n if (debug) {\n processorUnsubscribes.push(\n processor.on('commandStart', (command, index) => {\n log('Command start:', { index, type: command.type, command });\n })\n );\n processorUnsubscribes.push(\n processor.on('commandComplete', (result) => {\n log('Command complete:', {\n type: result.command.type,\n success: result.success,\n duration: result.duration,\n error: result.error,\n });\n })\n );\n processorUnsubscribes.push(\n processor.on('complete', (results) => {\n log('Command batch complete:', {\n total: results.length,\n failed: results.filter((r) => !r.success).length,\n });\n })\n );\n processorUnsubscribes.push(\n processor.on('error', (err) => {\n log('Command processor error:', err);\n })\n );\n }\n\n // Register provided server actions\n serverActions.forEach((action) => {\n serverActionsRef.current.set(action.id, action);\n registry.registerServerAction(action);\n serverBridge.register(action);\n });\n\n scanner.observe((actions) => {\n registry.registerDiscoveredActions(nav.getCurrentRoute(), actions);\n const context: PageContext = {\n ...builder.build(actions, registry.getServerActions(), nav.getCurrentRoute()),\n ...(routes?.length ? { routes } : {}),\n };\n updateBridgeContext(context.route);\n sendContext(context);\n });\n\n const unsubscribeRoute = nav.onRouteChange(() => {\n updateBridgeContext(nav.getCurrentRoute());\n runFullScan();\n });\n\n // Initial scan once DOM is ready\n if (typeof window !== 'undefined') {\n if (document.readyState === 'complete') {\n updateBridgeContext(nav.getCurrentRoute());\n runFullScan();\n } else {\n window.addEventListener('load', () => {\n updateBridgeContext(nav.getCurrentRoute());\n runFullScan();\n }, { once: true });\n }\n }\n\n return () => {\n scanner.disconnect();\n processor.abort();\n processorUnsubscribes.forEach((fn) => fn());\n unsubscribeRoute();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [adapter, debug, routes]);\n\n // Keep server actions in sync when props change\n useEffect(() => {\n const registry = registryRef.current;\n const bridge = serverActionBridgeRef.current;\n\n if (!registry || !bridge) return;\n\n serverActions.forEach((action) => {\n serverActionsRef.current.set(action.id, action);\n registry.registerServerAction(action);\n bridge.register(action);\n });\n }, [serverActions]);\n\n // ============================================================================\n // Message Handlers\n // ============================================================================\n\n const executeCommandBatch = useCallback(async (commands: Command[], batchId: string) => {\n const processor = commandProcessorRef.current;\n if (!processor) {\n return;\n }\n\n dispatch({ type: 'SET_EXECUTING', isExecuting: true });\n\n const unsubscribes: Array<() => void> = [];\n\n unsubscribes.push(\n processor.on('stateChange', (execState) => {\n dispatch({ type: 'SET_EXECUTION_STATE', state: execState });\n dispatch({ type: 'SET_EXECUTING', isExecuting: execState.isExecuting });\n })\n );\n\n unsubscribes.push(\n processor.on('error', (err) => {\n dispatch({ type: 'SET_ERROR', error: err });\n })\n );\n\n try {\n const results = await processor.execute(commands);\n const ws = wsClientRef.current;\n\n results.forEach((result) => {\n if (!ws) return;\n if (result.command.type === 'server_action') {\n ws.send({\n type: 'action_result',\n actionId: result.command.actionId,\n success: result.success,\n result: result.result,\n error: result.error,\n commandId: batchId,\n });\n } else {\n ws.send({\n type: 'action_result',\n actionId: result.command.type,\n success: result.success,\n error: result.error,\n commandId: batchId,\n });\n }\n });\n\n // Refresh context after command batch\n if (scannerRef.current && registryRef.current && contextBuilderRef.current && navControllerRef.current) {\n const actions = scannerRef.current.scan();\n const route = navControllerRef.current.getCurrentRoute();\n registryRef.current.registerDiscoveredActions(route, actions);\n const built = contextBuilderRef.current.build(actions, registryRef.current.getServerActions(), route);\n const context: PageContext = {\n ...built,\n ...(routesRef.current?.length ? { routes: routesRef.current } : {}),\n };\n pageContextRef.current = context;\n if (wsClientRef.current) {\n wsClientRef.current.send({ type: 'context', context });\n }\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n dispatch({ type: 'SET_ERROR', error: err });\n const ws = wsClientRef.current;\n const errorMessage = err.message || 'Execution failed';\n commands.forEach((cmd) => {\n if (!ws) return;\n const actionId = cmd.type === 'server_action' ? cmd.actionId : cmd.type;\n ws.send({\n type: 'action_result',\n actionId,\n success: false,\n error: errorMessage,\n commandId: batchId,\n });\n });\n } finally {\n unsubscribes.forEach((fn) => fn());\n dispatch({ type: 'SET_EXECUTING', isExecuting: false });\n dispatch({ type: 'SET_EXECUTION_STATE', state: null });\n }\n }, []);\n\n const handleServerMessage = useCallback((message: ServerMessage) => {\n log('Server message received:', message.type, message);\n switch (message.type) {\n case 'response':\n {\n const existing = messagesRef.current.find((m) => m.id === message.messageId);\n if (existing && existing.role === 'assistant') {\n dispatch({\n type: 'UPDATE_MESSAGE',\n id: existing.id,\n updates: {\n content: message.message,\n timestamp: Date.now(),\n status: 'sent',\n },\n });\n } else {\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: existing ? createMessageId() : message.messageId,\n role: 'assistant',\n content: message.message,\n timestamp: Date.now(),\n status: 'sent',\n },\n });\n }\n }\n break;\n\n case 'command': {\n log('Received commands:', message.commands);\n const commands = Array.isArray(message.commands) ? message.commands : [];\n const batchId = message.batchId ?? createMessageId();\n\n if (message.message) {\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: createMessageId(),\n role: 'assistant',\n content: message.message,\n timestamp: Date.now(),\n commands: commands.length > 0 ? commands : undefined,\n },\n });\n }\n\n if (commands.length === 0) {\n break;\n }\n\n const processor = commandProcessorRef.current;\n if (!processor) {\n dispatch({ type: 'SET_ERROR', error: new Error('Action runner not ready') });\n commands.forEach((cmd) => {\n const actionId = cmd.type === 'server_action' ? cmd.actionId : cmd.type;\n if (wsClientRef.current) {\n wsClientRef.current.send({\n type: 'action_result',\n actionId,\n success: false,\n error: 'Action runner not ready',\n commandId: batchId,\n });\n }\n });\n break;\n }\n\n executeCommandBatch(commands, batchId);\n break;\n }\n\n case 'typing':\n break;\n\n case 'server_action_result':\n log('Server action result:', message.actionId, message.result);\n break;\n\n case 'error':\n log('Server error:', message.code, message.error, message.details);\n dispatch({\n type: 'SET_ERROR',\n error: new Error(message.error),\n });\n break;\n\n case 'request_context':\n if (pageContextRef.current && wsClientRef.current) {\n wsClientRef.current.send({\n type: 'context',\n context: pageContextRef.current,\n });\n }\n break;\n\n }\n }, [executeCommandBatch]);\n\n // ============================================================================\n // Actions\n // ============================================================================\n\n const sendMessage = useCallback((content: string) => {\n const messageId = createMessageId();\n log('Sending message:', {\n messageId,\n mode: state.mode,\n length: content.length,\n connectionState: state.connectionState,\n route: pageContextRef.current?.route ?? adapter.getCurrentPath(),\n });\n\n dispatch({\n type: 'ADD_MESSAGE',\n message: {\n id: messageId,\n role: 'user',\n content,\n timestamp: Date.now(),\n status: 'sending',\n },\n });\n\n const context: PageContext = pageContextRef.current ?? {\n route: adapter.getCurrentPath(),\n title: typeof document !== 'undefined' ? document.title : '',\n actions: [],\n serverActions: Array.from(serverActionsRef.current.values()),\n content: { headings: [], mainContent: '', forms: [] },\n timestamp: Date.now(),\n ...(routesRef.current?.length ? { routes: routesRef.current } : {}),\n };\n\n const locale = selectedVoiceLanguage ?? widgetConfig?.voiceLanguage ?? undefined;\n wsClientRef.current?.send({\n type: 'message',\n content,\n context,\n mode: state.mode,\n messageId,\n ...(locale != null ? { locale } : {}),\n });\n\n dispatch({\n type: 'UPDATE_MESSAGE',\n id: messageId,\n updates: { status: 'sent' },\n });\n }, [state.mode, adapter, selectedVoiceLanguage, widgetConfig?.voiceLanguage]);\n\n const setVoiceLanguage = useCallback((lang: string | undefined) => {\n setSelectedVoiceLanguage(lang ?? null);\n }, []);\n\n const setMode = useCallback((mode: ChatMode) => {\n dispatch({ type: 'SET_MODE', mode });\n }, []);\n\n const executeAction = useCallback(async (\n actionId: string,\n params?: Record<string, unknown>\n ): Promise<unknown> => {\n const bridge = serverActionBridgeRef.current;\n if (!bridge) {\n throw new Error('Server action bridge not ready');\n }\n\n if (!bridge.getAction(actionId)) {\n const action = serverActionsRef.current.get(actionId);\n if (action) {\n bridge.register(action);\n }\n }\n\n const result = await bridge.execute(actionId, params ?? {});\n\n if (wsClientRef.current) {\n wsClientRef.current.send({\n type: 'action_result',\n actionId,\n success: result.success,\n result: result.data,\n error: result.error,\n });\n }\n\n return result;\n }, []);\n\n const registerServerAction = useCallback((action: ServerAction) => {\n serverActionsRef.current.set(action.id, action);\n registryRef.current?.registerServerAction(action);\n serverActionBridgeRef.current?.register(action);\n logger.debug('Registered server action:', action.id);\n }, [logger]);\n\n const clearMessages = useCallback(() => {\n dispatch({ type: 'CLEAR_MESSAGES' });\n }, []);\n\n const clearError = useCallback(() => {\n dispatch({ type: 'CLEAR_ERROR' });\n }, []);\n\n const stopExecution = useCallback(() => {\n commandProcessorRef.current?.abort();\n }, []);\n\n const connect = useCallback(() => {\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'connecting' });\n wsClientRef.current?.connect();\n }, []);\n\n const disconnect = useCallback(() => {\n wsClientRef.current?.disconnect();\n dispatch({ type: 'SET_CONNECTION_STATE', state: 'disconnected' });\n }, []);\n\n // ============================================================================\n // Logging\n // ============================================================================\n\n function log(...args: unknown[]): void {\n logger.debug(...args);\n }\n\n // ============================================================================\n // Context Value\n // ============================================================================\n\n const contextValue = useMemo(() => ({\n widgetConfig,\n // State\n messages: state.messages,\n mode: state.mode,\n connectionState: state.connectionState,\n isExecuting: state.isExecuting,\n executionState: state.executionState,\n error: state.error,\n // Widget visibility (persists across navigation)\n isWidgetOpen,\n setWidgetOpen,\n voiceLanguage: effectiveVoiceLanguage,\n setVoiceLanguage,\n\n // Actions\n sendMessage,\n setMode,\n executeAction,\n registerServerAction,\n clearMessages,\n clearError,\n stopExecution,\n\n // Connection\n connect,\n disconnect,\n isConnected: state.connectionState === 'connected',\n }), [\n widgetConfig,\n state,\n isWidgetOpen,\n effectiveVoiceLanguage,\n setVoiceLanguage,\n sendMessage,\n setMode,\n executeAction,\n registerServerAction,\n clearMessages,\n clearError,\n stopExecution,\n connect,\n disconnect,\n ]);\n\n return (\n <ChatbotContext.Provider value={contextValue}>\n {children}\n </ChatbotContext.Provider>\n );\n}\n","'use client';\n/**\n * ChatbotWidget Component\n * \n * Floating chat widget UI component.\n */\n\nimport React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { useChatbot } from '../hooks/useChatbot.js';\nimport { useActionExecution } from '../hooks/useActionExecution.js';\nimport { useWebSocket } from '../hooks/useWebSocket.js';\n\n/** Renders inline text with **bold** and preserves whitespace/line breaks */\nfunction renderInlineWithBold(text: string): React.ReactNode {\n const parts: React.ReactNode[] = [];\n let key = 0;\n let remaining = text;\n while (remaining.length > 0) {\n const i = remaining.indexOf('**');\n if (i === -1) {\n parts.push(<React.Fragment key={key++}>{remaining}</React.Fragment>);\n break;\n }\n const before = remaining.slice(0, i);\n const after = remaining.slice(i + 2);\n const j = after.indexOf('**');\n if (j === -1) {\n parts.push(<React.Fragment key={key++}>{remaining}</React.Fragment>);\n break;\n }\n if (before) parts.push(<React.Fragment key={key++}>{before}</React.Fragment>);\n parts.push(<strong key={key++}>{after.slice(0, j)}</strong>);\n remaining = after.slice(j + 2);\n }\n return parts.length === 1 ? parts[0] : <>{parts}</>;\n}\n\n/** Renders assistant message content with basic markdown (bold, bullet lists, paragraphs) */\nfunction MessageContent({ content, isUser }: { content: string; isUser: boolean }): React.ReactElement {\n if (isUser) return <>{content}</>;\n const raw = typeof content === 'string' ? content : '';\n if (!raw.trim()) return <> </>;\n const lines = raw.split(/\\n/);\n const nodes: React.ReactNode[] = [];\n let listItems: string[] = [];\n const flushList = () => {\n if (listItems.length > 0) {\n nodes.push(\n <ul key={nodes.length} className=\"navsi-chatbot-message-list\">\n {listItems.map((item, i) => (\n <li key={i} className=\"navsi-chatbot-message-list-item\">\n {renderInlineWithBold(item)}\n </li>\n ))}\n </ul>\n );\n listItems = [];\n }\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n const bulletMatch = trimmed.match(/^[*-]\\s+(.*)$/);\n if (bulletMatch) {\n flushList();\n listItems.push(bulletMatch[1].trim());\n } else {\n flushList();\n if (trimmed) {\n nodes.push(\n <p key={nodes.length} className=\"navsi-chatbot-message-paragraph\">\n {renderInlineWithBold(trimmed)}\n </p>\n );\n }\n }\n }\n flushList();\n if (nodes.length === 0) return <>{raw}</>;\n return <div className=\"navsi-chatbot-message-content\">{nodes}</div>;\n}\n\nexport interface ChatbotWidgetProps {\n /** Custom class name for the widget container */\n className?: string;\n /** Custom class name for the widget window */\n windowClassName?: string;\n /** Custom class name for the toggle button */\n buttonClassName?: string;\n}\n\ntype SpeechRecognitionConstructor = new () => SpeechRecognition;\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n maxAlternatives: number;\n lang: string;\n onstart: ((event: Event) => void) | null;\n onend: ((event: Event) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n start: () => void;\n stop: () => void;\n abort: () => void;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n resultIndex: number;\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item: (index: number) => SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n isFinal: boolean;\n length: number;\n item: (index: number) => SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n}\n\nfunction getSpeechRecognitionConstructor(): SpeechRecognitionConstructor | null {\n if (typeof window === 'undefined') return null;\n const win = window as Window & {\n SpeechRecognition?: SpeechRecognitionConstructor;\n webkitSpeechRecognition?: SpeechRecognitionConstructor;\n };\n const recognition = win.SpeechRecognition ?? win.webkitSpeechRecognition;\n return recognition ?? null;\n}\n\nfunction isBraveBrowser(): boolean {\n return typeof navigator !== 'undefined' && 'brave' in navigator;\n}\n\nfunction describeSpeechError(error: string): string {\n if (error === 'network') {\n const online = typeof navigator !== 'undefined' ? navigator.onLine : true;\n if (!online) {\n return 'Voice input error: network. You appear to be offline.';\n }\n if (isBraveBrowser()) {\n return 'Voice input error: network. Brave may block speech services; disable Shields or try Chrome/Edge.';\n }\n const isLocalhost = typeof window !== 'undefined'\n && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');\n const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:';\n if (!isSecure && !isLocalhost) {\n return 'Voice input error: network. Microphone access requires HTTPS.';\n }\n return 'Voice input error: network. Check microphone permission and reload the page.';\n }\n if (error === 'not-allowed' || error === 'service-not-allowed') {\n return 'Voice input error: microphone permission blocked.';\n }\n if (error === 'no-speech') {\n return 'Voice input error: no speech detected.';\n }\n if (error === 'audio-capture') {\n return 'Voice input error: no microphone found.';\n }\n return `Voice input error: ${error}`;\n}\n\n/**\n * Floating chat widget component. Open state is stored in context so the panel\n * stays open across navigation (e.g. when using Action mode).\n * Supports Ask and Action modes for text chat.\n * \n * All styling is controlled via CSS classes. Users have full control over appearance.\n *\n * @example\n * ```tsx\n * <ChatbotProvider apiKey=\"...\" serverUrl=\"...\">\n * <App />\n * <ChatbotWidget className=\"my-chatbot\" />\n * </ChatbotProvider>\n * ```\n */\nexport function ChatbotWidget({ className, windowClassName, buttonClassName }: ChatbotWidgetProps): React.ReactElement {\n const [input, setInput] = useState('');\n const [isListening, setIsListening] = useState(false);\n const [voiceTranscript, setVoiceTranscript] = useState('');\n const [voiceError, setVoiceError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const finalTranscriptRef = useRef('');\n const lastSpokenIdRef = useRef<string | null>(null);\n const hasInitializedSpeechRef = useRef(false);\n const shouldSpeakNextAssistantRef = useRef(false);\n const { messages, sendMessage, isConnected, mode, setMode, isExecuting, error, clearError, clearMessages, isWidgetOpen, setWidgetOpen, stopExecution, widgetConfig, voiceLanguage, setVoiceLanguage } = useChatbot();\n const effectiveVoiceLang = voiceLanguage ?? widgetConfig?.voiceLanguage ?? (typeof navigator !== 'undefined' ? navigator.language : undefined) ?? 'en-US';\n const { progress } = useActionExecution();\n const { isReconnecting } = useWebSocket();\n const speechRecognitionConstructor = useMemo(getSpeechRecognitionConstructor, []);\n const isVoiceSupported = !!speechRecognitionConstructor;\n\n // Auto-scroll to bottom when new messages arrive or widget opens\n useEffect(() => {\n if (messages.length > 0 && messagesContainerRef.current && isWidgetOpen) {\n // Use requestAnimationFrame to ensure DOM has updated\n requestAnimationFrame(() => {\n if (messagesContainerRef.current) {\n messagesContainerRef.current.scrollTo({\n top: messagesContainerRef.current.scrollHeight,\n behavior: 'smooth',\n });\n }\n });\n }\n }, [messages, isWidgetOpen]);\n\n useEffect(() => {\n if (!hasInitializedSpeechRef.current) {\n const lastAssistant = [...messages].reverse().find((msg) => msg.role === 'assistant');\n lastSpokenIdRef.current = lastAssistant?.id ?? null;\n hasInitializedSpeechRef.current = true;\n }\n }, []);\n\n useEffect(() => {\n const lastAssistant = [...messages].reverse().find((msg) => msg.role === 'assistant');\n if (!lastAssistant) return;\n if (!hasInitializedSpeechRef.current) return;\n if (lastAssistant.id === lastSpokenIdRef.current) return;\n if (isListening) return;\n if (!shouldSpeakNextAssistantRef.current) return;\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) return;\n const content = lastAssistant.content?.trim();\n if (!content) return;\n // Strip markdown formatting for speech\n const ttsContent = content.replace(/\\*\\*(.*?)\\*\\*/g, '$1').replace(/[*_~`]/g, '');\n const ttsLang = effectiveVoiceLang;\n window.speechSynthesis.cancel();\n const utterance = new SpeechSynthesisUtterance(ttsContent);\n utterance.lang = ttsLang;\n window.speechSynthesis.speak(utterance);\n lastSpokenIdRef.current = lastAssistant.id;\n shouldSpeakNextAssistantRef.current = false;\n }, [messages, isListening, effectiveVoiceLang]);\n\n const handleSend = () => {\n if (input.trim()) {\n shouldSpeakNextAssistantRef.current = false;\n sendMessage(input.trim());\n setInput('');\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const startVoiceInput = useCallback(() => {\n if (isListening) return;\n if (!speechRecognitionConstructor) {\n setVoiceError('Voice input is not supported in this browser.');\n return;\n }\n setVoiceError(null);\n finalTranscriptRef.current = '';\n const recognition = new speechRecognitionConstructor();\n recognitionRef.current = recognition;\n recognition.continuous = false;\n recognition.interimResults = true;\n recognition.maxAlternatives = 1;\n recognition.lang = effectiveVoiceLang;\n recognition.onstart = () => {\n setIsListening(true);\n setVoiceTranscript('');\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n window.speechSynthesis.cancel();\n }\n };\n recognition.onresult = (event) => {\n let interimTranscript = '';\n let finalTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; i += 1) {\n const result = event.results[i];\n const text = result[0]?.transcript ?? '';\n if (result.isFinal) {\n finalTranscript += text;\n } else {\n interimTranscript += text;\n }\n }\n if (finalTranscript) {\n finalTranscriptRef.current = `${finalTranscriptRef.current} ${finalTranscript}`.trim();\n setVoiceTranscript(finalTranscriptRef.current);\n } else if (interimTranscript) {\n setVoiceTranscript(interimTranscript.trim());\n }\n };\n recognition.onerror = (event) => {\n setVoiceError(event.error ? describeSpeechError(event.error) : 'Voice input error');\n };\n recognition.onend = () => {\n setIsListening(false);\n const finalText = finalTranscriptRef.current.trim();\n finalTranscriptRef.current = '';\n setVoiceTranscript('');\n if (finalText) {\n shouldSpeakNextAssistantRef.current = true;\n sendMessage(finalText);\n setInput('');\n }\n };\n recognition.start();\n }, [isListening, speechRecognitionConstructor, sendMessage, effectiveVoiceLang]);\n\n const stopVoiceInput = useCallback(() => {\n recognitionRef.current?.stop();\n }, []);\n\n useEffect(() => {\n return () => {\n recognitionRef.current?.abort();\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\n window.speechSynthesis.cancel();\n }\n };\n }, []);\n\n // Minimal functional styles - only position for container\n const containerStyle: React.CSSProperties = {\n position: 'fixed',\n zIndex: 9999,\n };\n\n // Configurable UI strings from widgetConfig, with sensible defaults\n const title = widgetConfig?.headerTitle ?? 'AI Assistant';\n const welcomeMessage = widgetConfig?.welcomeMessage ?? 'How can I help you today?';\n const welcomeHint = widgetConfig?.subtitle ?? 'Type a message to get started';\n const askPlaceholder = widgetConfig?.askPlaceholder ?? 'Ask a question...';\n const navigatePlaceholder = widgetConfig?.navigatePlaceholder ?? 'What should I do? Try: Go to cart, Add product 1 to cart';\n\n // Configurable language options (defaults to EN/Hindi for backward compat)\n const supportedLanguages: Array<{ code: string; label: string }> = widgetConfig?.supportedLanguages ?? [\n { code: 'en-US', label: 'EN' },\n { code: 'hi-IN', label: 'हिंदी' },\n ];\n\n return (\n <div style={containerStyle} className={`navsi-chatbot-container ${className || ''}`}>\n {isWidgetOpen && (\n <div className={`navsi-chatbot-window ${windowClassName || ''}`}>\n {/* Header */}\n <div className=\"navsi-chatbot-header\">\n <div className=\"navsi-chatbot-header-left\">\n <div>\n <div className=\"navsi-chatbot-title\">{title}</div>\n <div className=\"navsi-chatbot-status\">\n {isConnected ? 'Connected' : isReconnecting ? 'Reconnecting' : 'Disconnected'}\n </div>\n {isListening && (\n <div className=\"navsi-chatbot-voice-indicator\" aria-live=\"polite\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n Listening…\n </div>\n )}\n </div>\n </div>\n <div className=\"navsi-chatbot-mode-toggle\">\n <button\n className={`navsi-chatbot-mode-button ${mode === 'ask' ? 'navsi-chatbot-mode-active' : ''}`}\n onClick={() => setMode('ask')}\n >\n Ask\n </button>\n <button\n className={`navsi-chatbot-mode-button ${mode === 'navigate' ? 'navsi-chatbot-mode-active' : ''}`}\n onClick={() => setMode('navigate')}\n >\n Action\n </button>\n </div>\n <div className=\"navsi-chatbot-lang-toggle\" role=\"group\" aria-label=\"Voice and response language\">\n {supportedLanguages.map((lang) => (\n <button\n key={lang.code}\n type=\"button\"\n className={`navsi-chatbot-lang-button ${effectiveVoiceLang.startsWith(lang.code.split('-')[0]) ? 'navsi-chatbot-lang-active' : ''}`}\n onClick={() => setVoiceLanguage(lang.code)}\n title={lang.label}\n aria-pressed={effectiveVoiceLang.startsWith(lang.code.split('-')[0])}\n >\n {lang.label}\n </button>\n ))}\n </div>\n {messages.length > 0 && (\n <button\n type=\"button\"\n onClick={() => clearMessages()}\n className=\"navsi-chatbot-clear\"\n title=\"Clear chat\"\n aria-label=\"Clear chat\"\n >\n Clear\n </button>\n )}\n </div>\n\n {isExecuting && (\n <div className=\"navsi-chatbot-banner\">\n <span>⚡ Executing actions…</span>\n {progress && (\n <>\n <span className=\"navsi-chatbot-pill\">\n {progress.current + 1}/{progress.total}\n </span>\n {progress.description && (\n <span className=\"navsi-chatbot-step\">\n {progress.description}\n </span>\n )}\n </>\n )}\n </div>\n )}\n\n {progress && (\n <div className=\"navsi-chatbot-progress-container\">\n <div className=\"navsi-chatbot-progress-bar\">\n <div \n className=\"navsi-chatbot-progress-fill\" \n style={{ width: `${progress.percentage ?? 0}%` }}\n />\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"navsi-chatbot-error\">\n <span>{error.message}</span>\n <button\n className=\"navsi-chatbot-error-close\"\n onClick={clearError}\n >\n ✕\n </button>\n </div>\n )}\n\n {voiceError && (\n <div className=\"navsi-chatbot-voice-error\" role=\"alert\">\n {voiceError}\n </div>\n )}\n\n {/* Messages */}\n <div\n ref={messagesContainerRef}\n className=\"navsi-chatbot-messages\"\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Chat messages\"\n >\n {messages.length === 0 && (\n <div className=\"navsi-chatbot-welcome\">\n <div className=\"navsi-chatbot-welcome-icon\">👋</div>\n <div className=\"navsi-chatbot-welcome-text\">{welcomeMessage}</div>\n <div className=\"navsi-chatbot-welcome-hint\">{welcomeHint}</div>\n </div>\n )}\n {messages.map((msg) => (\n <div \n key={msg.id} \n className={`navsi-chatbot-message ${msg.role === 'user' ? 'navsi-chatbot-message-user' : 'navsi-chatbot-message-assistant'}`}\n >\n <MessageContent content={msg.content} isUser={msg.role === 'user'} />\n </div>\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <div className=\"navsi-chatbot-input-area\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={mode === 'ask' ? askPlaceholder : navigatePlaceholder}\n className=\"navsi-chatbot-input\"\n maxLength={8000}\n aria-label={mode === 'ask' ? askPlaceholder : navigatePlaceholder}\n />\n <button\n className={`navsi-chatbot-voice-button ${isListening ? 'navsi-chatbot-voice-button-active' : ''}`}\n onClick={() => {\n if (isListening) {\n stopVoiceInput();\n } else {\n startVoiceInput();\n }\n }}\n disabled={!isConnected || !isVoiceSupported}\n aria-label={\n !isVoiceSupported\n ? 'Voice input not supported in this browser'\n : isListening\n ? 'Stop voice input'\n : 'Start voice input'\n }\n aria-pressed={isListening}\n title={\n !isVoiceSupported\n ? 'Voice input is not available in this browser'\n : isListening\n ? 'Click to stop and send'\n : 'Click to start listening'\n }\n type=\"button\"\n >\n {isListening ? (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n ) : (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n )}\n </button>\n {isExecuting ? (\n <button\n className=\"navsi-chatbot-stop-button\"\n onClick={stopExecution}\n aria-label=\"Stop\"\n title=\"Stop current action\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />\n </svg>\n </button>\n ) : (\n <button \n className=\"navsi-chatbot-send-button\" \n onClick={handleSend} \n disabled={!isConnected}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n </button>\n )}\n </div>\n {voiceTranscript && (\n <div className=\"navsi-chatbot-voice-transcript\" aria-live=\"polite\">\n {voiceTranscript}\n </div>\n )}\n </div>\n )}\n\n {/* Toggle Button */}\n <button\n className={`navsi-chatbot-toggle ${buttonClassName || ''}`}\n onClick={() => setWidgetOpen(!isWidgetOpen)}\n aria-label={isWidgetOpen ? 'Close chat' : 'Open chat'}\n >\n {isWidgetOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n )}\n </button>\n </div>\n );\n}\n"]}
|