@foisit/angular-wrapper 2.4.65 → 2.4.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../libs/core/src/lib/ai/openai.service.ts", "../../../../libs/core/src/lib/command/command-handler.ts", "../../../../libs/core/src/lib/speech/text-to-speech.ts", "../../../../libs/core/src/lib/fallback/fallback-handler.ts", "../../../../libs/core/src/lib/speech/voice-processor.ts", "../../../../libs/core/src/lib/utils/dom-interactions.ts", "../../../../libs/core/src/lib/utils/is-browser.ts", "../../../../libs/core/src/lib/state-manager.ts", "../../../../libs/core/src/lib/ui/overlay-manager.ts", "../../../../libs/angular-wrapper/src/lib/angular-wrapper/angular-wrapper.component.ts", "../../../../libs/angular-wrapper/src/lib/angular-wrapper/angular-wrapper.component.html", "../../../../libs/angular-wrapper/src/lib/service/assistant.service.ts", "../../../../libs/angular-wrapper/src/lib/assistant.module.ts", "../../../../libs/angular-wrapper/src/foisit-angular-wrapper.ts"],
4
- "sourcesContent": ["import { AssistantCommand } from '../interfaces/assistant-command.interface';\n\nexport interface IntentResult {\n type: 'match' | 'ambiguous' | 'unknown';\n match?: string;\n confidence?: number;\n options?: { label: string; commandId: string }[];\n message?: string;\n params?: Record<string, any>;\n incomplete?: boolean;\n}\n\nexport class OpenAIService {\n private endpoint: string;\n\n constructor(endpoint?: string) {\n this.endpoint =\n endpoint || 'https://foisit-ninja.netlify.app/.netlify/functions/intent';\n }\n\n async determineIntent(\n userInput: string,\n availableCommands: AssistantCommand[],\n context?: { commandId: string; params: any } | null\n ): Promise<IntentResult> {\n try {\n // Prepare the payload\n const payload = {\n userInput,\n commands: availableCommands.map((cmd) => ({\n id: cmd.id,\n command: cmd.command,\n description: cmd.description,\n parameters: cmd.parameters, // Send param schemas to AI\n })),\n context,\n };\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Proxy API Error: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result as IntentResult;\n } catch (error) {\n console.error('OpenAIService Error:', error);\n return { type: 'unknown' };\n }\n }\n}\n", "import { OpenAIService, IntentResult } from '../ai/openai.service';\nimport {\n AssistantCommand,\n AssistantCommandParams,\n AssistantParameter,\n SelectOption,\n} from '../interfaces/assistant-command.interface';\nimport { InteractiveResponse } from '../interfaces/interactive-response.interface';\n\ntype CommandParams = AssistantCommandParams;\ntype CommandContext = { commandId: string; params: CommandParams };\ntype PendingConfirmation = { commandId: string; params: CommandParams };\n\ntype StructuredCommandInput = {\n commandId: string;\n params?: CommandParams;\n};\n\ntype CommandHandlerOptions = {\n enableSmartIntent?: boolean;\n intentEndpoint?: string;\n};\n\nexport class CommandHandler {\n private commands = new Map<string, AssistantCommand>();\n private openAIService: OpenAIService | null = null;\n private context: CommandContext | null = null;\n private pendingConfirmation: PendingConfirmation | null = null;\n private enableSmartIntent = true;\n private selectOptionsCache = new Map<string, { options: SelectOption[]; ts: number }>();\n\n constructor(arg: boolean | CommandHandlerOptions = true) {\n if (typeof arg === 'boolean') {\n this.enableSmartIntent = arg;\n if (this.enableSmartIntent) {\n this.openAIService = new OpenAIService();\n }\n return;\n }\n\n this.enableSmartIntent = arg.enableSmartIntent ?? true;\n if (this.enableSmartIntent) {\n this.openAIService = new OpenAIService(arg.intentEndpoint);\n }\n }\n\n /** Add a new command (string or object) */\n addCommand(\n commandOrObj: string | AssistantCommand,\n action?: AssistantCommand['action']\n ): void {\n let cmd: AssistantCommand;\n\n if (typeof commandOrObj === 'string') {\n if (!action) {\n throw new Error('Action required when adding command by string.');\n }\n cmd = {\n id: commandOrObj.toLowerCase().replace(/\\s+/g, '_'),\n command: commandOrObj.toLowerCase(),\n action,\n };\n } else {\n cmd = { ...commandOrObj };\n if (!cmd.id) {\n cmd.id = cmd.command.toLowerCase().replace(/\\s+/g, '_');\n }\n }\n\n this.commands.set(cmd.command.toLowerCase(), cmd);\n // Also index by ID for AI matching\n if (cmd.id && cmd.id !== cmd.command) {\n // We store it by ID in a separate map or just rely on iteration for AI\n // For simplicity, let's keep the main map keyed by trigger phrase,\n // but we'll lookup by ID in AI flow.\n }\n }\n\n /** Remove an existing command */\n removeCommand(command: string): void {\n this.commands.delete(command.toLowerCase());\n }\n\n /** Execute a command by matching input */\n async executeCommand(\n input: string | Record<string, unknown>\n ): Promise<InteractiveResponse> {\n // 0) Handle object input\n if (typeof input === 'object' && input !== null) {\n // Direct command trigger from UI: { commandId, params? }\n if (this.isStructured(input)) {\n const cmdId = String(input.commandId);\n const rawParams: CommandParams = input.params ?? {};\n const cmd = this.getCommandById(cmdId);\n if (!cmd) return { message: 'That command is not available.', type: 'error' };\n\n const params = this.sanitizeParamsForCommand(cmd, rawParams);\n\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n const missing = requiredParams.filter((p) => params[p.name] == null || params[p.name] === '');\n if (missing.length > 0) {\n // Ask for missing params via form and store context\n this.context = { commandId: this.getCommandIdentifier(cmd), params };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: missing,\n };\n }\n\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params };\n return this.buildConfirmResponse(cmd);\n }\n\n return this.safeRunAction(cmd, params);\n }\n\n // Otherwise treat as continuation of a previously requested form\n if (!this.context) {\n return { message: 'Session expired or invalid context.', type: 'error' };\n }\n\n const cmd = this.getCommandById(this.context.commandId);\n if (!cmd) {\n this.context = null;\n return { message: 'Session expired or invalid context.', type: 'error' };\n }\n\n if (Array.isArray(input)) {\n return { message: 'Invalid form payload.', type: 'error' };\n }\n\n const mergedParams: CommandParams = {\n ...this.context.params,\n ...(input as CommandParams),\n };\n\n // If this was a critical command, ask for confirmation before executing.\n if (cmd.critical) {\n this.context = null;\n this.pendingConfirmation = {\n commandId: this.getCommandIdentifier(cmd),\n params: mergedParams,\n };\n return this.buildConfirmResponse(cmd);\n }\n\n const result = await this.safeRunAction(cmd, mergedParams);\n this.context = null;\n return this.normalizeResponse(result);\n }\n\n const trimmedInput = input.trim().toLowerCase();\n\n // 1) Confirmation flow (Yes/No)\n if (this.pendingConfirmation) {\n const normalized = trimmedInput;\n if (['yes', 'y', 'confirm', 'ok', 'okay'].includes(normalized)) {\n const { commandId, params } = this.pendingConfirmation;\n this.pendingConfirmation = null;\n const cmd = this.getCommandById(commandId);\n if (!cmd) {\n return { message: 'That action is no longer available.', type: 'error' };\n }\n return this.safeRunAction(cmd, params);\n }\n\n if (['no', 'n', 'cancel', 'stop'].includes(normalized)) {\n this.pendingConfirmation = null;\n return { message: 'Cancelled.', type: 'success' };\n }\n return {\n message: 'Please confirm: Yes or No.',\n type: 'confirm',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n };\n }\n\n // 2) Exact match\n const exactCommand = this.commands.get(trimmedInput);\n if (exactCommand) {\n const cmd = exactCommand;\n\n // If the command needs params, collect them (no AI needed)\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n if (requiredParams.length > 0) {\n this.context = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: requiredParams,\n };\n }\n\n // Critical commands require confirmation\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return this.buildConfirmResponse(cmd);\n }\n\n // Always pass an object for params so actions can safely read optional fields.\n return this.safeRunAction(cmd, {});\n }\n\n // 3) Deterministic (non-AI) fuzzy match using keywords/substring\n const deterministic = await this.tryDeterministicMatch(trimmedInput);\n if (deterministic) return deterministic;\n\n // 4) Smart intent fallback (AI)\n if (this.enableSmartIntent && this.openAIService) {\n const availableCommands = await this.getCommandsForAI();\n\n const aiResult = await this.openAIService.determineIntent(\n trimmedInput,\n availableCommands,\n this.context\n );\n\n return this.handleAIResult(aiResult);\n }\n\n // No deterministic match available and AI is disabled (or no AI configured).\n // Return an error so callers (wrappers) can trigger fallback handling.\n if (!this.enableSmartIntent) {\n return { message: \"I'm not sure what you mean.\", type: 'error' };\n }\n\n // As a last resort, list available commands to let the user pick.\n return this.listAllCommands();\n }\n\n private async handleAIResult(result: IntentResult): Promise<InteractiveResponse> {\n if (result.type === 'match' && result.match) {\n const cmd = this.getCommandById(result.match);\n if (!cmd) {\n return { message: \"I'm not sure what you mean.\", type: 'error' };\n }\n\n const rawParams = (result.params ?? {}) as CommandParams;\n const sanitizedParams = this.sanitizeParamsForCommand(cmd, rawParams);\n const params = cmd.allowAiParamExtraction === false ? {} : sanitizedParams;\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n const missingRequired = requiredParams.filter((p) => params[p.name] == null || params[p.name] === '');\n\n if (result.incomplete || missingRequired.length > 0) {\n // Store partial params for continuation\n this.context = { commandId: this.getCommandIdentifier(cmd), params };\n const mustUseForm = cmd.collectRequiredViaForm !== false;\n const askSingle = !mustUseForm && this.shouldAskSingleQuestion(missingRequired);\n\n if (askSingle) {\n const names = missingRequired.map((p) => p.name).join(' and ');\n return {\n message: result.message || `Please provide ${names}.`,\n type: 'question',\n };\n }\n\n return {\n message:\n result.message || `Please fill in the missing details for \"${cmd.command}\".`,\n type: 'form',\n fields: missingRequired,\n };\n }\n\n // Critical commands require confirmation\n if (cmd.critical) {\n this.pendingConfirmation = {\n commandId: this.getCommandIdentifier(cmd),\n params,\n };\n return this.buildConfirmResponse(cmd);\n }\n\n const actionResult = await cmd.action(params);\n return this.normalizeResponse(actionResult);\n }\n\n if (result.type === 'ambiguous' && result.options && result.options.length) {\n // Prefer clickable phrases that map to exact matches. Use commandId as value to\n // make UI actions deterministic when the user clicks an option.\n return {\n message: result.message || 'Did you mean one of these?',\n type: 'ambiguous',\n options: result.options.map((o) => ({\n label: o.label,\n value: o.commandId ?? o.label,\n commandId: o.commandId,\n })),\n };\n }\n\n // Unknown / fallback: show all available commands\n return this.listAllCommands();\n }\n\n private sanitizeParamsForCommand(cmd: AssistantCommand, params: CommandParams): CommandParams {\n const sanitized: CommandParams = { ...(params ?? {}) };\n\n for (const p of cmd.parameters ?? []) {\n const value = sanitized[p.name];\n\n if (p.type === 'string') {\n if (typeof value !== 'string') {\n delete sanitized[p.name];\n continue;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n delete sanitized[p.name];\n continue;\n }\n sanitized[p.name] = trimmed;\n }\n\n if (p.type === 'number') {\n const numeric = typeof value === 'number' ? value : Number((value as string)?.toString().trim());\n if (Number.isNaN(numeric)) {\n delete sanitized[p.name];\n continue;\n }\n if (typeof p.min === 'number' && numeric < p.min) {\n delete sanitized[p.name];\n continue;\n }\n if (typeof p.max === 'number' && numeric > p.max) {\n delete sanitized[p.name];\n continue;\n }\n sanitized[p.name] = numeric;\n }\n\n if (p.type === 'date') {\n const v = sanitized[p.name];\n if (typeof v === 'string') {\n const s = v.trim();\n if (!this.isIsoDateString(s)) {\n delete sanitized[p.name];\n } else {\n sanitized[p.name] = s;\n }\n } else {\n delete sanitized[p.name];\n }\n }\n\n if (p.type === 'select') {\n const v = typeof value === 'string' ? value : (value as any)?.toString();\n if (!v) {\n delete sanitized[p.name];\n continue;\n }\n if (Array.isArray(p.options) && p.options.length > 0) {\n const allowed = p.options.some((opt) => String(opt.value) === String(v));\n if (!allowed) {\n delete sanitized[p.name];\n continue;\n }\n }\n sanitized[p.name] = v;\n }\n\n // Defensive handling for file parameters: AI may return textual hints like \"csv file\".\n // If we expect a File/Blob or a base64 data URL (when delivery='base64'), accept only\n // those forms. Otherwise remove the param so the handler will ask the user via a form.\n if (p.type === 'file') {\n const val = sanitized[p.name];\n const isFileLike =\n val && typeof val === 'object' && typeof (val as any).name === 'string' && typeof (val as any).size === 'number';\n const isDataUrl = typeof val === 'string' && /^data:[^;]+;base64,/.test(val);\n const delivery = (p as any).delivery ?? 'file';\n\n if (delivery === 'base64') {\n // Accept either a data URL string or a File-like object\n if (!isDataUrl && !isFileLike) {\n delete sanitized[p.name];\n }\n } else {\n // delivery === 'file' -> expect a File/Blob object\n if (!isFileLike) {\n delete sanitized[p.name];\n }\n }\n }\n }\n\n return sanitized;\n }\n\n private isIsoDateString(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const dt = new Date(`${value}T00:00:00Z`);\n return !Number.isNaN(dt.getTime());\n }\n\n private shouldAskSingleQuestion(missing: AssistantParameter[]): boolean {\n if (missing.length !== 1) return false;\n const t = missing[0].type;\n return t === 'string' || t === 'number' || t === 'date';\n }\n\n private buildConfirmResponse(cmd: AssistantCommand): InteractiveResponse {\n return {\n message: `Are you sure you want to run \"${cmd.command}\"?`,\n type: 'confirm',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n };\n }\n\n private async tryDeterministicMatch(\n input: string\n ): Promise<InteractiveResponse | null> {\n // Substring or keyword-based match before AI\n const candidates: { cmd: AssistantCommand; score: number }[] = [];\n\n for (const cmd of this.commands.values()) {\n let score = 0;\n const commandPhrase = cmd.command.toLowerCase();\n if (input.includes(commandPhrase)) score += 5;\n\n const keywords = cmd.keywords ?? [];\n for (const kw of keywords) {\n const k = kw.toLowerCase().trim();\n if (!k) continue;\n if (input === k) score += 4;\n else if (input.includes(k)) score += 3;\n }\n\n if (score > 0) candidates.push({ cmd, score });\n }\n\n if (candidates.length === 0) return null;\n candidates.sort((a, b) => b.score - a.score);\n\n const topScore = candidates[0].score;\n const top = candidates.filter((c) => c.score === topScore).slice(0, 3);\n\n // If multiple equally-good matches, ask the user to choose.\n if (top.length > 1) {\n return {\n message: 'I think you mean one of these. Which one should I run?',\n type: 'ambiguous',\n options: top.map((c) => ({\n label: c.cmd.command,\n value: c.cmd.command,\n commandId: c.cmd.id,\n })),\n };\n }\n\n const cmd = top[0].cmd;\n\n // If params are required, ask with a form\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n if (requiredParams.length > 0) {\n this.context = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: requiredParams,\n };\n }\n\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return this.buildConfirmResponse(cmd);\n }\n\n return this.safeRunAction(cmd, {});\n }\n\n private async safeRunAction(cmd: AssistantCommand, params?: CommandParams): Promise<InteractiveResponse> {\n try {\n const result = await cmd.action(params ?? {});\n return this.normalizeResponse(result);\n } catch {\n return { message: 'Something went wrong while running that command.', type: 'error' };\n }\n }\n\n private async getCommandsForAI(): Promise<AssistantCommand[]> {\n const commands = Array.from(this.commands.values()).map((cmd) => ({\n ...cmd,\n parameters: cmd.parameters\n ? cmd.parameters.map((param) => ({ ...param }))\n : undefined,\n }));\n\n // Resolve async select options (cached) to give the model enough context.\n await Promise.all(\n commands.map(async (cmd) => {\n if (!cmd.parameters) return;\n await Promise.all(\n cmd.parameters.map(async (p) => {\n if (p.type !== 'select' || !p.getOptions || (p.options && p.options.length)) return;\n const cacheKey = `${cmd.id ?? cmd.command}:${p.name}`;\n const cached = this.selectOptionsCache.get(cacheKey);\n const now = Date.now();\n if (cached && now - cached.ts < 60_000) {\n p.options = cached.options;\n return;\n }\n try {\n const opts = await p.getOptions();\n this.selectOptionsCache.set(cacheKey, { options: opts, ts: now });\n p.options = opts;\n } catch {\n // If options fail to load, keep as-is.\n }\n })\n );\n })\n );\n\n return commands;\n }\n\n private getCommandById(id: string): AssistantCommand | undefined {\n for (const cmd of this.commands.values()) {\n if (cmd.id === id) return cmd;\n }\n return undefined;\n }\n\n private listAllCommands(): InteractiveResponse {\n const options = Array.from(this.commands.values()).map((cmd) => ({\n label: cmd.command,\n value: cmd.id ?? cmd.command,\n commandId: cmd.id ?? cmd.command,\n }));\n\n return {\n message: 'Here are the available commands:',\n type: 'ambiguous',\n options,\n };\n }\n\n private normalizeResponse(result: string | InteractiveResponse | void): InteractiveResponse {\n if (typeof result === 'string') {\n return { message: result, type: 'success' };\n }\n if (result && typeof result === 'object') {\n return result;\n }\n return { message: 'Done', type: 'success' };\n }\n\n private isStructured(input: Record<string, unknown>): input is StructuredCommandInput {\n return typeof input['commandId'] === 'string';\n }\n\n private getCommandIdentifier(cmd: AssistantCommand): string {\n if (!cmd.id) {\n cmd.id = cmd.command.toLowerCase().replace(/\\s+/g, '_');\n }\n return cmd.id;\n }\n\n /** List all registered commands */\n getCommands(): string[] {\n return Array.from(this.commands.keys());\n }\n}\n", "export class TextToSpeech {\n private synth: SpeechSynthesis | null = (typeof window !== 'undefined' ? window.speechSynthesis : null);\n\n speak(text: string, options?: { pitch?: number; rate?: number; volume?: number }): void {\n if (!this.synth) {\n // eslint-disable-next-line no-console\n console.error('SpeechSynthesis API is not supported in this environment.');\n return;\n }\n\n const utterance = new SpeechSynthesisUtterance(text);\n if (options) {\n utterance.pitch = options.pitch || 1;\n utterance.rate = options.rate || 1;\n utterance.volume = options.volume || 1;\n }\n\n // Notify listeners (e.g., VoiceProcessor) to pause recognition while speaking\n if (typeof window !== 'undefined') {\n utterance.onstart = () => {\n window.dispatchEvent(new CustomEvent('foisit:tts-start'));\n };\n utterance.onend = () => {\n // eslint-disable-next-line no-console\n console.log('Speech finished.');\n window.dispatchEvent(new CustomEvent('foisit:tts-end'));\n };\n }\n\n utterance.onerror = (event) => {\n // eslint-disable-next-line no-console\n console.error('Error during speech synthesis:', (event as any).error);\n };\n\n this.synth.speak(utterance);\n }\n\n stopSpeaking(): void {\n if (this.synth) {\n this.synth.cancel();\n }\n }\n}\n", "import { TextToSpeech } from '../speech/text-to-speech';\n\nexport class FallbackHandler {\n private fallbackMessage = 'Sorry, I didn’t understand that.';\n\n setFallbackMessage(message: string): void {\n this.fallbackMessage = message;\n }\n\n handleFallback(transcript?: string): void {\n // eslint-disable-next-line no-console\n if (transcript) console.log(`Fallback triggered for: \"${transcript}\"`);\n console.log(this.fallbackMessage);\n new TextToSpeech().speak(this.fallbackMessage);\n }\n\n getFallbackMessage(): string {\n return this.fallbackMessage;\n }\n}\n", "/* eslint-disable no-unused-vars */\n// Minimal typings for a cross-browser SpeechRecognition shape\ntype RecognitionErrorEvent = { error?: string };\ntype RecognitionResultAlternative = { transcript?: string; confidence?: number };\ntype RecognitionResult = RecognitionResultAlternative[] & { isFinal?: boolean };\ntype RecognitionEvent = { resultIndex: number; results: RecognitionResult[] };\ntype Recognition = {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n maxAlternatives?: number;\n start: () => void;\n stop: () => void;\n\n onresult: ((event: RecognitionEvent) => void) | null;\n onstart?: (() => void) | null;\n onend: (() => void) | null;\n onerror: ((event: RecognitionErrorEvent) => void) | null;\n};\ntype RecognitionCtor = new () => Recognition;\n\nconst getRecognitionCtor = (): RecognitionCtor | null => {\n if (typeof window === 'undefined') return null;\n const w = window as Window & {\n webkitSpeechRecognition?: RecognitionCtor;\n SpeechRecognition?: RecognitionCtor;\n };\n return w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null;\n};\n\ntype ResultCallback = (text: string, isFinal: boolean) => void;\n\nexport type VoiceProcessorStatus =\n | 'unsupported'\n | 'idle'\n | 'listening'\n | 'speaking'\n | 'error';\n\nexport type StatusCallback = (status: VoiceProcessorStatus, details?: { error?: string }) => void;\n\nexport class VoiceProcessor {\n private recognition: Recognition | null = null;\n private isListening = false;\n private engineActive = false; // true after onstart, false after onend\n private intentionallyStopped = false;\n private restartAllowed = true;\n private lastStart = 0;\n private backoffMs = 250;\n private destroyed = false;\n private resultCallback: ResultCallback | null = null;\n private ttsSpeaking = false;\n private visibilityHandler?: () => void;\n private statusCallback?: StatusCallback;\n private debugEnabled = true; // enable debug logs to aid diagnosis\n private restartTimer: ReturnType<typeof setTimeout> | null = null;\n private prewarmed = false;\n private hadResultThisSession = false;\n // Debug logger helpers\n private log(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.log('[VoiceProcessor]', message);\n }\n }\n private warn(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.warn('[VoiceProcessor]', message);\n }\n }\n private error(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.error('[VoiceProcessor]', message);\n }\n }\n\n constructor(\n language = 'en-US',\n options: { interimResults?: boolean; continuous?: boolean; confidenceThreshold?: number } = {}\n ) {\n const Ctor = getRecognitionCtor();\n if (Ctor) {\n this.recognition = new Ctor();\n this.recognition.lang = language;\n this.recognition.interimResults = options.interimResults ?? true;\n this.recognition.continuous = options.continuous ?? true;\n\n this.recognition.onresult = (event: RecognitionEvent) => this.handleResult(event, options);\n this.recognition.onend = () => this.handleEnd();\n this.recognition.onstart = () => {\n this.log('recognition onstart');\n this.engineActive = true;\n this.hadResultThisSession = false;\n // Clear any pending restart attempts now that we are active\n if (this.restartTimer) {\n clearTimeout(this.restartTimer);\n this.restartTimer = null;\n }\n this.backoffMs = 250;\n if (this.isListening && !this.ttsSpeaking) {\n this.emitStatus('listening');\n }\n };\n // Optional debug hooks supported by Chrome\n type VendorRecognitionEvents = {\n onaudiostart?: () => void;\n onsoundstart?: () => void;\n onspeechstart?: () => void;\n onspeechend?: () => void;\n onsoundend?: () => void;\n onaudioend?: () => void;\n };\n const vrec = this.recognition as unknown as VendorRecognitionEvents;\n vrec.onaudiostart = () => this.log('onaudiostart');\n vrec.onsoundstart = () => this.log('onsoundstart');\n vrec.onspeechstart = () => this.log('onspeechstart');\n vrec.onspeechend = () => this.log('onspeechend');\n vrec.onsoundend = () => this.log('onsoundend');\n vrec.onaudioend = () => this.log('onaudioend');\n this.recognition.onerror = (event: RecognitionErrorEvent) => this.handleError(event);\n } else {\n // No native support; keep recognition null and let consumers feature-detect.\n this.recognition = null;\n // If unsupported, immediately report status so UI can show a clear fallback.\n this.emitStatus('unsupported');\n }\n\n // Pause listening while TTS is speaking via CustomEvents dispatched by TextToSpeech\n if (typeof window !== 'undefined') {\n window.addEventListener('foisit:tts-start', this.onTTSStart);\n window.addEventListener('foisit:tts-end', this.onTTSEnd);\n\n // Pause on tab hide, resume on show\n this.visibilityHandler = () => {\n if (typeof document !== 'undefined' && document.hidden) {\n try { this.recognition?.stop(); } catch { /* no-op */ }\n this.emitStatus(this.ttsSpeaking ? 'speaking' : 'idle');\n } else if (this.isListening && !this.ttsSpeaking) {\n this.safeRestart();\n }\n };\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.visibilityHandler);\n }\n } else {\n // No window/document on server — do not register browser-only handlers\n this.visibilityHandler = undefined;\n }\n }\n\n /** Check if SpeechRecognition is available */\n isSupported(): boolean {\n return getRecognitionCtor() !== null;\n }\n\n /** Allow consumers (wrappers) to observe status changes */\n onStatusChange(callback: StatusCallback | undefined): void {\n this.statusCallback = callback;\n }\n\n /** Start listening for speech input */\n startListening(callback: ResultCallback): void {\n if (!this.isSupported() || !this.recognition) {\n this.warn('VoiceProcessor: SpeechRecognition is not supported in this browser.');\n this.emitStatus('unsupported');\n return;\n }\n if (this.isListening) {\n this.warn('VoiceProcessor: Already listening.');\n this.resultCallback = callback; // update callback if needed\n return;\n }\n\n this.resultCallback = callback;\n this.intentionallyStopped = false;\n this.restartAllowed = true;\n this.isListening = true;\n this.emitStatus('listening');\n // Warm up mic to avoid immediate onend in some environments\n this.prewarmAudio().finally(() => {\n this.safeRestart();\n });\n }\n\n /** Stop listening for speech input */\n stopListening(): void {\n this.intentionallyStopped = true;\n this.restartAllowed = false;\n this.isListening = false;\n this.emitStatus(this.ttsSpeaking ? 'speaking' : 'idle');\n try { this.recognition?.stop(); } catch { /* no-op */ }\n }\n\n /** Clean up listeners */\n destroy(): void {\n this.destroyed = true;\n this.stopListening();\n this.resultCallback = null;\n window.removeEventListener('foisit:tts-start', this.onTTSStart);\n window.removeEventListener('foisit:tts-end', this.onTTSEnd);\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /** Handle recognized speech results */\n private handleResult(event: RecognitionEvent, options: { interimResults?: boolean; confidenceThreshold?: number }): void {\n if (!this.resultCallback) return;\n const threshold = options.confidenceThreshold ?? 0.6;\n // Emit each alternative result chunk; concatenate finals client-side if desired\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const res = event.results[i];\n const alt = res && res[0];\n const transcript: string = alt?.transcript?.trim?.() || '';\n const confidence: number = alt?.confidence ?? 0;\n if (!transcript) continue;\n if (!res.isFinal && options.interimResults === false) continue; // skip interim if disabled\n if (res.isFinal && confidence < threshold) continue; // ignore low-confidence finals\n try {\n this.hadResultThisSession = true;\n this.resultCallback(transcript, !!res.isFinal);\n } catch {\n // Swallow user callback exceptions to avoid killing recognition\n this.error('VoiceProcessor: result callback error');\n }\n }\n }\n\n /** Handle session end */\n private handleEnd(): void {\n this.log('recognition onend');\n this.engineActive = false;\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) {\n if (!this.ttsSpeaking) {\n this.isListening = false;\n this.emitStatus('idle');\n }\n return;\n }\n // We are still in \"listening\" mode logically; recognition ended spuriously.\n this.isListening = true;\n // Best-effort restart (continuous can still end spuriously)\n this.scheduleRestart();\n }\n\n /** Handle errors during speech recognition */\n private handleError(event: RecognitionErrorEvent): void {\n const err = event?.error;\n this.warn(`Error occurred: ${err ?? 'unknown'}`);\n\n // Fatal errors: don't spin\n const fatal = ['not-allowed', 'service-not-allowed', 'bad-grammar', 'language-not-supported'];\n if (err && fatal.includes(err)) {\n this.intentionallyStopped = true;\n this.restartAllowed = false;\n this.isListening = false;\n this.emitStatus('error', { error: err });\n return;\n }\n // For transient errors, try restart\n this.scheduleRestart();\n }\n\n private safeRestart(): void {\n if (!this.recognition) return;\n if (this.engineActive) {\n this.log('safeRestart: engine already active, skipping start');\n return;\n }\n const now = Date.now();\n if (now - this.lastStart < 300) {\n setTimeout(() => this.safeRestart(), 300);\n return;\n }\n this.lastStart = now;\n try {\n this.log('calling recognition.start()');\n this.recognition.start();\n this.backoffMs = 250; // reset backoff on successful start\n if (this.isListening && !this.ttsSpeaking) {\n this.emitStatus('listening');\n }\n } catch {\n this.error('recognition.start() threw; scheduling restart');\n this.scheduleRestart();\n }\n }\n\n private scheduleRestart(): void {\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) return;\n if (this.engineActive) {\n this.log('scheduleRestart: engine active, not scheduling');\n return;\n }\n const delay = Math.min(this.backoffMs, 2000);\n this.log(`scheduleRestart in ${delay}ms`);\n if (this.restartTimer) {\n // A restart is already scheduled; keep the earliest\n this.log('scheduleRestart: restart already scheduled');\n return;\n }\n this.restartTimer = setTimeout(() => {\n this.restartTimer = null;\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) return;\n this.safeRestart();\n }, delay);\n this.backoffMs = Math.min(this.backoffMs * 2, 2000);\n }\n\n private async prewarmAudio(): Promise<void> {\n if (this.prewarmed) return;\n try {\n if (typeof navigator === 'undefined' || !('mediaDevices' in navigator)) return;\n const md = navigator.mediaDevices;\n if (!md?.getUserMedia) return;\n this.log('prewarmAudio: requesting mic');\n const stream = await md.getUserMedia({ audio: true });\n for (const track of stream.getTracks()) track.stop();\n this.prewarmed = true;\n this.log('prewarmAudio: mic ready');\n } catch {\n this.warn('prewarmAudio: failed to get mic');\n }\n }\n\n private onTTSStart = () => {\n this.ttsSpeaking = true;\n try { this.recognition?.stop(); } catch { /* no-op */ }\n // If we were listening, switch to speaking state\n if (this.isListening) {\n this.emitStatus('speaking');\n }\n };\n\n private onTTSEnd = () => {\n this.ttsSpeaking = false;\n if (this.isListening && this.restartAllowed) {\n this.safeRestart();\n } else {\n this.emitStatus(this.isListening ? 'listening' : 'idle');\n }\n };\n\n private emitStatus(status: VoiceProcessorStatus, details?: { error?: string }): void {\n if (!this.statusCallback) return;\n try {\n this.statusCallback(status, details);\n } catch {\n // Never let consumer errors break recognition\n this.error('VoiceProcessor: status callback error');\n }\n }\n}\n", "export class GestureHandler {\n private lastTap = 0 as number;\n private dblClickListener?: () => void;\n private touchEndListener?: () => void;\n\n /**\n * Sets up double-click and double-tap listeners\n * @param onDoubleClickOrTap Callback to execute when a double-click or double-tap is detected\n */\n setupDoubleTapListener(onDoubleClickOrTap: () => void): void {\n // Ensure we never stack multiple listeners for the same instance\n this.destroy();\n\n // Handle double-click (desktop)\n this.dblClickListener = () => {\n onDoubleClickOrTap();\n };\n document.addEventListener('dblclick', this.dblClickListener);\n\n // Handle double-tap (mobile)\n this.touchEndListener = () => {\n const currentTime = new Date().getTime();\n const tapInterval = currentTime - this.lastTap;\n if (tapInterval < 300 && tapInterval > 0) {\n onDoubleClickOrTap();\n }\n this.lastTap = currentTime;\n };\n document.addEventListener('touchend', this.touchEndListener);\n }\n\n destroy(): void {\n if (this.dblClickListener) {\n document.removeEventListener('dblclick', this.dblClickListener);\n }\n if (this.touchEndListener) {\n document.removeEventListener('touchend', this.touchEndListener);\n }\n this.dblClickListener = undefined;\n this.touchEndListener = undefined;\n }\n}\n\n\nexport function injectStyles(): void {\n // Check if the styles are already injected\n const existingStyle: HTMLStyleElement | null = document.querySelector('#assistant-styles');\n if (existingStyle) {\n console.log('Styles already injected');\n return; // Avoid duplicate injection\n }\n\n // Create and inject the style element\n const style = document.createElement('style');\n style.id = 'assistant-styles';\n style.innerHTML = `\n /* Rounded shape with gradient animation */\n .gradient-indicator {\n position: fixed;\n top: 20px;\n right: 20px;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: linear-gradient(135deg, #ff6ec4, #7873f5, #5e8cff, #6ed0f6);\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);\n animation: amoeba 5s infinite ease-in-out;\n z-index: 9999; /* Ensure it's above all other elements */\n }\n\n /* Amoeba effect for the borders */\n @keyframes amoeba {\n 0% {\n border-radius: 50%;\n }\n 25% {\n border-radius: 40% 60% 60% 40%;\n }\n 50% {\n border-radius: 60% 40% 40% 60%;\n }\n 75% {\n border-radius: 40% 60% 60% 40%;\n }\n 100% {\n border-radius: 50%;\n }\n }\n `;\n document.head.appendChild(style);\n console.log('Gradient styles injected');\n}\n\nexport function addGradientAnimation(): void {\n // Check if the gradient indicator already exists\n if (document.querySelector('#gradient-indicator')) {\n return; // Avoid duplicate indicators\n }\n\n // Create a new div element\n const gradientDiv = document.createElement('div');\n gradientDiv.id = 'gradient-indicator';\n\n // Inject styles dynamically\n injectStyles();\n\n // Add the gradient-indicator class to the div\n gradientDiv.classList.add('gradient-indicator');\n\n // Append the div to the body\n document.body.appendChild(gradientDiv);\n console.log('Gradient indicator added to the DOM');\n}\n\nexport function removeGradientAnimation(): void {\n const gradientDiv = document.querySelector('#gradient-indicator');\n if (gradientDiv) {\n gradientDiv.remove();\n console.log('Gradient indicator removed from the DOM');\n }\n}\n\n", "export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n", "import { addGradientAnimation, removeGradientAnimation } from \"./utils\";\n\ntype AssistantState = 'idle' | 'listening' | 'processing';\n\nexport class StateManager {\n private state: AssistantState = 'idle';\n // eslint-disable-next-line no-unused-vars\n private subscribers: Array<(state: AssistantState) => void> = [];\n\n getState(): AssistantState {\n return this.state;\n }\n\n setState(state: AssistantState): void {\n this.state = state;\n this.notifySubscribers();\n\n console.log('State updated:', state);\n\n // Dynamically update body class based on state\n if (state === 'listening') {\n addGradientAnimation();\n } else {\n removeGradientAnimation();\n }\n }\n\n // eslint-disable-next-line no-unused-vars\n subscribe(callback: (state: AssistantState) => void): void {\n this.subscribers.push(callback);\n }\n\n private notifySubscribers(): void {\n this.subscribers.forEach((callback) => callback(this.state));\n }\n}\n", "/* eslint-disable no-unused-vars */\n\nimport type { AssistantParameter, SelectOption } from '../interfaces/assistant-command.interface';\n\nexport interface OverlayConfig {\n floatingButton?: {\n visible?: boolean;\n tooltip?: string;\n customHtml?: string;\n position?: { bottom: string; right: string };\n };\n inputPlaceholder?: string;\n}\n\nimport { isBrowser } from '../utils/is-browser';\n\nexport class OverlayManager {\n private container: HTMLElement | null = null;\n private chatWindow: HTMLElement | null = null;\n private messagesContainer: HTMLElement | null = null;\n private input: HTMLInputElement | null = null;\n private isOpen = false;\n private onSubmit?: (input: string | Record<string, unknown>) => void;\n private onClose?: () => void;\n private loadingEl: HTMLElement | null = null;\n private config: OverlayConfig;\n private active = isBrowser();\n\n constructor(config: OverlayConfig) {\n this.config = config;\n if (this.active) this.init();\n }\n\n private init() {\n if (this.container) return;\n\n this.injectOverlayStyles();\n\n // Reuse an existing overlay container if one already exists on the page.\n // This prevents duplicate overlays when multiple assistant instances are created (e.g., React StrictMode).\n const existing = document.getElementById('foisit-overlay-container');\n if (existing && existing instanceof HTMLElement) {\n this.container = existing;\n this.chatWindow = existing.querySelector('.foisit-chat') as HTMLElement | null;\n this.messagesContainer = existing.querySelector('.foisit-messages') as HTMLElement | null;\n this.input = existing.querySelector('input.foisit-input') as HTMLInputElement | null;\n\n if (this.config.floatingButton?.visible !== false && !existing.querySelector('.foisit-floating-btn')) {\n this.renderFloatingButton();\n }\n\n if (!this.chatWindow) {\n this.renderChatWindow();\n }\n return;\n }\n\n this.container = document.createElement('div');\n this.container.id = 'foisit-overlay-container';\n this.container.className = 'foisit-overlay-container';\n\n document.body.appendChild(this.container);\n\n if (this.config.floatingButton?.visible !== false) {\n this.renderFloatingButton();\n }\n\n this.renderChatWindow();\n }\n\n private renderFloatingButton() {\n const btn = document.createElement('button');\n btn.innerHTML = this.config.floatingButton?.customHtml || '🎙️';\n const bottom = this.config.floatingButton?.position?.bottom || '20px';\n const right = this.config.floatingButton?.position?.right || '20px';\n\n btn.className = 'foisit-floating-btn';\n btn.style.bottom = bottom;\n btn.style.right = right;\n\n btn.onclick = () => this.toggle();\n btn.onmouseenter = () => (btn.style.transform = 'scale(1.05)');\n btn.onmouseleave = () => (btn.style.transform = 'scale(1)');\n\n this.container?.appendChild(btn);\n }\n\n private renderChatWindow() {\n if (this.chatWindow) return;\n\n this.chatWindow = document.createElement('div');\n this.chatWindow.className = 'foisit-chat';\n\n // Header\n const header = document.createElement('div');\n header.className = 'foisit-header';\n\n const title = document.createElement('span');\n title.className = 'foisit-title';\n title.textContent = 'Foisit';\n\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.className = 'foisit-close';\n closeButton.setAttribute('aria-label', 'Close');\n closeButton.innerHTML = '&times;';\n closeButton.addEventListener('click', () => this.toggle());\n\n header.appendChild(title);\n header.appendChild(closeButton);\n\n // Messages Area\n this.messagesContainer = document.createElement('div');\n this.messagesContainer.className = 'foisit-messages';\n\n // Input Area\n const inputArea = document.createElement('div');\n inputArea.className = 'foisit-input-area';\n\n this.input = document.createElement('input');\n this.input.placeholder =\n this.config.inputPlaceholder || 'Type a command...';\n this.input.className = 'foisit-input';\n\n this.input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && this.input?.value.trim()) {\n const text = this.input.value.trim();\n this.input.value = '';\n if (this.onSubmit) this.onSubmit(text);\n }\n });\n\n inputArea.appendChild(this.input);\n\n this.chatWindow.appendChild(header);\n this.chatWindow.appendChild(this.messagesContainer);\n this.chatWindow.appendChild(inputArea);\n this.container?.appendChild(this.chatWindow);\n }\n\n registerCallbacks(onSubmit: (input: string | Record<string, unknown>) => void, onClose: () => void) {\n if (!this.active) return; // no-op on server\n this.onSubmit = onSubmit;\n this.onClose = onClose;\n }\n\n toggle(onSubmit?: (input: string | Record<string, unknown>) => void, onClose?: () => void) {\n if (!this.active) return; // no-op on server\n if (onSubmit) this.onSubmit = onSubmit;\n if (onClose) this.onClose = onClose;\n\n this.isOpen = !this.isOpen;\n\n if (this.chatWindow) {\n if (this.isOpen) {\n this.chatWindow.style.display = 'flex';\n requestAnimationFrame(() => {\n if (this.chatWindow) {\n this.chatWindow.style.opacity = '1';\n this.chatWindow.style.transform = 'translateY(0) scale(1)';\n }\n });\n setTimeout(() => this.input?.focus(), 100);\n } else {\n this.chatWindow.style.opacity = '0';\n this.chatWindow.style.transform = 'translateY(20px) scale(0.95)';\n setTimeout(() => {\n if (this.chatWindow && !this.isOpen) {\n this.chatWindow.style.display = 'none';\n }\n }, 200);\n if (this.onClose) this.onClose();\n }\n }\n }\n\n addMessage(text: string, type: 'user' | 'system') {\n if (!this.messagesContainer) return;\n\n const msg = document.createElement('div');\n msg.textContent = text;\n msg.className = type === 'user' ? 'foisit-bubble user' : 'foisit-bubble system';\n\n this.messagesContainer.appendChild(msg);\n this.scrollToBottom();\n }\n\n addOptions(options: { label: string; value?: string; commandId?: string }[]) {\n if (!this.messagesContainer) return;\n\n const container = document.createElement('div');\n container.className = 'foisit-options-container';\n\n options.forEach((opt) => {\n const btn = document.createElement('button');\n btn.textContent = opt.label;\n btn.className = 'foisit-option-chip';\n btn.setAttribute('type', 'button');\n btn.setAttribute('aria-label', opt.label);\n\n const clickPayload = () => {\n // If commandId is provided, submit a structured payload so the handler\n // can run it deterministically: { commandId, params? }\n if (opt.commandId) {\n if (this.onSubmit) this.onSubmit({ commandId: opt.commandId });\n return;\n }\n\n // Otherwise fall back to value or label string\n const value = (opt && typeof opt.value === 'string' && opt.value.trim()) ? opt.value : opt.label;\n if (this.onSubmit) this.onSubmit(value);\n };\n\n btn.onclick = clickPayload;\n btn.onkeydown = (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n clickPayload();\n }\n };\n\n container.appendChild(btn);\n });\n\n this.messagesContainer.appendChild(container);\n this.scrollToBottom();\n }\n\n addForm(\n message: string,\n fields: AssistantParameter[],\n onSubmit: (_data: Record<string, unknown>) => void\n ) {\n if (!this.messagesContainer) return;\n\n this.addMessage(message, 'system');\n\n const form = document.createElement('form');\n form.className = 'foisit-form';\n\n const controls: Array<{\n name: string;\n type: AssistantParameter['type'];\n el: HTMLInputElement | HTMLSelectElement;\n required?: boolean;\n }> = [];\n\n const createLabel = (text: string, required?: boolean) => {\n const label = document.createElement('div');\n label.className = 'foisit-form-label';\n label.innerHTML = text + (required ? ' <span class=\"foisit-req-star\">*</span>' : '');\n return label;\n };\n\n const createError = () => {\n const error = document.createElement('div');\n error.className = 'foisit-form-error';\n error.style.display = 'none';\n return error;\n };\n\n (fields ?? []).forEach((field) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'foisit-form-group';\n\n const labelText = field.description || field.name;\n wrapper.appendChild(createLabel(labelText, field.required));\n\n let inputEl: HTMLInputElement | HTMLSelectElement;\n\n if (field.type === 'select') {\n const select = document.createElement('select');\n select.className = 'foisit-form-input';\n\n const placeholderOpt = document.createElement('option');\n placeholderOpt.value = '';\n placeholderOpt.textContent = 'Select...';\n select.appendChild(placeholderOpt);\n\n const populate = (options: SelectOption[]) => {\n (options ?? []).forEach((opt) => {\n const o = document.createElement('option');\n o.value = String(opt.value ?? opt.label ?? '');\n o.textContent = String(opt.label ?? opt.value ?? '');\n select.appendChild(o);\n });\n };\n\n if (Array.isArray(field.options) && field.options.length) {\n populate(field.options);\n } else if (typeof field.getOptions === 'function') {\n const getOptions = field.getOptions;\n const loadingOpt = document.createElement('option');\n loadingOpt.value = '';\n loadingOpt.textContent = 'Loading...';\n select.appendChild(loadingOpt);\n Promise.resolve()\n .then(() => getOptions())\n .then((opts: SelectOption[]) => {\n while (select.options.length > 1) select.remove(1);\n populate(opts);\n })\n .catch(() => {\n while (select.options.length > 1) select.remove(1);\n const errOpt = document.createElement('option');\n errOpt.value = '';\n errOpt.textContent = 'Error loading options';\n select.appendChild(errOpt);\n });\n }\n\n if (field.defaultValue != null) {\n select.value = String(field.defaultValue);\n }\n inputEl = select;\n } else if (field.type === 'file') {\n const ffield = field as Extract<AssistantParameter, { type: 'file' }>;\n const input = document.createElement('input');\n input.className = 'foisit-form-input';\n input.type = 'file';\n if (ffield.accept && Array.isArray(ffield.accept)) {\n input.accept = ffield.accept.join(',');\n }\n if (ffield.multiple) input.multiple = true;\n if (ffield.capture) {\n if (ffield.capture === true) input.setAttribute('capture', '');\n else input.setAttribute('capture', String(ffield.capture));\n }\n\n // Validation state stored on the element via dataset\n input.addEventListener('change', async () => {\n const files = Array.from((input as HTMLInputElement).files || []);\n const errEl = errorEl as HTMLElement;\n errEl.style.display = 'none';\n errEl.textContent = '';\n\n if (files.length === 0) return;\n\n // Basic validations: count and sizes\n const maxFiles = ffield.maxFiles ?? (ffield.multiple ? 10 : 1);\n if (files.length > maxFiles) {\n errEl.textContent = `Please select at most ${maxFiles} file(s).`;\n errEl.style.display = 'block';\n return;\n }\n\n const maxSize = ffield.maxSizeBytes ?? Infinity;\n const total = files.reduce((s, f) => s + f.size, 0);\n if (files.some(f => f.size > maxSize)) {\n errEl.textContent = `One or more files exceed the maximum size of ${Math.round(maxSize / 1024)} KB.`;\n errEl.style.display = 'block';\n return;\n }\n const maxTotal = ffield.maxTotalBytes ?? Infinity;\n if (total > maxTotal) {\n errEl.textContent = `Total selected files exceed the maximum of ${Math.round(maxTotal / 1024)} KB.`;\n errEl.style.display = 'block';\n return;\n }\n\n // Basic mime/extension check\n if (ffield.accept && Array.isArray(ffield.accept)) {\n const accepts = ffield.accept as string[];\n const ok = files.every((file) => {\n if (!file.type) return true; // can't tell\n return accepts.some(a => a.startsWith('.') ? file.name.toLowerCase().endsWith(a.toLowerCase()) : file.type === a || file.type.startsWith(a.split('/')[0] + '/'));\n });\n if (!ok) {\n errEl.textContent = 'One or more files have an unsupported type.';\n errEl.style.display = 'block';\n return;\n }\n }\n });\n\n inputEl = input;\n } else {\n const input = document.createElement('input');\n input.className = 'foisit-form-input';\n\n if (field.type === 'string') {\n input.placeholder = field.placeholder || 'Type here...';\n }\n\n if (field.type === 'number') {\n input.type = 'number';\n if (typeof field.min === 'number') input.min = String(field.min);\n if (typeof field.max === 'number') input.max = String(field.max);\n if (typeof field.step === 'number') input.step = String(field.step);\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n } else if (field.type === 'date') {\n input.type = 'date';\n if (typeof field.min === 'string') input.min = field.min;\n if (typeof field.max === 'string') input.max = field.max;\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n } else {\n input.type = 'text';\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n }\n inputEl = input;\n }\n\n // Add Error element\n const errorEl = createError();\n\n wrapper.appendChild(inputEl);\n wrapper.appendChild(errorEl); // Append error container\n\n controls.push({\n name: field.name,\n type: field.type,\n el: inputEl,\n required: field.required,\n });\n\n form.appendChild(wrapper);\n });\n\n const actions = document.createElement('div');\n actions.className = 'foisit-form-actions';\n\n const submitBtn = document.createElement('button');\n submitBtn.type = 'submit';\n submitBtn.textContent = 'Submit';\n submitBtn.className = 'foisit-option-chip';\n submitBtn.style.fontWeight = '600';\n\n actions.appendChild(submitBtn);\n form.appendChild(actions);\n\n form.onsubmit = async (e) => {\n e.preventDefault();\n\n const data: Record<string, unknown> = {};\n let hasError = false;\n\n // Clear previous errors\n form.querySelectorAll('.foisit-form-error').forEach(el => {\n (el as HTMLElement).style.display = 'none';\n el.textContent = '';\n });\n form.querySelectorAll('.foisit-form-input').forEach(el => {\n el.classList.remove('foisit-error-border');\n });\n\n for (const c of controls) {\n // FILE inputs need special handling\n if (c.type === 'file') {\n const fileWrapper = c.el.parentElement;\n const fileErrorEl = fileWrapper?.querySelector('.foisit-form-error') as HTMLElement;\n const input = c.el as HTMLInputElement;\n const files = Array.from(input.files || []);\n\n if (c.required && files.length === 0) {\n hasError = true;\n input.classList.add('foisit-error-border');\n if (fileErrorEl) {\n fileErrorEl.textContent = 'This file is required';\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n\n if (files.length === 0) continue;\n\n // Find corresponding field definition\n const fieldDef = (fields ?? []).find((f) => f.name === c.name) as Extract<AssistantParameter, { type: 'file' }> | undefined;\n const delivery: 'file' | 'base64' = fieldDef?.delivery ?? 'file';\n\n // Run optional dimension/duration checks (best-effort)\n if (fieldDef?.maxWidth || fieldDef?.maxHeight) {\n // check first image only\n try {\n const dims = await this.getImageDimensions(files[0]);\n if (fieldDef.maxWidth && dims.width > fieldDef.maxWidth) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Image width must be ≤ ${fieldDef.maxWidth}px`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n if (fieldDef.maxHeight && dims.height > fieldDef.maxHeight) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Image height must be ≤ ${fieldDef.maxHeight}px`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n } catch {\n // ignore dimension check failures\n }\n }\n\n if (fieldDef?.maxDurationSec) {\n try {\n const dur = await this.getMediaDuration(files[0]);\n if (dur && dur > fieldDef.maxDurationSec) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Media duration must be ≤ ${fieldDef.maxDurationSec}s`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n } catch {\n // ignore\n }\n }\n\n // Prepare payload according to delivery\n if (delivery === 'file') {\n data[c.name] = fieldDef?.multiple ? files : files[0];\n } else if (delivery === 'base64') {\n try {\n const encoded = await Promise.all(files.map((file) => this.readFileAsDataURL(file)));\n data[c.name] = fieldDef?.multiple ? encoded : encoded[0];\n } catch {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = 'Failed to encode file(s) to base64.';\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n }\n\n continue;\n }\n\n const val = (c.el.value ?? '').toString().trim();\n const valueWrapper = c.el.parentElement;\n const fieldErrorEl = valueWrapper?.querySelector('.foisit-form-error') as HTMLElement;\n\n if (c.required && (val == null || val === '')) {\n hasError = true;\n c.el.classList.add('foisit-error-border');\n if (fieldErrorEl) {\n fieldErrorEl.textContent = 'This field is required';\n fieldErrorEl.style.display = 'block';\n }\n continue;\n }\n\n if (val === '') continue;\n\n if (c.type === 'number') {\n const n = Number(val);\n if (!Number.isNaN(n)) data[c.name] = n;\n } else {\n data[c.name] = val;\n }\n }\n\n if (hasError) {\n // Shake animation\n form.classList.add('foisit-shake');\n setTimeout(() => form.classList.remove('foisit-shake'), 400);\n return;\n }\n\n submitBtn.disabled = true;\n submitBtn.style.opacity = '0.6';\n controls.forEach((c) => {\n c.el.disabled = true;\n });\n\n onSubmit(data);\n };\n\n this.messagesContainer.appendChild(form);\n this.scrollToBottom();\n }\n\n showLoading() {\n if (!this.messagesContainer) return;\n if (this.loadingEl) return;\n\n this.loadingEl = document.createElement('div');\n this.loadingEl.className = 'foisit-loading-dots foisit-bubble system';\n\n // Create dots\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'foisit-dot';\n dot.style.animation = `foisitPulse 1.4s infinite ease-in-out ${i * 0.2}s`;\n this.loadingEl.appendChild(dot);\n }\n\n this.messagesContainer.appendChild(this.loadingEl);\n this.scrollToBottom();\n }\n\n hideLoading() {\n this.loadingEl?.remove();\n this.loadingEl = null;\n }\n\n private scrollToBottom() {\n if (this.messagesContainer) {\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\n }\n }\n\n destroy() {\n this.container?.remove();\n this.container = null;\n this.chatWindow = null;\n this.messagesContainer = null;\n this.input = null;\n this.isOpen = false;\n }\n\n private readFileAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onerror = () => reject(new Error('Failed to read file'));\n fr.onload = () => resolve(String(fr.result));\n fr.readAsDataURL(file);\n });\n }\n\n private getImageDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n try {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => {\n const dims = { width: img.naturalWidth || img.width, height: img.naturalHeight || img.height };\n URL.revokeObjectURL(url);\n resolve(dims);\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ width: 0, height: 0 });\n };\n img.src = url;\n } catch {\n resolve({ width: 0, height: 0 });\n }\n });\n }\n\n private getMediaDuration(file: File): Promise<number> {\n return new Promise((resolve) => {\n try {\n const url = URL.createObjectURL(file);\n const el = file.type.startsWith('audio') ? document.createElement('audio') : document.createElement('video');\n let settled = false;\n const timeout = setTimeout(() => {\n if (!settled) {\n settled = true;\n URL.revokeObjectURL(url);\n resolve(0);\n }\n }, 5000);\n\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n const mediaEl = el as HTMLMediaElement;\n const d = mediaEl.duration || 0;\n URL.revokeObjectURL(url);\n resolve(d);\n };\n el.onerror = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n URL.revokeObjectURL(url);\n resolve(0);\n };\n (el as HTMLMediaElement).src = url;\n } catch {\n resolve(0);\n }\n });\n }\n\n private injectOverlayStyles(): void {\n if (document.getElementById('foisit-overlay-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'foisit-overlay-styles';\n style.textContent = `\n :root {\n /* LIGHT MODE (Default) - Smoother gradient */\n /* Changed: Softer, right-focused radial highlight to avoid a heavy white bottom */\n --foisit-bg: radial-gradient(ellipse at 75% 30%, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));\n --foisit-border: 1px solid rgba(255, 255, 255, 0.25);\n --foisit-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);\n --foisit-text: #333;\n\n /* Input */\n --foisit-input-color: #333;\n --foisit-input-placeholder: rgba(60, 60, 67, 0.6);\n\n /* Bubbles */\n --foisit-bubble-user-bg: rgba(0, 0, 0, 0.04);\n --foisit-bubble-user-text: #333;\n\n --foisit-bubble-sys-bg: rgba(255, 255, 255, 0.45);\n --foisit-bubble-sys-text: #333;\n\n /* Form Colors */\n --foisit-req-star: #ef4444; /* Red asterisk */\n --foisit-error-text: #dc2626;\n --foisit-error-border: #fca5a5;\n }\n\n @media (prefers-color-scheme: dark) {\n :root {\n /* DARK MODE */\n --foisit-bg: linear-gradient(135deg, rgba(40, 40, 40, 0.65), rgba(40, 40, 40, 0.25));\n --foisit-border: 1px solid rgba(255, 255, 255, 0.1);\n --foisit-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);\n --foisit-text: #fff;\n\n /* Input */\n --foisit-input-color: white;\n --foisit-input-placeholder: rgba(235, 235, 245, 0.5);\n\n /* Bubbles */\n --foisit-bubble-user-bg: rgba(255, 255, 255, 0.1);\n --foisit-bubble-user-text: white;\n\n --foisit-bubble-sys-bg: rgba(255, 255, 255, 0.05);\n --foisit-bubble-sys-text: rgba(255, 255, 255, 0.9);\n\n /* Form Colors */\n --foisit-req-star: #f87171;\n --foisit-error-text: #fca5a5;\n --foisit-error-border: #f87171;\n }\n }\n\n @keyframes foisitPulse {\n 0%, 100% { transform: scale(0.8); opacity: 0.5; }\n 50% { transform: scale(1.2); opacity: 1; }\n }\n\n @keyframes foisitShake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-4px); }\n 75% { transform: translateX(4px); }\n }\n .foisit-shake { animation: foisitShake 0.4s ease-in-out; }\n\n /* Container */\n .foisit-overlay-container {\n position: fixed;\n inset: 0;\n z-index: 2147483647;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n .foisit-overlay-container * {\n box-sizing: border-box;\n }\n\n /* Chat Window - Dynamic Height */\n .foisit-chat {\n position: absolute;\n top: 20px;\n right: 20px;\n width: min(420px, 92vw);\n\n /* FIX: Auto height to prevent empty space */\n height: auto;\n min-height: 120px;\n max-height: 80vh;\n\n background: var(--foisit-bg);\n border: var(--foisit-border);\n box-shadow: var(--foisit-shadow);\n\n backdrop-filter: blur(20px);\n -webkit-backdrop-filter: blur(20px);\n\n border-radius: 18px;\n display: none;\n flex-direction: column;\n overflow: hidden;\n pointer-events: auto;\n transform-origin: top right;\n transition: opacity 0.2s, transform 0.2s cubic-bezier(0.2, 0.9, 0.2, 1);\n }\n\n .foisit-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n color: var(--foisit-text);\n border-bottom: 1px solid rgba(127,127,127,0.08); /* Subtle separator */\n }\n\n .foisit-close {\n background: transparent;\n border: none;\n color: var(--foisit-text);\n opacity: 0.5;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s;\n }\n .foisit-close:hover { opacity: 1; }\n\n /* Message Area */\n .foisit-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n /* Ensure it doesn't get too tall initially */\n min-height: 60px;\n }\n\n /* Make sure empty state isn't huge */\n .foisit-messages:empty {\n display: none;\n }\n\n /* Only show messages container if it has children */\n .foisit-messages:not(:empty) {\n display: flex;\n }\n\n /* Bubbles */\n .foisit-bubble {\n max-width: 90%;\n padding: 8px 14px;\n border-radius: 14px;\n font-size: 14px;\n line-height: 1.4;\n word-wrap: break-word;\n }\n\n .foisit-bubble.user {\n align-self: flex-end;\n background: var(--foisit-bubble-user-bg);\n color: var(--foisit-bubble-user-text);\n border-bottom-right-radius: 4px;\n }\n\n .foisit-bubble.system {\n align-self: flex-start;\n background: var(--foisit-bubble-sys-bg);\n color: var(--foisit-bubble-sys-text);\n border-bottom-left-radius: 4px;\n border: 1px solid rgba(255,255,255,0.1);\n }\n\n /* Input Area */\n .foisit-input-area {\n padding: 0;\n width: 100%;\n border-top: 1px solid rgba(127,127,127,0.08);\n }\n\n .foisit-input {\n width: 100%;\n background: transparent;\n border: none;\n font-size: 16px;\n color: var(--foisit-input-color);\n padding: 16px 20px;\n outline: none;\n text-align: left;\n }\n\n .foisit-input::placeholder {\n color: var(--foisit-input-placeholder);\n font-weight: 400;\n }\n\n /* Options & Buttons */\n .foisit-options-container {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-left: 2px;\n margin-top: 4px;\n }\n\n .foisit-option-chip {\n padding: 6px 14px;\n background: var(--foisit-bubble-sys-bg);\n border: 1px solid rgba(127,127,127,0.1);\n border-radius: 20px;\n font-size: 13px;\n color: var(--foisit-text);\n cursor: pointer;\n transition: all 0.2s;\n font-weight: 500;\n }\n .foisit-option-chip:hover {\n background: rgba(127,127,127,0.15);\n }\n\n /* Form Styling */\n .foisit-form {\n background: var(--foisit-bubble-sys-bg);\n padding: 16px;\n border-radius: 14px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n border: 1px solid rgba(127,127,127,0.1);\n }\n\n .foisit-form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--foisit-text);\n opacity: 0.9;\n margin-bottom: 2px;\n }\n\n .foisit-req-star {\n color: var(--foisit-req-star);\n font-weight: bold;\n }\n\n .foisit-form-input {\n width: 100%;\n padding: 10px;\n border-radius: 8px;\n border: 1px solid rgba(127,127,127,0.2);\n background: rgba(255,255,255,0.05); /* Very subtle fill */\n color: var(--foisit-text);\n font-size: 14px;\n outline: none;\n transition: border 0.2s;\n }\n .foisit-form-input:focus {\n border-color: var(--foisit-text);\n background: rgba(255,255,255,0.1);\n }\n\n .foisit-error-border {\n border-color: var(--foisit-error-border) !important;\n }\n\n .foisit-form-error {\n font-size: 11px;\n color: var(--foisit-error-text);\n margin-top: 4px;\n }\n\n /* Loading */\n .foisit-loading-dots {\n display: inline-flex;\n gap: 4px;\n padding: 10px 14px;\n align-self: flex-start;\n }\n .foisit-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--foisit-text);\n opacity: 0.4;\n }\n\n /* Floating Button */\n .foisit-floating-btn {\n position: absolute;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: 1px solid rgba(255,255,255,0.2);\n background: var(--foisit-bg);\n color: var(--foisit-text);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n cursor: pointer;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n z-index: 100000;\n transition: transform 0.2s;\n }\n .foisit-floating-btn:hover { transform: scale(1.05); }\n `;\n document.head.appendChild(style);\n }\n}\n", "import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'lib-angular-wrapper',\n imports: [CommonModule],\n templateUrl: './angular-wrapper.component.html',\n styleUrl: './angular-wrapper.component.css',\n})\nexport class AngularWrapperComponent {}\n", "<p>AngularWrapper works!</p>\n", "import { Injectable, Inject } from '@angular/core';\nimport {\n CommandHandler,\n FallbackHandler,\n VoiceProcessor,\n StateManager,\n AssistantConfig,\n TextToSpeech,\n GestureHandler,\n OverlayManager,\n AssistantCommand,\n AssistantCommandParams,\n InteractiveResponse,\n} from '@foisit/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AssistantService {\n private commandHandler: CommandHandler;\n private fallbackHandler: FallbackHandler;\n private voiceProcessor: VoiceProcessor;\n private textToSpeech: TextToSpeech;\n private stateManager: StateManager;\n private lastProcessedInput = '';\n private processingLock = false;\n private isActivated = false; // Tracks activation status\n private gestureHandler: GestureHandler;\n private overlayManager: OverlayManager;\n private defaultIntroMessage = 'How can I help you?';\n\n constructor(@Inject('ASSISTANT_CONFIG') private config: AssistantConfig) {\n // Pass enableSmartIntent (default true) and potential apiKey (if we add it to config later)\n this.commandHandler = new CommandHandler({\n enableSmartIntent: this.config.enableSmartIntent !== false,\n intentEndpoint: this.config.intentEndpoint,\n });\n this.fallbackHandler = new FallbackHandler();\n\n // Browser-only features are lazily created to remain SSR-safe\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n this.voiceProcessor = new VoiceProcessor();\n this.textToSpeech = new TextToSpeech();\n this.gestureHandler = new GestureHandler();\n this.overlayManager = new OverlayManager({\n floatingButton: this.config.floatingButton,\n inputPlaceholder: this.config.inputPlaceholder,\n });\n\n // Register global callbacks for floating button when overlay exists\n this.overlayManager.registerCallbacks(\n async (input) => {\n if (typeof input === 'string') {\n this.overlayManager.addMessage(input, 'user');\n } else if (input && typeof input === 'object') {\n const label = this.extractUserLabel(input as Record<string, unknown>);\n if (label) {\n this.overlayManager.addMessage(label, 'user');\n }\n }\n\n await this.handleCommand(input);\n },\n () => console.log('AssistantService: Overlay closed.')\n );\n\n // Setup double-tap/double-click listener\n this.stateManager = new StateManager();\n this.gestureHandler.setupDoubleTapListener(() => this.toggle());\n } else {\n // Server environment: keep browser-specific properties null\n this.stateManager = undefined as any;\n this.voiceProcessor = undefined as any;\n this.textToSpeech = undefined as any;\n this.gestureHandler = undefined as any;\n this.overlayManager = undefined as any;\n }\n\n // Setup commands from config\n this.config.commands.forEach((cmd) => this.commandHandler.addCommand(cmd));\n\n // Setup fallback response\n if (this.config.fallbackResponse) {\n this.fallbackHandler.setFallbackMessage(this.config.fallbackResponse);\n }\n\n // Voice disabled for text-first pivot\n // this.startListening();\n\n // (moved into the browser-only block)\n }\n\n /** Start listening for activation and commands */\n startListening(): void {\n // No-op on server or when voice features are unavailable\n if (typeof window === 'undefined' || !this.voiceProcessor) {\n console.log('AssistantService: Voice is disabled or unavailable; startListening() is a no-op.');\n return;\n }\n\n /*\n this.voiceProcessor.startListening(async (transcript: string) => {\n if (this.processingLock) return;\n\n const normalizedTranscript = transcript.toLowerCase().trim();\n\n // Skip repeated or irrelevant inputs\n if (\n !normalizedTranscript ||\n normalizedTranscript.length < 3 ||\n normalizedTranscript === this.lastProcessedInput\n ) {\n console.log('AssistantService: Ignoring irrelevant input.');\n return;\n }\n\n this.lastProcessedInput = normalizedTranscript;\n\n if (!this.isActivated) {\n await this.processActivation(normalizedTranscript);\n return;\n }\n\n const isFallbackOrIntroMessage =\n normalizedTranscript === this.config.fallbackResponse?.toLowerCase() ||\n normalizedTranscript === this.config.introMessage?.toLowerCase() ||\n normalizedTranscript === this.defaultIntroMessage.toLowerCase();\n\n if (!isFallbackOrIntroMessage) {\n await this.handleCommand(normalizedTranscript);\n } else {\n console.log('AssistantService: Ignoring fallback or intro message.');\n }\n\n // Throttle input processing to prevent rapid feedback\n this.processingLock = true;\n setTimeout(() => (this.processingLock = false), 1000);\n });\n */\n }\n\n /** Stop listening for voice input */\n stopListening(): void {\n if (typeof window === 'undefined' || !this.voiceProcessor) {\n console.log('AssistantService: Voice unavailable; stopListening() is a no-op.');\n this.isActivated = false;\n return;\n }\n this.voiceProcessor.stopListening();\n this.isActivated = false;\n }\n\n /** Reset activation state so the next activation flow can occur. */\n reactivate(): void {\n console.log('AssistantService: Reactivating assistant...');\n this.isActivated = false;\n try {\n this.startListening();\n } catch {\n // no-op\n }\n }\n\n /** Process activation command */\n private async processActivation(transcript: string): Promise<void> {\n const activationCmd = this.config.activationCommand?.toLowerCase();\n\n // If no activation command is set, we can't activate via voice\n if (!activationCmd) return;\n\n if (transcript === activationCmd) {\n console.log('AssistantService: Activation matched.');\n this.isActivated = true;\n this.textToSpeech.speak(\n this.config.introMessage || this.defaultIntroMessage\n );\n // this.stateManager.setState('listening'); // DISABLED - no gradient animation\n } else {\n console.log('AssistantService: Activation command not recognized.');\n }\n }\n\n /** Handle recognized commands */\n private async handleCommand(\n input: string | Record<string, unknown>\n ): Promise<void> {\n this.overlayManager.showLoading();\n let response: InteractiveResponse;\n try {\n response = await this.commandHandler.executeCommand(input);\n } finally {\n this.overlayManager.hideLoading();\n }\n\n const originalText = typeof input === 'string' ? input : undefined;\n this.processResponse(response, originalText);\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n this.voiceProcessor?.stopListening();\n this.gestureHandler?.destroy();\n this.overlayManager?.destroy();\n }\n\n /** Unified response processing */\n private processResponse(\n response: InteractiveResponse,\n originalText?: string\n ): void {\n if (response.type === 'error' && originalText) {\n this.fallbackHandler.handleFallback(originalText);\n this.overlayManager.addMessage(this.fallbackHandler.getFallbackMessage(), 'system');\n return;\n }\n\n if (response.type === 'form' && response.fields) {\n this.overlayManager.addForm(\n response.message,\n response.fields,\n async (data: Record<string, unknown>) => {\n this.overlayManager.showLoading();\n let nextReponse: InteractiveResponse;\n try {\n nextReponse = await this.commandHandler.executeCommand(data);\n } finally {\n this.overlayManager.hideLoading();\n }\n this.processResponse(nextReponse);\n }\n );\n return;\n }\n\n if ((response.type === 'ambiguous' || response.type === 'confirm') && response.options) {\n if (response.message) {\n this.overlayManager.addMessage(response.message, 'system');\n }\n this.overlayManager.addOptions(response.options);\n return;\n }\n\n if (response.message) {\n this.overlayManager.addMessage(response.message, 'system');\n }\n }\n\n /** Add a command dynamically (supports string or rich object) */\n addCommand(\n commandOrObj: string | AssistantCommand,\n action?: (\n params?: AssistantCommandParams\n ) => Promise<string | InteractiveResponse | void> | void\n ): void {\n if (typeof commandOrObj === 'string') {\n console.log(`AssistantService: Adding command \"${commandOrObj}\".`);\n } else {\n console.log(\n `AssistantService: Adding rich command \"${commandOrObj.command}\".`\n );\n }\n this.commandHandler.addCommand(commandOrObj, action);\n }\n\n /** Remove a command dynamically */\n removeCommand(command: string): void {\n console.log(`AssistantService: Removing command \"${command}\".`);\n this.commandHandler.removeCommand(command);\n }\n\n /** Get all registered commands */\n getCommands(): string[] {\n return this.commandHandler.getCommands();\n }\n\n /** Toggle the assistant overlay */\n toggle(\n onSubmit?: (input: string | Record<string, unknown>) => void,\n onClose?: () => void\n ): void {\n console.log('AssistantService: Toggling overlay...');\n this.overlayManager.toggle(\n async (input) => {\n if (typeof input === 'string') {\n this.overlayManager.addMessage(input, 'user');\n } else if (input && typeof input === 'object') {\n const label = this.extractUserLabel(input);\n if (label) {\n this.overlayManager.addMessage(label, 'user');\n }\n }\n\n if (onSubmit) onSubmit(input);\n await this.handleCommand(input);\n },\n () => {\n console.log('AssistantService: Overlay closed.');\n if (onClose) onClose();\n }\n );\n }\n\n private extractUserLabel(payload: Record<string, unknown>): string | null {\n const label = payload['label'];\n if (typeof label === 'string' && label.trim()) {\n return label.trim();\n }\n\n const commandId = payload['commandId'];\n if (typeof commandId === 'string' && commandId.trim()) {\n return commandId.trim();\n }\n\n return null;\n }\n}\n", "import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { AssistantService } from './service/assistant.service';\nimport { AssistantConfig } from '@foisit/core';\n\n@NgModule({})\nexport class AssistantModule {\n static forRoot(config: AssistantConfig): ModuleWithProviders<AssistantModule> {\n return {\n ngModule: AssistantModule,\n providers: [\n { provide: 'ASSISTANT_CONFIG', useValue: config },\n AssistantService,\n ],\n };\n }\n}\n", "/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],
5
- "mappings": ";;;;;;;;;;AAYM,IAAO,gBAAP,MAAoB;EAGxB,YAAY,UAAiB;AAC3B,SAAK,WACH,YAAY;EAChB;EAEM,gBACJ,WACA,mBACA,SAAmD;;AAEnD,UAAI;AAEF,cAAM,UAAU;UACd;UACA,UAAU,kBAAkB,IAAI,CAAC,SAAS;YACxC,IAAI,IAAI;YACR,SAAS,IAAI;YACb,aAAa,IAAI;YACjB,YAAY,IAAI;;YAChB;UACF;;AAGF,cAAM,WAAW,MAAM,MAAM,KAAK,UAAU;UAC1C,QAAQ;UACR,SAAS;YACP,gBAAgB;;UAElB,MAAM,KAAK,UAAU,OAAO;SAC7B;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,oBAAoB,SAAS,UAAU,EAAE;QAC3D;AAEA,cAAM,SAAS,MAAM,SAAS,KAAI;AAClC,eAAO;MACT,SAAS,OAAO;AACd,gBAAQ,MAAM,wBAAwB,KAAK;AAC3C,eAAO,EAAE,MAAM,UAAS;MAC1B;IACF,CAAC;;;;;ACjCG,IAAO,iBAAP,MAAqB;EAQzB,YAAY,MAAuC,MAAI;;AAP/C,SAAA,WAAW,oBAAI,IAAG;AAClB,SAAA,gBAAsC;AACtC,SAAA,UAAiC;AACjC,SAAA,sBAAkD;AAClD,SAAA,oBAAoB;AACpB,SAAA,qBAAqB,oBAAI,IAAG;AAGlC,QAAI,OAAO,QAAQ,WAAW;AAC5B,WAAK,oBAAoB;AACzB,UAAI,KAAK,mBAAmB;AAC1B,aAAK,gBAAgB,IAAI,cAAa;MACxC;AACA;IACF;AAEA,SAAK,qBAAoB,KAAA,IAAI,uBAAiB,QAAA,OAAA,SAAA,KAAI;AAClD,QAAI,KAAK,mBAAmB;AAC1B,WAAK,gBAAgB,IAAI,cAAc,IAAI,cAAc;IAC3D;EACF;;EAGA,WACE,cACA,QAAmC;AAEnC,QAAI;AAEJ,QAAI,OAAO,iBAAiB,UAAU;AACpC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,gDAAgD;MAClE;AACA,YAAM;QACJ,IAAI,aAAa,YAAW,EAAG,QAAQ,QAAQ,GAAG;QAClD,SAAS,aAAa,YAAW;QACjC;;IAEJ,OAAO;AACL,YAAG,OAAA,OAAA,CAAA,GAAQ,YAAY;AACvB,UAAI,CAAC,IAAI,IAAI;AACX,YAAI,KAAK,IAAI,QAAQ,YAAW,EAAG,QAAQ,QAAQ,GAAG;MACxD;IACF;AAEA,SAAK,SAAS,IAAI,IAAI,QAAQ,YAAW,GAAI,GAAG;AAEhD,QAAI,IAAI,MAAM,IAAI,OAAO,IAAI,SAAS;IAItC;EACF;;EAGA,cAAc,SAAe;AAC3B,SAAK,SAAS,OAAO,QAAQ,YAAW,CAAE;EAC5C;;EAGM,eACJ,OAAuC;;;AAGvC,UAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAE/C,YAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,gBAAM,QAAQ,OAAO,MAAM,SAAS;AACpC,gBAAM,aAA2B,KAAA,MAAM,YAAM,QAAA,OAAA,SAAA,KAAI,CAAA;AACjD,gBAAMA,OAAM,KAAK,eAAe,KAAK;AACrC,cAAI,CAACA;AAAK,mBAAO,EAAE,SAAS,kCAAkC,MAAM,QAAO;AAE3E,gBAAM,SAAS,KAAK,yBAAyBA,MAAK,SAAS;AAE3D,gBAAM,mBAAkB,KAAAA,KAAI,gBAAU,QAAA,OAAA,SAAA,KAAI,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;AACtE,gBAAM,UAAU,eAAe,OAAO,CAAC,MAAM,OAAO,EAAE,IAAI,KAAK,QAAQ,OAAO,EAAE,IAAI,MAAM,EAAE;AAC5F,cAAI,QAAQ,SAAS,GAAG;AAEtB,iBAAK,UAAU,EAAE,WAAW,KAAK,qBAAqBA,IAAG,GAAG,OAAM;AAClE,mBAAO;cACL,SAAS,4CAA4CA,KAAI,OAAO;cAChE,MAAM;cACN,QAAQ;;UAEZ;AAEA,cAAIA,KAAI,UAAU;AAChB,iBAAK,sBAAsB,EAAE,WAAW,KAAK,qBAAqBA,IAAG,GAAG,OAAM;AAC9E,mBAAO,KAAK,qBAAqBA,IAAG;UACtC;AAEA,iBAAO,KAAK,cAAcA,MAAK,MAAM;QACvC;AAGA,YAAI,CAAC,KAAK,SAAS;AACjB,iBAAO,EAAE,SAAS,uCAAuC,MAAM,QAAO;QACxE;AAEA,cAAM,MAAM,KAAK,eAAe,KAAK,QAAQ,SAAS;AACtD,YAAI,CAAC,KAAK;AACR,eAAK,UAAU;AACf,iBAAO,EAAE,SAAS,uCAAuC,MAAM,QAAO;QACxE;AAEA,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAO,EAAE,SAAS,yBAAyB,MAAM,QAAO;QAC1D;AAEA,cAAM,eAAY,OAAA,OAAA,OAAA,OAAA,CAAA,GACb,KAAK,QAAQ,MAAM,GAClB,KAAuB;AAI7B,YAAI,IAAI,UAAU;AAChB,eAAK,UAAU;AACf,eAAK,sBAAsB;YACzB,WAAW,KAAK,qBAAqB,GAAG;YACxC,QAAQ;;AAEV,iBAAO,KAAK,qBAAqB,GAAG;QACtC;AAEA,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK,YAAY;AACzD,aAAK,UAAU;AACf,eAAO,KAAK,kBAAkB,MAAM;MACtC;AAEA,YAAM,eAAe,MAAM,KAAI,EAAG,YAAW;AAG7C,UAAI,KAAK,qBAAqB;AAC5B,cAAM,aAAa;AACnB,YAAI,CAAC,OAAO,KAAK,WAAW,MAAM,MAAM,EAAE,SAAS,UAAU,GAAG;AAC9D,gBAAM,EAAE,WAAW,OAAM,IAAK,KAAK;AACnC,eAAK,sBAAsB;AAC3B,gBAAM,MAAM,KAAK,eAAe,SAAS;AACzC,cAAI,CAAC,KAAK;AACR,mBAAO,EAAE,SAAS,uCAAuC,MAAM,QAAO;UACxE;AACA,iBAAO,KAAK,cAAc,KAAK,MAAM;QACvC;AAEA,YAAI,CAAC,MAAM,KAAK,UAAU,MAAM,EAAE,SAAS,UAAU,GAAG;AACtD,eAAK,sBAAsB;AAC3B,iBAAO,EAAE,SAAS,cAAc,MAAM,UAAS;QACjD;AACA,eAAO;UACL,SAAS;UACT,MAAM;UACN,SAAS;YACP,EAAE,OAAO,OAAO,OAAO,MAAK;YAC5B,EAAE,OAAO,MAAM,OAAO,KAAI;;;MAGhC;AAGA,YAAM,eAAe,KAAK,SAAS,IAAI,YAAY;AACnD,UAAI,cAAc;AAChB,cAAM,MAAM;AAGZ,cAAM,mBAAkB,KAAA,IAAI,gBAAU,QAAA,OAAA,SAAA,KAAI,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;AACtE,YAAI,eAAe,SAAS,GAAG;AAC7B,eAAK,UAAU,EAAE,WAAW,KAAK,qBAAqB,GAAG,GAAG,QAAQ,CAAA,EAAE;AACtE,iBAAO;YACL,SAAS,4CAA4C,IAAI,OAAO;YAChE,MAAM;YACN,QAAQ;;QAEZ;AAGA,YAAI,IAAI,UAAU;AAChB,eAAK,sBAAsB,EAAE,WAAW,KAAK,qBAAqB,GAAG,GAAG,QAAQ,CAAA,EAAE;AAClF,iBAAO,KAAK,qBAAqB,GAAG;QACtC;AAGA,eAAO,KAAK,cAAc,KAAK,CAAA,CAAE;MACnC;AAGA,YAAM,gBAAgB,MAAM,KAAK,sBAAsB,YAAY;AACnE,UAAI;AAAe,eAAO;AAG1B,UAAI,KAAK,qBAAqB,KAAK,eAAe;AAChD,cAAM,oBAAoB,MAAM,KAAK,iBAAgB;AAErD,cAAM,WAAW,MAAM,KAAK,cAAc,gBACxC,cACA,mBACA,KAAK,OAAO;AAGd,eAAO,KAAK,eAAe,QAAQ;MACrC;AAIA,UAAI,CAAC,KAAK,mBAAmB;AAC3B,eAAO,EAAE,SAAS,+BAA+B,MAAM,QAAO;MAChE;AAGA,aAAO,KAAK,gBAAe;IAC7B,CAAC;;EAEa,eAAe,QAAoB;;;AAC/C,UAAI,OAAO,SAAS,WAAW,OAAO,OAAO;AAC3C,cAAM,MAAM,KAAK,eAAe,OAAO,KAAK;AAC5C,YAAI,CAAC,KAAK;AACR,iBAAO,EAAE,SAAS,+BAA+B,MAAM,QAAO;QAChE;AAEA,cAAM,aAAa,KAAA,OAAO,YAAM,QAAA,OAAA,SAAA,KAAI,CAAA;AACpC,cAAM,kBAAkB,KAAK,yBAAyB,KAAK,SAAS;AACpE,cAAM,SAAS,IAAI,2BAA2B,QAAQ,CAAA,IAAK;AAC3D,cAAM,mBAAkB,KAAA,IAAI,gBAAU,QAAA,OAAA,SAAA,KAAI,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;AACtE,cAAM,kBAAkB,eAAe,OAAO,CAAC,MAAM,OAAO,EAAE,IAAI,KAAK,QAAQ,OAAO,EAAE,IAAI,MAAM,EAAE;AAEpG,YAAI,OAAO,cAAc,gBAAgB,SAAS,GAAG;AAEnD,eAAK,UAAU,EAAE,WAAW,KAAK,qBAAqB,GAAG,GAAG,OAAM;AAClE,gBAAM,cAAc,IAAI,2BAA2B;AACnD,gBAAM,YAAY,CAAC,eAAe,KAAK,wBAAwB,eAAe;AAE9E,cAAI,WAAW;AACb,kBAAM,QAAQ,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO;AAC7D,mBAAO;cACL,SAAS,OAAO,WAAW,kBAAkB,KAAK;cAClD,MAAM;;UAEV;AAEA,iBAAO;YACL,SACE,OAAO,WAAW,2CAA2C,IAAI,OAAO;YAC1E,MAAM;YACN,QAAQ;;QAEZ;AAGA,YAAI,IAAI,UAAU;AAChB,eAAK,sBAAsB;YACzB,WAAW,KAAK,qBAAqB,GAAG;YACxC;;AAEF,iBAAO,KAAK,qBAAqB,GAAG;QACtC;AAEA,cAAM,eAAe,MAAM,IAAI,OAAO,MAAM;AAC5C,eAAO,KAAK,kBAAkB,YAAY;MAC5C;AAEA,UAAI,OAAO,SAAS,eAAe,OAAO,WAAW,OAAO,QAAQ,QAAQ;AAG1E,eAAO;UACL,SAAS,OAAO,WAAW;UAC3B,MAAM;UACN,SAAS,OAAO,QAAQ,IAAI,CAAC,MAAK;;AAAC,mBAAC;cAClC,OAAO,EAAE;cACT,QAAOC,MAAA,EAAE,eAAS,QAAAA,QAAA,SAAAA,MAAI,EAAE;cACxB,WAAW,EAAE;;WACb;;MAEN;AAGA,aAAO,KAAK,gBAAe;IAC7B,CAAC;;EAEO,yBAAyB,KAAuB,QAAqB;;AAC3E,UAAM,YAAS,OAAA,OAAA,CAAA,GAAwB,WAAM,QAAN,WAAM,SAAN,SAAU,CAAA,CAAG;AAEpD,eAAW,MAAK,KAAA,IAAI,gBAAU,QAAA,OAAA,SAAA,KAAI,CAAA,GAAI;AACpC,YAAM,QAAQ,UAAU,EAAE,IAAI;AAE9B,UAAI,EAAE,SAAS,UAAU;AACvB,YAAI,OAAO,UAAU,UAAU;AAC7B,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,cAAM,UAAU,MAAM,KAAI;AAC1B,YAAI,CAAC,SAAS;AACZ,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,kBAAU,EAAE,IAAI,IAAI;MACtB;AAEA,UAAI,EAAE,SAAS,UAAU;AACvB,cAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAQ,UAAgB,QAAhB,UAAK,SAAA,SAAL,MAAkB,SAAQ,EAAG,KAAI,CAAE;AAC/F,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,YAAI,OAAO,EAAE,QAAQ,YAAY,UAAU,EAAE,KAAK;AAChD,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,YAAI,OAAO,EAAE,QAAQ,YAAY,UAAU,EAAE,KAAK;AAChD,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,kBAAU,EAAE,IAAI,IAAI;MACtB;AAEA,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,IAAI,UAAU,EAAE,IAAI;AAC1B,YAAI,OAAO,MAAM,UAAU;AACzB,gBAAM,IAAI,EAAE,KAAI;AAChB,cAAI,CAAC,KAAK,gBAAgB,CAAC,GAAG;AAC5B,mBAAO,UAAU,EAAE,IAAI;UACzB,OAAO;AACL,sBAAU,EAAE,IAAI,IAAI;UACtB;QACF,OAAO;AACL,iBAAO,UAAU,EAAE,IAAI;QACzB;MACF;AAEA,UAAI,EAAE,SAAS,UAAU;AACvB,cAAM,IAAI,OAAO,UAAU,WAAW,QAAS,UAAa,QAAb,UAAK,SAAA,SAAL,MAAe,SAAQ;AACtE,YAAI,CAAC,GAAG;AACN,iBAAO,UAAU,EAAE,IAAI;AACvB;QACF;AACA,YAAI,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS,GAAG;AACpD,gBAAM,UAAU,EAAE,QAAQ,KAAK,CAAC,QAAQ,OAAO,IAAI,KAAK,MAAM,OAAO,CAAC,CAAC;AACvE,cAAI,CAAC,SAAS;AACZ,mBAAO,UAAU,EAAE,IAAI;AACvB;UACF;QACF;AACA,kBAAU,EAAE,IAAI,IAAI;MACtB;AAKA,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,MAAM,UAAU,EAAE,IAAI;AAC5B,cAAM,aACJ,OAAO,OAAO,QAAQ,YAAY,OAAQ,IAAY,SAAS,YAAY,OAAQ,IAAY,SAAS;AAC1G,cAAM,YAAY,OAAO,QAAQ,YAAY,sBAAsB,KAAK,GAAG;AAC3E,cAAM,YAAW,KAAC,EAAU,cAAQ,QAAA,OAAA,SAAA,KAAI;AAExC,YAAI,aAAa,UAAU;AAEzB,cAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,mBAAO,UAAU,EAAE,IAAI;UACzB;QACF,OAAO;AAEL,cAAI,CAAC,YAAY;AACf,mBAAO,UAAU,EAAE,IAAI;UACzB;QACF;MACF;IACF;AAEA,WAAO;EACT;EAEQ,gBAAgB,OAAa;AACnC,QAAI,CAAC,sBAAsB,KAAK,KAAK;AAAG,aAAO;AAC/C,UAAM,KAAK,oBAAI,KAAK,GAAG,KAAK,YAAY;AACxC,WAAO,CAAC,OAAO,MAAM,GAAG,QAAO,CAAE;EACnC;EAEQ,wBAAwB,SAA6B;AAC3D,QAAI,QAAQ,WAAW;AAAG,aAAO;AACjC,UAAM,IAAI,QAAQ,CAAC,EAAE;AACrB,WAAO,MAAM,YAAY,MAAM,YAAY,MAAM;EACnD;EAEQ,qBAAqB,KAAqB;AAChD,WAAO;MACL,SAAS,iCAAiC,IAAI,OAAO;MACrD,MAAM;MACN,SAAS;QACP,EAAE,OAAO,OAAO,OAAO,MAAK;QAC5B,EAAE,OAAO,MAAM,OAAO,KAAI;;;EAGhC;EAEc,sBACZ,OAAa;;;AAGb,YAAM,aAAyD,CAAA;AAE/D,iBAAWD,QAAO,KAAK,SAAS,OAAM,GAAI;AACxC,YAAI,QAAQ;AACZ,cAAM,gBAAgBA,KAAI,QAAQ,YAAW;AAC7C,YAAI,MAAM,SAAS,aAAa;AAAG,mBAAS;AAE5C,cAAM,YAAW,KAAAA,KAAI,cAAQ,QAAA,OAAA,SAAA,KAAI,CAAA;AACjC,mBAAW,MAAM,UAAU;AACzB,gBAAM,IAAI,GAAG,YAAW,EAAG,KAAI;AAC/B,cAAI,CAAC;AAAG;AACR,cAAI,UAAU;AAAG,qBAAS;mBACjB,MAAM,SAAS,CAAC;AAAG,qBAAS;QACvC;AAEA,YAAI,QAAQ;AAAG,qBAAW,KAAK,EAAE,KAAAA,MAAK,MAAK,CAAE;MAC/C;AAEA,UAAI,WAAW,WAAW;AAAG,eAAO;AACpC,iBAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAE3C,YAAM,WAAW,WAAW,CAAC,EAAE;AAC/B,YAAM,MAAM,WAAW,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,MAAM,GAAG,CAAC;AAGrE,UAAI,IAAI,SAAS,GAAG;AAClB,eAAO;UACL,SAAS;UACT,MAAM;UACN,SAAS,IAAI,IAAI,CAAC,OAAO;YACvB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;YACjB;;MAEN;AAEA,YAAM,MAAM,IAAI,CAAC,EAAE;AAGnB,YAAM,mBAAkB,KAAA,IAAI,gBAAU,QAAA,OAAA,SAAA,KAAI,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;AACtE,UAAI,eAAe,SAAS,GAAG;AAC7B,aAAK,UAAU,EAAE,WAAW,KAAK,qBAAqB,GAAG,GAAG,QAAQ,CAAA,EAAE;AACtE,eAAO;UACL,SAAS,4CAA4C,IAAI,OAAO;UAChE,MAAM;UACN,QAAQ;;MAEZ;AAEA,UAAI,IAAI,UAAU;AAChB,aAAK,sBAAsB,EAAE,WAAW,KAAK,qBAAqB,GAAG,GAAG,QAAQ,CAAA,EAAE;AAClF,eAAO,KAAK,qBAAqB,GAAG;MACtC;AAEA,aAAO,KAAK,cAAc,KAAK,CAAA,CAAE;IACnC,CAAC;;EAEa,cAAc,KAAuB,QAAsB;;AACvE,UAAI;AACF,cAAM,SAAS,MAAM,IAAI,OAAO,WAAM,QAAN,WAAM,SAAN,SAAU,CAAA,CAAE;AAC5C,eAAO,KAAK,kBAAkB,MAAM;MACtC,SAAE,IAAM;AACN,eAAO,EAAE,SAAS,oDAAoD,MAAM,QAAO;MACrF;IACF,CAAC;;EAEa,mBAAgB;;AAC5B,YAAM,WAAW,MAAM,KAAK,KAAK,SAAS,OAAM,CAAE,EAAE,IAAI,CAAC,QAAQ,OAAA,OAAA,OAAA,OAAA,CAAA,GAC5D,GAAG,GAAA,EACN,YAAY,IAAI,aACZ,IAAI,WAAW,IAAI,CAAC,UAAU,OAAA,OAAA,CAAA,GAAM,KAAK,CAAG,IAC5C,OAAS,CAAA,CACb;AAGF,YAAM,QAAQ,IACZ,SAAS,IAAI,CAAO,QAAOE,WAAA,MAAA,QAAA,QAAA,aAAA;AACzB,YAAI,CAAC,IAAI;AAAY;AACrB,cAAM,QAAQ,IACZ,IAAI,WAAW,IAAI,CAAO,MAAKA,WAAA,MAAA,QAAA,QAAA,aAAA;;AAC7B,cAAI,EAAE,SAAS,YAAY,CAAC,EAAE,cAAe,EAAE,WAAW,EAAE,QAAQ;AAAS;AAC7E,gBAAM,WAAW,IAAG,KAAA,IAAI,QAAE,QAAA,OAAA,SAAA,KAAI,IAAI,OAAO,IAAI,EAAE,IAAI;AACnD,gBAAM,SAAS,KAAK,mBAAmB,IAAI,QAAQ;AACnD,gBAAM,MAAM,KAAK,IAAG;AACpB,cAAI,UAAU,MAAM,OAAO,KAAK,KAAQ;AACtC,cAAE,UAAU,OAAO;AACnB;UACF;AACA,cAAI;AACF,kBAAM,OAAO,MAAM,EAAE,WAAU;AAC/B,iBAAK,mBAAmB,IAAI,UAAU,EAAE,SAAS,MAAM,IAAI,IAAG,CAAE;AAChE,cAAE,UAAU;UACd,SAAE,IAAM;UAER;QACF,CAAC,CAAA,CAAC;MAEN,CAAC,CAAA,CAAC;AAGJ,aAAO;IACT,CAAC;;EAEO,eAAe,IAAU;AAC/B,eAAW,OAAO,KAAK,SAAS,OAAM,GAAI;AACxC,UAAI,IAAI,OAAO;AAAI,eAAO;IAC5B;AACA,WAAO;EACT;EAEQ,kBAAe;AACrB,UAAM,UAAU,MAAM,KAAK,KAAK,SAAS,OAAM,CAAE,EAAE,IAAI,CAAC,QAAO;;AAAC,aAAC;QAC/D,OAAO,IAAI;QACX,QAAO,KAAA,IAAI,QAAE,QAAA,OAAA,SAAA,KAAI,IAAI;QACrB,YAAW,KAAA,IAAI,QAAE,QAAA,OAAA,SAAA,KAAI,IAAI;;KACzB;AAEF,WAAO;MACL,SAAS;MACT,MAAM;MACN;;EAEJ;EAEQ,kBAAkB,QAA2C;AACnE,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,EAAE,SAAS,QAAQ,MAAM,UAAS;IAC3C;AACA,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,aAAO;IACT;AACA,WAAO,EAAE,SAAS,QAAQ,MAAM,UAAS;EAC3C;EAEQ,aAAa,OAA8B;AACjD,WAAO,OAAO,MAAM,WAAW,MAAM;EACvC;EAEQ,qBAAqB,KAAqB;AAChD,QAAI,CAAC,IAAI,IAAI;AACX,UAAI,KAAK,IAAI,QAAQ,YAAW,EAAG,QAAQ,QAAQ,GAAG;IACxD;AACA,WAAO,IAAI;EACb;;EAGA,cAAW;AACT,WAAO,MAAM,KAAK,KAAK,SAAS,KAAI,CAAE;EACxC;;;;AC1jBI,IAAO,eAAP,MAAmB;EAAzB,cAAA;AACU,SAAA,QAAiC,OAAO,WAAW,cAAc,OAAO,kBAAkB;EAyCpG;EAvCE,MAAM,MAAc,SAA4D;AAC9E,QAAI,CAAC,KAAK,OAAO;AAEf,cAAQ,MAAM,2DAA2D;AACzE;IACF;AAEA,UAAM,YAAY,IAAI,yBAAyB,IAAI;AACnD,QAAI,SAAS;AACX,gBAAU,QAAQ,QAAQ,SAAS;AACnC,gBAAU,OAAO,QAAQ,QAAQ;AACjC,gBAAU,SAAS,QAAQ,UAAU;IACvC;AAGA,QAAI,OAAO,WAAW,aAAa;AACjC,gBAAU,UAAU,MAAK;AACvB,eAAO,cAAc,IAAI,YAAY,kBAAkB,CAAC;MAC1D;AACA,gBAAU,QAAQ,MAAK;AAErB,gBAAQ,IAAI,kBAAkB;AAC9B,eAAO,cAAc,IAAI,YAAY,gBAAgB,CAAC;MACxD;IACF;AAEA,cAAU,UAAU,CAAC,UAAS;AAE5B,cAAQ,MAAM,kCAAmC,MAAc,KAAK;IACtE;AAEA,SAAK,MAAM,MAAM,SAAS;EAC5B;EAEA,eAAY;AACV,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAM;IACnB;EACF;;;;ACvCI,IAAO,kBAAP,MAAsB;EAA5B,cAAA;AACU,SAAA,kBAAkB;EAgB5B;EAdE,mBAAmB,SAAe;AAChC,SAAK,kBAAkB;EACzB;EAEA,eAAe,YAAmB;AAEhC,QAAI;AAAY,cAAQ,IAAI,4BAA4B,UAAU,GAAG;AACrE,YAAQ,IAAI,KAAK,eAAe;AAChC,QAAI,aAAY,EAAG,MAAM,KAAK,eAAe;EAC/C;EAEA,qBAAkB;AAChB,WAAO,KAAK;EACd;;;;;ACGF,IAAM,qBAAqB,MAA6B;;AACtD,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,QAAM,IAAI;AAIV,UAAO,MAAA,KAAA,EAAE,uBAAiB,QAAA,OAAA,SAAA,KAAI,EAAE,6BAAuB,QAAA,OAAA,SAAA,KAAI;AAC7D;AAaM,IAAO,iBAAP,MAAqB;;EAkBjB,IAAI,SAAgB;AAC1B,QAAI,KAAK,gBAAgB,SAAS;AAEhC,cAAQ,IAAI,oBAAoB,OAAO;IACzC;EACF;EACQ,KAAK,SAAgB;AAC3B,QAAI,KAAK,gBAAgB,SAAS;AAEhC,cAAQ,KAAK,oBAAoB,OAAO;IAC1C;EACF;EACQ,MAAM,SAAgB;AAC5B,QAAI,KAAK,gBAAgB,SAAS;AAEhC,cAAQ,MAAM,oBAAoB,OAAO;IAC3C;EACF;EAEA,YACE,WAAW,SACX,UAA4F,CAAA,GAAE;;AAtCxF,SAAA,cAAkC;AAClC,SAAA,cAAc;AACd,SAAA,eAAe;AACf,SAAA,uBAAuB;AACvB,SAAA,iBAAiB;AACjB,SAAA,YAAY;AACZ,SAAA,YAAY;AACZ,SAAA,YAAY;AACZ,SAAA,iBAAwC;AACxC,SAAA,cAAc;AAGd,SAAA,eAAe;AACf,SAAA,eAAqD;AACrD,SAAA,YAAY;AACZ,SAAA,uBAAuB;AA+QvB,SAAA,aAAa,MAAK;;AACxB,WAAK,cAAc;AACnB,UAAI;AAAE,SAAAC,MAAA,KAAK,iBAAW,QAAAA,QAAA,SAAA,SAAAA,IAAE,KAAI;MAAI,SAAqBC,KAAb;MAAc;AAEtD,UAAI,KAAK,aAAa;AACpB,aAAK,WAAW,UAAU;MAC5B;IACF;AAEQ,SAAA,WAAW,MAAK;AACtB,WAAK,cAAc;AACnB,UAAI,KAAK,eAAe,KAAK,gBAAgB;AAC3C,aAAK,YAAW;MAClB,OAAO;AACL,aAAK,WAAW,KAAK,cAAc,cAAc,MAAM;MACzD;IACF;AAtQE,UAAM,OAAO,mBAAkB;AAC/B,QAAI,MAAM;AACR,WAAK,cAAc,IAAI,KAAI;AAC3B,WAAK,YAAY,OAAO;AACxB,WAAK,YAAY,kBAAiB,KAAA,QAAQ,oBAAc,QAAA,OAAA,SAAA,KAAI;AAC5D,WAAK,YAAY,cAAa,KAAA,QAAQ,gBAAU,QAAA,OAAA,SAAA,KAAI;AAEpD,WAAK,YAAY,WAAW,CAAC,UAA4B,KAAK,aAAa,OAAO,OAAO;AACzF,WAAK,YAAY,QAAQ,MAAM,KAAK,UAAS;AAC7C,WAAK,YAAY,UAAU,MAAK;AAC9B,aAAK,IAAI,qBAAqB;AAC9B,aAAK,eAAe;AACpB,aAAK,uBAAuB;AAE5B,YAAI,KAAK,cAAc;AACrB,uBAAa,KAAK,YAAY;AAC9B,eAAK,eAAe;QACtB;AACA,aAAK,YAAY;AACjB,YAAI,KAAK,eAAe,CAAC,KAAK,aAAa;AACzC,eAAK,WAAW,WAAW;QAC7B;MACF;AAUA,YAAM,OAAO,KAAK;AAClB,WAAK,eAAe,MAAM,KAAK,IAAI,cAAc;AACjD,WAAK,eAAe,MAAM,KAAK,IAAI,cAAc;AACjD,WAAK,gBAAgB,MAAM,KAAK,IAAI,eAAe;AACnD,WAAK,cAAc,MAAM,KAAK,IAAI,aAAa;AAC/C,WAAK,aAAa,MAAM,KAAK,IAAI,YAAY;AAC7C,WAAK,aAAa,MAAM,KAAK,IAAI,YAAY;AAC7C,WAAK,YAAY,UAAU,CAAC,UAAiC,KAAK,YAAY,KAAK;IACrF,OAAO;AAEL,WAAK,cAAc;AAEnB,WAAK,WAAW,aAAa;IAC/B;AAGA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,iBAAiB,oBAAoB,KAAK,UAAU;AAC3D,aAAO,iBAAiB,kBAAkB,KAAK,QAAQ;AAGvD,WAAK,oBAAoB,MAAK;;AAC5B,YAAI,OAAO,aAAa,eAAe,SAAS,QAAQ;AACtD,cAAI;AAAE,aAAAD,MAAA,KAAK,iBAAW,QAAAA,QAAA,SAAA,SAAAA,IAAE,KAAI;UAAI,SAAqBC,KAAb;UAAc;AACtD,eAAK,WAAW,KAAK,cAAc,aAAa,MAAM;QACxD,WAAW,KAAK,eAAe,CAAC,KAAK,aAAa;AAChD,eAAK,YAAW;QAClB;MACF;AACA,UAAI,OAAO,aAAa,aAAa;AACnC,iBAAS,iBAAiB,oBAAoB,KAAK,iBAAiB;MACtE;IACF,OAAO;AAEL,WAAK,oBAAoB;IAC3B;EACF;;EAGA,cAAW;AACT,WAAO,mBAAkB,MAAO;EAClC;;EAGA,eAAe,UAAoC;AACjD,SAAK,iBAAiB;EACxB;;EAGA,eAAe,UAAwB;AACrC,QAAI,CAAC,KAAK,YAAW,KAAM,CAAC,KAAK,aAAa;AAC5C,WAAK,KAAK,qEAAqE;AAC/E,WAAK,WAAW,aAAa;AAC7B;IACF;AACA,QAAI,KAAK,aAAa;AACpB,WAAK,KAAK,oCAAoC;AAC9C,WAAK,iBAAiB;AACtB;IACF;AAEA,SAAK,iBAAiB;AACtB,SAAK,uBAAuB;AAC5B,SAAK,iBAAiB;AACtB,SAAK,cAAc;AACnB,SAAK,WAAW,WAAW;AAE3B,SAAK,aAAY,EAAG,QAAQ,MAAK;AAC/B,WAAK,YAAW;IAClB,CAAC;EACH;;EAGA,gBAAa;;AACX,SAAK,uBAAuB;AAC5B,SAAK,iBAAiB;AACtB,SAAK,cAAc;AACnB,SAAK,WAAW,KAAK,cAAc,aAAa,MAAM;AACtD,QAAI;AAAE,OAAA,KAAA,KAAK,iBAAW,QAAA,OAAA,SAAA,SAAA,GAAE,KAAI;IAAI,SAAqB,IAAb;IAAc;EACxD;;EAGA,UAAO;AACL,SAAK,YAAY;AACjB,SAAK,cAAa;AAClB,SAAK,iBAAiB;AACtB,WAAO,oBAAoB,oBAAoB,KAAK,UAAU;AAC9D,WAAO,oBAAoB,kBAAkB,KAAK,QAAQ;AAC1D,QAAI,KAAK,mBAAmB;AAC1B,eAAS,oBAAoB,oBAAoB,KAAK,iBAAiB;AACvE,WAAK,oBAAoB;IAC3B;EACF;;EAGQ,aAAa,OAAyB,SAAmE;;AAC/G,QAAI,CAAC,KAAK;AAAgB;AAC1B,UAAM,aAAY,KAAA,QAAQ,yBAAmB,QAAA,OAAA,SAAA,KAAI;AAEjD,aAAS,IAAI,MAAM,aAAa,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAC7D,YAAM,MAAM,MAAM,QAAQ,CAAC;AAC3B,YAAM,MAAM,OAAO,IAAI,CAAC;AACxB,YAAM,eAAqB,MAAA,KAAA,QAAG,QAAH,QAAG,SAAA,SAAH,IAAK,gBAAU,QAAA,OAAA,SAAA,SAAA,GAAE,UAAI,QAAA,OAAA,SAAA,SAAA,GAAA,KAAA,EAAA,MAAQ;AACxD,YAAM,cAAqB,KAAA,QAAG,QAAH,QAAG,SAAA,SAAH,IAAK,gBAAU,QAAA,OAAA,SAAA,KAAI;AAC9C,UAAI,CAAC;AAAY;AACjB,UAAI,CAAC,IAAI,WAAW,QAAQ,mBAAmB;AAAO;AACtD,UAAI,IAAI,WAAW,aAAa;AAAW;AAC3C,UAAI;AACF,aAAK,uBAAuB;AAC5B,aAAK,eAAe,YAAY,CAAC,CAAC,IAAI,OAAO;MAC/C,SAAE,IAAM;AAEN,aAAK,MAAM,uCAAuC;MACpD;IACF;EACF;;EAGQ,YAAS;AACf,SAAK,IAAI,mBAAmB;AAC5B,SAAK,eAAe;AACpB,QAAI,KAAK,aAAa,KAAK,wBAAwB,CAAC,KAAK,kBAAkB,KAAK,aAAa;AAC3F,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,cAAc;AACnB,aAAK,WAAW,MAAM;MACxB;AACA;IACF;AAEA,SAAK,cAAc;AAEnB,SAAK,gBAAe;EACtB;;EAGQ,YAAY,OAA4B;AAC9C,UAAM,MAAM,UAAK,QAAL,UAAK,SAAA,SAAL,MAAO;AACnB,SAAK,KAAK,mBAAmB,QAAG,QAAH,QAAG,SAAH,MAAO,SAAS,EAAE;AAG/C,UAAM,QAAQ,CAAC,eAAe,uBAAuB,eAAe,wBAAwB;AAC5F,QAAI,OAAO,MAAM,SAAS,GAAG,GAAG;AAC9B,WAAK,uBAAuB;AAC5B,WAAK,iBAAiB;AACtB,WAAK,cAAc;AACnB,WAAK,WAAW,SAAS,EAAE,OAAO,IAAG,CAAE;AACvC;IACF;AAEA,SAAK,gBAAe;EACtB;EAEQ,cAAW;AACjB,QAAI,CAAC,KAAK;AAAa;AACvB,QAAI,KAAK,cAAc;AACrB,WAAK,IAAI,oDAAoD;AAC7D;IACF;AACA,UAAM,MAAM,KAAK,IAAG;AACpB,QAAI,MAAM,KAAK,YAAY,KAAK;AAC9B,iBAAW,MAAM,KAAK,YAAW,GAAI,GAAG;AACxC;IACF;AACA,SAAK,YAAY;AACjB,QAAI;AACF,WAAK,IAAI,6BAA6B;AACtC,WAAK,YAAY,MAAK;AACtB,WAAK,YAAY;AACjB,UAAI,KAAK,eAAe,CAAC,KAAK,aAAa;AACzC,aAAK,WAAW,WAAW;MAC7B;IACF,SAAE,IAAM;AACN,WAAK,MAAM,+CAA+C;AAC1D,WAAK,gBAAe;IACtB;EACF;EAEQ,kBAAe;AACrB,QAAI,KAAK,aAAa,KAAK,wBAAwB,CAAC,KAAK,kBAAkB,KAAK;AAAa;AAC7F,QAAI,KAAK,cAAc;AACrB,WAAK,IAAI,gDAAgD;AACzD;IACF;AACA,UAAM,QAAQ,KAAK,IAAI,KAAK,WAAW,GAAI;AAC3C,SAAK,IAAI,sBAAsB,KAAK,IAAI;AACxC,QAAI,KAAK,cAAc;AAErB,WAAK,IAAI,4CAA4C;AACrD;IACF;AACA,SAAK,eAAe,WAAW,MAAK;AAClC,WAAK,eAAe;AACpB,UAAI,KAAK,aAAa,KAAK,wBAAwB,CAAC,KAAK,kBAAkB,KAAK;AAAa;AAC7F,WAAK,YAAW;IAClB,GAAG,KAAK;AACR,SAAK,YAAY,KAAK,IAAI,KAAK,YAAY,GAAG,GAAI;EACpD;EAEc,eAAY;;AACxB,UAAI,KAAK;AAAW;AACpB,UAAI;AACF,YAAI,OAAO,cAAc,eAAe,EAAE,kBAAkB;AAAY;AACxE,cAAM,KAAK,UAAU;AACrB,YAAI,EAAC,OAAE,QAAF,OAAE,SAAA,SAAF,GAAI;AAAc;AACvB,aAAK,IAAI,8BAA8B;AACvC,cAAM,SAAS,MAAM,GAAG,aAAa,EAAE,OAAO,KAAI,CAAE;AACpD,mBAAW,SAAS,OAAO,UAAS;AAAI,gBAAM,KAAI;AAClD,aAAK,YAAY;AACjB,aAAK,IAAI,yBAAyB;MACpC,SAAE,IAAM;AACN,aAAK,KAAK,iCAAiC;MAC7C;IACF,CAAC;;EAoBO,WAAW,QAA8B,SAA4B;AAC3E,QAAI,CAAC,KAAK;AAAgB;AAC1B,QAAI;AACF,WAAK,eAAe,QAAQ,OAAO;IACrC,SAAE,IAAM;AAEN,WAAK,MAAM,uCAAuC;IACpD;EACF;;;;AClWI,IAAO,iBAAP,MAAqB;EAA3B,cAAA;AACU,SAAA,UAAU;EAwCpB;;;;;EAhCE,uBAAuB,oBAA8B;AAEnD,SAAK,QAAO;AAGZ,SAAK,mBAAmB,MAAK;AAC3B,yBAAkB;IACpB;AACA,aAAS,iBAAiB,YAAY,KAAK,gBAAgB;AAG3D,SAAK,mBAAmB,MAAK;AAC3B,YAAM,eAAc,oBAAI,KAAI,GAAG,QAAO;AACtC,YAAM,cAAc,cAAc,KAAK;AACvC,UAAI,cAAc,OAAO,cAAc,GAAG;AACxC,2BAAkB;MACpB;AACA,WAAK,UAAU;IACjB;AACA,aAAS,iBAAiB,YAAY,KAAK,gBAAgB;EAC7D;EAEA,UAAO;AACL,QAAI,KAAK,kBAAkB;AACzB,eAAS,oBAAoB,YAAY,KAAK,gBAAgB;IAChE;AACA,QAAI,KAAK,kBAAkB;AACzB,eAAS,oBAAoB,YAAY,KAAK,gBAAgB;IAChE;AACA,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;EAC1B;;AAII,SAAU,eAAY;AAE1B,QAAM,gBAAyC,SAAS,cAAc,mBAAmB;AACzF,MAAI,eAAe;AACjB,YAAQ,IAAI,yBAAyB;AACrC;EACF;AAGA,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkClB,WAAS,KAAK,YAAY,KAAK;AAC/B,UAAQ,IAAI,0BAA0B;AACxC;AAEM,SAAU,uBAAoB;AAElC,MAAI,SAAS,cAAc,qBAAqB,GAAG;AACjD;EACF;AAGA,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,KAAK;AAGjB,eAAY;AAGZ,cAAY,UAAU,IAAI,oBAAoB;AAG9C,WAAS,KAAK,YAAY,WAAW;AACrC,UAAQ,IAAI,qCAAqC;AACnD;AAEM,SAAU,0BAAuB;AACrC,QAAM,cAAc,SAAS,cAAc,qBAAqB;AAChE,MAAI,aAAa;AACf,gBAAY,OAAM;AAClB,YAAQ,IAAI,yCAAyC;EACvD;AACF;;;ACxHM,SAAU,YAAS;AACvB,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;;;ACEM,IAAO,eAAP,MAAmB;EAAzB,cAAA;AACU,SAAA,QAAwB;AAExB,SAAA,cAAsD,CAAA;EA4BhE;EA1BE,WAAQ;AACN,WAAO,KAAK;EACd;EAEA,SAAS,OAAqB;AAC5B,SAAK,QAAQ;AACb,SAAK,kBAAiB;AAEtB,YAAQ,IAAI,kBAAkB,KAAK;AAGnC,QAAI,UAAU,aAAa;AACzB,2BAAoB;IACtB,OAAO;AACL,8BAAuB;IACzB;EACF;;EAGA,UAAU,UAAyC;AACjD,SAAK,YAAY,KAAK,QAAQ;EAChC;EAEQ,oBAAiB;AACvB,SAAK,YAAY,QAAQ,CAAC,aAAa,SAAS,KAAK,KAAK,CAAC;EAC7D;;;;;AClBI,IAAO,iBAAP,MAAqB;EAYzB,YAAY,QAAqB;AAXzB,SAAA,YAAgC;AAChC,SAAA,aAAiC;AACjC,SAAA,oBAAwC;AACxC,SAAA,QAAiC;AACjC,SAAA,SAAS;AAGT,SAAA,YAAgC;AAEhC,SAAA,SAAS,UAAS;AAGxB,SAAK,SAAS;AACd,QAAI,KAAK;AAAQ,WAAK,KAAI;EAC5B;EAEQ,OAAI;;AACV,QAAI,KAAK;AAAW;AAEpB,SAAK,oBAAmB;AAIxB,UAAM,WAAW,SAAS,eAAe,0BAA0B;AACnE,QAAI,YAAY,oBAAoB,aAAa;AAC/C,WAAK,YAAY;AACjB,WAAK,aAAa,SAAS,cAAc,cAAc;AACvD,WAAK,oBAAoB,SAAS,cAAc,kBAAkB;AAClE,WAAK,QAAQ,SAAS,cAAc,oBAAoB;AAExD,YAAI,KAAA,KAAK,OAAO,oBAAc,QAAA,OAAA,SAAA,SAAA,GAAE,aAAY,SAAS,CAAC,SAAS,cAAc,sBAAsB,GAAG;AACpG,aAAK,qBAAoB;MAC3B;AAEA,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,iBAAgB;MACvB;AACA;IACF;AAEA,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,KAAK;AACpB,SAAK,UAAU,YAAY;AAE3B,aAAS,KAAK,YAAY,KAAK,SAAS;AAExC,UAAI,KAAA,KAAK,OAAO,oBAAc,QAAA,OAAA,SAAA,SAAA,GAAE,aAAY,OAAO;AACjD,WAAK,qBAAoB;IAC3B;AAEA,SAAK,iBAAgB;EACvB;EAEQ,uBAAoB;;AAC1B,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,cAAY,KAAA,KAAK,OAAO,oBAAc,QAAA,OAAA,SAAA,SAAA,GAAE,eAAc;AAC1D,UAAM,WAAS,MAAA,KAAA,KAAK,OAAO,oBAAc,QAAA,OAAA,SAAA,SAAA,GAAE,cAAQ,QAAA,OAAA,SAAA,SAAA,GAAE,WAAU;AAC/D,UAAM,UAAQ,MAAA,KAAA,KAAK,OAAO,oBAAc,QAAA,OAAA,SAAA,SAAA,GAAE,cAAQ,QAAA,OAAA,SAAA,SAAA,GAAE,UAAS;AAE7D,QAAI,YAAY;AAChB,QAAI,MAAM,SAAS;AACnB,QAAI,MAAM,QAAQ;AAElB,QAAI,UAAU,MAAM,KAAK,OAAM;AAC/B,QAAI,eAAe,MAAO,IAAI,MAAM,YAAY;AAChD,QAAI,eAAe,MAAO,IAAI,MAAM,YAAY;AAEhD,KAAA,KAAA,KAAK,eAAS,QAAA,OAAA,SAAA,SAAA,GAAE,YAAY,GAAG;EACjC;EAEQ,mBAAgB;;AACtB,QAAI,KAAK;AAAY;AAErB,SAAK,aAAa,SAAS,cAAc,KAAK;AAC9C,SAAK,WAAW,YAAY;AAG5B,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,cAAc;AAEpB,UAAM,cAAc,SAAS,cAAc,QAAQ;AACnD,gBAAY,OAAO;AACnB,gBAAY,YAAY;AACxB,gBAAY,aAAa,cAAc,OAAO;AAC9C,gBAAY,YAAY;AACxB,gBAAY,iBAAiB,SAAS,MAAM,KAAK,OAAM,CAAE;AAEzD,WAAO,YAAY,KAAK;AACxB,WAAO,YAAY,WAAW;AAG9B,SAAK,oBAAoB,SAAS,cAAc,KAAK;AACrD,SAAK,kBAAkB,YAAY;AAGnC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AAEtB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,cACT,KAAK,OAAO,oBAAoB;AAClC,SAAK,MAAM,YAAY;AAEvB,SAAK,MAAM,iBAAiB,WAAW,CAAC,MAAK;;AAC3C,UAAI,EAAE,QAAQ,aAAWC,MAAA,KAAK,WAAK,QAAAA,QAAA,SAAA,SAAAA,IAAE,MAAM,KAAI,IAAI;AACjD,cAAM,OAAO,KAAK,MAAM,MAAM,KAAI;AAClC,aAAK,MAAM,QAAQ;AACnB,YAAI,KAAK;AAAU,eAAK,SAAS,IAAI;MACvC;IACF,CAAC;AAED,cAAU,YAAY,KAAK,KAAK;AAEhC,SAAK,WAAW,YAAY,MAAM;AAClC,SAAK,WAAW,YAAY,KAAK,iBAAiB;AAClD,SAAK,WAAW,YAAY,SAAS;AACrC,KAAA,KAAA,KAAK,eAAS,QAAA,OAAA,SAAA,SAAA,GAAE,YAAY,KAAK,UAAU;EAC7C;EAEA,kBAAkB,UAA6D,SAAmB;AAChG,QAAI,CAAC,KAAK;AAAQ;AAClB,SAAK,WAAW;AAChB,SAAK,UAAU;EACjB;EAEA,OAAO,UAA8D,SAAoB;AACvF,QAAI,CAAC,KAAK;AAAQ;AAClB,QAAI;AAAU,WAAK,WAAW;AAC9B,QAAI;AAAS,WAAK,UAAU;AAE5B,SAAK,SAAS,CAAC,KAAK;AAEpB,QAAI,KAAK,YAAY;AACnB,UAAI,KAAK,QAAQ;AACf,aAAK,WAAW,MAAM,UAAU;AAChC,8BAAsB,MAAK;AACzB,cAAI,KAAK,YAAY;AACnB,iBAAK,WAAW,MAAM,UAAU;AAChC,iBAAK,WAAW,MAAM,YAAY;UACpC;QACF,CAAC;AACD,mBAAW,MAAK;AAAA,cAAA;AAAC,kBAAA,KAAA,KAAK,WAAK,QAAA,OAAA,SAAA,SAAA,GAAE,MAAK;QAAE,GAAE,GAAG;MAC3C,OAAO;AACL,aAAK,WAAW,MAAM,UAAU;AAChC,aAAK,WAAW,MAAM,YAAY;AAClC,mBAAW,MAAK;AACd,cAAI,KAAK,cAAc,CAAC,KAAK,QAAQ;AACnC,iBAAK,WAAW,MAAM,UAAU;UAClC;QACF,GAAG,GAAG;AACN,YAAI,KAAK;AAAS,eAAK,QAAO;MAChC;IACF;EACF;EAEA,WAAW,MAAc,MAAuB;AAC9C,QAAI,CAAC,KAAK;AAAmB;AAE7B,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,cAAc;AAClB,QAAI,YAAY,SAAS,SAAS,uBAAuB;AAEzD,SAAK,kBAAkB,YAAY,GAAG;AACtC,SAAK,eAAc;EACrB;EAEA,WAAW,SAAgE;AACzE,QAAI,CAAC,KAAK;AAAmB;AAE7B,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AAEtB,YAAQ,QAAQ,CAAC,QAAO;AACtB,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,cAAc,IAAI;AACtB,UAAI,YAAY;AAChB,UAAI,aAAa,QAAQ,QAAQ;AACjC,UAAI,aAAa,cAAc,IAAI,KAAK;AAExC,YAAM,eAAe,MAAK;AAGxB,YAAI,IAAI,WAAW;AACjB,cAAI,KAAK;AAAU,iBAAK,SAAS,EAAE,WAAW,IAAI,UAAS,CAAE;AAC7D;QACF;AAGA,cAAM,QAAS,OAAO,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAI,IAAM,IAAI,QAAQ,IAAI;AAC3F,YAAI,KAAK;AAAU,eAAK,SAAS,KAAK;MACxC;AAEA,UAAI,UAAU;AACd,UAAI,YAAY,CAAC,MAAK;AACpB,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAc;AAChB,uBAAY;QACd;MACF;AAEA,gBAAU,YAAY,GAAG;IAC3B,CAAC;AAED,SAAK,kBAAkB,YAAY,SAAS;AAC5C,SAAK,eAAc;EACrB;EAEA,QACE,SACA,QACA,UAAkD;AAElD,QAAI,CAAC,KAAK;AAAmB;AAE7B,SAAK,WAAW,SAAS,QAAQ;AAEjC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AAEjB,UAAM,WAKD,CAAA;AAEL,UAAM,cAAc,CAAC,MAAc,aAAsB;AACvD,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,YAAY,QAAQ,WAAW,4CAA4C;AACjF,aAAO;IACT;AAEA,UAAM,cAAc,MAAK;AACvB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,MAAM,UAAU;AACtB,aAAO;IACT;AAEA,KAAC,WAAM,QAAN,WAAM,SAAN,SAAU,CAAA,GAAI,QAAQ,CAAC,UAAS;AAC/B,YAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAQ,YAAY;AAEpB,YAAM,YAAY,MAAM,eAAe,MAAM;AAC7C,cAAQ,YAAY,YAAY,WAAW,MAAM,QAAQ,CAAC;AAE1D,UAAI;AAEJ,UAAI,MAAM,SAAS,UAAU;AAC3B,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,YAAY;AAEnB,cAAM,iBAAiB,SAAS,cAAc,QAAQ;AACtD,uBAAe,QAAQ;AACvB,uBAAe,cAAc;AAC7B,eAAO,YAAY,cAAc;AAEjC,cAAM,WAAW,CAAC,YAA2B;AAC3C,WAAC,YAAO,QAAP,YAAO,SAAP,UAAW,CAAA,GAAI,QAAQ,CAAC,QAAO;;AAC9B,kBAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,cAAE,QAAQ,QAAO,MAAA,KAAA,IAAI,WAAK,QAAA,OAAA,SAAA,KAAI,IAAI,WAAK,QAAA,OAAA,SAAA,KAAI,EAAE;AAC7C,cAAE,cAAc,QAAO,MAAA,KAAA,IAAI,WAAK,QAAA,OAAA,SAAA,KAAI,IAAI,WAAK,QAAA,OAAA,SAAA,KAAI,EAAE;AACnD,mBAAO,YAAY,CAAC;UACtB,CAAC;QACH;AAEA,YAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ;AACxD,mBAAS,MAAM,OAAO;QACxB,WAAW,OAAO,MAAM,eAAe,YAAY;AACjD,gBAAM,aAAa,MAAM;AACzB,gBAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,qBAAW,QAAQ;AACnB,qBAAW,cAAc;AACzB,iBAAO,YAAY,UAAU;AAC7B,kBAAQ,QAAO,EACZ,KAAK,MAAM,WAAU,CAAE,EACvB,KAAK,CAAC,SAAwB;AAC7B,mBAAO,OAAO,QAAQ,SAAS;AAAG,qBAAO,OAAO,CAAC;AACjD,qBAAS,IAAI;UACf,CAAC,EACA,MAAM,MAAK;AACV,mBAAO,OAAO,QAAQ,SAAS;AAAG,qBAAO,OAAO,CAAC;AACjD,kBAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,mBAAO,QAAQ;AACf,mBAAO,cAAc;AACrB,mBAAO,YAAY,MAAM;UAC3B,CAAC;QACL;AAEA,YAAI,MAAM,gBAAgB,MAAM;AAC9B,iBAAO,QAAQ,OAAO,MAAM,YAAY;QAC1C;AACA,kBAAU;MACZ,WAAW,MAAM,SAAS,QAAQ;AAChC,cAAM,SAAS;AACf,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,cAAM,YAAY;AAClB,cAAM,OAAO;AACb,YAAI,OAAO,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjD,gBAAM,SAAS,OAAO,OAAO,KAAK,GAAG;QACvC;AACA,YAAI,OAAO;AAAU,gBAAM,WAAW;AACtC,YAAI,OAAO,SAAS;AAClB,cAAI,OAAO,YAAY;AAAM,kBAAM,aAAa,WAAW,EAAE;;AACxD,kBAAM,aAAa,WAAW,OAAO,OAAO,OAAO,CAAC;QAC3D;AAGA,cAAM,iBAAiB,UAAU,MAAWC,WAAA,MAAA,QAAA,QAAA,aAAA;;AAC1C,gBAAM,QAAQ,MAAM,KAAM,MAA2B,SAAS,CAAA,CAAE;AAChE,gBAAM,QAAQ;AACd,gBAAM,MAAM,UAAU;AACtB,gBAAM,cAAc;AAEpB,cAAI,MAAM,WAAW;AAAG;AAGxB,gBAAM,YAAW,KAAA,OAAO,cAAQ,QAAA,OAAA,SAAA,KAAK,OAAO,WAAW,KAAK;AAC5D,cAAI,MAAM,SAAS,UAAU;AAC3B,kBAAM,cAAc,yBAAyB,QAAQ;AACrD,kBAAM,MAAM,UAAU;AACtB;UACF;AAEA,gBAAM,WAAU,KAAA,OAAO,kBAAY,QAAA,OAAA,SAAA,KAAI;AACvC,gBAAM,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,CAAC;AAClD,cAAI,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,GAAG;AACrC,kBAAM,cAAc,gDAAgD,KAAK,MAAM,UAAU,IAAI,CAAC;AAC9F,kBAAM,MAAM,UAAU;AACtB;UACF;AACA,gBAAM,YAAW,KAAA,OAAO,mBAAa,QAAA,OAAA,SAAA,KAAI;AACzC,cAAI,QAAQ,UAAU;AACpB,kBAAM,cAAc,8CAA8C,KAAK,MAAM,WAAW,IAAI,CAAC;AAC7F,kBAAM,MAAM,UAAU;AACtB;UACF;AAGA,cAAI,OAAO,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjD,kBAAM,UAAU,OAAO;AACvB,kBAAM,KAAK,MAAM,MAAM,CAAC,SAAQ;AAC9B,kBAAI,CAAC,KAAK;AAAM,uBAAO;AACvB,qBAAO,QAAQ,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,KAAK,KAAK,YAAW,EAAG,SAAS,EAAE,YAAW,CAAE,IAAI,KAAK,SAAS,KAAK,KAAK,KAAK,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC;YACjK,CAAC;AACD,gBAAI,CAAC,IAAI;AACP,oBAAM,cAAc;AACpB,oBAAM,MAAM,UAAU;AACtB;YACF;UACF;QACF,CAAC,CAAA;AAED,kBAAU;MACZ,OAAO;AACL,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,cAAM,YAAY;AAElB,YAAI,MAAM,SAAS,UAAU;AAC3B,gBAAM,cAAc,MAAM,eAAe;QAC3C;AAEA,YAAI,MAAM,SAAS,UAAU;AAC3B,gBAAM,OAAO;AACb,cAAI,OAAO,MAAM,QAAQ;AAAU,kBAAM,MAAM,OAAO,MAAM,GAAG;AAC/D,cAAI,OAAO,MAAM,QAAQ;AAAU,kBAAM,MAAM,OAAO,MAAM,GAAG;AAC/D,cAAI,OAAO,MAAM,SAAS;AAAU,kBAAM,OAAO,OAAO,MAAM,IAAI;AAClE,cAAI,MAAM,gBAAgB;AAAM,kBAAM,QAAQ,OAAO,MAAM,YAAY;QACzE,WAAW,MAAM,SAAS,QAAQ;AAChC,gBAAM,OAAO;AACb,cAAI,OAAO,MAAM,QAAQ;AAAU,kBAAM,MAAM,MAAM;AACrD,cAAI,OAAO,MAAM,QAAQ;AAAU,kBAAM,MAAM,MAAM;AACrD,cAAI,MAAM,gBAAgB;AAAM,kBAAM,QAAQ,OAAO,MAAM,YAAY;QACzE,OAAO;AACL,gBAAM,OAAO;AACb,cAAI,MAAM,gBAAgB;AAAM,kBAAM,QAAQ,OAAO,MAAM,YAAY;QACzE;AACA,kBAAU;MACZ;AAGA,YAAM,UAAU,YAAW;AAE3B,cAAQ,YAAY,OAAO;AAC3B,cAAQ,YAAY,OAAO;AAE3B,eAAS,KAAK;QACZ,MAAM,MAAM;QACZ,MAAM,MAAM;QACZ,IAAI;QACJ,UAAU,MAAM;OACjB;AAED,WAAK,YAAY,OAAO;IAC1B,CAAC;AAED,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,cAAU,OAAO;AACjB,cAAU,cAAc;AACxB,cAAU,YAAY;AACtB,cAAU,MAAM,aAAa;AAE7B,YAAQ,YAAY,SAAS;AAC7B,SAAK,YAAY,OAAO;AAExB,SAAK,WAAW,CAAO,MAAKA,WAAA,MAAA,QAAA,QAAA,aAAA;;AAC1B,QAAE,eAAc;AAEhB,YAAM,OAAgC,CAAA;AACtC,UAAI,WAAW;AAGf,WAAK,iBAAiB,oBAAoB,EAAE,QAAQ,QAAK;AACtD,WAAmB,MAAM,UAAU;AACpC,WAAG,cAAc;MACnB,CAAC;AACD,WAAK,iBAAiB,oBAAoB,EAAE,QAAQ,QAAK;AACvD,WAAG,UAAU,OAAO,qBAAqB;MAC3C,CAAC;AAED,iBAAW,KAAK,UAAU;AAExB,YAAI,EAAE,SAAS,QAAQ;AACrB,gBAAM,cAAc,EAAE,GAAG;AACzB,gBAAM,cAAc,gBAAW,QAAX,gBAAW,SAAA,SAAX,YAAa,cAAc,oBAAoB;AACnE,gBAAM,QAAQ,EAAE;AAChB,gBAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,CAAA,CAAE;AAE1C,cAAI,EAAE,YAAY,MAAM,WAAW,GAAG;AACpC,uBAAW;AACX,kBAAM,UAAU,IAAI,qBAAqB;AACzC,gBAAI,aAAa;AACf,0BAAY,cAAc;AAC1B,0BAAY,MAAM,UAAU;YAC9B;AACA;UACF;AAEA,cAAI,MAAM,WAAW;AAAG;AAGxB,gBAAM,YAAY,WAAM,QAAN,WAAM,SAAN,SAAU,CAAA,GAAI,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AAC7D,gBAAM,YAA8B,KAAA,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,cAAQ,QAAA,OAAA,SAAA,KAAI;AAG1D,eAAI,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,cAAY,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,YAAW;AAE7C,gBAAI;AACF,oBAAM,OAAO,MAAM,KAAK,mBAAmB,MAAM,CAAC,CAAC;AACnD,kBAAI,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU;AACvD,2BAAW;AACX,oBAAI,aAAa;AACf,8BAAY,cAAc,8BAAyB,SAAS,QAAQ;AACpE,8BAAY,MAAM,UAAU;gBAC9B;AACA;cACF;AACA,kBAAI,SAAS,aAAa,KAAK,SAAS,SAAS,WAAW;AAC1D,2BAAW;AACX,oBAAI,aAAa;AACf,8BAAY,cAAc,+BAA0B,SAAS,SAAS;AACtE,8BAAY,MAAM,UAAU;gBAC9B;AACA;cACF;YACF,SAAE,IAAM;YAER;UACF;AAEA,cAAI,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,gBAAgB;AAC5B,gBAAI;AACF,oBAAM,MAAM,MAAM,KAAK,iBAAiB,MAAM,CAAC,CAAC;AAChD,kBAAI,OAAO,MAAM,SAAS,gBAAgB;AACxC,2BAAW;AACX,oBAAI,aAAa;AACf,8BAAY,cAAc,iCAA4B,SAAS,cAAc;AAC7E,8BAAY,MAAM,UAAU;gBAC9B;AACA;cACF;YACF,SAAE,IAAM;YAER;UACF;AAGA,cAAI,aAAa,QAAQ;AACvB,iBAAK,EAAE,IAAI,KAAI,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,YAAW,QAAQ,MAAM,CAAC;UACrD,WAAW,aAAa,UAAU;AAChC,gBAAI;AACF,oBAAM,UAAU,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC,CAAC;AACnF,mBAAK,EAAE,IAAI,KAAI,aAAQ,QAAR,aAAQ,SAAA,SAAR,SAAU,YAAW,UAAU,QAAQ,CAAC;YACzD,SAAE,IAAM;AACN,yBAAW;AACX,kBAAI,aAAa;AACf,4BAAY,cAAc;AAC1B,4BAAY,MAAM,UAAU;cAC9B;AACA;YACF;UACF;AAEA;QACF;AAEA,cAAM,QAAO,KAAA,EAAE,GAAG,WAAK,QAAA,OAAA,SAAA,KAAI,IAAI,SAAQ,EAAG,KAAI;AAC9C,cAAM,eAAe,EAAE,GAAG;AAC1B,cAAM,eAAe,iBAAY,QAAZ,iBAAY,SAAA,SAAZ,aAAc,cAAc,oBAAoB;AAErE,YAAI,EAAE,aAAa,OAAO,QAAQ,QAAQ,KAAK;AAC7C,qBAAW;AACX,YAAE,GAAG,UAAU,IAAI,qBAAqB;AACxC,cAAI,cAAc;AAChB,yBAAa,cAAc;AAC3B,yBAAa,MAAM,UAAU;UAC/B;AACA;QACF;AAEA,YAAI,QAAQ;AAAI;AAEhB,YAAI,EAAE,SAAS,UAAU;AACvB,gBAAM,IAAI,OAAO,GAAG;AACpB,cAAI,CAAC,OAAO,MAAM,CAAC;AAAG,iBAAK,EAAE,IAAI,IAAI;QACvC,OAAO;AACL,eAAK,EAAE,IAAI,IAAI;QACjB;MACF;AAEA,UAAI,UAAU;AAEZ,aAAK,UAAU,IAAI,cAAc;AACjC,mBAAW,MAAM,KAAK,UAAU,OAAO,cAAc,GAAG,GAAG;AAC3D;MACF;AAEA,gBAAU,WAAW;AACrB,gBAAU,MAAM,UAAU;AAC1B,eAAS,QAAQ,CAAC,MAAK;AACrB,UAAE,GAAG,WAAW;MAClB,CAAC;AAED,eAAS,IAAI;IACf,CAAC;AAED,SAAK,kBAAkB,YAAY,IAAI;AACvC,SAAK,eAAc;EACrB;EAEA,cAAW;AACT,QAAI,CAAC,KAAK;AAAmB;AAC7B,QAAI,KAAK;AAAW;AAEpB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,YAAY;AAG3B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,YAAY;AAChB,UAAI,MAAM,YAAY,yCAAyC,IAAI,GAAG;AACtE,WAAK,UAAU,YAAY,GAAG;IAChC;AAEA,SAAK,kBAAkB,YAAY,KAAK,SAAS;AACjD,SAAK,eAAc;EACrB;EAEA,cAAW;;AACT,KAAA,KAAA,KAAK,eAAS,QAAA,OAAA,SAAA,SAAA,GAAE,OAAM;AACtB,SAAK,YAAY;EACnB;EAEQ,iBAAc;AACpB,QAAI,KAAK,mBAAmB;AAC1B,WAAK,kBAAkB,YAAY,KAAK,kBAAkB;IAC5D;EACF;EAEA,UAAO;;AACL,KAAA,KAAA,KAAK,eAAS,QAAA,OAAA,SAAA,SAAA,GAAE,OAAM;AACtB,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,oBAAoB;AACzB,SAAK,QAAQ;AACb,SAAK,SAAS;EAChB;EAEQ,kBAAkB,MAAU;AAClC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACrC,YAAM,KAAK,IAAI,WAAU;AACzB,SAAG,UAAU,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAC1D,SAAG,SAAS,MAAM,QAAQ,OAAO,GAAG,MAAM,CAAC;AAC3C,SAAG,cAAc,IAAI;IACvB,CAAC;EACH;EAEQ,mBAAmB,MAAU;AACnC,WAAO,IAAI,QAAQ,CAAC,YAAW;AAC7B,UAAI;AACF,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,MAAM,IAAI,MAAK;AACrB,YAAI,SAAS,MAAK;AAChB,gBAAM,OAAO,EAAE,OAAO,IAAI,gBAAgB,IAAI,OAAO,QAAQ,IAAI,iBAAiB,IAAI,OAAM;AAC5F,cAAI,gBAAgB,GAAG;AACvB,kBAAQ,IAAI;QACd;AACA,YAAI,UAAU,MAAK;AACjB,cAAI,gBAAgB,GAAG;AACvB,kBAAQ,EAAE,OAAO,GAAG,QAAQ,EAAC,CAAE;QACjC;AACA,YAAI,MAAM;MACZ,SAAE,IAAM;AACN,gBAAQ,EAAE,OAAO,GAAG,QAAQ,EAAC,CAAE;MACjC;IACF,CAAC;EACH;EAEQ,iBAAiB,MAAU;AACjC,WAAO,IAAI,QAAQ,CAAC,YAAW;AAC7B,UAAI;AACF,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,KAAK,KAAK,KAAK,WAAW,OAAO,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,cAAc,OAAO;AAC3G,YAAI,UAAU;AACd,cAAM,UAAU,WAAW,MAAK;AAC9B,cAAI,CAAC,SAAS;AACZ,sBAAU;AACV,gBAAI,gBAAgB,GAAG;AACvB,oBAAQ,CAAC;UACX;QACF,GAAG,GAAI;AAEP,WAAG,UAAU;AACb,WAAG,mBAAmB,MAAK;AACzB,cAAI;AAAS;AACb,oBAAU;AACV,uBAAa,OAAO;AACpB,gBAAM,UAAU;AAChB,gBAAM,IAAI,QAAQ,YAAY;AAC9B,cAAI,gBAAgB,GAAG;AACvB,kBAAQ,CAAC;QACX;AACA,WAAG,UAAU,MAAK;AAChB,cAAI;AAAS;AACb,oBAAU;AACV,uBAAa,OAAO;AACpB,cAAI,gBAAgB,GAAG;AACvB,kBAAQ,CAAC;QACX;AACC,WAAwB,MAAM;MACjC,SAAE,IAAM;AACN,gBAAQ,CAAC;MACX;IACF,CAAC;EACH;EAEQ,sBAAmB;AACzB,QAAI,SAAS,eAAe,uBAAuB;AAAG;AAEtD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkUpB,aAAS,KAAK,YAAY,KAAK;EACjC;;;;ICz+BW,gCAAA,yBAAuB;oHAAvB,0BAAuB,MAAA,CAAA,GAAA,QAAA,6BAAA,UAAA,CAAA;wGAAvB,0BAAuB,cAAA,MAAA,UAAA,uBAAA,UAAA,IAAA,UCTpC,kCACA,QAAA,CAAA,EAAA,GAAA,cAAA,CAAA,EAAA,MAAA,YAAA,MDIY,aAAY,CAAA,EAAA,CAAA;;qGAIX,yBAAuB,YAAA,CAAA;QANnC;qBACW,uBAAqB,SACtB,CAAC,YAAY,GAAC,UAAA,iCAAA,CAAA;;IEaZ,yBAAA,kBAAgB;EAaqB;EAZxC;EACA;EACA;EACA;EACA;EACA,qBAAqB;EACrB,iBAAiB;EACjB,cAAc;;EACd;EACA;EACA,sBAAsB;EAE9B,YAAgD,QAAuB;AAAvB,SAAA,SAAA;AAE9C,SAAK,iBAAiB,IAAI,eAAe;MACvC,mBAAmB,KAAK,OAAO,sBAAsB;MACrD,gBAAgB,KAAK,OAAO;IAC7B,CAAA;AACD,SAAK,kBAAkB,IAAI,gBAAe;AAG1C,QAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,WAAK,iBAAiB,IAAI,eAAc;AACxC,WAAK,eAAe,IAAI,aAAY;AACpC,WAAK,iBAAiB,IAAI,eAAc;AACxC,WAAK,iBAAiB,IAAI,eAAe;QACvC,gBAAgB,KAAK,OAAO;QAC5B,kBAAkB,KAAK,OAAO;MAC/B,CAAA;AAGD,WAAK,eAAe,kBAClB,OAAO,UAAS;AACd,YAAI,OAAO,UAAU,UAAU;AAC7B,eAAK,eAAe,WAAW,OAAO,MAAM;QAC9C,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,gBAAM,QAAQ,KAAK,iBAAiB,KAAgC;AACpE,cAAI,OAAO;AACT,iBAAK,eAAe,WAAW,OAAO,MAAM;UAC9C;QACF;AAEA,cAAM,KAAK,cAAc,KAAK;MAChC,GACA,MAAM,QAAQ,IAAI,mCAAmC,CAAC;AAIxD,WAAK,eAAe,IAAI,aAAY;AACpC,WAAK,eAAe,uBAAuB,MAAM,KAAK,OAAM,CAAE;IAChE,OAAO;AAEL,WAAK,eAAe;AACpB,WAAK,iBAAiB;AACtB,WAAK,eAAe;AACpB,WAAK,iBAAiB;AACtB,WAAK,iBAAiB;IACxB;AAGA,SAAK,OAAO,SAAS,QAAQ,CAAC,QAAQ,KAAK,eAAe,WAAW,GAAG,CAAC;AAGzE,QAAI,KAAK,OAAO,kBAAkB;AAChC,WAAK,gBAAgB,mBAAmB,KAAK,OAAO,gBAAgB;IACtE;EAMF;;EAGA,iBAAc;AAEZ,QAAI,OAAO,WAAW,eAAe,CAAC,KAAK,gBAAgB;AACzD,cAAQ,IAAI,kFAAkF;AAC9F;IACF;EAyCF;;EAGA,gBAAa;AACX,QAAI,OAAO,WAAW,eAAe,CAAC,KAAK,gBAAgB;AACzD,cAAQ,IAAI,kEAAkE;AAC9E,WAAK,cAAc;AACnB;IACF;AACA,SAAK,eAAe,cAAa;AACjC,SAAK,cAAc;EACrB;;EAGA,aAAU;AACR,YAAQ,IAAI,6CAA6C;AACzD,SAAK,cAAc;AACnB,QAAI;AACF,WAAK,eAAc;IACrB,QAAQ;IAER;EACF;;EAGQ,MAAM,kBAAkB,YAAkB;AAChD,UAAM,gBAAgB,KAAK,OAAO,mBAAmB,YAAW;AAGhE,QAAI,CAAC;AAAe;AAEpB,QAAI,eAAe,eAAe;AAChC,cAAQ,IAAI,uCAAuC;AACnD,WAAK,cAAc;AACnB,WAAK,aAAa,MAChB,KAAK,OAAO,gBAAgB,KAAK,mBAAmB;IAGxD,OAAO;AACL,cAAQ,IAAI,sDAAsD;IACpE;EACF;;EAGQ,MAAM,cACZ,OAAuC;AAEvC,SAAK,eAAe,YAAW;AAC/B,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,eAAe,eAAe,KAAK;IAC3D;AACE,WAAK,eAAe,YAAW;IACjC;AAEA,UAAM,eAAe,OAAO,UAAU,WAAW,QAAQ;AACzD,SAAK,gBAAgB,UAAU,YAAY;EAC7C;;;;EAKA,UAAO;AACL,SAAK,gBAAgB,cAAa;AAClC,SAAK,gBAAgB,QAAO;AAC5B,SAAK,gBAAgB,QAAO;EAC9B;;EAGQ,gBACN,UACA,cAAqB;AAErB,QAAI,SAAS,SAAS,WAAW,cAAc;AAC7C,WAAK,gBAAgB,eAAe,YAAY;AAChD,WAAK,eAAe,WAAW,KAAK,gBAAgB,mBAAkB,GAAI,QAAQ;AAClF;IACF;AAEA,QAAI,SAAS,SAAS,UAAU,SAAS,QAAQ;AAC/C,WAAK,eAAe,QAClB,SAAS,SACT,SAAS,QACT,OAAO,SAAiC;AACtC,aAAK,eAAe,YAAW;AAC/B,YAAI;AACJ,YAAI;AACF,wBAAc,MAAM,KAAK,eAAe,eAAe,IAAI;QAC7D;AACE,eAAK,eAAe,YAAW;QACjC;AACA,aAAK,gBAAgB,WAAW;MAClC,CAAC;AAEH;IACF;AAEA,SAAK,SAAS,SAAS,eAAe,SAAS,SAAS,cAAc,SAAS,SAAS;AACtF,UAAI,SAAS,SAAS;AACpB,aAAK,eAAe,WAAW,SAAS,SAAS,QAAQ;MAC3D;AACA,WAAK,eAAe,WAAW,SAAS,OAAO;AAC/C;IACF;AAEA,QAAI,SAAS,SAAS;AACpB,WAAK,eAAe,WAAW,SAAS,SAAS,QAAQ;IAC3D;EACF;;EAGA,WACE,cACA,QAEwD;AAExD,QAAI,OAAO,iBAAiB,UAAU;AACpC,cAAQ,IAAI,qCAAqC,YAAY,IAAI;IACnE,OAAO;AACL,cAAQ,IACN,0CAA0C,aAAa,OAAO,IAAI;IAEtE;AACA,SAAK,eAAe,WAAW,cAAc,MAAM;EACrD;;EAGA,cAAc,SAAe;AAC3B,YAAQ,IAAI,uCAAuC,OAAO,IAAI;AAC9D,SAAK,eAAe,cAAc,OAAO;EAC3C;;EAGA,cAAW;AACT,WAAO,KAAK,eAAe,YAAW;EACxC;;EAGA,OACE,UACA,SAAoB;AAEpB,YAAQ,IAAI,uCAAuC;AACnD,SAAK,eAAe,OAClB,OAAO,UAAS;AACd,UAAI,OAAO,UAAU,UAAU;AAC7B,aAAK,eAAe,WAAW,OAAO,MAAM;MAC9C,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,cAAM,QAAQ,KAAK,iBAAiB,KAAK;AACzC,YAAI,OAAO;AACT,eAAK,eAAe,WAAW,OAAO,MAAM;QAC9C;MACF;AAEA,UAAI;AAAU,iBAAS,KAAK;AAC5B,YAAM,KAAK,cAAc,KAAK;IAChC,GACA,MAAK;AACH,cAAQ,IAAI,mCAAmC;AAC/C,UAAI;AAAS,gBAAO;IACtB,CAAC;EAEL;EAEQ,iBAAiB,SAAgC;AACvD,UAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAI,OAAO,UAAU,YAAY,MAAM,KAAI,GAAI;AAC7C,aAAO,MAAM,KAAI;IACnB;AAEA,UAAM,YAAY,QAAQ,WAAW;AACrC,QAAI,OAAO,cAAc,YAAY,UAAU,KAAI,GAAI;AACrD,aAAO,UAAU,KAAI;IACvB;AAEA,WAAO;EACT;EA1SW,OAAA,YAAA,gCAAA,EAAA,YAAA,UAAA,SAAA,UAAA,UAAA,IAAA,MAAA,mBAAgB,MAAA,CAAA,EAAA,OAaP,mBAAkB,CAAA,GAAA,QAAA,6BAAA,WAAA,CAAA;EAb3B,OAAA,aAAA,mCAAA,EAAA,YAAA,UAAA,SAAA,UAAA,UAAA,IAAA,MAAA,mBAAgB,YAFf,OAAM,CAAA;;qGAEP,kBAAgB,YAAA,CAAA;QAH5B;EAAW,MAAA,CAAA;IACV,YAAY;EACb,CAAA;;QAcc;SAAO,kBAAkB;;IC1B3B,wBAAA,iBAAe;EAC1B,OAAO,QAAQ,QAAuB;AACpC,WAAO;MACL,UAAU;MACV,WAAW;QACT,EAAE,SAAS,oBAAoB,UAAU,OAAM;QAC/C;MACD;;EAEL;oHATW,kBAAe,MAAA,CAAA,GAAA,QAAA,6BAAA,SAAA,CAAA;qHAAf,iBAAe,CAAA;qHAAf,iBAAe,CAAA;;qGAAf,iBAAe,YAAA,CAAA;QAD3B;SAAS,CAAA,CAAE;;",
6
- "names": ["cmd", "_a", "__awaiter", "_a", "_b", "_a", "__awaiter"]
7
- }
1
+ {"version":3,"file":"foisit-angular-wrapper.mjs","sources":["../../../../libs/angular-wrapper/src/lib/angular-wrapper/angular-wrapper.component.ts","../../../../libs/angular-wrapper/src/lib/angular-wrapper/angular-wrapper.component.html","../../../../libs/angular-wrapper/src/core-internal/lib/ai/openai.service.ts","../../../../libs/angular-wrapper/src/core-internal/lib/command/command-handler.ts","../../../../libs/angular-wrapper/src/core-internal/lib/speech/text-to-speech.ts","../../../../libs/angular-wrapper/src/core-internal/lib/fallback/fallback-handler.ts","../../../../libs/angular-wrapper/src/core-internal/lib/interfaces/assistant-command.interface.ts","../../../../libs/angular-wrapper/src/core-internal/lib/speech/voice-processor.ts","../../../../libs/angular-wrapper/src/core-internal/lib/utils/dom-interactions.ts","../../../../libs/angular-wrapper/src/core-internal/lib/utils/is-browser.ts","../../../../libs/angular-wrapper/src/core-internal/lib/state-manager.ts","../../../../libs/angular-wrapper/src/core-internal/lib/ui/overlay-manager.ts","../../../../libs/angular-wrapper/src/lib/service/assistant.service.ts","../../../../libs/angular-wrapper/src/lib/assistant.module.ts","../../../../libs/angular-wrapper/src/foisit-angular-wrapper.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'lib-angular-wrapper',\n imports: [CommonModule],\n templateUrl: './angular-wrapper.component.html',\n styleUrl: './angular-wrapper.component.css',\n})\nexport class AngularWrapperComponent {}\n","<p>AngularWrapper works!</p>\n","import { AssistantCommand } from '../interfaces/assistant-command.interface';\n\nexport interface IntentResult {\n type: 'match' | 'ambiguous' | 'unknown';\n match?: string;\n confidence?: number;\n options?: { label: string; commandId: string }[];\n message?: string;\n params?: Record<string, any>;\n incomplete?: boolean;\n}\n\nexport class OpenAIService {\n private endpoint: string;\n\n constructor(endpoint?: string) {\n this.endpoint =\n endpoint || 'https://foisit-ninja.netlify.app/.netlify/functions/intent';\n }\n\n async determineIntent(\n userInput: string,\n availableCommands: AssistantCommand[],\n context?: { commandId: string; params: any } | null\n ): Promise<IntentResult> {\n try {\n // Prepare the payload\n const payload = {\n userInput,\n commands: availableCommands.map((cmd) => ({\n id: cmd.id,\n command: cmd.command,\n description: cmd.description,\n parameters: cmd.parameters, // Send param schemas to AI\n })),\n context,\n };\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Proxy API Error: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result as IntentResult;\n } catch (error) {\n console.error('OpenAIService Error:', error);\n return { type: 'unknown' };\n }\n }\n}\n","import { OpenAIService, IntentResult } from '../ai/openai.service';\nimport {\n AssistantCommand,\n AssistantCommandParams,\n AssistantParameter,\n SelectOption,\n} from '../interfaces/assistant-command.interface';\nimport { InteractiveResponse } from '../interfaces/interactive-response.interface';\n\ntype CommandParams = AssistantCommandParams;\ntype CommandContext = { commandId: string; params: CommandParams };\ntype PendingConfirmation = { commandId: string; params: CommandParams };\n\ntype StructuredCommandInput = {\n commandId: string;\n params?: CommandParams;\n};\n\ntype CommandHandlerOptions = {\n enableSmartIntent?: boolean;\n intentEndpoint?: string;\n};\n\nexport class CommandHandler {\n private commands = new Map<string, AssistantCommand>();\n private openAIService: OpenAIService | null = null;\n private context: CommandContext | null = null;\n private pendingConfirmation: PendingConfirmation | null = null;\n private enableSmartIntent = true;\n private selectOptionsCache = new Map<string, { options: SelectOption[]; ts: number }>();\n\n constructor(arg: boolean | CommandHandlerOptions = true) {\n if (typeof arg === 'boolean') {\n this.enableSmartIntent = arg;\n if (this.enableSmartIntent) {\n this.openAIService = new OpenAIService();\n }\n return;\n }\n\n this.enableSmartIntent = arg.enableSmartIntent ?? true;\n if (this.enableSmartIntent) {\n this.openAIService = new OpenAIService(arg.intentEndpoint);\n }\n }\n\n /** Add a new command (string or object) */\n addCommand(\n commandOrObj: string | AssistantCommand,\n action?: AssistantCommand['action']\n ): void {\n let cmd: AssistantCommand;\n\n if (typeof commandOrObj === 'string') {\n if (!action) {\n throw new Error('Action required when adding command by string.');\n }\n cmd = {\n id: commandOrObj.toLowerCase().replace(/\\s+/g, '_'),\n command: commandOrObj.toLowerCase(),\n action,\n };\n } else {\n cmd = { ...commandOrObj };\n if (!cmd.id) {\n cmd.id = cmd.command.toLowerCase().replace(/\\s+/g, '_');\n }\n }\n\n this.commands.set(cmd.command.toLowerCase(), cmd);\n // Also index by ID for AI matching\n if (cmd.id && cmd.id !== cmd.command) {\n // We store it by ID in a separate map or just rely on iteration for AI\n // For simplicity, let's keep the main map keyed by trigger phrase,\n // but we'll lookup by ID in AI flow.\n }\n }\n\n /** Remove an existing command */\n removeCommand(command: string): void {\n this.commands.delete(command.toLowerCase());\n }\n\n /** Execute a command by matching input */\n async executeCommand(\n input: string | Record<string, unknown>\n ): Promise<InteractiveResponse> {\n // 0) Handle object input\n if (typeof input === 'object' && input !== null) {\n // Direct command trigger from UI: { commandId, params? }\n if (this.isStructured(input)) {\n const cmdId = String(input.commandId);\n const rawParams: CommandParams = input.params ?? {};\n const cmd = this.getCommandById(cmdId);\n if (!cmd) return { message: 'That command is not available.', type: 'error' };\n\n const params = this.sanitizeParamsForCommand(cmd, rawParams);\n\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n const missing = requiredParams.filter((p) => params[p.name] == null || params[p.name] === '');\n if (missing.length > 0) {\n // Ask for missing params via form and store context\n this.context = { commandId: this.getCommandIdentifier(cmd), params };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: missing,\n };\n }\n\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params };\n return this.buildConfirmResponse(cmd);\n }\n\n return this.safeRunAction(cmd, params);\n }\n\n // Otherwise treat as continuation of a previously requested form\n if (!this.context) {\n return { message: 'Session expired or invalid context.', type: 'error' };\n }\n\n const cmd = this.getCommandById(this.context.commandId);\n if (!cmd) {\n this.context = null;\n return { message: 'Session expired or invalid context.', type: 'error' };\n }\n\n if (Array.isArray(input)) {\n return { message: 'Invalid form payload.', type: 'error' };\n }\n\n const mergedParams: CommandParams = {\n ...this.context.params,\n ...(input as CommandParams),\n };\n\n // If this was a critical command, ask for confirmation before executing.\n if (cmd.critical) {\n this.context = null;\n this.pendingConfirmation = {\n commandId: this.getCommandIdentifier(cmd),\n params: mergedParams,\n };\n return this.buildConfirmResponse(cmd);\n }\n\n const result = await this.safeRunAction(cmd, mergedParams);\n this.context = null;\n return this.normalizeResponse(result);\n }\n\n const trimmedInput = input.trim().toLowerCase();\n\n // 1) Confirmation flow (Yes/No)\n if (this.pendingConfirmation) {\n const normalized = trimmedInput;\n if (['yes', 'y', 'confirm', 'ok', 'okay'].includes(normalized)) {\n const { commandId, params } = this.pendingConfirmation;\n this.pendingConfirmation = null;\n const cmd = this.getCommandById(commandId);\n if (!cmd) {\n return { message: 'That action is no longer available.', type: 'error' };\n }\n return this.safeRunAction(cmd, params);\n }\n\n if (['no', 'n', 'cancel', 'stop'].includes(normalized)) {\n this.pendingConfirmation = null;\n return { message: 'Cancelled.', type: 'success' };\n }\n return {\n message: 'Please confirm: Yes or No.',\n type: 'confirm',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n };\n }\n\n // 2) Exact match\n const exactCommand = this.commands.get(trimmedInput);\n if (exactCommand) {\n const cmd = exactCommand;\n\n // If the command needs params, collect them (no AI needed)\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n if (requiredParams.length > 0) {\n this.context = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: requiredParams,\n };\n }\n\n // Critical commands require confirmation\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return this.buildConfirmResponse(cmd);\n }\n\n // Always pass an object for params so actions can safely read optional fields.\n return this.safeRunAction(cmd, {});\n }\n\n // 3) Deterministic (non-AI) fuzzy match using keywords/substring\n const deterministic = await this.tryDeterministicMatch(trimmedInput);\n if (deterministic) return deterministic;\n\n // 4) Smart intent fallback (AI)\n if (this.enableSmartIntent && this.openAIService) {\n const availableCommands = await this.getCommandsForAI();\n\n const aiResult = await this.openAIService.determineIntent(\n trimmedInput,\n availableCommands,\n this.context\n );\n\n return this.handleAIResult(aiResult);\n }\n\n // No deterministic match available and AI is disabled (or no AI configured).\n // Return an error so callers (wrappers) can trigger fallback handling.\n if (!this.enableSmartIntent) {\n return { message: \"I'm not sure what you mean.\", type: 'error' };\n }\n\n // As a last resort, list available commands to let the user pick.\n return this.listAllCommands();\n }\n\n private async handleAIResult(result: IntentResult): Promise<InteractiveResponse> {\n if (result.type === 'match' && result.match) {\n const cmd = this.getCommandById(result.match);\n if (!cmd) {\n return { message: \"I'm not sure what you mean.\", type: 'error' };\n }\n\n const rawParams = (result.params ?? {}) as CommandParams;\n const sanitizedParams = this.sanitizeParamsForCommand(cmd, rawParams);\n const params = cmd.allowAiParamExtraction === false ? {} : sanitizedParams;\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n const missingRequired = requiredParams.filter((p) => params[p.name] == null || params[p.name] === '');\n\n if (result.incomplete || missingRequired.length > 0) {\n // Store partial params for continuation\n this.context = { commandId: this.getCommandIdentifier(cmd), params };\n const mustUseForm = cmd.collectRequiredViaForm !== false;\n const askSingle = !mustUseForm && this.shouldAskSingleQuestion(missingRequired);\n\n if (askSingle) {\n const names = missingRequired.map((p) => p.name).join(' and ');\n return {\n message: result.message || `Please provide ${names}.`,\n type: 'question',\n };\n }\n\n return {\n message:\n result.message || `Please fill in the missing details for \"${cmd.command}\".`,\n type: 'form',\n fields: missingRequired,\n };\n }\n\n // Critical commands require confirmation\n if (cmd.critical) {\n this.pendingConfirmation = {\n commandId: this.getCommandIdentifier(cmd),\n params,\n };\n return this.buildConfirmResponse(cmd);\n }\n\n const actionResult = await cmd.action(params);\n return this.normalizeResponse(actionResult);\n }\n\n if (result.type === 'ambiguous' && result.options && result.options.length) {\n // Prefer clickable phrases that map to exact matches. Use commandId as value to\n // make UI actions deterministic when the user clicks an option.\n return {\n message: result.message || 'Did you mean one of these?',\n type: 'ambiguous',\n options: result.options.map((o) => ({\n label: o.label,\n value: o.commandId ?? o.label,\n commandId: o.commandId,\n })),\n };\n }\n\n // Unknown / fallback: show all available commands\n return this.listAllCommands();\n }\n\n private sanitizeParamsForCommand(cmd: AssistantCommand, params: CommandParams): CommandParams {\n const sanitized: CommandParams = { ...(params ?? {}) };\n\n for (const p of cmd.parameters ?? []) {\n const value = sanitized[p.name];\n\n if (p.type === 'string') {\n if (typeof value !== 'string') {\n delete sanitized[p.name];\n continue;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n delete sanitized[p.name];\n continue;\n }\n sanitized[p.name] = trimmed;\n }\n\n if (p.type === 'number') {\n const numeric = typeof value === 'number' ? value : Number((value as string)?.toString().trim());\n if (Number.isNaN(numeric)) {\n delete sanitized[p.name];\n continue;\n }\n if (typeof p.min === 'number' && numeric < p.min) {\n delete sanitized[p.name];\n continue;\n }\n if (typeof p.max === 'number' && numeric > p.max) {\n delete sanitized[p.name];\n continue;\n }\n sanitized[p.name] = numeric;\n }\n\n if (p.type === 'date') {\n const v = sanitized[p.name];\n if (typeof v === 'string') {\n const s = v.trim();\n if (!this.isIsoDateString(s)) {\n delete sanitized[p.name];\n } else {\n sanitized[p.name] = s;\n }\n } else {\n delete sanitized[p.name];\n }\n }\n\n if (p.type === 'select') {\n const v = typeof value === 'string' ? value : (value as any)?.toString();\n if (!v) {\n delete sanitized[p.name];\n continue;\n }\n if (Array.isArray(p.options) && p.options.length > 0) {\n const allowed = p.options.some((opt) => String(opt.value) === String(v));\n if (!allowed) {\n delete sanitized[p.name];\n continue;\n }\n }\n sanitized[p.name] = v;\n }\n\n // Defensive handling for file parameters: AI may return textual hints like \"csv file\".\n // If we expect a File/Blob or a base64 data URL (when delivery='base64'), accept only\n // those forms. Otherwise remove the param so the handler will ask the user via a form.\n if (p.type === 'file') {\n const val = sanitized[p.name];\n const isFileLike =\n val && typeof val === 'object' && typeof (val as any).name === 'string' && typeof (val as any).size === 'number';\n const isDataUrl = typeof val === 'string' && /^data:[^;]+;base64,/.test(val);\n const delivery = (p as any).delivery ?? 'file';\n\n if (delivery === 'base64') {\n // Accept either a data URL string or a File-like object\n if (!isDataUrl && !isFileLike) {\n delete sanitized[p.name];\n }\n } else {\n // delivery === 'file' -> expect a File/Blob object\n if (!isFileLike) {\n delete sanitized[p.name];\n }\n }\n }\n }\n\n return sanitized;\n }\n\n private isIsoDateString(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const dt = new Date(`${value}T00:00:00Z`);\n return !Number.isNaN(dt.getTime());\n }\n\n private shouldAskSingleQuestion(missing: AssistantParameter[]): boolean {\n if (missing.length !== 1) return false;\n const t = missing[0].type;\n return t === 'string' || t === 'number' || t === 'date';\n }\n\n private buildConfirmResponse(cmd: AssistantCommand): InteractiveResponse {\n return {\n message: `Are you sure you want to run \"${cmd.command}\"?`,\n type: 'confirm',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n };\n }\n\n private async tryDeterministicMatch(\n input: string\n ): Promise<InteractiveResponse | null> {\n // Substring or keyword-based match before AI\n const candidates: { cmd: AssistantCommand; score: number }[] = [];\n\n for (const cmd of this.commands.values()) {\n let score = 0;\n const commandPhrase = cmd.command.toLowerCase();\n if (input.includes(commandPhrase)) score += 5;\n\n const keywords = cmd.keywords ?? [];\n for (const kw of keywords) {\n const k = kw.toLowerCase().trim();\n if (!k) continue;\n if (input === k) score += 4;\n else if (input.includes(k)) score += 3;\n }\n\n if (score > 0) candidates.push({ cmd, score });\n }\n\n if (candidates.length === 0) return null;\n candidates.sort((a, b) => b.score - a.score);\n\n const topScore = candidates[0].score;\n const top = candidates.filter((c) => c.score === topScore).slice(0, 3);\n\n // If multiple equally-good matches, ask the user to choose.\n if (top.length > 1) {\n return {\n message: 'I think you mean one of these. Which one should I run?',\n type: 'ambiguous',\n options: top.map((c) => ({\n label: c.cmd.command,\n value: c.cmd.command,\n commandId: c.cmd.id,\n })),\n };\n }\n\n const cmd = top[0].cmd;\n\n // If params are required, ask with a form\n const requiredParams = (cmd.parameters ?? []).filter((p) => p.required);\n if (requiredParams.length > 0) {\n this.context = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return {\n message: `Please provide the required details for \"${cmd.command}\".`,\n type: 'form',\n fields: requiredParams,\n };\n }\n\n if (cmd.critical) {\n this.pendingConfirmation = { commandId: this.getCommandIdentifier(cmd), params: {} };\n return this.buildConfirmResponse(cmd);\n }\n\n return this.safeRunAction(cmd, {});\n }\n\n private async safeRunAction(cmd: AssistantCommand, params?: CommandParams): Promise<InteractiveResponse> {\n try {\n const result = await cmd.action(params ?? {});\n return this.normalizeResponse(result);\n } catch {\n return { message: 'Something went wrong while running that command.', type: 'error' };\n }\n }\n\n private async getCommandsForAI(): Promise<AssistantCommand[]> {\n const commands = Array.from(this.commands.values()).map((cmd) => ({\n ...cmd,\n parameters: cmd.parameters\n ? cmd.parameters.map((param) => ({ ...param }))\n : undefined,\n }));\n\n // Resolve async select options (cached) to give the model enough context.\n await Promise.all(\n commands.map(async (cmd) => {\n if (!cmd.parameters) return;\n await Promise.all(\n cmd.parameters.map(async (p) => {\n if (p.type !== 'select' || !p.getOptions || (p.options && p.options.length)) return;\n const cacheKey = `${cmd.id ?? cmd.command}:${p.name}`;\n const cached = this.selectOptionsCache.get(cacheKey);\n const now = Date.now();\n if (cached && now - cached.ts < 60_000) {\n p.options = cached.options;\n return;\n }\n try {\n const opts = await p.getOptions();\n this.selectOptionsCache.set(cacheKey, { options: opts, ts: now });\n p.options = opts;\n } catch {\n // If options fail to load, keep as-is.\n }\n })\n );\n })\n );\n\n return commands;\n }\n\n private getCommandById(id: string): AssistantCommand | undefined {\n for (const cmd of this.commands.values()) {\n if (cmd.id === id) return cmd;\n }\n return undefined;\n }\n\n private listAllCommands(): InteractiveResponse {\n const options = Array.from(this.commands.values()).map((cmd) => ({\n label: cmd.command,\n value: cmd.id ?? cmd.command,\n commandId: cmd.id ?? cmd.command,\n }));\n\n return {\n message: 'Here are the available commands:',\n type: 'ambiguous',\n options,\n };\n }\n\n private normalizeResponse(result: string | InteractiveResponse | void): InteractiveResponse {\n if (typeof result === 'string') {\n return { message: result, type: 'success' };\n }\n if (result && typeof result === 'object') {\n return result;\n }\n return { message: 'Done', type: 'success' };\n }\n\n private isStructured(input: Record<string, unknown>): input is StructuredCommandInput {\n return typeof input['commandId'] === 'string';\n }\n\n private getCommandIdentifier(cmd: AssistantCommand): string {\n if (!cmd.id) {\n cmd.id = cmd.command.toLowerCase().replace(/\\s+/g, '_');\n }\n return cmd.id;\n }\n\n /** List all registered commands */\n getCommands(): string[] {\n return Array.from(this.commands.keys());\n }\n}\n","export class TextToSpeech {\n private synth: SpeechSynthesis | null = (typeof window !== 'undefined' ? window.speechSynthesis : null);\n\n speak(text: string, options?: { pitch?: number; rate?: number; volume?: number }): void {\n if (!this.synth) {\n // eslint-disable-next-line no-console\n console.error('SpeechSynthesis API is not supported in this environment.');\n return;\n }\n\n const utterance = new SpeechSynthesisUtterance(text);\n if (options) {\n utterance.pitch = options.pitch || 1;\n utterance.rate = options.rate || 1;\n utterance.volume = options.volume || 1;\n }\n\n // Notify listeners (e.g., VoiceProcessor) to pause recognition while speaking\n if (typeof window !== 'undefined') {\n utterance.onstart = () => {\n window.dispatchEvent(new CustomEvent('foisit:tts-start'));\n };\n utterance.onend = () => {\n // eslint-disable-next-line no-console\n console.log('Speech finished.');\n window.dispatchEvent(new CustomEvent('foisit:tts-end'));\n };\n }\n\n utterance.onerror = (event) => {\n // eslint-disable-next-line no-console\n console.error('Error during speech synthesis:', (event as any).error);\n };\n\n this.synth.speak(utterance);\n }\n\n stopSpeaking(): void {\n if (this.synth) {\n this.synth.cancel();\n }\n }\n}\n","import { TextToSpeech } from '../speech/text-to-speech';\n\nexport class FallbackHandler {\n private fallbackMessage = 'Sorry, I didn’t understand that.';\n\n setFallbackMessage(message: string): void {\n this.fallbackMessage = message;\n }\n\n handleFallback(transcript?: string): void {\n // eslint-disable-next-line no-console\n if (transcript) console.log(`Fallback triggered for: \"${transcript}\"`);\n console.log(this.fallbackMessage);\n new TextToSpeech().speak(this.fallbackMessage);\n }\n\n getFallbackMessage(): string {\n return this.fallbackMessage;\n }\n}\n","/* eslint-disable no-unused-vars */\n\nimport { InteractiveResponse } from './interactive-response.interface';\n\nexport type SelectOption = { label: string; value: string };\nexport type AssistantCommandParams = Record<string, unknown>;\n\nexport interface StringParameter {\n name: string;\n description?: string;\n required?: boolean;\n type: 'string';\n placeholder?: string;\n defaultValue?: string;\n}\n\nexport interface NumberParameter {\n name: string;\n description?: string;\n required?: boolean;\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n defaultValue?: number;\n}\n\nexport interface DateParameter {\n name: string;\n description?: string;\n required?: boolean;\n type: 'date';\n min?: string;\n max?: string;\n defaultValue?: string;\n}\n\nexport interface SelectParameter {\n name: string;\n description?: string;\n required?: boolean;\n type: 'select';\n options?: SelectOption[];\n getOptions?: () => Promise<SelectOption[]>;\n defaultValue?: string;\n}\n\nexport interface FileParameter {\n name: string;\n description?: string;\n required?: boolean;\n type: 'file';\n /** Allowed mime types or extensions (e.g. ['image/jpeg','image/png'] or ['.jpg','.png']) */\n accept?: string[];\n /** Allow selecting multiple files */\n multiple?: boolean;\n /** Maximum number of files allowed */\n maxFiles?: number;\n /** Max size per file in bytes */\n maxSizeBytes?: number;\n /** Max total size for all files in bytes */\n maxTotalBytes?: number;\n /** For media: max duration in seconds */\n maxDurationSec?: number;\n /** For images: maximum width/height */\n maxWidth?: number;\n maxHeight?: number;\n /** How the file should be delivered back to the action: 'file' | 'base64' */\n delivery?: 'file' | 'base64';\n /** Capture hint for mobile devices ('camera' | 'microphone') */\n capture?: 'camera' | 'microphone' | boolean;\n}\n\nexport type AssistantParameter =\n | StringParameter\n | NumberParameter\n | DateParameter\n | SelectParameter\n | FileParameter;\n\nexport interface AssistantCommand {\n id?: string;\n command: string;\n description?: string;\n /** Alternative deterministic triggers (non-AI) */\n keywords?: string[];\n /** Requires explicit user confirmation before running */\n critical?: boolean;\n /** Force required params to be collected via form (default: true). If false, a single simple missing param may be asked as a question. */\n collectRequiredViaForm?: boolean;\n /** Allow AI-extracted params to auto-fill. If false, AI params are ignored and the user is asked for required fields. */\n allowAiParamExtraction?: boolean;\n parameters?: AssistantParameter[];\n action: (\n params?: AssistantCommandParams\n ) => Promise<string | InteractiveResponse | void> | void;\n}\n","/* eslint-disable no-unused-vars */\n// Minimal typings for a cross-browser SpeechRecognition shape\ntype RecognitionErrorEvent = { error?: string };\ntype RecognitionResultAlternative = { transcript?: string; confidence?: number };\ntype RecognitionResult = RecognitionResultAlternative[] & { isFinal?: boolean };\ntype RecognitionEvent = { resultIndex: number; results: RecognitionResult[] };\ntype Recognition = {\n lang: string;\n interimResults: boolean;\n continuous: boolean;\n maxAlternatives?: number;\n start: () => void;\n stop: () => void;\n\n onresult: ((event: RecognitionEvent) => void) | null;\n onstart?: (() => void) | null;\n onend: (() => void) | null;\n onerror: ((event: RecognitionErrorEvent) => void) | null;\n};\ntype RecognitionCtor = new () => Recognition;\n\nconst getRecognitionCtor = (): RecognitionCtor | null => {\n if (typeof window === 'undefined') return null;\n const w = window as Window & {\n webkitSpeechRecognition?: RecognitionCtor;\n SpeechRecognition?: RecognitionCtor;\n };\n return w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null;\n};\n\ntype ResultCallback = (text: string, isFinal: boolean) => void;\n\nexport type VoiceProcessorStatus =\n | 'unsupported'\n | 'idle'\n | 'listening'\n | 'speaking'\n | 'error';\n\nexport type StatusCallback = (status: VoiceProcessorStatus, details?: { error?: string }) => void;\n\nexport class VoiceProcessor {\n private recognition: Recognition | null = null;\n private isListening = false;\n private engineActive = false; // true after onstart, false after onend\n private intentionallyStopped = false;\n private restartAllowed = true;\n private lastStart = 0;\n private backoffMs = 250;\n private destroyed = false;\n private resultCallback: ResultCallback | null = null;\n private ttsSpeaking = false;\n private visibilityHandler?: () => void;\n private statusCallback?: StatusCallback;\n private debugEnabled = true; // enable debug logs to aid diagnosis\n private restartTimer: ReturnType<typeof setTimeout> | null = null;\n private prewarmed = false;\n private hadResultThisSession = false;\n // Debug logger helpers\n private log(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.log('[VoiceProcessor]', message);\n }\n }\n private warn(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.warn('[VoiceProcessor]', message);\n }\n }\n private error(message?: string): void {\n if (this.debugEnabled && message) {\n // eslint-disable-next-line no-console\n console.error('[VoiceProcessor]', message);\n }\n }\n\n constructor(\n language = 'en-US',\n options: { interimResults?: boolean; continuous?: boolean; confidenceThreshold?: number } = {}\n ) {\n const Ctor = getRecognitionCtor();\n if (Ctor) {\n this.recognition = new Ctor();\n this.recognition.lang = language;\n this.recognition.interimResults = options.interimResults ?? true;\n this.recognition.continuous = options.continuous ?? true;\n\n this.recognition.onresult = (event: RecognitionEvent) => this.handleResult(event, options);\n this.recognition.onend = () => this.handleEnd();\n this.recognition.onstart = () => {\n this.log('recognition onstart');\n this.engineActive = true;\n this.hadResultThisSession = false;\n // Clear any pending restart attempts now that we are active\n if (this.restartTimer) {\n clearTimeout(this.restartTimer);\n this.restartTimer = null;\n }\n this.backoffMs = 250;\n if (this.isListening && !this.ttsSpeaking) {\n this.emitStatus('listening');\n }\n };\n // Optional debug hooks supported by Chrome\n type VendorRecognitionEvents = {\n onaudiostart?: () => void;\n onsoundstart?: () => void;\n onspeechstart?: () => void;\n onspeechend?: () => void;\n onsoundend?: () => void;\n onaudioend?: () => void;\n };\n const vrec = this.recognition as unknown as VendorRecognitionEvents;\n vrec.onaudiostart = () => this.log('onaudiostart');\n vrec.onsoundstart = () => this.log('onsoundstart');\n vrec.onspeechstart = () => this.log('onspeechstart');\n vrec.onspeechend = () => this.log('onspeechend');\n vrec.onsoundend = () => this.log('onsoundend');\n vrec.onaudioend = () => this.log('onaudioend');\n this.recognition.onerror = (event: RecognitionErrorEvent) => this.handleError(event);\n } else {\n // No native support; keep recognition null and let consumers feature-detect.\n this.recognition = null;\n // If unsupported, immediately report status so UI can show a clear fallback.\n this.emitStatus('unsupported');\n }\n\n // Pause listening while TTS is speaking via CustomEvents dispatched by TextToSpeech\n if (typeof window !== 'undefined') {\n window.addEventListener('foisit:tts-start', this.onTTSStart);\n window.addEventListener('foisit:tts-end', this.onTTSEnd);\n\n // Pause on tab hide, resume on show\n this.visibilityHandler = () => {\n if (typeof document !== 'undefined' && document.hidden) {\n try { this.recognition?.stop(); } catch { /* no-op */ }\n this.emitStatus(this.ttsSpeaking ? 'speaking' : 'idle');\n } else if (this.isListening && !this.ttsSpeaking) {\n this.safeRestart();\n }\n };\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.visibilityHandler);\n }\n } else {\n // No window/document on server — do not register browser-only handlers\n this.visibilityHandler = undefined;\n }\n }\n\n /** Check if SpeechRecognition is available */\n isSupported(): boolean {\n return getRecognitionCtor() !== null;\n }\n\n /** Allow consumers (wrappers) to observe status changes */\n onStatusChange(callback: StatusCallback | undefined): void {\n this.statusCallback = callback;\n }\n\n /** Start listening for speech input */\n startListening(callback: ResultCallback): void {\n if (!this.isSupported() || !this.recognition) {\n this.warn('VoiceProcessor: SpeechRecognition is not supported in this browser.');\n this.emitStatus('unsupported');\n return;\n }\n if (this.isListening) {\n this.warn('VoiceProcessor: Already listening.');\n this.resultCallback = callback; // update callback if needed\n return;\n }\n\n this.resultCallback = callback;\n this.intentionallyStopped = false;\n this.restartAllowed = true;\n this.isListening = true;\n this.emitStatus('listening');\n // Warm up mic to avoid immediate onend in some environments\n this.prewarmAudio().finally(() => {\n this.safeRestart();\n });\n }\n\n /** Stop listening for speech input */\n stopListening(): void {\n this.intentionallyStopped = true;\n this.restartAllowed = false;\n this.isListening = false;\n this.emitStatus(this.ttsSpeaking ? 'speaking' : 'idle');\n try { this.recognition?.stop(); } catch { /* no-op */ }\n }\n\n /** Clean up listeners */\n destroy(): void {\n this.destroyed = true;\n this.stopListening();\n this.resultCallback = null;\n window.removeEventListener('foisit:tts-start', this.onTTSStart);\n window.removeEventListener('foisit:tts-end', this.onTTSEnd);\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler);\n this.visibilityHandler = undefined;\n }\n }\n\n /** Handle recognized speech results */\n private handleResult(event: RecognitionEvent, options: { interimResults?: boolean; confidenceThreshold?: number }): void {\n if (!this.resultCallback) return;\n const threshold = options.confidenceThreshold ?? 0.6;\n // Emit each alternative result chunk; concatenate finals client-side if desired\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const res = event.results[i];\n const alt = res && res[0];\n const transcript: string = alt?.transcript?.trim?.() || '';\n const confidence: number = alt?.confidence ?? 0;\n if (!transcript) continue;\n if (!res.isFinal && options.interimResults === false) continue; // skip interim if disabled\n if (res.isFinal && confidence < threshold) continue; // ignore low-confidence finals\n try {\n this.hadResultThisSession = true;\n this.resultCallback(transcript, !!res.isFinal);\n } catch {\n // Swallow user callback exceptions to avoid killing recognition\n this.error('VoiceProcessor: result callback error');\n }\n }\n }\n\n /** Handle session end */\n private handleEnd(): void {\n this.log('recognition onend');\n this.engineActive = false;\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) {\n if (!this.ttsSpeaking) {\n this.isListening = false;\n this.emitStatus('idle');\n }\n return;\n }\n // We are still in \"listening\" mode logically; recognition ended spuriously.\n this.isListening = true;\n // Best-effort restart (continuous can still end spuriously)\n this.scheduleRestart();\n }\n\n /** Handle errors during speech recognition */\n private handleError(event: RecognitionErrorEvent): void {\n const err = event?.error;\n this.warn(`Error occurred: ${err ?? 'unknown'}`);\n\n // Fatal errors: don't spin\n const fatal = ['not-allowed', 'service-not-allowed', 'bad-grammar', 'language-not-supported'];\n if (err && fatal.includes(err)) {\n this.intentionallyStopped = true;\n this.restartAllowed = false;\n this.isListening = false;\n this.emitStatus('error', { error: err });\n return;\n }\n // For transient errors, try restart\n this.scheduleRestart();\n }\n\n private safeRestart(): void {\n if (!this.recognition) return;\n if (this.engineActive) {\n this.log('safeRestart: engine already active, skipping start');\n return;\n }\n const now = Date.now();\n if (now - this.lastStart < 300) {\n setTimeout(() => this.safeRestart(), 300);\n return;\n }\n this.lastStart = now;\n try {\n this.log('calling recognition.start()');\n this.recognition.start();\n this.backoffMs = 250; // reset backoff on successful start\n if (this.isListening && !this.ttsSpeaking) {\n this.emitStatus('listening');\n }\n } catch {\n this.error('recognition.start() threw; scheduling restart');\n this.scheduleRestart();\n }\n }\n\n private scheduleRestart(): void {\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) return;\n if (this.engineActive) {\n this.log('scheduleRestart: engine active, not scheduling');\n return;\n }\n const delay = Math.min(this.backoffMs, 2000);\n this.log(`scheduleRestart in ${delay}ms`);\n if (this.restartTimer) {\n // A restart is already scheduled; keep the earliest\n this.log('scheduleRestart: restart already scheduled');\n return;\n }\n this.restartTimer = setTimeout(() => {\n this.restartTimer = null;\n if (this.destroyed || this.intentionallyStopped || !this.restartAllowed || this.ttsSpeaking) return;\n this.safeRestart();\n }, delay);\n this.backoffMs = Math.min(this.backoffMs * 2, 2000);\n }\n\n private async prewarmAudio(): Promise<void> {\n if (this.prewarmed) return;\n try {\n if (typeof navigator === 'undefined' || !('mediaDevices' in navigator)) return;\n const md = navigator.mediaDevices;\n if (!md?.getUserMedia) return;\n this.log('prewarmAudio: requesting mic');\n const stream = await md.getUserMedia({ audio: true });\n for (const track of stream.getTracks()) track.stop();\n this.prewarmed = true;\n this.log('prewarmAudio: mic ready');\n } catch {\n this.warn('prewarmAudio: failed to get mic');\n }\n }\n\n private onTTSStart = () => {\n this.ttsSpeaking = true;\n try { this.recognition?.stop(); } catch { /* no-op */ }\n // If we were listening, switch to speaking state\n if (this.isListening) {\n this.emitStatus('speaking');\n }\n };\n\n private onTTSEnd = () => {\n this.ttsSpeaking = false;\n if (this.isListening && this.restartAllowed) {\n this.safeRestart();\n } else {\n this.emitStatus(this.isListening ? 'listening' : 'idle');\n }\n };\n\n private emitStatus(status: VoiceProcessorStatus, details?: { error?: string }): void {\n if (!this.statusCallback) return;\n try {\n this.statusCallback(status, details);\n } catch {\n // Never let consumer errors break recognition\n this.error('VoiceProcessor: status callback error');\n }\n }\n}\n","export class GestureHandler {\n private lastTap = 0 as number;\n private dblClickListener?: () => void;\n private touchEndListener?: () => void;\n\n /**\n * Sets up double-click and double-tap listeners\n * @param onDoubleClickOrTap Callback to execute when a double-click or double-tap is detected\n */\n setupDoubleTapListener(onDoubleClickOrTap: () => void): void {\n // Ensure we never stack multiple listeners for the same instance\n this.destroy();\n\n // Handle double-click (desktop)\n this.dblClickListener = () => {\n onDoubleClickOrTap();\n };\n document.addEventListener('dblclick', this.dblClickListener);\n\n // Handle double-tap (mobile)\n this.touchEndListener = () => {\n const currentTime = new Date().getTime();\n const tapInterval = currentTime - this.lastTap;\n if (tapInterval < 300 && tapInterval > 0) {\n onDoubleClickOrTap();\n }\n this.lastTap = currentTime;\n };\n document.addEventListener('touchend', this.touchEndListener);\n }\n\n destroy(): void {\n if (this.dblClickListener) {\n document.removeEventListener('dblclick', this.dblClickListener);\n }\n if (this.touchEndListener) {\n document.removeEventListener('touchend', this.touchEndListener);\n }\n this.dblClickListener = undefined;\n this.touchEndListener = undefined;\n }\n}\n\n\nexport function injectStyles(): void {\n // Check if the styles are already injected\n const existingStyle: HTMLStyleElement | null = document.querySelector('#assistant-styles');\n if (existingStyle) {\n console.log('Styles already injected');\n return; // Avoid duplicate injection\n }\n\n // Create and inject the style element\n const style = document.createElement('style');\n style.id = 'assistant-styles';\n style.innerHTML = `\n /* Rounded shape with gradient animation */\n .gradient-indicator {\n position: fixed;\n top: 20px;\n right: 20px;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: linear-gradient(135deg, #ff6ec4, #7873f5, #5e8cff, #6ed0f6);\n box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);\n animation: amoeba 5s infinite ease-in-out;\n z-index: 9999; /* Ensure it's above all other elements */\n }\n\n /* Amoeba effect for the borders */\n @keyframes amoeba {\n 0% {\n border-radius: 50%;\n }\n 25% {\n border-radius: 40% 60% 60% 40%;\n }\n 50% {\n border-radius: 60% 40% 40% 60%;\n }\n 75% {\n border-radius: 40% 60% 60% 40%;\n }\n 100% {\n border-radius: 50%;\n }\n }\n `;\n document.head.appendChild(style);\n console.log('Gradient styles injected');\n}\n\nexport function addGradientAnimation(): void {\n // Check if the gradient indicator already exists\n if (document.querySelector('#gradient-indicator')) {\n return; // Avoid duplicate indicators\n }\n\n // Create a new div element\n const gradientDiv = document.createElement('div');\n gradientDiv.id = 'gradient-indicator';\n\n // Inject styles dynamically\n injectStyles();\n\n // Add the gradient-indicator class to the div\n gradientDiv.classList.add('gradient-indicator');\n\n // Append the div to the body\n document.body.appendChild(gradientDiv);\n console.log('Gradient indicator added to the DOM');\n}\n\nexport function removeGradientAnimation(): void {\n const gradientDiv = document.querySelector('#gradient-indicator');\n if (gradientDiv) {\n gradientDiv.remove();\n console.log('Gradient indicator removed from the DOM');\n }\n}\n\n","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n","import { addGradientAnimation, removeGradientAnimation } from \"./utils\";\n\ntype AssistantState = 'idle' | 'listening' | 'processing';\n\nexport class StateManager {\n private state: AssistantState = 'idle';\n // eslint-disable-next-line no-unused-vars\n private subscribers: Array<(state: AssistantState) => void> = [];\n\n getState(): AssistantState {\n return this.state;\n }\n\n setState(state: AssistantState): void {\n this.state = state;\n this.notifySubscribers();\n\n console.log('State updated:', state);\n\n // Dynamically update body class based on state\n if (state === 'listening') {\n addGradientAnimation();\n } else {\n removeGradientAnimation();\n }\n }\n\n // eslint-disable-next-line no-unused-vars\n subscribe(callback: (state: AssistantState) => void): void {\n this.subscribers.push(callback);\n }\n\n private notifySubscribers(): void {\n this.subscribers.forEach((callback) => callback(this.state));\n }\n}\n","/* eslint-disable no-unused-vars */\n\nimport type { AssistantParameter, SelectOption } from '../interfaces/assistant-command.interface';\n\nexport interface OverlayConfig {\n floatingButton?: {\n visible?: boolean;\n tooltip?: string;\n customHtml?: string;\n position?: { bottom: string; right: string };\n };\n inputPlaceholder?: string;\n}\n\nimport { isBrowser } from '../utils/is-browser';\n\nexport class OverlayManager {\n private container: HTMLElement | null = null;\n private chatWindow: HTMLElement | null = null;\n private messagesContainer: HTMLElement | null = null;\n private input: HTMLInputElement | null = null;\n private isOpen = false;\n private onSubmit?: (input: string | Record<string, unknown>) => void;\n private onClose?: () => void;\n private loadingEl: HTMLElement | null = null;\n private config: OverlayConfig;\n private active = isBrowser();\n\n constructor(config: OverlayConfig) {\n this.config = config;\n if (this.active) this.init();\n }\n\n private init() {\n if (this.container) return;\n\n this.injectOverlayStyles();\n\n // Reuse an existing overlay container if one already exists on the page.\n // This prevents duplicate overlays when multiple assistant instances are created (e.g., React StrictMode).\n const existing = document.getElementById('foisit-overlay-container');\n if (existing && existing instanceof HTMLElement) {\n this.container = existing;\n this.chatWindow = existing.querySelector('.foisit-chat') as HTMLElement | null;\n this.messagesContainer = existing.querySelector('.foisit-messages') as HTMLElement | null;\n this.input = existing.querySelector('input.foisit-input') as HTMLInputElement | null;\n\n if (this.config.floatingButton?.visible !== false && !existing.querySelector('.foisit-floating-btn')) {\n this.renderFloatingButton();\n }\n\n if (!this.chatWindow) {\n this.renderChatWindow();\n }\n return;\n }\n\n this.container = document.createElement('div');\n this.container.id = 'foisit-overlay-container';\n this.container.className = 'foisit-overlay-container';\n\n document.body.appendChild(this.container);\n\n if (this.config.floatingButton?.visible !== false) {\n this.renderFloatingButton();\n }\n\n this.renderChatWindow();\n }\n\n private renderFloatingButton() {\n const btn = document.createElement('button');\n btn.innerHTML = this.config.floatingButton?.customHtml || '🎙️';\n const bottom = this.config.floatingButton?.position?.bottom || '20px';\n const right = this.config.floatingButton?.position?.right || '20px';\n\n btn.className = 'foisit-floating-btn';\n btn.style.bottom = bottom;\n btn.style.right = right;\n\n btn.onclick = () => this.toggle();\n btn.onmouseenter = () => (btn.style.transform = 'scale(1.05)');\n btn.onmouseleave = () => (btn.style.transform = 'scale(1)');\n\n this.container?.appendChild(btn);\n }\n\n private renderChatWindow() {\n if (this.chatWindow) return;\n\n this.chatWindow = document.createElement('div');\n this.chatWindow.className = 'foisit-chat';\n\n // Header\n const header = document.createElement('div');\n header.className = 'foisit-header';\n\n const title = document.createElement('span');\n title.className = 'foisit-title';\n title.textContent = 'Foisit';\n\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.className = 'foisit-close';\n closeButton.setAttribute('aria-label', 'Close');\n closeButton.innerHTML = '&times;';\n closeButton.addEventListener('click', () => this.toggle());\n\n header.appendChild(title);\n header.appendChild(closeButton);\n\n // Messages Area\n this.messagesContainer = document.createElement('div');\n this.messagesContainer.className = 'foisit-messages';\n\n // Input Area\n const inputArea = document.createElement('div');\n inputArea.className = 'foisit-input-area';\n\n this.input = document.createElement('input');\n this.input.placeholder =\n this.config.inputPlaceholder || 'Type a command...';\n this.input.className = 'foisit-input';\n\n this.input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && this.input?.value.trim()) {\n const text = this.input.value.trim();\n this.input.value = '';\n if (this.onSubmit) this.onSubmit(text);\n }\n });\n\n inputArea.appendChild(this.input);\n\n this.chatWindow.appendChild(header);\n this.chatWindow.appendChild(this.messagesContainer);\n this.chatWindow.appendChild(inputArea);\n this.container?.appendChild(this.chatWindow);\n }\n\n registerCallbacks(onSubmit: (input: string | Record<string, unknown>) => void, onClose: () => void) {\n if (!this.active) return; // no-op on server\n this.onSubmit = onSubmit;\n this.onClose = onClose;\n }\n\n toggle(onSubmit?: (input: string | Record<string, unknown>) => void, onClose?: () => void) {\n if (!this.active) return; // no-op on server\n if (onSubmit) this.onSubmit = onSubmit;\n if (onClose) this.onClose = onClose;\n\n this.isOpen = !this.isOpen;\n\n if (this.chatWindow) {\n if (this.isOpen) {\n this.chatWindow.style.display = 'flex';\n requestAnimationFrame(() => {\n if (this.chatWindow) {\n this.chatWindow.style.opacity = '1';\n this.chatWindow.style.transform = 'translateY(0) scale(1)';\n }\n });\n setTimeout(() => this.input?.focus(), 100);\n } else {\n this.chatWindow.style.opacity = '0';\n this.chatWindow.style.transform = 'translateY(20px) scale(0.95)';\n setTimeout(() => {\n if (this.chatWindow && !this.isOpen) {\n this.chatWindow.style.display = 'none';\n }\n }, 200);\n if (this.onClose) this.onClose();\n }\n }\n }\n\n addMessage(text: string, type: 'user' | 'system') {\n if (!this.messagesContainer) return;\n\n const msg = document.createElement('div');\n msg.textContent = text;\n msg.className = type === 'user' ? 'foisit-bubble user' : 'foisit-bubble system';\n\n this.messagesContainer.appendChild(msg);\n this.scrollToBottom();\n }\n\n addOptions(options: { label: string; value?: string; commandId?: string }[]) {\n if (!this.messagesContainer) return;\n\n const container = document.createElement('div');\n container.className = 'foisit-options-container';\n\n options.forEach((opt) => {\n const btn = document.createElement('button');\n btn.textContent = opt.label;\n btn.className = 'foisit-option-chip';\n btn.setAttribute('type', 'button');\n btn.setAttribute('aria-label', opt.label);\n\n const clickPayload = () => {\n // If commandId is provided, submit a structured payload so the handler\n // can run it deterministically: { commandId, params? }\n if (opt.commandId) {\n if (this.onSubmit) this.onSubmit({ commandId: opt.commandId });\n return;\n }\n\n // Otherwise fall back to value or label string\n const value = (opt && typeof opt.value === 'string' && opt.value.trim()) ? opt.value : opt.label;\n if (this.onSubmit) this.onSubmit(value);\n };\n\n btn.onclick = clickPayload;\n btn.onkeydown = (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n clickPayload();\n }\n };\n\n container.appendChild(btn);\n });\n\n this.messagesContainer.appendChild(container);\n this.scrollToBottom();\n }\n\n addForm(\n message: string,\n fields: AssistantParameter[],\n onSubmit: (_data: Record<string, unknown>) => void\n ) {\n if (!this.messagesContainer) return;\n\n this.addMessage(message, 'system');\n\n const form = document.createElement('form');\n form.className = 'foisit-form';\n\n const controls: Array<{\n name: string;\n type: AssistantParameter['type'];\n el: HTMLInputElement | HTMLSelectElement;\n required?: boolean;\n }> = [];\n\n const createLabel = (text: string, required?: boolean) => {\n const label = document.createElement('div');\n label.className = 'foisit-form-label';\n label.innerHTML = text + (required ? ' <span class=\"foisit-req-star\">*</span>' : '');\n return label;\n };\n\n const createError = () => {\n const error = document.createElement('div');\n error.className = 'foisit-form-error';\n error.style.display = 'none';\n return error;\n };\n\n (fields ?? []).forEach((field) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'foisit-form-group';\n\n const labelText = field.description || field.name;\n wrapper.appendChild(createLabel(labelText, field.required));\n\n let inputEl: HTMLInputElement | HTMLSelectElement;\n\n if (field.type === 'select') {\n const select = document.createElement('select');\n select.className = 'foisit-form-input';\n\n const placeholderOpt = document.createElement('option');\n placeholderOpt.value = '';\n placeholderOpt.textContent = 'Select...';\n select.appendChild(placeholderOpt);\n\n const populate = (options: SelectOption[]) => {\n (options ?? []).forEach((opt) => {\n const o = document.createElement('option');\n o.value = String(opt.value ?? opt.label ?? '');\n o.textContent = String(opt.label ?? opt.value ?? '');\n select.appendChild(o);\n });\n };\n\n if (Array.isArray(field.options) && field.options.length) {\n populate(field.options);\n } else if (typeof field.getOptions === 'function') {\n const getOptions = field.getOptions;\n const loadingOpt = document.createElement('option');\n loadingOpt.value = '';\n loadingOpt.textContent = 'Loading...';\n select.appendChild(loadingOpt);\n Promise.resolve()\n .then(() => getOptions())\n .then((opts: SelectOption[]) => {\n while (select.options.length > 1) select.remove(1);\n populate(opts);\n })\n .catch(() => {\n while (select.options.length > 1) select.remove(1);\n const errOpt = document.createElement('option');\n errOpt.value = '';\n errOpt.textContent = 'Error loading options';\n select.appendChild(errOpt);\n });\n }\n\n if (field.defaultValue != null) {\n select.value = String(field.defaultValue);\n }\n inputEl = select;\n } else if (field.type === 'file') {\n const ffield = field as Extract<AssistantParameter, { type: 'file' }>;\n const input = document.createElement('input');\n input.className = 'foisit-form-input';\n input.type = 'file';\n if (ffield.accept && Array.isArray(ffield.accept)) {\n input.accept = ffield.accept.join(',');\n }\n if (ffield.multiple) input.multiple = true;\n if (ffield.capture) {\n if (ffield.capture === true) input.setAttribute('capture', '');\n else input.setAttribute('capture', String(ffield.capture));\n }\n\n // Validation state stored on the element via dataset\n input.addEventListener('change', async () => {\n const files = Array.from((input as HTMLInputElement).files || []);\n const errEl = errorEl as HTMLElement;\n errEl.style.display = 'none';\n errEl.textContent = '';\n\n if (files.length === 0) return;\n\n // Basic validations: count and sizes\n const maxFiles = ffield.maxFiles ?? (ffield.multiple ? 10 : 1);\n if (files.length > maxFiles) {\n errEl.textContent = `Please select at most ${maxFiles} file(s).`;\n errEl.style.display = 'block';\n return;\n }\n\n const maxSize = ffield.maxSizeBytes ?? Infinity;\n const total = files.reduce((s, f) => s + f.size, 0);\n if (files.some(f => f.size > maxSize)) {\n errEl.textContent = `One or more files exceed the maximum size of ${Math.round(maxSize / 1024)} KB.`;\n errEl.style.display = 'block';\n return;\n }\n const maxTotal = ffield.maxTotalBytes ?? Infinity;\n if (total > maxTotal) {\n errEl.textContent = `Total selected files exceed the maximum of ${Math.round(maxTotal / 1024)} KB.`;\n errEl.style.display = 'block';\n return;\n }\n\n // Basic mime/extension check\n if (ffield.accept && Array.isArray(ffield.accept)) {\n const accepts = ffield.accept as string[];\n const ok = files.every((file) => {\n if (!file.type) return true; // can't tell\n return accepts.some(a => a.startsWith('.') ? file.name.toLowerCase().endsWith(a.toLowerCase()) : file.type === a || file.type.startsWith(a.split('/')[0] + '/'));\n });\n if (!ok) {\n errEl.textContent = 'One or more files have an unsupported type.';\n errEl.style.display = 'block';\n return;\n }\n }\n });\n\n inputEl = input;\n } else {\n const input = document.createElement('input');\n input.className = 'foisit-form-input';\n\n if (field.type === 'string') {\n input.placeholder = field.placeholder || 'Type here...';\n }\n\n if (field.type === 'number') {\n input.type = 'number';\n if (typeof field.min === 'number') input.min = String(field.min);\n if (typeof field.max === 'number') input.max = String(field.max);\n if (typeof field.step === 'number') input.step = String(field.step);\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n } else if (field.type === 'date') {\n input.type = 'date';\n if (typeof field.min === 'string') input.min = field.min;\n if (typeof field.max === 'string') input.max = field.max;\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n } else {\n input.type = 'text';\n if (field.defaultValue != null) input.value = String(field.defaultValue);\n }\n inputEl = input;\n }\n\n // Add Error element\n const errorEl = createError();\n\n wrapper.appendChild(inputEl);\n wrapper.appendChild(errorEl); // Append error container\n\n controls.push({\n name: field.name,\n type: field.type,\n el: inputEl,\n required: field.required,\n });\n\n form.appendChild(wrapper);\n });\n\n const actions = document.createElement('div');\n actions.className = 'foisit-form-actions';\n\n const submitBtn = document.createElement('button');\n submitBtn.type = 'submit';\n submitBtn.textContent = 'Submit';\n submitBtn.className = 'foisit-option-chip';\n submitBtn.style.fontWeight = '600';\n\n actions.appendChild(submitBtn);\n form.appendChild(actions);\n\n form.onsubmit = async (e) => {\n e.preventDefault();\n\n const data: Record<string, unknown> = {};\n let hasError = false;\n\n // Clear previous errors\n form.querySelectorAll('.foisit-form-error').forEach(el => {\n (el as HTMLElement).style.display = 'none';\n el.textContent = '';\n });\n form.querySelectorAll('.foisit-form-input').forEach(el => {\n el.classList.remove('foisit-error-border');\n });\n\n for (const c of controls) {\n // FILE inputs need special handling\n if (c.type === 'file') {\n const fileWrapper = c.el.parentElement;\n const fileErrorEl = fileWrapper?.querySelector('.foisit-form-error') as HTMLElement;\n const input = c.el as HTMLInputElement;\n const files = Array.from(input.files || []);\n\n if (c.required && files.length === 0) {\n hasError = true;\n input.classList.add('foisit-error-border');\n if (fileErrorEl) {\n fileErrorEl.textContent = 'This file is required';\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n\n if (files.length === 0) continue;\n\n // Find corresponding field definition\n const fieldDef = (fields ?? []).find((f) => f.name === c.name) as Extract<AssistantParameter, { type: 'file' }> | undefined;\n const delivery: 'file' | 'base64' = fieldDef?.delivery ?? 'file';\n\n // Run optional dimension/duration checks (best-effort)\n if (fieldDef?.maxWidth || fieldDef?.maxHeight) {\n // check first image only\n try {\n const dims = await this.getImageDimensions(files[0]);\n if (fieldDef.maxWidth && dims.width > fieldDef.maxWidth) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Image width must be ≤ ${fieldDef.maxWidth}px`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n if (fieldDef.maxHeight && dims.height > fieldDef.maxHeight) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Image height must be ≤ ${fieldDef.maxHeight}px`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n } catch {\n // ignore dimension check failures\n }\n }\n\n if (fieldDef?.maxDurationSec) {\n try {\n const dur = await this.getMediaDuration(files[0]);\n if (dur && dur > fieldDef.maxDurationSec) {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = `Media duration must be ≤ ${fieldDef.maxDurationSec}s`;\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n } catch {\n // ignore\n }\n }\n\n // Prepare payload according to delivery\n if (delivery === 'file') {\n data[c.name] = fieldDef?.multiple ? files : files[0];\n } else if (delivery === 'base64') {\n try {\n const encoded = await Promise.all(files.map((file) => this.readFileAsDataURL(file)));\n data[c.name] = fieldDef?.multiple ? encoded : encoded[0];\n } catch {\n hasError = true;\n if (fileErrorEl) {\n fileErrorEl.textContent = 'Failed to encode file(s) to base64.';\n fileErrorEl.style.display = 'block';\n }\n continue;\n }\n }\n\n continue;\n }\n\n const val = (c.el.value ?? '').toString().trim();\n const valueWrapper = c.el.parentElement;\n const fieldErrorEl = valueWrapper?.querySelector('.foisit-form-error') as HTMLElement;\n\n if (c.required && (val == null || val === '')) {\n hasError = true;\n c.el.classList.add('foisit-error-border');\n if (fieldErrorEl) {\n fieldErrorEl.textContent = 'This field is required';\n fieldErrorEl.style.display = 'block';\n }\n continue;\n }\n\n if (val === '') continue;\n\n if (c.type === 'number') {\n const n = Number(val);\n if (!Number.isNaN(n)) data[c.name] = n;\n } else {\n data[c.name] = val;\n }\n }\n\n if (hasError) {\n // Shake animation\n form.classList.add('foisit-shake');\n setTimeout(() => form.classList.remove('foisit-shake'), 400);\n return;\n }\n\n submitBtn.disabled = true;\n submitBtn.style.opacity = '0.6';\n controls.forEach((c) => {\n c.el.disabled = true;\n });\n\n onSubmit(data);\n };\n\n this.messagesContainer.appendChild(form);\n this.scrollToBottom();\n }\n\n showLoading() {\n if (!this.messagesContainer) return;\n if (this.loadingEl) return;\n\n this.loadingEl = document.createElement('div');\n this.loadingEl.className = 'foisit-loading-dots foisit-bubble system';\n\n // Create dots\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'foisit-dot';\n dot.style.animation = `foisitPulse 1.4s infinite ease-in-out ${i * 0.2}s`;\n this.loadingEl.appendChild(dot);\n }\n\n this.messagesContainer.appendChild(this.loadingEl);\n this.scrollToBottom();\n }\n\n hideLoading() {\n this.loadingEl?.remove();\n this.loadingEl = null;\n }\n\n private scrollToBottom() {\n if (this.messagesContainer) {\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\n }\n }\n\n destroy() {\n this.container?.remove();\n this.container = null;\n this.chatWindow = null;\n this.messagesContainer = null;\n this.input = null;\n this.isOpen = false;\n }\n\n private readFileAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onerror = () => reject(new Error('Failed to read file'));\n fr.onload = () => resolve(String(fr.result));\n fr.readAsDataURL(file);\n });\n }\n\n private getImageDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n try {\n const url = URL.createObjectURL(file);\n const img = new Image();\n img.onload = () => {\n const dims = { width: img.naturalWidth || img.width, height: img.naturalHeight || img.height };\n URL.revokeObjectURL(url);\n resolve(dims);\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ width: 0, height: 0 });\n };\n img.src = url;\n } catch {\n resolve({ width: 0, height: 0 });\n }\n });\n }\n\n private getMediaDuration(file: File): Promise<number> {\n return new Promise((resolve) => {\n try {\n const url = URL.createObjectURL(file);\n const el = file.type.startsWith('audio') ? document.createElement('audio') : document.createElement('video');\n let settled = false;\n const timeout = setTimeout(() => {\n if (!settled) {\n settled = true;\n URL.revokeObjectURL(url);\n resolve(0);\n }\n }, 5000);\n\n el.preload = 'metadata';\n el.onloadedmetadata = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n const mediaEl = el as HTMLMediaElement;\n const d = mediaEl.duration || 0;\n URL.revokeObjectURL(url);\n resolve(d);\n };\n el.onerror = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n URL.revokeObjectURL(url);\n resolve(0);\n };\n (el as HTMLMediaElement).src = url;\n } catch {\n resolve(0);\n }\n });\n }\n\n private injectOverlayStyles(): void {\n if (document.getElementById('foisit-overlay-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'foisit-overlay-styles';\n style.textContent = `\n :root {\n /* LIGHT MODE (Default) - Smoother gradient */\n /* Changed: Softer, right-focused radial highlight to avoid a heavy white bottom */\n --foisit-bg: radial-gradient(ellipse at 75% 30%, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.03));\n --foisit-border: 1px solid rgba(255, 255, 255, 0.25);\n --foisit-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);\n --foisit-text: #333;\n\n /* Input */\n --foisit-input-color: #333;\n --foisit-input-placeholder: rgba(60, 60, 67, 0.6);\n\n /* Bubbles */\n --foisit-bubble-user-bg: rgba(0, 0, 0, 0.04);\n --foisit-bubble-user-text: #333;\n\n --foisit-bubble-sys-bg: rgba(255, 255, 255, 0.45);\n --foisit-bubble-sys-text: #333;\n\n /* Form Colors */\n --foisit-req-star: #ef4444; /* Red asterisk */\n --foisit-error-text: #dc2626;\n --foisit-error-border: #fca5a5;\n }\n\n @media (prefers-color-scheme: dark) {\n :root {\n /* DARK MODE */\n --foisit-bg: linear-gradient(135deg, rgba(40, 40, 40, 0.65), rgba(40, 40, 40, 0.25));\n --foisit-border: 1px solid rgba(255, 255, 255, 0.1);\n --foisit-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);\n --foisit-text: #fff;\n\n /* Input */\n --foisit-input-color: white;\n --foisit-input-placeholder: rgba(235, 235, 245, 0.5);\n\n /* Bubbles */\n --foisit-bubble-user-bg: rgba(255, 255, 255, 0.1);\n --foisit-bubble-user-text: white;\n\n --foisit-bubble-sys-bg: rgba(255, 255, 255, 0.05);\n --foisit-bubble-sys-text: rgba(255, 255, 255, 0.9);\n\n /* Form Colors */\n --foisit-req-star: #f87171;\n --foisit-error-text: #fca5a5;\n --foisit-error-border: #f87171;\n }\n }\n\n @keyframes foisitPulse {\n 0%, 100% { transform: scale(0.8); opacity: 0.5; }\n 50% { transform: scale(1.2); opacity: 1; }\n }\n\n @keyframes foisitShake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-4px); }\n 75% { transform: translateX(4px); }\n }\n .foisit-shake { animation: foisitShake 0.4s ease-in-out; }\n\n /* Container */\n .foisit-overlay-container {\n position: fixed;\n inset: 0;\n z-index: 2147483647;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n\n .foisit-overlay-container * {\n box-sizing: border-box;\n }\n\n /* Chat Window - Dynamic Height */\n .foisit-chat {\n position: absolute;\n top: 20px;\n right: 20px;\n width: min(420px, 92vw);\n\n /* FIX: Auto height to prevent empty space */\n height: auto;\n min-height: 120px;\n max-height: 80vh;\n\n background: var(--foisit-bg);\n border: var(--foisit-border);\n box-shadow: var(--foisit-shadow);\n\n backdrop-filter: blur(20px);\n -webkit-backdrop-filter: blur(20px);\n\n border-radius: 18px;\n display: none;\n flex-direction: column;\n overflow: hidden;\n pointer-events: auto;\n transform-origin: top right;\n transition: opacity 0.2s, transform 0.2s cubic-bezier(0.2, 0.9, 0.2, 1);\n }\n\n .foisit-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n color: var(--foisit-text);\n border-bottom: 1px solid rgba(127,127,127,0.08); /* Subtle separator */\n }\n\n .foisit-close {\n background: transparent;\n border: none;\n color: var(--foisit-text);\n opacity: 0.5;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n padding: 0;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s;\n }\n .foisit-close:hover { opacity: 1; }\n\n /* Message Area */\n .foisit-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n /* Ensure it doesn't get too tall initially */\n min-height: 60px;\n }\n\n /* Make sure empty state isn't huge */\n .foisit-messages:empty {\n display: none;\n }\n\n /* Only show messages container if it has children */\n .foisit-messages:not(:empty) {\n display: flex;\n }\n\n /* Bubbles */\n .foisit-bubble {\n max-width: 90%;\n padding: 8px 14px;\n border-radius: 14px;\n font-size: 14px;\n line-height: 1.4;\n word-wrap: break-word;\n }\n\n .foisit-bubble.user {\n align-self: flex-end;\n background: var(--foisit-bubble-user-bg);\n color: var(--foisit-bubble-user-text);\n border-bottom-right-radius: 4px;\n }\n\n .foisit-bubble.system {\n align-self: flex-start;\n background: var(--foisit-bubble-sys-bg);\n color: var(--foisit-bubble-sys-text);\n border-bottom-left-radius: 4px;\n border: 1px solid rgba(255,255,255,0.1);\n }\n\n /* Input Area */\n .foisit-input-area {\n padding: 0;\n width: 100%;\n border-top: 1px solid rgba(127,127,127,0.08);\n }\n\n .foisit-input {\n width: 100%;\n background: transparent;\n border: none;\n font-size: 16px;\n color: var(--foisit-input-color);\n padding: 16px 20px;\n outline: none;\n text-align: left;\n }\n\n .foisit-input::placeholder {\n color: var(--foisit-input-placeholder);\n font-weight: 400;\n }\n\n /* Options & Buttons */\n .foisit-options-container {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-left: 2px;\n margin-top: 4px;\n }\n\n .foisit-option-chip {\n padding: 6px 14px;\n background: var(--foisit-bubble-sys-bg);\n border: 1px solid rgba(127,127,127,0.1);\n border-radius: 20px;\n font-size: 13px;\n color: var(--foisit-text);\n cursor: pointer;\n transition: all 0.2s;\n font-weight: 500;\n }\n .foisit-option-chip:hover {\n background: rgba(127,127,127,0.15);\n }\n\n /* Form Styling */\n .foisit-form {\n background: var(--foisit-bubble-sys-bg);\n padding: 16px;\n border-radius: 14px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n border: 1px solid rgba(127,127,127,0.1);\n }\n\n .foisit-form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--foisit-text);\n opacity: 0.9;\n margin-bottom: 2px;\n }\n\n .foisit-req-star {\n color: var(--foisit-req-star);\n font-weight: bold;\n }\n\n .foisit-form-input {\n width: 100%;\n padding: 10px;\n border-radius: 8px;\n border: 1px solid rgba(127,127,127,0.2);\n background: rgba(255,255,255,0.05); /* Very subtle fill */\n color: var(--foisit-text);\n font-size: 14px;\n outline: none;\n transition: border 0.2s;\n }\n .foisit-form-input:focus {\n border-color: var(--foisit-text);\n background: rgba(255,255,255,0.1);\n }\n\n .foisit-error-border {\n border-color: var(--foisit-error-border) !important;\n }\n\n .foisit-form-error {\n font-size: 11px;\n color: var(--foisit-error-text);\n margin-top: 4px;\n }\n\n /* Loading */\n .foisit-loading-dots {\n display: inline-flex;\n gap: 4px;\n padding: 10px 14px;\n align-self: flex-start;\n }\n .foisit-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--foisit-text);\n opacity: 0.4;\n }\n\n /* Floating Button */\n .foisit-floating-btn {\n position: absolute;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: 1px solid rgba(255,255,255,0.2);\n background: var(--foisit-bg);\n color: var(--foisit-text);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n cursor: pointer;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n z-index: 100000;\n transition: transform 0.2s;\n }\n .foisit-floating-btn:hover { transform: scale(1.05); }\n `;\n document.head.appendChild(style);\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport {\n CommandHandler,\n FallbackHandler,\n VoiceProcessor,\n StateManager,\n AssistantConfig,\n TextToSpeech,\n GestureHandler,\n OverlayManager,\n AssistantCommand,\n AssistantCommandParams,\n InteractiveResponse,\n} from '../../core-internal';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AssistantService {\n private commandHandler: CommandHandler;\n private fallbackHandler: FallbackHandler;\n private voiceProcessor: VoiceProcessor;\n private textToSpeech: TextToSpeech;\n private stateManager: StateManager;\n private lastProcessedInput = '';\n private processingLock = false;\n private isActivated = false; // Tracks activation status\n private gestureHandler: GestureHandler;\n private overlayManager: OverlayManager;\n private defaultIntroMessage = 'How can I help you?';\n\n constructor(@Inject('ASSISTANT_CONFIG') private config: AssistantConfig) {\n // Pass enableSmartIntent (default true) and potential apiKey (if we add it to config later)\n this.commandHandler = new CommandHandler({\n enableSmartIntent: this.config.enableSmartIntent !== false,\n intentEndpoint: this.config.intentEndpoint,\n });\n this.fallbackHandler = new FallbackHandler();\n\n // Browser-only features are lazily created to remain SSR-safe\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n this.voiceProcessor = new VoiceProcessor();\n this.textToSpeech = new TextToSpeech();\n this.gestureHandler = new GestureHandler();\n this.overlayManager = new OverlayManager({\n floatingButton: this.config.floatingButton,\n inputPlaceholder: this.config.inputPlaceholder,\n });\n\n // Register global callbacks for floating button when overlay exists\n this.overlayManager.registerCallbacks(\n async (input) => {\n if (typeof input === 'string') {\n this.overlayManager.addMessage(input, 'user');\n } else if (input && typeof input === 'object') {\n const label = this.extractUserLabel(input as Record<string, unknown>);\n if (label) {\n this.overlayManager.addMessage(label, 'user');\n }\n }\n\n await this.handleCommand(input);\n },\n () => console.log('AssistantService: Overlay closed.')\n );\n\n // Setup double-tap/double-click listener\n this.stateManager = new StateManager();\n this.gestureHandler.setupDoubleTapListener(() => this.toggle());\n } else {\n // Server environment: keep browser-specific properties null\n this.stateManager = undefined as any;\n this.voiceProcessor = undefined as any;\n this.textToSpeech = undefined as any;\n this.gestureHandler = undefined as any;\n this.overlayManager = undefined as any;\n }\n\n // Setup commands from config\n this.config.commands.forEach((cmd) => this.commandHandler.addCommand(cmd));\n\n // Setup fallback response\n if (this.config.fallbackResponse) {\n this.fallbackHandler.setFallbackMessage(this.config.fallbackResponse);\n }\n\n // Voice disabled for text-first pivot\n // this.startListening();\n\n // (moved into the browser-only block)\n }\n\n /** Start listening for activation and commands */\n startListening(): void {\n // No-op on server or when voice features are unavailable\n if (typeof window === 'undefined' || !this.voiceProcessor) {\n console.log('AssistantService: Voice is disabled or unavailable; startListening() is a no-op.');\n return;\n }\n\n /*\n this.voiceProcessor.startListening(async (transcript: string) => {\n if (this.processingLock) return;\n\n const normalizedTranscript = transcript.toLowerCase().trim();\n\n // Skip repeated or irrelevant inputs\n if (\n !normalizedTranscript ||\n normalizedTranscript.length < 3 ||\n normalizedTranscript === this.lastProcessedInput\n ) {\n console.log('AssistantService: Ignoring irrelevant input.');\n return;\n }\n\n this.lastProcessedInput = normalizedTranscript;\n\n if (!this.isActivated) {\n await this.processActivation(normalizedTranscript);\n return;\n }\n\n const isFallbackOrIntroMessage =\n normalizedTranscript === this.config.fallbackResponse?.toLowerCase() ||\n normalizedTranscript === this.config.introMessage?.toLowerCase() ||\n normalizedTranscript === this.defaultIntroMessage.toLowerCase();\n\n if (!isFallbackOrIntroMessage) {\n await this.handleCommand(normalizedTranscript);\n } else {\n console.log('AssistantService: Ignoring fallback or intro message.');\n }\n\n // Throttle input processing to prevent rapid feedback\n this.processingLock = true;\n setTimeout(() => (this.processingLock = false), 1000);\n });\n */\n }\n\n /** Stop listening for voice input */\n stopListening(): void {\n if (typeof window === 'undefined' || !this.voiceProcessor) {\n console.log('AssistantService: Voice unavailable; stopListening() is a no-op.');\n this.isActivated = false;\n return;\n }\n this.voiceProcessor.stopListening();\n this.isActivated = false;\n }\n\n /** Reset activation state so the next activation flow can occur. */\n reactivate(): void {\n console.log('AssistantService: Reactivating assistant...');\n this.isActivated = false;\n try {\n this.startListening();\n } catch {\n // no-op\n }\n }\n\n /** Process activation command */\n private async processActivation(transcript: string): Promise<void> {\n const activationCmd = this.config.activationCommand?.toLowerCase();\n\n // If no activation command is set, we can't activate via voice\n if (!activationCmd) return;\n\n if (transcript === activationCmd) {\n console.log('AssistantService: Activation matched.');\n this.isActivated = true;\n this.textToSpeech.speak(\n this.config.introMessage || this.defaultIntroMessage\n );\n // this.stateManager.setState('listening'); // DISABLED - no gradient animation\n } else {\n console.log('AssistantService: Activation command not recognized.');\n }\n }\n\n /** Handle recognized commands */\n private async handleCommand(\n input: string | Record<string, unknown>\n ): Promise<void> {\n this.overlayManager.showLoading();\n let response: InteractiveResponse;\n try {\n response = await this.commandHandler.executeCommand(input);\n } finally {\n this.overlayManager.hideLoading();\n }\n\n const originalText = typeof input === 'string' ? input : undefined;\n this.processResponse(response, originalText);\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n this.voiceProcessor?.stopListening();\n this.gestureHandler?.destroy();\n this.overlayManager?.destroy();\n }\n\n /** Unified response processing */\n private processResponse(\n response: InteractiveResponse,\n originalText?: string\n ): void {\n if (response.type === 'error' && originalText) {\n this.fallbackHandler.handleFallback(originalText);\n this.overlayManager.addMessage(this.fallbackHandler.getFallbackMessage(), 'system');\n return;\n }\n\n if (response.type === 'form' && response.fields) {\n this.overlayManager.addForm(\n response.message,\n response.fields,\n async (data: Record<string, unknown>) => {\n this.overlayManager.showLoading();\n let nextReponse: InteractiveResponse;\n try {\n nextReponse = await this.commandHandler.executeCommand(data);\n } finally {\n this.overlayManager.hideLoading();\n }\n this.processResponse(nextReponse);\n }\n );\n return;\n }\n\n if ((response.type === 'ambiguous' || response.type === 'confirm') && response.options) {\n if (response.message) {\n this.overlayManager.addMessage(response.message, 'system');\n }\n this.overlayManager.addOptions(response.options);\n return;\n }\n\n if (response.message) {\n this.overlayManager.addMessage(response.message, 'system');\n }\n }\n\n /** Add a command dynamically (supports string or rich object) */\n addCommand(\n commandOrObj: string | AssistantCommand,\n action?: (\n params?: AssistantCommandParams\n ) => Promise<string | InteractiveResponse | void> | void\n ): void {\n if (typeof commandOrObj === 'string') {\n console.log(`AssistantService: Adding command \"${commandOrObj}\".`);\n } else {\n console.log(\n `AssistantService: Adding rich command \"${commandOrObj.command}\".`\n );\n }\n this.commandHandler.addCommand(commandOrObj, action);\n }\n\n /** Remove a command dynamically */\n removeCommand(command: string): void {\n console.log(`AssistantService: Removing command \"${command}\".`);\n this.commandHandler.removeCommand(command);\n }\n\n /** Get all registered commands */\n getCommands(): string[] {\n return this.commandHandler.getCommands();\n }\n\n /** Toggle the assistant overlay */\n toggle(\n onSubmit?: (input: string | Record<string, unknown>) => void,\n onClose?: () => void\n ): void {\n console.log('AssistantService: Toggling overlay...');\n this.overlayManager.toggle(\n async (input) => {\n if (typeof input === 'string') {\n this.overlayManager.addMessage(input, 'user');\n } else if (input && typeof input === 'object') {\n const label = this.extractUserLabel(input);\n if (label) {\n this.overlayManager.addMessage(label, 'user');\n }\n }\n\n if (onSubmit) onSubmit(input);\n await this.handleCommand(input);\n },\n () => {\n console.log('AssistantService: Overlay closed.');\n if (onClose) onClose();\n }\n );\n }\n\n private extractUserLabel(payload: Record<string, unknown>): string | null {\n const label = payload['label'];\n if (typeof label === 'string' && label.trim()) {\n return label.trim();\n }\n\n const commandId = payload['commandId'];\n if (typeof commandId === 'string' && commandId.trim()) {\n return commandId.trim();\n }\n\n return null;\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { AssistantService } from './service/assistant.service';\nimport { AssistantConfig } from '../core-internal';\n\n@NgModule({})\nexport class AssistantModule {\n static forRoot(config: AssistantConfig): ModuleWithProviders<AssistantModule> {\n return {\n ngModule: AssistantModule,\n providers: [\n { provide: 'ASSISTANT_CONFIG', useValue: config },\n AssistantService,\n ],\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}