@blinq_ai/widget 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/dist/blinq-widget.iife.global.js +1923 -997
- package/dist/blinq-widget.iife.global.js.map +1 -1
- package/dist/browser.cjs +1580 -796
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +3 -2
- package/dist/browser.d.ts +3 -2
- package/dist/browser.js +168 -1114
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-2BSH3PRA.js → chunk-DQF42RXH.js} +1884 -145
- package/dist/chunk-DQF42RXH.js.map +1 -0
- package/dist/cli.js +122 -14
- package/dist/index.cjs +1886 -142
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +96 -108
- package/dist/index.d.ts +96 -108
- package/dist/index.js +11 -1
- package/dist/widget-core-D0ZdQY2E.d.cts +253 -0
- package/dist/widget-core-D0ZdQY2E.d.ts +253 -0
- package/package.json +3 -2
- package/dist/chunk-2BSH3PRA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/widget-core.ts","../src/page-capabilities.ts","../src/page-tools.ts","../src/embed-shell.tsx","../src/voice-input.ts","../src/embed-styles.ts"],"sourcesContent":["import * as React from \"react\"\nimport { createRoot, type Root } from \"react-dom/client\"\n\nimport {\n type ActionPolicy,\n PageToolRegistry,\n collectNormalizedPageContext,\n detectNativeWebMcpSupport,\n type PageHighlightTarget,\n type RuntimeCapability,\n type RuntimeMode,\n type ToolExecutionOutcome,\n} from \"./page-tools\"\nimport {\n WidgetEmbedShell,\n type WidgetActionConversationItem,\n type WidgetConversationItem,\n type WidgetGuideCardState,\n type WidgetGuideStepItem,\n type WidgetPlanConversationItem,\n type WidgetShellState,\n} from \"./embed-shell\"\nimport { VoiceInputController } from \"./voice-input\"\n\nexport interface BlinqWidgetInitOptions {\n publicToken: string\n apiBaseUrl?: string\n mcpEndpoint?: string\n mount?: string | HTMLElement\n}\n\nexport type BlinqWidgetConfigFile = BlinqWidgetInitOptions\n\ninterface WidgetConfig {\n widget_id: string\n name: string\n avatar_url?: string | null\n theme_variant: \"light\" | \"dark\"\n theme_color: string\n position: \"bottom-right\" | \"bottom-left\"\n is_active: boolean\n actions_enabled: boolean\n action_mode: \"guide_only\" | \"execute_with_confirmation\"\n pointer_overlay_enabled: boolean\n allowed_domain?: string | null\n}\n\ninterface InitResponse {\n session_id: string\n session_token: string\n widget_config: WidgetConfig\n runtime: RuntimeCapability\n resumed?: boolean\n active_run?: GoalRunPreview | null\n guide_offer?: PublicGuideOfferPayload | null\n active_guide?: PublicGuideRuntimePayload | null\n}\n\ninterface SseEnvelope {\n event: string\n data: string\n}\n\ninterface PublicToolRequestPayload {\n tool_call_id: string\n goal_run_id: string\n step_id: string\n step_index: number\n tool_name: string\n display_name: string\n arguments: Record<string, unknown>\n requires_confirmation: boolean\n target_summary: string\n}\n\ninterface GoalStepPreview {\n id: string\n index: number\n kind: string\n title: string\n status: string\n target_summary?: string | null\n}\n\ninterface GoalRunPreview {\n id: string\n goal: string\n goal_kind: string\n language: string\n status: string\n current_step_index: number\n total_steps: number\n summary?: string | null\n progress_label?: string | null\n status_reason?: string | null\n expected_route?: string | null\n loop_guarded?: boolean\n requires_approval?: boolean\n steps: GoalStepPreview[]\n}\n\ninterface GoalProgressPayload {\n run: GoalRunPreview\n label: string\n}\n\ninterface PublicStatusPayload {\n phase:\n | \"thinking\"\n | \"searching_knowledge\"\n | \"searching_site\"\n | \"planning\"\n | \"awaiting_approval\"\n | \"executing_plan\"\n label: string\n}\n\ninterface HighlightEventPayload {\n targets: PageHighlightTarget[]\n reason?: string\n}\n\ninterface PublicGuideStepPayload {\n id: string\n position: number\n title: string\n body: string\n target_selector?: string | null\n target_label?: string | null\n action_kind?: string | null\n action_payload?: Record<string, unknown> | null\n expected_route?: string | null\n completion_mode: string\n}\n\ninterface PublicGuidePayload {\n id: string\n source: \"published\" | \"live\"\n route: string\n summary?: string | null\n steps: PublicGuideStepPayload[]\n}\n\ninterface PublicGuideOfferPayload {\n guide: PublicGuidePayload\n state: \"offered\"\n}\n\ninterface PublicGuideRuntimePayload {\n session_state_id: string\n state: \"offered\" | \"started\" | \"dismissed\" | \"completed\"\n source: \"published\" | \"live\"\n current_step_index: number\n current_route?: string | null\n guide: PublicGuidePayload\n}\n\ninterface ChatHistoryEntry {\n role: \"user\" | \"assistant\"\n text: string\n}\n\nexport interface BlinqWidgetRuntimeStatus extends RuntimeCapability {\n message: string\n}\n\nconst DEFAULT_API_BASE_URL = \"http://localhost:8000\"\nconst STORAGE_KEY = \"blinq-widget-fingerprint\"\nconst HISTORY_STORAGE_PREFIX = \"blinq-widget-history\"\nconst MINIMIZED_STORAGE_PREFIX = \"blinq-widget-minimized\"\nconst SESSION_STORAGE_PREFIX = \"blinq-widget-session\"\nconst MAX_STORED_HISTORY = 30\nconst MAX_HISTORY_FOR_REQUEST = 12\nconst DEFAULT_GREETING =\n \"Blinq подключен. Спросите про текущую страницу, настройку платформы или следующий шаг.\"\n\nconst PLAN_APPROVE_TEXTS = new Set([\n \"да\",\n \"ага\",\n \"ок\",\n \"okay\",\n \"окей\",\n \"хорошо\",\n \"ладно\",\n \"делай\",\n \"сделай\",\n \"подтверждаю\",\n \"yes\",\n \"ok\",\n \"sure\",\n \"go ahead\",\n \"approve\",\n \"иә\",\n \"ия\",\n \"исте\",\n \"жарайды\",\n \"мақұл\",\n])\n\nconst PLAN_DECLINE_TEXTS = new Set([\n \"нет\",\n \"не надо\",\n \"не нужно\",\n \"отмена\",\n \"отмени\",\n \"cancel\",\n \"no\",\n \"stop\",\n \"жоқ\",\n \"тоқта\",\n \"керек емес\",\n])\n\nfunction isBrowser() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\"\n}\n\nfunction resolveMount(mount?: string | HTMLElement): HTMLElement {\n if (!isBrowser()) {\n throw new Error(\"Blinq можно подключить только в браузере\")\n }\n if (mount instanceof HTMLElement) {\n return mount\n }\n if (typeof mount === \"string\") {\n const target = document.querySelector<HTMLElement>(mount)\n if (!target) {\n throw new Error(`Не найден mount-элемент: ${mount}`)\n }\n return target\n }\n return document.body\n}\n\nfunction getOrCreateFingerprint() {\n if (!isBrowser()) {\n return \"server-widget-user\"\n }\n const existing = window.localStorage.getItem(STORAGE_KEY)\n if (existing) {\n return existing\n }\n const next = `fingerprint_${crypto.randomUUID()}`\n window.localStorage.setItem(STORAGE_KEY, next)\n return next\n}\n\nfunction runtimeMessage(mode: RuntimeMode) {\n if (mode === \"read-only-fallback\") {\n return \"Действия на странице недоступны. Я могу объяснять интерфейс и отвечать по базе знаний.\"\n }\n return \"Готов помогать с интерфейсом, знаниями и следующими шагами.\"\n}\n\nfunction normalizedRouteFromUrl(value: string) {\n try {\n const url = new URL(value, window.location.origin)\n const path = url.pathname || \"/\"\n return path === \"\" ? \"/\" : path\n } catch {\n return \"/\"\n }\n}\n\nasync function parseSseStream(\n stream: ReadableStream<Uint8Array>,\n onEvent: (event: SseEnvelope) => void\n) {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = \"\"\n let currentEvent = \"message\"\n let currentData = \"\"\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n buffer += decoder.decode(value, { stream: true })\n const chunks = buffer.split(\"\\n\")\n buffer = chunks.pop() ?? \"\"\n\n for (const line of chunks) {\n if (line.startsWith(\"event:\")) {\n currentEvent = line.slice(6).trim()\n } else if (line.startsWith(\"data:\")) {\n currentData += line.slice(5).trim()\n } else if (line.trim() === \"\") {\n if (currentData) {\n onEvent({ event: currentEvent, data: currentData })\n }\n currentEvent = \"message\"\n currentData = \"\"\n }\n }\n }\n\n if (currentData) {\n onEvent({ event: currentEvent, data: currentData })\n }\n}\n\nfunction normalizedConfig(\n config: BlinqWidgetConfigFile | { default: BlinqWidgetConfigFile }\n): BlinqWidgetConfigFile {\n if (\"default\" in config) {\n return config.default\n }\n return config as BlinqWidgetConfigFile\n}\n\nfunction createConversationId(prefix: string) {\n return `${prefix}_${crypto.randomUUID()}`\n}\n\nfunction normalizeAssistantStreamChunk(currentText: string, nextChunk: string) {\n if (!currentText) {\n return nextChunk.replace(/^\\s+/, \"\")\n }\n return nextChunk\n}\n\nfunction normalizeAssistantFinalText(text: string) {\n return text.replace(/^\\s+/, \"\")\n}\n\nexport class BlinqWidget {\n private readonly options: BlinqWidgetInitOptions\n private readonly apiBaseUrl: string\n private sessionId: string | null = null\n private sessionToken: string | null = null\n private widgetConfig: WidgetConfig | null = null\n private runtimeStatus: BlinqWidgetRuntimeStatus | null = null\n private registry: PageToolRegistry | null = null\n private root: HTMLElement | null = null\n private reactRoot: Root | null = null\n private voiceController: VoiceInputController | null = null\n private history: ChatHistoryEntry[] = []\n private items: WidgetConversationItem[] = []\n private minimized = false\n private isSending = false\n private inputValue = \"\"\n private statusText = \"\"\n private voiceSupported = false\n private voiceListening = false\n private voiceWaveform: number[] = []\n private voiceDurationMs = 0\n private voiceStartedAt: number | null = null\n private lastVoiceSampleAt = 0\n private confirmResolve: ((value: boolean) => void) | null = null\n private confirmItemId: string | null = null\n private activeRun: GoalRunPreview | null = null\n private activeGuide: WidgetGuideCardState | null = null\n private pendingAssistantIndicator = false\n private executedToolCounts = new Map<string, number>()\n private lastAutoResumeKey: string | null = null\n private readonly shellHandlers = {\n onOpen: () => this.setMinimized(false),\n onCollapse: () => this.setMinimized(true),\n onInputChange: (value: string) => {\n this.inputValue = value\n this.renderReactApp()\n },\n onSubmit: () => {\n void this.submitComposerMessage()\n },\n onToggleVoice: () => this.toggleVoiceInput(),\n onApproveAction: (id: string) => {\n if (this.confirmItemId === id) {\n this.resolveConfirmation(true)\n }\n },\n onDeclineAction: (id: string) => {\n if (this.confirmItemId === id) {\n this.resolveConfirmation(false)\n }\n },\n onApprovePlan: () => {\n void this.respondToPlan(true)\n },\n onDeclinePlan: () => {\n void this.respondToPlan(false)\n },\n onStartGuide: () => {\n void this.startGuide()\n },\n onAdvanceGuide: () => {\n void this.advanceGuide()\n },\n onDismissGuide: () => {\n void this.dismissGuide()\n },\n onCompleteGuide: () => {\n void this.completeGuide()\n },\n onRunGuideStep: () => {\n void this.runGuideStep()\n },\n }\n\n constructor(options: BlinqWidgetInitOptions) {\n this.options = options\n this.apiBaseUrl = options.apiBaseUrl ?? DEFAULT_API_BASE_URL\n }\n\n private currentActionPolicy(): ActionPolicy {\n return (\n this.runtimeStatus?.action_policy ?? {\n actions_enabled: this.widgetConfig?.actions_enabled ?? true,\n action_mode: this.widgetConfig?.action_mode ?? \"execute_with_confirmation\",\n pointer_overlay_enabled: this.widgetConfig?.pointer_overlay_enabled ?? true,\n }\n )\n }\n\n async init() {\n await this.startSession()\n if (isBrowser()) {\n this.restoreHistory()\n this.restoreMinimizedState()\n this.restoreConversationView()\n this.render()\n this.setupVoiceInput()\n this.registry = new PageToolRegistry(this.confirmToolExecution.bind(this))\n this.registry.setActionPolicy(this.currentActionPolicy())\n const nativeRegistered = await this.registry.registerNativeTools()\n this.syncRuntimeStatus(nativeRegistered)\n this.syncGuideHighlight()\n if (this.shouldAutoResumeActiveRun()) {\n window.setTimeout(() => {\n void this.continueActiveRun()\n }, 60)\n }\n }\n return this\n }\n\n getRuntimeStatus() {\n return this.runtimeStatus\n }\n\n destroy() {\n this.voiceController?.destroy()\n this.registry?.destroy()\n this.voiceController = null\n this.registry = null\n this.reactRoot?.unmount()\n this.reactRoot = null\n this.root?.remove()\n this.root = null\n }\n\n private currentState(): WidgetShellState {\n return {\n minimized: this.minimized,\n assistantName: this.widgetConfig?.name ?? \"Blinq Ассистент\",\n avatarUrl: this.widgetConfig?.avatar_url ?? null,\n runtimeLabel: \"webmcp://embedded\",\n statusText: this.statusText,\n showThinkingIndicator: this.pendingAssistantIndicator,\n inputValue: this.inputValue,\n accentColor: this.widgetConfig?.theme_color ?? \"#111111\",\n themeVariant: \"light\",\n side: this.widgetConfig?.position === \"bottom-left\" ? \"left\" : \"right\",\n isSending: this.isSending,\n voiceSupported: this.voiceSupported,\n voiceListening: this.voiceListening,\n voiceWaveform: this.voiceWaveform,\n voiceDurationMs: this.voiceDurationMs,\n guide: this.activeGuide,\n items: this.items,\n }\n }\n\n private renderReactApp() {\n if (!this.reactRoot) {\n return\n }\n\n this.reactRoot.render(\n React.createElement(WidgetEmbedShell, {\n state: this.currentState(),\n ...this.shellHandlers,\n })\n )\n }\n\n private async startSession() {\n const response = await fetch(`${this.apiBaseUrl}/pub/init`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n public_token: this.options.publicToken,\n domain: window.location.hostname,\n page_url: window.location.href,\n user_fingerprint: getOrCreateFingerprint(),\n previous_session_id: this.restoreStoredSessionId(),\n client_capabilities: {\n secure_context: window.isSecureContext,\n native_webmcp_supported: detectNativeWebMcpSupport(),\n page_actions_supported: true,\n },\n }),\n })\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as { detail?: string }\n throw new Error(payload.detail ?? \"Не удалось инициализировать виджет Blinq\")\n }\n\n const payload = (await response.json()) as InitResponse\n this.sessionId = payload.session_id\n this.sessionToken = payload.session_token\n this.widgetConfig = payload.widget_config\n this.activeRun = payload.active_run ?? null\n this.activeGuide = this.normalizeGuidePayload(payload.active_guide ?? payload.guide_offer ?? null)\n this.runtimeStatus = {\n ...payload.runtime,\n message: runtimeMessage(payload.runtime.mode),\n }\n this.persistSessionId()\n this.statusText = this.runtimeStatus.message\n }\n\n private render() {\n const mount = resolveMount(this.options.mount)\n if (!this.root) {\n this.root = document.createElement(\"div\")\n mount.appendChild(this.root)\n this.reactRoot = createRoot(this.root)\n }\n\n this.renderReactApp()\n }\n\n private preferredSpeechLanguage() {\n const htmlLang = document.documentElement.lang.trim()\n if (htmlLang) {\n return htmlLang\n }\n return navigator.language || \"ru-RU\"\n }\n\n private setupVoiceInput() {\n this.voiceController = new VoiceInputController({\n getLanguage: () => this.preferredSpeechLanguage(),\n onInterimTranscript: () => {},\n onFinalTranscript: (text) => {\n this.inputValue = text\n this.setStatus(\"Голос распознан. Проверьте текст и нажмите отправить.\")\n this.renderReactApp()\n },\n onListeningChange: (isListening) => {\n if (isListening) {\n this.startVoiceVisualization()\n } else {\n this.resetVoiceVisualization()\n }\n this.syncVoiceState()\n },\n onLevelChange: (level) => {\n this.updateVoiceVisualization(level)\n },\n onStatusChange: (status) => {\n this.setStatus(status)\n },\n onError: (message) => {\n this.setStatus(message)\n this.syncVoiceState()\n },\n })\n\n this.syncVoiceState()\n }\n\n private syncVoiceState() {\n this.voiceSupported = this.voiceController?.supported ?? false\n this.voiceListening = this.voiceController?.isListening ?? false\n if (!this.voiceListening) {\n this.resetVoiceVisualization()\n }\n this.renderReactApp()\n }\n\n private startVoiceVisualization() {\n this.voiceStartedAt = Date.now()\n this.voiceDurationMs = 0\n this.voiceWaveform = []\n this.lastVoiceSampleAt = 0\n }\n\n private resetVoiceVisualization() {\n this.voiceStartedAt = null\n this.voiceDurationMs = 0\n this.voiceWaveform = []\n this.lastVoiceSampleAt = 0\n }\n\n private updateVoiceVisualization(level: number) {\n if (!this.voiceListening) {\n return\n }\n\n const now = Date.now()\n if (this.voiceStartedAt === null) {\n this.startVoiceVisualization()\n this.voiceStartedAt = now\n }\n\n this.voiceDurationMs = Math.max(0, now - (this.voiceStartedAt ?? now))\n const nextLevel = Math.max(0.1, Math.min(1, level))\n\n if (this.voiceWaveform.length === 0 || now - this.lastVoiceSampleAt >= 90) {\n this.voiceWaveform = [...this.voiceWaveform, nextLevel].slice(-40)\n this.lastVoiceSampleAt = now\n } else {\n this.voiceWaveform = [\n ...this.voiceWaveform.slice(0, -1),\n nextLevel,\n ]\n }\n\n this.renderReactApp()\n }\n\n private async submitComposerMessage(message = this.inputValue) {\n const nextMessage = message.trim()\n if (!nextMessage) {\n return \"\"\n }\n if (this.isSending) {\n this.setStatus(\"Дождитесь завершения текущего ответа.\")\n this.inputValue = nextMessage\n this.renderReactApp()\n return \"\"\n }\n\n this.inputValue = \"\"\n this.renderReactApp()\n\n try {\n return await this.sendMessage(nextMessage)\n } catch {\n return \"\"\n }\n }\n\n private toggleVoiceInput() {\n if (!this.voiceController) {\n this.setStatus(\"Голосовой ввод недоступен.\")\n return\n }\n\n if (this.voiceController.isListening) {\n this.voiceController.stop()\n return\n }\n\n this.voiceController.start()\n this.syncVoiceState()\n }\n\n private minimizedStorageKey() {\n return `${MINIMIZED_STORAGE_PREFIX}:${window.location.hostname}:${this.options.publicToken.slice(0, 18)}`\n }\n\n private sessionStorageKey() {\n return `${SESSION_STORAGE_PREFIX}:${window.location.hostname}:${this.options.publicToken.slice(0, 18)}`\n }\n\n private restoreStoredSessionId() {\n if (!isBrowser()) {\n return null\n }\n return window.localStorage.getItem(this.sessionStorageKey())\n }\n\n private persistSessionId() {\n if (!isBrowser() || !this.sessionId) {\n return\n }\n window.localStorage.setItem(this.sessionStorageKey(), this.sessionId)\n }\n\n private restoreMinimizedState() {\n if (!isBrowser()) {\n return\n }\n this.minimized = window.localStorage.getItem(this.minimizedStorageKey()) === \"1\"\n }\n\n private persistMinimizedState() {\n if (!isBrowser()) {\n return\n }\n window.localStorage.setItem(this.minimizedStorageKey(), this.minimized ? \"1\" : \"0\")\n }\n\n private setMinimized(nextValue: boolean) {\n this.minimized = nextValue\n this.persistMinimizedState()\n this.renderReactApp()\n }\n\n private historyStorageKey() {\n return `${HISTORY_STORAGE_PREFIX}:${window.location.hostname}:${this.options.publicToken.slice(0, 18)}`\n }\n\n private restoreHistory() {\n if (!isBrowser()) {\n return\n }\n\n try {\n const raw = window.localStorage.getItem(this.historyStorageKey())\n if (!raw) {\n this.history = []\n return\n }\n\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) {\n this.history = []\n return\n }\n\n this.history = parsed\n .filter((entry): entry is ChatHistoryEntry => {\n if (!entry || typeof entry !== \"object\") {\n return false\n }\n const role = (entry as { role?: unknown }).role\n const text = (entry as { text?: unknown }).text\n return (role === \"user\" || role === \"assistant\") && typeof text === \"string\"\n })\n .slice(-MAX_STORED_HISTORY)\n } catch {\n this.history = []\n }\n }\n\n private persistHistory() {\n if (!isBrowser()) {\n return\n }\n\n try {\n window.localStorage.setItem(\n this.historyStorageKey(),\n JSON.stringify(this.history.slice(-MAX_STORED_HISTORY))\n )\n } catch {\n // Ignore storage quota or privacy-mode failures and keep the widget usable.\n }\n }\n\n private rememberMessage(entry: ChatHistoryEntry) {\n const text = entry.text.trim()\n if (!text) {\n return\n }\n this.history.push({ role: entry.role, text })\n this.history = this.history.slice(-MAX_STORED_HISTORY)\n this.persistHistory()\n }\n\n private recentHistoryForRequest() {\n return this.history.slice(-MAX_HISTORY_FOR_REQUEST).map((entry) => ({\n role: entry.role,\n text: entry.text,\n }))\n }\n\n private restoreConversationView() {\n if (this.history.length === 0) {\n this.items = [\n {\n id: createConversationId(\"message\"),\n type: \"message\",\n role: \"assistant\",\n text: DEFAULT_GREETING,\n status: \"done\",\n },\n ]\n } else {\n this.items = this.history.map((entry) => ({\n id: createConversationId(\"message\"),\n type: \"message\",\n role: entry.role,\n text: entry.text,\n status: \"done\",\n }))\n }\n\n if (this.activeRun) {\n this.upsertPlanItem(this.activeRun)\n }\n }\n\n private normalizeGuideStep(step: PublicGuideStepPayload): WidgetGuideStepItem {\n return {\n id: step.id,\n position: step.position,\n title: step.title,\n body: step.body,\n targetSelector: step.target_selector ?? null,\n targetLabel: step.target_label ?? null,\n actionKind: step.action_kind ?? null,\n actionPayload: step.action_payload ?? null,\n expectedRoute: step.expected_route ?? null,\n completionMode: step.completion_mode,\n }\n }\n\n private normalizeGuidePayload(\n payload: PublicGuideRuntimePayload | PublicGuideOfferPayload | null\n ): WidgetGuideCardState | null {\n if (!payload) {\n return null\n }\n\n const guide = payload.guide\n return {\n id: guide.id,\n state: payload.state,\n source: guide.source,\n route: guide.route,\n summary: guide.summary ?? null,\n currentStepIndex:\n payload.state === \"started\"\n ? Math.min(payload.current_step_index, Math.max(guide.steps.length - 1, 0))\n : payload.state === \"completed\"\n ? guide.steps.length\n : 0,\n totalSteps: guide.steps.length,\n steps: guide.steps.map((step) => this.normalizeGuideStep(step)),\n }\n }\n\n private setGuideState(\n payload: PublicGuideRuntimePayload | PublicGuideOfferPayload | null,\n options?: { clearIfFinished?: boolean }\n ) {\n const normalized = this.normalizeGuidePayload(payload)\n if (\n options?.clearIfFinished !== false &&\n normalized &&\n (normalized.state === \"dismissed\" || normalized.state === \"completed\")\n ) {\n this.activeGuide = null\n } else {\n this.activeGuide = normalized\n }\n this.renderReactApp()\n this.syncGuideHighlight()\n }\n\n private currentGuideStep() {\n if (!this.activeGuide || this.activeGuide.state !== \"started\") {\n return null\n }\n return (\n this.activeGuide.steps[\n Math.min(this.activeGuide.currentStepIndex, Math.max(this.activeGuide.steps.length - 1, 0))\n ] ?? null\n )\n }\n\n private syncGuideHighlight() {\n const step = this.currentGuideStep()\n if (!step?.targetSelector || !this.registry) {\n return\n }\n this.registry.highlightTargets(\n [{ selector: step.targetSelector, label: step.targetLabel || step.title }],\n { interaction: step.actionKind ? \"execute\" : \"explain\", durationMs: 2100 }\n )\n }\n\n private updateActionState(id: string, state: WidgetActionConversationItem[\"state\"]) {\n this.items = this.items.map((item) =>\n item.type === \"action\" && item.id === id ? { ...item, state } : item\n )\n this.renderReactApp()\n }\n\n private planItemId(runId: string) {\n return `plan_${runId}`\n }\n\n private upsertPlanItem(run: GoalRunPreview, progressLabel?: string | null) {\n const existingPlanItem = this.items.find(\n (item) => item.type === \"plan\" && item.id === this.planItemId(run.id)\n )\n const isNewActiveRun = Boolean(this.activeRun?.id && this.activeRun.id !== run.id)\n if (isNewActiveRun) {\n this.executedToolCounts.clear()\n this.items = this.items.map((item) => {\n if (item.type !== \"plan\" || item.id === this.planItemId(run.id)) {\n return item\n }\n if (item.status === \"completed\" || item.status === \"failed\" || item.status === \"abandoned\") {\n return item\n }\n return {\n ...item,\n status: \"abandoned\",\n approvalState: \"declined\",\n progressLabel: item.progressLabel ?? \"План заменён новым запросом.\",\n statusReason: item.statusReason ?? \"План заменён новым запросом.\",\n }\n })\n }\n this.activeRun = {\n ...run,\n progress_label: progressLabel ?? run.progress_label ?? null,\n }\n\n const nextPlanItem: WidgetPlanConversationItem = {\n id: this.planItemId(run.id),\n type: \"plan\",\n goal: run.goal,\n status: run.status,\n progressLabel: progressLabel ?? run.progress_label ?? null,\n statusReason: run.status_reason ?? null,\n expectedRoute: run.expected_route ?? null,\n loopGuarded: run.loop_guarded ?? false,\n currentStepIndex:\n run.status === \"completed\"\n ? run.total_steps\n : Math.min(run.total_steps, run.current_step_index + 1),\n totalSteps: run.total_steps,\n approvalState: run.requires_approval\n ? \"pending\"\n : run.status === \"abandoned\"\n ? \"declined\"\n : existingPlanItem && existingPlanItem.type === \"plan\" && existingPlanItem.approvalState === \"declined\"\n ? \"declined\"\n : \"approved\",\n steps: run.steps.map((step) => ({\n id: step.id,\n title: step.title,\n status: step.status,\n kind: step.kind,\n })),\n }\n\n const existingIndex = this.items.findIndex(\n (item) => item.type === \"plan\" && item.id === nextPlanItem.id\n )\n\n if (existingIndex >= 0) {\n this.items = this.items.map((item, index) => (index === existingIndex ? nextPlanItem : item))\n } else {\n this.items = [...this.items, nextPlanItem]\n }\n\n this.renderReactApp()\n }\n\n private removeEmptyMessage(id: string | null) {\n if (!id) {\n return\n }\n this.items = this.items.filter(\n (item) => !(item.type === \"message\" && item.id === id && item.text.trim().length === 0)\n )\n }\n\n private resolveConfirmation(value: boolean) {\n if (this.confirmItemId) {\n this.updateActionState(this.confirmItemId, value ? \"approved\" : \"declined\")\n }\n\n if (this.confirmResolve) {\n const resolve = this.confirmResolve\n this.confirmResolve = null\n this.confirmItemId = null\n resolve(value)\n }\n }\n\n private async confirmToolExecution(request: {\n displayName: string\n targetSummary: string\n arguments: Record<string, unknown>\n }) {\n if (this.minimized) {\n this.setMinimized(false)\n }\n\n if (this.confirmResolve) {\n this.resolveConfirmation(false)\n }\n\n const itemId = createConversationId(\"action\")\n this.items = [\n ...this.items,\n {\n id: itemId,\n type: \"action\",\n displayName: request.displayName,\n targetSummary: request.targetSummary,\n arguments: request.arguments,\n state: \"pending\",\n },\n ]\n this.confirmItemId = itemId\n this.setStatus(`Нужно подтверждение: ${request.displayName}`)\n this.renderReactApp()\n\n return await new Promise<boolean>((resolve) => {\n this.confirmResolve = resolve\n })\n }\n\n private syncRuntimeStatus(nativeRegistered: boolean) {\n if (!this.runtimeStatus) {\n return\n }\n\n const mode: RuntimeMode = nativeRegistered\n ? \"native-webmcp-active\"\n : this.registry\n ? \"blinq-page-tools-active\"\n : \"read-only-fallback\"\n\n this.runtimeStatus = {\n ...this.runtimeStatus,\n mode,\n native_webmcp_supported: nativeRegistered,\n embedded_page_tools_supported: true,\n message: runtimeMessage(mode),\n }\n this.setStatus(this.runtimeStatus.message)\n }\n\n private setStatus(text: string) {\n this.statusText = text\n this.renderReactApp()\n }\n\n private async guideRequest<T>(path: string, body: Record<string, unknown>) {\n if (!this.sessionToken) {\n throw new Error(\"Сессия виджета ещё не инициализирована\")\n }\n const response = await fetch(`${this.apiBaseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.sessionToken}`,\n },\n body: JSON.stringify(body),\n })\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as { detail?: string }\n throw new Error(payload.detail ?? \"Не удалось обновить состояние guide\")\n }\n return (await response.json()) as T\n }\n\n private async startGuide() {\n if (!this.sessionId || !this.activeGuide) {\n return\n }\n const payload = await this.guideRequest<PublicGuideRuntimePayload>(\"/pub/guide/start\", {\n session_id: this.sessionId,\n guide_id: this.activeGuide.source === \"published\" ? this.activeGuide.id : null,\n })\n this.setGuideState(payload, { clearIfFinished: false })\n this.setStatus(\"Guide запущен.\")\n }\n\n private async advanceGuide() {\n if (!this.sessionId) {\n return\n }\n const payload = await this.guideRequest<PublicGuideRuntimePayload>(\"/pub/guide/advance\", {\n session_id: this.sessionId,\n })\n this.setGuideState(payload)\n this.setStatus(payload.state === \"completed\" ? \"Guide завершён.\" : \"Переходим к следующему шагу.\")\n }\n\n private async dismissGuide() {\n if (!this.sessionId) {\n return\n }\n const payload = await this.guideRequest<PublicGuideRuntimePayload>(\"/pub/guide/dismiss\", {\n session_id: this.sessionId,\n })\n this.setGuideState(payload)\n this.setStatus(\"Guide скрыт.\")\n }\n\n private async completeGuide() {\n if (!this.sessionId) {\n return\n }\n const payload = await this.guideRequest<PublicGuideRuntimePayload>(\"/pub/guide/complete\", {\n session_id: this.sessionId,\n })\n this.setGuideState(payload)\n this.setStatus(\"Guide завершён.\")\n }\n\n private async runGuideStep() {\n const step = this.currentGuideStep()\n if (!step || !this.registry) {\n return\n }\n\n if (\n step.actionKind &&\n step.actionPayload &&\n this.currentActionPolicy().actions_enabled &&\n this.currentActionPolicy().action_mode === \"execute_with_confirmation\"\n ) {\n const outcome = await this.registry.executeTool({\n tool_name: step.actionKind,\n display_name: step.title,\n target_summary: step.targetLabel || step.body,\n arguments: step.actionPayload,\n })\n if (outcome.status === \"success\") {\n this.setStatus(\"Шаг выполнен на странице.\")\n const deferredNavigationHref =\n outcome.result &&\n typeof outcome.result.href === \"string\" &&\n outcome.result.deferred_navigation\n ? outcome.result.href\n : null\n await this.advanceGuide()\n if (deferredNavigationHref) {\n window.location.assign(deferredNavigationHref)\n }\n } else if (outcome.status === \"cancelled\") {\n this.setStatus(\"Выполнение шага отменено.\")\n } else {\n await this.healGuideStep()\n }\n return\n }\n\n if (step.targetSelector) {\n const highlighted = this.registry.highlightTargets(\n [{ selector: step.targetSelector, label: step.targetLabel || step.title }],\n { interaction: \"explain\", durationMs: 2200 }\n )\n if (highlighted) {\n this.setStatus(\"Показал, куда нажать на странице.\")\n } else {\n await this.healGuideStep()\n }\n }\n }\n\n private async healGuideStep() {\n if (!this.sessionId || !this.activeGuide || !this.registry) {\n return\n }\n this.setStatus(\"Кажется элемент переехал. Ищу новые способы с помощью ИИ...\")\n const pageContext = this.registry.collectPageContext()\n try {\n const payload = await this.guideRequest<PublicGuideRuntimePayload>(\"/pub/guide/heal\", {\n session_id: this.sessionId,\n step_index: this.activeGuide.currentStepIndex,\n page_context: pageContext,\n })\n this.setGuideState(payload, { clearIfFinished: false })\n this.setStatus(\"Сценарий перестроен. Продолжаю...\")\n // Don't auto run guide step instantly to let user read the status, wait a brief moment.\n window.setTimeout(() => {\n void this.runGuideStep()\n }, 1500)\n } catch (e) {\n this.setStatus(\"Не удалось перестроить шаг.\")\n }\n }\n\n private appendMessage(\n text: string,\n role: \"user\" | \"assistant\",\n options?: {\n persist?: boolean\n status?: \"thinking\" | \"streaming\" | \"done\"\n }\n ) {\n const id = createConversationId(\"message\")\n this.items = [\n ...this.items,\n {\n id,\n type: \"message\",\n role,\n text,\n status: options?.status ?? \"done\",\n },\n ]\n this.renderReactApp()\n if (options?.persist !== false) {\n this.rememberMessage({ role, text })\n }\n return id\n }\n\n private updateMessage(id: string, text: string, status?: \"thinking\" | \"streaming\" | \"done\") {\n this.items = this.items.map((item) =>\n item.type === \"message\" && item.id === id\n ? { ...item, text, status: status ?? item.status }\n : item\n )\n this.renderReactApp()\n }\n\n private latestAssistantMessage() {\n const candidate = [...this.items]\n .reverse()\n .find((item) => item.type === \"message\" && item.role === \"assistant\")\n return candidate && candidate.type === \"message\" ? candidate : null\n }\n\n private finalizeAssistantMessage(text: string, options?: { persist?: boolean }) {\n if (!text.trim()) {\n return\n }\n\n const latestAssistant = this.latestAssistantMessage()\n if (latestAssistant) {\n this.updateMessage(latestAssistant.id, text, \"done\")\n return\n }\n\n this.appendMessage(text, \"assistant\", {\n persist: options?.persist ?? false,\n status: \"done\",\n })\n }\n\n private showThinkingIndicator() {\n if (!this.pendingAssistantIndicator) {\n this.pendingAssistantIndicator = true\n this.renderReactApp()\n }\n }\n\n private hideThinkingIndicator() {\n if (this.pendingAssistantIndicator) {\n this.pendingAssistantIndicator = false\n this.renderReactApp()\n }\n }\n\n private currentPageContext() {\n return this.registry?.collectPageContext() ?? collectNormalizedPageContext()\n }\n\n private currentRoute() {\n return normalizedRouteFromUrl(window.location.href)\n }\n\n private normalizedUserPlanDecision(message: string) {\n const normalized = message.trim().toLowerCase()\n if (!normalized || !this.activeRun?.requires_approval) {\n return null\n }\n if (PLAN_APPROVE_TEXTS.has(normalized)) {\n return true\n }\n if (PLAN_DECLINE_TEXTS.has(normalized)) {\n return false\n }\n return null\n }\n\n private shouldAutoResumeActiveRun() {\n if (!this.activeRun || this.activeRun.status !== \"awaiting_navigation\") {\n return false\n }\n\n const currentRoute = this.currentRoute()\n if (!this.activeRun.expected_route || currentRoute !== this.activeRun.expected_route) {\n if (this.activeRun.status_reason) {\n this.setStatus(this.activeRun.status_reason)\n }\n return false\n }\n\n const nextKey = `${this.activeRun.id}:${currentRoute}`\n if (this.lastAutoResumeKey === nextKey) {\n return false\n }\n this.lastAutoResumeKey = nextKey\n return true\n }\n\n private async handleToolRequest(request: PublicToolRequestPayload): Promise<ToolExecutionOutcome> {\n if (!this.registry) {\n return {\n status: \"error\",\n error: \"Реестр действий страницы недоступен\",\n }\n }\n\n const executionKey = JSON.stringify({\n stepId: request.step_id,\n toolName: request.tool_name,\n arguments: request.arguments,\n route: this.currentRoute(),\n })\n const executionCount = (this.executedToolCounts.get(executionKey) ?? 0) + 1\n this.executedToolCounts.set(executionKey, executionCount)\n if (executionCount > 2) {\n const error = \"Повторяющееся действие на этой странице было остановлено.\"\n this.setStatus(error)\n return {\n status: \"error\",\n error,\n }\n }\n\n this.setStatus(`Ожидается локальное действие: ${request.display_name}`)\n const outcome = await this.registry.executeTool({\n tool_name: request.tool_name,\n display_name: request.display_name,\n target_summary: request.target_summary,\n requires_confirmation: request.requires_confirmation,\n arguments: request.arguments,\n })\n if (outcome.status === \"success\") {\n this.setStatus(`Действие выполнено: ${request.display_name}`)\n } else if (outcome.status === \"cancelled\") {\n this.setStatus(`Действие отменено: ${request.display_name}`)\n } else {\n this.setStatus(outcome.error ?? \"Не удалось выполнить действие на странице.\")\n }\n return outcome\n }\n\n private async streamChatStep(\n path: string,\n body: Record<string, unknown>,\n responseMessageId: string | null,\n accumulatedText = \"\"\n ): Promise<string> {\n if (!this.sessionToken) {\n throw new Error(\"Сессия виджета ещё не инициализирована\")\n }\n\n const response = await fetch(`${this.apiBaseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.sessionToken}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok || !response.body) {\n const payload = (await response.json().catch(() => ({}))) as { detail?: string }\n throw new Error(payload.detail ?? \"Не удалось получить потоковый ответ\")\n }\n\n let nextToolRequest: PublicToolRequestPayload | null = null\n let finalText = accumulatedText\n let deferredNavigationHref: string | null = null\n\n await parseSseStream(response.body, ({ event, data }) => {\n const payload = JSON.parse(data) as {\n text?: string\n message?: string\n }\n\n if (event === \"metadata\") {\n return\n }\n if (event === \"status\") {\n const statusPayload = JSON.parse(data) as PublicStatusPayload\n this.setStatus(statusPayload.label)\n }\n if (event === \"plan\") {\n this.hideThinkingIndicator()\n this.upsertPlanItem(JSON.parse(data) as GoalRunPreview)\n }\n if (event === \"progress\") {\n this.hideThinkingIndicator()\n const progress = JSON.parse(data) as GoalProgressPayload\n this.upsertPlanItem(progress.run, progress.label)\n this.setStatus(progress.label)\n }\n if (event === \"highlight\") {\n const highlight = JSON.parse(data) as HighlightEventPayload\n this.registry?.highlightTargets(highlight.targets ?? [], { interaction: \"explain\" })\n }\n if (event === \"guide\") {\n this.hideThinkingIndicator()\n this.setGuideState(JSON.parse(data) as PublicGuideRuntimePayload | PublicGuideOfferPayload, {\n clearIfFinished: false,\n })\n }\n if (event === \"delta\" && payload.text) {\n const normalizedChunk = normalizeAssistantStreamChunk(finalText, payload.text)\n if (!normalizedChunk && !finalText.trim()) {\n return\n }\n this.hideThinkingIndicator()\n if (!responseMessageId) {\n responseMessageId = this.appendMessage(\"\", \"assistant\", {\n persist: false,\n status: \"thinking\",\n })\n }\n finalText += normalizedChunk\n if (responseMessageId) {\n this.updateMessage(responseMessageId, finalText, \"streaming\")\n }\n }\n if (event === \"tool_request\") {\n this.hideThinkingIndicator()\n nextToolRequest = JSON.parse(data) as PublicToolRequestPayload\n }\n if (event === \"error\") {\n this.hideThinkingIndicator()\n this.setStatus(payload.message ?? \"Ошибка потока виджета.\")\n }\n if (event === \"done\") {\n this.hideThinkingIndicator()\n if (payload.text && !finalText.trim()) {\n finalText = normalizeAssistantFinalText(payload.text)\n if (responseMessageId) {\n this.updateMessage(responseMessageId, finalText, \"done\")\n }\n }\n this.setStatus(\"Готов к следующему сообщению.\")\n }\n })\n\n if (!nextToolRequest) {\n return finalText\n }\n\n const toolRequest = nextToolRequest as PublicToolRequestPayload\n const outcome = await this.handleToolRequest(toolRequest)\n const possibleNavigationHref =\n outcome.status === \"success\" &&\n outcome.result &&\n typeof outcome.result.href === \"string\" &&\n outcome.result.deferred_navigation\n ? outcome.result.href\n : null\n if (possibleNavigationHref) {\n deferredNavigationHref = possibleNavigationHref\n }\n const nextText = await this.streamChatStep(\n \"/pub/chat/tool-result\",\n {\n session_id: this.sessionId,\n tool_call_id: toolRequest.tool_call_id,\n step_id: toolRequest.step_id,\n status: outcome.status,\n result: outcome.result ?? null,\n error: outcome.error ?? null,\n page_context: this.currentPageContext(),\n },\n responseMessageId,\n finalText\n )\n if (deferredNavigationHref) {\n window.location.assign(deferredNavigationHref)\n }\n return nextText\n }\n\n async sendMessage(message: string) {\n if (!this.sessionId || !this.sessionToken) {\n throw new Error(\"Сессия виджета ещё не инициализирована\")\n }\n if (this.isSending) {\n this.setStatus(\"Дождитесь завершения текущего ответа.\")\n return \"\"\n }\n\n this.isSending = true\n this.showThinkingIndicator()\n this.syncVoiceState()\n this.renderReactApp()\n\n const requestHistory = this.recentHistoryForRequest()\n let responseMessageId: string | null = null\n\n try {\n this.appendMessage(message, \"user\")\n const directPlanDecision = this.normalizedUserPlanDecision(message)\n if (directPlanDecision !== null) {\n const finalText = await this.respondToPlan(directPlanDecision, {\n appendAssistantMessage: false,\n manageSendingState: false,\n })\n if (finalText.trim()) {\n this.finalizeAssistantMessage(finalText, { persist: false })\n this.rememberMessage({ role: \"assistant\", text: finalText })\n }\n return finalText\n }\n const finalText = await this.streamChatStep(\n \"/pub/chat\",\n {\n session_id: this.sessionId,\n message,\n history: requestHistory,\n page_context: this.currentPageContext(),\n },\n responseMessageId\n )\n this.finalizeAssistantMessage(finalText, { persist: false })\n if (finalText.trim()) {\n this.rememberMessage({ role: \"assistant\", text: finalText })\n }\n return finalText\n } catch (error) {\n const messageText = error instanceof Error ? error.message : \"Blinq не смог ответить.\"\n this.finalizeAssistantMessage(messageText, { persist: false })\n this.rememberMessage({ role: \"assistant\", text: messageText })\n throw error\n } finally {\n this.hideThinkingIndicator()\n this.isSending = false\n this.syncVoiceState()\n this.renderReactApp()\n }\n }\n\n private async continueActiveRun() {\n if (!this.sessionId || !this.sessionToken || !this.activeRun || this.isSending) {\n return\n }\n if (this.activeRun.status !== \"awaiting_navigation\") {\n return\n }\n if (this.activeRun.expected_route && this.currentRoute() !== this.activeRun.expected_route) {\n this.setStatus(this.activeRun.status_reason ?? \"Жду переход на нужную страницу.\")\n return\n }\n\n this.isSending = true\n this.showThinkingIndicator()\n this.renderReactApp()\n\n try {\n const finalText = await this.streamChatStep(\n \"/pub/chat\",\n {\n session_id: this.sessionId,\n message: \"\",\n continue_active_run: true,\n history: this.recentHistoryForRequest(),\n page_context: this.currentPageContext(),\n },\n null\n )\n this.finalizeAssistantMessage(finalText)\n } finally {\n this.hideThinkingIndicator()\n this.isSending = false\n this.renderReactApp()\n }\n }\n\n async respondToPlan(\n approved: boolean,\n options?: { appendAssistantMessage?: boolean; manageSendingState?: boolean }\n ) {\n if (!this.sessionId || !this.sessionToken || !this.activeRun) {\n return \"\"\n }\n const manageSendingState = options?.manageSendingState ?? true\n if (manageSendingState && this.isSending) {\n return \"\"\n }\n\n if (manageSendingState) {\n this.isSending = true\n this.showThinkingIndicator()\n this.renderReactApp()\n }\n\n try {\n const finalText = await this.streamChatStep(\n \"/pub/plan/approve\",\n {\n session_id: this.sessionId,\n goal_run_id: this.activeRun.id,\n approved,\n page_context: this.currentPageContext(),\n },\n null\n )\n\n if (options?.appendAssistantMessage !== false && finalText.trim()) {\n this.finalizeAssistantMessage(finalText, { persist: false })\n this.rememberMessage({ role: \"assistant\", text: finalText })\n }\n return finalText\n } finally {\n if (manageSendingState) {\n this.hideThinkingIndicator()\n this.isSending = false\n this.renderReactApp()\n }\n }\n }\n\n async endSession() {\n if (!this.sessionId || !this.sessionToken) {\n return\n }\n await fetch(`${this.apiBaseUrl}/pub/session/end`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.sessionToken}`,\n },\n body: JSON.stringify({ session_id: this.sessionId }),\n keepalive: true,\n }).catch(() => undefined)\n if (isBrowser()) {\n window.localStorage.removeItem(this.sessionStorageKey())\n }\n }\n}\n\nexport async function init(options: BlinqWidgetInitOptions) {\n const widget = new BlinqWidget(options)\n return widget.init()\n}\n\nexport async function initFromConfig(\n config: BlinqWidgetConfigFile | { default: BlinqWidgetConfigFile }\n) {\n return init(normalizedConfig(config))\n}\n\nexport async function createBlinqWidget(options: BlinqWidgetInitOptions) {\n return init(options)\n}\n","export interface ActionableElementHint {\n type: \"button\" | \"link\" | \"input\" | \"textarea\" | \"submit\"\n label?: string\n selector: string\n placeholder?: string\n href?: string\n form_selector?: string\n context_text?: string\n input_type?: string\n}\n\nexport type SemanticToolKind =\n | \"add-item\"\n | \"delete-item\"\n | \"toggle-item\"\n | \"clear-completed\"\n | \"open-link\"\n | \"submit-form\"\n | \"activate-element\"\n\nexport interface SemanticToolDescriptor {\n name: string\n kind: SemanticToolKind\n title: string\n description: string\n target_summary: string\n keywords: string[]\n input_schema?: Record<string, unknown>\n default_arguments?: Record<string, unknown>\n metadata?: Record<string, unknown>\n}\n\nexport interface PageFormDescriptor {\n selector: string\n title: string\n context_text?: string\n field_selector?: string\n field_label?: string\n submit_selector?: string\n submit_label?: string\n}\n\nexport interface PageListItemActionDescriptor {\n kind: \"delete-item\" | \"toggle-item\" | \"open-link\"\n selector?: string\n href?: string\n label: string\n target_summary: string\n}\n\nexport interface PageListItemDescriptor {\n selector: string\n title: string\n context_text: string\n actions: PageListItemActionDescriptor[]\n}\n\nexport interface PageGraph {\n forms: PageFormDescriptor[]\n list_items: PageListItemDescriptor[]\n standalone_actions: ActionableElementHint[]\n}\n\nexport interface NormalizedPageContext {\n url: string\n title: string\n selection: string\n visible_text: string\n actionable_elements: ActionableElementHint[]\n page_graph: PageGraph\n semantic_tools: SemanticToolDescriptor[]\n}\n\nconst MAX_VISIBLE_TEXT_LENGTH = 2500\nconst MAX_ACTIONABLE_HINTS = 30\nconst MAX_SEMANTIC_TOOLS = 40\n\nfunction isBrowser() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\"\n}\n\nfunction selectedText() {\n if (!isBrowser()) {\n return \"\"\n }\n return window.getSelection()?.toString().trim() ?? \"\"\n}\n\nfunction visibleText() {\n if (!isBrowser()) {\n return \"\"\n }\n return document.body.innerText.replace(/\\s+/g, \" \").trim().slice(0, MAX_VISIBLE_TEXT_LENGTH)\n}\n\nfunction normalizedText(value: string | null | undefined) {\n return (value ?? \"\").replace(/\\s+/g, \" \").trim()\n}\n\nfunction normalizedWords(...values: Array<string | null | undefined>) {\n return Array.from(\n new Set(\n values\n .flatMap((value) => normalizedText(value).toLowerCase().split(/[^a-zа-я0-9]+/i))\n .filter((part) => part.length >= 2)\n )\n )\n}\n\nfunction escapeSelectorValue(value: string) {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value)\n }\n return value.replace(/[\"\\\\]/g, \"\\\\$&\")\n}\n\nfunction nthOfType(element: Element) {\n let index = 1\n let sibling = element.previousElementSibling\n while (sibling) {\n if (sibling.tagName === element.tagName) {\n index += 1\n }\n sibling = sibling.previousElementSibling\n }\n return index\n}\n\nfunction buildPathSelector(element: Element) {\n const segments: string[] = []\n let current: Element | null = element\n\n while (current && segments.length < 4 && current !== document.body) {\n const tag = current.tagName.toLowerCase()\n segments.unshift(`${tag}:nth-of-type(${nthOfType(current)})`)\n current = current.parentElement\n }\n\n return segments.length > 0 ? `body > ${segments.join(\" > \")}` : null\n}\n\nfunction selectorForElement(element: Element | null): string | null {\n if (!element || !(element instanceof Element)) {\n return null\n }\n\n if (element.id) {\n return `#${escapeSelectorValue(element.id)}`\n }\n\n const dataTestId = element.getAttribute(\"data-testid\")\n if (dataTestId) {\n return `[data-testid=\"${escapeSelectorValue(dataTestId)}\"]`\n }\n\n const name = element.getAttribute(\"name\")\n if (name) {\n return `${element.tagName.toLowerCase()}[name=\"${escapeSelectorValue(name)}\"]`\n }\n\n const ariaLabel = element.getAttribute(\"aria-label\")\n if (ariaLabel) {\n return `${element.tagName.toLowerCase()}[aria-label=\"${escapeSelectorValue(ariaLabel)}\"]`\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLButtonElement\n ) {\n const placeholder = element.getAttribute(\"placeholder\")\n if (placeholder) {\n return `${element.tagName.toLowerCase()}[placeholder=\"${escapeSelectorValue(placeholder)}\"]`\n }\n }\n\n return buildPathSelector(element)\n}\n\nfunction contextTextForElement(element: Element) {\n const contextualContainer =\n element.closest(\"li, tr, [role='listitem'], [data-testid], article, section, form\") ??\n element.parentElement\n\n if (!contextualContainer) {\n return undefined\n }\n\n const text = normalizedText(contextualContainer.textContent)\n if (!text) {\n return undefined\n }\n\n return text.slice(0, 240)\n}\n\nfunction hintFromElement(element: Element): ActionableElementHint | null {\n const selector = selectorForElement(element)\n if (!selector) {\n return null\n }\n\n const formSelector = selectorForElement(element.closest(\"form\"))\n const textContent = normalizedText(element.textContent)\n const contextText = contextTextForElement(element)\n\n if (element instanceof HTMLAnchorElement && element.href) {\n return {\n type: \"link\",\n label: textContent || element.getAttribute(\"aria-label\") || element.href,\n selector,\n href: element.href,\n form_selector: formSelector ?? undefined,\n context_text: contextText,\n }\n }\n\n if (element instanceof HTMLTextAreaElement) {\n return {\n type: \"textarea\",\n label: textContent || element.getAttribute(\"aria-label\") || undefined,\n selector,\n placeholder: element.placeholder || undefined,\n form_selector: formSelector ?? undefined,\n context_text: contextText,\n }\n }\n\n if (element instanceof HTMLInputElement) {\n const type = element.type === \"submit\" ? \"submit\" : \"input\"\n return {\n type,\n label: textContent || element.value || element.getAttribute(\"aria-label\") || undefined,\n selector,\n placeholder: element.placeholder || undefined,\n form_selector: formSelector ?? undefined,\n context_text: contextText,\n input_type: element.type || undefined,\n }\n }\n\n if (element instanceof HTMLButtonElement || element.getAttribute(\"role\") === \"button\") {\n return {\n type: element instanceof HTMLButtonElement && element.type === \"submit\" ? \"submit\" : \"button\",\n label: textContent || element.getAttribute(\"aria-label\") || undefined,\n selector,\n form_selector: formSelector ?? undefined,\n context_text: contextText,\n }\n }\n\n return null\n}\n\nfunction collectActionableElements() {\n if (!isBrowser()) {\n return []\n }\n\n const elements = Array.from(\n document.querySelectorAll(\"button, a[href], input:not([type='hidden']), textarea, [role='button']\")\n )\n\n const hints: ActionableElementHint[] = []\n for (const element of elements) {\n const hint = hintFromElement(element)\n if (!hint) {\n continue\n }\n hints.push(hint)\n if (hints.length >= MAX_ACTIONABLE_HINTS) {\n break\n }\n }\n return hints\n}\n\nfunction slugPart(value: string) {\n return normalizedText(value)\n .toLowerCase()\n .replace(/[^a-zа-я0-9]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48)\n}\n\nfunction hashValue(value: string) {\n let hash = 0\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash * 31 + value.charCodeAt(index)) >>> 0\n }\n return hash.toString(36)\n}\n\nfunction makeToolName(kind: SemanticToolKind, seed: string) {\n const slug = slugPart(seed) || \"target\"\n return `blinq.semantic.${kind}.${slug}.${hashValue(`${kind}:${seed}`)}`\n}\n\nfunction looksLikeAddLabel(value: string) {\n const text = value.toLowerCase()\n return /(добав|add|create|new|созда|қос|енгіз)/.test(text)\n}\n\nfunction looksLikeDeleteLabel(value: string) {\n const text = value.toLowerCase()\n return /(удал|delete|remove|өшір|жой)/.test(text)\n}\n\nfunction looksLikeClearCompletedLabel(value: string) {\n const text = value.toLowerCase()\n return /(очист|clear|тазала).*(выполн|completed|аяқталған)|(completed).*(clear|remove)/.test(text)\n}\n\nfunction looksLikeGenericActionLabel(value: string) {\n const text = value.toLowerCase()\n return /(open|view|edit|archive|start|run|save|send|submit|launch|continue|next|apply|confirm|перейд|открой|посмотр|измен|архив|запуст|сохран|отправ|продолж|далее|примен|подтверд|аш|өт|сақта|жібер|жалғастыр|таңда)/.test(\n text\n )\n}\n\nfunction buttonLikeText(element: Element) {\n if (element instanceof HTMLInputElement) {\n return normalizedText(element.value || element.getAttribute(\"aria-label\"))\n }\n return normalizedText(element.textContent || element.getAttribute(\"aria-label\"))\n}\n\nfunction deriveItemTitle(container: Element) {\n const cloned = container.cloneNode(true) as Element\n cloned.querySelectorAll(\"button, a, [role='button']\").forEach((node) => node.remove())\n const text = normalizedText(cloned.textContent)\n if (text) {\n return text.slice(0, 120)\n }\n return normalizedText(container.textContent).slice(0, 120)\n}\n\nfunction collectForms(): PageFormDescriptor[] {\n if (!isBrowser()) {\n return []\n }\n\n const forms = Array.from(document.querySelectorAll(\"form\")).slice(0, 8)\n const collected: PageFormDescriptor[] = []\n\n for (const form of forms) {\n const selector = selectorForElement(form)\n if (!selector) {\n continue\n }\n const field = form.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input:not([type='hidden']):not([type='checkbox']):not([type='radio']):not([type='submit']), textarea\"\n )\n const submit = form.querySelector<HTMLButtonElement | HTMLInputElement>(\n \"button[type='submit'], input[type='submit'], button:not([type])\"\n )\n const fieldSelector = selectorForElement(field)\n const submitSelector = selectorForElement(submit)\n const fieldLabel =\n normalizedText(field?.getAttribute(\"aria-label\")) ||\n normalizedText(field?.getAttribute(\"placeholder\")) ||\n normalizedText(field?.getAttribute(\"name\"))\n const submitLabel = submit ? buttonLikeText(submit) : \"\"\n const title = submitLabel || fieldLabel || normalizedText(form.getAttribute(\"aria-label\")) || selector\n\n collected.push({\n selector,\n title,\n context_text: contextTextForElement(form),\n field_selector: fieldSelector ?? undefined,\n field_label: fieldLabel || undefined,\n submit_selector: submitSelector ?? undefined,\n submit_label: submitLabel || undefined,\n })\n }\n\n return collected\n}\n\nfunction collectListItems(): PageListItemDescriptor[] {\n if (!isBrowser()) {\n return []\n }\n\n const candidates = Array.from(\n document.querySelectorAll(\"li, [role='listitem'], tr, [data-testid='todo-item']\")\n ).slice(0, 20)\n\n const items: PageListItemDescriptor[] = []\n for (const container of candidates) {\n const selector = selectorForElement(container)\n if (!selector) {\n continue\n }\n\n const contextText = normalizedText(container.textContent)\n if (!contextText) {\n continue\n }\n\n const actions: PageListItemActionDescriptor[] = []\n\n const toggleControl = container.querySelector<HTMLInputElement>(\"input[type='checkbox']\")\n const toggleSelector = selectorForElement(toggleControl)\n if (toggleSelector) {\n actions.push({\n kind: \"toggle-item\",\n selector: toggleSelector,\n label: \"Отметить задачу\",\n target_summary: contextText.slice(0, 160),\n })\n }\n\n const deleteButton = Array.from(\n container.querySelectorAll<HTMLButtonElement | HTMLAnchorElement | HTMLInputElement>(\n \"button, a, input[type='button'], input[type='submit']\"\n )\n ).find((element) => looksLikeDeleteLabel(buttonLikeText(element)))\n const deleteSelector = selectorForElement(deleteButton ?? null)\n if (deleteSelector) {\n actions.push({\n kind: \"delete-item\",\n selector: deleteSelector,\n label: buttonLikeText(deleteButton ?? container) || \"Удалить элемент\",\n target_summary: contextText.slice(0, 160),\n })\n }\n\n const openLink = Array.from(container.querySelectorAll<HTMLAnchorElement>(\"a[href]\"))[0]\n const openSelector = selectorForElement(openLink)\n if (openSelector && openLink?.href) {\n actions.push({\n kind: \"open-link\",\n selector: openSelector,\n href: openLink.href,\n label: buttonLikeText(openLink) || openLink.href,\n target_summary: contextText.slice(0, 160),\n })\n }\n\n if (actions.length === 0) {\n continue\n }\n\n items.push({\n selector,\n title: deriveItemTitle(container),\n context_text: contextText.slice(0, 160),\n actions,\n })\n }\n\n return items\n}\n\nfunction collectSemanticTools(\n actionableElements: ActionableElementHint[],\n pageGraph: PageGraph\n): SemanticToolDescriptor[] {\n const tools: SemanticToolDescriptor[] = []\n const usedSelectors = new Set<string>()\n const usedHrefs = new Set<string>()\n\n for (const form of pageGraph.forms) {\n if (form.field_selector && (form.submit_selector || form.selector)) {\n const submitSeed = `${form.selector}:${form.submit_selector ?? form.title}`\n if (looksLikeAddLabel(form.submit_label || form.title)) {\n tools.push({\n name: makeToolName(\"add-item\", submitSeed),\n kind: \"add-item\",\n title: \"Добавить элемент\",\n description: `Добавить новый элемент через ${form.title}.`,\n target_summary: form.context_text || form.title,\n keywords: normalizedWords(form.title, form.field_label, form.submit_label, \"add create new добавить создать қос енгіз\"),\n input_schema: {\n type: \"object\",\n properties: {\n value: { type: \"string\" },\n },\n required: [\"value\"],\n },\n metadata: {\n field_selector: form.field_selector,\n submit_selector: form.submit_selector,\n form_selector: form.selector,\n field_label: form.field_label,\n },\n })\n }\n\n if (form.submit_selector) {\n usedSelectors.add(form.submit_selector)\n tools.push({\n name: makeToolName(\"submit-form\", submitSeed),\n kind: \"submit-form\",\n title: form.submit_label ? `Отправить: ${form.submit_label}` : \"Отправить форму\",\n description: `Отправить форму ${form.title}.`,\n target_summary: form.context_text || form.title,\n keywords: normalizedWords(form.title, form.submit_label, \"submit send save отправить сохранить сақта жібер\"),\n metadata: {\n selector: form.selector,\n submit_selector: form.submit_selector,\n form_selector: form.selector,\n },\n })\n }\n\n usedSelectors.add(form.selector)\n if (form.field_selector) {\n usedSelectors.add(form.field_selector)\n }\n }\n }\n\n for (const item of pageGraph.list_items) {\n for (const action of item.actions) {\n const seed = `${item.selector}:${action.kind}:${action.selector ?? action.href ?? item.title}`\n if (action.kind === \"delete-item\" && action.selector) {\n usedSelectors.add(action.selector)\n tools.push({\n name: makeToolName(\"delete-item\", seed),\n kind: \"delete-item\",\n title: `Удалить: ${item.title}`,\n description: `Удалить элемент ${item.title}.`,\n target_summary: item.context_text,\n keywords: normalizedWords(item.title, item.context_text, action.label, \"delete remove удалить өшір жой\"),\n metadata: {\n selector: action.selector,\n item_title: item.title,\n item_context: item.context_text,\n },\n })\n }\n\n if (action.kind === \"toggle-item\" && action.selector) {\n usedSelectors.add(action.selector)\n tools.push({\n name: makeToolName(\"toggle-item\", seed),\n kind: \"toggle-item\",\n title: `Изменить статус: ${item.title}`,\n description: `Переключить состояние выполнения для ${item.title}.`,\n target_summary: item.context_text,\n keywords: normalizedWords(item.title, item.context_text, \"toggle complete check uncheck отметить выполнить белгіле аяқта\"),\n metadata: {\n selector: action.selector,\n item_title: item.title,\n item_context: item.context_text,\n },\n })\n }\n\n if (action.kind === \"open-link\" && action.href) {\n if (action.selector) {\n usedSelectors.add(action.selector)\n }\n usedHrefs.add(action.href)\n tools.push({\n name: makeToolName(\"open-link\", seed),\n kind: \"open-link\",\n title: `Открыть: ${item.title}`,\n description: `Открыть ссылку для ${item.title}.`,\n target_summary: item.context_text,\n keywords: normalizedWords(item.title, item.context_text, action.label, action.href, \"open link перейти открыть аш өту\"),\n metadata: {\n href: action.href,\n selector: action.selector,\n },\n })\n }\n }\n }\n\n for (const hint of actionableElements) {\n const label = normalizedText(hint.label)\n const contextText = normalizedText(hint.context_text)\n const selector = hint.selector\n\n if (usedSelectors.has(selector)) {\n continue\n }\n\n if (hint.type === \"button\" && label && looksLikeClearCompletedLabel(`${label} ${hint.context_text ?? \"\"}`)) {\n usedSelectors.add(selector)\n tools.push({\n name: makeToolName(\"clear-completed\", `${selector}:${label}`),\n kind: \"clear-completed\",\n title: label,\n description: `Очистить выполненные элементы через ${label}.`,\n target_summary: hint.context_text || label,\n keywords: normalizedWords(label, hint.context_text, \"clear completed очистить выполненные тазалау аяқталған\"),\n metadata: {\n selector,\n },\n })\n }\n\n if (hint.type === \"link\" && hint.href) {\n if (usedHrefs.has(hint.href)) {\n continue\n }\n usedSelectors.add(selector)\n usedHrefs.add(hint.href)\n tools.push({\n name: makeToolName(\"open-link\", `${selector}:${hint.href}`),\n kind: \"open-link\",\n title: label || hint.href,\n description: `Открыть ссылку ${label || hint.href}.`,\n target_summary: hint.context_text || label || hint.href,\n keywords: normalizedWords(label, hint.href, hint.context_text, \"open link перейти открыть аш өту\"),\n metadata: {\n href: hint.href,\n selector,\n },\n })\n }\n\n if (hint.type === \"input\" && hint.input_type === \"checkbox\") {\n usedSelectors.add(selector)\n tools.push({\n name: makeToolName(\"toggle-item\", `${selector}:${label}:${contextText}`),\n kind: \"toggle-item\",\n title: label || \"Переключить флажок\",\n description: `Переключить чекбокс или переключатель ${label || selector}.`,\n target_summary: contextText || label || selector,\n keywords: normalizedWords(label, contextText, \"toggle complete check uncheck enable disable включи выключи отметь сними\"),\n metadata: {\n selector,\n item_title: label || contextText || selector,\n item_context: contextText || label || selector,\n },\n })\n }\n\n if (hint.type === \"submit\" && (hint.form_selector || selector)) {\n usedSelectors.add(selector)\n if (hint.form_selector) {\n usedSelectors.add(hint.form_selector)\n }\n tools.push({\n name: makeToolName(\"submit-form\", `${hint.form_selector ?? selector}:${label || contextText}`),\n kind: \"submit-form\",\n title: label || \"Отправить форму\",\n description: `Отправить форму через ${label || selector}.`,\n target_summary: contextText || label || selector,\n keywords: normalizedWords(label, contextText, \"submit send save отправить сохранить сақта жібер\"),\n metadata: {\n selector: hint.form_selector || selector,\n submit_selector: selector,\n form_selector: hint.form_selector || selector,\n },\n })\n }\n\n if (\n hint.type === \"button\" &&\n label &&\n !looksLikeDeleteLabel(`${label} ${contextText}`) &&\n !looksLikeClearCompletedLabel(`${label} ${contextText}`) &&\n looksLikeGenericActionLabel(`${label} ${contextText}`)\n ) {\n usedSelectors.add(selector)\n tools.push({\n name: makeToolName(\"activate-element\", `${selector}:${label}:${contextText}`),\n kind: \"activate-element\",\n title: label,\n description: `Выполнить действие страницы: ${label}.`,\n target_summary: contextText || label,\n keywords: normalizedWords(label, contextText, \"click press activate нажми кликни бас таңда\"),\n metadata: {\n selector,\n label,\n },\n })\n }\n }\n\n return tools.slice(0, MAX_SEMANTIC_TOOLS)\n}\n\nexport function collectNormalizedPageContext(): NormalizedPageContext {\n const actionableElements = collectActionableElements()\n const pageGraph: PageGraph = {\n forms: collectForms(),\n list_items: collectListItems(),\n standalone_actions: actionableElements.filter(\n (hint) =>\n hint.type === \"button\" ||\n hint.type === \"submit\" ||\n (hint.type === \"input\" && hint.input_type === \"checkbox\")\n ),\n }\n const semanticTools = collectSemanticTools(actionableElements, pageGraph)\n\n return {\n url: isBrowser() ? window.location.href : \"\",\n title: isBrowser() ? document.title : \"\",\n selection: selectedText(),\n visible_text: visibleText(),\n actionable_elements: actionableElements,\n page_graph: pageGraph,\n semantic_tools: semanticTools,\n }\n}\n","import {\n collectNormalizedPageContext,\n type NormalizedPageContext,\n type SemanticToolDescriptor,\n} from \"./page-capabilities\"\n\nexport type RuntimeMode =\n | \"native-webmcp-active\"\n | \"blinq-page-tools-active\"\n | \"read-only-fallback\"\n\nexport interface ToolCapability {\n name: string\n description: string\n read_only: boolean\n}\n\nexport interface ActionPolicy {\n actions_enabled: boolean\n action_mode: \"guide_only\" | \"execute_with_confirmation\"\n pointer_overlay_enabled: boolean\n}\n\nexport interface RuntimeCapability {\n mode: RuntimeMode\n native_webmcp_supported: boolean\n embedded_page_tools_supported: boolean\n write_requires_confirmation: boolean\n tool_capabilities: ToolCapability[]\n action_policy: ActionPolicy\n}\n\nexport type {\n ActionableElementHint,\n NormalizedPageContext,\n PageGraph,\n PageFormDescriptor,\n PageListItemDescriptor,\n SemanticToolDescriptor,\n} from \"./page-capabilities\"\nexport { collectNormalizedPageContext } from \"./page-capabilities\"\n\nexport interface ToolExecutionRequest {\n tool_name: string\n display_name?: string\n target_summary?: string\n requires_confirmation?: boolean\n arguments: Record<string, unknown>\n}\n\nexport interface ToolExecutionOutcome {\n status: \"success\" | \"cancelled\" | \"error\"\n result?: Record<string, unknown>\n error?: string\n}\n\nexport interface PageHighlightTarget {\n selector: string\n label?: string\n}\n\nexport interface HighlightTargetsOptions {\n durationMs?: number\n interaction?: \"explain\" | \"execute\"\n}\n\ninterface NativeModelContextTool {\n name: string\n description: string\n inputSchema?: Record<string, unknown>\n annotations?: {\n readOnlyHint?: boolean\n }\n execute: (input: Record<string, unknown>) => Promise<unknown>\n}\n\ninterface NativeModelContext {\n registerTool: (\n tool: NativeModelContextTool,\n options?: {\n signal?: AbortSignal\n }\n ) => void\n}\n\ntype NavigatorWithModelContext = Navigator & {\n modelContext?: NativeModelContext\n}\n\ntype ToolDefinition = {\n capability: ToolCapability\n inputSchema?: Record<string, unknown>\n describeTarget?: (input: Record<string, unknown>) => string\n execute: (input: Record<string, unknown>) => Promise<Record<string, unknown>>\n}\n\ntype ConfirmationHandler = (request: {\n displayName: string\n targetSummary: string\n arguments: Record<string, unknown>\n}) => Promise<boolean>\n\nconst DEFAULT_ACTION_POLICY: ActionPolicy = {\n actions_enabled: true,\n action_mode: \"execute_with_confirmation\",\n pointer_overlay_enabled: true,\n}\nconst GUIDANCE_SAFE_TOOL_NAMES = new Set([\"blinq.scroll_to_element\"])\n\nfunction isBrowser() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\"\n}\n\nfunction selectedText() {\n if (!isBrowser()) {\n return \"\"\n }\n return window.getSelection()?.toString().trim() ?? \"\"\n}\n\nfunction normalizedText(value: string | null | undefined) {\n return (value ?? \"\").replace(/\\s+/g, \" \").trim()\n}\n\nfunction setFormFieldValue(\n target: HTMLInputElement | HTMLTextAreaElement,\n value: string\n) {\n const prototype =\n target instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype\n const descriptor = Object.getOwnPropertyDescriptor(prototype, \"value\")\n\n if (descriptor?.set) {\n descriptor.set.call(target, value)\n return\n }\n\n target.value = value\n}\n\nfunction associatedForm(target: HTMLElement) {\n return target instanceof HTMLFormElement ? target : (target.closest(\"form\") as HTMLFormElement | null)\n}\n\nfunction submitAssociatedForm(target: HTMLElement) {\n const form = associatedForm(target)\n\n if (!form) {\n throw new Error(\"Не найдена форма для выбранного элемента\")\n }\n\n const isSubmitter =\n target instanceof HTMLButtonElement ||\n (target instanceof HTMLInputElement && target.type === \"submit\")\n\n if (typeof form.requestSubmit === \"function\") {\n if (isSubmitter) {\n form.requestSubmit(target as HTMLButtonElement | HTMLInputElement)\n } else {\n form.requestSubmit()\n }\n return\n }\n\n const submitEvent = new Event(\"submit\", { bubbles: true, cancelable: true })\n const shouldContinue = form.dispatchEvent(submitEvent)\n if (shouldContinue) {\n form.submit()\n }\n}\n\nasync function waitForDomSettle() {\n await new Promise((resolve) => window.setTimeout(resolve, 80))\n}\n\nfunction bodyTextIncludes(query: string) {\n if (!isBrowser()) {\n return false\n }\n const haystack = normalizedText(document.body.innerText).toLowerCase()\n return haystack.includes(normalizedText(query).toLowerCase())\n}\n\nasync function verifyFormSubmission(target: HTMLElement) {\n const form = associatedForm(target)\n if (!form) {\n throw new Error(\"Не найдена форма для проверки результата\")\n }\n\n const successSelector = normalizedText(form.dataset.blinqSuccessSelector)\n const successText = normalizedText(form.dataset.blinqSuccessText)\n\n if (successSelector) {\n const successTarget = document.querySelector<HTMLElement>(successSelector)\n if (!successTarget) {\n throw new Error(`Не найден элемент подтверждения: ${successSelector}`)\n }\n\n const content = normalizedText(successTarget.textContent || successTarget.innerText)\n if (successText && !content.toLowerCase().includes(successText.toLowerCase())) {\n throw new Error(\"Форма отправлена, но подтверждение сохранения не появилось\")\n }\n\n return {\n submitted: true,\n verified: true,\n success_selector: successSelector,\n success_text: content,\n }\n }\n\n if (successText) {\n if (!bodyTextIncludes(successText)) {\n throw new Error(\"Форма отправлена, но ожидаемый текст подтверждения не найден\")\n }\n\n return {\n submitted: true,\n verified: true,\n success_text: successText,\n }\n }\n\n return { submitted: true }\n}\n\nfunction findTarget(selector: string) {\n const target = document.querySelector<HTMLElement>(selector)\n if (!target) {\n throw new Error(`Элемент не найден: ${selector}`)\n }\n return target\n}\n\nfunction shouldRequestConfirmation(toolName: string, readOnly: boolean) {\n if (readOnly) {\n return false\n }\n return !GUIDANCE_SAFE_TOOL_NAMES.has(toolName)\n}\n\nfunction isDuplicateNativeToolError(error: unknown) {\n if (!(error instanceof Error)) {\n return false\n }\n const message = error.message.toLowerCase()\n return (\n message.includes(\"duplicate tool name\") ||\n message.includes(\"already registered\") ||\n message.includes(\"already exists\")\n )\n}\n\nfunction metadataString(\n descriptor: SemanticToolDescriptor,\n key: string\n) {\n const value = descriptor.metadata?.[key]\n return typeof value === \"string\" ? value : \"\"\n}\n\nfunction buildSemanticToolDefinition(\n descriptor: SemanticToolDescriptor\n): ToolDefinition | null {\n const summary = descriptor.target_summary || descriptor.description\n\n if (descriptor.kind === \"add-item\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n inputSchema: descriptor.input_schema,\n describeTarget: () => summary,\n execute: async (input) => {\n const fieldSelector = metadataString(descriptor, \"field_selector\")\n const submitSelector = metadataString(descriptor, \"submit_selector\")\n const formSelector = metadataString(descriptor, \"form_selector\")\n const value = String(input.value ?? \"\").trim()\n\n if (!fieldSelector || !value) {\n throw new Error(\"Для добавления нужен селектор поля и значение\")\n }\n\n const fieldTarget = findTarget(fieldSelector) as HTMLInputElement | HTMLTextAreaElement\n fieldTarget.focus()\n setFormFieldValue(fieldTarget, value)\n fieldTarget.dispatchEvent(new Event(\"input\", { bubbles: true }))\n fieldTarget.dispatchEvent(new Event(\"change\", { bubbles: true }))\n\n const submitTarget = submitSelector\n ? findTarget(submitSelector)\n : formSelector\n ? findTarget(formSelector)\n : fieldTarget\n submitAssociatedForm(submitTarget)\n await waitForDomSettle()\n\n if (!bodyTextIncludes(value)) {\n throw new Error(`Не удалось подтвердить, что элемент \"${value}\" появился на странице`)\n }\n\n return { success: true, value, verified: true }\n },\n }\n }\n\n if (descriptor.kind === \"delete-item\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const selector = metadataString(descriptor, \"selector\")\n const itemTitle = metadataString(descriptor, \"item_title\") || summary\n findTarget(selector).click()\n await waitForDomSettle()\n\n if (itemTitle && bodyTextIncludes(itemTitle)) {\n throw new Error(`Элемент \"${itemTitle}\" всё ещё виден после удаления`)\n }\n\n return { success: true, verified: true }\n },\n }\n }\n\n if (descriptor.kind === \"toggle-item\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const selector = metadataString(descriptor, \"selector\")\n const target = findTarget(selector)\n if (!(target instanceof HTMLInputElement) || target.type !== \"checkbox\") {\n throw new Error(\"Для переключения нужен селектор чекбокса\")\n }\n\n const before = target.checked\n target.click()\n await waitForDomSettle()\n\n if (target.checked === before) {\n throw new Error(\"Состояние чекбокса не изменилось\")\n }\n\n return { success: true, checked: target.checked, verified: true }\n },\n }\n }\n\n if (descriptor.kind === \"clear-completed\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const selector = metadataString(descriptor, \"selector\")\n const checkedBefore = document.querySelectorAll<HTMLInputElement>(\"input[type='checkbox']:checked\").length\n findTarget(selector).click()\n await waitForDomSettle()\n const checkedAfter = document.querySelectorAll<HTMLInputElement>(\"input[type='checkbox']:checked\").length\n\n if (checkedAfter >= checkedBefore && checkedBefore > 0) {\n throw new Error(\"Выполненные элементы не были очищены\")\n }\n\n return { success: true, checked_before: checkedBefore, checked_after: checkedAfter, verified: true }\n },\n }\n }\n\n if (descriptor.kind === \"open-link\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const href = metadataString(descriptor, \"href\")\n if (!href) {\n throw new Error(\"Для открытия ссылки нужен адрес href\")\n }\n return { success: true, href, deferred_navigation: true }\n },\n }\n }\n\n if (descriptor.kind === \"submit-form\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const selector = metadataString(descriptor, \"form_selector\") || metadataString(descriptor, \"selector\")\n const target = findTarget(selector)\n submitAssociatedForm(target)\n await waitForDomSettle()\n return { success: true, selector, ...(await verifyFormSubmission(target)) }\n },\n }\n }\n\n if (descriptor.kind === \"activate-element\") {\n return {\n capability: {\n name: descriptor.name,\n description: descriptor.description,\n read_only: false,\n },\n describeTarget: () => summary,\n execute: async () => {\n const selector = metadataString(descriptor, \"selector\")\n findTarget(selector).click()\n return { success: true, selector }\n },\n }\n }\n\n return null\n}\n\nfunction selectorFromArguments(argumentsPayload: Record<string, unknown>) {\n for (const key of [\"selector\", \"field_selector\", \"submit_selector\", \"form_selector\"]) {\n const value = argumentsPayload[key]\n if (typeof value === \"string\" && value.trim()) {\n return value.trim()\n }\n }\n return null\n}\n\nexport function detectNativeWebMcpSupport() {\n if (!isBrowser() || !window.isSecureContext) {\n return false\n }\n const navigatorWithModelContext = navigator as NavigatorWithModelContext\n return typeof navigatorWithModelContext.modelContext?.registerTool === \"function\"\n}\n\nexport class PageToolRegistry {\n private readonly confirmationHandler: ConfirmationHandler\n private readonly tools = new Map<string, ToolDefinition>()\n private readonly nativeRegistrations: AbortController[] = []\n private latestPageContext: NormalizedPageContext | null = null\n private nativeToolsActive = false\n private highlightLayer: HTMLDivElement | null = null\n private highlightTimer: number | null = null\n private actionPolicy: ActionPolicy = { ...DEFAULT_ACTION_POLICY }\n\n constructor(confirmationHandler: ConfirmationHandler) {\n this.confirmationHandler = confirmationHandler\n this.refreshToolCatalog()\n }\n\n setActionPolicy(nextPolicy?: Partial<ActionPolicy>) {\n this.actionPolicy = {\n ...DEFAULT_ACTION_POLICY,\n ...nextPolicy,\n }\n }\n\n private buildBaseTools() {\n const tools = new Map<string, ToolDefinition>()\n\n tools.set(\"blinq.read_visible_page_context\", {\n capability: {\n name: \"blinq.read_visible_page_context\",\n description: \"Прочитать текущий URL, заголовок страницы, видимый текст и каталог действий.\",\n read_only: true,\n },\n execute: async () => ({ page_context: this.collectPageContext() }),\n })\n\n tools.set(\"blinq.read_selection\", {\n capability: {\n name: \"blinq.read_selection\",\n description: \"Прочитать текст, который сейчас выделен на странице.\",\n read_only: true,\n },\n execute: async () => ({ selection: selectedText() }),\n })\n\n tools.set(\"blinq.highlight_element\", {\n capability: {\n name: \"blinq.highlight_element\",\n description: \"Подсветить элемент страницы по CSS-селектору, чтобы показать пользователю, о чём идёт речь.\",\n read_only: true,\n },\n inputSchema: {\n type: \"object\",\n properties: {\n selector: { type: \"string\" },\n label: { type: \"string\" },\n },\n required: [\"selector\"],\n },\n describeTarget: (input) => `Подсветить элемент: ${String(input.selector ?? \"\")}`,\n execute: async (input) => {\n const selector = String(input.selector ?? \"\")\n const label = String(input.label ?? \"\").trim() || undefined\n const highlighted = this.highlightTargets([{ selector, label }])\n if (!highlighted) {\n throw new Error(`Не удалось подсветить элемент: ${selector}`)\n }\n return { success: true, selector, label: label ?? null }\n },\n })\n\n tools.set(\"blinq.scroll_to_element\", {\n capability: {\n name: \"blinq.scroll_to_element\",\n description: \"Прокрутить страницу к первому элементу по CSS-селектору.\",\n read_only: false,\n },\n inputSchema: { type: \"object\", properties: { selector: { type: \"string\" } }, required: [\"selector\"] },\n describeTarget: (input) => `Прокрутка к элементу: ${String(input.selector ?? \"\")}`,\n execute: async (input) => {\n const selector = String(input.selector ?? \"\")\n const target = findTarget(selector)\n target.scrollIntoView({ behavior: \"smooth\", block: \"center\" })\n return { success: true, selector }\n },\n })\n\n tools.set(\"blinq.click_element\", {\n capability: {\n name: \"blinq.click_element\",\n description: \"Нажать первую подходящую кнопку, ссылку или интерактивный элемент.\",\n read_only: false,\n },\n inputSchema: { type: \"object\", properties: { selector: { type: \"string\" } }, required: [\"selector\"] },\n describeTarget: (input) => `Нажать элемент: ${String(input.selector ?? \"\")}`,\n execute: async (input) => {\n const selector = String(input.selector ?? \"\")\n const target = findTarget(selector)\n const isSubmitButton = target instanceof HTMLButtonElement && target.type === \"submit\"\n const isSubmitInput = target instanceof HTMLInputElement && target.type === \"submit\"\n if (isSubmitButton || isSubmitInput) {\n submitAssociatedForm(target)\n await waitForDomSettle()\n return { success: true, selector, ...(await verifyFormSubmission(target)) }\n }\n target.click()\n await waitForDomSettle()\n return { success: true, selector }\n },\n })\n\n tools.set(\"blinq.fill_field\", {\n capability: {\n name: \"blinq.fill_field\",\n description: \"Заполнить поле ввода или textarea по CSS-селектору.\",\n read_only: false,\n },\n inputSchema: {\n type: \"object\",\n properties: {\n selector: { type: \"string\" },\n value: { type: \"string\" },\n },\n required: [\"selector\", \"value\"],\n },\n describeTarget: (input) =>\n `Заполнить ${String(input.selector ?? \"\")} значением \"${String(input.value ?? \"\")}\"`,\n execute: async (input) => {\n const selector = String(input.selector ?? \"\")\n const value = String(input.value ?? \"\")\n const target = findTarget(selector) as HTMLInputElement | HTMLTextAreaElement\n target.focus()\n setFormFieldValue(target, value)\n target.dispatchEvent(new Event(\"input\", { bubbles: true }))\n target.dispatchEvent(new Event(\"change\", { bubbles: true }))\n await waitForDomSettle()\n return { success: true, selector, value, verified: target.value === value }\n },\n })\n\n tools.set(\"blinq.submit_form\", {\n capability: {\n name: \"blinq.submit_form\",\n description: \"Отправить ближайшую форму для выбранного селектора.\",\n read_only: false,\n },\n inputSchema: { type: \"object\", properties: { selector: { type: \"string\" } }, required: [\"selector\"] },\n describeTarget: (input) => `Отправить форму рядом с ${String(input.selector ?? \"\")}`,\n execute: async (input) => {\n const selector = String(input.selector ?? \"\")\n const target = findTarget(selector)\n submitAssociatedForm(target)\n await waitForDomSettle()\n return { success: true, selector, ...(await verifyFormSubmission(target)) }\n },\n })\n\n tools.set(\"blinq.open_link\", {\n capability: {\n name: \"blinq.open_link\",\n description: \"Открыть URL в текущей вкладке.\",\n read_only: false,\n },\n inputSchema: { type: \"object\", properties: { href: { type: \"string\" } }, required: [\"href\"] },\n describeTarget: (input) => `Открыть ${String(input.href ?? \"\")}`,\n execute: async (input) => {\n const href = String(input.href ?? \"\")\n if (!href) {\n throw new Error(\"Нужен адрес ссылки\")\n }\n return { success: true, href, deferred_navigation: true }\n },\n })\n\n return tools\n }\n\n private refreshToolCatalog() {\n const pageContext = collectNormalizedPageContext()\n const tools = this.buildBaseTools()\n\n for (const descriptor of pageContext.semantic_tools) {\n const tool = buildSemanticToolDefinition(descriptor)\n if (tool) {\n tools.set(descriptor.name, tool)\n }\n }\n\n this.tools.clear()\n for (const [name, tool] of tools) {\n this.tools.set(name, tool)\n }\n\n this.latestPageContext = pageContext\n return pageContext\n }\n\n private async onMutatingToolSuccess() {\n this.refreshToolCatalog()\n // A successful page action should stay successful even if native tool\n // re-registration is flaky in the current browser preview.\n if (this.nativeToolsActive) {\n try {\n await this.registerNativeTools()\n } catch {\n this.nativeToolsActive = false\n }\n }\n }\n\n collectPageContext() {\n return this.refreshToolCatalog()\n }\n\n getToolCapabilities() {\n this.refreshToolCatalog()\n return Array.from(this.tools.values())\n .filter((tool) => this.isToolAllowed(tool))\n .map((tool) => tool.capability)\n }\n\n clearHighlights() {\n if (this.highlightTimer !== null) {\n window.clearTimeout(this.highlightTimer)\n this.highlightTimer = null\n }\n this.highlightLayer?.remove()\n this.highlightLayer = null\n }\n\n private ensureHighlightLayer() {\n if (this.highlightLayer) {\n return this.highlightLayer\n }\n const layer = document.createElement(\"div\")\n layer.setAttribute(\"data-blinq-highlight-layer\", \"true\")\n Object.assign(layer.style, {\n position: \"fixed\",\n inset: \"0\",\n pointerEvents: \"none\",\n zIndex: \"2147483646\",\n })\n document.body.appendChild(layer)\n this.highlightLayer = layer\n return layer\n }\n\n private ensureHighlightStyle() {\n if (document.getElementById(\"blinq-highlight-style\")) {\n return\n }\n const style = document.createElement(\"style\")\n style.id = \"blinq-highlight-style\"\n style.textContent = `\n @keyframes blinq-highlight-pulse {\n 0%, 100% { opacity: 0.55; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.02); }\n }\n\n @keyframes blinq-highlight-ripple {\n 0% { opacity: 0.36; transform: translate(-50%, -50%) scale(0.8); }\n 100% { opacity: 0; transform: translate(-50%, -50%) scale(1.7); }\n }\n\n @keyframes blinq-pointer-bob {\n 0%, 100% { transform: translate3d(0, 0, 0) scale(1); }\n 50% { transform: translate3d(0, -2px, 0) scale(1.03); }\n }\n `\n document.head.appendChild(style)\n }\n\n highlightTargets(targets: PageHighlightTarget[], options?: HighlightTargetsOptions) {\n if (!isBrowser() || targets.length === 0) {\n return false\n }\n\n this.clearHighlights()\n const layer = this.ensureHighlightLayer()\n this.ensureHighlightStyle()\n let highlightedCount = 0\n let primaryRect: DOMRect | null = null\n\n const backdrop = document.createElement(\"div\")\n Object.assign(backdrop.style, {\n position: \"fixed\",\n inset: \"0\",\n background: \"rgba(15, 23, 42, 0.08)\",\n backdropFilter: \"blur(1.5px)\",\n opacity: \"0\",\n transition: \"opacity 180ms ease\",\n })\n layer.appendChild(backdrop)\n window.requestAnimationFrame(() => {\n backdrop.style.opacity = \"1\"\n })\n\n for (const target of targets) {\n if (!target.selector) {\n continue\n }\n\n let element: HTMLElement | null = null\n try {\n element = document.querySelector<HTMLElement>(target.selector)\n } catch {\n element = null\n }\n\n if (!element) {\n continue\n }\n\n if (!primaryRect) {\n element.scrollIntoView({\n block: \"center\",\n inline: \"nearest\",\n })\n }\n\n const rect = element.getBoundingClientRect()\n if (rect.width <= 0 || rect.height <= 0) {\n continue\n }\n if (!primaryRect) {\n primaryRect = rect\n }\n\n const frame = document.createElement(\"div\")\n Object.assign(frame.style, {\n position: \"fixed\",\n left: `${Math.max(rect.left - 8, 4)}px`,\n top: `${Math.max(rect.top - 8, 4)}px`,\n width: `${Math.max(rect.width + 16, 24)}px`,\n height: `${Math.max(rect.height + 16, 24)}px`,\n border: \"3px solid rgba(17, 17, 17, 0.94)\",\n borderRadius: \"18px\",\n background: \"rgba(255, 255, 255, 0.16)\",\n boxShadow: \"0 0 0 1px rgba(255, 255, 255, 0.9), 0 24px 48px rgba(15, 23, 42, 0.18)\",\n opacity: \"0\",\n transform: \"scale(0.985)\",\n transition: \"opacity 180ms ease, transform 180ms ease\",\n })\n\n const glow = document.createElement(\"div\")\n Object.assign(glow.style, {\n position: \"absolute\",\n inset: \"-10px\",\n borderRadius: \"22px\",\n border: \"1px solid rgba(37, 99, 235, 0.22)\",\n animation: \"blinq-highlight-pulse 1.2s ease-in-out infinite\",\n })\n frame.appendChild(glow)\n\n if (target.label) {\n const badge = document.createElement(\"div\")\n badge.textContent = target.label\n Object.assign(badge.style, {\n position: \"absolute\",\n top: \"-16px\",\n left: \"10px\",\n maxWidth: \"min(260px, 70vw)\",\n padding: \"6px 12px\",\n borderRadius: \"999px\",\n background: \"#111111\",\n color: \"#ffffff\",\n fontFamily:\n \"\\\"Inter\\\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n lineHeight: \"1.3\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n boxShadow: \"0 8px 18px rgba(17, 17, 17, 0.16)\",\n })\n frame.appendChild(badge)\n }\n\n layer.appendChild(frame)\n window.requestAnimationFrame(() => {\n frame.style.opacity = \"1\"\n frame.style.transform = \"scale(1)\"\n })\n highlightedCount += 1\n }\n\n if (this.actionPolicy.pointer_overlay_enabled && primaryRect) {\n const pointer = document.createElement(\"div\")\n pointer.setAttribute(\"data-blinq-pointer\", options?.interaction ?? \"explain\")\n pointer.innerHTML = `\n <div style=\"position:absolute;inset:0;border-radius:999px;background:rgba(255,255,255,0.92);box-shadow:0 14px 28px rgba(15,23,42,0.18);\"></div>\n <svg viewBox=\"0 0 40 40\" width=\"40\" height=\"40\" fill=\"none\" aria-hidden=\"true\" style=\"position:relative;z-index:1;\">\n <path d=\"M8 5L28 22H18.4L23.2 34.8L17.8 36.8L13 24H6.6L8 5Z\" fill=\"#111111\"/>\n <path d=\"M8 5L28 22H18.4L23.2 34.8L17.8 36.8L13 24H6.6L8 5Z\" stroke=\"#ffffff\" stroke-width=\"1.4\" stroke-linejoin=\"round\"/>\n </svg>\n `\n Object.assign(pointer.style, {\n position: \"fixed\",\n left: `${Math.max(primaryRect.left - 72, 12)}px`,\n top: `${Math.max(primaryRect.bottom + 44, 12)}px`,\n width: \"40px\",\n height: \"40px\",\n zIndex: \"2147483647\",\n opacity: \"0\",\n transform: \"translate3d(0, 0, 0) scale(0.92)\",\n transition:\n \"left 380ms cubic-bezier(.22,1,.36,1), top 380ms cubic-bezier(.22,1,.36,1), opacity 180ms ease, transform 380ms cubic-bezier(.22,1,.36,1)\",\n filter: \"drop-shadow(0 16px 28px rgba(15, 23, 42, 0.2))\",\n animation: \"blinq-pointer-bob 1.1s ease-in-out infinite\",\n })\n layer.appendChild(pointer)\n\n const pointerTargetLeft = Math.max(primaryRect.left + 14, 8)\n const pointerTargetTop = Math.max(primaryRect.top + 14, 8)\n window.requestAnimationFrame(() => {\n pointer.style.opacity = \"1\"\n pointer.style.left = `${pointerTargetLeft}px`\n pointer.style.top = `${pointerTargetTop}px`\n pointer.style.transform = \"translate3d(0, 0, 0) scale(1)\"\n })\n\n if (options?.interaction === \"execute\") {\n const ripple = document.createElement(\"div\")\n Object.assign(ripple.style, {\n position: \"fixed\",\n left: `${primaryRect.left + Math.min(primaryRect.width, 32) / 2}px`,\n top: `${primaryRect.top + Math.min(primaryRect.height, 32) / 2}px`,\n width: \"34px\",\n height: \"34px\",\n borderRadius: \"999px\",\n border: \"3px solid rgba(17, 17, 17, 0.58)\",\n background: \"rgba(17, 17, 17, 0.12)\",\n pointerEvents: \"none\",\n opacity: \"0\",\n transform: \"translate(-50%, -50%) scale(0.8)\",\n animation: \"blinq-highlight-ripple 560ms ease-out 1 forwards\",\n animationDelay: \"320ms\",\n })\n layer.appendChild(ripple)\n }\n }\n\n if (highlightedCount === 0) {\n this.clearHighlights()\n return false\n }\n\n this.highlightTimer = window.setTimeout(() => {\n this.clearHighlights()\n }, options?.durationMs ?? 2200)\n\n return true\n }\n\n private isToolAllowed(tool: ToolDefinition) {\n if (tool.capability.read_only) {\n return true\n }\n if (GUIDANCE_SAFE_TOOL_NAMES.has(tool.capability.name)) {\n return this.actionPolicy.actions_enabled\n }\n return this.actionPolicy.actions_enabled && this.actionPolicy.action_mode === \"execute_with_confirmation\"\n }\n\n private async previewToolRequest(\n request: ToolExecutionRequest,\n options?: HighlightTargetsOptions\n ) {\n const selector = selectorFromArguments(request.arguments)\n if (!selector) {\n return false\n }\n\n const label = (request.target_summary || request.display_name || \"\").trim() || undefined\n const highlighted = this.highlightTargets(\n [{ selector, label }],\n {\n durationMs: options?.durationMs ?? (options?.interaction === \"execute\" ? 1600 : 2200),\n interaction: options?.interaction ?? \"explain\",\n }\n )\n if (!highlighted) {\n return false\n }\n\n await new Promise((resolve) =>\n window.setTimeout(resolve, options?.interaction === \"execute\" ? 520 : 240)\n )\n return true\n }\n\n canExecuteWriteTools() {\n return (\n isBrowser() &&\n this.actionPolicy.actions_enabled &&\n this.actionPolicy.action_mode === \"execute_with_confirmation\"\n )\n }\n\n async executeTool(request: ToolExecutionRequest): Promise<ToolExecutionOutcome> {\n let tool = this.tools.get(request.tool_name)\n if (!tool) {\n this.refreshToolCatalog()\n tool = this.tools.get(request.tool_name)\n }\n\n if (!tool) {\n return {\n status: \"error\",\n error: `Неизвестный инструмент: ${request.tool_name}`,\n }\n }\n\n const displayName = request.display_name ?? tool.capability.name\n const targetSummary =\n request.target_summary ??\n tool.describeTarget?.(request.arguments) ??\n tool.capability.description\n\n const requiresConfirmation =\n request.requires_confirmation ??\n shouldRequestConfirmation(request.tool_name, tool.capability.read_only)\n\n if (request.tool_name !== \"blinq.highlight_element\") {\n await this.previewToolRequest(request, {\n interaction: tool.capability.read_only ? \"explain\" : \"execute\",\n })\n }\n\n if (!tool.capability.read_only && !this.isToolAllowed(tool)) {\n return {\n status: \"success\",\n result: {\n success: true,\n guided: true,\n preview_only: true,\n },\n }\n }\n\n if (!tool.capability.read_only && requiresConfirmation) {\n const confirmed = await this.confirmationHandler({\n displayName,\n targetSummary,\n arguments: request.arguments,\n })\n if (!confirmed) {\n return {\n status: \"cancelled\",\n error: \"Пользователь отклонил действие\",\n }\n }\n }\n\n try {\n const result = await tool.execute(request.arguments)\n if (!tool.capability.read_only) {\n await this.onMutatingToolSuccess()\n }\n return { status: \"success\", result }\n } catch (error) {\n return {\n status: \"error\",\n error: error instanceof Error ? error.message : \"Неизвестная ошибка действия на странице\",\n }\n }\n }\n\n unregisterNativeTools() {\n while (this.nativeRegistrations.length > 0) {\n this.nativeRegistrations.pop()?.abort()\n }\n this.nativeToolsActive = false\n }\n\n async registerNativeTools() {\n const navigatorWithModelContext = navigator as NavigatorWithModelContext\n const modelContext = navigatorWithModelContext.modelContext\n if (!window.isSecureContext || !modelContext?.registerTool) {\n return false\n }\n\n this.refreshToolCatalog()\n this.unregisterNativeTools()\n\n for (const [toolName, tool] of this.tools) {\n if (!this.isToolAllowed(tool)) {\n continue\n }\n const controller = new AbortController()\n try {\n modelContext.registerTool(\n {\n name: toolName,\n description: tool.capability.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: tool.capability.read_only,\n },\n execute: async (input) => {\n const outcome = await this.executeTool({\n tool_name: toolName,\n display_name: tool.capability.name,\n arguments: input,\n })\n return outcome\n },\n },\n { signal: controller.signal }\n )\n this.nativeRegistrations.push(controller)\n } catch (error) {\n controller.abort()\n if (isDuplicateNativeToolError(error)) {\n this.nativeToolsActive = true\n continue\n }\n throw error\n }\n }\n\n this.nativeToolsActive = true\n return true\n }\n\n destroy() {\n this.clearHighlights()\n this.unregisterNativeTools()\n }\n}\n","import * as React from \"react\"\nimport { Bot } from \"lucide-react\"\nimport {\n AssistantRuntimeProvider,\n MessagePrimitive,\n ThreadPrimitive,\n useExternalStoreRuntime,\n useMessage,\n type MessageStatus as AssistantMessageStatus,\n type ThreadMessageLike,\n} from \"@assistant-ui/react\"\n\ntype ClassValue = string | false | null | undefined\n\nfunction cn(...values: ClassValue[]) {\n return values.filter(Boolean).join(\" \")\n}\n\ntype ButtonVariant = \"default\" | \"outline\" | \"ghost\" | \"destructive\"\ntype ButtonSize = \"default\" | \"sm\" | \"icon\" | \"icon-sm\"\ntype BadgeVariant = \"default\" | \"outline\" | \"soft\" | \"accent\"\n\nfunction buttonClassName(variant: ButtonVariant = \"default\", size: ButtonSize = \"default\") {\n const variantClass =\n variant === \"outline\"\n ? \"blinq-button-outline\"\n : variant === \"ghost\"\n ? \"blinq-button-ghost\"\n : variant === \"destructive\"\n ? \"blinq-button-destructive\"\n : \"blinq-button-default\"\n\n const sizeClass =\n size === \"sm\"\n ? \"blinq-button-sm\"\n : size === \"icon\"\n ? \"blinq-button-icon\"\n : size === \"icon-sm\"\n ? \"blinq-button-icon-sm\"\n : \"blinq-button-md\"\n\n return cn(\"blinq-button\", variantClass, sizeClass)\n}\n\nfunction badgeClassName(variant: BadgeVariant = \"default\") {\n if (variant === \"outline\") {\n return \"blinq-badge-pill blinq-badge-pill-outline\"\n }\n if (variant === \"soft\") {\n return \"blinq-badge-pill blinq-badge-pill-soft\"\n }\n if (variant === \"accent\") {\n return \"blinq-badge-pill blinq-badge-pill-accent\"\n }\n return \"blinq-badge-pill blinq-badge-pill-default\"\n}\n\nfunction Button({\n className,\n variant,\n size,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: ButtonVariant\n size?: ButtonSize\n}) {\n return <button className={cn(buttonClassName(variant, size), className)} {...props} />\n}\n\nfunction Input({ className, ...props }: React.InputHTMLAttributes<HTMLInputElement>) {\n return <input className={cn(\"blinq-input\", className)} {...props} />\n}\n\nfunction Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-card\", className)} {...props} />\n}\n\nfunction CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-card-header\", className)} {...props} />\n}\n\nfunction CardTitle({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-card-title\", className)} {...props} />\n}\n\nfunction CardDescription({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-card-description\", className)} {...props} />\n}\n\nfunction CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-card-content\", className)} {...props} />\n}\n\nfunction Badge({\n className,\n variant,\n ...props\n}: React.HTMLAttributes<HTMLDivElement> & {\n variant?: BadgeVariant\n}) {\n return <div className={cn(badgeClassName(variant), className)} {...props} />\n}\n\nfunction Separator({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"blinq-separator\", className)} {...props} />\n}\n\nfunction LauncherIcon() {\n return (\n <Bot aria-hidden=\"true\" className=\"blinq-launcher-icon\" size={30} strokeWidth={1.7} />\n )\n}\n\nfunction AssistantAvatar({\n avatarUrl,\n assistantName,\n}: {\n avatarUrl: string | null\n assistantName: string\n}) {\n return (\n <div className=\"blinq-avatar\" aria-hidden=\"true\">\n {avatarUrl ? (\n <img src={avatarUrl} alt=\"\" className=\"blinq-avatar-image\" />\n ) : (\n <Bot className=\"blinq-avatar-icon\" size={24} strokeWidth={1.8} />\n )}\n <span className=\"blinq-avatar-status\" />\n <span className=\"blinq-avatar-label\">{assistantName.slice(0, 1)}</span>\n </div>\n )\n}\n\nfunction CollapseIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 12h12\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction MicrophoneIcon({ listening }: { listening: boolean }) {\n if (listening) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.65\" />\n <rect x=\"9.1\" y=\"9.1\" width=\"5.8\" height=\"5.8\" rx=\"1.6\" fill=\"currentColor\" />\n </svg>\n )\n }\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12 4.35a3.05 3.05 0 0 1 3.05 3.05v4.7a3.05 3.05 0 1 1-6.1 0V7.4A3.05 3.05 0 0 1 12 4.35Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n />\n <path\n d=\"M7.95 11.35a4.05 4.05 0 1 0 8.1 0M12 16.45v3.2M9.2 19.65h5.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nfunction SendIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.5 18.5 18.5 5.5M8.25 5.5h10.25v10.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ThinkingSparkIcon() {\n return (\n <span className=\"blinq-thinking-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n )\n}\n\nexport interface WidgetMessageConversationItem {\n id: string\n type: \"message\"\n role: \"user\" | \"assistant\"\n text: string\n status: \"thinking\" | \"streaming\" | \"done\"\n}\n\nexport interface WidgetActionConversationItem {\n id: string\n type: \"action\"\n displayName: string\n targetSummary: string\n arguments: Record<string, unknown>\n state: \"pending\" | \"approved\" | \"declined\"\n}\n\nexport interface WidgetPlanStepItem {\n id: string\n title: string\n status: string\n kind: string\n}\n\nexport interface WidgetPlanConversationItem {\n id: string\n type: \"plan\"\n goal: string\n status: string\n progressLabel: string | null\n statusReason?: string | null\n expectedRoute?: string | null\n loopGuarded?: boolean\n currentStepIndex: number\n totalSteps: number\n approvalState: \"pending\" | \"approved\" | \"declined\"\n steps: WidgetPlanStepItem[]\n}\n\nexport interface WidgetGuideStepItem {\n id: string\n position: number\n title: string\n body: string\n targetSelector?: string | null\n targetLabel?: string | null\n actionKind?: string | null\n actionPayload?: Record<string, unknown> | null\n expectedRoute?: string | null\n completionMode: string\n}\n\nexport interface WidgetGuideCardState {\n id: string\n state: \"offered\" | \"started\" | \"dismissed\" | \"completed\"\n source: \"published\" | \"live\"\n route: string\n summary?: string | null\n currentStepIndex: number\n totalSteps: number\n steps: WidgetGuideStepItem[]\n}\n\nexport type WidgetConversationItem =\n | WidgetMessageConversationItem\n | WidgetActionConversationItem\n | WidgetPlanConversationItem\n\nexport interface WidgetShellState {\n minimized: boolean\n assistantName: string\n avatarUrl: string | null\n runtimeLabel: string\n statusText: string\n showThinkingIndicator: boolean\n inputValue: string\n accentColor: string\n themeVariant: \"light\" | \"dark\"\n side: \"left\" | \"right\"\n isSending: boolean\n voiceSupported: boolean\n voiceListening: boolean\n voiceWaveform: number[]\n voiceDurationMs: number\n guide: WidgetGuideCardState | null\n items: WidgetConversationItem[]\n}\n\ninterface WidgetEmbedShellProps {\n state: WidgetShellState\n onOpen(): void\n onCollapse(): void\n onInputChange(value: string): void\n onSubmit(): void\n onToggleVoice(): void\n onApproveAction(id: string): void\n onDeclineAction(id: string): void\n onApprovePlan(): void\n onDeclinePlan(): void\n onStartGuide(): void\n onAdvanceGuide(): void\n onDismissGuide(): void\n onCompleteGuide(): void\n onRunGuideStep(): void\n}\n\nfunction isAssistantMessageRunning(status?: AssistantMessageStatus) {\n return status?.type === \"running\"\n}\n\nfunction itemToThreadMessage(item: WidgetConversationItem): ThreadMessageLike {\n if (item.type === \"message\") {\n return {\n id: item.id,\n role: item.role,\n status:\n item.role === \"assistant\"\n ? item.status === \"done\"\n ? { type: \"complete\", reason: \"stop\" }\n : { type: \"running\" }\n : undefined,\n content: item.text ? [{ type: \"text\", text: item.text }] : [],\n metadata: {\n custom: {\n blinqKind: \"message\",\n },\n },\n }\n }\n\n if (item.type === \"plan\") {\n return {\n id: item.id,\n role: \"assistant\",\n status:\n item.status === \"completed\"\n ? { type: \"complete\", reason: \"stop\" }\n : item.status === \"failed\"\n ? { type: \"incomplete\", reason: \"error\" }\n : { type: \"running\" },\n content: [{ type: \"data\", name: \"blinq-plan\", data: item }],\n metadata: {\n custom: {\n blinqKind: \"plan\",\n },\n },\n }\n }\n\n return {\n id: item.id,\n role: \"assistant\",\n status:\n item.state === \"approved\"\n ? { type: \"running\" }\n : { type: \"complete\", reason: \"stop\" },\n content: [{ type: \"data\", name: \"blinq-action\", data: item }],\n metadata: {\n custom: {\n blinqKind: \"action\",\n },\n },\n }\n}\n\nfunction conversationToThreadMessages(items: WidgetConversationItem[]) {\n return items.map(itemToThreadMessage)\n}\n\nfunction ThreadMessageBubble({\n accentColor,\n onApproveAction,\n onDeclineAction,\n onApprovePlan,\n onDeclinePlan,\n}: {\n accentColor: string\n onApproveAction(id: string): void\n onDeclineAction(id: string): void\n onApprovePlan(): void\n onDeclinePlan(): void\n}) {\n const role = useMessage((state) => state.role)\n const messageId = useMessage((state) => state.id)\n const status = useMessage((state) => state.status)\n const content = useMessage((state) => state.content)\n const isDataOnly =\n Array.isArray(content) &&\n content.length === 1 &&\n typeof content[0] !== \"string\" &&\n content[0]?.type === \"data\"\n const messageText = React.useMemo(\n () =>\n content\n .filter((part): part is Extract<typeof part, { type: \"text\" }> => typeof part !== \"string\" && part.type === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n [content]\n )\n const [animateFreshText, setAnimateFreshText] = React.useState(false)\n const [hasAnimatedStreamingReveal, setHasAnimatedStreamingReveal] = React.useState(false)\n\n React.useEffect(() => {\n setAnimateFreshText(false)\n setHasAnimatedStreamingReveal(false)\n }, [messageId])\n\n React.useEffect(() => {\n if (\n role !== \"assistant\" ||\n isDataOnly ||\n !isAssistantMessageRunning(status) ||\n !messageText.trim() ||\n hasAnimatedStreamingReveal\n ) {\n return\n }\n\n setAnimateFreshText(true)\n setHasAnimatedStreamingReveal(true)\n const timeoutId = window.setTimeout(() => {\n setAnimateFreshText(false)\n }, 220)\n\n return () => window.clearTimeout(timeoutId)\n }, [role, isDataOnly, messageText, hasAnimatedStreamingReveal])\n\n return (\n <MessagePrimitive.Root\n className=\"blinq-message\"\n data-role={role}\n data-kind={isDataOnly ? \"artifact\" : \"bubble\"}\n data-status={status?.type ?? \"complete\"}\n >\n <MessagePrimitive.Parts>\n {({ part }) => {\n if (part.type === \"text\") {\n if (!part.text) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"blinq-message-copy\",\n role === \"assistant\" && animateFreshText && \"blinq-message-copy-reveal\"\n )}\n >\n {part.text}\n </div>\n )\n }\n\n if (part.type === \"data\" && part.name === \"blinq-action\") {\n const actionItem = part.data as WidgetActionConversationItem\n return (\n <ActionCard\n item={actionItem}\n accentColor={accentColor}\n onApprove={() => onApproveAction(actionItem.id)}\n onDecline={() => onDeclineAction(actionItem.id)}\n />\n )\n }\n\n if (part.type === \"data\" && part.name === \"blinq-plan\") {\n return (\n <PlanCard\n item={part.data as WidgetPlanConversationItem}\n onApprove={onApprovePlan}\n onDecline={onDeclinePlan}\n />\n )\n }\n\n return null\n }}\n </MessagePrimitive.Parts>\n </MessagePrimitive.Root>\n )\n}\n\nfunction ThinkingPlaceholder() {\n return (\n <div className=\"blinq-message blinq-thinking-card\" data-role=\"assistant\" data-kind=\"bubble\">\n <div className=\"blinq-thinking\">\n <ThinkingSparkIcon />\n <span>Думаю над ответом</span>\n </div>\n </div>\n )\n}\n\nfunction formatRecordingDuration(durationMs: number) {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1000))\n const minutes = String(Math.floor(totalSeconds / 60)).padStart(2, \"0\")\n const seconds = String(totalSeconds % 60).padStart(2, \"0\")\n return `${minutes}:${seconds}`\n}\n\nfunction VoiceWaveform({\n durationMs,\n samples,\n}: {\n durationMs: number\n samples: number[]\n}) {\n const waveform = samples.length > 0 ? samples : [0.18]\n\n return (\n <div className=\"blinq-recording-input\" role=\"status\" aria-live=\"polite\">\n <div className=\"blinq-recording-time\">{formatRecordingDuration(durationMs)}</div>\n <div className=\"blinq-recording-wave-shell\">\n <div className=\"blinq-recording-waveform\" aria-hidden=\"true\">\n {waveform.map((sample, index) => {\n const scale = Math.max(0.16, Math.min(1, sample))\n return (\n <span\n key={`voice-wave-${index}`}\n className=\"blinq-recording-waveform-bar\"\n style={{ transform: `scaleY(${scale})` }}\n />\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\nfunction planStepStatusLabel(step: WidgetPlanStepItem, isCurrent: boolean) {\n if (step.status === \"completed\") {\n return \"Готово\"\n }\n if (step.status === \"failed\") {\n return \"Ошибка\"\n }\n if (step.status === \"cancelled\") {\n return \"Отменено\"\n }\n return isCurrent ? \"Сейчас\" : \"Далее\"\n}\n\nfunction ActionCard({\n item,\n accentColor,\n onApprove,\n onDecline,\n}: {\n item: WidgetActionConversationItem\n accentColor: string\n onApprove(): void\n onDecline(): void\n}) {\n return (\n <Card\n className=\"blinq-action-card\"\n style={\n item.state === \"approved\"\n ? { borderColor: \"rgba(17, 17, 17, 0.22)\" }\n : item.state === \"declined\"\n ? { borderColor: \"rgba(17, 17, 17, 0.12)\" }\n : undefined\n }\n >\n <CardHeader>\n <CardTitle>{item.displayName}</CardTitle>\n <CardDescription>{item.targetSummary}</CardDescription>\n </CardHeader>\n <CardContent>\n <details className=\"blinq-action-details\">\n <summary>Показать детали действия</summary>\n <pre className=\"blinq-code\">{JSON.stringify(item.arguments, null, 2)}</pre>\n </details>\n {item.state !== \"pending\" ? (\n <div className=\"blinq-action-state\" data-state={item.state}>\n {item.state === \"approved\" ? \"Выполняю действие\" : \"Действие отклонено\"}\n </div>\n ) : null}\n {item.state === \"pending\" ? (\n <div className=\"blinq-actions\">\n <Button type=\"button\" variant=\"outline\" onClick={onDecline}>\n Отклонить\n </Button>\n <Button\n type=\"button\"\n onClick={onApprove}\n >\n Выполнить\n </Button>\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n\nfunction PlanCard({\n item,\n onApprove,\n onDecline,\n}: {\n item: WidgetPlanConversationItem\n onApprove(): void\n onDecline(): void\n}) {\n return (\n <Card className=\"blinq-action-card blinq-plan-card\">\n <CardHeader>\n <div className=\"blinq-plan-header\">\n <div>\n <CardTitle>План</CardTitle>\n <CardDescription>{item.goal}</CardDescription>\n </div>\n <Badge variant={item.status === \"completed\" ? \"default\" : item.status === \"failed\" ? \"outline\" : \"soft\"}>\n {item.status === \"completed\"\n ? \"Готово\"\n : item.status === \"failed\"\n ? \"Ошибка\"\n : item.status === \"awaiting_navigation\"\n ? \"Переход\"\n : \"В работе\"}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"blinq-plan-content\">\n {item.progressLabel ? <div className=\"blinq-action-state\">{item.progressLabel}</div> : null}\n {item.statusReason ? <div className=\"blinq-card-description\">{item.statusReason}</div> : null}\n <div className=\"blinq-plan-steps\">\n {item.steps.map((step, index) => (\n <div\n key={step.id}\n className=\"blinq-plan-step\"\n data-current={index === item.currentStepIndex ? \"true\" : \"false\"}\n data-status={step.status}\n >\n <span className=\"blinq-plan-step-index\">{index + 1}</span>\n <div className=\"blinq-plan-step-copy\">\n <div className=\"blinq-plan-step-title-row\">\n <div className=\"blinq-plan-step-title\">{step.title}</div>\n <span className=\"blinq-plan-step-status-pill\">\n {planStepStatusLabel(step, index === item.currentStepIndex)}\n </span>\n </div>\n <div className=\"blinq-plan-step-meta\">\n {step.status === \"completed\"\n ? \"Выполнено\"\n : step.status === \"failed\"\n ? \"Ошибка\"\n : step.status === \"cancelled\"\n ? \"Отменено\"\n : index === item.currentStepIndex\n ? \"Текущий шаг\"\n : \"Ожидает\"}\n </div>\n </div>\n </div>\n ))}\n </div>\n {item.approvalState === \"pending\" ? (\n <div className=\"blinq-actions\">\n <Button type=\"button\" variant=\"outline\" onClick={onDecline}>\n Отклонить\n </Button>\n <Button type=\"button\" onClick={onApprove}>\n Выполнить\n </Button>\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n\nfunction GuideCard({\n guide,\n onStartGuide,\n onAdvanceGuide,\n onDismissGuide,\n onCompleteGuide,\n onRunGuideStep,\n}: {\n guide: WidgetGuideCardState\n onStartGuide(): void\n onAdvanceGuide(): void\n onDismissGuide(): void\n onCompleteGuide(): void\n onRunGuideStep(): void\n}) {\n const currentStep =\n guide.steps[Math.min(guide.currentStepIndex, Math.max(guide.steps.length - 1, 0))] ?? null\n const isStarted = guide.state === \"started\"\n const isCompleted = guide.state === \"completed\"\n\n return (\n <Card className=\"blinq-guide-card\">\n <CardHeader>\n <div className=\"blinq-plan-header\">\n <div>\n <CardTitle>Guide на странице</CardTitle>\n <CardDescription>\n {guide.summary || \"Пошаговая помощь по текущему интерфейсу.\"}\n </CardDescription>\n </div>\n <Badge variant={guide.source === \"live\" ? \"soft\" : \"accent\"}>\n {guide.source === \"live\" ? \"Live\" : \"Published\"}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"blinq-guide-content\">\n {!isStarted ? (\n <>\n <div className=\"blinq-card-description\">\n Ассистент уже подготовил guide для этой страницы и может провести пользователя по шагам.\n </div>\n <div className=\"blinq-actions\">\n <Button type=\"button\" variant=\"outline\" onClick={onDismissGuide}>\n Скрыть\n </Button>\n <Button type=\"button\" onClick={onStartGuide}>\n Начать guide\n </Button>\n </div>\n </>\n ) : currentStep && !isCompleted ? (\n <>\n <div className=\"blinq-guide-step-shell\">\n <div className=\"blinq-guide-step-meta\">\n Шаг {Math.min(guide.currentStepIndex + 1, guide.totalSteps)} из {guide.totalSteps}\n </div>\n <div className=\"blinq-guide-step-title\">{currentStep.title}</div>\n <div className=\"blinq-guide-step-copy\">{currentStep.body}</div>\n </div>\n <div className=\"blinq-actions\">\n <Button type=\"button\" variant=\"outline\" onClick={onDismissGuide}>\n Скрыть\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={onRunGuideStep}>\n {currentStep.actionKind ? \"Показать / выполнить шаг\" : \"Показать на странице\"}\n </Button>\n {guide.currentStepIndex + 1 >= guide.totalSteps ? (\n <Button type=\"button\" onClick={onCompleteGuide}>\n Завершить\n </Button>\n ) : (\n <Button type=\"button\" onClick={onAdvanceGuide}>\n Дальше\n </Button>\n )}\n </div>\n </>\n ) : (\n <>\n <div className=\"blinq-card-description\">\n Guide завершён. Можно продолжить работу на странице самостоятельно.\n </div>\n <div className=\"blinq-actions\">\n <Button type=\"button\" onClick={onDismissGuide}>\n Закрыть\n </Button>\n </div>\n </>\n )}\n </CardContent>\n </Card>\n )\n}\n\nfunction AssistantConversationThread({\n items,\n showThinkingIndicator,\n accentColor,\n onApproveAction,\n onDeclineAction,\n onApprovePlan,\n onDeclinePlan,\n}: {\n items: WidgetConversationItem[]\n showThinkingIndicator: boolean\n accentColor: string\n onApproveAction(id: string): void\n onDeclineAction(id: string): void\n onApprovePlan(): void\n onDeclinePlan(): void\n}) {\n const messages = React.useMemo(() => conversationToThreadMessages(items), [items])\n const runtime = useExternalStoreRuntime({\n messages,\n isRunning: messages.some((message) => message.role === \"assistant\" && message.status?.type === \"running\"),\n convertMessage: (message) => message,\n onNew: async () => undefined,\n })\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n if (!scrollRef.current) {\n return\n }\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight\n }, [items])\n\n const assistantMessageComponent = React.useMemo(\n () =>\n function AssistantMessageComponent() {\n return (\n <ThreadMessageBubble\n accentColor={accentColor}\n onApproveAction={onApproveAction}\n onDeclineAction={onDeclineAction}\n onApprovePlan={onApprovePlan}\n onDeclinePlan={onDeclinePlan}\n />\n )\n },\n [accentColor, onApproveAction, onDeclineAction, onApprovePlan, onDeclinePlan]\n )\n\n const userMessageComponent = React.useMemo(\n () =>\n function UserMessageComponent() {\n return (\n <ThreadMessageBubble\n accentColor={accentColor}\n onApproveAction={onApproveAction}\n onDeclineAction={onDeclineAction}\n onApprovePlan={onApprovePlan}\n onDeclinePlan={onDeclinePlan}\n />\n )\n },\n [accentColor, onApproveAction, onDeclineAction, onApprovePlan, onDeclinePlan]\n )\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n <ThreadPrimitive.Root className=\"blinq-thread\">\n <ThreadPrimitive.Viewport ref={scrollRef} className=\"blinq-scroll blinq-thread-viewport\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage: userMessageComponent,\n AssistantMessage: assistantMessageComponent,\n }}\n />\n {showThinkingIndicator ? <ThinkingPlaceholder /> : null}\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.Root>\n </AssistantRuntimeProvider>\n )\n}\n\nexport function WidgetEmbedShell({\n state,\n onOpen,\n onCollapse,\n onInputChange,\n onSubmit,\n onToggleVoice,\n onApproveAction,\n onDeclineAction,\n onApprovePlan,\n onDeclinePlan,\n onStartGuide,\n onAdvanceGuide,\n onDismissGuide,\n onCompleteGuide,\n onRunGuideStep,\n}: WidgetEmbedShellProps) {\n return (\n <div\n className=\"blinq-shell\"\n data-side={state.side}\n data-theme={state.themeVariant}\n style={{ [\"--blinq-accent\" as string]: state.accentColor }}\n >\n {!state.minimized ? (\n <div className=\"blinq-panel\">\n <div className=\"blinq-header\">\n <div className=\"blinq-header-row\">\n <AssistantAvatar avatarUrl={state.avatarUrl} assistantName={state.assistantName} />\n <div className=\"blinq-header-copy\">\n <div className=\"blinq-heading\">{state.assistantName}</div>\n {state.statusText ? <div className=\"blinq-status-line\">{state.statusText}</div> : null}\n </div>\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Свернуть виджет\"\n title=\"Свернуть виджет\"\n onClick={onCollapse}\n >\n <CollapseIcon />\n </Button>\n </div>\n </div>\n {state.guide ? (\n <GuideCard\n guide={state.guide}\n onStartGuide={onStartGuide}\n onAdvanceGuide={onAdvanceGuide}\n onDismissGuide={onDismissGuide}\n onCompleteGuide={onCompleteGuide}\n onRunGuideStep={onRunGuideStep}\n />\n ) : null}\n <AssistantConversationThread\n items={state.items}\n showThinkingIndicator={state.showThinkingIndicator}\n accentColor={state.accentColor}\n onApproveAction={onApproveAction}\n onDeclineAction={onDeclineAction}\n onApprovePlan={onApprovePlan}\n onDeclinePlan={onDeclinePlan}\n />\n\n <form\n className=\"blinq-composer\"\n onSubmit={(event) => {\n event.preventDefault()\n onSubmit()\n }}\n >\n <div className=\"blinq-composer-controls\">\n <div className=\"blinq-input-shell\">\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant={state.voiceListening ? \"destructive\" : \"ghost\"}\n className=\"blinq-input-mic\"\n aria-label={state.voiceListening ? \"Остановить голосовой ввод\" : \"Начать голосовой ввод\"}\n title={\n !state.voiceSupported\n ? \"Голосовой ввод не поддерживается в этом браузере\"\n : state.voiceListening\n ? \"Остановить запись\"\n : \"Начать голосовой ввод\"\n }\n disabled={!state.voiceSupported || state.isSending}\n onClick={onToggleVoice}\n >\n <MicrophoneIcon listening={state.voiceListening} />\n </Button>\n\n {state.voiceListening ? (\n <VoiceWaveform\n durationMs={state.voiceDurationMs}\n samples={state.voiceWaveform}\n />\n ) : (\n <Input\n value={state.inputValue}\n placeholder=\"Type a message...\"\n onChange={(event) => onInputChange(event.currentTarget.value)}\n disabled={state.isSending}\n />\n )}\n\n <Button\n type=\"submit\"\n size=\"icon-sm\"\n className=\"blinq-input-send\"\n aria-label=\"Отправить сообщение\"\n title=\"Отправить сообщение\"\n disabled={state.isSending || state.voiceListening}\n >\n <SendIcon />\n </Button>\n </div>\n </div>\n </form>\n <div className=\"blinq-powered\">POWERED BY BLINQ</div>\n </div>\n ) : null}\n\n {state.minimized ? (\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"blinq-launcher blinq-launcher-icon-only\"\n aria-label={`Открыть ${state.assistantName}`}\n title={`Открыть ${state.assistantName}`}\n onClick={onOpen}\n >\n <LauncherIcon />\n </Button>\n ) : null}\n </div>\n )\n}\n","type VoiceCallbacks = {\n getLanguage: () => string\n onInterimTranscript: (text: string) => void\n onFinalTranscript: (text: string) => void\n onListeningChange: (isListening: boolean) => void\n onLevelChange: (level: number) => void\n onStatusChange: (status: string) => void\n onError: (message: string) => void\n}\n\ntype SpeechRecognitionAlternativeLike = {\n transcript: string\n}\n\ntype SpeechRecognitionResultLike = {\n isFinal: boolean\n length: number\n [index: number]: SpeechRecognitionAlternativeLike\n}\n\ntype SpeechRecognitionResultListLike = {\n length: number\n [index: number]: SpeechRecognitionResultLike\n}\n\ntype SpeechRecognitionEventLike = Event & {\n resultIndex: number\n results: SpeechRecognitionResultListLike\n}\n\ntype SpeechRecognitionErrorEventLike = Event & {\n error?: string\n message?: string\n}\n\ninterface SpeechRecognitionLike extends EventTarget {\n lang: string\n interimResults: boolean\n continuous: boolean\n maxAlternatives: number\n onresult: ((event: SpeechRecognitionEventLike) => void) | null\n onerror: ((event: SpeechRecognitionErrorEventLike) => void) | null\n onend: (() => void) | null\n onstart: (() => void) | null\n start: () => void\n stop: () => void\n abort: () => void\n}\n\ntype SpeechRecognitionConstructor = new () => SpeechRecognitionLike\n\ntype SpeechRecognitionWindow = Window & {\n SpeechRecognition?: SpeechRecognitionConstructor\n webkitSpeechRecognition?: SpeechRecognitionConstructor\n}\n\nconst FILLER_PHRASES = [\n \"you know\",\n \"i mean\",\n \"sort of\",\n \"kind of\",\n \"and so on\",\n \"как бы\",\n \"в общем\",\n \"вообще-то\",\n \"это самое\",\n \"так сказать\",\n \"по сути\",\n \"скажем так\",\n \"и так далее\",\n \"на самом деле\",\n \"if you know\",\n \"basically\",\n \"literally\",\n \"actually\",\n \"really\",\n \"короче\",\n \"значит\",\n \"собственно\",\n \"просто\",\n \"ладно\",\n \"ну вот\",\n \"ну\",\n \"вот\",\n \"типа\",\n \"эм\",\n \"ээ\",\n \"эээ\",\n \"мм\",\n \"uh\",\n \"um\",\n \"er\",\n \"ah\",\n \"like\",\n \"well\",\n]\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\nfunction normalizeWhitespace(text: string) {\n return text.replace(/\\s+/g, \" \").trim()\n}\n\nfunction removeFillerPhrases(text: string) {\n let cleaned = text\n for (const phrase of [...FILLER_PHRASES].sort((left, right) => right.length - left.length)) {\n const escaped = escapeRegex(phrase)\n const pattern = new RegExp(`(^|[\\\\s,.;:!?()\\\\[\\\\]{}-])${escaped}(?=$|[\\\\s,.;:!?()\\\\[\\\\]{}-])`, \"giu\")\n cleaned = cleaned.replace(pattern, (_match, boundary: string) => boundary || \" \")\n }\n return cleaned\n}\n\nfunction dedupeAdjacentWords(text: string) {\n const parts = text.split(/\\s+/)\n const nextParts: string[] = []\n let previousKey = \"\"\n\n for (const part of parts) {\n const wordKey = part.toLowerCase().replace(/^[^\\p{L}\\p{N}]+|[^\\p{L}\\p{N}]+$/gu, \"\")\n if (wordKey && wordKey === previousKey) {\n continue\n }\n nextParts.push(part)\n previousKey = wordKey\n }\n\n return nextParts.join(\" \")\n}\n\nfunction normalizePunctuation(text: string) {\n return text\n .replace(/\\s+([,.;:!?])/g, \"$1\")\n .replace(/([,.;:!?])([^\\s])/g, \"$1 $2\")\n .replace(/\\s+/g, \" \")\n .trim()\n}\n\nexport function sanitizeSpokenText(text: string) {\n const cleaned = normalizePunctuation(\n dedupeAdjacentWords(removeFillerPhrases(normalizeWhitespace(text)))\n )\n return cleaned\n}\n\nexport function supportsVoiceInput() {\n if (typeof window === \"undefined\") {\n return false\n }\n const recognitionWindow = window as SpeechRecognitionWindow\n return Boolean(recognitionWindow.SpeechRecognition || recognitionWindow.webkitSpeechRecognition)\n}\n\nfunction recognitionConstructor() {\n if (typeof window === \"undefined\") {\n return null\n }\n const recognitionWindow = window as SpeechRecognitionWindow\n return (\n recognitionWindow.SpeechRecognition ||\n recognitionWindow.webkitSpeechRecognition ||\n null\n ) as SpeechRecognitionConstructor | null\n}\n\nfunction errorMessageForCode(code: string | undefined) {\n switch (code) {\n case \"not-allowed\":\n case \"service-not-allowed\":\n return \"Доступ к микрофону заблокирован.\"\n case \"audio-capture\":\n return \"Микрофон не найден.\"\n case \"network\":\n return \"Ошибка сети при распознавании речи.\"\n case \"no-speech\":\n return \"Речь не распознана.\"\n case \"aborted\":\n return \"Голосовой ввод был отменён.\"\n default:\n return \"Не удалось обработать голосовой ввод.\"\n }\n}\n\nexport class VoiceInputController {\n private readonly callbacks: VoiceCallbacks\n private readonly recognition: SpeechRecognitionLike | null\n private finalTranscript = \"\"\n private interimTranscript = \"\"\n private shouldSendOnEnd = false\n private listening = false\n private sessionActive = false\n private manualStopRequested = false\n private restartTimeoutId: number | null = null\n private statusAfterEnd = \"Голосовой ввод остановлен.\"\n private mediaStream: MediaStream | null = null\n private audioContext: AudioContext | null = null\n private analyser: AnalyserNode | null = null\n private sourceNode: MediaStreamAudioSourceNode | null = null\n private levelFrameId: number | null = null\n private smoothedLevel = 0\n\n constructor(callbacks: VoiceCallbacks) {\n this.callbacks = callbacks\n const Recognition = recognitionConstructor()\n this.recognition = Recognition ? new Recognition() : null\n\n if (!this.recognition) {\n return\n }\n\n this.recognition.continuous = true\n this.recognition.interimResults = true\n this.recognition.maxAlternatives = 1\n\n this.recognition.onstart = () => {\n this.listening = true\n this.sessionActive = true\n this.callbacks.onListeningChange(true)\n this.callbacks.onStatusChange(\"Слушаю. Нажмите стоп, когда будете готовы отправить.\")\n }\n\n this.recognition.onresult = (event) => {\n let finalChunk = this.finalTranscript\n let interimChunk = \"\"\n\n for (let index = event.resultIndex; index < event.results.length; index += 1) {\n const result = event.results[index]\n const transcript = result[0]?.transcript ?? \"\"\n if (!transcript) {\n continue\n }\n if (result.isFinal) {\n finalChunk = `${finalChunk} ${transcript}`.trim()\n } else {\n interimChunk = `${interimChunk} ${transcript}`.trim()\n }\n }\n\n this.finalTranscript = finalChunk\n this.interimTranscript = interimChunk\n const preview = sanitizeSpokenText(`${finalChunk} ${interimChunk}`.trim())\n this.callbacks.onInterimTranscript(preview)\n if (preview) {\n this.callbacks.onStatusChange(`Черновик голоса: ${preview}`)\n }\n }\n\n this.recognition.onerror = (event) => {\n if (event.error === \"no-speech\" && this.sessionActive && !this.manualStopRequested) {\n this.statusAfterEnd = \"Продолжаю слушать...\"\n return\n }\n if (event.error === \"aborted\" && this.manualStopRequested) {\n this.statusAfterEnd = \"Голосовой ввод остановлен.\"\n return\n }\n this.sessionActive = false\n this.shouldSendOnEnd = false\n this.statusAfterEnd = errorMessageForCode(event.error)\n this.stopLevelMonitoring()\n this.callbacks.onError(this.statusAfterEnd)\n }\n\n this.recognition.onend = () => {\n this.listening = false\n if (this.sessionActive && !this.manualStopRequested) {\n this.callbacks.onStatusChange(\"Продолжаю слушать...\")\n this.scheduleRestart()\n return\n }\n\n this.sessionActive = false\n this.stopLevelMonitoring()\n this.finalizeTranscript()\n }\n }\n\n get supported() {\n return Boolean(this.recognition)\n }\n\n get isListening() {\n return this.sessionActive || this.listening\n }\n\n private finalizeTranscript() {\n this.callbacks.onListeningChange(false)\n this.callbacks.onLevelChange(0)\n const finalText = sanitizeSpokenText(this.finalTranscript)\n this.finalTranscript = \"\"\n this.interimTranscript = \"\"\n const shouldSend = this.shouldSendOnEnd\n this.shouldSendOnEnd = false\n this.manualStopRequested = false\n\n if (!shouldSend) {\n this.callbacks.onStatusChange(this.statusAfterEnd)\n this.statusAfterEnd = \"Голосовой ввод остановлен.\"\n return\n }\n\n if (!finalText) {\n this.callbacks.onStatusChange(\"Не удалось получить полезный текст из голоса.\")\n this.statusAfterEnd = \"Голосовой ввод остановлен.\"\n return\n }\n\n this.callbacks.onStatusChange(\"Голос распознан. Проверьте текст и отправьте сообщение.\")\n this.statusAfterEnd = \"Голосовой ввод остановлен.\"\n this.callbacks.onFinalTranscript(finalText)\n }\n\n private stopLevelMonitoring() {\n if (this.levelFrameId !== null) {\n window.cancelAnimationFrame(this.levelFrameId)\n this.levelFrameId = null\n }\n\n this.analyser?.disconnect()\n this.sourceNode?.disconnect()\n this.analyser = null\n this.sourceNode = null\n\n if (this.mediaStream) {\n for (const track of this.mediaStream.getTracks()) {\n track.stop()\n }\n this.mediaStream = null\n }\n\n if (this.audioContext) {\n void this.audioContext.close().catch(() => undefined)\n this.audioContext = null\n }\n\n this.smoothedLevel = 0\n this.callbacks.onLevelChange(0)\n }\n\n private sampleLevel() {\n if (!this.analyser) {\n this.callbacks.onLevelChange(0)\n return\n }\n\n const data = new Uint8Array(this.analyser.fftSize)\n const tick = () => {\n if (!this.analyser || (!this.sessionActive && !this.listening)) {\n this.callbacks.onLevelChange(0)\n return\n }\n\n this.analyser.getByteTimeDomainData(data)\n let sum = 0\n for (const value of data) {\n const normalized = (value - 128) / 128\n sum += normalized * normalized\n }\n const rms = Math.sqrt(sum / data.length)\n const level = Math.min(1, rms * 4.6)\n this.smoothedLevel = this.smoothedLevel * 0.68 + level * 0.32\n this.callbacks.onLevelChange(this.smoothedLevel)\n this.levelFrameId = window.requestAnimationFrame(tick)\n }\n\n tick()\n }\n\n private async startLevelMonitoring() {\n if (typeof window === \"undefined\" || !window.isSecureContext || !navigator.mediaDevices?.getUserMedia) {\n this.callbacks.onLevelChange(0)\n return\n }\n\n this.stopLevelMonitoring()\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n },\n })\n\n if (!this.sessionActive && !this.listening) {\n for (const track of stream.getTracks()) {\n track.stop()\n }\n return\n }\n\n const AudioContextCtor = window.AudioContext || (window as Window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext\n if (!AudioContextCtor) {\n for (const track of stream.getTracks()) {\n track.stop()\n }\n return\n }\n\n this.mediaStream = stream\n this.audioContext = new AudioContextCtor()\n this.sourceNode = this.audioContext.createMediaStreamSource(stream)\n this.analyser = this.audioContext.createAnalyser()\n this.analyser.fftSize = 128\n this.analyser.smoothingTimeConstant = 0.72\n this.sourceNode.connect(this.analyser)\n this.sampleLevel()\n } catch {\n this.callbacks.onLevelChange(0)\n }\n }\n\n private clearRestartTimer() {\n if (this.restartTimeoutId !== null) {\n window.clearTimeout(this.restartTimeoutId)\n this.restartTimeoutId = null\n }\n }\n\n private scheduleRestart() {\n this.clearRestartTimer()\n this.restartTimeoutId = window.setTimeout(() => {\n this.restartTimeoutId = null\n if (!this.recognition || !this.sessionActive || this.manualStopRequested) {\n return\n }\n try {\n this.recognition.lang = this.callbacks.getLanguage()\n this.recognition.start()\n } catch {\n this.sessionActive = false\n this.callbacks.onListeningChange(false)\n this.callbacks.onError(\"Не удалось продолжить голосовой ввод.\")\n }\n }, 160)\n }\n\n start() {\n if (!this.recognition) {\n this.callbacks.onError(\"Голосовой ввод не поддерживается в этом браузере.\")\n return false\n }\n if (this.sessionActive || this.listening) {\n return true\n }\n\n this.finalTranscript = \"\"\n this.interimTranscript = \"\"\n this.shouldSendOnEnd = false\n this.sessionActive = true\n this.manualStopRequested = false\n this.statusAfterEnd = \"Голосовой ввод остановлен.\"\n this.recognition.lang = this.callbacks.getLanguage()\n this.clearRestartTimer()\n\n try {\n this.recognition.start()\n void this.startLevelMonitoring()\n return true\n } catch {\n this.sessionActive = false\n this.stopLevelMonitoring()\n this.callbacks.onError(\"Не удалось запустить голосовой ввод.\")\n return false\n }\n }\n\n stop() {\n if (!this.recognition || (!this.listening && !this.sessionActive)) {\n return\n }\n this.manualStopRequested = true\n this.sessionActive = false\n this.shouldSendOnEnd = true\n this.clearRestartTimer()\n this.stopLevelMonitoring()\n if (this.listening) {\n this.recognition.stop()\n } else {\n this.finalizeTranscript()\n }\n }\n\n cancel() {\n if (!this.recognition) {\n return\n }\n this.manualStopRequested = true\n this.sessionActive = false\n this.shouldSendOnEnd = false\n this.clearRestartTimer()\n this.stopLevelMonitoring()\n if (this.listening) {\n this.recognition.abort()\n } else {\n this.callbacks.onListeningChange(false)\n this.callbacks.onLevelChange(0)\n }\n }\n\n destroy() {\n this.cancel()\n if (!this.recognition) {\n return\n }\n this.recognition.onstart = null\n this.recognition.onresult = null\n this.recognition.onerror = null\n this.recognition.onend = null\n }\n}\n","export const EMBED_WIDGET_STYLES = `\n :host {\n all: initial;\n display: block;\n position: static;\n color-scheme: light;\n }\n\n *, *::before, *::after {\n box-sizing: border-box;\n }\n\n button,\n input {\n font: inherit;\n }\n\n .blinq-shell {\n position: fixed;\n bottom: 24px;\n z-index: 2147483647;\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 432px;\n max-width: calc(100vw - 24px);\n pointer-events: none;\n font-family:\n \"SF Pro Display\",\n \"SF Pro Text\",\n \"Inter\",\n ui-sans-serif,\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n sans-serif;\n --blinq-accent: #111111;\n --blinq-text: rgba(18, 18, 20, 0.96);\n --blinq-text-soft: rgba(32, 34, 38, 0.82);\n --blinq-text-muted: rgba(56, 60, 66, 0.58);\n --blinq-glass-fill: linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(240, 243, 248, 0.52));\n --blinq-glass-fill-strong: linear-gradient(180deg, rgba(255, 255, 255, 0.88), rgba(245, 247, 250, 0.62));\n --blinq-glass-fill-dense: linear-gradient(180deg, rgba(249, 250, 252, 0.92), rgba(231, 235, 241, 0.66));\n --blinq-glass-stroke: rgba(255, 255, 255, 0.68);\n --blinq-glass-stroke-soft: rgba(255, 255, 255, 0.5);\n --blinq-glass-edge: rgba(100, 109, 123, 0.14);\n --blinq-shadow:\n 0 28px 80px rgba(155, 164, 180, 0.22),\n 0 10px 30px rgba(174, 182, 193, 0.18);\n --blinq-shadow-soft:\n 0 14px 40px rgba(170, 177, 189, 0.18),\n 0 4px 14px rgba(202, 208, 216, 0.18);\n --blinq-inner-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.92);\n --blinq-blur: blur(28px) saturate(170%);\n --blinq-radius-panel: 32px;\n --blinq-radius-pill: 999px;\n --blinq-radius-bubble: 28px;\n --blinq-radius-card: 30px;\n }\n\n .blinq-shell[data-side=\"left\"] {\n left: 24px;\n align-items: flex-start;\n }\n\n .blinq-shell[data-side=\"right\"] {\n right: 24px;\n align-items: flex-end;\n }\n\n .blinq-panel,\n .blinq-launcher {\n pointer-events: auto;\n }\n\n .blinq-shell {\n width: 520px;\n }\n\n .blinq-panel {\n position: relative;\n width: 100%;\n max-width: 432px;\n overflow: hidden;\n border-radius: var(--blinq-radius-panel);\n border: 1px solid var(--blinq-glass-stroke);\n background: var(--blinq-glass-fill);\n box-shadow: var(--blinq-shadow);\n backdrop-filter: var(--blinq-blur);\n -webkit-backdrop-filter: var(--blinq-blur);\n }\n\n .blinq-panel::before,\n .blinq-launcher::before {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n box-shadow: var(--blinq-inner-highlight);\n }\n\n .blinq-launcher::after {\n content: \"\";\n position: absolute;\n inset: 1px;\n pointer-events: none;\n border-radius: inherit;\n background:\n radial-gradient(circle at 28% 22%, rgba(255, 255, 255, 0.82), transparent 32%),\n linear-gradient(135deg, rgba(255, 255, 255, 0.46), transparent 55%);\n opacity: 0.88;\n transition:\n opacity 180ms ease;\n }\n\n .blinq-panel::after {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n background:\n radial-gradient(circle at top left, rgba(255, 255, 255, 0.72), transparent 34%),\n radial-gradient(circle at bottom center, rgba(255, 255, 255, 0.26), transparent 38%);\n opacity: 0.95;\n }\n\n .blinq-header,\n .blinq-thread,\n .blinq-composer {\n position: relative;\n z-index: 1;\n }\n\n .blinq-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 18px 18px 10px;\n }\n\n .blinq-header-row {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n }\n\n .blinq-header-copy {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n flex: 1;\n }\n\n .blinq-heading {\n font-size: 17px;\n line-height: 1.15;\n font-weight: 600;\n letter-spacing: -0.03em;\n color: var(--blinq-text);\n }\n\n .blinq-status-line {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n max-width: fit-content;\n min-height: 32px;\n padding: 0 12px;\n border-radius: var(--blinq-radius-pill);\n border: 1px solid var(--blinq-glass-stroke-soft);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(242, 244, 248, 0.46));\n color: var(--blinq-text-soft);\n font-size: 12px;\n line-height: 1.35;\n box-shadow: var(--blinq-shadow-soft);\n backdrop-filter: blur(22px) saturate(170%);\n -webkit-backdrop-filter: blur(22px) saturate(170%);\n }\n\n .blinq-status-line::before {\n content: \"\";\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: rgba(17, 17, 17, 0.74);\n box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.34);\n flex: none;\n }\n\n .blinq-launcher {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 76px;\n min-width: 76px;\n height: 76px;\n padding: 0;\n border-radius: 999px;\n border: 1px solid var(--blinq-glass-stroke);\n background: var(--blinq-glass-fill-strong);\n box-shadow: var(--blinq-shadow-soft);\n backdrop-filter: blur(26px) saturate(175%);\n -webkit-backdrop-filter: blur(26px) saturate(175%);\n color: var(--blinq-text);\n isolation: isolate;\n }\n\n .blinq-launcher:hover {\n border-color: var(--blinq-glass-stroke);\n box-shadow: var(--blinq-shadow-soft);\n }\n\n .blinq-launcher-icon-only {\n border-radius: 999px;\n }\n\n .blinq-launcher-icon {\n position: relative;\n z-index: 1;\n width: 30px;\n height: 30px;\n color: rgba(17, 17, 17, 0.96);\n opacity: 1;\n filter:\n drop-shadow(0 1px 0 rgba(255, 255, 255, 0.66))\n drop-shadow(0 2px 6px rgba(17, 17, 17, 0.08));\n }\n\n .blinq-thread {\n min-height: 0;\n }\n\n .blinq-thread-viewport {\n width: 100%;\n }\n\n .blinq-scroll {\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n max-height: 432px;\n padding: 6px 18px 14px;\n overflow-y: auto;\n }\n\n .blinq-scroll::-webkit-scrollbar {\n width: 8px;\n }\n\n .blinq-scroll::-webkit-scrollbar-thumb {\n background: rgba(144, 151, 162, 0.22);\n border-radius: 999px;\n }\n\n .blinq-message {\n position: relative;\n max-width: 88%;\n padding: 14px 16px;\n border-radius: var(--blinq-radius-bubble);\n border: 1px solid var(--blinq-glass-stroke-soft);\n background: var(--blinq-glass-fill-strong);\n color: var(--blinq-text);\n font-size: 14px;\n line-height: 1.55;\n white-space: pre-wrap;\n box-shadow: var(--blinq-shadow-soft);\n backdrop-filter: blur(24px) saturate(170%);\n -webkit-backdrop-filter: blur(24px) saturate(170%);\n }\n\n .blinq-message::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n box-shadow: var(--blinq-inner-highlight);\n }\n\n .blinq-message[data-role=\"assistant\"] {\n align-self: flex-start;\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.86), rgba(241, 244, 249, 0.58));\n }\n\n .blinq-message[data-role=\"user\"] {\n align-self: flex-end;\n background: linear-gradient(180deg, rgba(249, 250, 252, 0.94), rgba(227, 232, 238, 0.66));\n border-color: rgba(255, 255, 255, 0.74);\n }\n\n .blinq-message[data-kind=\"artifact\"] {\n width: 100%;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-message[data-kind=\"artifact\"]::before {\n display: none;\n }\n\n .blinq-message-copy {\n display: block;\n }\n\n .blinq-message-copy-reveal {\n animation: blinq-copy-reveal 240ms cubic-bezier(0.16, 1, 0.3, 1);\n will-change: opacity, transform;\n }\n\n .blinq-thinking-card {\n max-width: fit-content;\n padding-right: 18px;\n }\n\n .blinq-thinking {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n color: var(--blinq-text-soft);\n font-size: 13px;\n }\n\n .blinq-thinking-dots {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n\n .blinq-thinking-dots > span {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: rgba(17, 17, 17, 0.74);\n animation: blinq-thinking-pulse 1.2s ease-in-out infinite;\n }\n\n .blinq-thinking-dots > span:nth-child(2) {\n animation-delay: 100ms;\n }\n\n .blinq-thinking-dots > span:nth-child(3) {\n animation-delay: 200ms;\n }\n\n .blinq-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n border-radius: var(--blinq-radius-card);\n border: 1px solid var(--blinq-glass-stroke-soft);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(240, 243, 248, 0.52));\n color: var(--blinq-text);\n box-shadow: var(--blinq-shadow-soft);\n backdrop-filter: blur(26px) saturate(170%);\n -webkit-backdrop-filter: blur(26px) saturate(170%);\n }\n\n .blinq-card-header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px 16px 0;\n }\n\n .blinq-card-title {\n font-size: 15px;\n line-height: 1.2;\n font-weight: 600;\n letter-spacing: -0.02em;\n color: var(--blinq-text);\n }\n\n .blinq-card-description {\n font-size: 13px;\n line-height: 1.45;\n color: var(--blinq-text-muted);\n }\n\n .blinq-card-content {\n padding: 0 16px 16px;\n }\n\n .blinq-action-card,\n .blinq-plan-card,\n .blinq-guide-card {\n align-self: stretch;\n }\n\n .blinq-guide-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .blinq-guide-step-shell {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 14px;\n border-radius: 22px;\n border: 1px solid rgba(255, 255, 255, 0.64);\n background:\n radial-gradient(circle at top left, rgba(255, 255, 255, 0.8), transparent 42%),\n linear-gradient(180deg, rgba(255, 255, 255, 0.82), rgba(242, 245, 249, 0.56));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.94),\n 0 10px 22px rgba(183, 191, 201, 0.13);\n }\n\n .blinq-guide-step-meta {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--blinq-text-soft);\n }\n\n .blinq-guide-step-title {\n font-size: 14px;\n line-height: 1.35;\n font-weight: 600;\n color: var(--blinq-text);\n }\n\n .blinq-guide-step-copy {\n font-size: 13px;\n line-height: 1.5;\n color: var(--blinq-text-muted);\n }\n\n .blinq-plan-step {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px 13px;\n margin-top: 10px;\n border-radius: 24px;\n border: 1px solid rgba(255, 255, 255, 0.62);\n background:\n radial-gradient(circle at top left, rgba(255, 255, 255, 0.72), transparent 38%),\n linear-gradient(180deg, rgba(255, 255, 255, 0.76), rgba(238, 242, 247, 0.54));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.94),\n 0 8px 20px rgba(189, 196, 206, 0.12);\n }\n\n .blinq-plan-step:first-child {\n margin-top: 0;\n }\n\n .blinq-plan-step-index {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.7);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.86), rgba(240, 243, 247, 0.62));\n color: rgba(17, 17, 17, 0.82);\n font-size: 11px;\n font-weight: 700;\n flex: none;\n }\n\n .blinq-plan-step-copy {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n color: var(--blinq-text);\n font-size: 13px;\n flex: 1;\n }\n\n .blinq-plan-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n }\n\n .blinq-plan-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .blinq-plan-steps {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n .blinq-plan-step-title-row {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 10px;\n }\n\n .blinq-plan-step-title {\n min-width: 0;\n font-size: 13px;\n line-height: 1.4;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .blinq-plan-step-status-pill {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.58);\n background: rgba(255, 255, 255, 0.58);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.88);\n color: var(--blinq-text-soft);\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n white-space: nowrap;\n }\n\n .blinq-plan-step-meta {\n font-size: 12px;\n color: var(--blinq-text-muted);\n }\n\n .blinq-plan-step[data-current=\"true\"] {\n background:\n radial-gradient(circle at top left, rgba(255, 255, 255, 0.82), transparent 40%),\n linear-gradient(180deg, rgba(255, 255, 255, 0.88), rgba(243, 246, 250, 0.64));\n border-color: rgba(255, 255, 255, 0.74);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.96),\n 0 12px 26px rgba(183, 191, 201, 0.15);\n }\n\n .blinq-plan-step[data-current=\"true\"] .blinq-plan-step-index {\n box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.48);\n }\n\n .blinq-plan-step[data-current=\"true\"] .blinq-plan-step-status-pill {\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.82), rgba(240, 243, 247, 0.66));\n color: var(--blinq-text);\n }\n\n .blinq-plan-step[data-status=\"completed\"] .blinq-plan-step-index {\n background: rgba(227, 232, 237, 0.88);\n }\n\n .blinq-plan-step[data-status=\"completed\"] .blinq-plan-step-status-pill {\n background: rgba(244, 246, 249, 0.78);\n }\n\n .blinq-plan-step[data-status=\"failed\"],\n .blinq-plan-step[data-status=\"cancelled\"] {\n opacity: 0.72;\n }\n\n .blinq-action-meta-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .blinq-action-details {\n margin-top: 8px;\n }\n\n .blinq-action-details > summary {\n display: inline-flex;\n align-items: center;\n min-height: 34px;\n padding: 0 12px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.56);\n background: rgba(255, 255, 255, 0.46);\n color: var(--blinq-text-soft);\n font-size: 12px;\n font-weight: 600;\n list-style: none;\n cursor: pointer;\n }\n\n .blinq-action-details > summary::-webkit-details-marker {\n display: none;\n }\n\n .blinq-code {\n margin-top: 10px;\n padding: 12px 14px;\n border-radius: 20px;\n border: 1px solid rgba(255, 255, 255, 0.56);\n background: rgba(255, 255, 255, 0.52);\n color: var(--blinq-text-soft);\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-wrap;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n\n .blinq-action-state {\n margin-top: 12px;\n font-size: 12px;\n line-height: 1.4;\n color: var(--blinq-text-muted);\n }\n\n .blinq-action-state[data-state=\"approved\"] {\n color: var(--blinq-text-soft);\n }\n\n .blinq-action-state[data-state=\"declined\"] {\n color: var(--blinq-text-muted);\n }\n\n .blinq-actions {\n display: flex;\n gap: 10px;\n margin-top: 14px;\n }\n\n .blinq-actions > * {\n flex: 1;\n }\n\n .blinq-badge-pill {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 30px;\n padding: 0 12px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.54);\n background: rgba(255, 255, 255, 0.46);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--blinq-text-soft);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.82);\n }\n\n .blinq-badge-pill-default {\n background: rgba(255, 255, 255, 0.5);\n }\n\n .blinq-badge-pill-outline {\n background: rgba(247, 248, 250, 0.34);\n color: var(--blinq-text-muted);\n }\n\n .blinq-badge-pill-soft {\n background: rgba(255, 255, 255, 0.68);\n color: var(--blinq-text-soft);\n }\n\n .blinq-badge-pill-accent {\n background: rgba(243, 245, 249, 0.84);\n color: var(--blinq-text);\n }\n\n .blinq-composer {\n padding: 8px 18px 18px;\n }\n\n .blinq-composer-controls {\n display: flex;\n }\n\n .blinq-input-shell {\n position: relative;\n width: 100%;\n }\n\n .blinq-input,\n .blinq-recording-input {\n width: 100%;\n min-width: 0;\n height: 58px;\n padding: 0 54px 0 54px;\n border-radius: 999px;\n border: 1px solid var(--blinq-glass-stroke);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.82), rgba(239, 242, 247, 0.54));\n color: var(--blinq-text);\n box-shadow:\n var(--blinq-inner-highlight),\n 0 10px 26px rgba(183, 189, 198, 0.16);\n font-size: 13px;\n outline: none;\n backdrop-filter: blur(22px) saturate(170%);\n -webkit-backdrop-filter: blur(22px) saturate(170%);\n }\n\n .blinq-input::placeholder {\n color: var(--blinq-text-muted);\n }\n\n .blinq-recording-input {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .blinq-recording-time {\n flex: none;\n min-width: 42px;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.04em;\n color: var(--blinq-text-soft);\n font-variant-numeric: tabular-nums;\n }\n\n .blinq-recording-wave-shell {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n height: 30px;\n padding: 0 10px;\n border-radius: 999px;\n border: 1px solid rgba(255, 255, 255, 0.54);\n background:\n linear-gradient(180deg, rgba(255, 255, 255, 0.54), rgba(242, 245, 248, 0.34));\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.84);\n overflow: hidden;\n }\n\n .blinq-recording-wave-shell::before {\n content: \"\";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 50%;\n height: 1px;\n border-radius: 999px;\n background: linear-gradient(90deg, transparent, rgba(17, 17, 17, 0.12), transparent);\n transform: translateY(-50%);\n pointer-events: none;\n }\n\n .blinq-recording-waveform {\n position: relative;\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1;\n min-width: 0;\n height: 100%;\n overflow: hidden;\n }\n\n .blinq-recording-waveform-bar {\n width: 4px;\n min-width: 4px;\n height: 62%;\n border-radius: 999px;\n background: linear-gradient(180deg, rgba(17, 17, 17, 0.14), rgba(17, 17, 17, 0.36));\n transform-origin: center;\n transition:\n transform 120ms ease,\n opacity 160ms ease;\n opacity: 0.92;\n box-shadow:\n 0 0 0 1px rgba(255, 255, 255, 0.26),\n 0 2px 8px rgba(17, 17, 17, 0.08);\n }\n\n .blinq-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n border: 1px solid transparent;\n border-radius: 999px;\n color: var(--blinq-text);\n font-size: 14px;\n font-weight: 600;\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(236, 239, 244, 0.5));\n box-shadow: var(--blinq-shadow-soft);\n backdrop-filter: blur(20px) saturate(170%);\n -webkit-backdrop-filter: blur(20px) saturate(170%);\n transition:\n transform 160ms ease,\n box-shadow 180ms ease,\n border-color 180ms ease,\n background 180ms ease,\n opacity 120ms ease;\n cursor: pointer;\n outline: none;\n }\n\n .blinq-button:hover:not(:disabled) {\n transform: translateY(-1px);\n border-color: rgba(255, 255, 255, 0.82);\n box-shadow:\n 0 14px 28px rgba(175, 181, 191, 0.22),\n 0 4px 10px rgba(189, 195, 204, 0.16);\n }\n\n .blinq-input-mic:hover:not(:disabled),\n .blinq-input-send:hover:not(:disabled) {\n transform: translateY(-50%);\n border-color: rgba(255, 255, 255, 0.82);\n box-shadow:\n 0 14px 28px rgba(175, 181, 191, 0.16),\n 0 4px 10px rgba(189, 195, 204, 0.12);\n }\n\n .blinq-button:disabled {\n opacity: 0.52;\n cursor: not-allowed;\n }\n\n .blinq-button:focus-visible,\n .blinq-input:focus-visible {\n box-shadow:\n 0 0 0 3px rgba(255, 255, 255, 0.68),\n 0 0 0 6px rgba(17, 17, 17, 0.08);\n }\n\n .blinq-button-default {\n border-color: rgba(255, 255, 255, 0.74);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.84), rgba(237, 241, 247, 0.66));\n color: var(--blinq-text);\n }\n\n .blinq-button-outline,\n .blinq-button-ghost {\n border-color: rgba(255, 255, 255, 0.58);\n background: rgba(255, 255, 255, 0.42);\n color: var(--blinq-text-soft);\n }\n\n .blinq-button-destructive {\n border-color: rgba(255, 255, 255, 0.58);\n background: linear-gradient(180deg, rgba(248, 249, 251, 0.7), rgba(230, 233, 239, 0.54));\n color: var(--blinq-text);\n }\n\n .blinq-button-md {\n height: 44px;\n padding: 0 16px;\n }\n\n .blinq-button-sm {\n height: 38px;\n padding: 0 13px;\n font-size: 13px;\n }\n\n .blinq-button-icon {\n width: 48px;\n height: 48px;\n padding: 0;\n }\n\n .blinq-button-icon-sm {\n width: 38px;\n height: 38px;\n padding: 0;\n }\n\n .blinq-input-mic,\n .blinq-input-send {\n position: absolute;\n top: 50%;\n z-index: 2;\n width: 42px;\n height: 42px;\n min-width: 42px;\n transform: translateY(-50%);\n }\n\n .blinq-input-mic {\n left: 8px;\n }\n\n .blinq-input-send {\n right: 8px;\n }\n\n .blinq-panel {\n display: flex;\n flex-direction: column;\n height: min(720px, calc(100vh - 64px));\n max-width: 520px;\n border: 1px solid rgba(226, 232, 240, 0.96);\n border-radius: 30px;\n background: #ffffff;\n box-shadow:\n 0 28px 80px rgba(15, 23, 42, 0.14),\n 0 10px 28px rgba(15, 23, 42, 0.08);\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-panel::before,\n .blinq-panel::after,\n .blinq-message::before,\n .blinq-status-line::before {\n display: none;\n }\n\n .blinq-header {\n flex: none;\n gap: 0;\n padding: 22px 24px 18px;\n border-bottom: 1px solid rgba(226, 232, 240, 0.86);\n background: #ffffff;\n }\n\n .blinq-header-row {\n align-items: center;\n gap: 14px;\n }\n\n .blinq-header-copy {\n gap: 5px;\n }\n\n .blinq-heading {\n font-size: 22px;\n line-height: 1.05;\n font-weight: 700;\n letter-spacing: -0.04em;\n color: #111827;\n }\n\n .blinq-status-line {\n display: block;\n max-width: 100%;\n min-height: 0;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.35;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 64px;\n min-width: 64px;\n height: 64px;\n overflow: visible;\n border: 1px solid rgba(226, 232, 240, 0.95);\n border-radius: 999px;\n background:\n radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.98), rgba(248, 250, 252, 0.86)),\n #ffffff;\n box-shadow:\n 0 14px 26px rgba(15, 23, 42, 0.08),\n inset 0 1px 0 rgba(255, 255, 255, 0.9);\n color: #111827;\n flex: none;\n }\n\n .blinq-avatar-image {\n width: 100%;\n height: 100%;\n border-radius: inherit;\n object-fit: cover;\n }\n\n .blinq-avatar-icon {\n color: #111827;\n }\n\n .blinq-avatar-status {\n position: absolute;\n right: 5px;\n bottom: 6px;\n width: 11px;\n height: 11px;\n border: 2px solid #ffffff;\n border-radius: 999px;\n background: #21d262;\n box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.04);\n }\n\n .blinq-avatar-label {\n display: none;\n }\n\n .blinq-thread {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n background: #ffffff;\n }\n\n .blinq-thread-viewport {\n flex: 1 1 auto;\n height: 100%;\n }\n\n .blinq-scroll {\n flex: 1 1 auto;\n gap: 12px;\n max-height: none;\n min-height: 0;\n padding: 30px 24px 20px;\n background: #ffffff;\n }\n\n .blinq-message {\n max-width: 82%;\n padding: 10px 15px;\n border: 1px solid rgba(226, 232, 240, 0.96);\n border-radius: 18px;\n background: #ffffff;\n box-shadow: none;\n color: #111827;\n font-size: 15px;\n line-height: 1.48;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-message[data-role=\"assistant\"] {\n background: #ffffff;\n }\n\n .blinq-message[data-role=\"user\"] {\n border-color: rgba(209, 213, 219, 0.96);\n background: #f8fafc;\n }\n\n .blinq-card,\n .blinq-guide-step-shell,\n .blinq-plan-step {\n border-color: rgba(226, 232, 240, 0.92);\n background: #ffffff;\n box-shadow: none;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-composer {\n flex: none;\n padding: 18px 24px 8px;\n border-top: 1px solid rgba(226, 232, 240, 0.86);\n background: #ffffff;\n }\n\n .blinq-input,\n .blinq-recording-input {\n height: 56px;\n padding: 0 60px 0 54px;\n border: 1px solid rgba(209, 213, 219, 0.92);\n border-radius: 999px;\n background: #ffffff;\n box-shadow: none;\n color: #111827;\n font-size: 15px;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .blinq-input::placeholder {\n color: #9ca3af;\n }\n\n .blinq-input-mic {\n left: 7px;\n width: 42px;\n min-width: 42px;\n height: 42px;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: #6b7280;\n }\n\n .blinq-input-send {\n right: 7px;\n width: 42px;\n min-width: 42px;\n height: 42px;\n border: 0;\n background: #6b6f76;\n box-shadow: none;\n color: #ffffff;\n }\n\n .blinq-input-send:hover:not(:disabled) {\n transform: translateY(-50%);\n background: #4b5563;\n box-shadow: none;\n }\n\n .blinq-button-ghost {\n border-color: transparent;\n background: transparent;\n box-shadow: none;\n }\n\n .blinq-powered {\n flex: none;\n padding: 0 24px 18px;\n color: #c0c4ca;\n font-size: 10px;\n font-weight: 800;\n letter-spacing: 0.16em;\n line-height: 1;\n text-align: center;\n }\n\n @keyframes blinq-thinking-pulse {\n 0%, 100% {\n opacity: 0.28;\n transform: translateY(0);\n }\n\n 50% {\n opacity: 1;\n transform: translateY(-1.5px);\n }\n }\n\n @keyframes blinq-copy-reveal {\n 0% {\n opacity: 0;\n transform: translateY(3px);\n }\n\n 100% {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes blinq-orbit-drift {\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes blinq-orbit-pulse {\n 0%, 100% {\n transform: scale(1);\n opacity: 0.9;\n }\n\n 50% {\n transform: scale(1.16);\n opacity: 1;\n }\n }\n\n @keyframes blinq-core-breathe {\n 0%, 100% {\n transform: scale(1);\n }\n\n 50% {\n transform: scale(1.04);\n }\n }\n\n @media (max-width: 720px) {\n .blinq-shell {\n right: 12px;\n left: 12px;\n bottom: 12px;\n width: auto;\n max-width: none;\n align-items: stretch;\n }\n\n .blinq-shell[data-side=\"left\"],\n .blinq-shell[data-side=\"right\"] {\n right: 12px;\n left: 12px;\n align-items: stretch;\n }\n\n .blinq-panel,\n .blinq-launcher {\n width: 100%;\n max-width: none;\n }\n\n .blinq-launcher {\n width: 76px;\n min-width: 76px;\n height: 76px;\n align-self: flex-end;\n }\n\n .blinq-message {\n max-width: 92%;\n }\n\n .blinq-actions {\n flex-direction: column;\n }\n\n .blinq-input,\n .blinq-recording-input {\n height: 56px;\n }\n\n .blinq-panel {\n height: min(700px, calc(100vh - 24px));\n }\n }\n`\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":["React","isBrowser","selectedText","normalizedText","isBrowser","payload","finalText"]}
|