@pillar-ai/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -0
- package/dist/actions/definitions/analytics.d.ts +18 -0
- package/dist/actions/definitions/content.d.ts +40 -0
- package/dist/actions/definitions/index.d.ts +26 -0
- package/dist/actions/definitions/navigation.d.ts +65 -0
- package/dist/actions/definitions/settings.d.ts +162 -0
- package/dist/actions/definitions/sources.d.ts +44 -0
- package/dist/actions/definitions/support.d.ts +15 -0
- package/dist/actions/definitions/team.d.ts +120 -0
- package/dist/actions/index.d.ts +33 -0
- package/dist/actions/registry.d.ts +110 -0
- package/dist/actions/types.d.ts +388 -0
- package/dist/api/client.d.ts +186 -0
- package/dist/api/mcp-client.d.ts +226 -0
- package/dist/button/FloatingButton.d.ts +44 -0
- package/dist/cli/sync.d.ts +2 -0
- package/dist/components/Button/EdgeTrigger.d.ts +78 -0
- package/dist/components/Button/FloatingButton.d.ts +46 -0
- package/dist/components/Button/index.d.ts +5 -0
- package/dist/components/Cards/ConfirmActionCard.d.ts +23 -0
- package/dist/components/Cards/index.d.ts +6 -0
- package/dist/components/Panel/ChatInput.d.ts +5 -0
- package/dist/components/Panel/ContextTag.d.ts +18 -0
- package/dist/components/Panel/Header.d.ts +14 -0
- package/dist/components/Panel/Panel.d.ts +104 -0
- package/dist/components/Panel/PanelContent.d.ts +6 -0
- package/dist/components/Panel/TaskButton.d.ts +59 -0
- package/dist/components/Panel/UnifiedChatInput.d.ts +23 -0
- package/dist/components/Panel/WorkflowChecklist.d.ts +9 -0
- package/dist/components/Panel/index.d.ts +13 -0
- package/dist/components/Panel/styles.d.ts +20 -0
- package/dist/components/Plan/InlinePlanView.d.ts +24 -0
- package/dist/components/Plan/PlanStepItem.d.ts +18 -0
- package/dist/components/Plan/PlanView.d.ts +10 -0
- package/dist/components/Plan/index.d.ts +8 -0
- package/dist/components/TextSelection/TextSelectionManager.d.ts +34 -0
- package/dist/components/TextSelection/TextSelectionPopover.d.ts +14 -0
- package/dist/components/TextSelection/index.d.ts +6 -0
- package/dist/components/TextSelection/styles.d.ts +5 -0
- package/dist/components/Tooltips/Tooltip.d.ts +46 -0
- package/dist/components/Tooltips/TooltipManager.d.ts +41 -0
- package/dist/components/Tooltips/index.d.ts +6 -0
- package/dist/components/Tooltips/styles.d.ts +5 -0
- package/dist/components/Views/ArticleChatView.d.ts +9 -0
- package/dist/components/Views/ArticleView.d.ts +10 -0
- package/dist/components/Views/CategoryView.d.ts +11 -0
- package/dist/components/Views/ChatView.d.ts +5 -0
- package/dist/components/Views/DeveloperView.d.ts +6 -0
- package/dist/components/Views/HomeView.d.ts +5 -0
- package/dist/components/Views/SearchView.d.ts +10 -0
- package/dist/components/Views/index.d.ts +5 -0
- package/dist/components/context.d.ts +21 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/shared/ArticleCard.d.ts +17 -0
- package/dist/components/shared/CategoryCard.d.ts +17 -0
- package/dist/components/shared/Empty.d.ts +11 -0
- package/dist/components/shared/Loading.d.ts +6 -0
- package/dist/components/shared/MessageInputArea.d.ts +19 -0
- package/dist/components/shared/QuestionChip.d.ts +14 -0
- package/dist/components/shared/index.d.ts +7 -0
- package/dist/content/extensions/AccordionNode.d.ts +10 -0
- package/dist/content/extensions/CalloutNode.d.ts +11 -0
- package/dist/content/extensions/index.d.ts +5 -0
- package/dist/content/index.d.ts +5 -0
- package/dist/content/renderer.d.ts +24 -0
- package/dist/core/Pillar.d.ts +454 -0
- package/dist/core/config.d.ts +253 -0
- package/dist/core/context.d.ts +71 -0
- package/dist/core/events.d.ts +228 -0
- package/dist/core/plan-executor.d.ts +101 -0
- package/dist/core/plan.d.ts +155 -0
- package/dist/core/workflow.d.ts +89 -0
- package/dist/index.d.ts +32 -0
- package/dist/panel/Panel.d.ts +53 -0
- package/dist/panel/PanelUI.d.ts +43 -0
- package/dist/panel/components/ArticleCard.d.ts +10 -0
- package/dist/panel/components/CategoryCard.d.ts +10 -0
- package/dist/panel/components/ChatInput.d.ts +36 -0
- package/dist/panel/components/Header.d.ts +16 -0
- package/dist/panel/components/SearchInput.d.ts +11 -0
- package/dist/panel/styles.d.ts +5 -0
- package/dist/panel/views/ArticleView.d.ts +21 -0
- package/dist/panel/views/CategoryView.d.ts +20 -0
- package/dist/panel/views/ChatView.d.ts +30 -0
- package/dist/panel/views/HomeView.d.ts +18 -0
- package/dist/panel/views/SearchView.d.ts +22 -0
- package/dist/pillar.esm.js +10338 -0
- package/dist/pillar.esm.js.map +1 -0
- package/dist/pillar.js +10362 -0
- package/dist/pillar.js.map +1 -0
- package/dist/pillar.min.js +2 -0
- package/dist/pillar.min.js.map +1 -0
- package/dist/store/chat.d.ts +85 -0
- package/dist/store/context.d.ts +46 -0
- package/dist/store/developer.d.ts +19 -0
- package/dist/store/index.d.ts +10 -0
- package/dist/store/panel.d.ts +43 -0
- package/dist/store/plan-persistence.d.ts +47 -0
- package/dist/store/plan.d.ts +45 -0
- package/dist/store/router.d.ts +18 -0
- package/dist/store/tooltips.d.ts +21 -0
- package/dist/store/workflow.d.ts +48 -0
- package/dist/tooltips/Tooltip.d.ts +63 -0
- package/dist/tooltips/TooltipManager.d.ts +42 -0
- package/dist/tooltips/styles.d.ts +5 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/user-context.d.ts +29 -0
- package/dist/utils/dom.d.ts +46 -0
- package/dist/utils/markdown.d.ts +9 -0
- package/dist/utils/positioning.d.ts +52 -0
- package/dist/utils/urlParams.d.ts +27 -0
- package/package.json +86 -0
- package/src/actions/types.ts +468 -0
- package/src/cli/sync.ts +477 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar.min.js","sources":["../src/actions/registry.ts","../src/api/mcp-client.ts","../src/api/client.ts","../../../node_modules/preact/dist/preact.module.js","../../../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../../../node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/@preact/signals-core/dist/signals-core.module.js","../../../node_modules/@preact/signals/dist/signals.module.js","../src/store/panel.ts","../src/utils/dom.ts","../src/components/Button/EdgeTrigger.tsx","../src/components/Button/FloatingButton.tsx","../src/types/user-context.ts","../src/store/chat.ts","../src/store/router.ts","../src/components/Cards/ConfirmActionCard.tsx","../src/components/context.tsx","../src/components/Plan/InlinePlanView.tsx","../src/components/Plan/PlanStepItem.tsx","../src/store/plan.ts","../src/components/Plan/PlanView.tsx","../src/components/Panel/Header.tsx","../src/components/Panel/ContextTag.tsx","../src/components/Panel/UnifiedChatInput.tsx","../src/components/shared/QuestionChip.tsx","../src/components/Views/HomeView.tsx","../../../node_modules/marked/lib/marked.esm.js","../src/utils/markdown.ts","../src/components/Panel/TaskButton.tsx","../src/components/Views/ChatView.tsx","../src/components/Panel/PanelContent.tsx","../src/components/Panel/styles.ts","../src/store/workflow.ts","../src/components/Panel/WorkflowChecklist.tsx","../src/components/Panel/Panel.tsx","../src/components/TextSelection/TextSelectionPopover.tsx","../src/components/TextSelection/TextSelectionManager.tsx","../src/components/TextSelection/styles.ts","../src/utils/positioning.ts","../src/components/Tooltips/Tooltip.tsx","../src/components/Tooltips/styles.ts","../src/components/Tooltips/TooltipManager.tsx","../src/core/context.ts","../src/store/context.ts","../src/utils/urlParams.ts","../src/core/config.ts","../src/core/events.ts","../src/store/plan-persistence.ts","../src/core/plan-executor.ts","../src/core/Pillar.ts","../src/index.ts"],"sourcesContent":["/**\n * Action Registry - Manages code-defined action handlers.\n *\n * This module provides the registration and lookup mechanism for\n * actions defined in code. Actions are registered using `defineActions()`\n * and can be looked up by name using `getHandler()`.\n *\n * The registry also generates the manifest that gets synced to the server\n * during CI/CD builds.\n */\nimport type {\n ActionDefinition,\n ActionDefinitions,\n ActionManifest,\n ActionManifestEntry,\n ClientInfo,\n Platform,\n} from './types';\n\n/**\n * Internal registry state.\n */\ninterface RegistryState {\n actions: Map<string, ActionDefinition>;\n clientInfo: ClientInfo | null;\n}\n\nconst state: RegistryState = {\n actions: new Map(),\n clientInfo: null,\n};\n\n/**\n * Define and register actions with the SDK.\n *\n * Call this during app initialization to register your action handlers.\n * The metadata will be synced to the server during CI/CD builds.\n *\n * @example\n * ```ts\n * import { defineActions } from '@pillar-ai/sdk/actions';\n * import { router } from './router';\n *\n * export const actions = defineActions({\n * open_settings: {\n * description: 'Navigate to the settings page',\n * type: 'navigate',\n * path: '/settings',\n * handler: () => router.push('/settings'),\n * },\n * open_billing: {\n * description: 'Navigate to billing and subscription management',\n * type: 'navigate',\n * path: '/settings/billing',\n * autoRun: true,\n * handler: (data) => router.push('/settings/billing', data),\n * },\n * });\n * ```\n *\n * @param actions - Map of action name to definition\n * @returns The same actions object (for re-export convenience)\n */\nexport function defineActions<T extends ActionDefinitions>(actions: T): T {\n for (const [name, definition] of Object.entries(actions)) {\n if (state.actions.has(name)) {\n console.warn(`[Pillar] Action \"${name}\" is already registered. Overwriting.`);\n }\n state.actions.set(name, definition);\n }\n return actions;\n}\n\n/**\n * Set client platform and version info.\n *\n * Called internally by Pillar.init() to set platform/version\n * for API requests.\n *\n * @param platform - Platform identifier (web, ios, android, desktop)\n * @param version - App version (semver or git SHA)\n */\nexport function setClientInfo(platform: Platform, version: string): void {\n state.clientInfo = { platform, version };\n}\n\n/**\n * Get the current client info.\n *\n * @returns Client info or null if not set\n */\nexport function getClientInfo(): ClientInfo | null {\n return state.clientInfo;\n}\n\n/**\n * Get a registered action handler by name.\n *\n * @param name - Action name (e.g., \"open_settings\")\n * @returns Handler function or undefined if not found\n */\nexport function getHandler(\n name: string\n): ActionDefinition['handler'] | undefined {\n const action = state.actions.get(name);\n return action?.handler;\n}\n\n/**\n * Get a registered action definition by name.\n *\n * @param name - Action name\n * @returns Action definition or undefined if not found\n */\nexport function getActionDefinition(\n name: string\n): ActionDefinition | undefined {\n return state.actions.get(name);\n}\n\n/**\n * Check if an action is registered.\n *\n * @param name - Action name\n * @returns True if registered\n */\nexport function hasAction(name: string): boolean {\n return state.actions.has(name);\n}\n\n/**\n * Get all registered action names.\n *\n * @returns Array of action names\n */\nexport function getActionNames(): string[] {\n return Array.from(state.actions.keys());\n}\n\n/**\n * Get the action manifest for syncing to the server.\n *\n * Extracts metadata from all registered actions (without handlers)\n * for sending to the Pillar server during CI/CD.\n *\n * @param platform - Platform to include in manifest\n * @param version - Version to include in manifest\n * @param gitSha - Optional git commit SHA\n * @returns Action manifest object\n */\nexport function getManifest(\n platform: Platform,\n version: string,\n gitSha?: string\n): ActionManifest {\n const actions: ActionManifestEntry[] = [];\n\n for (const [name, definition] of state.actions) {\n const entry: ActionManifestEntry = {\n name,\n description: definition.description,\n type: definition.type,\n };\n\n // Only include optional fields if they have values\n if (definition.examples?.length) entry.examples = definition.examples;\n if (definition.path) entry.path = definition.path;\n if (definition.externalUrl) entry.external_url = definition.externalUrl;\n if (definition.autoRun) entry.auto_run = definition.autoRun;\n if (definition.autoComplete) entry.auto_complete = definition.autoComplete;\n if (definition.returns) entry.returns_data = definition.returns;\n if (definition.dataSchema) entry.data_schema = definition.dataSchema;\n if (definition.defaultData) entry.default_data = definition.defaultData;\n if (definition.requiredContext) entry.required_context = definition.requiredContext;\n\n actions.push(entry);\n }\n\n return {\n platform,\n version,\n gitSha,\n generatedAt: new Date().toISOString(),\n actions,\n };\n}\n\n/**\n * Clear all registered actions.\n *\n * Primarily for testing purposes.\n */\nexport function clearRegistry(): void {\n state.actions.clear();\n state.clientInfo = null;\n}\n\n/**\n * Get the count of registered actions.\n *\n * @returns Number of registered actions\n */\nexport function getActionCount(): number {\n return state.actions.size;\n}\n","/**\n * MCP Client for Pillar SDK\n * \n * Implements JSON-RPC 2.0 over HTTP with SSE streaming support\n * for communication with the MCP server.\n */\n\nimport type { TaskButtonData } from '../components/Panel/TaskButton';\nimport type { ResolvedConfig } from '../core/config';\nimport type { ExecutionPlan } from '../core/plan';\nimport type { UserContextItem } from '../types/user-context';\nimport type { ArticleSummary } from './client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** JSON-RPC 2.0 request */\ninterface JSONRPCRequest {\n jsonrpc: '2.0';\n id: number | string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** JSON-RPC 2.0 response */\ninterface JSONRPCResponse<T = unknown> {\n jsonrpc: '2.0';\n id: number | string | null;\n result?: T;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/** JSON-RPC 2.0 notification (streaming progress) */\ninterface JSONRPCNotification {\n jsonrpc: '2.0';\n method: string;\n params?: Record<string, unknown>;\n}\n\n/** MCP Tool result content */\ninterface ToolResultContent {\n type: 'text' | 'image' | 'resource';\n text?: string;\n data?: string;\n mimeType?: string;\n}\n\n/** MCP Tool result */\nexport interface ToolResult {\n content: ToolResultContent[];\n isError?: boolean;\n structuredContent?: {\n sources?: ArticleSummary[];\n actions?: ActionData[];\n plan?: ExecutionPlan;\n };\n _meta?: {\n conversation_id?: string;\n query_log_id?: string;\n };\n}\n\n/** Action data from MCP server */\nexport interface ActionData {\n id: string;\n name: string;\n description: string;\n action_type: string;\n /** If true, action executes immediately without user clicking */\n auto_run: boolean;\n /** If true, action completes without waiting for host confirmation */\n auto_complete: boolean;\n /** If true, action returns data for agent reasoning */\n returns_data: boolean;\n score: number;\n data: Record<string, unknown>;\n}\n\n/** Streaming callbacks for tool calls */\nexport interface StreamCallbacks {\n /** Called for each text token */\n onToken?: (token: string) => void;\n /** Called when sources are available */\n onSources?: (sources: ArticleSummary[]) => void;\n /** Called when actions are available */\n onActions?: (actions: ActionData[]) => void;\n /** Called when a plan is created (from plan.created event) */\n onPlan?: (plan: ExecutionPlan) => void;\n /** Called on error */\n onError?: (error: string) => void;\n /** Called when stream is complete */\n onComplete?: (conversationId?: string, queryLogId?: string) => void;\n /** Called for progress updates */\n onProgress?: (progress: { kind: string; message?: string }) => void;\n}\n\n/** Image for chat requests (from upload-image endpoint) */\nexport interface ChatImage {\n /** Signed GCS URL from upload-image endpoint */\n url: string;\n /** Detail level for image analysis. 'low' is faster and cheaper. */\n detail?: 'low' | 'high';\n}\n\n/** Response from image upload endpoint */\nexport interface ImageUploadResponse {\n url: string;\n expires_at: string;\n}\n\n// ============================================================================\n// MCP Client\n// ============================================================================\n\nexport class MCPClient {\n private config: ResolvedConfig;\n private requestId = 0;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n return `${this.config.apiBaseUrl}/mcp/`;\n }\n\n private get headers(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Pillar-Key': this.config.publicKey,\n 'x-customer-id': this.config.helpCenter,\n };\n\n // Add platform/version headers for code-first action filtering\n if (this.config.platform) {\n headers['X-Pillar-Platform'] = this.config.platform;\n }\n if (this.config.version) {\n headers['X-Pillar-Action-Version'] = this.config.version;\n }\n\n return headers;\n }\n\n private nextId(): number {\n return ++this.requestId;\n }\n\n /**\n * Call an MCP tool (non-streaming).\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<ToolResult> {\n const request: JSONRPCRequest = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/call',\n params: {\n name,\n arguments: args,\n },\n };\n\n const response = await fetch(this.baseUrl, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error?.message || `MCP error: ${response.status}`);\n }\n\n const jsonResponse = await response.json() as JSONRPCResponse<ToolResult>;\n\n if (jsonResponse.error) {\n throw new Error(jsonResponse.error.message);\n }\n\n return jsonResponse.result!;\n }\n\n /**\n * Call an MCP tool with streaming support.\n * \n * @param name - Tool name (e.g., 'ask')\n * @param args - Tool arguments\n * @param callbacks - Streaming event callbacks\n * @param signal - Optional AbortSignal for cancellation\n */\n async callToolStream(\n name: string,\n args: Record<string, unknown>,\n callbacks: StreamCallbacks,\n signal?: AbortSignal\n ): Promise<ToolResult> {\n const requestId = this.nextId();\n const request: JSONRPCRequest = {\n jsonrpc: '2.0',\n id: requestId,\n method: 'tools/call',\n params: {\n name,\n arguments: args,\n stream: true,\n },\n };\n\n const response = await fetch(this.baseUrl, {\n method: 'POST',\n headers: {\n ...this.headers,\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(request),\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`MCP streaming request failed: ${response.statusText} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Read the stream\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let collectedText: string[] = [];\n let finalResult: ToolResult | null = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n // Decode and add to buffer\n const decoded = decoder.decode(value, { stream: true });\n buffer += decoded;\n\n // Process complete events\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n // MCP SSE format: data: {...}\n if (line.startsWith('data: ')) {\n try {\n const jsonStr = line.substring(6);\n const event = JSON.parse(jsonStr);\n\n // Handle JSON-RPC response\n if (event.jsonrpc === '2.0') {\n // Check for error\n if (event.error) {\n callbacks.onError?.(event.error.message || 'Unknown error');\n throw new Error(event.error.message);\n }\n\n // Handle streaming token events (notifications/progress)\n if (event.method === 'notifications/progress') {\n const progress = event.params?.progress;\n if (progress) {\n if (progress.kind === 'token' && progress.token) {\n collectedText.push(progress.token);\n callbacks.onToken?.(progress.token);\n } else if (progress.kind === 'plan_created' && progress.plan) {\n // Plan was created by the ReAct agent\n callbacks.onPlan?.(progress.plan as ExecutionPlan);\n } else if (progress.kind === 'cancelled') {\n // Stream was cancelled\n break;\n } else {\n // Other progress types (search, generating, thinking)\n callbacks.onProgress?.(progress);\n }\n }\n }\n\n // Handle final result event\n if (event.result && event.id === requestId) {\n finalResult = event.result as ToolResult;\n\n // Extract sources\n if (finalResult.structuredContent?.sources) {\n callbacks.onSources?.(finalResult.structuredContent.sources);\n }\n\n // Extract actions\n if (finalResult.structuredContent?.actions) {\n callbacks.onActions?.(finalResult.structuredContent.actions);\n }\n\n // Extract plan (from plan.created event)\n if (finalResult.structuredContent?.plan) {\n callbacks.onPlan?.(finalResult.structuredContent.plan);\n }\n\n // Extract metadata\n const conversationId = finalResult._meta?.conversation_id;\n const queryLogId = finalResult._meta?.query_log_id;\n\n // Fire done callback\n callbacks.onComplete?.(conversationId, queryLogId);\n }\n }\n } catch (parseError) {\n console.error('[MCPClient] Failed to parse event:', parseError, line);\n }\n }\n }\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n // Request was cancelled\n throw error;\n }\n callbacks.onError?.(error instanceof Error ? error.message : 'Stream reading failed');\n throw error;\n } finally {\n reader.releaseLock();\n }\n\n // Build result if not received via final event\n if (!finalResult) {\n finalResult = {\n content: [{ type: 'text', text: collectedText.join('') }],\n isError: false,\n };\n }\n\n return finalResult;\n }\n\n /**\n * Upload an image for use in chat.\n * \n * Returns a signed URL that can be passed to the ask tool.\n * The URL expires after 24 hours.\n * \n * @param file - The image file to upload\n * @returns Promise with signed URL and expiration\n */\n async uploadImage(file: File): Promise<ImageUploadResponse> {\n const uploadUrl = `${this.config.apiBaseUrl}/mcp/upload-image/`;\n\n const formData = new FormData();\n formData.append('image', file);\n\n const response = await fetch(uploadUrl, {\n method: 'POST',\n headers: {\n 'x-customer-id': this.config.helpCenter,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({\n error: 'Upload failed',\n })) as { error?: string };\n throw new Error(errorData.error || 'Upload failed');\n }\n\n return response.json() as Promise<ImageUploadResponse>;\n }\n\n /**\n * Ask a question using the MCP 'ask' tool with streaming.\n * \n * This is a convenience method for the common use case of asking questions.\n * \n * @param query - The question to ask\n * @param callbacks - Streaming callbacks\n * @param options - Optional configuration including images\n */\n async ask(\n query: string,\n callbacks: StreamCallbacks,\n options?: {\n articleSlug?: string;\n userContext?: UserContextItem[];\n images?: ChatImage[];\n signal?: AbortSignal;\n }\n ): Promise<ToolResult> {\n const args: Record<string, unknown> = {\n query,\n };\n\n if (options?.articleSlug) {\n args.article_slug = options.articleSlug;\n }\n\n if (options?.userContext && options.userContext.length > 0) {\n args.user_context = options.userContext;\n }\n\n if (options?.images && options.images.length > 0) {\n args.images = options.images;\n }\n\n return this.callToolStream('ask', args, callbacks, options?.signal);\n }\n\n // ============================================================================\n // Plan Methods\n // ============================================================================\n\n /**\n * Continue plan execution after receiving step result.\n * \n * Called by the SDK after executing a step that has\n * requires_result_feedback=true. The server analyzes the result\n * and updates subsequent steps if needed.\n * \n * @param planId - UUID of the plan\n * @param stepId - UUID of the completed step\n * @param result - Step execution result\n * @returns Updated plan with all steps\n */\n async continuePlan(\n planId: string,\n stepId: string,\n result: unknown\n ): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/continue', {\n plan_id: planId,\n step_id: stepId,\n result,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Cancel an in-progress plan.\n * \n * Marks the plan as cancelled and skips any pending steps.\n * \n * @param planId - UUID of the plan to cancel\n * @returns Updated plan with cancelled status\n */\n async cancelPlan(planId: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/cancel', {\n plan_id: planId,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Get current state of a plan.\n * \n * Returns the plan and all its steps with current statuses.\n * \n * @param planId - UUID of the plan\n * @returns Plan with all steps\n */\n async getPlan(planId: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/get', {\n plan_id: planId,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Start a plan that was waiting for user confirmation.\n * \n * For plans with auto_execute=false, the user must explicitly\n * start execution by calling this method.\n * \n * @param planId - UUID of the plan to start\n * @returns Updated plan with executing status\n */\n async startPlan(planId: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/start', {\n plan_id: planId,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Retry a failed step.\n * \n * Increments the retry count and resets the step to ready status.\n * Only works if the step is retriable and hasn't exceeded max_retries.\n * \n * @param planId - UUID of the plan\n * @param stepId - UUID of the step to retry\n * @returns Updated plan with step reset to ready\n */\n async retryStep(planId: string, stepId: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/retry-step', {\n plan_id: planId,\n step_id: stepId,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Mark a step as failed.\n * \n * Records the error and determines if the plan should also fail\n * (if step is not retriable or out of retries).\n * \n * @param planId - UUID of the plan\n * @param stepId - UUID of the failed step\n * @param errorMessage - Optional error message\n * @returns Updated plan with failed step\n */\n async failStep(planId: string, stepId: string, errorMessage?: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/fail-step', {\n plan_id: planId,\n step_id: stepId,\n error_message: errorMessage || '',\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n /**\n * Skip a step and advance to the next one.\n * \n * @param planId - UUID of the plan\n * @param stepId - UUID of the step to skip\n * @returns Updated plan with skipped step and next step ready\n */\n async skipStep(planId: string, stepId: string): Promise<{ plan: ExecutionPlan }> {\n const response = await this.callTool('plans/skip-step', {\n plan_id: planId,\n step_id: stepId,\n });\n return response as unknown as { plan: ExecutionPlan };\n }\n\n // ============================================================================\n // Query Action Methods\n // ============================================================================\n\n /**\n * Send action result back to the agent.\n * \n * Called after executing a query action (returns_data=true).\n * The result is sent to the agent for further reasoning in the ReAct loop.\n * \n * @param actionName - The name of the action that was executed\n * @param result - The result data to send back to the agent\n */\n sendActionResult(actionName: string, result: unknown): void {\n // Send via fire-and-forget POST request\n // The server will inject this into the ongoing conversation\n const request: JSONRPCRequest = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'action/result',\n params: {\n action_name: actionName,\n result,\n },\n };\n\n // Fire-and-forget - don't wait for response\n fetch(this.baseUrl, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(request),\n }).catch((error) => {\n console.error('[MCPClient] Failed to send action result:', error);\n });\n }\n}\n\n/**\n * Convert ActionData from MCP response to TaskButtonData for UI rendering.\n */\nexport function actionToTaskButton(action: ActionData): TaskButtonData {\n return {\n id: action.id,\n name: action.name,\n taskType: action.action_type as TaskButtonData['taskType'],\n data: action.data,\n autoRun: action.auto_run,\n autoComplete: action.auto_complete,\n };\n}\n","/**\n * API Client for Pillar SDK\n * Handles all communication with the Pillar backend\n */\n\nimport type { TaskButtonData } from '../components/Panel/TaskButton';\nimport type { ResolvedConfig } from '../core/config';\nimport type { ProductContext, Suggestion, UserProfile } from '../core/context';\nimport type { ExecutionPlan } from '../core/plan';\nimport type { Workflow } from '../core/workflow';\nimport type { UserContextItem } from '../types/user-context';\nimport type { ActionData, ChatImage, ImageUploadResponse } from './mcp-client';\nimport { MCPClient, actionToTaskButton } from './mcp-client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TooltipData {\n id: string;\n tooltip_id: string;\n name: string;\n content: string;\n content_html: string;\n article_slug?: string;\n article_title?: string;\n show_learn_more: boolean;\n trigger: 'hover' | 'click' | 'focus' | 'icon';\n position: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n}\n\nexport interface ArticleData {\n id: string;\n title: string;\n slug: string;\n excerpt?: string;\n /** TipTap JSON content - preferred for rendering */\n body_json?: Record<string, unknown>;\n /** Legacy HTML content - fallback if body_json not available */\n content_html?: string;\n category_name?: string;\n category_slug?: string;\n reading_time?: number;\n updated_at: string;\n related_articles?: ArticleSummary[];\n}\n\nexport interface ArticleSummary {\n id: string;\n title: string;\n slug: string;\n excerpt?: string;\n category_name?: string;\n}\n\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface SuggestedQuestion {\n id: string;\n text: string;\n}\n\nexport interface ChatResponse {\n message: string;\n sources?: ArticleSummary[];\n workflow?: Workflow;\n conversationId?: string;\n messageId?: string;\n actions?: TaskButtonData[];\n}\n\nexport interface ProgressEvent {\n kind: 'search' | 'search_complete' | 'generating' | 'thinking';\n message?: string;\n progress_id?: string;\n}\n\n/**\n * Server-side embed config response.\n * These are admin-configured settings that the SDK merges with local config.\n */\nexport interface ServerEmbedConfig {\n panel?: {\n enabled?: boolean;\n position?: 'left' | 'right';\n width?: number;\n };\n floatingButton?: {\n enabled?: boolean;\n position?: string;\n label?: string;\n };\n features?: {\n aiChatEnabled?: boolean;\n searchEnabled?: boolean;\n tooltipsEnabled?: boolean;\n };\n sidebarTabs?: Array<{\n id: string;\n label: string;\n enabled: boolean;\n order: number;\n }>;\n theme?: {\n colors?: {\n primary?: string;\n };\n };\n}\n\n// ============================================================================\n// API Client\n// ============================================================================\n\nexport class APIClient {\n private config: ResolvedConfig;\n private abortControllers: Map<string, AbortController> = new Map();\n private mcpClient: MCPClient;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n this.mcpClient = new MCPClient(config);\n }\n\n private get baseUrl(): string {\n return `${this.config.apiBaseUrl}/api/v1/help-center`;\n }\n\n // ============================================================================\n // Analytics Helpers\n // ============================================================================\n\n /**\n * Get or create a persistent visitor ID.\n * Stored in localStorage to persist across sessions.\n */\n private getVisitorId(): string {\n if (typeof window === 'undefined') return '';\n \n const KEY = 'pillar_visitor_id';\n try {\n let id = localStorage.getItem(KEY);\n if (!id) {\n id = crypto.randomUUID();\n localStorage.setItem(KEY, id);\n }\n return id;\n } catch {\n // localStorage might be unavailable (e.g., private browsing)\n return '';\n }\n }\n\n /**\n * Get or create a session ID.\n * Stored in sessionStorage to persist only for the current browser session.\n */\n private getSessionId(): string {\n if (typeof window === 'undefined') return '';\n \n const KEY = 'pillar_session_id';\n try {\n let id = sessionStorage.getItem(KEY);\n if (!id) {\n id = crypto.randomUUID();\n sessionStorage.setItem(KEY, id);\n }\n return id;\n } catch {\n // sessionStorage might be unavailable\n return '';\n }\n }\n\n /**\n * Get the current page URL for analytics tracking.\n */\n private getPageUrl(): string {\n if (typeof window === 'undefined') return '';\n return window.location.href;\n }\n\n private get headers(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Pillar-Key': this.config.publicKey,\n 'x-customer-id': this.config.helpCenter, // Help center subdomain for middleware resolution\n 'x-visitor-id': this.getVisitorId(),\n 'x-session-id': this.getSessionId(),\n 'x-page-url': this.getPageUrl(),\n };\n\n // Add platform/version headers for code-first action filtering\n if (this.config.platform) {\n headers['X-Pillar-Platform'] = this.config.platform;\n }\n if (this.config.version) {\n headers['X-Pillar-Action-Version'] = this.config.version;\n }\n\n return headers;\n }\n\n private async fetch<T>(\n endpoint: string,\n options: RequestInit = {},\n requestId?: string\n ): Promise<T> {\n // Cancel previous request with same ID if exists\n if (requestId) {\n this.abortControllers.get(requestId)?.abort();\n const controller = new AbortController();\n this.abortControllers.set(requestId, controller);\n options.signal = controller.signal;\n }\n\n const url = `${this.baseUrl}${endpoint}`;\n \n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.detail || errorData.message || `API error: ${response.status}`);\n }\n\n return response.json();\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n throw error; // Re-throw abort errors\n }\n console.error(`[Pillar API] Error fetching ${endpoint}:`, error);\n throw error;\n } finally {\n if (requestId) {\n this.abortControllers.delete(requestId);\n }\n }\n }\n\n // ============================================================================\n // Embed Config (Server-Side SDK Settings)\n // ============================================================================\n\n /**\n * Fetch embed configuration from server.\n * Called during SDK init to get admin-configured settings.\n * \n * @returns Server config or null if fetch fails (SDK continues with defaults)\n */\n async fetchEmbedConfig(): Promise<ServerEmbedConfig | null> {\n try {\n const response = await fetch(\n `${this.config.apiBaseUrl}/api/public/products/${this.config.helpCenter}/embed-config/`,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Pillar-Key': this.config.publicKey,\n },\n }\n );\n \n if (!response.ok) {\n console.warn('[Pillar] Failed to fetch embed config:', response.status);\n return null;\n }\n \n return await response.json();\n } catch (error) {\n console.warn('[Pillar] Failed to fetch embed config:', error);\n return null;\n }\n }\n\n // ============================================================================\n // Tooltips\n // ============================================================================\n\n async getTooltips(ids?: string[]): Promise<TooltipData[]> {\n const params = ids?.length ? `?ids=${ids.join(',')}` : '';\n return this.fetch<TooltipData[]>(`/sdk/tooltips/${params}`);\n }\n\n // ============================================================================\n // Suggested Questions\n // ============================================================================\n\n /**\n * Get AI-generated suggested questions for the home view.\n * Returns action-oriented questions based on the help center's content.\n */\n async getSuggestedQuestions(): Promise<SuggestedQuestion[]> {\n try {\n const result = await this.mcpClient.callTool('suggest_questions', {});\n \n // Extract questions from structuredContent\n const questions = (result as { structuredContent?: { questions?: SuggestedQuestion[] } })\n .structuredContent?.questions;\n \n if (Array.isArray(questions)) {\n return questions;\n }\n \n return [];\n } catch (error) {\n console.warn('[Pillar] Failed to get suggested questions:', error);\n return [];\n }\n }\n\n // ============================================================================\n // AI Chat\n // ============================================================================\n\n /**\n * Upload an image for use in chat.\n * \n * @param file - The image file to upload\n * @returns Promise with signed URL and expiration\n */\n async uploadImage(file: File): Promise<ImageUploadResponse> {\n return this.mcpClient.uploadImage(file);\n }\n\n async chat(\n message: string,\n history: ChatMessage[] = [],\n onChunk?: (chunk: string) => void,\n articleSlug?: string,\n existingConversationId?: string | null,\n onActions?: (actions: TaskButtonData[]) => void,\n onPlan?: (plan: ExecutionPlan) => void,\nuserContext?: UserContextItem[],\n images?: ChatImage[],\n onProgress?: (progress: ProgressEvent) => void\n ): Promise<ChatResponse> {\n // Use MCP client for chat via the 'ask' tool\n let fullMessage = '';\n let sources: ArticleSummary[] = [];\n let actions: TaskButtonData[] = [];\n\n try {\n const result = await this.mcpClient.ask(\n message,\n {\n onToken: (token) => {\n fullMessage += token;\n onChunk?.(token);\n },\n onSources: (s) => {\n sources = s;\n },\n onActions: (a: ActionData[]) => {\n actions = a.map(actionToTaskButton);\n onActions?.(actions);\n },\n onPlan: (plan) => {\n onPlan?.(plan);\n },\n onProgress: (p) => {\n onProgress?.(p as ProgressEvent);\n },\n onError: (error) => {\n console.error('[Pillar API] MCP chat error:', error);\n },\n },\n { articleSlug, userContext, images }\n );\n\n // If no streaming content was received, extract from result\n if (!fullMessage && result.content[0]?.type === 'text') {\n fullMessage = result.content[0].text || '';\n }\n\n // Extract conversation/message IDs from result _meta if available\n const meta = result._meta || {};\n\n return {\n message: fullMessage,\n sources,\n actions,\n conversationId: meta.conversation_id,\n messageId: meta.query_log_id,\n };\n } catch (error) {\n console.error('[Pillar API] Chat error:', error);\n throw error;\n }\n }\n\n /**\n * Legacy chat method using the old /ai/chat/ endpoint.\n * @deprecated Use chat() which uses the MCP protocol.\n */\n async chatLegacy(\n message: string,\n history: ChatMessage[] = [],\n onChunk?: (chunk: string) => void,\n articleSlug?: string,\n existingConversationId?: string | null\n ): Promise<ChatResponse> {\n const url = `${this.baseUrl}/ai/chat/`;\n \n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify({\n message,\n history,\n context: this.config.context,\n ...(articleSlug && { article_slug: articleSlug }),\n ...(existingConversationId && { conversation_id: existingConversationId }),\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.detail || errorData.message || `Chat error: ${response.status}`);\n }\n\n // Handle streaming response\n if (onChunk && response.headers.get('content-type')?.includes('text/event-stream')) {\n return this.handleStreamingChat(response, onChunk);\n }\n\n // Handle non-streaming response\n const data = await response.json();\n return {\n message: data.answer || data.message,\n sources: data.sources,\n workflow: data.workflow || data.structuredContent?.workflow,\n conversationId: data.conversation_id,\n messageId: data.message_id,\n };\n }\n\n private async handleStreamingChat(\n response: Response,\n onChunk: (chunk: string) => void\n ): Promise<ChatResponse> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let fullMessage = '';\n let sources: ArticleSummary[] = [];\n let workflow: Workflow | undefined;\n let conversationId: string | undefined;\n let messageId: string | undefined;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.content) {\n fullMessage += parsed.content;\n onChunk(parsed.content);\n }\n if (parsed.sources) {\n sources = parsed.sources;\n }\n // Check for workflow in structured content or direct field\n if (parsed.workflow) {\n workflow = parsed.workflow;\n }\n if (parsed.structuredContent?.workflow) {\n workflow = parsed.structuredContent.workflow;\n }\n // Capture conversation and message IDs from stream\n if (parsed.conversation_id) {\n conversationId = parsed.conversation_id;\n }\n if (parsed.message_id) {\n messageId = parsed.message_id;\n }\n } catch {\n // Not JSON, might be raw text\n fullMessage += data;\n onChunk(data);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return { message: fullMessage, sources, workflow, conversationId, messageId };\n }\n\n // ============================================================================\n // Feedback\n // ============================================================================\n\n /**\n * Submit feedback on an AI assistant message.\n * Fire-and-forget - errors are logged but don't throw.\n * \n * @param messageId - The UUID of the assistant message\n * @param feedback - 'up' for helpful, 'down' for not helpful\n * @param comment - Optional comment explaining the feedback\n */\n async submitFeedback(\n messageId: string,\n feedback: 'up' | 'down',\n comment?: string\n ): Promise<void> {\n try {\n await this.fetch('/ai/feedback/', {\n method: 'POST',\n body: JSON.stringify({\n message_id: messageId,\n feedback,\n ...(comment && { comment }),\n }),\n });\n } catch (error) {\n // Fire-and-forget - don't throw on feedback errors\n console.warn('[Pillar] Feedback submission failed:', error);\n }\n }\n\n // ============================================================================\n // Task Execution Confirmation\n // ============================================================================\n\n /**\n * Confirm task execution result.\n * Called by the SDK after a customer's task handler completes.\n * Fire-and-forget - errors are logged but don't throw.\n *\n * @param taskId - The database UUID of the task\n * @param status - 'success' or 'failure'\n * @param details - Optional execution details\n */\n async confirmTaskExecution(\n taskId: string,\n status: 'success' | 'failure',\n details?: {\n error?: string;\n duration_ms?: number;\n session_id?: string;\n conversation_id?: string;\n [key: string]: unknown;\n }\n ): Promise<void> {\n try {\n const payload = {\n status,\n error: details?.error,\n duration_ms: details?.duration_ms,\n session_id: details?.session_id,\n conversation_id: details?.conversation_id,\n metadata: details,\n };\n\n await this.fetch(`/tasks/${taskId}/confirm/`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n } catch (error) {\n // Fire-and-forget - don't throw on confirmation errors\n console.warn('[Pillar] Failed to confirm task execution:', error);\n }\n }\n\n // ============================================================================\n // Contextual Suggestions\n // ============================================================================\n\n /**\n * Get contextual help suggestions based on product context.\n * Returns relevant articles, videos, and actions.\n */\n async getSuggestions(\n productContext: ProductContext,\n userProfile: UserProfile\n ): Promise<Suggestion[]> {\n try {\n const response = await this.fetch<{ suggestions: Suggestion[] }>(\n '/suggestions/',\n {\n method: 'POST',\n body: JSON.stringify({\n context: productContext,\n user_profile: userProfile,\n }),\n }\n );\n return response.suggestions || [];\n } catch (error) {\n console.warn('[Pillar] Failed to get suggestions:', error);\n return [];\n }\n }\n\n /**\n * Chat with enhanced context.\n * Includes product context and user profile for better responses.\n * \n * Note: Context is passed to the MCP ask tool as additional arguments.\n */\n async chatWithContext(\n message: string,\n history: ChatMessage[] = [],\n productContext: ProductContext,\n userProfile: UserProfile,\n onChunk?: (chunk: string) => void,\n existingConversationId?: string | null,\n onActions?: (actions: TaskButtonData[]) => void\n ): Promise<ChatResponse> {\n // Use MCP client for chat via the 'ask' tool with context\n let fullMessage = '';\n let sources: ArticleSummary[] = [];\n let actions: TaskButtonData[] = [];\n\n try {\n const result = await this.mcpClient.callToolStream(\n 'ask',\n {\n query: message,\n context: {\n product: productContext,\n user_profile: userProfile,\n },\n ...(existingConversationId && { conversation_id: existingConversationId }),\n },\n {\n onToken: (token) => {\n fullMessage += token;\n onChunk?.(token);\n },\n onSources: (s) => {\n sources = s;\n },\n onActions: (a: ActionData[]) => {\n actions = a.map(actionToTaskButton);\n onActions?.(actions);\n },\n onError: (error) => {\n console.error('[Pillar API] MCP chat with context error:', error);\n },\n }\n );\n\n // If no streaming content was received, extract from result\n if (!fullMessage && result.content[0]?.type === 'text') {\n fullMessage = result.content[0].text || '';\n }\n\n // Extract conversation/message IDs from result _meta if available\n const meta = result._meta || {};\n\n return {\n message: fullMessage,\n sources,\n actions,\n conversationId: meta.conversation_id,\n messageId: meta.query_log_id,\n };\n } catch (error) {\n console.error('[Pillar API] Chat with context error:', error);\n throw error;\n }\n }\n\n // ============================================================================\n // Cleanup\n // ============================================================================\n\n cancelAllRequests(): void {\n this.abortControllers.forEach((controller) => controller.abort());\n this.abortControllers.clear();\n }\n}\n\n","var n,l,u,t,i,o,r,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,d=Array.isArray;function w(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,o,r,e={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=u[r];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===e[r]&&(e[r]=l.defaultProps[r]);return m(l,e,i,o,null)}function m(n,t,i,o,r){var e={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!$.__r++||o!=l.debounceRendering)&&((o=l.debounceRendering)||r)($)}function $(){for(var n,u,t,o,r,f,c,s=1;i.length;)i.length>s&&i.sort(e),n=i.shift(),s=i.length,n.__d&&(t=void 0,o=void 0,r=(o=(u=n).__v).__e,f=[],c=[],u.__P&&((t=w({},o)).__v=o.__v+1,l.vnode&&l.vnode(t),O(u.__P,t,o,u.__n,u.__P.namespaceURI,32&o.__u?[r]:null,f,null==r?S(o):r,!!(32&o.__u),c),t.__v=o.__v,t.__.__k[t.__i]=t,N(f,t,c),o.__e=o.__=null,t.__e!=r&&C(t)));$.__r=0}function I(n,l,u,t,i,o,r,e,f,c,s){var a,h,y,d,w,g,_,m=t&&t.__k||v,b=l.length;for(f=P(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1==y.__i?p:m[y.__i]||p,y.__i=a,g=O(n,y,h,i,o,r,e,f,c,s),d=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&B(h.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),(_=!!(4&y.__u))||h.__k===y.__k?f=A(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:d&&(f=d.nextSibling),y.__u&=-7);return u.__e=w,f}function P(n,l,u,t,i){var o,r,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),o=0;o<i;o++)null!=(r=l[o])&&\"boolean\"!=typeof r&&\"function\"!=typeof r?(\"string\"==typeof r||\"number\"==typeof r||\"bigint\"==typeof r||r.constructor==String?r=n.__k[o]=m(null,r,null,null,null):d(r)?r=n.__k[o]=m(k,{children:r},null,null,null):void 0===r.constructor&&r.__b>0?r=n.__k[o]=m(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):n.__k[o]=r,f=o+h,r.__=n,r.__b=n.__b+1,e=null,-1!=(c=r.__i=L(r,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof r.type&&(r.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,r.__u|=4))):n.__k[o]=null;if(a)for(o=0;o<s;o++)null!=(e=u[o])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),D(e,e));return t}function A(n,l,u,t){var i,o;if(\"function\"==typeof n.type){for(i=n.__k,o=0;i&&o<i.length;o++)i[o]&&(i[o].__=n,l=A(i[o],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(d(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i,o,r,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==e||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,o=u+1;i>=0||o<l.length;)if(null!=(c=l[r=i>=0?i--:o++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return r;return-1}function T(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function j(n,l,u,t,i){var o,r;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||T(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])o=l!=(l=l.replace(f,\"$1\")),r=l.toLowerCase(),l=r in n||\"onFocusOut\"==l||\"onFocusIn\"==l?r.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,o?a:s,o)):n.removeEventListener(l,o?a:s,o);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,o,r,e,f,c,s){var a,h,p,v,y,_,m,b,S,C,M,$,P,A,H,L,T,j=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof j)try{if(b=u.props,S=\"prototype\"in j&&j.prototype.render,C=(a=j.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?m=(h=u.__c=t.__c).__=h.__E:(S?u.__c=h=new j(b,M):(u.__c=h=new x(b,M),h.constructor=j,h.render=E),C&&C.sub(h),h.state||(h.state={}),h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),S&&null==h.__s&&(h.__s=h.state),S&&null!=j.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=w({},h.__s)),w(h.__s,j.getDerivedStateFromProps(b,h.__s))),v=h.props,y=h.state,h.__v=u,p)S&&null==j.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),S&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(S&&null==j.getDerivedStateFromProps&&b!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(b,M),u.__v==t.__v||!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(b,h.__s,M)){for(u.__v!=t.__v&&(h.props=b,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),$=0;$<h._sb.length;$++)h.__h.push(h._sb[$]);h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(b,h.__s,M),S&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,_)})}if(h.context=M,h.props=b,h.__P=n,h.__e=!1,P=l.__r,A=0,S){for(h.state=h.__s,h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=w(w({},i),h.getChildContext())),S&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,y)),L=a,null!=a&&a.type===k&&null==a.key&&(L=V(a.props.children)),f=I(n,d(L)?L:[L],u,t,i,o,r,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),m&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=r)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;r[r.indexOf(f)]=null,u.__e=f}else{for(T=r.length;T--;)g(r[T]);z(u)}else u.__e=t.__e,u.__k=t.__k,n.then||z(u);l.__e(n,u,t)}else null==r&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=q(t.__e,u,t,i,o,r,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function z(n){n&&n.__c&&(n.__c.__e=!0),n&&n.__k&&n.__k.forEach(z)}function N(n,u,t){for(var i=0;i<t.length;i++)B(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function V(n){return\"object\"!=typeof n||null==n||n.__b&&n.__b>0?n:d(n)?n.map(V):w({},n)}function q(u,t,i,o,r,e,f,c,s){var a,h,v,y,w,_,m,b=i.props||p,k=t.props,x=t.type;if(\"svg\"==x?r=\"http://www.w3.org/2000/svg\":\"math\"==x?r=\"http://www.w3.org/1998/Math/MathML\":r||(r=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((w=e[a])&&\"setAttribute\"in w==!!x&&(x?w.localName==x:3==w.nodeType)){u=w,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(r,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(w=u.attributes[a]).name]=w.value;for(a in b)if(w=b[a],\"children\"==a);else if(\"dangerouslySetInnerHTML\"==a)v=w;else if(!(a in k)){if(\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k)continue;j(u,a,null,w,r)}for(a in k)w=k[a],\"children\"==a?y=w:\"dangerouslySetInnerHTML\"==a?h=w:\"value\"==a?_=w:\"checked\"==a?m=w:c&&\"function\"!=typeof w||b[a]===w||j(u,a,w,b[a],r);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),I(\"template\"==t.type?u.content:u,d(y)?y:[y],t,i,o,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":r,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&j(u,a,_,b[a],r),a=\"checked\",null!=m&&m!=u[a]&&j(u,a,m,b[a],r))}return u}function B(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function D(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||B(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&D(i[o],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function E(n,l,u){return this.constructor(n,u)}function G(u,t,i){var o,r,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],O(t,u=(!o&&i||t).__k=_(k,null,[u]),r||p,p,t.namespaceURI,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,e,!o&&i?i:r?r.__e:t.firstChild,o,f),N(e,u,f)}function J(n,l){G(n,l,J)}function K(l,u,t){var i,o,r,e,f=w({},l.props);for(r in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=void 0===u[r]&&null!=e?e[r]:u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,o||l.ref,null)}function Q(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=w({},this.state),\"function\"==typeof n&&(n=n(w({},u),this.props)),n&&w(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},x.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},$.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=F(!1),a=F(!0),h=0;export{x as Component,k as Fragment,K as cloneElement,Q as createContext,_ as createElement,b as createRef,_ as h,J as hydrate,t as isValidElement,l as options,G as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(t=function(r){return null!==r&&\"object\"==typeof r&&\"function\"==typeof r.valueOf?r.valueOf():r}(t),\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+n(i)+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(\"\"+t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;while(void 0!==h){var r=h;h=void 0;f++;while(void 0!==r){var o=r.o;r.o=void 0;r.f&=-3;if(!(8&r.f)&&c(r))try{r.c()}catch(r){if(!t){i=r;t=!0}}r=o}}f=0;s--;if(t)throw i}else s--}function r(i){if(s>0)return i();s++;try{return i()}finally{t()}}var o=void 0;function n(i){var t=o;o=void 0;try{return i()}finally{o=t}}var h=void 0,s=0,f=0,v=0;function e(i){if(void 0!==o){var t=i.n;if(void 0===t||t.t!==o){t={i:0,S:i,p:o.s,n:void 0,t:o,e:void 0,x:void 0,r:t};if(void 0!==o.s)o.s.n=t;o.s=t;i.n=t;if(32&o.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=o.s;t.n=void 0;o.s.n=t;o.s=t}return t}}}function u(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}u.prototype.brand=i;u.prototype.h=function(){return!0};u.prototype.S=function(i){var t=this,r=this.t;if(r!==i&&void 0===i.e){i.x=r;this.t=i;if(void 0!==r)r.e=i;else n(function(){var i;null==(i=t.W)||i.call(t)})}};u.prototype.U=function(i){var t=this;if(void 0!==this.t){var r=i.e,o=i.x;if(void 0!==r){r.x=o;i.e=void 0}if(void 0!==o){o.e=r;i.x=void 0}if(i===this.t){this.t=o;if(void 0===o)n(function(){var i;null==(i=t.Z)||i.call(t)})}}};u.prototype.subscribe=function(i){var t=this;return E(function(){var r=t.value,n=o;o=void 0;try{i(r)}finally{o=n}},{name:\"sub\"})};u.prototype.valueOf=function(){return this.value};u.prototype.toString=function(){return this.value+\"\"};u.prototype.toJSON=function(){return this.value};u.prototype.peek=function(){var i=o;o=void 0;try{return this.value}finally{o=i}};Object.defineProperty(u.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(f>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;v++;s++;try{for(var r=this.t;void 0!==r;r=r.x)r.t.N()}finally{t()}}}});function d(i,t){return new u(i,t)}function c(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function a(i){for(var t=i.s;void 0!==t;t=t.n){var r=t.S.n;if(void 0!==r)t.r=r;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function l(i){var t=i.s,r=void 0;while(void 0!==t){var o=t.p;if(-1===t.i){t.S.U(t);if(void 0!==o)o.n=t.n;if(void 0!==t.n)t.n.p=o}else r=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=o}i.s=r}function y(i,t){u.call(this,void 0);this.x=i;this.s=void 0;this.g=v-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}y.prototype=new u;y.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===v)return!0;this.g=v;this.f|=1;if(this.i>0&&!c(this)){this.f&=-2;return!0}var i=o;try{a(this);o=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}o=i;l(this);this.f&=-2;return!0};y.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}u.prototype.S.call(this,i)};y.prototype.U=function(i){if(void 0!==this.t){u.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};y.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(y.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function w(i,t){return new y(i,t)}function _(i){var r=i.u;i.u=void 0;if(\"function\"==typeof r){s++;var n=o;o=void 0;try{r()}catch(t){i.f&=-2;i.f|=8;b(i);throw t}finally{o=n;t()}}}function b(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i)}function g(i){if(o!==this)throw new Error(\"Out-of-order effect\");l(this);o=i;this.f&=-2;if(8&this.f)b(this);t()}function p(i,t){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32;this.name=null==t?void 0:t.name}p.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t}finally{i()}};p.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);a(this);s++;var i=o;o=this;return g.bind(this,i)};p.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this}};p.prototype.d=function(){this.f|=8;if(!(1&this.f))b(this)};p.prototype.dispose=function(){this.d()};function E(i,t){var r=new p(i,t);try{r.c()}catch(i){r.d();throw i}var o=r.d.bind(r);o[Symbol.dispose]=o;return o}export{y as Computed,p as Effect,u as Signal,r as batch,w as computed,E as effect,d as signal,n as untracked};//# sourceMappingURL=signals-core.module.js.map\n","import{Component as i,options as r,isValidElement as n}from\"preact\";import{useMemo as t,useRef as f,useEffect as o}from\"preact/hooks\";import{Signal as e,computed as u,signal as a,effect as c}from\"@preact/signals-core\";export{Signal,batch,computed,effect,signal,untracked}from\"@preact/signals-core\";var v,s;function l(i,n){r[i]=n.bind(null,r[i]||function(){})}function d(i){if(s)s();s=i&&i.S()}function h(i){var r=this,f=i.data,o=useSignal(f);o.value=f;var e=t(function(){var i=r.__v;while(i=i.__)if(i.__c){i.__c.__$f|=4;break}r.__$u.c=function(){var i,t=r.__$u.S(),f=e.value;t();if(n(f)||3!==(null==(i=r.base)?void 0:i.nodeType)){r.__$f|=1;r.setState({})}else r.base.data=f};return u(function(){var i=o.value.value;return 0===i?0:!0===i?\"\":i||\"\"})},[]);return e.value}h.displayName=\"_st\";Object.defineProperties(e.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:h},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});l(\"__b\",function(i,r){if(\"string\"==typeof r.type){var n,t=r.props;for(var f in t)if(\"children\"!==f){var o=t[f];if(o instanceof e){if(!n)r.__np=n={};n[f]=o;t[f]=o.peek()}}}i(r)});l(\"__r\",function(i,r){d();var n,t=r.__c;if(t){t.__$f&=-2;if(void 0===(n=t.__$u))t.__$u=n=function(i){var r;c(function(){r=this});r.c=function(){t.__$f|=1;t.setState({})};return r}()}v=t;d(n);i(r)});l(\"__e\",function(i,r,n,t){d();v=void 0;i(r,n,t)});l(\"diffed\",function(i,r){d();v=void 0;var n;if(\"string\"==typeof r.type&&(n=r.__e)){var t=r.__np,f=r.props;if(t){var o=n.U;if(o)for(var e in o){var u=o[e];if(void 0!==u&&!(e in t)){u.d();o[e]=void 0}}else n.U=o={};for(var a in t){var c=o[a],s=t[a];if(void 0===c){c=p(n,a,s,f);o[a]=c}else c.o(s,f)}}}i(r)});function p(i,r,n,t){var f=r in i&&void 0===i.ownerSVGElement,o=a(n);return{o:function(i,r){o.value=i;t=r},d:c(function(){var n=o.value.value;if(t[r]!==n){t[r]=n;if(f)i[r]=n;else if(n)i.setAttribute(r,n);else i.removeAttribute(r)}})}}l(\"unmount\",function(i,r){if(\"string\"==typeof r.type){var n=r.__e;if(n){var t=n.U;if(t){n.U=void 0;for(var f in t){var o=t[f];if(o)o.d()}}}}else{var e=r.__c;if(e){var u=e.__$u;if(u){e.__$u=void 0;u.d()}}}i(r)});l(\"__h\",function(i,r,n,t){if(t<3||9===t)r.__$f|=2;i(r,n,t)});i.prototype.shouldComponentUpdate=function(i,r){var n=this.__$u,t=n&&void 0!==n.s;for(var f in r)return!0;if(this.__f||\"boolean\"==typeof this.u&&!0===this.u){if(!(t||2&this.__$f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(t||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var o in i)if(\"__source\"!==o&&i[o]!==this.props[o])return!0;for(var e in this.props)if(!(e in i))return!0;return!1};function useSignal(i){return t(function(){return a(i)},[])}function useComputed(i){var r=f(i);r.current=i;v.__$f|=4;return t(function(){return u(function(){return r.current()})},[])}function useSignalEffect(i){var r=f(i);r.current=i;o(function(){return c(function(){return r.current()})},[])}export{useComputed,useSignal,useSignalEffect};//# sourceMappingURL=signals.module.js.map\n","/**\n * Panel Store\n * Signal-based state for panel open/close and configuration\n */\n\nimport { signal, computed } from '@preact/signals';\nimport type { PanelPosition, PanelMode } from '../core/config';\n\n// Panel visibility state\nexport const isOpen = signal(false);\n\n// Active tab (which tab is currently selected)\nexport const activeTab = signal<string>('assistant');\n\n// Panel position (left or right)\nexport const position = signal<PanelPosition>('right');\n\n// Panel mode (overlay or push)\nexport const mode = signal<PanelMode>('overlay');\n\n// Panel width\nexport const width = signal(380);\n\n// Responsive hover breakpoint settings\n// Viewport width below which panel switches to hover mode (false = always push)\nexport const hoverBreakpoint = signal<number | false>(1200);\n\n// Whether to show backdrop when in hover mode\nexport const hoverBackdrop = signal(true);\n\n// Current viewport width (updated by resize listener)\nexport const viewportWidth = signal(typeof window !== 'undefined' ? window.innerWidth : 1920);\n\n// Resize listener cleanup function\nlet resizeCleanup: (() => void) | null = null;\n\n/**\n * Whether the panel is currently in hover mode based on viewport width\n * Returns true when viewport is below hoverBreakpoint (and breakpoint is not disabled)\n */\nexport const isHoverMode = computed(() => {\n const bp = hoverBreakpoint.value;\n // If breakpoint is false, never use hover mode\n if (bp === false) return false;\n // Check if viewport is below breakpoint\n return viewportWidth.value < bp;\n});\n\n/**\n * The effective panel mode based on responsive breakpoint\n * Returns 'overlay' when in hover mode (below breakpoint), otherwise returns configured mode\n */\nexport const effectiveMode = computed((): PanelMode => {\n if (isHoverMode.value) {\n return 'overlay';\n }\n return mode.value;\n});\n\n// Computed panel CSS class\nexport const panelClass = computed(() => {\n const classes = ['pillar-panel', `pillar-panel--${position.value}`];\n if (isOpen.value) {\n classes.push('pillar-panel--open');\n }\n return classes.join(' ');\n});\n\n// Actions\nexport const openPanel = () => {\n isOpen.value = true;\n // Only prevent body scroll in overlay/hover mode\n if (effectiveMode.value === 'overlay') {\n document.body.style.overflow = 'hidden';\n }\n};\n\nexport const closePanel = () => {\n isOpen.value = false;\n // Restore body scroll\n if (effectiveMode.value === 'overlay') {\n document.body.style.overflow = '';\n }\n};\n\nexport const togglePanel = () => {\n if (isOpen.value) {\n closePanel();\n } else {\n openPanel();\n }\n};\n\nexport const setPosition = (pos: PanelPosition) => {\n position.value = pos;\n};\n\nexport const setMode = (m: PanelMode) => {\n mode.value = m;\n};\n\nexport const setWidth = (w: number) => {\n width.value = w;\n};\n\nexport const setHoverBreakpoint = (bp: number | false) => {\n hoverBreakpoint.value = bp;\n};\n\nexport const setHoverBackdrop = (show: boolean) => {\n hoverBackdrop.value = show;\n};\n\nexport const setActiveTab = (tabId: string) => {\n activeTab.value = tabId;\n};\n\n/**\n * Initialize the viewport resize listener for responsive behavior\n * Should be called once during SDK initialization\n */\nexport const initViewportListener = () => {\n if (typeof window === 'undefined') return;\n \n // Clean up existing listener if any\n resizeCleanup?.();\n \n const handleResize = () => {\n viewportWidth.value = window.innerWidth;\n };\n \n // Update initial value\n viewportWidth.value = window.innerWidth;\n \n // Add resize listener\n window.addEventListener('resize', handleResize);\n \n resizeCleanup = () => {\n window.removeEventListener('resize', handleResize);\n };\n};\n\n/**\n * Clean up the viewport resize listener\n */\nexport const destroyViewportListener = () => {\n resizeCleanup?.();\n resizeCleanup = null;\n};\n\n// Reset panel state\nexport const resetPanel = () => {\n isOpen.value = false;\n activeTab.value = 'assistant';\n // Always clear overflow on reset\n document.body.style.overflow = '';\n};\n\n","/**\n * DOM Utilities for Pillar SDK\n */\n\n/**\n * Creates an HTML element with the given tag name and attributes\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attributes?: Record<string, string>,\n children?: (Node | string)[]\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tag);\n \n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n if (key === 'className') {\n element.className = value;\n } else if (key === 'innerHTML') {\n element.innerHTML = value;\n } else if (key === 'textContent') {\n element.textContent = value;\n } else {\n element.setAttribute(key, value);\n }\n }\n }\n \n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n element.appendChild(document.createTextNode(child));\n } else {\n element.appendChild(child);\n }\n }\n }\n \n return element;\n}\n\n/**\n * Safely inserts CSS into a Shadow DOM or document\n */\nexport function injectStyles(\n container: ShadowRoot | Document,\n css: string,\n id?: string\n): HTMLStyleElement {\n const style = document.createElement('style');\n if (id) {\n style.id = id;\n }\n style.textContent = css;\n \n if (container instanceof Document) {\n container.head.appendChild(style);\n } else {\n container.appendChild(style);\n }\n \n return style;\n}\n\n/**\n * Gets the scrollable parent of an element\n */\nexport function getScrollParent(element: Element): Element | null {\n let parent = element.parentElement;\n \n while (parent) {\n const { overflow, overflowY, overflowX } = getComputedStyle(parent);\n \n if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {\n return parent;\n }\n \n parent = parent.parentElement;\n }\n \n return null;\n}\n\n/**\n * Gets the viewport dimensions\n */\nexport function getViewportDimensions(): { width: number; height: number } {\n return {\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight,\n };\n}\n\n/**\n * Checks if an element is visible in the viewport\n */\nexport function isElementInViewport(element: Element): boolean {\n const rect = element.getBoundingClientRect();\n const { width, height } = getViewportDimensions();\n \n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= height &&\n rect.right <= width\n );\n}\n\n/**\n * Waits for the DOM to be ready\n */\nexport function domReady(): Promise<void> {\n return new Promise((resolve) => {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => resolve(), { once: true });\n } else {\n resolve();\n }\n });\n}\n\n/**\n * Escapes HTML special characters\n */\nexport function escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Debounces a function\n */\nexport function debounce<T extends unknown[]>(\n fn: (...args: T) => void,\n delay: number\n): (...args: T) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n \n return (...args: T) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Throttles a function\n */\nexport function throttle<T extends unknown[]>(\n fn: (...args: T) => void,\n limit: number\n): (...args: T) => void {\n let inThrottle = false;\n \n return (...args: T) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => {\n inThrottle = false;\n }, limit);\n }\n };\n}\n\n/**\n * Generates a unique ID\n */\nexport function uniqueId(prefix = 'pillar'): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n","/**\n * Edge Trigger Component\n * A sidebar-style trigger that reserves space in the layout and slides out with the panel.\n * The trigger stays visible when panel opens, positioned at the panel's outer edge.\n */\n\nimport { render } from 'preact';\nimport { useCallback } from 'preact/hooks';\nimport type { FloatingButtonPosition, ResolvedConfig, ThemeColors, SidebarTabConfig } from '../../core/config';\nimport { isOpen, width as panelWidth, isHoverMode, activeTab, setActiveTab } from '../../store/panel';\nimport { injectStyles } from '../../utils/dom';\n\nconst HELP_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"></path><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line></svg>`;\n\nconst SUPPORT_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 18v-6a9 9 0 0 1 18 0v6\"></path><path d=\"M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z\"></path></svg>`;\n\n// Map of tab ids to their icons\nconst TAB_ICONS: Record<string, string> = {\n assistant: HELP_ICON,\n support: SUPPORT_ICON,\n};\n\nconst getTabIcon = (tabId: string): string => TAB_ICONS[tabId] || HELP_ICON;\n\n// Width of the sidebar trigger\nconst TRIGGER_WIDTH = 48;\n\n// Base styles use SDK theme variables for consistency with Panel\nconst EDGE_TRIGGER_STYLES = `\n/* Sidebar container - always visible, shifts when panel opens */\n.pillar-edge-sidebar {\n position: fixed;\n top: 0;\n bottom: 0;\n width: ${TRIGGER_WIDTH}px;\n z-index: 100000;\n display: flex;\n flex-direction: column;\n align-items: center;\n background: var(--pillar-bg);\n border-left: 1px solid var(--pillar-border);\n transition: right 0.3s ease, left 0.3s ease;\n}\n\n.pillar-edge-sidebar--right {\n right: 0;\n border-left: 1px solid var(--pillar-border);\n border-right: none;\n}\n\n.pillar-edge-sidebar--left {\n left: 0;\n border-right: 1px solid var(--pillar-border);\n border-left: none;\n}\n\n/* When panel is open, shift the trigger to sit at the panel's outer edge */\n.pillar-edge-sidebar--right.pillar-edge-sidebar--panel-open {\n right: var(--pillar-panel-width, 380px);\n}\n\n.pillar-edge-sidebar--left.pillar-edge-sidebar--panel-open {\n left: var(--pillar-panel-width, 380px);\n}\n\n/* The trigger button - vertical sideways text */\n.pillar-edge-trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px 8px;\n margin-top: 8px;\n font-family: var(--pillar-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif);\n font-size: 12px;\n font-weight: 500;\n color: var(--pillar-text-muted);\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n outline: none;\n gap: 8px;\n writing-mode: vertical-rl;\n text-orientation: mixed;\n}\n\n.pillar-edge-trigger:hover {\n background: var(--pillar-bg-secondary);\n color: var(--pillar-primary);\n}\n\n.pillar-edge-trigger--active {\n background: var(--pillar-primary-light, rgba(194, 65, 12, 0.1));\n color: var(--pillar-primary);\n}\n\n.pillar-edge-trigger--active .pillar-edge-trigger__icon {\n opacity: 1;\n color: var(--pillar-primary);\n}\n\n.pillar-edge-trigger:focus-visible {\n background: var(--pillar-bg-secondary);\n box-shadow: 0 0 0 2px var(--pillar-primary);\n}\n\n.pillar-edge-trigger__icon {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n opacity: 0.8;\n}\n\n.pillar-edge-trigger:hover .pillar-edge-trigger__icon {\n opacity: 1;\n color: var(--pillar-primary);\n}\n\n.pillar-edge-trigger__label {\n white-space: nowrap;\n letter-spacing: 0.5px;\n}\n\n/* Animation on mount */\n@keyframes pillar-sidebar-mount {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.pillar-edge-sidebar--mounted {\n animation: pillar-sidebar-mount 0.2s ease forwards;\n}\n`;\n\n/**\n * Generate theme CSS variables for the edge trigger\n * Uses the same variable names as Panel for consistency\n */\nfunction generateEdgeTriggerThemeCSS(colors: ThemeColors, darkColors: ThemeColors): string {\n const generateVars = (c: ThemeColors): string => {\n const lines: string[] = [];\n if (c.primary) lines.push(`--pillar-primary: ${c.primary};`);\n if (c.primaryHover) lines.push(`--pillar-primary-hover: ${c.primaryHover};`);\n if (c.background) lines.push(`--pillar-bg: ${c.background};`);\n if (c.backgroundSecondary) lines.push(`--pillar-bg-secondary: ${c.backgroundSecondary};`);\n if (c.text) lines.push(`--pillar-text: ${c.text};`);\n if (c.textMuted) lines.push(`--pillar-text-muted: ${c.textMuted};`);\n if (c.border) lines.push(`--pillar-border: ${c.border};`);\n if (c.borderLight) lines.push(`--pillar-border-light: ${c.borderLight};`);\n return lines.join('\\n ');\n };\n\n const lightVars = generateVars(colors);\n const darkVars = generateVars(darkColors);\n\n let css = '';\n\n // Light mode (default)\n if (lightVars) {\n css += `\n.pillar-edge-sidebar,\n.pillar-edge-sidebar--light {\n ${lightVars}\n}\n`;\n }\n\n // Dark mode\n if (darkVars) {\n css += `\n.pillar-edge-sidebar--dark {\n ${darkVars}\n}\n`;\n }\n\n return css;\n}\n\ninterface EdgeTriggerContentProps {\n position: 'left' | 'right';\n tabs: SidebarTabConfig[];\n currentActiveTab: string;\n onTabClick: (tabId: string) => void;\n panelOpen: boolean;\n panelWidthPx: number;\n theme: 'light' | 'dark';\n}\n\nfunction EdgeTriggerContent({\n position,\n tabs,\n currentActiveTab,\n onTabClick,\n panelOpen,\n panelWidthPx,\n theme,\n}: EdgeTriggerContentProps) {\n const handleTabClick = useCallback((tabId: string) => {\n onTabClick(tabId);\n }, [onTabClick]);\n\n const sidebarClassName = [\n 'pillar-edge-sidebar',\n `pillar-edge-sidebar--${position}`,\n 'pillar-edge-sidebar--mounted',\n panelOpen && 'pillar-edge-sidebar--panel-open',\n // Apply explicit theme class\n theme === 'light' && 'pillar-edge-sidebar--light',\n theme === 'dark' && 'pillar-edge-sidebar--dark',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Set the panel width CSS variable for positioning\n const style = {\n '--pillar-panel-width': `${panelWidthPx}px`,\n };\n\n // Filter to enabled tabs and sort by order\n const enabledTabs = tabs.filter(t => t.enabled).sort((a, b) => a.order - b.order);\n\n return (\n <div class={sidebarClassName} style={style}>\n {enabledTabs.map(tab => {\n const isActive = panelOpen && currentActiveTab === tab.id;\n const buttonClassName = [\n 'pillar-edge-trigger',\n isActive && 'pillar-edge-trigger--active',\n ].filter(Boolean).join(' ');\n\n return (\n <button\n key={tab.id}\n class={buttonClassName}\n onClick={() => handleTabClick(tab.id)}\n aria-label={tab.label || 'Help'}\n type=\"button\"\n >\n <span\n class=\"pillar-edge-trigger__icon\"\n dangerouslySetInnerHTML={{ __html: getTabIcon(tab.id) }}\n />\n <span class=\"pillar-edge-trigger__label\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * EdgeTrigger class that manages the edge trigger lifecycle\n * The trigger stays visible when panel opens, sliding out with it\n */\nexport class EdgeTrigger {\n private config: ResolvedConfig;\n private onClick: () => void;\n private rootContainer: HTMLElement | null;\n private container: HTMLElement | null = null;\n private stylesInjected = false;\n private themeStylesInjected = false;\n private _isHidden = false;\n private unsubscribeOpen: (() => void) | null = null;\n private unsubscribeWidth: (() => void) | null = null;\n private unsubscribeHoverMode: (() => void) | null = null;\n private unsubscribeActiveTab: (() => void) | null = null;\n private themeObserver: MutationObserver | null = null;\n private currentTheme: 'light' | 'dark' = 'light';\n\n constructor(config: ResolvedConfig, onClick: () => void, rootContainer?: HTMLElement | null) {\n this.config = config;\n this.onClick = onClick;\n this.rootContainer = rootContainer || null;\n }\n\n /**\n * Handle tab click - sets active tab and opens panel\n */\n private handleTabClick = (tabId: string) => {\n setActiveTab(tabId);\n // Always open panel when clicking a tab\n if (!isOpen.value) {\n this.onClick();\n }\n this.render();\n };\n\n /**\n * Get position as 'left' or 'right' from the floating button position config\n */\n private getEdgePosition(): 'left' | 'right' {\n const pos = this.config.floatingButton.position;\n return pos.includes('left') ? 'left' : 'right';\n }\n\n /**\n * Detect the current theme from the document\n * Checks for .dark class (next-themes) or data-theme attribute\n * Returns explicit 'light' or 'dark' to match app theme (not system preference)\n */\n private detectTheme(): 'light' | 'dark' {\n const html = document.documentElement;\n \n // Check for .dark class (next-themes pattern - most common)\n if (html.classList.contains('dark')) return 'dark';\n \n // Check for data-theme attribute (SDK pattern)\n const dataTheme = html.getAttribute('data-theme');\n if (dataTheme === 'dark') return 'dark';\n \n // Check for color-scheme style\n if (html.style.colorScheme === 'dark') return 'dark';\n \n // Default to light (web default, matches next-themes behavior where\n // dark class is added for dark mode, removed for light mode)\n return 'light';\n }\n\n /**\n * Initialize the edge trigger\n */\n init(): void {\n // Inject base styles\n if (!this.stylesInjected) {\n injectStyles(document, EDGE_TRIGGER_STYLES, 'pillar-edge-trigger-styles');\n this.stylesInjected = true;\n }\n\n // Inject theme styles from config\n if (!this.themeStylesInjected) {\n const themeCSS = generateEdgeTriggerThemeCSS(\n this.config.theme.colors,\n this.config.theme.darkColors\n );\n if (themeCSS) {\n injectStyles(document, themeCSS, 'pillar-edge-trigger-theme');\n }\n this.themeStylesInjected = true;\n }\n\n // Create container and append to root container (for stacking context isolation)\n this.container = document.createElement('div');\n this.container.id = 'pillar-edge-trigger-container';\n const mountTarget = this.rootContainer || document.body;\n mountTarget.appendChild(this.container);\n\n // Detect initial theme\n this.currentTheme = this.detectTheme();\n\n // Reserve space in the layout by adding padding (trigger width only)\n this.applyLayoutPadding();\n\n // Initial render\n this.render();\n\n // Subscribe to panel state changes\n this.unsubscribeOpen = isOpen.subscribe(() => {\n this.render();\n // Use microtask to ensure this runs AFTER Panel's push mode padding\n // so EdgeTrigger's padding (which includes trigger width) takes precedence\n queueMicrotask(() => this.applyLayoutPadding());\n });\n\n // Subscribe to panel width changes\n this.unsubscribeWidth = panelWidth.subscribe(() => {\n this.render();\n queueMicrotask(() => this.applyLayoutPadding());\n });\n\n // Subscribe to hover mode changes (viewport crossing breakpoint)\n this.unsubscribeHoverMode = isHoverMode.subscribe(() => {\n // Update padding when hover mode changes (affects whether panel takes space)\n queueMicrotask(() => this.applyLayoutPadding());\n });\n\n // Subscribe to active tab changes\n this.unsubscribeActiveTab = activeTab.subscribe(() => {\n this.render();\n });\n\n // Watch for theme changes on documentElement\n this.themeObserver = new MutationObserver(() => {\n const newTheme = this.detectTheme();\n if (newTheme !== this.currentTheme) {\n this.currentTheme = newTheme;\n this.render();\n }\n });\n\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'style'],\n });\n }\n\n /**\n * Apply padding to reserve space for trigger + panel (when open in push mode)\n * In hover mode, only reserve trigger width even when panel is open\n */\n private applyLayoutPadding(): void {\n if (this._isHidden) return;\n \n const position = this.getEdgePosition();\n const currentPanelWidth = panelWidth.value;\n const inHoverMode = isHoverMode.value;\n \n // Calculate total width to reserve:\n // - When panel is closed: just trigger width\n // - When panel is open AND in push mode: trigger + panel width\n // - When panel is open AND in hover mode: just trigger width (panel floats over content)\n let totalWidth = TRIGGER_WIDTH;\n \n if (isOpen.value && !inHoverMode) {\n // Push mode: reserve space for both trigger and panel\n totalWidth = currentPanelWidth + TRIGGER_WIDTH;\n }\n \n document.documentElement.style.transition = 'padding 0.3s ease';\n \n if (position === 'right') {\n document.documentElement.style.paddingRight = `${totalWidth}px`;\n } else {\n document.documentElement.style.paddingLeft = `${totalWidth}px`;\n }\n }\n\n /**\n * Remove layout padding\n */\n private removeLayoutPadding(): void {\n const position = this.getEdgePosition();\n if (position === 'right') {\n document.documentElement.style.paddingRight = '';\n } else {\n document.documentElement.style.paddingLeft = '';\n }\n }\n\n /**\n * Set the open state (to update visibility when panel opens)\n */\n setOpen(_isOpen: boolean): void {\n this.render();\n }\n\n /**\n * Show the trigger\n */\n show(): void {\n this._isHidden = false;\n if (this.container) {\n this.container.style.display = '';\n }\n this.applyLayoutPadding();\n }\n\n /**\n * Hide the trigger\n */\n hide(): void {\n this._isHidden = true;\n if (this.container) {\n this.container.style.display = 'none';\n }\n this.removeLayoutPadding();\n }\n\n /**\n * Update trigger position\n */\n setPosition(position: FloatingButtonPosition): void {\n this.removeLayoutPadding();\n this.config.floatingButton.position = position;\n this.applyLayoutPadding();\n this.render();\n }\n\n /**\n * Update trigger label\n */\n setLabel(label: string): void {\n this.config.floatingButton.label = label;\n this.render();\n }\n\n /**\n * Destroy the trigger\n */\n destroy(): void {\n this.unsubscribeOpen?.();\n this.unsubscribeOpen = null;\n this.unsubscribeWidth?.();\n this.unsubscribeWidth = null;\n this.unsubscribeHoverMode?.();\n this.unsubscribeHoverMode = null;\n this.unsubscribeActiveTab?.();\n this.unsubscribeActiveTab = null;\n this.themeObserver?.disconnect();\n this.themeObserver = null;\n\n this.removeLayoutPadding();\n\n if (this.container) {\n render(null, this.container);\n this.container.remove();\n }\n this.container = null;\n document.getElementById('pillar-edge-trigger-styles')?.remove();\n document.getElementById('pillar-edge-trigger-theme')?.remove();\n this.stylesInjected = false;\n this.themeStylesInjected = false;\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private render(): void {\n if (!this.container || this._isHidden) return;\n\n const position = this.getEdgePosition();\n const tabs = this.config.sidebarTabs;\n\n render(\n <EdgeTriggerContent\n position={position}\n tabs={tabs}\n currentActiveTab={activeTab.value}\n onTabClick={this.handleTabClick}\n panelOpen={isOpen.value}\n panelWidthPx={panelWidth.value}\n theme={this.currentTheme}\n />,\n this.container\n );\n }\n}\n","/**\n * Floating Help Button Component\n * A floating action button that opens the help panel\n */\n\nimport { h, render } from 'preact';\nimport { useCallback } from 'preact/hooks';\nimport type { ResolvedConfig, FloatingButtonPosition } from '../../core/config';\nimport { isOpen } from '../../store/panel';\nimport { injectStyles } from '../../utils/dom';\n\nconst HELP_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"></path><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line></svg>`;\nconst CLOSE_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>`;\n\nconst FLOATING_BUTTON_STYLES = `\n.pillar-floating-button {\n position: fixed;\n z-index: 99998;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 20px;\n height: 48px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 15px;\n font-weight: 500;\n color: #ffffff;\n background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);\n border: none;\n border-radius: 24px;\n cursor: pointer;\n box-shadow: 0 4px 14px rgba(37, 99, 235, 0.4), 0 2px 6px rgba(0, 0, 0, 0.1);\n transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;\n outline: none;\n}\n\n.pillar-floating-button:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(37, 99, 235, 0.5), 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.pillar-floating-button:active {\n transform: translateY(0);\n box-shadow: 0 2px 8px rgba(37, 99, 235, 0.3), 0 1px 4px rgba(0, 0, 0, 0.1);\n}\n\n.pillar-floating-button:focus-visible {\n box-shadow: 0 4px 14px rgba(37, 99, 235, 0.4), 0 0 0 3px rgba(37, 99, 235, 0.3);\n}\n\n.pillar-floating-button--icon-only {\n width: 56px;\n height: 56px;\n padding: 0;\n border-radius: 28px;\n justify-content: center;\n}\n\n.pillar-floating-button__icon {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.pillar-floating-button__label {\n white-space: nowrap;\n}\n\n/* Positions */\n.pillar-floating-button--bottom-right {\n bottom: 24px;\n right: 24px;\n}\n\n.pillar-floating-button--bottom-left {\n bottom: 24px;\n left: 24px;\n}\n\n.pillar-floating-button--top-right {\n top: 24px;\n right: 24px;\n}\n\n.pillar-floating-button--top-left {\n top: 24px;\n left: 24px;\n}\n\n/* Hidden state when panel is open */\n.pillar-floating-button--hidden {\n transform: scale(0.8);\n opacity: 0;\n pointer-events: none;\n}\n\n/* Animation on mount */\n@keyframes pillar-button-mount {\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.pillar-floating-button--mounted {\n animation: pillar-button-mount 0.3s ease forwards;\n}\n`;\n\ninterface FloatingButtonContentProps {\n position: FloatingButtonPosition;\n label: string;\n onClick: () => void;\n panelOpen: boolean;\n}\n\nfunction FloatingButtonContent({\n position,\n label,\n onClick,\n panelOpen,\n}: FloatingButtonContentProps) {\n const handleClick = useCallback(() => {\n onClick();\n }, [onClick]);\n\n const isIconOnly = !label;\n const icon = panelOpen ? CLOSE_ICON : HELP_ICON;\n\n const className = [\n 'pillar-floating-button',\n `pillar-floating-button--${position}`,\n 'pillar-floating-button--mounted',\n isIconOnly && 'pillar-floating-button--icon-only',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n class={className}\n onClick={handleClick}\n aria-label={label || 'Help'}\n type=\"button\"\n >\n <span\n class=\"pillar-floating-button__icon\"\n dangerouslySetInnerHTML={{ __html: icon }}\n />\n {label && <span class=\"pillar-floating-button__label\">{label}</span>}\n </button>\n );\n}\n\n/**\n * FloatingButton class that manages the button lifecycle\n * Uses Preact for rendering but maintains imperative control\n */\nexport class FloatingButton {\n private config: ResolvedConfig;\n private onClick: () => void;\n private container: HTMLElement | null = null;\n private stylesInjected = false;\n private _isHidden = false;\n\n constructor(config: ResolvedConfig, onClick: () => void) {\n this.config = config;\n this.onClick = onClick;\n }\n\n /**\n * Initialize the floating button\n */\n init(): void {\n // Inject styles\n if (!this.stylesInjected) {\n injectStyles(document, FLOATING_BUTTON_STYLES, 'pillar-floating-button-styles');\n this.stylesInjected = true;\n }\n\n // Create container\n this.container = document.createElement('div');\n this.container.id = 'pillar-floating-button-container';\n document.body.appendChild(this.container);\n\n // Initial render\n this.render();\n\n // Subscribe to panel state changes\n isOpen.subscribe(() => {\n this.render();\n });\n }\n\n /**\n * Set the open state (to update icon when panel opens)\n */\n setOpen(_isOpen: boolean): void {\n // The component now reads from the signal directly\n this.render();\n }\n\n /**\n * Show the button\n */\n show(): void {\n this._isHidden = false;\n if (this.container) {\n this.container.style.display = '';\n }\n }\n\n /**\n * Hide the button\n */\n hide(): void {\n this._isHidden = true;\n if (this.container) {\n this.container.style.display = 'none';\n }\n }\n\n /**\n * Update button position\n */\n setPosition(position: FloatingButtonPosition): void {\n this.config.floatingButton.position = position;\n this.render();\n }\n\n /**\n * Update button label\n */\n setLabel(label: string): void {\n this.config.floatingButton.label = label;\n this.render();\n }\n\n /**\n * Destroy the button\n */\n destroy(): void {\n if (this.container) {\n render(null, this.container);\n this.container.remove();\n }\n this.container = null;\n document.getElementById('pillar-floating-button-styles')?.remove();\n this.stylesInjected = false;\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private render(): void {\n if (!this.container || this._isHidden) return;\n\n const { position, label } = this.config.floatingButton;\n\n render(\n <FloatingButtonContent\n position={position}\n label={label}\n onClick={this.onClick}\n panelOpen={isOpen.value}\n />,\n this.container\n );\n }\n}\n\n","/**\n * User Context Types\n * Discriminated union for different types of context items\n * that can be attached to chat messages.\n */\n\n// ============================================================================\n// Base Type\n// ============================================================================\n\n/** Base interface for all user context items */\ninterface BaseUserContext {\n /** Unique identifier for this context item (for removal) */\n id: string;\n /** Discriminator field */\n type: string;\n}\n\n// ============================================================================\n// Context Item Types\n// ============================================================================\n\n/** Highlighted text context from text selection feature */\nexport interface HighlightedTextContext extends BaseUserContext {\n type: 'highlighted_text';\n /** The URL where the text was selected */\n url_origin: string;\n /** The selected text content */\n text_content: string;\n}\n\n// Add future context types here:\n// export interface FileContext extends BaseUserContext { ... }\n// export interface UrlContext extends BaseUserContext { ... }\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/** Union of all possible user context item types */\nexport type UserContextItem = HighlightedTextContext;\n// Extend as: UserContextItem = HighlightedTextContext | FileContext | UrlContext;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Generate a unique ID for a context item */\nexport function generateContextId(): string {\n return `ctx_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/** Type guard for highlighted text context */\nexport function isHighlightedTextContext(\n item: UserContextItem\n): item is HighlightedTextContext {\n return item.type === 'highlighted_text';\n}\n\n/** Get display label for a context item */\nexport function getContextDisplayLabel(item: UserContextItem): string {\n switch (item.type) {\n case 'highlighted_text':\n return item.text_content.length > 40\n ? item.text_content.substring(0, 40) + '...'\n : item.text_content;\n default:\n return 'Context';\n }\n}\n","/**\n * Chat Store\n * Signal-based state for chat messages and interaction\n */\n\nimport { computed, signal } from '@preact/signals';\nimport type { ArticleData, ArticleSummary, ChatMessage } from '../api/client';\nimport type { ChatImage } from '../api/mcp-client';\nimport type { TaskButtonData } from '../components/Panel/TaskButton';\nimport type { UserContextItem } from '../types/user-context';\nimport { generateContextId } from '../types/user-context';\n\n// Re-export ChatImage for convenience\nexport type { ChatImage } from '../api/mcp-client';\n\n// Action completion status for tracking auto-run action results\nexport interface ActionStatus {\n status: 'pending' | 'success' | 'failed';\n completedAt?: number;\n errorMessage?: string;\n}\n\n// Extended chat message with server-assigned ID for feedback\nexport interface StoredChatMessage extends ChatMessage {\n id?: string; // Server-assigned message ID (for assistant messages)\n feedback?: 'up' | 'down' | null; // User feedback on this message\n actions?: TaskButtonData[]; // Actions associated with this message\n sources?: ArticleSummary[]; // Sources associated with this message\n actionStatus?: Record<string, ActionStatus>; // Track action completion status per action\n userContext?: UserContextItem[]; // User context items sent with this message\n images?: ChatImage[]; // Images attached to user messages\n}\n\n// Chat messages history\nexport const messages = signal<StoredChatMessage[]>([]);\n\n// Current conversation ID (server-assigned, persists across messages in a conversation)\nexport const conversationId = signal<string | null>(null);\n\n// Whether chat is currently loading a response\nexport const isLoading = signal(false);\n\n// Current progress status during loading (e.g., \"Searching...\", \"Generating answer...\")\nexport interface ProgressStatus {\n kind: 'search' | 'search_complete' | 'generating' | 'thinking' | null;\n message?: string;\n}\n\nexport const progressStatus = signal<ProgressStatus>({ kind: null });\n\n// Whether chat area is expanded (shows messages)\nexport const isExpanded = signal(false);\n\n// Current sources from the last response (deprecated - now stored per message)\n// Kept for backwards compatibility with resetChat()\nexport const currentSources = signal<ArticleSummary[]>([]);\n\n// Current actions from the last response (deprecated - now stored per message)\n// Kept for backwards compatibility with resetChat()\nexport const currentActions = signal<TaskButtonData[]>([]);\n\n// Pre-filled text for chat input (from text selection)\nexport const prefillText = signal<string>('');\n\n// Pending message to be sent after navigation to chat view\nexport const pendingMessage = signal<string | null>(null);\n\n// Signal to trigger input focus (incremented to trigger effect)\nexport const focusInputTrigger = signal<number>(0);\n\n// User context items (highlighted text, files, etc.) to include with next message\nexport const userContext = signal<UserContextItem[]>([]);\n\n// Pending user context to be sent after navigation to chat view\nexport const pendingUserContext = signal<UserContextItem[]>([]);\n\n// ============================================================================\n// Image Upload State\n// ============================================================================\n\nexport type ImageUploadStatus = 'uploading' | 'ready' | 'error';\n\nexport interface PendingImage {\n id: string;\n file: File;\n preview: string;\n status: ImageUploadStatus;\n url?: string;\n error?: string;\n}\n\n// Pending images for the current message\nexport const pendingImages = signal<PendingImage[]>([]);\n\n// Whether any images are currently uploading\nexport const isUploadingImages = computed(() =>\n pendingImages.value.some((img) => img.status === 'uploading')\n);\n\n// Get ready images for sending\nexport const getReadyImages = (): ChatImage[] => {\n return pendingImages.value\n .filter((img) => img.status === 'ready' && img.url)\n .map((img) => ({\n url: img.url!,\n detail: 'low' as const,\n }));\n};\n\n// Add a pending image\nexport const addPendingImage = (image: PendingImage) => {\n if (pendingImages.value.length >= 4) return; // Max 4 images\n pendingImages.value = [...pendingImages.value, image];\n};\n\n// Update image upload status\nexport const updateImageStatus = (\n id: string,\n status: ImageUploadStatus,\n url?: string,\n error?: string\n) => {\n pendingImages.value = pendingImages.value.map((img) =>\n img.id === id ? { ...img, status, url, error } : img\n );\n};\n\n// Remove a pending image\nexport const removePendingImage = (id: string) => {\n const img = pendingImages.value.find((i) => i.id === id);\n if (img) {\n URL.revokeObjectURL(img.preview);\n }\n pendingImages.value = pendingImages.value.filter((i) => i.id !== id);\n};\n\n// Clear all pending images\nexport const clearPendingImages = () => {\n pendingImages.value.forEach((img) => URL.revokeObjectURL(img.preview));\n pendingImages.value = [];\n};\n\n// Computed: has messages\nexport const hasMessages = computed(() => messages.value.length > 0);\n\n// Actions\nexport const addUserMessage = (\n content: string,\n userContext?: UserContextItem[],\n images?: ChatImage[]\n) => {\n messages.value = [...messages.value, { \n role: 'user', \n content,\n userContext: userContext && userContext.length > 0 ? userContext : undefined,\n images: images && images.length > 0 ? images : undefined\n }];\n};\n\nexport const addAssistantMessage = (content: string, messageId?: string) => {\n messages.value = [...messages.value, { role: 'assistant', content, id: messageId }];\n};\n\nexport const updateLastAssistantMessage = (\n content: string,\n messageId?: string,\n actions?: TaskButtonData[],\n sources?: ArticleSummary[]\n) => {\n const msgs = messages.value;\n if (msgs.length > 0 && msgs[msgs.length - 1].role === 'assistant') {\n const existingMsg = msgs[msgs.length - 1];\n messages.value = [\n ...msgs.slice(0, -1),\n {\n role: 'assistant',\n content,\n id: messageId ?? existingMsg.id,\n actions: actions ?? existingMsg.actions,\n sources: sources ?? existingMsg.sources,\n actionStatus: existingMsg.actionStatus, // Preserve action status\n },\n ];\n }\n};\n\n// Set action status to pending when auto-run action starts\nexport const setActionPending = (messageIndex: number, actionName: string) => {\n const msgs = messages.value;\n if (messageIndex >= 0 && messageIndex < msgs.length) {\n const msg = msgs[messageIndex];\n const newStatus: Record<string, ActionStatus> = {\n ...(msg.actionStatus || {}),\n [actionName]: { status: 'pending' },\n };\n messages.value = [\n ...msgs.slice(0, messageIndex),\n { ...msg, actionStatus: newStatus },\n ...msgs.slice(messageIndex + 1),\n ];\n }\n};\n\n// Update action status on completion (finds most recent message with this action)\nexport const setActionComplete = (\n actionName: string,\n success: boolean,\n errorMessage?: string\n) => {\n const msgs = messages.value;\n // Find the most recent message that has this action pending\n for (let i = msgs.length - 1; i >= 0; i--) {\n const msg = msgs[i];\n if (msg.actionStatus?.[actionName]) {\n const newStatus: Record<string, ActionStatus> = {\n ...msg.actionStatus,\n [actionName]: {\n status: success ? 'success' : 'failed',\n completedAt: Date.now(),\n errorMessage: errorMessage,\n },\n };\n messages.value = [\n ...msgs.slice(0, i),\n { ...msg, actionStatus: newStatus },\n ...msgs.slice(i + 1),\n ];\n return;\n }\n }\n};\n\n// Update message content by index\nexport const updateMessageContent = (messageIndex: number, content: string) => {\n const msgs = messages.value;\n if (messageIndex >= 0 && messageIndex < msgs.length) {\n const msg = msgs[messageIndex];\n messages.value = [\n ...msgs.slice(0, messageIndex),\n { ...msg, content },\n ...msgs.slice(messageIndex + 1),\n ];\n }\n};\n\n// Update content of the most recent message with a pending action\nexport const updateActionMessageContent = (actionName: string, content: string) => {\n const msgs = messages.value;\n for (let i = msgs.length - 1; i >= 0; i--) {\n const msg = msgs[i];\n if (msg.actionStatus?.[actionName]) {\n messages.value = [\n ...msgs.slice(0, i),\n { ...msg, content },\n ...msgs.slice(i + 1),\n ];\n return;\n }\n }\n};\n\nexport const setConversationId = (id: string) => {\n conversationId.value = id;\n};\n\nexport const clearConversationId = () => {\n conversationId.value = null;\n};\n\nexport const setMessageFeedback = (messageId: string, feedback: 'up' | 'down') => {\n messages.value = messages.value.map((msg) =>\n msg.id === messageId ? { ...msg, feedback } : msg\n );\n};\n\nexport const setSources = (sources: ArticleSummary[]) => {\n currentSources.value = sources;\n};\n\nexport const setActions = (actions: TaskButtonData[]) => {\n currentActions.value = actions;\n};\n\nexport const clearActions = () => {\n currentActions.value = [];\n};\n\nexport const setLoading = (loading: boolean) => {\n isLoading.value = loading;\n};\n\nexport const setProgressStatus = (status: ProgressStatus) => {\n progressStatus.value = status;\n};\n\nexport const clearProgressStatus = () => {\n progressStatus.value = { kind: null };\n};\n\nexport const expandChat = () => {\n isExpanded.value = true;\n};\n\nexport const collapseChat = () => {\n isExpanded.value = false;\n};\n\nexport const setPrefillText = (text: string) => {\n prefillText.value = text;\n};\n\nexport const clearPrefillText = () => {\n prefillText.value = '';\n};\n\nexport const setPendingMessage = (message: string) => {\n pendingMessage.value = message;\n};\n\nexport const clearPendingMessage = () => {\n pendingMessage.value = null;\n};\n\nexport const triggerInputFocus = () => {\n focusInputTrigger.value += 1;\n};\n\n// User context actions\nexport const addUserContext = (item: Omit<UserContextItem, 'id'>) => {\n const newItem = { ...item, id: generateContextId() } as UserContextItem;\n userContext.value = [...userContext.value, newItem];\n};\n\nexport const removeUserContext = (id: string) => {\n userContext.value = userContext.value.filter((item) => item.id !== id);\n};\n\nexport const clearUserContext = () => {\n userContext.value = [];\n};\n\nexport const setPendingUserContext = (items: UserContextItem[]) => {\n pendingUserContext.value = items;\n};\n\nexport const clearPendingUserContext = () => {\n pendingUserContext.value = [];\n};\n\nexport const resetChat = () => {\n messages.value = [];\n conversationId.value = null;\n isLoading.value = false;\n progressStatus.value = { kind: null };\n isExpanded.value = false;\n currentSources.value = [];\n currentActions.value = [];\n prefillText.value = '';\n pendingMessage.value = null;\n userContext.value = [];\n pendingUserContext.value = [];\n clearPendingImages();\n};\n\n","/**\n * Router Store\n * Signal-based state for panel navigation\n */\n\nimport { signal, computed } from '@preact/signals';\nimport { resetChat } from './chat';\n\nexport type ViewType = 'home' | 'chat';\n\nexport interface ViewState {\n type: ViewType;\n params?: Record<string, string>;\n}\n\n// Navigation stack for back button support\nexport const viewStack = signal<ViewState[]>([]);\n\n// Current active view\nexport const currentView = signal<ViewState>({ type: 'home' });\n\n// Computed: whether we can go back\nexport const canGoBack = computed(() => viewStack.value.length > 0);\n\n// Computed: whether we're at home\nexport const isAtHome = computed(() => currentView.value.type === 'home');\n\n// Actions\nexport const navigate = (view: ViewType, params?: Record<string, string>) => {\n // Push current state to stack before navigating\n viewStack.value = [...viewStack.value, { ...currentView.value }];\n currentView.value = { type: view, params };\n};\n\nexport const goBack = () => {\n const stack = viewStack.value;\n if (stack.length > 0) {\n // Clear chat when leaving chat views\n const currentType = currentView.value.type;\n if (currentType === 'chat') {\n resetChat();\n }\n\n const previousState = stack[stack.length - 1];\n currentView.value = previousState;\n viewStack.value = stack.slice(0, -1);\n }\n};\n\nexport const goHome = () => {\n // Clear chat when leaving chat views\n const currentType = currentView.value.type;\n if (currentType === 'chat') {\n resetChat();\n }\n\n viewStack.value = [];\n currentView.value = { type: 'home' };\n};\n\nexport const resetRouter = () => {\n viewStack.value = [];\n currentView.value = { type: 'home' };\n};\n\n// Navigate to chat view\nexport const navigateToChat = () => {\n navigate('chat');\n};\n","/**\n * ConfirmActionCard Component\n * \n * Renders inline_ui type actions as inline cards in the chat.\n * If a custom card renderer is registered for the card_type, it's used.\n * Otherwise, a default confirmation card is rendered.\n */\n\nimport Pillar from '../../core/Pillar';\nimport type { CardCallbacks } from '../../core/events';\nimport type { TaskButtonData } from '../Panel/TaskButton';\n\n// Icons\nconst CHECK_ICON = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20,6 9,17 4,12\"/></svg>`;\nconst X_ICON = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\nconst LOADER_ICON = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"/><line x1=\"4.93\" y1=\"4.93\" x2=\"7.76\" y2=\"7.76\"/><line x1=\"16.24\" y1=\"16.24\" x2=\"19.07\" y2=\"19.07\"/><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\"/><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"4.93\" y1=\"19.07\" x2=\"7.76\" y2=\"16.24\"/><line x1=\"16.24\" y1=\"7.76\" x2=\"19.07\" y2=\"4.93\"/></svg>`;\n\n/**\n * Derive a human-readable title from a card_type or action name.\n */\nfunction deriveTitle(name: string): string {\n return name\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Render data as a simple key-value list.\n */\nfunction renderDataPreview(data: Record<string, unknown>): string {\n const entries = Object.entries(data)\n .filter(([key]) => key !== 'card_type') // Don't show card_type\n .slice(0, 5); // Limit to 5 entries\n \n if (entries.length === 0) return '';\n \n return `\n <div class=\"pillar-confirm-card__data\">\n ${entries.map(([key, value]) => {\n const displayValue = Array.isArray(value) \n ? value.join(', ') \n : String(value);\n return `\n <div class=\"pillar-confirm-card__data-row\">\n <span class=\"pillar-confirm-card__data-key\">${deriveTitle(key)}:</span>\n <span class=\"pillar-confirm-card__data-value\">${displayValue}</span>\n </div>\n `;\n }).join('')}\n </div>\n `;\n}\n\n/**\n * Create the default confirmation card for inline_ui actions.\n * Used when no custom card renderer is registered.\n */\nexport function createDefaultConfirmCard(\n action: TaskButtonData,\n callbacks: CardCallbacks\n): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'pillar-confirm-card';\n \n const cardType = (action.data?.card_type as string) || action.name;\n const title = deriveTitle(cardType);\n const data = action.data || {};\n \n // Initial state\n let state: 'idle' | 'loading' | 'success' | 'error' = 'idle';\n let errorMessage = '';\n \n const render = () => {\n if (state === 'success') {\n container.innerHTML = `\n <div class=\"pillar-confirm-card__success\">\n <span class=\"pillar-confirm-card__success-icon\">${CHECK_ICON}</span>\n <span>Completed</span>\n </div>\n `;\n return;\n }\n \n if (state === 'error') {\n container.innerHTML = `\n <div class=\"pillar-confirm-card__content\">\n <div class=\"pillar-confirm-card__header\">\n <span class=\"pillar-confirm-card__title\">${title}</span>\n </div>\n <div class=\"pillar-confirm-card__error\">\n <span>${errorMessage || 'An error occurred'}</span>\n </div>\n <div class=\"pillar-confirm-card__actions\">\n <button type=\"button\" class=\"pillar-confirm-card__btn pillar-confirm-card__btn--secondary js-cancel\">\n ${X_ICON} Dismiss\n </button>\n </div>\n </div>\n `;\n container.querySelector('.js-cancel')?.addEventListener('click', callbacks.onCancel);\n return;\n }\n \n container.innerHTML = `\n <div class=\"pillar-confirm-card__content\">\n <div class=\"pillar-confirm-card__header\">\n <span class=\"pillar-confirm-card__title\">${title}</span>\n </div>\n ${renderDataPreview(data)}\n <div class=\"pillar-confirm-card__actions\">\n <button type=\"button\" class=\"pillar-confirm-card__btn pillar-confirm-card__btn--secondary js-cancel\" ${state === 'loading' ? 'disabled' : ''}>\n ${X_ICON} Cancel\n </button>\n <button type=\"button\" class=\"pillar-confirm-card__btn pillar-confirm-card__btn--primary js-confirm\" ${state === 'loading' ? 'disabled' : ''}>\n ${state === 'loading' ? `<span class=\"pillar-confirm-card__spinner\">${LOADER_ICON}</span>` : CHECK_ICON} \n ${state === 'loading' ? 'Processing...' : 'Confirm'}\n </button>\n </div>\n </div>\n `;\n \n // Attach event listeners\n container.querySelector('.js-cancel')?.addEventListener('click', callbacks.onCancel);\n container.querySelector('.js-confirm')?.addEventListener('click', () => {\n callbacks.onConfirm(data);\n });\n };\n \n // Initial render\n render();\n \n // Handle state changes from custom implementations\n if (callbacks.onStateChange) {\n const originalOnStateChange = callbacks.onStateChange;\n callbacks.onStateChange = (newState, message) => {\n if (newState === 'loading') state = 'loading';\n else if (newState === 'success') state = 'success';\n else if (newState === 'error') {\n state = 'error';\n errorMessage = message || '';\n }\n render();\n originalOnStateChange(newState, message);\n };\n }\n \n return container;\n}\n\n/**\n * Create a confirmation card for a confirm_action type action.\n * Uses custom renderer if registered, otherwise uses default.\n */\nexport function createConfirmActionCard(\n action: TaskButtonData,\n onConfirm: (data?: Record<string, unknown>) => void,\n onCancel: () => void\n): HTMLDivElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'pillar-confirm-card-wrapper';\n \n const cardType = (action.data?.card_type as string) || action.name;\n const pillar = Pillar.getInstance();\n const customRenderer = pillar?.getCardRenderer(cardType);\n \n const callbacks: CardCallbacks = {\n onConfirm: (modifiedData) => {\n onConfirm(modifiedData || action.data);\n },\n onCancel,\n onStateChange: (state, message) => {\n console.log(`[Pillar] Card state changed to ${state}${message ? `: ${message}` : ''}`);\n },\n };\n \n if (customRenderer) {\n // Use custom renderer\n try {\n const cleanup = customRenderer(wrapper, action.data || {}, callbacks);\n // Store cleanup function for later\n (wrapper as unknown as { _cleanup?: () => void })._cleanup = cleanup || undefined;\n } catch (err) {\n console.error('[Pillar] Custom card renderer error:', err);\n }\n } else {\n // Use default card\n const defaultCard = createDefaultConfirmCard(action, callbacks);\n wrapper.appendChild(defaultCard);\n }\n \n return wrapper;\n}\n\n/**\n * CSS styles for ConfirmActionCard.\n */\nexport const CONFIRM_CARD_STYLES = `\n/* Confirm Action Card */\n.pillar-confirm-card-wrapper {\n margin-top: 12px;\n}\n\n.pillar-confirm-card {\n background: var(--pillar-bg-secondary, #f9fafb);\n border: 1px solid var(--pillar-border, #e5e7eb);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.pillar-confirm-card__content {\n padding: 16px;\n}\n\n.pillar-confirm-card__header {\n margin-bottom: 12px;\n}\n\n.pillar-confirm-card__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--pillar-text-primary, #111827);\n}\n\n.pillar-confirm-card__data {\n background: var(--pillar-bg-primary, #ffffff);\n border: 1px solid var(--pillar-border, #e5e7eb);\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 12px;\n}\n\n.pillar-confirm-card__data-row {\n display: flex;\n gap: 8px;\n font-size: 13px;\n margin-bottom: 4px;\n}\n\n.pillar-confirm-card__data-row:last-child {\n margin-bottom: 0;\n}\n\n.pillar-confirm-card__data-key {\n color: var(--pillar-text-secondary, #6b7280);\n flex-shrink: 0;\n}\n\n.pillar-confirm-card__data-value {\n color: var(--pillar-text-primary, #111827);\n word-break: break-word;\n}\n\n.pillar-confirm-card__actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}\n\n.pillar-confirm-card__btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n}\n\n.pillar-confirm-card__btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.pillar-confirm-card__btn svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-confirm-card__btn--primary {\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n border-color: var(--pillar-primary, #2563eb);\n}\n\n.pillar-confirm-card__btn--primary:hover:not(:disabled) {\n background: var(--pillar-primary-hover, #1d4ed8);\n border-color: var(--pillar-primary-hover, #1d4ed8);\n}\n\n.pillar-confirm-card__btn--secondary {\n background: var(--pillar-bg-primary, #ffffff);\n color: var(--pillar-text-secondary, #6b7280);\n border-color: var(--pillar-border, #e5e7eb);\n}\n\n.pillar-confirm-card__btn--secondary:hover:not(:disabled) {\n background: var(--pillar-bg-secondary, #f9fafb);\n}\n\n.pillar-confirm-card__success {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 16px;\n color: #059669;\n font-weight: 500;\n}\n\n.pillar-confirm-card__success-icon svg {\n width: 20px;\n height: 20px;\n}\n\n.pillar-confirm-card__error {\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 12px;\n color: #dc2626;\n font-size: 13px;\n}\n\n.pillar-confirm-card__spinner {\n display: inline-flex;\n animation: pillar-spin 1s linear infinite;\n}\n\n@keyframes pillar-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n`;\n","/**\n * Pillar Context\n * Provides API client and event emitter to components\n */\n\nimport { h, createContext, type ComponentChildren } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport type { APIClient } from '../api/client';\nimport type { EventEmitter } from '../core/events';\n\ninterface PillarContextValue {\n api: APIClient;\n events: EventEmitter;\n}\n\nconst PillarContext = createContext<PillarContextValue | null>(null);\n\ninterface PillarProviderProps {\n api: APIClient;\n events: EventEmitter;\n children: ComponentChildren;\n}\n\nexport function PillarProvider({ api, events, children }: PillarProviderProps) {\n return (\n <PillarContext.Provider value={{ api, events }}>\n {children}\n </PillarContext.Provider>\n );\n}\n\nexport function usePillar(): PillarContextValue {\n const context = useContext(PillarContext);\n if (!context) {\n throw new Error('usePillar must be used within a PillarProvider');\n }\n return context;\n}\n\nexport function useAPI(): APIClient {\n return usePillar().api;\n}\n\nexport function useEvents(): EventEmitter {\n return usePillar().events;\n}\n\n","/**\n * InlinePlanView Component\n *\n * A compact inline version of the plan display for embedding\n * within chat bubbles when plans are short (≤3 steps).\n *\n * This provides a more integrated experience where the plan\n * appears as part of the conversation flow rather than a\n * separate overlay.\n */\n\nimport { h } from 'preact';\nimport type { ExecutionPlan, ExecutionStep, StepStatus } from '../../core/plan';\nimport Pillar from '../../core/Pillar';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum steps before using full PlanView instead of inline */\nexport const INLINE_PLAN_MAX_STEPS = 3;\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst ICONS = {\n pending: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n ready: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>`,\n awaiting_confirmation: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`,\n executing: `<svg class=\"pillar-inline-plan__spinner\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"/></svg>`,\n awaiting_result: `<svg class=\"pillar-inline-plan__spinner\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"/></svg>`,\n completed: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"9,12 12,15 16,10\"/></svg>`,\n skipped: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke-dasharray=\"4,2\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/></svg>`,\n failed: `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\n};\n\nfunction getStatusIcon(status: StepStatus): string {\n return ICONS[status] || ICONS.pending;\n}\n\n// ============================================================================\n// InlineStepItem Component\n// ============================================================================\n\ninterface InlineStepItemProps {\n step: ExecutionStep;\n onConfirm: (stepId: string) => void;\n onSkip: (stepId: string) => void;\n onRetry: (stepId: string) => void;\n onDone: (stepId: string) => void;\n}\n\nfunction InlineStepItem({ step, onConfirm, onSkip, onRetry, onDone }: InlineStepItemProps) {\n const canRetry = step.status === 'failed' && step.is_retriable && step.retry_count < step.max_retries;\n const isAwaitingResult = step.status === 'awaiting_result';\n\n return (\n <div class={`pillar-inline-plan__step pillar-inline-plan__step--${step.status}`}>\n <span\n class=\"pillar-inline-plan__step-icon\"\n dangerouslySetInnerHTML={{ __html: getStatusIcon(step.status) }}\n />\n <div class=\"pillar-inline-plan__step-content\">\n <span class=\"pillar-inline-plan__step-text\">{step.description}</span>\n \n {isAwaitingResult && (\n <div class=\"pillar-inline-plan__step-instruction\">\n <span class=\"pillar-inline-plan__action-badge\">In Progress</span>\n </div>\n )}\n </div>\n\n {step.status === 'awaiting_confirmation' && (\n <div class=\"pillar-inline-plan__step-actions\">\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--confirm\"\n onClick={() => onConfirm(step.id)}\n >\n ✓\n </button>\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--skip\"\n onClick={() => onSkip(step.id)}\n >\n Skip\n </button>\n </div>\n )}\n\n {isAwaitingResult && (\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--done\"\n onClick={() => onDone(step.id)}\n >\n Done\n </button>\n )}\n\n {canRetry && (\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--retry\"\n onClick={() => onRetry(step.id)}\n >\n Retry\n </button>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// InlinePlanView Component\n// ============================================================================\n\ninterface InlinePlanViewProps {\n plan: ExecutionPlan;\n}\n\nexport function InlinePlanView({ plan }: InlinePlanViewProps) {\n const pillar = Pillar.getInstance();\n\n const handleConfirm = (stepId: string) => {\n pillar?.confirmPlanStep(stepId);\n };\n\n const handleSkip = (stepId: string) => {\n pillar?.skipPlanStep(stepId);\n };\n\n const handleRetry = (stepId: string) => {\n pillar?.retryPlanStep(stepId);\n };\n\n const handleDone = (stepId: string) => {\n pillar?.markPlanStepDone(stepId);\n };\n\n const handleStart = () => {\n pillar?.startPlan();\n };\n\n const handleCancel = () => {\n pillar?.cancelPlan();\n };\n\n const isAwaitingStart = plan.status === 'awaiting_start';\n const isComplete = plan.status === 'completed';\n const isFailed = plan.status === 'failed';\n const isCancelled = plan.status === 'cancelled';\n\n return (\n <div class={`pillar-inline-plan pillar-inline-plan--${plan.status}`}>\n {/* Steps */}\n <div class=\"pillar-inline-plan__steps\">\n {plan.steps.map((step) => (\n <InlineStepItem\n key={step.id}\n step={step}\n onConfirm={handleConfirm}\n onSkip={handleSkip}\n onRetry={handleRetry}\n onDone={handleDone}\n />\n ))}\n </div>\n\n {/* Footer actions */}\n {isAwaitingStart && (\n <div class=\"pillar-inline-plan__footer\">\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--start\"\n onClick={handleStart}\n >\n Start\n </button>\n <button\n type=\"button\"\n class=\"pillar-inline-plan__btn pillar-inline-plan__btn--cancel\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n </div>\n )}\n\n {/* Status messages */}\n {isComplete && (\n <div class=\"pillar-inline-plan__status pillar-inline-plan__status--success\">\n ✓ Completed\n </div>\n )}\n\n {isFailed && (\n <div class=\"pillar-inline-plan__status pillar-inline-plan__status--error\">\n Plan failed\n </div>\n )}\n\n {isCancelled && (\n <div class=\"pillar-inline-plan__status pillar-inline-plan__status--cancelled\">\n Cancelled\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Check if a plan should be displayed inline.\n */\nexport function shouldDisplayInline(plan: ExecutionPlan): boolean {\n return plan.total_steps <= INLINE_PLAN_MAX_STEPS;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nexport const INLINE_PLAN_STYLES = `\n/* Inline Plan Container */\n.pillar-inline-plan {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 0;\n}\n\n/* Steps list */\n.pillar-inline-plan__steps {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Individual step */\n.pillar-inline-plan__step {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 13px;\n background: transparent;\n transition: all 0.15s ease;\n}\n\n.pillar-inline-plan__step-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--pillar-text-tertiary, #9ca3af);\n}\n\n.pillar-inline-plan__step-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.pillar-inline-plan__step-text {\n color: var(--pillar-text-primary, #374151);\n line-height: 1.4;\n}\n\n.pillar-inline-plan__step-instruction {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.pillar-inline-plan__action-badge {\n display: inline-block;\n padding: 1px 5px;\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n background: var(--pillar-warning, #f59e0b);\n color: white;\n border-radius: 3px;\n flex-shrink: 0;\n}\n\n.pillar-inline-plan__instruction-text {\n font-size: 11px;\n color: var(--pillar-text-secondary, #6b7280);\n}\n\n.pillar-inline-plan__step-actions {\n display: flex;\n gap: 4px;\n}\n\n/* Step states */\n.pillar-inline-plan__step--pending {\n opacity: 0.6;\n}\n\n.pillar-inline-plan__step--ready .pillar-inline-plan__step-icon {\n color: var(--pillar-primary, #2563eb);\n}\n\n.pillar-inline-plan__step--awaiting_confirmation {\n background: var(--pillar-bg-warning-subtle, rgba(251, 191, 36, 0.1));\n}\n\n.pillar-inline-plan__step--awaiting_confirmation .pillar-inline-plan__step-icon {\n color: var(--pillar-warning-dark, #d97706);\n}\n\n.pillar-inline-plan__step--executing .pillar-inline-plan__step-icon,\n.pillar-inline-plan__step--awaiting_result .pillar-inline-plan__step-icon {\n color: var(--pillar-primary, #2563eb);\n}\n\n.pillar-inline-plan__step--completed .pillar-inline-plan__step-icon {\n color: var(--pillar-success, #059669);\n}\n\n.pillar-inline-plan__step--completed .pillar-inline-plan__step-text {\n text-decoration: line-through;\n color: var(--pillar-text-secondary, #6b7280);\n}\n\n.pillar-inline-plan__step--skipped {\n opacity: 0.5;\n}\n\n.pillar-inline-plan__step--skipped .pillar-inline-plan__step-text {\n text-decoration: line-through;\n}\n\n.pillar-inline-plan__step--failed {\n background: var(--pillar-bg-danger-subtle, rgba(220, 38, 38, 0.1));\n}\n\n.pillar-inline-plan__step--failed .pillar-inline-plan__step-icon {\n color: var(--pillar-danger, #dc2626);\n}\n\n/* Buttons */\n.pillar-inline-plan__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 500;\n font-family: inherit;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: none;\n}\n\n.pillar-inline-plan__btn--confirm {\n background: var(--pillar-success, #059669);\n color: #ffffff;\n min-width: 24px;\n}\n\n.pillar-inline-plan__btn--confirm:hover {\n background: var(--pillar-success-hover, #047857);\n}\n\n.pillar-inline-plan__btn--skip {\n background: transparent;\n color: var(--pillar-text-secondary, #6b7280);\n border: 1px solid var(--pillar-border, #d1d5db);\n}\n\n.pillar-inline-plan__btn--skip:hover {\n background: var(--pillar-bg-tertiary, #f3f4f6);\n}\n\n.pillar-inline-plan__btn--retry {\n background: var(--pillar-danger, #dc2626);\n color: #ffffff;\n}\n\n.pillar-inline-plan__btn--retry:hover {\n background: var(--pillar-danger-hover, #b91c1c);\n}\n\n.pillar-inline-plan__btn--done {\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n}\n\n.pillar-inline-plan__btn--done:hover {\n background: var(--pillar-primary-hover, #1d4ed8);\n}\n\n.pillar-inline-plan__btn--start {\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n}\n\n.pillar-inline-plan__btn--start:hover {\n background: var(--pillar-primary-hover, #1d4ed8);\n}\n\n.pillar-inline-plan__btn--cancel {\n background: transparent;\n color: var(--pillar-text-secondary, #6b7280);\n border: 1px solid var(--pillar-border, #d1d5db);\n}\n\n.pillar-inline-plan__btn--cancel:hover {\n background: var(--pillar-bg-tertiary, #f3f4f6);\n color: var(--pillar-danger, #dc2626);\n border-color: var(--pillar-danger, #dc2626);\n}\n\n/* Footer */\n.pillar-inline-plan__footer {\n display: flex;\n gap: 8px;\n padding-top: 6px;\n}\n\n/* Status messages */\n.pillar-inline-plan__status {\n font-size: 12px;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: 4px;\n}\n\n.pillar-inline-plan__status--success {\n color: var(--pillar-success, #059669);\n background: var(--pillar-bg-success-subtle, rgba(5, 150, 105, 0.1));\n}\n\n.pillar-inline-plan__status--error {\n color: var(--pillar-danger, #dc2626);\n background: var(--pillar-bg-danger-subtle, rgba(220, 38, 38, 0.1));\n}\n\n.pillar-inline-plan__status--cancelled {\n color: var(--pillar-text-tertiary, #9ca3af);\n background: var(--pillar-bg-tertiary, #f3f4f6);\n}\n\n/* Spinner animation */\n@keyframes pillar-inline-plan-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.pillar-inline-plan__spinner {\n animation: pillar-inline-plan-spin 1s linear infinite;\n}\n`;\n","/**\n * PlanStepItem Component\n *\n * Renders a single step in an execution plan.\n * Shows status icon, description, and action buttons for confirmation/skip.\n */\n\nimport { h } from 'preact';\nimport type { ExecutionStep, StepStatus } from '../../core/plan';\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst ICONS = {\n pending: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n ready: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>`,\n awaiting_confirmation: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`,\n executing: `<svg class=\"pillar-plan-step__spinner\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"/></svg>`,\n awaiting_result: `<svg class=\"pillar-plan-step__spinner\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"/></svg>`,\n completed: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"9,12 12,15 16,10\"/></svg>`,\n skipped: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke-dasharray=\"4,2\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/></svg>`,\n failed: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\n};\n\nfunction getStatusIcon(status: StepStatus): string {\n switch (status) {\n case 'pending':\n return ICONS.pending;\n case 'ready':\n return ICONS.ready;\n case 'awaiting_confirmation':\n return ICONS.awaiting_confirmation;\n case 'executing':\n return ICONS.executing;\n case 'awaiting_result':\n return ICONS.awaiting_result;\n case 'completed':\n return ICONS.completed;\n case 'skipped':\n return ICONS.skipped;\n case 'failed':\n return ICONS.failed;\n default:\n return ICONS.pending;\n }\n}\n\n// ============================================================================\n// PlanStepItem Component\n// ============================================================================\n\ninterface PlanStepItemProps {\n step: ExecutionStep;\n onConfirm: (stepId: string, data?: Record<string, unknown>) => void;\n onSkip: (stepId: string) => void;\n onRetry?: (stepId: string) => void;\n onDone?: (stepId: string) => void;\n}\n\nexport function PlanStepItem({ step, onConfirm, onSkip, onRetry, onDone }: PlanStepItemProps) {\n const handleConfirm = () => {\n onConfirm(step.id);\n };\n\n const handleSkip = () => {\n onSkip(step.id);\n };\n\n const handleRetry = () => {\n onRetry?.(step.id);\n };\n\n const handleDone = () => {\n onDone?.(step.id);\n };\n\n const isActive =\n step.status === 'ready' ||\n step.status === 'executing' ||\n step.status === 'awaiting_confirmation' ||\n step.status === 'awaiting_result';\n\n const canRetry = step.status === 'failed' && step.is_retriable && step.retry_count < step.max_retries;\n const statusClass = `pillar-plan-step pillar-plan-step--${step.status}`;\n\n return (\n <div class={statusClass}>\n <div class=\"pillar-plan-step__icon\">\n <span dangerouslySetInnerHTML={{ __html: getStatusIcon(step.status) }} />\n </div>\n <div class=\"pillar-plan-step__content\">\n <div class=\"pillar-plan-step__description\">{step.description}</div>\n\n {step.status === 'awaiting_confirmation' && (\n <div class=\"pillar-plan-step__actions\">\n <button\n type=\"button\"\n class=\"pillar-plan-step__confirm-btn\"\n onClick={handleConfirm}\n >\n Confirm\n </button>\n <button\n type=\"button\"\n class=\"pillar-plan-step__skip-btn\"\n onClick={handleSkip}\n >\n Skip\n </button>\n </div>\n )}\n\n {step.status === 'executing' && (\n <div class=\"pillar-plan-step__status-text\">Running...</div>\n )}\n\n {step.status === 'awaiting_result' && (\n <div class=\"pillar-plan-step__awaiting-container\">\n <div class=\"pillar-plan-step__instruction-row\">\n <span class=\"pillar-plan-step__action-badge\">In Progress</span>\n <span class=\"pillar-plan-step__instruction\">Complete this step to continue</span>\n </div>\n <button\n type=\"button\"\n class=\"pillar-plan-step__done-btn\"\n onClick={handleDone}\n >\n Done\n </button>\n </div>\n )}\n\n {step.status === 'failed' && (\n <div class=\"pillar-plan-step__error-container\">\n {step.error_message && (\n <div class=\"pillar-plan-step__error\">{step.error_message}</div>\n )}\n {canRetry && (\n <div class=\"pillar-plan-step__retry-info\">\n <span class=\"pillar-plan-step__retry-count\">\n Attempt {step.retry_count + 1} of {step.max_retries + 1}\n </span>\n <button\n type=\"button\"\n class=\"pillar-plan-step__retry-btn\"\n onClick={handleRetry}\n >\n Retry\n </button>\n </div>\n )}\n {!canRetry && step.retry_count >= step.max_retries && (\n <div class=\"pillar-plan-step__retry-exhausted\">\n All retry attempts exhausted\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nexport const PLAN_STEP_STYLES = `\n/* Individual Step */\n.pillar-plan-step {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n background: var(--pillar-bg-primary, #ffffff);\n border: 1px solid var(--pillar-border, #e5e7eb);\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.pillar-plan-step__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n color: var(--pillar-text-tertiary, #9ca3af);\n}\n\n.pillar-plan-step__icon svg {\n width: 18px;\n height: 18px;\n}\n\n.pillar-plan-step__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.pillar-plan-step__description {\n font-size: 13px;\n font-weight: 500;\n color: var(--pillar-text-primary, #374151);\n line-height: 1.4;\n}\n\n.pillar-plan-step__status-text {\n font-size: 12px;\n color: var(--pillar-primary, #2563eb);\n font-style: italic;\n}\n\n.pillar-plan-step__error {\n font-size: 12px;\n color: var(--pillar-danger, #dc2626);\n}\n\n.pillar-plan-step__actions {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n/* Step States */\n.pillar-plan-step--pending {\n opacity: 0.6;\n}\n\n.pillar-plan-step--ready {\n background: var(--pillar-bg-info-subtle, #eff6ff);\n border-color: var(--pillar-info, #93c5fd);\n}\n\n.pillar-plan-step--ready .pillar-plan-step__icon {\n color: var(--pillar-primary, #2563eb);\n}\n\n.pillar-plan-step--awaiting_confirmation {\n background: var(--pillar-bg-warning-subtle, #fef3c7);\n border-color: var(--pillar-warning, #fcd34d);\n}\n\n.pillar-plan-step--awaiting_confirmation .pillar-plan-step__icon {\n color: var(--pillar-warning-dark, #d97706);\n}\n\n.pillar-plan-step--executing,\n.pillar-plan-step--awaiting_result {\n background: var(--pillar-bg-info-subtle, #eff6ff);\n border-color: var(--pillar-info, #93c5fd);\n}\n\n.pillar-plan-step--executing .pillar-plan-step__icon,\n.pillar-plan-step--awaiting_result .pillar-plan-step__icon {\n color: var(--pillar-primary, #2563eb);\n}\n\n.pillar-plan-step--completed .pillar-plan-step__icon {\n color: var(--pillar-success, #059669);\n}\n\n.pillar-plan-step--completed .pillar-plan-step__description {\n text-decoration: line-through;\n color: var(--pillar-text-secondary, #6b7280);\n}\n\n.pillar-plan-step--skipped {\n opacity: 0.5;\n}\n\n.pillar-plan-step--skipped .pillar-plan-step__icon {\n color: var(--pillar-text-tertiary, #9ca3af);\n}\n\n.pillar-plan-step--skipped .pillar-plan-step__description {\n text-decoration: line-through;\n color: var(--pillar-text-tertiary, #9ca3af);\n}\n\n.pillar-plan-step--failed {\n background: var(--pillar-bg-danger-subtle, #fef2f2);\n border-color: var(--pillar-danger-light, #fca5a5);\n}\n\n.pillar-plan-step--failed .pillar-plan-step__icon {\n color: var(--pillar-danger, #dc2626);\n}\n\n/* Error Container */\n.pillar-plan-step__error-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.pillar-plan-step__retry-info {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 2px;\n}\n\n.pillar-plan-step__retry-count {\n font-size: 11px;\n color: var(--pillar-text-tertiary, #9ca3af);\n}\n\n.pillar-plan-step__retry-exhausted {\n font-size: 11px;\n color: var(--pillar-text-tertiary, #9ca3af);\n font-style: italic;\n margin-top: 2px;\n}\n\n/* Retry Button */\n.pillar-plan-step__retry-btn {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n font-size: 11px;\n font-weight: 600;\n font-family: inherit;\n background: var(--pillar-danger, #dc2626);\n color: #ffffff;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan-step__retry-btn:hover {\n background: var(--pillar-danger-hover, #b91c1c);\n}\n\n/* Confirm Button */\n.pillar-plan-step__confirm-btn {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n font-family: inherit;\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan-step__confirm-btn:hover {\n background: var(--pillar-primary-hover, #1d4ed8);\n}\n\n/* Skip Button */\n.pillar-plan-step__skip-btn {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: var(--pillar-text-secondary, #6b7280);\n border: 1px solid var(--pillar-border, #d1d5db);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan-step__skip-btn:hover {\n background: var(--pillar-bg-tertiary, #f3f4f6);\n color: var(--pillar-text-primary, #374151);\n}\n\n/* Awaiting Result Container */\n.pillar-plan-step__awaiting-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.pillar-plan-step__instruction-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.pillar-plan-step__action-badge {\n display: inline-block;\n padding: 2px 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n background: var(--pillar-warning, #f59e0b);\n color: white;\n border-radius: 3px;\n flex-shrink: 0;\n}\n\n.pillar-plan-step__instruction {\n font-size: 12px;\n color: var(--pillar-text-secondary, #6b7280);\n}\n\n/* Done Button */\n.pillar-plan-step__done-btn {\n display: inline-flex;\n align-items: center;\n align-self: flex-start;\n padding: 6px 14px;\n font-size: 12px;\n font-weight: 600;\n font-family: inherit;\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan-step__done-btn:hover {\n background: var(--pillar-primary-hover, #1d4ed8);\n}\n\n/* Spinner Animation for Executing Step */\n@keyframes pillar-plan-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.pillar-plan-step__spinner {\n animation: pillar-plan-spin 1s linear infinite;\n}\n`;\n","/**\n * Plan Store\n * Signal-based state management for multi-step execution plans.\n */\n\nimport { signal, computed } from '@preact/signals';\nimport type { ExecutionPlan, ExecutionStep, StepStatus } from '../core/plan';\n\n// ============================================================================\n// State Signals\n// ============================================================================\n\n/** Active execution plan (only one at a time) */\nexport const activePlan = signal<ExecutionPlan | null>(null);\n\n/** Completed/cancelled plans for the session (for analytics/history) */\nexport const planHistory = signal<ExecutionPlan[]>([]);\n\n// ============================================================================\n// Computed Values\n// ============================================================================\n\n/** Whether there's an active plan */\nexport const hasActivePlan = computed(() => activePlan.value !== null);\n\n/** Current step of the active plan (first ready or executing step) */\nexport const currentPlanStep = computed((): ExecutionStep | null => {\n if (!activePlan.value) return null;\n\n // Find the first step that is ready, executing, or awaiting confirmation\n return (\n activePlan.value.steps.find(\n (s) =>\n s.status === 'ready' ||\n s.status === 'executing' ||\n s.status === 'awaiting_confirmation'\n ) || null\n );\n});\n\n/** Number of completed or skipped steps */\nexport const completedPlanStepsCount = computed((): number => {\n if (!activePlan.value) return 0;\n return activePlan.value.steps.filter(\n (s) => s.status === 'completed' || s.status === 'skipped'\n ).length;\n});\n\n/** Progress as a fraction (0-1) */\nexport const planProgress = computed((): number => {\n if (!activePlan.value || activePlan.value.total_steps === 0) return 0;\n return activePlan.value.completed_steps / activePlan.value.total_steps;\n});\n\n/** Whether the plan is awaiting user to start it */\nexport const isPlanAwaitingStart = computed((): boolean => {\n return activePlan.value?.status === 'awaiting_start';\n});\n\n// ============================================================================\n// Actions\n// ============================================================================\n\n/**\n * Set a new active plan.\n * Replaces any existing active plan.\n */\nexport function setPlan(plan: ExecutionPlan): void {\n // Move current plan to history if exists\n if (activePlan.value) {\n planHistory.value = [...planHistory.value, activePlan.value];\n }\n activePlan.value = plan;\n}\n\n/**\n * Update the active plan with new data from server.\n */\nexport function updatePlan(plan: ExecutionPlan): void {\n activePlan.value = plan;\n}\n\n/**\n * Update a specific step in the active plan.\n */\nexport function updatePlanStep(\n stepId: string,\n updates: Partial<ExecutionStep>\n): void {\n if (!activePlan.value) return;\n\n const steps = activePlan.value.steps.map((step) =>\n step.id === stepId ? { ...step, ...updates } : step\n );\n\n // Update completed_steps count if status changed to completed\n let completedSteps = activePlan.value.completed_steps;\n if (updates.status === 'completed') {\n completedSteps = steps.filter((s) => s.status === 'completed').length;\n }\n\n activePlan.value = {\n ...activePlan.value,\n steps,\n completed_steps: completedSteps,\n };\n}\n\n/**\n * Clear the active plan.\n * Optionally moves it to history.\n */\nexport function clearPlan(addToHistory: boolean = true): void {\n if (activePlan.value && addToHistory) {\n planHistory.value = [...planHistory.value, activePlan.value];\n }\n activePlan.value = null;\n}\n\n/**\n * Get a step by ID from the active plan.\n */\nexport function getPlanStep(stepId: string): ExecutionStep | undefined {\n return activePlan.value?.steps.find((s) => s.id === stepId);\n}\n\n/**\n * Reset all plan state.\n */\nexport function resetPlanStore(): void {\n activePlan.value = null;\n planHistory.value = [];\n}\n","/**\n * PlanView Component\n *\n * Renders an active execution plan as an interactive to-do list.\n * Shows plan goal, progress, step list with status indicators,\n * and action buttons (Start/Cancel).\n */\n\nimport { h } from 'preact';\nimport { activePlan, planProgress } from '../../store/plan';\nimport type { ExecutionStep } from '../../core/plan';\nimport { PlanStepItem } from './PlanStepItem';\nimport Pillar from '../../core/Pillar';\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst ICONS = {\n plan: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11l3 3L22 4\"/><path d=\"M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11\"/></svg>`,\n};\n\n// ============================================================================\n// PlanView Component\n// ============================================================================\n\nexport function PlanView() {\n const plan = activePlan.value;\n if (!plan) return null;\n\n const isAwaitingStart = plan.status === 'awaiting_start';\n const isExecuting = plan.status === 'executing';\n const progress = planProgress.value;\n const pillar = Pillar.getInstance();\n\n const handleStart = () => {\n pillar?.startPlan();\n };\n\n const handleCancel = () => {\n pillar?.cancelPlan();\n };\n\n const handleConfirmStep = (stepId: string, data?: Record<string, unknown>) => {\n pillar?.confirmPlanStep(stepId, data);\n };\n\n const handleSkipStep = (stepId: string) => {\n pillar?.skipPlanStep(stepId);\n };\n\n const handleRetryStep = (stepId: string) => {\n pillar?.retryPlanStep(stepId);\n };\n\n const handleDoneStep = (stepId: string) => {\n pillar?.markPlanStepDone(stepId);\n };\n\n return (\n <div class=\"pillar-plan\">\n <div class=\"pillar-plan__header\">\n <div class=\"pillar-plan__icon\">\n <span dangerouslySetInnerHTML={{ __html: ICONS.plan }} />\n </div>\n <div class=\"pillar-plan__title\">{plan.goal}</div>\n <div class=\"pillar-plan__progress\">\n {plan.completed_steps}/{plan.total_steps}\n </div>\n </div>\n\n {/* Progress bar */}\n {isExecuting && (\n <div class=\"pillar-plan__progress-bar\">\n <div\n class=\"pillar-plan__progress-fill\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n )}\n\n <div class=\"pillar-plan__steps\">\n {plan.steps.map((step) => (\n <PlanStepItem\n key={step.id}\n step={step}\n onConfirm={handleConfirmStep}\n onSkip={handleSkipStep}\n onRetry={handleRetryStep}\n onDone={handleDoneStep}\n />\n ))}\n </div>\n\n <div class=\"pillar-plan__footer\">\n {isAwaitingStart && (\n <button\n type=\"button\"\n class=\"pillar-plan__start-btn\"\n onClick={handleStart}\n >\n Start Plan\n </button>\n )}\n <button\n type=\"button\"\n class=\"pillar-plan__cancel-btn\"\n onClick={handleCancel}\n >\n Cancel\n </button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nexport const PLAN_STYLES = `\n/* Plan Container */\n.pillar-plan {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: var(--pillar-bg-secondary, #f9fafb);\n border: 1px solid var(--pillar-border, #e5e7eb);\n border-radius: 12px;\n margin: 12px 0;\n}\n\n/* Header */\n.pillar-plan__header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.pillar-plan__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--pillar-text-secondary, #6b7280);\n}\n\n.pillar-plan__title {\n flex: 1;\n font-size: 14px;\n font-weight: 600;\n color: var(--pillar-text-primary, #1a1a1a);\n line-height: 1.4;\n}\n\n.pillar-plan__progress {\n font-size: 12px;\n font-weight: 500;\n color: var(--pillar-text-secondary, #6b7280);\n padding: 2px 8px;\n background: var(--pillar-bg-tertiary, #e5e7eb);\n border-radius: 10px;\n}\n\n/* Progress Bar */\n.pillar-plan__progress-bar {\n height: 4px;\n background: var(--pillar-bg-tertiary, #e5e7eb);\n border-radius: 2px;\n overflow: hidden;\n}\n\n.pillar-plan__progress-fill {\n height: 100%;\n background: var(--pillar-primary, #2563eb);\n border-radius: 2px;\n transition: width 0.3s ease;\n}\n\n/* Steps List */\n.pillar-plan__steps {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Footer */\n.pillar-plan__footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--pillar-border, #e5e7eb);\n}\n\n/* Start Button */\n.pillar-plan__start-btn {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n background: var(--pillar-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan__start-btn:hover {\n background: var(--pillar-primary-hover, #1d4ed8);\n}\n\n/* Cancel Button */\n.pillar-plan__cancel-btn {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: var(--pillar-text-secondary, #6b7280);\n border: 1px solid var(--pillar-border, #d1d5db);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-plan__cancel-btn:hover {\n background: var(--pillar-bg-tertiary, #f3f4f6);\n color: var(--pillar-danger, #dc2626);\n border-color: var(--pillar-danger, #dc2626);\n}\n`;\n","/**\n * Panel Header Component\n * Navigation header with back, home, and close buttons\n */\n\nimport { h } from 'preact';\nimport { canGoBack, isAtHome, goBack, goHome, type ViewType } from '../../store/router';\nimport { closePanel } from '../../store/panel';\n\nconst BACK_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z\" clip-rule=\"evenodd\"/></svg>`;\nconst HOME_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z\"/></svg>`;\nconst CLOSE_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"/></svg>`;\n\nconst VIEW_TITLES: Record<ViewType, string> = {\n home: 'Assistant',\n chat: 'Assistant',\n};\n\ninterface HeaderProps {\n currentView: ViewType;\n customTitle?: string;\n /** Hide back and home navigation buttons */\n hideNavigation?: boolean;\n}\n\nexport function Header({ currentView, customTitle, hideNavigation = false }: HeaderProps) {\n const showBack = !hideNavigation && canGoBack.value;\n const showHome = !hideNavigation && !isAtHome.value;\n const title = customTitle || VIEW_TITLES[currentView];\n\n const handleBack = () => {\n goBack();\n };\n\n const handleHome = () => {\n goHome();\n };\n\n const handleClose = () => {\n closePanel();\n };\n\n return (\n <header class=\"_pillar-header pillar-header\">\n <div class=\"_pillar-header-left pillar-header-left\">\n {showBack && (\n <button\n class=\"_pillar-icon-btn pillar-icon-btn pillar-back-btn\"\n onClick={handleBack}\n aria-label=\"Go back\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: BACK_ICON }}\n />\n )}\n {showHome && (\n <button\n class=\"_pillar-icon-btn pillar-icon-btn pillar-home-btn\"\n onClick={handleHome}\n aria-label=\"Go to home\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: HOME_ICON }}\n />\n )}\n <span class=\"_pillar-header-title pillar-header-title\">{title}</span>\n </div>\n <button\n class=\"_pillar-icon-btn pillar-icon-btn pillar-close-btn\"\n onClick={handleClose}\n aria-label=\"Close assistant panel\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: CLOSE_ICON }}\n />\n </header>\n );\n}\n\n","/**\n * Context Tag Component\n * Displays a removable context item (highlighted text, etc.) as a chip/tag\n */\n\nimport type { UserContextItem } from '../../types/user-context';\nimport { isHighlightedTextContext, getContextDisplayLabel } from '../../types/user-context';\n\n// Close icon SVG\nconst CLOSE_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\n\n// Quote icon for highlighted text\nconst QUOTE_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4.583 17.321C3.553 16.227 3 15 3 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179zm10 0C13.553 16.227 13 15 13 13.011c0-3.5 2.457-6.637 6.03-8.188l.893 1.378c-3.335 1.804-3.987 4.145-4.247 5.621.537-.278 1.24-.375 1.929-.311 1.804.167 3.226 1.648 3.226 3.489a3.5 3.5 0 01-3.5 3.5c-1.073 0-2.099-.49-2.748-1.179z\"/></svg>`;\n\ninterface ContextTagProps {\n context: UserContextItem;\n onRemove?: (id: string) => void;\n readOnly?: boolean;\n}\n\n/**\n * Get the icon for a context type\n */\nfunction getContextIcon(context: UserContextItem): string {\n if (isHighlightedTextContext(context)) {\n return QUOTE_ICON;\n }\n // Default icon for unknown types\n return QUOTE_ICON;\n}\n\n/**\n * Get tooltip text for a context item\n */\nfunction getContextTooltip(context: UserContextItem): string {\n if (isHighlightedTextContext(context)) {\n const source = context.url_origin ? `\\nFrom: ${context.url_origin}` : '';\n return `\"${context.text_content}\"${source}`;\n }\n return '';\n}\n\nexport function ContextTag({ context, onRemove, readOnly = false }: ContextTagProps) {\n const label = getContextDisplayLabel(context);\n const icon = getContextIcon(context);\n const tooltip = getContextTooltip(context);\n\n const handleRemove = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n onRemove?.(context.id);\n };\n\n return (\n <div\n class=\"_pillar-context-tag pillar-context-tag\"\n title={tooltip}\n >\n <span\n class=\"_pillar-context-tag-icon pillar-context-tag-icon\"\n dangerouslySetInnerHTML={{ __html: icon }}\n />\n <span class=\"_pillar-context-tag-label pillar-context-tag-label\">\n {label}\n </span>\n {!readOnly && onRemove && (\n <button\n class=\"_pillar-context-tag-remove pillar-context-tag-remove\"\n onClick={handleRemove}\n aria-label=\"Remove context\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: CLOSE_ICON }}\n />\n )}\n </div>\n );\n}\n\ninterface ContextTagListProps {\n contexts: UserContextItem[];\n onRemove?: (id: string) => void;\n readOnly?: boolean;\n}\n\nexport function ContextTagList({ contexts, onRemove, readOnly = false }: ContextTagListProps) {\n if (contexts.length === 0) {\n return null;\n }\n\n return (\n <div class=\"_pillar-context-tag-list pillar-context-tag-list\">\n {contexts.map((ctx) => (\n <ContextTag key={ctx.id} context={ctx} onRemove={onRemove} readOnly={readOnly} />\n ))}\n </div>\n );\n}\n","/**\n * Unified Chat Input Component\n * Reusable input with context tags and image upload support\n * Used across all views in the SDK\n */\n\nimport { useCallback, useRef, useState } from 'preact/hooks';\nimport {\n clearUserContext,\n removeUserContext,\n setPendingMessage,\n setPendingUserContext,\n userContext,\n pendingImages,\n isUploadingImages,\n addPendingImage,\n updateImageStatus,\n removePendingImage,\n clearPendingImages,\n getReadyImages,\n type PendingImage,\n type ChatImage,\n} from '../../store/chat';\nimport { navigateToChat } from '../../store/router';\nimport { ContextTagList } from './ContextTag';\nimport type { UserContextItem } from '../../types';\nimport { useAPI } from '../context';\n\n// Arrow up icon for send button\nconst SEND_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"/><polyline points=\"5 12 12 5 19 12\"/></svg>`;\n\n// Image icon for upload button\nconst IMAGE_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>`;\n\n// Close icon for image removal\nconst X_CLOSE_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\n\n// Max height for 6 lines\nconst MAX_INPUT_HEIGHT = 146;\n\ninterface UnifiedChatInputProps {\n /** Placeholder text for the input */\n placeholder?: string;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Custom submit handler - if provided, will be called instead of default navigation */\n onSubmit?: (message: string, context: UserContextItem[], images: ChatImage[]) => void;\n /** Whether to show context tags (default: true) */\n showContextTags?: boolean;\n /** Whether to show image upload button (default: true) */\n showImageUpload?: boolean;\n /** Additional CSS class for the wrapper */\n className?: string;\n}\n\nexport function UnifiedChatInput({\n placeholder = 'Ask anything...',\n disabled = false,\n onSubmit,\n showContextTags = true,\n showImageUpload = true,\n className = '',\n}: UnifiedChatInputProps) {\n const api = useAPI();\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [inputValue, setInputValue] = useState('');\n const [isDragging, setIsDragging] = useState(false);\n\n const resizeTextarea = useCallback(() => {\n const textarea = inputRef.current;\n if (!textarea) return;\n\n textarea.style.height = '41px';\n const scrollHeight = textarea.scrollHeight;\n\n if (scrollHeight > MAX_INPUT_HEIGHT) {\n textarea.style.height = `${MAX_INPUT_HEIGHT}px`;\n textarea.style.overflowY = 'auto';\n } else {\n textarea.style.height = `${scrollHeight}px`;\n textarea.style.overflowY = 'hidden';\n }\n }, []);\n\n // Upload a single image file\n const uploadImage = useCallback(async (file: File) => {\n if (pendingImages.value.length >= 4) return;\n\n const id = `img-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const preview = URL.createObjectURL(file);\n\n const pendingImage: PendingImage = {\n id,\n file,\n preview,\n status: 'uploading',\n };\n\n addPendingImage(pendingImage);\n\n try {\n const response = await api.uploadImage(file);\n updateImageStatus(id, 'ready', response.url);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Upload failed';\n updateImageStatus(id, 'error', undefined, errorMsg);\n }\n }, [api]);\n\n // Handle multiple image files\n const handleImageFiles = useCallback((files: FileList | File[]) => {\n const imageFiles = Array.from(files).filter(f => f.type.startsWith('image/'));\n const availableSlots = 4 - pendingImages.value.length;\n imageFiles.slice(0, availableSlots).forEach(uploadImage);\n }, [uploadImage]);\n\n // Handle paste event for images\n const handlePaste = useCallback((e: ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n\n const imageFiles: File[] = [];\n for (const item of items) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) imageFiles.push(file);\n }\n }\n\n if (imageFiles.length > 0) {\n e.preventDefault();\n handleImageFiles(imageFiles);\n }\n }, [handleImageFiles]);\n\n // Drag and drop handlers\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const files = e.dataTransfer?.files;\n if (files) {\n handleImageFiles(files);\n }\n }, [handleImageFiles]);\n\n // Handle file input change\n const handleFileSelect = useCallback((e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.files) {\n handleImageFiles(input.files);\n input.value = ''; // Reset for next selection\n }\n }, [handleImageFiles]);\n\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLTextAreaElement;\n setInputValue(target.value);\n resizeTextarea();\n };\n\n const handleSubmit = useCallback(() => {\n const trimmed = inputValue.trim();\n const currentContext = [...userContext.value];\n const currentImages = getReadyImages();\n const hasContext = currentContext.length > 0;\n const hasImages = currentImages.length > 0;\n\n // Require either text, context, or images to submit\n if (!trimmed && !hasContext && !hasImages) return;\n\n // Don't submit while images are uploading\n if (isUploadingImages.value) return;\n\n // Clear context and images now that we have copies\n if (hasContext) {\n clearUserContext();\n }\n clearPendingImages();\n\n if (onSubmit) {\n // Custom handler (e.g., ChatView sends directly)\n onSubmit(trimmed, currentContext, currentImages);\n } else {\n // Default: store message and pending context, then navigate to chat\n if (hasContext) {\n setPendingUserContext(currentContext);\n }\n setPendingMessage(trimmed);\n navigateToChat();\n }\n\n // Clear input\n setInputValue('');\n if (inputRef.current) {\n inputRef.current.style.height = '41px';\n inputRef.current.style.overflowY = 'hidden';\n }\n }, [inputValue, onSubmit]);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const isUploading = isUploadingImages.value;\n const canSubmit = inputValue.trim() || userContext.value.length > 0 || pendingImages.value.some(img => img.status === 'ready');\n\n const wrapperClass = `_pillar-unified-input-wrapper pillar-unified-input-wrapper ${isDragging ? '_pillar-unified-input-wrapper--dragging' : ''} ${className}`.trim();\n\n return (\n <div\n class={wrapperClass}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n\n {/* Pending images preview */}\n {pendingImages.value.length > 0 && (\n <div class=\"_pillar-chat-images-preview pillar-chat-images-preview\">\n {pendingImages.value.map((img) => (\n <div key={img.id} class=\"_pillar-chat-image-thumb pillar-chat-image-thumb\">\n <img src={img.preview} alt=\"Upload preview\" />\n {img.status === 'uploading' && (\n <div class=\"_pillar-chat-image-loading pillar-chat-image-loading\">\n <div class=\"_pillar-loading-spinner pillar-loading-spinner\" style={{ width: '16px', height: '16px' }} />\n </div>\n )}\n {img.status === 'error' && (\n <div class=\"_pillar-chat-image-error pillar-chat-image-error\" title={img.error}>!</div>\n )}\n <button\n type=\"button\"\n class=\"_pillar-chat-image-remove pillar-chat-image-remove\"\n onClick={() => removePendingImage(img.id)}\n aria-label=\"Remove image\"\n dangerouslySetInnerHTML={{ __html: X_CLOSE_ICON }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Context tags - below images */}\n {showContextTags && (\n <ContextTagList contexts={userContext.value} onRemove={removeUserContext} />\n )}\n\n <textarea\n ref={inputRef}\n class=\"_pillar-unified-input pillar-unified-input\"\n placeholder={isDragging ? 'Drop image here...' : placeholder}\n value={inputValue}\n onInput={handleInputChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n disabled={disabled}\n style={{ height: '41px' }}\n />\n\n <div class=\"_pillar-unified-input-row pillar-unified-input-row\">\n {/* Image upload button */}\n {showImageUpload && (\n <button\n type=\"button\"\n class=\"_pillar-chat-image-btn pillar-chat-image-btn\"\n onClick={openFilePicker}\n disabled={disabled || isUploading || pendingImages.value.length >= 4}\n aria-label=\"Attach image\"\n title=\"Attach image (max 4)\"\n dangerouslySetInnerHTML={{ __html: IMAGE_ICON }}\n />\n )}\n <button\n type=\"button\"\n class=\"_pillar-unified-send-btn pillar-unified-send-btn\"\n onClick={handleSubmit}\n disabled={disabled || isUploading || !canSubmit}\n aria-label=\"Send message\"\n dangerouslySetInnerHTML={{ __html: SEND_ICON }}\n />\n </div>\n\n {/* Drag overlay */}\n {isDragging && (\n <div class=\"_pillar-chat-drop-overlay pillar-chat-drop-overlay\">\n <span dangerouslySetInnerHTML={{ __html: IMAGE_ICON }} />\n <span>Drop image here</span>\n </div>\n )}\n </div>\n );\n}\n","/**\n * QuestionChip Component\n * Clickable chip for suggested questions\n */\n\nimport { h } from 'preact';\n\nexport interface QuestionChipProps {\n text: string;\n onClick: () => void;\n}\n\nexport function QuestionChip({ text, onClick }: QuestionChipProps) {\n return (\n <button\n type=\"button\"\n class=\"_pillar-question-chip pillar-question-chip\"\n onClick={onClick}\n >\n <span class=\"_pillar-question-chip-text pillar-question-chip-text\">\n {text}\n </span>\n <span class=\"_pillar-question-chip-arrow pillar-question-chip-arrow\">\n →\n </span>\n </button>\n );\n}\n\n/**\n * Skeleton placeholder for loading state\n */\nexport function QuestionChipSkeleton() {\n return (\n <div class=\"_pillar-question-chip-skeleton pillar-question-chip-skeleton\">\n <div class=\"_pillar-question-chip-skeleton-bar pillar-question-chip-skeleton-bar\" />\n </div>\n );\n}\n","/**\n * Home View Component\n * Default panel view with suggested questions and chat input\n */\n\nimport { useEffect, useState } from 'preact/hooks';\nimport type { SuggestedQuestion } from '../../api/client';\nimport { setPendingMessage } from '../../store/chat';\nimport { navigateToChat } from '../../store/router';\nimport { useAPI } from '../context';\nimport { UnifiedChatInput } from '../Panel/UnifiedChatInput';\nimport { QuestionChip, QuestionChipSkeleton } from '../shared';\n\nexport function HomeView() {\n const api = useAPI();\n const [questions, setQuestions] = useState<SuggestedQuestion[] | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n\n const loadQuestions = async () => {\n try {\n const data = await api.getSuggestedQuestions();\n if (mounted) {\n setQuestions(data);\n setLoading(false);\n }\n } catch (err) {\n if (mounted) {\n console.error('[Pillar] Failed to load suggested questions:', err);\n // On error, just show empty state - not critical\n setQuestions([]);\n setLoading(false);\n }\n }\n };\n\n loadQuestions();\n\n return () => {\n mounted = false;\n };\n }, [api]);\n\n const handleQuestionClick = (question: SuggestedQuestion) => {\n // Set the question as a pending message and navigate to chat\n setPendingMessage(question.text);\n navigateToChat();\n };\n\n return (\n <div class=\"_pillar-home-view pillar-home-view\">\n {/* Header */}\n <div class=\"_pillar-home-view-header pillar-home-view-header\">\n <div class=\"_pillar-home-view-icon\">💬</div>\n <h2 class=\"_pillar-home-view-title pillar-home-view-title\">\n How can I help?\n </h2>\n </div>\n\n {/* Suggested Questions */}\n <div class=\"_pillar-home-view-questions pillar-home-view-questions\">\n {loading ? (\n // Loading skeleton\n <>\n <QuestionChipSkeleton />\n <QuestionChipSkeleton />\n <QuestionChipSkeleton />\n </>\n ) : questions && questions.length > 0 ? (\n // Show questions\n questions.map((question) => (\n <QuestionChip\n key={question.id}\n text={question.text}\n onClick={() => handleQuestionClick(question)}\n />\n ))\n ) : null}\n </div>\n\n {/* Input Area - pushed to bottom with margin-top: auto */}\n <div style={{ marginTop: 'auto' }}>\n <UnifiedChatInput placeholder=\"Ask anything... (paste or drop images)\" />\n </div>\n </div>\n );\n}\n","/**\n * marked v17.0.1 - a markdown parser\n * Copyright (c) 2018-2025, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=L();function Z(u){T=u}var C={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var me=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceTabs:/^\\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,unescapeTest:/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\")},xe=/^(?:[ \\t]*(?:\\n|$))+/,be=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,I=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Te=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,N=/(?:[*+-]|\\d{1,9}[.)])/,re=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,se=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Oe=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),Q=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,we=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,ye=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Pe=k(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,N).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",j=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Se=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",j).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ie=k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),$e=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",ie).getRegex(),U={blockquote:$e,code:be,def:ye,fences:Re,heading:Te,hr:I,html:Se,lheading:se,list:Pe,newline:xe,paragraph:ie,table:C,text:we},te=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),_e={...U,lheading:Oe,table:te,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",te).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},Le={...U,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",j).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:C,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",se).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Me=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,oe=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,D=/[\\p{P}\\p{S}]/u,K=/[\\s\\p{P}\\p{S}]/u,ae=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,K).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Ie=/(?!~)[\\s\\p{P}\\p{S}]/u,Ee=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Be=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",me?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,qe=k(ue,\"u\").replace(/punct/g,D).getRegex(),ve=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",De=k(pe,\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),He=k(pe,\"gu\").replace(/notPunctSpace/g,Ee).replace(/punctSpace/g,Ie).replace(/punct/g,le).getRegex(),Ze=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),Ge=k(/\\\\(punct)/,\"gu\").replace(/punct/g,D).getRegex(),Ne=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Qe=k(j).replace(\"(?:-->|$)\",\"-->\").getRegex(),Fe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",Qe).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/,je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ue=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),ne=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,W={_backpedal:C,anyPunctuation:Ge,autolink:Ne,blockSkip:Be,br:oe,code:ze,del:C,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ze,escape:Me,link:je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ue,tag:Fe,text:Ae,url:C},Ke={...W,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},G={...W,emStrongRDelimAst:He,emStrongLDelim:ve,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ne).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ne).getRegex()},We={...G,br:k(oe).replace(\"{2,}\",\"*\").getRegex(),text:k(G.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},E={normal:U,gfm:_e,pedantic:Le},M={normal:W,gfm:G,breaks:We,pedantic:Ke};var Xe={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},ke=u=>Xe[u];function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function J(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function z(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:z(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=Je(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:z(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let g=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=g,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.blockquote(f);s[s.length-1]=O,r=r.substring(0,r.length-R.raw.length)+O.raw,i=i.substring(0,i.length-R.text.length)+O.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.list(f);s[s.length-1]=O,r=r.substring(0,r.length-h.raw.length)+O.raw,i=i.substring(0,i.length-R.raw.length)+O.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let g=t[2].split(`\n`,1)[0].replace(this.rules.other.listReplaceTabs,O=>\" \".repeat(3*O.length)),h=e.split(`\n`,1)[0],R=!g.trim(),f=0;if(this.options.pedantic?(f=2,c=g.trimStart()):R?f=t[1].length+1:(f=t[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=g.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let O=this.rules.other.nextBulletRegex(f),V=this.rules.other.hrRegex(f),Y=this.rules.other.fencesBeginRegex(f),ee=this.rules.other.headingBeginRegex(f),fe=this.rules.other.htmlBeginRegex(f);for(;e;){let H=e.split(`\n`,1)[0],A;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),Y.test(h)||ee.test(h)||fe.test(h)||O.test(h)||V.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||g.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Y.test(g)||ee.test(g)||V.test(g))break;c+=`\n`+h}!R&&!h.trim()&&(R=!0),p+=H+`\n`,e=e.substring(H.length+1),g=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(g=>g.type===\"space\"),c=p.length>0&&p.some(g=>this.rules.other.anyLine.test(g.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=J(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(J(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),ge(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return ge(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let g=[...r[0]][0].length,h=e.slice(0,s+r.index+g+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:\"del\",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:E.normal,inline:M.normal};this.options.pedantic?(t.block=E.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=E.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:E,inline:M}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),g;this.options.extensions.startInline.forEach(h=>{g=h.call({lexer:this},c),typeof g==\"number\"&&g>=0&&(p=Math.min(p,g))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var P=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+w(r)+'\">'+(n?i:w(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:w(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${w(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=X(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+w(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=X(e);if(i===null)return w(n);e=i;let s=`<img src=\"${e}\" alt=\"${n}\"`;return t&&(s+=` title=\"${w(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:w(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var S=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var B=class{defaults=L();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=$;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new S;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];S.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(s))return(async()=>{let g=await o.call(i,p);return l.call(i,g)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let g=await o.apply(i,p);return g===!1&&(g=await l.apply(i,p)),g})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+w(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var _=new B;function d(u,e){return _.parse(u,e)}d.options=d.setOptions=function(u){return _.setOptions(u),d.defaults=_.defaults,Z(d.defaults),d};d.getDefaults=L;d.defaults=T;d.use=function(...u){return _.use(...u),d.defaults=_.defaults,Z(d.defaults),d};d.walkTokens=function(u,e){return _.walkTokens(u,e)};d.parseInline=_.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=$;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=S;d.parse=d;var Dt=d.options,Ht=d.setOptions,Zt=d.use,Gt=d.walkTokens,Nt=d.parseInline,Qt=d,Ft=b.parse,jt=x.lex;export{S as Hooks,x as Lexer,B as Marked,b as Parser,P as Renderer,$ as TextRenderer,y as Tokenizer,T as defaults,L as getDefaults,jt as lexer,d as marked,Dt as options,Qt as parse,Nt as parseInline,Ft as parser,Ht as setOptions,Zt as use,Gt as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","/**\n * Markdown Renderer\n * Uses marked library for parsing markdown to HTML\n */\n\nimport { marked } from 'marked';\n\n// Configure marked for safe, minimal output\nmarked.setOptions({\n gfm: true, // GitHub Flavored Markdown\n breaks: true, // Convert \\n to <br>\n});\n\n/**\n * Render markdown content to HTML\n * Used for AI chat responses\n */\nexport function renderMarkdown(content: string): string {\n try {\n return marked.parse(content) as string;\n } catch (error) {\n console.error('[Pillar] Markdown parsing error:', error);\n // Fallback to escaped text\n return content\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\n/g, '<br>');\n }\n}\n\n","/**\n * TaskButton Component\n * \n * Renders a task action button in chat responses.\n * When clicked, triggers the task execution via the Pillar SDK.\n * \n * Presentation (label, icon) is derived from task name and type.\n * The server only sends: name, task_type, data.\n */\n\nimport Pillar from '../../core/Pillar';\nimport type { TaskExecutePayload } from '../../core/events';\n\n/**\n * Task data as received from the AI.\n * Simplified: server sends minimal data, SDK derives presentation.\n */\nexport interface TaskButtonData {\n /** Database UUID for the task (used for confirmation) */\n id?: string;\n /** Task unique identifier (e.g., 'invite_team_member') */\n name: string;\n /** Task type (navigate, trigger_action, etc.) */\n taskType?: TaskExecutePayload['taskType'];\n /** Data payload containing type-specific values */\n data?: Record<string, unknown>;\n /** If true, action executes immediately without user clicking */\n autoRun?: boolean;\n /** If true, action completes without waiting for host confirmation */\n autoComplete?: boolean;\n \n // Legacy fields (may still be sent by older responses)\n /** @deprecated SDK now derives label from name */\n label?: string;\n /** @deprecated SDK now derives icon from taskType */\n icon?: string;\n /** @deprecated Use default variant */\n buttonVariant?: 'default' | 'primary' | 'secondary' | 'outline' | 'ghost';\n /** @deprecated Included in data.path */\n path?: string;\n /** @deprecated Included in data.url */\n externalUrl?: string;\n}\n\ninterface TaskButtonProps {\n task: TaskButtonData;\n onExecute?: () => void;\n}\n\n/**\n * Default icons for each task type.\n */\nconst TASK_TYPE_ICONS: Record<string, string> = {\n navigate: 'arrow-right',\n open_modal: 'layout',\n fill_form: 'edit',\n trigger_action: 'zap',\n copy_text: 'copy',\n external_link: 'external-link',\n start_tutorial: 'play-circle',\n};\n\n/**\n * SVG icons for common task icons.\n */\nconst ICONS: Record<string, string> = {\n 'arrow-right': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12,5 19,12 12,19\"/></svg>`,\n 'user-plus': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"8.5\" cy=\"7\" r=\"4\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\"/><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"/></svg>`,\n 'settings': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"/></svg>`,\n 'external-link': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15,3 21,3 21,9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>`,\n 'play-circle': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polygon points=\"10,8 16,12 10,16 10,8\"/></svg>`,\n 'zap': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"13,2 3,14 12,14 11,22 21,10 12,10 13,2\"/></svg>`,\n 'message-circle': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"/></svg>`,\n 'download': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7,10 12,15 17,10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>`,\n 'copy': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>`,\n 'layout': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/></svg>`,\n 'edit': `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n};\n\n/**\n * Derive a human-readable label from a task name.\n * Converts snake_case to Title Case.\n * \n * Examples:\n * 'invite_team_member' -> 'Invite Team Member'\n * 'open_settings' -> 'Open Settings'\n */\nfunction deriveLabel(name: string): string {\n return name\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Get the default icon for a task type.\n */\nfunction getDefaultIcon(taskType?: string): string {\n if (!taskType) return 'zap';\n return TASK_TYPE_ICONS[taskType] || 'zap';\n}\n\n/**\n * Get the button class based on variant.\n */\nfunction getButtonClass(variant: string = 'primary'): string {\n const baseClass = 'pillar-task-btn';\n return `${baseClass} pillar-task-btn--${variant}`;\n}\n\n/**\n * Create a TaskButton element.\n * \n * Presentation is derived:\n * - Label: from task.label (legacy) or derived from task.name\n * - Icon: from task.icon (legacy) or derived from task.taskType\n */\nexport function createTaskButton(props: TaskButtonProps): HTMLButtonElement {\n const { task, onExecute } = props;\n \n const button = document.createElement('button');\n button.className = getButtonClass(task.buttonVariant || 'primary');\n button.type = 'button';\n\n // Derive icon - use explicit icon if provided, otherwise derive from taskType\n const iconName = task.icon || getDefaultIcon(task.taskType);\n if (iconName && ICONS[iconName]) {\n const iconSpan = document.createElement('span');\n iconSpan.className = 'pillar-task-btn__icon';\n iconSpan.innerHTML = ICONS[iconName];\n button.appendChild(iconSpan);\n }\n\n // Derive label - use explicit label if provided, otherwise derive from name\n const label = task.label || deriveLabel(task.name);\n const labelSpan = document.createElement('span');\n labelSpan.className = 'pillar-task-btn__label';\n labelSpan.textContent = label;\n button.appendChild(labelSpan);\n\n // Add click handler\n button.addEventListener('click', () => {\n const pillar = Pillar.getInstance();\n if (pillar) {\n // Build the data payload\n const data = task.data || {};\n \n // Extract path/url from data if not at top level (new format)\n const path = task.path || (data.path as string | undefined);\n const externalUrl = task.externalUrl || (data.url as string | undefined);\n \n const payload: TaskExecutePayload = {\n id: task.id,\n name: task.name,\n data: data,\n taskType: task.taskType,\n path: path,\n externalUrl: externalUrl,\n };\n pillar.executeTask(payload);\n }\n onExecute?.();\n });\n\n return button;\n}\n\n/**\n * Create a container with multiple task buttons.\n */\nexport function createTaskButtonGroup(tasks: TaskButtonData[]): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'pillar-task-btn-group';\n\n tasks.forEach((task) => {\n const button = createTaskButton({ task });\n container.appendChild(button);\n });\n\n return container;\n}\n\n/**\n * CSS styles for TaskButton (to be added to PANEL_STYLES).\n */\nexport const TASK_BUTTON_STYLES = `\n/* Task Button Component */\n.pillar-task-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n text-decoration: none;\n}\n\n.pillar-task-btn__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pillar-task-btn__icon svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-task-btn__label {\n white-space: nowrap;\n}\n\n/* Primary variant (default) */\n.pillar-task-btn--primary {\n background: #2563eb;\n color: #ffffff;\n border-color: #2563eb;\n}\n\n.pillar-task-btn--primary:hover {\n background: #1d4ed8;\n border-color: #1d4ed8;\n}\n\n/* Default variant */\n.pillar-task-btn--default {\n background: #f3f4f6;\n color: #1a1a1a;\n border-color: #e5e7eb;\n}\n\n.pillar-task-btn--default:hover {\n background: #e5e7eb;\n}\n\n/* Secondary variant */\n.pillar-task-btn--secondary {\n background: #eff6ff;\n color: #2563eb;\n border-color: #dbeafe;\n}\n\n.pillar-task-btn--secondary:hover {\n background: #dbeafe;\n}\n\n/* Outline variant */\n.pillar-task-btn--outline {\n background: transparent;\n color: #2563eb;\n border-color: #2563eb;\n}\n\n.pillar-task-btn--outline:hover {\n background: #eff6ff;\n}\n\n/* Ghost variant */\n.pillar-task-btn--ghost {\n background: transparent;\n color: #6b7280;\n border-color: transparent;\n}\n\n.pillar-task-btn--ghost:hover {\n background: #f3f4f6;\n color: #1a1a1a;\n}\n\n/* Task button group */\n.pillar-task-btn-group {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n\n/* Task suggestion card in chat */\n.pillar-task-suggestion {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n margin-top: 12px;\n}\n\n.pillar-task-suggestion__header {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #6b7280;\n}\n\n.pillar-task-suggestion__header svg {\n width: 14px;\n height: 14px;\n}\n\n.pillar-task-suggestion__description {\n font-size: 13px;\n color: #374151;\n}\n`;\n","/**\n * Chat View Component\n * Standalone full-screen chat view (used when starting chat from home/categories)\n */\n\nimport { useCallback, useEffect, useRef } from 'preact/hooks';\nimport type { ArticleSummary } from '../../api/client';\nimport Pillar from '../../core/Pillar';\nimport type { ExecutionPlan } from '../../core/plan';\nimport {\n addAssistantMessage,\n addUserMessage,\n clearPendingMessage,\n clearPendingUserContext,\n clearProgressStatus,\n conversationId,\n isLoading,\n messages,\n pendingMessage,\n pendingUserContext,\n progressStatus,\n setActionComplete,\n setActionPending,\n setConversationId,\n setLoading,\n setMessageFeedback,\n setProgressStatus,\n updateActionMessageContent,\n updateLastAssistantMessage,\n type ChatImage,\n} from '../../store/chat';\nimport { hasActivePlan } from '../../store/plan';\nimport { goHome } from '../../store/router';\nimport type { UserContextItem } from '../../types/user-context';\nimport { renderMarkdown } from '../../utils/markdown';\nimport type { ProgressEvent } from '../../api/client';\nimport { createConfirmActionCard } from '../Cards/ConfirmActionCard';\nimport { useAPI } from '../context';\nimport { ContextTagList } from '../Panel/ContextTag';\nimport { createTaskButtonGroup, type TaskButtonData } from '../Panel/TaskButton';\nimport { UnifiedChatInput } from '../Panel/UnifiedChatInput';\nimport { PlanView } from '../Plan/PlanView';\n\nconst NEW_CHAT_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`;\n\nconst THUMBS_UP_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"/></svg>`;\n\nconst THUMBS_DOWN_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"/></svg>`;\n\n// Action status icons\nconst CHECK_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>`;\nconst X_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\nconst SPINNER_ICON = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" opacity=\"0.3\"/><path d=\"M12 2v4\"/></svg>`;\n\n/**\n * Generate completion text from action name and success status\n */\nfunction getCompletionText(actionName: string, success: boolean): string {\n const name = actionName.replace(/_/g, ' ').toLowerCase();\n \n if (!success) {\n return `Failed to ${name}`;\n }\n \n // Transform \"open_settings\" -> \"Opened settings\"\n if (name.startsWith('open ')) {\n return `Opened ${name.slice(5)}`;\n }\n if (name.startsWith('go to ')) {\n return `Navigated to ${name.slice(6)}`;\n }\n if (name.startsWith('navigate to ')) {\n return `Navigated to ${name.slice(12)}`;\n }\n // Fallback\n return 'Done!';\n}\n\nexport function ChatView() {\n const api = useAPI();\n const messagesRef = useRef<HTMLDivElement>(null);\n const hasProcessedPending = useRef(false);\n\n // Process pending message on mount\n useEffect(() => {\n if (hasProcessedPending.current) return;\n\n const pending = pendingMessage.value;\n const pendingContext = pendingUserContext.value;\n if (pending) {\n hasProcessedPending.current = true;\n clearPendingMessage();\n clearPendingUserContext();\n sendMessage(pending, pendingContext.length > 0 ? pendingContext : undefined);\n }\n }, []);\n\n // Scroll to bottom when messages change\n useEffect(() => {\n if (messagesRef.current) {\n messagesRef.current.scrollTop = messagesRef.current.scrollHeight;\n }\n }, [messages.value]);\n\n // Listen for task completion events to update action status\n useEffect(() => {\n const pillar = Pillar.getInstance();\n if (!pillar) return;\n \n const unsubscribe = pillar.on('task:complete', ({ name, success }) => {\n // Update action status\n setActionComplete(name, success);\n \n // Update message content with completion text\n const completionText = getCompletionText(name, success);\n updateActionMessageContent(name, completionText);\n });\n \n return unsubscribe;\n }, []);\n\n /**\n * Handle plan received from AI streaming response.\n * Passes the plan to PlanExecutor for orchestration.\n */\n const handlePlanReceived = useCallback((plan: ExecutionPlan) => {\n console.log('[Pillar] Plan received:', plan.id, plan.goal);\n const pillar = Pillar.getInstance();\n if (pillar) {\n pillar.handlePlanReceived(plan);\n }\n }, []);\n\n /**\n * Handle actions received from the AI.\n * Auto-executes actions with autoRun=true, returns buttons for the rest.\n * \n * UX Design:\n * - If there's an auto-run action, execute it and DON'T show alternative buttons\n * (user asked for something specific, we're handling it)\n * - If no auto-run actions, return all as clickable buttons\n * \n * @returns The actions to be stored with the message (manual actions only, or all if no Pillar instance)\n */\n const handleActionsReceived = useCallback((actions: TaskButtonData[]): TaskButtonData[] => {\n const pillar = Pillar.getInstance();\n \n console.log('[Pillar] handleActionsReceived called with', actions.length, 'actions');\n console.log('[Pillar] Actions detail:', actions.map(a => ({ name: a.name, autoRun: a.autoRun })));\n \n // Separate auto-run actions from manual actions\n const autoRunActions = actions.filter(a => a.autoRun === true);\n const manualActions = actions.filter(a => !a.autoRun);\n \n console.log('[Pillar] Auto-run actions:', autoRunActions.length, ', Manual actions:', manualActions.length);\n \n // Execute auto-run actions immediately\n if (pillar && autoRunActions.length > 0) {\n console.log('[Pillar] Executing auto-run actions...');\n autoRunActions.forEach(action => {\n const data = action.data || {};\n const path = (data.path as string | undefined);\n const externalUrl = (data.url as string | undefined);\n \n // Mark action as pending before execution\n const messageIndex = messages.value.length - 1;\n if (messageIndex >= 0) {\n setActionPending(messageIndex, action.name);\n }\n \n console.log('[Pillar] Executing action:', action.name);\n pillar.executeTask({\n id: action.id,\n name: action.name,\n taskType: action.taskType,\n data: data,\n path: path,\n externalUrl: externalUrl,\n });\n });\n \n // When auto-running, don't show alternative buttons - we're already handling the request\n // This prevents confusing UX where buttons appear briefly before navigation\n return [];\n } else if (!pillar) {\n console.warn('[Pillar] No Pillar instance available for auto-run');\n // Return all as buttons since we can't execute\n return actions;\n } else {\n // No auto-run actions - return all as clickable buttons\n return manualActions;\n }\n }, []);\n\n const sendMessage = useCallback(async (message: string, userContext?: UserContextItem[], images?: ChatImage[]) => {\n // Add user message with context and images\n addUserMessage(message, userContext, images);\n\n // Show loading state\n setLoading(true);\n\n // Add placeholder assistant message\n addAssistantMessage('');\n\n try {\n let fullResponse = '';\n let receivedActions: TaskButtonData[] = [];\n const history = messages.value.slice(0, -1); // Exclude the empty assistant message\n\n // No article context in standalone chat view\n const response = await api.chat(\n message,\n history,\n // Streaming callback\n (chunk) => {\n fullResponse += chunk;\n updateLastAssistantMessage(fullResponse);\n },\n undefined, // No article slug\n conversationId.value, // Pass existing conversation ID if available\n // Actions callback - handle auto-run actions\n (actions) => {\n receivedActions = handleActionsReceived(actions);\n },\n // Plan callback - handle multi-step plans\n handlePlanReceived,\n // User context (highlighted text, etc.)\n userContext,\n // Images\n images,\n // Progress callback - show what AI is doing\n (progress: ProgressEvent) => {\n setProgressStatus({\n kind: progress.kind,\n message: progress.message,\n });\n }\n );\n\n // Collect final actions (from streaming callback or response)\n let finalActions = receivedActions;\n if (response.actions && response.actions.length > 0) {\n finalActions = handleActionsReceived(response.actions);\n }\n\n // Update with final response, message ID, actions, and sources\n updateLastAssistantMessage(\n response.message,\n response.messageId,\n finalActions,\n response.sources\n );\n \n // Store conversation ID for subsequent messages\n if (response.conversationId) {\n setConversationId(response.conversationId);\n }\n } catch (error) {\n console.error('[Pillar] Chat error:', error);\n updateLastAssistantMessage('Sorry, I encountered an error. Please try again.');\n } finally {\n setLoading(false);\n clearProgressStatus();\n }\n }, [api, handleActionsReceived]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(async (messageId: string, feedback: 'up' | 'down') => {\n // Update local state immediately for responsive UI\n setMessageFeedback(messageId, feedback);\n \n // Submit feedback to server (fire-and-forget)\n await api.submitFeedback(messageId, feedback);\n }, [api]);\n\n // Handle submit from UnifiedChatInput\n const handleInputSubmit = useCallback((message: string, context: UserContextItem[], images: ChatImage[]) => {\n if (isLoading.value) return;\n \n // Context and images are passed directly from UnifiedChatInput (already cleared there)\n sendMessage(\n message,\n context.length > 0 ? context : undefined,\n images.length > 0 ? images : undefined\n );\n }, [sendMessage]);\n\n // Sources are displayed but not clickable (article views have been removed)\n // TODO: Consider linking sources to external URLs if available\n\n // Create refs map for action containers per message\n const actionContainerRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n // Effect to render action buttons and confirm cards when messages change\n useEffect(() => {\n const pillar = Pillar.getInstance();\n \n messages.value.forEach((msg, index) => {\n if (msg.role === 'assistant' && msg.actions && msg.actions.length > 0) {\n const container = actionContainerRefs.current.get(index);\n if (container && container.children.length === 0) {\n // Separate inline_ui cards from regular buttons\n const confirmActions = msg.actions.filter(a => a.taskType === 'inline_ui');\n const buttonActions = msg.actions.filter(a => a.taskType !== 'inline_ui');\n \n // Render confirm action cards first\n confirmActions.forEach((action) => {\n const card = createConfirmActionCard(\n action,\n // onConfirm callback\n (data) => {\n if (pillar) {\n // Emit task execution event\n pillar.executeTask({\n id: action.id,\n name: action.name,\n taskType: action.taskType,\n data: data || action.data || {},\n });\n }\n },\n // onCancel callback\n () => {\n console.log('[Pillar] Confirm action cancelled:', action.name);\n }\n );\n container.appendChild(card);\n });\n \n // Then render regular buttons\n if (buttonActions.length > 0) {\n const buttonGroup = createTaskButtonGroup(buttonActions);\n container.appendChild(buttonGroup);\n }\n }\n }\n });\n }, [messages.value]);\n\n return (\n <div class=\"_pillar-chat-view pillar-chat-view\">\n {/* Messages area - takes full height */}\n <div class=\"_pillar-chat-view-messages pillar-chat-view-messages\" ref={messagesRef}>\n {messages.value.length === 0 && (\n <div class=\"_pillar-chat-view-welcome pillar-chat-view-welcome\">\n <div class=\"_pillar-chat-view-welcome-icon pillar-chat-view-welcome-icon\">💬</div>\n <div class=\"_pillar-chat-view-welcome-title pillar-chat-view-welcome-title\">Ask a question</div>\n <div class=\"_pillar-chat-view-welcome-text pillar-chat-view-welcome-text\">\n Ask me anything about how to use this product.\n </div>\n </div>\n )}\n\n {messages.value.map((msg, index) => (\n <div\n key={index}\n class={`_pillar-chat-view-message pillar-chat-view-message _pillar-chat-view-message--${msg.role} pillar-chat-view-message--${msg.role}`}\n >\n {msg.role === 'user' ? (\n <div class=\"_pillar-message-user pillar-message-user\">\n {msg.userContext && msg.userContext.length > 0 && (\n <ContextTagList contexts={msg.userContext} readOnly />\n )}\n {/* Display attached images */}\n {msg.images && msg.images.length > 0 && (\n <div class=\"_pillar-message-user-images pillar-message-user-images\">\n {msg.images.map((img, imgIndex) => (\n <img\n key={imgIndex}\n src={img.url}\n alt={`Attachment ${imgIndex + 1}`}\n class=\"_pillar-message-user-image pillar-message-user-image\"\n />\n ))}\n </div>\n )}\n {msg.content}\n </div>\n ) : (\n <div class=\"_pillar-message-assistant-wrapper pillar-message-assistant-wrapper\">\n <div class=\"_pillar-message-assistant-content pillar-message-assistant-content\">\n {msg.content ? (\n <div\n class=\"_pillar-message-assistant pillar-message-assistant\"\n dangerouslySetInnerHTML={{\n __html: renderMarkdown(msg.content),\n }}\n />\n ) : (\n <div class=\"_pillar-progress-indicator pillar-progress-indicator\">\n <div class=\"_pillar-loading-spinner pillar-loading-spinner\" />\n <span class=\"_pillar-progress-message pillar-progress-message\">\n {progressStatus.value.message || 'Thinking...'}\n </span>\n </div>\n )}\n {/* Action status indicator */}\n {msg.actionStatus && Object.keys(msg.actionStatus).length > 0 && (\n <span class=\"_pillar-action-status pillar-action-status\">\n {Object.entries(msg.actionStatus).map(([actionName, status]) => (\n <span\n key={actionName}\n class={`_pillar-action-status-indicator pillar-action-status-indicator _pillar-action-status-indicator--${status.status} pillar-action-status-indicator--${status.status}`}\n title={status.status === 'failed' ? status.errorMessage : actionName}\n dangerouslySetInnerHTML={{\n __html: status.status === 'success' ? CHECK_ICON :\n status.status === 'failed' ? X_ICON :\n SPINNER_ICON\n }}\n />\n ))}\n </span>\n )}\n </div>\n {/* Feedback icons - only show for completed assistant messages with an ID */}\n {msg.id && msg.content && (\n <div class=\"_pillar-feedback-icons pillar-feedback-icons\">\n <button\n class={`_pillar-feedback-btn pillar-feedback-btn ${msg.feedback === 'up' ? '_pillar-feedback-btn--active pillar-feedback-btn--active' : ''}`}\n onClick={() => handleFeedback(msg.id!, 'up')}\n aria-label=\"Helpful\"\n title=\"Helpful\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: THUMBS_UP_ICON }}\n />\n <button\n class={`_pillar-feedback-btn pillar-feedback-btn ${msg.feedback === 'down' ? '_pillar-feedback-btn--active pillar-feedback-btn--active' : ''}`}\n onClick={() => handleFeedback(msg.id!, 'down')}\n aria-label=\"Not helpful\"\n title=\"Not helpful\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: THUMBS_DOWN_ICON }}\n />\n </div>\n )}\n\n {/* Sources for this message */}\n {msg.sources && msg.sources.length > 0 && (\n <div class=\"_pillar-chat-sources pillar-chat-sources\">\n <div class=\"_pillar-chat-sources-title pillar-chat-sources-title\">Sources</div>\n {msg.sources.map((source) => (\n <div\n key={source.slug}\n class=\"_pillar-chat-source pillar-chat-source\"\n >\n {source.title}\n </div>\n ))}\n </div>\n )}\n\n {/* Action buttons for this message */}\n {msg.actions && msg.actions.length > 0 && (\n <div class=\"_pillar-chat-actions pillar-chat-actions\">\n <div class=\"_pillar-chat-actions-title pillar-chat-actions-title\">Suggested actions</div>\n <div\n ref={(el) => {\n if (el) actionContainerRefs.current.set(index, el);\n }}\n class=\"_pillar-chat-actions-buttons pillar-chat-actions-buttons\"\n />\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n\n {/* Active execution plan - rendered as a to-do list */}\n {hasActivePlan.value && <PlanView />}\n </div>\n\n {/* Input area */}\n <div class=\"_pillar-chat-view-input-area pillar-chat-view-input-area\">\n <UnifiedChatInput\n placeholder=\"Ask a question... (paste or drop images)\"\n disabled={isLoading.value}\n onSubmit={handleInputSubmit}\n />\n {/* New chat button - only show when there are messages */}\n {messages.value.length > 0 && (\n <div class=\"_pillar-chat-view-input-footer pillar-chat-view-input-footer\">\n <button\n class=\"_pillar-chat-view-new-chat-btn pillar-chat-view-new-chat-btn\"\n onClick={goHome}\n type=\"button\"\n >\n <span class=\"_pillar-chat-view-new-chat-icon\" dangerouslySetInnerHTML={{ __html: NEW_CHAT_ICON }} />\n New chat\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n","/**\n * Panel Content Component\n * Main panel layout with header, content, and chat input\n */\n\nimport { h } from 'preact';\nimport { currentView, type ViewType } from '../../store/router';\nimport { activeTab } from '../../store/panel';\nimport { Header } from './Header';\nimport { UnifiedChatInput } from './UnifiedChatInput';\nimport { HomeView, ChatView } from '../Views';\n\nexport function PanelContent() {\n const view = currentView.value;\n const currentTab = activeTab.value;\n\n // Determine custom title for header\n const customTitle = (() => {\n // For non-assistant tabs, show the tab name\n if (currentTab !== 'assistant') {\n return currentTab.charAt(0).toUpperCase() + currentTab.slice(1);\n }\n return undefined;\n })();\n\n // Check if we're in a chat view (chat views have their own input)\n // Also check if we're on home view (home view has its own input)\n const isChatView = view.type === 'chat';\n const isHomeView = view.type === 'home';\n\n // Render content for non-assistant tabs\n const renderTabContent = () => {\n switch (currentTab) {\n case 'support':\n return (\n <div style={{ padding: '24px', textAlign: 'center' }}>\n <h2 style={{ fontSize: '18px', fontWeight: '600', marginBottom: '8px' }}>Hello World</h2>\n <p style={{ color: 'var(--pillar-text-muted)', fontSize: '14px' }}>\n Support tab content goes here.\n </p>\n </div>\n );\n default:\n return null;\n }\n };\n\n // Render the appropriate assistant view\n const renderAssistantView = () => {\n switch (view.type) {\n case 'home':\n return <HomeView />;\n case 'chat':\n return <ChatView />;\n default:\n return <HomeView />;\n }\n };\n\n // For non-assistant tabs, show the tab content\n if (currentTab !== 'assistant') {\n return (\n <div class=\"_pillar-panel-ui pillar-panel-ui\">\n <Header currentView=\"home\" customTitle={customTitle} />\n <div class=\"_pillar-content pillar-content\">{renderTabContent()}</div>\n </div>\n );\n }\n\n // Assistant tab - show normal views with chat input\n return (\n <div class=\"_pillar-panel-ui pillar-panel-ui\">\n <Header\n currentView={view.type as ViewType}\n customTitle={customTitle}\n hideNavigation={isChatView}\n />\n <div class=\"_pillar-content pillar-content\">{renderAssistantView()}</div>\n {!isChatView && !isHomeView && (\n <div class=\"_pillar-chat-input-area pillar-chat-input-area\">\n <UnifiedChatInput placeholder=\"Ask a question...\" />\n </div>\n )}\n </div>\n );\n}\n","/**\n * Panel CSS Styles\n * Complete styling for the help panel (injected into Shadow DOM)\n * \n * Class naming convention:\n * - Internal classes (_pillar-*): Apply all default styles\n * - Public classes (pillar-*): Empty by default, for user overrides\n * \n * Each element renders both classes, e.g.: class=\"_pillar-header pillar-header\"\n */\n\nimport type { ResolvedThemeConfig, ThemeColors } from '../../core/config';\n\n/**\n * Generate CSS variable overrides from theme colors\n */\nexport function generateThemeVariables(colors: ThemeColors, prefix = ''): string {\n const lines: string[] = [];\n \n if (colors.primary) lines.push(`--pillar-primary${prefix}: ${colors.primary};`);\n if (colors.primaryHover) lines.push(`--pillar-primary-hover${prefix}: ${colors.primaryHover};`);\n if (colors.background) lines.push(`--pillar-bg${prefix}: ${colors.background};`);\n if (colors.backgroundSecondary) lines.push(`--pillar-bg-secondary${prefix}: ${colors.backgroundSecondary};`);\n if (colors.text) lines.push(`--pillar-text${prefix}: ${colors.text};`);\n if (colors.textMuted) lines.push(`--pillar-text-muted${prefix}: ${colors.textMuted};`);\n if (colors.border) lines.push(`--pillar-border${prefix}: ${colors.border};`);\n if (colors.borderLight) lines.push(`--pillar-border-light${prefix}: ${colors.borderLight};`);\n \n return lines.join('\\n ');\n}\n\n/**\n * Generate custom theme CSS from config\n */\nexport function generateThemeCSS(theme: ResolvedThemeConfig): string {\n const lightOverrides = generateThemeVariables(theme.colors);\n const darkOverrides = generateThemeVariables(theme.darkColors);\n \n let css = '';\n \n // Light mode overrides\n if (lightOverrides) {\n css += `\n:host {\n ${lightOverrides}\n}\n`;\n }\n \n // Dark mode overrides - apply when in dark mode (either manual or auto)\n if (darkOverrides) {\n css += `\n@media (prefers-color-scheme: dark) {\n :host:not([data-theme=\"light\"]) {\n ${darkOverrides}\n }\n}\n:host([data-theme=\"dark\"]) {\n ${darkOverrides}\n}\n`;\n }\n \n return css;\n}\n\nexport const PANEL_STYLES = `\n/* ============================================================================\n CSS Custom Properties (Variables)\n Users can override these to customize colors\n ============================================================================ */\n\n:host {\n /* Core colors - Light mode (default) */\n --pillar-primary: #2563eb;\n --pillar-primary-hover: #1d4ed8;\n --pillar-primary-light: #eff6ff;\n --pillar-primary-light-hover: #dbeafe;\n \n --pillar-bg: #ffffff;\n --pillar-bg-secondary: #f9fafb;\n --pillar-bg-tertiary: #f3f4f6;\n \n --pillar-text: #1a1a1a;\n --pillar-text-secondary: #374151;\n --pillar-text-muted: #6b7280;\n --pillar-text-placeholder: #9ca3af;\n \n --pillar-border: #e5e7eb;\n --pillar-border-light: #f3f4f6;\n \n /* Shadows */\n --pillar-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\n --pillar-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n \n /* Code blocks */\n --pillar-code-bg: #1f2937;\n --pillar-code-text: #e5e7eb;\n \n /* Scrollbar */\n --pillar-scrollbar-track: transparent;\n --pillar-scrollbar-thumb: #d1d5db;\n --pillar-scrollbar-thumb-hover: #9ca3af;\n \n /* Spacing (can be customized) */\n --pillar-panel-width: 380px;\n --pillar-spacing-xs: 4px;\n --pillar-spacing-sm: 8px;\n --pillar-spacing-md: 12px;\n --pillar-spacing-lg: 16px;\n --pillar-spacing-xl: 20px;\n --pillar-spacing-2xl: 24px;\n \n /* Border radius */\n --pillar-radius-sm: 4px;\n --pillar-radius-md: 6px;\n --pillar-radius-lg: 8px;\n --pillar-radius-xl: 10px;\n --pillar-radius-full: 9999px;\n \n /* Typography */\n --pillar-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n --pillar-font-mono: 'SF Mono', Consolas, monospace;\n --pillar-font-size-xs: 11px;\n --pillar-font-size-sm: 12px;\n --pillar-font-size-base: 14px;\n --pillar-font-size-md: 15px;\n --pillar-font-size-lg: 16px;\n --pillar-font-size-xl: 18px;\n --pillar-font-size-2xl: 20px;\n \n /* Animation */\n --pillar-transition-fast: 0.15s ease;\n --pillar-transition-normal: 0.3s ease;\n}\n\n/* Dark mode - Auto-detect from system preference */\n@media (prefers-color-scheme: dark) {\n :host:not([data-theme=\"light\"]) {\n --pillar-primary: #3b82f6;\n --pillar-primary-hover: #60a5fa;\n --pillar-primary-light: #1e3a5f;\n --pillar-primary-light-hover: #1e4976;\n \n --pillar-bg: #1a1a1a;\n --pillar-bg-secondary: #262626;\n --pillar-bg-tertiary: #333333;\n \n --pillar-text: #f5f5f5;\n --pillar-text-secondary: #e5e5e5;\n --pillar-text-muted: #a3a3a3;\n --pillar-text-placeholder: #737373;\n \n --pillar-border: #404040;\n --pillar-border-light: #333333;\n \n --pillar-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);\n --pillar-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);\n \n --pillar-code-bg: #0d0d0d;\n --pillar-code-text: #e5e7eb;\n \n --pillar-scrollbar-thumb: #525252;\n --pillar-scrollbar-thumb-hover: #737373;\n }\n}\n\n/* Dark mode - Manual override */\n:host([data-theme=\"dark\"]) {\n --pillar-primary: #3b82f6;\n --pillar-primary-hover: #60a5fa;\n --pillar-primary-light: #1e3a5f;\n --pillar-primary-light-hover: #1e4976;\n \n --pillar-bg: #1a1a1a;\n --pillar-bg-secondary: #262626;\n --pillar-bg-tertiary: #333333;\n \n --pillar-text: #f5f5f5;\n --pillar-text-secondary: #e5e5e5;\n --pillar-text-muted: #a3a3a3;\n --pillar-text-placeholder: #737373;\n \n --pillar-border: #404040;\n --pillar-border-light: #333333;\n \n --pillar-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);\n --pillar-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);\n \n --pillar-code-bg: #0d0d0d;\n --pillar-code-text: #e5e7eb;\n \n --pillar-scrollbar-thumb: #525252;\n --pillar-scrollbar-thumb-hover: #737373;\n}\n\n/* ============================================================================\n Base Styles\n Note: No CSS reset - we rely on explicit styles for SDK components\n and allow custom cards to inherit host app styling (Tailwind, etc.)\n ============================================================================ */\n\n:host {\n font-family: var(--pillar-font-family);\n font-size: var(--pillar-font-size-base);\n line-height: 1.5;\n color: var(--pillar-text);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n/* ============================================================================\n Panel Container\n Internal: _pillar-panel | Public: pillar-panel\n ============================================================================ */\n\n._pillar-panel {\n position: fixed;\n top: 0;\n bottom: 0;\n width: var(--pillar-panel-width);\n max-width: 100vw;\n background: var(--pillar-bg);\n border-left: 1px solid var(--pillar-border);\n display: flex;\n flex-direction: column;\n z-index: 99999;\n transform: translateX(100%);\n transition: transform var(--pillar-transition-normal);\n}\n\n._pillar-panel--right {\n right: 0;\n}\n\n._pillar-panel--left {\n left: 0;\n border-left: none;\n border-right: 1px solid var(--pillar-border);\n transform: translateX(-100%);\n}\n\n._pillar-panel--open {\n transform: translateX(0);\n}\n\n._pillar-panel--manual {\n position: static;\n transform: none;\n height: 100%;\n}\n\n._pillar-panel-root {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n._pillar-panel-ui {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n/* Public override classes - empty by default */\n.pillar-panel {}\n.pillar-panel-root {}\n.pillar-panel-ui {}\n\n/* ============================================================================\n Backdrop\n ============================================================================ */\n\n._pillar-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.3);\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--pillar-transition-normal), visibility var(--pillar-transition-normal);\n z-index: 99998;\n}\n\n._pillar-backdrop--visible {\n opacity: 1;\n visibility: visible;\n}\n\n.pillar-backdrop {}\n\n/* ============================================================================\n Header\n Internal: _pillar-header | Public: pillar-header\n ============================================================================ */\n\n._pillar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--pillar-spacing-lg) var(--pillar-spacing-xl);\n border-bottom: 1px solid var(--pillar-border);\n flex-shrink: 0;\n background: var(--pillar-bg);\n}\n\n._pillar-header-left {\n display: flex;\n align-items: center;\n gap: var(--pillar-spacing-sm);\n}\n\n._pillar-header-title {\n font-size: var(--pillar-font-size-lg);\n font-weight: 600;\n color: var(--pillar-text);\n}\n\n/* Public override classes */\n.pillar-header {}\n.pillar-header-left {}\n.pillar-header-title {}\n\n/* ============================================================================\n Icon Buttons (back, home, close)\n Internal: _pillar-icon-btn | Public: pillar-icon-btn\n ============================================================================ */\n\n._pillar-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n color: var(--pillar-text-muted);\n background: none;\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n transition: color var(--pillar-transition-fast), background var(--pillar-transition-fast);\n}\n\n._pillar-icon-btn:hover {\n color: var(--pillar-text);\n background: var(--pillar-bg-tertiary);\n}\n\n._pillar-icon-btn svg {\n width: 20px;\n height: 20px;\n}\n\n.pillar-icon-btn {}\n.pillar-back-btn {}\n.pillar-home-btn {}\n.pillar-close-btn {}\n\n/* ============================================================================\n Content Area\n Internal: _pillar-content | Public: pillar-content\n ============================================================================ */\n\n._pillar-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n.pillar-content {}\n\n/* ============================================================================\n Search Input\n Internal: _pillar-search | Public: pillar-search\n ============================================================================ */\n\n._pillar-search {\n position: relative;\n padding: var(--pillar-spacing-lg) var(--pillar-spacing-xl);\n}\n\n._pillar-search-input {\n width: 100%;\n padding: 10px 12px 10px 40px;\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n color: var(--pillar-text);\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-lg);\n outline: none;\n transition: border-color var(--pillar-transition-fast), box-shadow var(--pillar-transition-fast);\n}\n\n._pillar-search-input:focus {\n border-color: var(--pillar-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n._pillar-search-input::placeholder {\n color: var(--pillar-text-placeholder);\n}\n\n._pillar-search-icon {\n position: absolute;\n left: 32px;\n top: 50%;\n transform: translateY(-50%);\n width: 18px;\n height: 18px;\n color: var(--pillar-text-placeholder);\n pointer-events: none;\n}\n\n._pillar-search-icon svg {\n width: 18px;\n height: 18px;\n}\n\n.pillar-search {}\n.pillar-search-input {}\n.pillar-search-icon {}\n\n/* ============================================================================\n Chat Input (Persistent Bottom)\n Internal: _pillar-chat-input | Public: pillar-chat-input\n ============================================================================ */\n\n._pillar-chat-input-container {\n flex-shrink: 0;\n border-top: 1px solid var(--pillar-border);\n background: var(--pillar-bg);\n display: flex;\n flex-direction: column;\n max-height: 50%;\n transition: max-height var(--pillar-transition-normal);\n}\n\n._pillar-chat-input-container--expanded {\n max-height: 60%;\n}\n\n._pillar-chat-input-messages {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n max-height: 0;\n transition: max-height var(--pillar-transition-normal), padding var(--pillar-transition-normal);\n}\n\n._pillar-chat-input-container--expanded ._pillar-chat-input-messages {\n max-height: 300px;\n padding: var(--pillar-spacing-lg) var(--pillar-spacing-xl);\n}\n\n._pillar-chat-input-message {\n margin-bottom: var(--pillar-spacing-md);\n}\n\n._pillar-chat-input-message--user {\n text-align: right;\n}\n\n._pillar-chat-input-message-content {\n display: inline-block;\n max-width: 85%;\n padding: 10px 14px;\n border-radius: var(--pillar-spacing-lg);\n font-size: var(--pillar-font-size-base);\n line-height: 1.5;\n}\n\n._pillar-chat-input-message--user ._pillar-chat-input-message-content {\n background: var(--pillar-primary);\n color: #ffffff;\n border-bottom-right-radius: var(--pillar-radius-sm);\n}\n\n._pillar-chat-input-message--assistant ._pillar-chat-input-message-content {\n background: var(--pillar-bg-tertiary);\n color: var(--pillar-text);\n border-bottom-left-radius: var(--pillar-radius-sm);\n}\n\n._pillar-chat-input-sources {\n margin-top: var(--pillar-spacing-sm);\n padding-top: var(--pillar-spacing-sm);\n border-top: 1px solid var(--pillar-border);\n}\n\n._pillar-chat-input-sources-title {\n font-size: var(--pillar-font-size-xs);\n font-weight: 500;\n color: var(--pillar-text-muted);\n margin-bottom: 6px;\n}\n\n._pillar-chat-input-source {\n display: block;\n padding: 6px 10px;\n margin-bottom: var(--pillar-spacing-xs);\n font-size: var(--pillar-font-size-sm);\n color: var(--pillar-primary);\n background: var(--pillar-primary-light);\n border-radius: var(--pillar-radius-md);\n text-decoration: none;\n cursor: pointer;\n}\n\n._pillar-chat-input-source:hover {\n background: var(--pillar-primary-light-hover);\n}\n\n._pillar-chat-input-area {\n padding: var(--pillar-spacing-md) var(--pillar-spacing-lg);\n}\n\n._pillar-chat-input-wrapper {\n display: flex;\n flex-direction: column;\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-xl);\n transition: border-color var(--pillar-transition-fast), box-shadow var(--pillar-transition-fast);\n}\n\n._pillar-chat-input-wrapper:focus-within {\n border-color: var(--pillar-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n._pillar-chat-input-textarea {\n display: block;\n width: 100%;\n padding: 12px 14px 8px;\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n line-height: 1.5;\n color: var(--pillar-text);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n overflow-y: hidden;\n box-sizing: border-box;\n}\n\n._pillar-chat-input-textarea::placeholder {\n color: var(--pillar-text-placeholder);\n}\n\n.pillar-chat-input-container {}\n.pillar-chat-input-messages {}\n.pillar-chat-input-message {}\n.pillar-chat-input-message-content {}\n.pillar-chat-input-sources {}\n.pillar-chat-input-area {}\n.pillar-chat-input-wrapper {}\n.pillar-chat-input-textarea {}\n\n/* ============================================================================\n Chat Input Footer (contains send button)\n ============================================================================ */\n\n._pillar-chat-input-footer {\n display: flex;\n justify-content: flex-end;\n padding: 8px 10px;\n}\n\n/* ============================================================================\n Send Button - In footer row, right aligned\n Internal: _pillar-send-btn | Public: pillar-send-btn\n ============================================================================ */\n\n._pillar-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--pillar-text-muted);\n background: var(--pillar-bg-tertiary);\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n flex-shrink: 0;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-send-btn:hover:not(:disabled) {\n color: #ffffff;\n background: var(--pillar-primary);\n}\n\n._pillar-send-btn:disabled {\n color: var(--pillar-text-placeholder);\n background: var(--pillar-bg-tertiary);\n cursor: not-allowed;\n}\n\n._pillar-send-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-send-btn {}\n.pillar-chat-input-footer {}\n\n/* ============================================================================\n Loading States\n Internal: _pillar-loading | Public: pillar-loading\n ============================================================================ */\n\n._pillar-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px var(--pillar-spacing-xl);\n color: var(--pillar-text-muted);\n}\n\n._pillar-loading-spinner {\n width: 24px;\n height: 24px;\n border: 2px solid var(--pillar-border);\n border-top-color: var(--pillar-primary);\n border-radius: 50%;\n animation: pillar-spin 0.8s linear infinite;\n}\n\n@keyframes pillar-spin {\n to { transform: rotate(360deg); }\n}\n\n.pillar-loading {}\n.pillar-loading-spinner {}\n\n/* ============================================================================\n Progress Indicator (AI activity status)\n Internal: _pillar-progress | Public: pillar-progress\n ============================================================================ */\n\n._pillar-progress-indicator {\n display: flex;\n align-items: center;\n gap: var(--pillar-spacing-sm);\n padding: var(--pillar-spacing-sm) 0;\n}\n\n._pillar-progress-indicator ._pillar-loading-spinner {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n._pillar-progress-message {\n font-size: var(--pillar-font-size-sm);\n color: var(--pillar-text-muted);\n font-style: italic;\n}\n\n.pillar-progress-indicator {}\n.pillar-progress-message {}\n\n/* ============================================================================\n Empty States\n Internal: _pillar-empty | Public: pillar-empty\n ============================================================================ */\n\n._pillar-empty {\n padding: 40px var(--pillar-spacing-xl);\n text-align: center;\n color: var(--pillar-text-muted);\n}\n\n._pillar-empty-icon {\n width: 48px;\n height: 48px;\n margin: 0 auto var(--pillar-spacing-lg);\n color: var(--pillar-border);\n}\n\n._pillar-empty-title {\n font-size: var(--pillar-font-size-lg);\n font-weight: 500;\n color: var(--pillar-text);\n margin-bottom: var(--pillar-spacing-xs);\n}\n\n._pillar-empty-description {\n font-size: var(--pillar-font-size-base);\n}\n\n.pillar-empty {}\n.pillar-empty-icon {}\n.pillar-empty-title {}\n.pillar-empty-description {}\n\n/* ============================================================================\n Section Titles\n Internal: _pillar-section-title | Public: pillar-section-title\n ============================================================================ */\n\n._pillar-section-title {\n padding: var(--pillar-spacing-md) var(--pillar-spacing-xl) var(--pillar-spacing-sm);\n font-size: var(--pillar-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--pillar-text-muted);\n}\n\n.pillar-section-title {}\n\n/* ============================================================================\n Related Articles\n ============================================================================ */\n\n._pillar-related-articles {\n border-top: 1px solid var(--pillar-border);\n margin-top: var(--pillar-spacing-2xl);\n padding-top: var(--pillar-spacing-sm);\n}\n\n.pillar-related-articles {}\n\n/* ============================================================================\n Scrollbar Styling\n ============================================================================ */\n\n._pillar-content::-webkit-scrollbar,\n._pillar-chat-input-messages::-webkit-scrollbar {\n width: 6px;\n}\n\n._pillar-content::-webkit-scrollbar-track,\n._pillar-chat-input-messages::-webkit-scrollbar-track {\n background: var(--pillar-scrollbar-track);\n}\n\n._pillar-content::-webkit-scrollbar-thumb,\n._pillar-chat-input-messages::-webkit-scrollbar-thumb {\n background: var(--pillar-scrollbar-thumb);\n border-radius: 3px;\n}\n\n._pillar-content::-webkit-scrollbar-thumb:hover,\n._pillar-chat-input-messages::-webkit-scrollbar-thumb:hover {\n background: var(--pillar-scrollbar-thumb-hover);\n}\n\n/* ============================================================================\n Home View\n ============================================================================ */\n\n._pillar-home-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: var(--pillar-spacing-xl);\n}\n\n._pillar-home-view-header {\n text-align: center;\n padding: var(--pillar-spacing-2xl) 0;\n}\n\n._pillar-home-view-icon {\n font-size: 40px;\n margin-bottom: var(--pillar-spacing-md);\n}\n\n._pillar-home-view-title {\n font-size: var(--pillar-font-size-xl);\n font-weight: 600;\n color: var(--pillar-text);\n margin: 0;\n}\n\n._pillar-home-view-questions {\n display: flex;\n flex-direction: column;\n gap: var(--pillar-spacing-sm);\n margin-bottom: var(--pillar-spacing-xl);\n}\n\n._pillar-home-view-input-wrapper {\n margin-top: auto;\n display: flex;\n flex-direction: column;\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-xl);\n transition: border-color var(--pillar-transition-fast), box-shadow var(--pillar-transition-fast);\n}\n\n._pillar-home-view-input-wrapper:focus-within {\n border-color: var(--pillar-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n._pillar-home-view-input {\n display: block;\n width: 100%;\n padding: 12px 14px 8px;\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n line-height: 1.5;\n color: var(--pillar-text);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n overflow-y: hidden;\n box-sizing: border-box;\n}\n\n._pillar-home-view-input::placeholder {\n color: var(--pillar-text-placeholder);\n}\n\n._pillar-home-view-input-row {\n display: flex;\n justify-content: flex-end;\n padding: 8px 10px;\n}\n\n._pillar-home-view-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--pillar-text-muted);\n background: var(--pillar-bg-tertiary);\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n flex-shrink: 0;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-home-view-send-btn:hover:not(:disabled) {\n color: #ffffff;\n background: var(--pillar-primary);\n}\n\n._pillar-home-view-send-btn:disabled {\n color: var(--pillar-text-placeholder);\n background: var(--pillar-bg-tertiary);\n cursor: not-allowed;\n}\n\n._pillar-home-view-send-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-home-view {}\n.pillar-home-view-header {}\n.pillar-home-view-title {}\n.pillar-home-view-questions {}\n.pillar-home-view-input-wrapper {}\n.pillar-home-view-input {}\n.pillar-home-view-send-btn {}\n\n/* ============================================================================\n Question Chip\n ============================================================================ */\n\n._pillar-question-chip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--pillar-spacing-md) var(--pillar-spacing-lg);\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n text-align: left;\n color: var(--pillar-text);\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-lg);\n cursor: pointer;\n transition: background var(--pillar-transition-fast), border-color var(--pillar-transition-fast);\n}\n\n._pillar-question-chip:hover {\n border-color: var(--pillar-primary);\n}\n\n._pillar-question-chip-text {\n flex: 1;\n}\n\n._pillar-question-chip-arrow {\n color: var(--pillar-text-muted);\n margin-left: var(--pillar-spacing-sm);\n transition: color var(--pillar-transition-fast), transform var(--pillar-transition-fast);\n}\n\n._pillar-question-chip:hover ._pillar-question-chip-arrow {\n color: var(--pillar-primary);\n transform: translateX(2px);\n}\n\n._pillar-question-chip-skeleton {\n height: 44px;\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-lg);\n overflow: hidden;\n}\n\n._pillar-question-chip-skeleton-bar {\n width: 60%;\n height: 14px;\n margin: 15px var(--pillar-spacing-lg);\n background: linear-gradient(90deg, var(--pillar-border) 25%, var(--pillar-bg-tertiary) 50%, var(--pillar-border) 75%);\n background-size: 200% 100%;\n animation: pillar-shimmer 1.5s infinite;\n border-radius: var(--pillar-radius-sm);\n}\n\n@keyframes pillar-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n}\n\n.pillar-question-chip {}\n.pillar-question-chip-text {}\n.pillar-question-chip-arrow {}\n.pillar-question-chip-skeleton {}\n.pillar-question-chip-skeleton-bar {}\n\n/* ============================================================================\n Standalone Chat View\n Internal: _pillar-chat-view | Public: pillar-chat-view\n ============================================================================ */\n\n._pillar-chat-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n._pillar-chat-view-messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--pillar-spacing-xl);\n display: flex;\n flex-direction: column;\n}\n\n._pillar-chat-view-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px var(--pillar-spacing-xl);\n text-align: center;\n flex: 1;\n}\n\n._pillar-chat-view-welcome-icon {\n font-size: 48px;\n margin-bottom: var(--pillar-spacing-lg);\n}\n\n._pillar-chat-view-welcome-title {\n font-size: var(--pillar-font-size-xl);\n font-weight: 600;\n color: var(--pillar-text);\n margin-bottom: var(--pillar-spacing-sm);\n}\n\n._pillar-chat-view-welcome-text {\n font-size: var(--pillar-font-size-base);\n color: var(--pillar-text-muted);\n max-width: 280px;\n}\n\n._pillar-chat-view-message {\n margin-bottom: var(--pillar-spacing-lg);\n}\n\n._pillar-chat-view-message--user {\n text-align: right;\n}\n\n._pillar-chat-view-message--assistant {\n text-align: left;\n}\n\n.pillar-chat-view {}\n.pillar-chat-view-messages {}\n.pillar-chat-view-welcome {}\n.pillar-chat-view-message {}\n\n/* ============================================================================\n User Message Bubble\n Internal: _pillar-message-user | Public: pillar-message-user\n ============================================================================ */\n\n._pillar-message-user {\n display: inline-block;\n max-width: 85%;\n padding: 10px 14px;\n border-radius: var(--pillar-spacing-lg);\n border-bottom-right-radius: var(--pillar-radius-sm);\n font-size: var(--pillar-font-size-base);\n line-height: 1.5;\n background: var(--pillar-primary);\n color: #ffffff;\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n._pillar-message-user-images {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: var(--pillar-spacing-sm);\n}\n\n._pillar-message-user-image {\n max-width: 120px;\n max-height: 120px;\n border-radius: var(--pillar-radius-md);\n object-fit: cover;\n}\n\n.pillar-message-user {}\n.pillar-message-user-images {}\n.pillar-message-user-image {}\n\n/* ============================================================================\n AI Response\n Internal: _pillar-message-assistant | Public: pillar-message-assistant\n ============================================================================ */\n\n._pillar-message-assistant {\n font-size: var(--pillar-font-size-base);\n line-height: 1.6;\n color: var(--pillar-text-secondary);\n}\n\n._pillar-message-assistant p {\n margin: 0 0 var(--pillar-spacing-md);\n}\n\n._pillar-message-assistant p:last-child {\n margin-bottom: 0;\n}\n\n._pillar-message-assistant h2 {\n font-size: var(--pillar-font-size-lg);\n font-weight: 600;\n color: var(--pillar-text);\n margin: var(--pillar-spacing-lg) 0 var(--pillar-spacing-sm);\n}\n\n._pillar-message-assistant h3 {\n font-size: var(--pillar-font-size-md);\n font-weight: 600;\n color: var(--pillar-text);\n margin: 14px 0 6px;\n}\n\n._pillar-message-assistant h4 {\n font-size: var(--pillar-font-size-base);\n font-weight: 600;\n color: var(--pillar-text);\n margin: var(--pillar-spacing-md) 0 6px;\n}\n\n._pillar-message-assistant ul,\n._pillar-message-assistant ol {\n margin: 0 0 var(--pillar-spacing-md);\n padding-left: var(--pillar-spacing-2xl);\n list-style-position: outside;\n}\n\n._pillar-message-assistant ul {\n list-style-type: disc;\n}\n\n._pillar-message-assistant ol {\n list-style-type: decimal;\n}\n\n._pillar-message-assistant li {\n margin-bottom: var(--pillar-spacing-xs);\n}\n\n._pillar-message-assistant code {\n padding: 2px 6px;\n font-size: var(--pillar-font-size-sm);\n background: var(--pillar-bg-tertiary);\n border-radius: var(--pillar-radius-sm);\n font-family: var(--pillar-font-mono);\n color: var(--pillar-text);\n}\n\n._pillar-message-assistant pre {\n margin: var(--pillar-spacing-md) 0;\n padding: var(--pillar-spacing-md) 14px;\n background: var(--pillar-code-bg);\n border-radius: var(--pillar-radius-lg);\n overflow-x: auto;\n}\n\n._pillar-message-assistant pre code {\n padding: 0;\n background: none;\n color: var(--pillar-code-text);\n font-size: var(--pillar-font-size-sm);\n line-height: 1.5;\n}\n\n._pillar-message-assistant a {\n color: var(--pillar-primary);\n text-decoration: none;\n}\n\n._pillar-message-assistant a:hover {\n text-decoration: underline;\n}\n\n._pillar-message-assistant strong {\n font-weight: 600;\n color: var(--pillar-text);\n}\n\n._pillar-message-assistant em {\n font-style: italic;\n}\n\n.pillar-message-assistant {}\n\n/* ============================================================================\n Chat Sources\n Internal: _pillar-chat-sources | Public: pillar-chat-sources\n ============================================================================ */\n\n._pillar-chat-sources {\n margin-top: var(--pillar-spacing-md);\n padding-top: var(--pillar-spacing-md);\n border-top: 1px solid var(--pillar-border);\n}\n\n._pillar-chat-sources-title {\n font-size: var(--pillar-font-size-xs);\n font-weight: 500;\n color: var(--pillar-text-muted);\n margin-bottom: var(--pillar-spacing-sm);\n}\n\n._pillar-chat-source {\n display: block;\n padding: var(--pillar-spacing-sm) var(--pillar-spacing-md);\n margin-bottom: 6px;\n font-size: var(--pillar-font-size-sm);\n color: var(--pillar-primary);\n background: var(--pillar-primary-light);\n border-radius: var(--pillar-radius-lg);\n text-decoration: none;\n cursor: pointer;\n transition: background var(--pillar-transition-fast);\n}\n\n._pillar-chat-source:hover {\n background: var(--pillar-primary-light-hover);\n}\n\n.pillar-chat-sources {}\n.pillar-chat-sources-title {}\n.pillar-chat-source {}\n\n/* ============================================================================\n Chat Actions (Suggested action buttons)\n Internal: _pillar-chat-actions | Public: pillar-chat-actions\n ============================================================================ */\n\n._pillar-chat-actions {\n margin-top: var(--pillar-spacing-md);\n padding-top: var(--pillar-spacing-md);\n border-top: 1px solid var(--pillar-border);\n}\n\n._pillar-chat-actions-title {\n font-size: var(--pillar-font-size-xs);\n font-weight: 500;\n color: var(--pillar-text-muted);\n margin-bottom: var(--pillar-spacing-sm);\n}\n\n._pillar-chat-actions-buttons {\n display: flex;\n flex-direction: column;\n gap: var(--pillar-spacing-sm);\n}\n\n/* Task buttons should wrap horizontally */\n._pillar-chat-actions-buttons > ._pillar-task-button-group {\n display: flex;\n flex-wrap: wrap;\n gap: var(--pillar-spacing-sm);\n}\n\n/* Confirm cards take full width */\n._pillar-chat-actions-buttons > .pillar-confirm-card-wrapper {\n width: 100%;\n}\n\n.pillar-chat-actions {}\n.pillar-chat-actions-title {}\n.pillar-chat-actions-buttons {}\n\n/* ============================================================================\n Chat View Input Area - Cursor-style design\n ============================================================================ */\n\n._pillar-chat-view-input-area {\n flex-shrink: 0;\n padding: var(--pillar-spacing-md) var(--pillar-spacing-lg);\n border-top: 1px solid var(--pillar-border);\n background: var(--pillar-bg);\n}\n\n._pillar-chat-view-input-wrapper {\n display: flex;\n flex-direction: column;\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-xl);\n transition: border-color var(--pillar-transition-fast), box-shadow var(--pillar-transition-fast);\n}\n\n._pillar-chat-view-input-wrapper:focus-within {\n border-color: var(--pillar-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n._pillar-chat-view-input {\n display: block;\n width: 100%;\n padding: 12px 14px 8px;\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n line-height: 1.5;\n color: var(--pillar-text);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n overflow-y: hidden;\n box-sizing: border-box;\n}\n\n._pillar-chat-view-input::placeholder {\n color: var(--pillar-text-placeholder);\n}\n\n._pillar-chat-view-input-row {\n display: flex;\n justify-content: flex-end;\n padding: 8px 10px;\n}\n\n._pillar-chat-view-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--pillar-text-muted);\n background: var(--pillar-bg-tertiary);\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n flex-shrink: 0;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-chat-view-send-btn:hover:not(:disabled) {\n color: #ffffff;\n background: var(--pillar-primary);\n}\n\n._pillar-chat-view-send-btn:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n._pillar-chat-view-send-btn:disabled {\n color: var(--pillar-text-placeholder);\n background: var(--pillar-bg-tertiary);\n cursor: not-allowed;\n}\n\n._pillar-chat-view-send-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-chat-view-input-area {}\n.pillar-chat-view-input-wrapper {}\n.pillar-chat-view-input {}\n.pillar-chat-view-send-btn {}\n.pillar-chat-view-input-footer {}\n.pillar-chat-view-new-chat-btn {}\n\n/* New chat button styling */\n._pillar-chat-view-input-footer {\n display: flex;\n justify-content: center;\n margin-top: var(--pillar-spacing-sm);\n}\n\n._pillar-chat-view-new-chat-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: var(--pillar-font-size-sm);\n font-weight: 500;\n font-family: var(--pillar-font-family);\n color: var(--pillar-text-muted);\n background: transparent;\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-lg);\n cursor: pointer;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-chat-view-new-chat-btn:hover {\n color: var(--pillar-text);\n background: var(--pillar-bg-secondary);\n border-color: var(--pillar-text-muted);\n}\n\n._pillar-chat-view-new-chat-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._pillar-chat-view-new-chat-icon svg {\n width: 14px;\n height: 14px;\n}\n\n/* Scrollbar for chat view */\n._pillar-chat-view-messages::-webkit-scrollbar {\n width: 6px;\n}\n\n._pillar-chat-view-messages::-webkit-scrollbar-track {\n background: var(--pillar-scrollbar-track);\n}\n\n._pillar-chat-view-messages::-webkit-scrollbar-thumb {\n background: var(--pillar-scrollbar-thumb);\n border-radius: 3px;\n}\n\n._pillar-chat-view-messages::-webkit-scrollbar-thumb:hover {\n background: var(--pillar-scrollbar-thumb-hover);\n}\n\n/* ============================================================================\n Chat Image Upload\n ============================================================================ */\n\n._pillar-chat-view-input-area--dragging {\n position: relative;\n background: rgba(37, 99, 235, 0.05);\n}\n\n._pillar-chat-drop-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n background: rgba(37, 99, 235, 0.1);\n border: 2px dashed var(--pillar-primary);\n border-radius: var(--pillar-radius-lg);\n color: var(--pillar-primary);\n font-size: var(--pillar-font-size-sm);\n font-weight: 500;\n z-index: 10;\n pointer-events: none;\n}\n\n._pillar-chat-drop-overlay svg {\n width: 24px;\n height: 24px;\n}\n\n._pillar-chat-images-preview {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 12px 4px 12px;\n}\n\n._pillar-chat-image-thumb {\n position: relative;\n width: 56px;\n height: 56px;\n border-radius: var(--pillar-radius-md);\n overflow: hidden;\n border: 1px solid var(--pillar-border);\n}\n\n._pillar-chat-image-thumb img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n._pillar-chat-image-loading {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._pillar-chat-image-error {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(239, 68, 68, 0.3);\n color: #dc2626;\n font-weight: bold;\n font-size: 14px;\n}\n\n._pillar-chat-image-remove {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 18px;\n height: 18px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.6);\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--pillar-transition-fast);\n}\n\n._pillar-chat-image-thumb:hover ._pillar-chat-image-remove {\n opacity: 1;\n}\n\n._pillar-chat-image-remove svg {\n width: 10px;\n height: 10px;\n}\n\n._pillar-chat-image-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n padding: 0;\n color: var(--pillar-text-muted);\n background: transparent;\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n transition: color var(--pillar-transition-fast);\n}\n\n._pillar-chat-image-btn:hover:not(:disabled) {\n color: var(--pillar-text);\n}\n\n._pillar-chat-image-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n._pillar-chat-image-btn svg {\n width: 18px;\n height: 18px;\n}\n\n.pillar-chat-images-preview {}\n.pillar-chat-image-thumb {}\n.pillar-chat-image-remove {}\n.pillar-chat-image-btn {}\n.pillar-chat-drop-overlay {}\n\n/* ============================================================================\n Legacy Class Mappings (for backward compatibility)\n Maps old BEM-style class names to new internal classes\n ============================================================================ */\n\n.pillar-panel { }\n.pillar-panel--right { }\n.pillar-panel--left { }\n.pillar-panel--open { }\n.pillar-panel--manual { }\n.pillar-panel-root { }\n.pillar-panel-ui { }\n.pillar-panel__header { }\n.pillar-panel__header-left { }\n.pillar-panel__back-btn { }\n.pillar-panel__home-btn { }\n.pillar-panel__title { }\n.pillar-panel__close-btn { }\n.pillar-panel__content { }\n.pillar-search { }\n.pillar-search__input { }\n.pillar-search__icon { }\n.pillar-category-card { }\n.pillar-category-card__icon { }\n.pillar-category-card__content { }\n.pillar-category-card__title { }\n.pillar-category-card__description { }\n.pillar-category-card__count { }\n.pillar-article-card { }\n.pillar-article-card__title { }\n.pillar-article-card__excerpt { }\n.pillar-article-card__meta { }\n.pillar-article { }\n.pillar-article__title { }\n.pillar-article__content { }\n.pillar-category-header { }\n.pillar-category-header__title { }\n.pillar-category-header__description { }\n.pillar-chat-input-container { }\n.pillar-chat-input-container--expanded { }\n.pillar-chat-input__messages { }\n.pillar-chat-input__message { }\n.pillar-chat-input__message--user { }\n.pillar-chat-input__message--assistant { }\n.pillar-chat-input__message-content { }\n.pillar-chat-input__sources { }\n.pillar-chat-input__sources-title { }\n.pillar-chat-input__source { }\n.pillar-chat-input__area { }\n.pillar-chat-input__wrapper { }\n.pillar-chat-input__input { }\n.pillar-chat-input__send-btn { }\n.pillar-loading { }\n.pillar-loading__spinner { }\n.pillar-empty { }\n.pillar-empty__icon { }\n.pillar-empty__title { }\n.pillar-empty__description { }\n.pillar-section-title { }\n.pillar-related-articles { }\n.pillar-home-view { }\n.pillar-chat-view { }\n.pillar-chat-view__messages { }\n.pillar-chat-view__welcome { }\n.pillar-chat-view__welcome-icon { }\n.pillar-chat-view__welcome-title { }\n.pillar-chat-view__welcome-text { }\n.pillar-chat-view__message { }\n.pillar-chat-view__message--user { }\n.pillar-chat-view__message--assistant { }\n.pillar-chat-view__user-bubble { }\n.pillar-chat-view__ai-response { }\n.pillar-chat-view__sources { }\n.pillar-chat-view__sources-title { }\n.pillar-chat-view__source { }\n.pillar-chat-view__input-area { }\n.pillar-chat-view__input-wrapper { }\n.pillar-chat-view__input { }\n.pillar-chat-view__send-btn { }\n.pillar-backdrop { }\n.pillar-backdrop--visible { }\n\n/* ============================================================================\n Task Button Component\n ============================================================================ */\n\n.pillar-task-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 13px;\n font-weight: 500;\n font-family: inherit;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n text-decoration: none;\n}\n\n.pillar-task-btn__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.pillar-task-btn__icon svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-task-btn__label {\n white-space: nowrap;\n}\n\n/* Primary variant (default) */\n.pillar-task-btn--primary {\n background: #2563eb;\n color: #ffffff;\n border-color: #2563eb;\n}\n\n.pillar-task-btn--primary:hover {\n background: #1d4ed8;\n border-color: #1d4ed8;\n}\n\n/* Default variant */\n.pillar-task-btn--default {\n background: #f3f4f6;\n color: #1a1a1a;\n border-color: #e5e7eb;\n}\n\n.pillar-task-btn--default:hover {\n background: #e5e7eb;\n}\n\n/* Secondary variant */\n.pillar-task-btn--secondary {\n background: #eff6ff;\n color: #2563eb;\n border-color: #dbeafe;\n}\n\n.pillar-task-btn--secondary:hover {\n background: #dbeafe;\n}\n\n/* Outline variant */\n.pillar-task-btn--outline {\n background: transparent;\n color: #2563eb;\n border-color: #2563eb;\n}\n\n.pillar-task-btn--outline:hover {\n background: #eff6ff;\n}\n\n/* Ghost variant */\n.pillar-task-btn--ghost {\n background: transparent;\n color: #6b7280;\n border-color: transparent;\n}\n\n.pillar-task-btn--ghost:hover {\n background: #f3f4f6;\n color: #1a1a1a;\n}\n\n/* Task button group */\n.pillar-task-btn-group {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n\n/* Task suggestion card in chat */\n.pillar-task-suggestion {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n margin-top: 12px;\n}\n\n.pillar-task-suggestion__header {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #6b7280;\n}\n\n.pillar-task-suggestion__header svg {\n width: 14px;\n height: 14px;\n}\n\n.pillar-task-suggestion__description {\n font-size: 13px;\n color: #374151;\n}\n\n/* ============================================================================\n Feedback Icons\n Internal: _pillar-feedback | Public: pillar-feedback\n ============================================================================ */\n\n._pillar-message-assistant-wrapper {\n position: relative;\n}\n\n._pillar-feedback-icons {\n display: flex;\n gap: 4px;\n margin-top: var(--pillar-spacing-sm);\n justify-content: flex-end;\n}\n\n._pillar-feedback-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: transparent;\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n color: var(--pillar-text-placeholder);\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-feedback-btn:hover {\n color: var(--pillar-text-muted);\n background: var(--pillar-bg-secondary);\n border-color: var(--pillar-border);\n}\n\n._pillar-feedback-btn--active {\n color: var(--pillar-primary);\n background: var(--pillar-primary-light);\n border-color: var(--pillar-primary);\n}\n\n._pillar-feedback-btn--active:hover {\n color: var(--pillar-primary);\n background: var(--pillar-primary-light-hover);\n}\n\n._pillar-feedback-btn svg {\n width: 14px;\n height: 14px;\n}\n\n.pillar-feedback-icons {}\n.pillar-feedback-btn {}\n.pillar-message-assistant-wrapper {}\n\n/* ============================================================================\n Action Status Indicators\n Internal: _pillar-action-status | Public: pillar-action-status\n Shows completion status for auto-run actions (checkmark, X, or spinner)\n ============================================================================ */\n\n._pillar-message-assistant-content {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n._pillar-action-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n._pillar-action-status-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n}\n\n._pillar-action-status-indicator svg {\n width: 16px;\n height: 16px;\n}\n\n._pillar-action-status-indicator--success {\n color: #22c55e;\n}\n\n._pillar-action-status-indicator--failed {\n color: #ef4444;\n}\n\n._pillar-action-status-indicator--pending {\n color: var(--pillar-text-muted);\n animation: pillar-spin 1s linear infinite;\n}\n\n@keyframes pillar-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.pillar-action-status {}\n.pillar-action-status-indicator {}\n.pillar-message-assistant-content {}\n\n/* ============================================================================\n Context Tags\n Internal: _pillar-context-tag | Public: pillar-context-tag\n Removable chips for user context items (highlighted text, etc.)\n ============================================================================ */\n\n._pillar-context-tag-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 14px 0;\n}\n\n._pillar-context-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 200px;\n padding: 4px 6px 4px 8px;\n font-size: var(--pillar-font-size-sm);\n color: var(--pillar-text-secondary);\n background: var(--pillar-bg-tertiary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-md);\n cursor: default;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-context-tag:hover {\n background: var(--pillar-bg-secondary);\n border-color: var(--pillar-text-muted);\n}\n\n._pillar-context-tag-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n flex-shrink: 0;\n color: var(--pillar-primary);\n}\n\n._pillar-context-tag-icon svg {\n width: 12px;\n height: 12px;\n}\n\n._pillar-context-tag-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.3;\n}\n\n._pillar-context-tag-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n margin-left: 2px;\n color: var(--pillar-text-placeholder);\n background: transparent;\n border: none;\n border-radius: var(--pillar-radius-sm);\n cursor: pointer;\n flex-shrink: 0;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-context-tag-remove:hover {\n color: var(--pillar-text);\n background: var(--pillar-border);\n}\n\n._pillar-context-tag-remove svg {\n width: 12px;\n height: 12px;\n}\n\n.pillar-context-tag-list {}\n.pillar-context-tag {}\n.pillar-context-tag-icon {}\n.pillar-context-tag-label {}\n.pillar-context-tag-remove {}\n\n/* Context tags inside user message bubbles need inverted colors */\n._pillar-message-user ._pillar-context-tag-list {\n padding: 0 0 8px 0;\n}\n\n._pillar-message-user ._pillar-context-tag {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n color: #ffffff;\n}\n\n._pillar-message-user ._pillar-context-tag:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.4);\n}\n\n._pillar-message-user ._pillar-context-tag-icon {\n color: #ffffff;\n}\n\n._pillar-message-user ._pillar-context-tag-label {\n color: #ffffff;\n}\n\n/* ============================================================================\n Unified Chat Input\n Internal: _pillar-unified-input | Public: pillar-unified-input\n Reusable input component with context tag support\n ============================================================================ */\n\n._pillar-unified-input-wrapper {\n display: flex;\n flex-direction: column;\n background: var(--pillar-bg-secondary);\n border: 1px solid var(--pillar-border);\n border-radius: var(--pillar-radius-xl);\n transition: border-color var(--pillar-transition-fast), box-shadow var(--pillar-transition-fast);\n}\n\n._pillar-unified-input-wrapper:focus-within {\n border-color: var(--pillar-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n._pillar-unified-input {\n display: block;\n width: 100%;\n padding: 12px 14px 8px;\n font-size: var(--pillar-font-size-base);\n font-family: var(--pillar-font-family);\n line-height: 1.5;\n color: var(--pillar-text);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n overflow-y: hidden;\n box-sizing: border-box;\n}\n\n._pillar-unified-input::placeholder {\n color: var(--pillar-text-placeholder);\n}\n\n._pillar-unified-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n._pillar-unified-input-row {\n display: flex;\n justify-content: flex-end;\n padding: 8px 10px;\n}\n\n._pillar-unified-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: #ffffff;\n background: var(--pillar-primary);\n border: none;\n border-radius: var(--pillar-radius-md);\n cursor: pointer;\n flex-shrink: 0;\n transition: all var(--pillar-transition-fast);\n}\n\n._pillar-unified-send-btn:hover:not(:disabled) {\n background: var(--pillar-primary-hover);\n}\n\n._pillar-unified-send-btn:disabled {\n color: var(--pillar-text-placeholder);\n background: var(--pillar-bg-tertiary);\n cursor: not-allowed;\n}\n\n._pillar-unified-send-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.pillar-unified-input-wrapper {}\n.pillar-unified-input {}\n.pillar-unified-input-row {}\n.pillar-unified-send-btn {}\n`;\n","/**\n * Workflow Store\n * Signal-based state management for multi-step workflows\n */\n\nimport { signal, computed } from '@preact/signals';\nimport type { Workflow, WorkflowStep, WorkflowStepStatus } from '../core/workflow';\n\n// ============================================================================\n// State Signals\n// ============================================================================\n\n/** Active workflow (only one at a time) */\nexport const activeWorkflow = signal<Workflow | null>(null);\n\n/** Completed/cancelled workflows for the session (for analytics/history) */\nexport const workflowHistory = signal<Workflow[]>([]);\n\n// ============================================================================\n// Computed Values\n// ============================================================================\n\n/** Whether there's an active workflow */\nexport const hasActiveWorkflow = computed(() => activeWorkflow.value !== null);\n\n/** Current step of the active workflow */\nexport const currentStep = computed((): WorkflowStep | null => {\n if (!activeWorkflow.value) return null;\n return activeWorkflow.value.steps[activeWorkflow.value.current_step] || null;\n});\n\n/** Number of completed steps */\nexport const completedStepsCount = computed((): number => {\n if (!activeWorkflow.value) return 0;\n return activeWorkflow.value.steps.filter(\n (s) => s.status === 'completed' || s.status === 'skipped'\n ).length;\n});\n\n/** Progress as a fraction (0-1) */\nexport const workflowProgress = computed((): number => {\n if (!activeWorkflow.value) return 0;\n return completedStepsCount.value / activeWorkflow.value.total_steps;\n});\n\n// ============================================================================\n// Actions\n// ============================================================================\n\n/**\n * Start a new workflow.\n * Sets the first step to either 'active' or 'awaiting_initiation' based on auto_run.\n */\nexport function startWorkflow(workflow: Workflow): void {\n // Cancel any existing workflow\n if (activeWorkflow.value) {\n workflowHistory.value = [...workflowHistory.value, activeWorkflow.value];\n }\n\n // Ensure first step has correct status\n // auto_run=true -> 'active' (executes immediately)\n // auto_run=false -> 'awaiting_initiation' (wait for user click)\n const steps = workflow.steps.map((step, idx) => {\n if (idx === 0) {\n return {\n ...step,\n status: step.auto_run\n ? ('active' as WorkflowStepStatus)\n : ('awaiting_initiation' as WorkflowStepStatus),\n };\n }\n return { ...step, status: 'pending' as WorkflowStepStatus };\n });\n\n activeWorkflow.value = {\n ...workflow,\n steps,\n current_step: 0,\n };\n}\n\n/**\n * Update a step's status.\n */\nexport function updateStepStatus(\n stepIndex: number,\n status: WorkflowStepStatus\n): void {\n if (!activeWorkflow.value) return;\n\n const steps = activeWorkflow.value.steps.map((step, idx) =>\n idx === stepIndex ? { ...step, status } : step\n );\n\n activeWorkflow.value = { ...activeWorkflow.value, steps };\n}\n\n/**\n * Advance to the next step in the workflow.\n * Returns the next step, or null if workflow is complete.\n */\nexport function advanceToNextStep(): WorkflowStep | null {\n if (!activeWorkflow.value) return null;\n\n const nextIndex = activeWorkflow.value.current_step + 1;\n\n if (nextIndex >= activeWorkflow.value.steps.length) {\n // Workflow complete\n return null;\n }\n\n // Get next step and set its initial status\n // auto_run=true -> 'active' (executes immediately)\n // auto_run=false -> 'awaiting_initiation' (wait for user click)\n const nextStep = activeWorkflow.value.steps[nextIndex];\n const nextStatus: WorkflowStepStatus = nextStep.auto_run\n ? 'active'\n : 'awaiting_initiation';\n\n // Update workflow with new current step and status\n const steps = activeWorkflow.value.steps.map((step, idx) =>\n idx === nextIndex ? { ...step, status: nextStatus } : step\n );\n\n activeWorkflow.value = {\n ...activeWorkflow.value,\n steps,\n current_step: nextIndex,\n };\n\n return activeWorkflow.value.steps[nextIndex];\n}\n\n/**\n * Complete the current workflow.\n * Moves it to history and clears active workflow.\n */\nexport function completeWorkflow(): Workflow | null {\n if (!activeWorkflow.value) return null;\n\n const completed = activeWorkflow.value;\n workflowHistory.value = [...workflowHistory.value, completed];\n activeWorkflow.value = null;\n\n return completed;\n}\n\n/**\n * Cancel the active workflow.\n */\nexport function cancelWorkflow(): Workflow | null {\n if (!activeWorkflow.value) return null;\n\n const cancelled = activeWorkflow.value;\n activeWorkflow.value = null;\n\n return cancelled;\n}\n\n/**\n * Get the current active step.\n */\nexport function getCurrentStep(): WorkflowStep | null {\n return currentStep.value;\n}\n\n/**\n * Reset all workflow state.\n */\nexport function resetWorkflow(): void {\n activeWorkflow.value = null;\n workflowHistory.value = [];\n}\n\n","/**\n * WorkflowChecklist Component\n * \n * Renders an active workflow as an interactive checklist.\n * Shows progress, step status, and action buttons.\n */\n\nimport { h, Fragment } from 'preact';\nimport { useComputed, useSignal } from '@preact/signals';\nimport {\n activeWorkflow,\n completedStepsCount,\n} from '../../store/workflow';\nimport type { WorkflowStep, WorkflowStepStatus } from '../../core/workflow';\nimport Pillar from '../../core/Pillar';\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst ICONS = {\n pending: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n awaiting: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>`,\n active: `<svg class=\"pillar-workflow-step__spinner\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"/></svg>`,\n completed: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"9,12 12,15 16,10\"/></svg>`,\n skipped: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke-dasharray=\"4,2\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/></svg>`,\n failed: `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\n workflow: `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></svg>`,\n};\n\nfunction getStatusIcon(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return ICONS.pending;\n case 'awaiting_initiation':\n return ICONS.awaiting;\n case 'active':\n return ICONS.active;\n case 'completed':\n return ICONS.completed;\n case 'skipped':\n return ICONS.skipped;\n case 'failed':\n return ICONS.failed;\n default:\n return ICONS.pending;\n }\n}\n\n// ============================================================================\n// WorkflowStep Component\n// ============================================================================\n\ninterface WorkflowStepItemProps {\n step: WorkflowStep;\n isCurrentStep: boolean;\n}\n\nfunction WorkflowStepItem({ step, isCurrentStep }: WorkflowStepItemProps) {\n const handleStart = () => {\n const pillar = Pillar.getInstance();\n if (pillar) {\n pillar.initiateWorkflowStep(step.index);\n }\n };\n\n const handleSkip = () => {\n const pillar = Pillar.getInstance();\n if (pillar) {\n pillar.skipWorkflowStep(step.index);\n }\n };\n\n const statusClass = `pillar-workflow-step pillar-workflow-step--${step.status}`;\n\n return (\n <div class={statusClass}>\n <div class=\"pillar-workflow-step__icon\">\n <span dangerouslySetInnerHTML={{ __html: getStatusIcon(step.status) }} />\n </div>\n <div class=\"pillar-workflow-step__content\">\n <div class=\"pillar-workflow-step__label\">{step.label}</div>\n {step.note && (\n <div class=\"pillar-workflow-step__note\">{step.note}</div>\n )}\n {step.status === 'awaiting_initiation' && (\n <div class=\"pillar-workflow-step__actions\">\n <button\n type=\"button\"\n class=\"pillar-workflow-step__start-btn\"\n onClick={handleStart}\n >\n Start\n </button>\n <button\n type=\"button\"\n class=\"pillar-workflow-step__skip-btn\"\n onClick={handleSkip}\n >\n Skip\n </button>\n </div>\n )}\n {step.status === 'active' && (\n <div class=\"pillar-workflow-step__status-text\">Running...</div>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// WorkflowChecklist Component\n// ============================================================================\n\nexport function WorkflowChecklist() {\n const workflow = activeWorkflow.value;\n\n if (!workflow) {\n return null;\n }\n\n const handleCancel = () => {\n const pillar = Pillar.getInstance();\n if (pillar) {\n pillar.cancelWorkflow();\n }\n };\n\n const completed = completedStepsCount.value;\n const total = workflow.total_steps;\n\n return (\n <div class=\"pillar-workflow\">\n <div class=\"pillar-workflow__header\">\n <div class=\"pillar-workflow__icon\">\n <span dangerouslySetInnerHTML={{ __html: ICONS.workflow }} />\n </div>\n <div class=\"pillar-workflow__title\">{workflow.title}</div>\n <div class=\"pillar-workflow__progress\">\n {completed}/{total}\n </div>\n </div>\n\n {workflow.description && (\n <div class=\"pillar-workflow__description\">{workflow.description}</div>\n )}\n\n <div class=\"pillar-workflow__steps\">\n {workflow.steps.map((step, idx) => (\n <WorkflowStepItem\n key={`${workflow.id}-step-${step.index}`}\n step={step}\n isCurrentStep={idx === workflow.current_step}\n />\n ))}\n </div>\n\n <div class=\"pillar-workflow__footer\">\n <button\n type=\"button\"\n class=\"pillar-workflow__cancel-btn\"\n onClick={handleCancel}\n >\n Cancel workflow\n </button>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nexport const WORKFLOW_STYLES = `\n/* Workflow Checklist Container */\n.pillar-workflow {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n margin: 12px 0;\n}\n\n/* Header */\n.pillar-workflow__header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.pillar-workflow__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6b7280;\n}\n\n.pillar-workflow__title {\n flex: 1;\n font-size: 14px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.pillar-workflow__progress {\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n}\n\n.pillar-workflow__description {\n font-size: 13px;\n color: #6b7280;\n}\n\n/* Steps List */\n.pillar-workflow__steps {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Individual Step */\n.pillar-workflow-step {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n background: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.pillar-workflow-step__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n color: #9ca3af;\n}\n\n.pillar-workflow-step__icon svg {\n width: 18px;\n height: 18px;\n}\n\n.pillar-workflow-step__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.pillar-workflow-step__label {\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n}\n\n.pillar-workflow-step__note {\n font-size: 12px;\n color: #9ca3af;\n}\n\n.pillar-workflow-step__status-text {\n font-size: 12px;\n color: #2563eb;\n font-style: italic;\n}\n\n.pillar-workflow-step__actions {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n/* Step States */\n.pillar-workflow-step--pending {\n opacity: 0.6;\n}\n\n.pillar-workflow-step--awaiting_initiation {\n background: #fef3c7;\n border-color: #fcd34d;\n}\n\n.pillar-workflow-step--awaiting_initiation .pillar-workflow-step__icon {\n color: #d97706;\n}\n\n.pillar-workflow-step--active {\n background: #eff6ff;\n border-color: #93c5fd;\n}\n\n.pillar-workflow-step--active .pillar-workflow-step__icon {\n color: #2563eb;\n}\n\n.pillar-workflow-step--completed .pillar-workflow-step__icon {\n color: #059669;\n}\n\n.pillar-workflow-step--completed .pillar-workflow-step__label {\n text-decoration: line-through;\n color: #6b7280;\n}\n\n.pillar-workflow-step--skipped {\n opacity: 0.5;\n}\n\n.pillar-workflow-step--skipped .pillar-workflow-step__icon {\n color: #9ca3af;\n}\n\n.pillar-workflow-step--skipped .pillar-workflow-step__label {\n text-decoration: line-through;\n color: #9ca3af;\n}\n\n.pillar-workflow-step--failed {\n background: #fef2f2;\n border-color: #fca5a5;\n}\n\n.pillar-workflow-step--failed .pillar-workflow-step__icon {\n color: #dc2626;\n}\n\n/* Start Button */\n.pillar-workflow-step__start-btn {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n font-family: inherit;\n background: #2563eb;\n color: #ffffff;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-workflow-step__start-btn:hover {\n background: #1d4ed8;\n}\n\n/* Skip Button */\n.pillar-workflow-step__skip-btn {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: #6b7280;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-workflow-step__skip-btn:hover {\n background: #f3f4f6;\n color: #374151;\n}\n\n/* Spinner Animation for Active Step */\n@keyframes pillar-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.pillar-workflow-step__spinner {\n animation: pillar-spin 1s linear infinite;\n}\n\n/* Footer */\n.pillar-workflow__footer {\n display: flex;\n justify-content: flex-end;\n padding-top: 8px;\n border-top: 1px solid #e5e7eb;\n}\n\n.pillar-workflow__cancel-btn {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: #9ca3af;\n border: none;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.pillar-workflow__cancel-btn:hover {\n color: #dc2626;\n}\n`;\n\n","/**\n * Panel Container Component\n * Shadow DOM container for the help panel with Preact rendering\n */\n\nimport { render } from 'preact';\nimport type { APIClient } from '../../api/client';\nimport type { ResolvedConfig } from '../../core/config';\nimport type { EventEmitter } from '../../core/events';\nimport { resetChat, triggerInputFocus } from '../../store/chat';\nimport {\n closePanel,\n destroyViewportListener,\n effectiveMode,\n hoverBackdrop,\n initViewportListener,\n isHoverMode,\n isOpen,\n openPanel,\n position,\n resetPanel,\n setHoverBackdrop,\n setHoverBreakpoint,\n setMode,\n setPosition,\n setWidth,\n width\n} from '../../store/panel';\nimport {\n navigate,\n resetRouter,\n type ViewType,\n} from '../../store/router';\nimport { CONFIRM_CARD_STYLES } from '../Cards/ConfirmActionCard';\nimport { PillarProvider } from '../context';\nimport { INLINE_PLAN_STYLES } from '../Plan/InlinePlanView';\nimport { PLAN_STEP_STYLES } from '../Plan/PlanStepItem';\nimport { PLAN_STYLES } from '../Plan/PlanView';\nimport { PanelContent } from './PanelContent';\nimport { PANEL_STYLES, generateThemeCSS } from './styles';\nimport { TASK_BUTTON_STYLES } from './TaskButton';\nimport { WORKFLOW_STYLES } from './WorkflowChecklist';\n\nexport class Panel {\n private config: ResolvedConfig;\n private api: APIClient;\n private events: EventEmitter;\n private rootContainer: HTMLElement | null;\n\n private host: HTMLElement | null = null;\n private shadow: ShadowRoot | null = null;\n private backdrop: HTMLElement | null = null;\n private panelElement: HTMLElement | null = null;\n private renderRoot: HTMLElement | null = null;\n private unsubscribe: (() => void) | null = null;\n private isManualMount: boolean = false;\n private themeObserver: MutationObserver | null = null;\n\n constructor(config: ResolvedConfig, api: APIClient, events: EventEmitter, rootContainer?: HTMLElement | null) {\n this.config = config;\n this.api = api;\n this.events = events;\n this.rootContainer = rootContainer || null;\n this.isManualMount = config.panel.container === 'manual';\n }\n\n /**\n * Detect the current theme from the document\n * Checks for .dark class (next-themes) or data-theme attribute\n * Returns explicit 'light' or 'dark' to match app theme (not system preference)\n */\n private detectThemeFromDOM(): 'light' | 'dark' {\n const html = document.documentElement;\n \n // Check for .dark class (next-themes pattern - most common)\n if (html.classList.contains('dark')) return 'dark';\n \n // Check for data-theme attribute\n const dataTheme = html.getAttribute('data-theme');\n if (dataTheme === 'dark') return 'dark';\n \n // Check for color-scheme style\n if (html.style.colorScheme === 'dark') return 'dark';\n \n // Default to light (web default, matches next-themes behavior)\n return 'light';\n }\n\n /**\n * Whether the panel is currently open\n */\n get isOpen(): boolean {\n return isOpen.value;\n }\n\n /**\n * Initialize the panel\n */\n async init(): Promise<void> {\n // Set initial config values in store\n setPosition(this.config.panel.position);\n setMode(this.config.panel.mode);\n setWidth(this.config.panel.width);\n setHoverBreakpoint(this.config.panel.hoverBreakpoint);\n setHoverBackdrop(this.config.panel.hoverBackdrop);\n \n // Initialize viewport listener for responsive behavior\n initViewportListener();\n\n this.createHost();\n // Skip backdrop in manual mode - user handles all UI\n if (!this.isManualMount) {\n this.createBackdrop();\n }\n this.createPanel();\n this.renderPreact();\n this.bindEvents();\n this.subscribeToState();\n }\n\n /**\n * Open the panel\n */\n open(options?: { view?: string; focusInput?: boolean }): void {\n if (isOpen.value) {\n // If already open, just navigate\n if (options?.view) {\n navigate(options.view as ViewType);\n }\n // Still trigger focus if requested when already open\n if (options?.focusInput) {\n triggerInputFocus();\n }\n return;\n }\n\n // Update state - the subscription will handle DOM updates\n openPanel();\n\n // Handle initial view\n if (options?.view) {\n navigate(options.view as ViewType);\n }\n\n // Focus trap or input focus\n if (options?.focusInput) {\n triggerInputFocus();\n } else {\n this.setupFocusTrap();\n }\n }\n\n /**\n * Close the panel\n */\n close(): void {\n if (!isOpen.value) return;\n\n // Update state - the subscription will handle DOM updates\n closePanel();\n }\n\n /**\n * Navigate to a specific view\n */\n navigate(view: string, params?: Record<string, string>): void {\n if (!isOpen.value) {\n this.open({ view });\n } else {\n navigate(view as ViewType, params);\n }\n }\n\n /**\n * Destroy the panel\n */\n destroy(): void {\n this.close();\n\n // Clean up push mode styles (only if not manual mount)\n if (!this.isManualMount) {\n this.removePushModeStyles();\n }\n\n // Unsubscribe from state\n this.unsubscribe?.();\n this.unsubscribe = null;\n \n // Clean up viewport listener\n destroyViewportListener();\n \n // Clean up theme observer\n this.themeObserver?.disconnect();\n this.themeObserver = null;\n\n // Unmount Preact\n if (this.renderRoot) {\n render(null, this.renderRoot);\n }\n\n this.backdrop?.remove();\n this.host?.remove();\n\n // Remove injected styles from document head (non-Shadow DOM mode)\n document.getElementById('pillar-sdk-styles')?.remove();\n document.getElementById('pillar-sdk-theme')?.remove();\n document.getElementById('pillar-sdk-custom')?.remove();\n\n this.host = null;\n this.shadow = null;\n this.backdrop = null;\n this.panelElement = null;\n this.renderRoot = null;\n\n document.removeEventListener('keydown', this.handleKeyDown);\n\n resetPanel();\n resetRouter();\n resetChat();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private subscribeToState(): void {\n // In manual mode, user handles all UI - we just emit events\n if (this.isManualMount) {\n this.unsubscribe = isOpen.subscribe((currentValue) => {\n if (!currentValue) {\n this.events.emit('panel:close');\n }\n });\n return;\n }\n\n // Track previous values for change detection\n let previousOpen = isOpen.value;\n let previousEffectiveMode = effectiveMode.value;\n\n // Update UI based on current state\n const updatePanelUI = () => {\n const currentOpen = isOpen.value;\n const currentMode = effectiveMode.value;\n const isPushMode = currentMode === 'push';\n const panelWidth = width.value;\n const panelPosition = position.value;\n const showBackdrop = isHoverMode.value && hoverBackdrop.value;\n\n if (currentOpen) {\n // Panel is open\n if (isPushMode) {\n // In push mode, shift the page content via padding\n this.applyPushModeStyles(panelWidth, panelPosition);\n // Hide backdrop in push mode\n this.backdrop?.classList.remove('_pillar-backdrop--visible', 'pillar-backdrop--visible');\n } else {\n // In hover/overlay mode, remove push padding\n this.removePushModeStyles();\n // Show backdrop if enabled for hover mode\n if (showBackdrop) {\n this.backdrop?.classList.add('_pillar-backdrop--visible', 'pillar-backdrop--visible');\n } else {\n this.backdrop?.classList.remove('_pillar-backdrop--visible', 'pillar-backdrop--visible');\n }\n }\n this.panelElement?.classList.add('_pillar-panel--open', 'pillar-panel--open');\n } else {\n // Panel is closed\n this.removePushModeStyles();\n this.backdrop?.classList.remove('_pillar-backdrop--visible', 'pillar-backdrop--visible');\n this.panelElement?.classList.remove('_pillar-panel--open', 'pillar-panel--open');\n }\n };\n\n // Subscribe to isOpen signal changes\n const unsubscribeOpen = isOpen.subscribe((currentValue) => {\n // Only react to actual changes\n if (currentValue === previousOpen) return;\n previousOpen = currentValue;\n\n updatePanelUI();\n\n if (!currentValue) {\n // Reset panel state after animation\n setTimeout(() => {\n if (!isOpen.value) {\n resetRouter();\n resetChat();\n }\n }, 300);\n\n // Emit close event\n this.events.emit('panel:close');\n }\n });\n\n // Subscribe to effectiveMode changes (viewport resize crossing breakpoint)\n const unsubscribeMode = effectiveMode.subscribe((currentMode) => {\n // Only react to actual changes\n if (currentMode === previousEffectiveMode) return;\n previousEffectiveMode = currentMode;\n\n // Always update z-index when mode changes\n // Update full UI only if panel is open\n updatePanelUI();\n });\n\n // Combined cleanup\n this.unsubscribe = () => {\n unsubscribeOpen();\n unsubscribeMode();\n };\n }\n\n private applyPushModeStyles(panelWidth: number, panelPosition: 'left' | 'right'): void {\n // Use padding to shrink the content area next to the panel\n // The panel is position: fixed so it stays in place while content shrinks\n document.documentElement.style.transition = 'padding 0.3s ease';\n if (panelPosition === 'right') {\n document.documentElement.style.paddingRight = `${panelWidth}px`;\n } else {\n document.documentElement.style.paddingLeft = `${panelWidth}px`;\n }\n }\n\n private removePushModeStyles(): void {\n document.documentElement.style.paddingLeft = '';\n document.documentElement.style.paddingRight = '';\n // Remove transition after animation completes\n setTimeout(() => {\n if (!isOpen.value) {\n document.documentElement.style.transition = '';\n }\n }, 300);\n }\n\n /**\n * Get the container for rendering content (shadow root or host element)\n */\n private get renderContainer(): HTMLElement | ShadowRoot {\n return this.shadow || this.host!;\n }\n\n /**\n * Transform Shadow DOM :host selectors to work in regular DOM.\n * Replaces :host with [data-pillar-panel] attribute selector.\n */\n private transformStylesForRegularDOM(css: string): string {\n // Replace :host selectors with attribute selector for the host element\n // Handle :host, :host(...), :host-context(...), :host:not(...) etc.\n return css\n .replace(/:host\\(([^)]+)\\)/g, '[data-pillar-panel]$1') // :host(.class) -> [data-pillar-panel].class\n .replace(/:host-context\\(([^)]+)\\)/g, '$1 [data-pillar-panel]') // :host-context(.dark) -> .dark [data-pillar-panel]\n .replace(/:host:not\\(([^)]+)\\)/g, '[data-pillar-panel]:not($1)') // :host:not(.x) -> [data-pillar-panel]:not(.x)\n .replace(/:host/g, '[data-pillar-panel]'); // :host -> [data-pillar-panel]\n }\n\n /**\n * Inject styles into document.head for non-Shadow DOM mode.\n * Uses IDs to prevent duplicate injection.\n */\n private injectStylesIntoHead(): void {\n const styleId = 'pillar-sdk-styles';\n if (document.getElementById(styleId)) return; // Prevent duplicates\n\n const rawCSS = PANEL_STYLES + TASK_BUTTON_STYLES + WORKFLOW_STYLES + CONFIRM_CARD_STYLES + PLAN_STYLES + PLAN_STEP_STYLES + INLINE_PLAN_STYLES;\n const transformedCSS = this.transformStylesForRegularDOM(rawCSS);\n\n const styles = document.createElement('style');\n styles.id = styleId;\n styles.textContent = transformedCSS;\n document.head.appendChild(styles);\n\n // Theme styles (also need transformation)\n const themeCSS = generateThemeCSS(this.config.theme);\n if (themeCSS) {\n const themeStyles = document.createElement('style');\n themeStyles.id = 'pillar-sdk-theme';\n themeStyles.textContent = this.transformStylesForRegularDOM(themeCSS);\n document.head.appendChild(themeStyles);\n }\n\n // Custom CSS from config\n if (this.config.customCSS) {\n const customStyles = document.createElement('style');\n customStyles.id = 'pillar-sdk-custom';\n customStyles.textContent = this.transformStylesForRegularDOM(this.config.customCSS);\n document.head.appendChild(customStyles);\n }\n }\n\n /**\n * Inject styles into Shadow DOM for isolated mode.\n */\n private injectStylesIntoShadow(): void {\n if (!this.shadow) return;\n\n // Inject base styles\n const styles = document.createElement('style');\n styles.textContent = PANEL_STYLES + TASK_BUTTON_STYLES + WORKFLOW_STYLES + CONFIRM_CARD_STYLES + PLAN_STYLES + PLAN_STEP_STYLES + INLINE_PLAN_STYLES;\n this.shadow.appendChild(styles);\n\n // Inject theme customization CSS (color overrides from config)\n const themeCSS = generateThemeCSS(this.config.theme);\n if (themeCSS) {\n const themeStyles = document.createElement('style');\n themeStyles.textContent = themeCSS;\n themeStyles.setAttribute('data-pillar-theme', '');\n this.shadow.appendChild(themeStyles);\n }\n\n // Inject custom CSS from config (user overrides)\n if (this.config.customCSS) {\n const customStyles = document.createElement('style');\n customStyles.textContent = this.config.customCSS;\n customStyles.setAttribute('data-pillar-custom', '');\n this.shadow.appendChild(customStyles);\n }\n }\n\n private createHost(): void {\n // Create host element\n this.host = document.createElement('div');\n this.host.className = 'pillar-panel-host';\n this.host.setAttribute('data-pillar-panel', '');\n\n if (this.config.panel.useShadowDOM) {\n // Shadow DOM mode (opt-in for style isolation)\n this.shadow = this.host.attachShadow({ mode: 'open' });\n this.injectStylesIntoShadow();\n } else {\n // Regular DOM mode (default - inherits host app CSS)\n this.shadow = null;\n this.injectStylesIntoHead();\n }\n\n // Set theme mode attribute on host for CSS selectors\n this.applyThemeMode();\n \n // Watch for theme changes on documentElement (for auto mode)\n this.setupThemeObserver();\n\n // Determine mount point based on container config\n const container = this.config.panel.container;\n\n if (container === 'manual') {\n // Manual mode: don't mount automatically, wait for mountTo() call\n return;\n }\n\n // Default mount target is the shared root container (for stacking context isolation)\n // Falls back to document.body if no root container provided\n const defaultTarget = this.rootContainer || document.body;\n let mountTarget: HTMLElement | null = null;\n\n if (typeof container === 'string') {\n // CSS selector\n mountTarget = document.querySelector<HTMLElement>(container);\n if (!mountTarget) {\n console.warn(`[Pillar] Container element not found: ${container}, falling back to root container`);\n mountTarget = defaultTarget;\n }\n } else if (container instanceof HTMLElement) {\n // Direct element reference\n mountTarget = container;\n } else {\n // Default to root container\n mountTarget = defaultTarget;\n }\n\n mountTarget.appendChild(this.host);\n }\n\n /**\n * Mount the panel to a specific container element.\n * Used for manual mounting mode (e.g., from React component).\n */\n mountTo(container: HTMLElement): void {\n if (!this.host) {\n console.warn('[Pillar] Panel host not created yet');\n return;\n }\n\n // Remove from current parent if exists\n if (this.host.parentElement) {\n this.host.parentElement.removeChild(this.host);\n }\n\n container.appendChild(this.host);\n }\n\n /**\n * Get the host element for external mounting\n */\n getHostElement(): HTMLElement | null {\n return this.host;\n }\n\n private createBackdrop(): void {\n // Backdrop is outside shadow DOM for proper stacking\n this.backdrop = document.createElement('div');\n this.backdrop.className = '_pillar-backdrop pillar-backdrop';\n this.backdrop.style.cssText = `\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.3);\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n z-index: 99998;\n `;\n\n // Click backdrop to close - just call closePanel, subscription handles the rest\n this.backdrop.addEventListener('click', () => {\n closePanel();\n });\n\n document.body.appendChild(this.backdrop);\n }\n\n private createPanel(): void {\n const container = this.renderContainer;\n if (!container) return;\n\n // Panel container with both internal and public classes\n this.panelElement = document.createElement('div');\n const manualClass = this.isManualMount ? ' _pillar-panel--manual pillar-panel--manual' : '';\n const positionClass = `_pillar-panel--${position.value} pillar-panel--${position.value}`;\n this.panelElement.className = `_pillar-panel pillar-panel ${positionClass}${manualClass}`;\n this.panelElement.style.setProperty('--pillar-panel-width', `${width.value}px`);\n this.panelElement.setAttribute('role', 'dialog');\n this.panelElement.setAttribute('aria-modal', 'true');\n this.panelElement.setAttribute('aria-label', 'Assistant panel');\n\n // Create render root for Preact with both internal and public classes\n this.renderRoot = document.createElement('div');\n this.renderRoot.className = '_pillar-panel-root pillar-panel-root';\n this.panelElement.appendChild(this.renderRoot);\n\n container.appendChild(this.panelElement);\n }\n\n private renderPreact(): void {\n if (!this.renderRoot) return;\n\n render(\n <PillarProvider api={this.api} events={this.events}>\n <PanelContent />\n </PillarProvider>,\n this.renderRoot\n );\n }\n\n private bindEvents(): void {\n // Escape key to close\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && isOpen.value) {\n closePanel();\n }\n };\n\n private setupFocusTrap(): void {\n // Focus first focusable element in panel\n setTimeout(() => {\n const container = this.renderContainer;\n const focusable = container?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n focusable?.focus();\n }, 100);\n }\n\n /**\n * Apply theme mode attribute to host element for CSS targeting\n */\n private applyThemeMode(): void {\n if (!this.host) return;\n\n const themeMode = this.config.theme.mode;\n \n if (themeMode === 'light' || themeMode === 'dark') {\n // Manual light/dark mode - set data attribute\n this.host.setAttribute('data-theme', themeMode);\n } else {\n // Auto mode - detect from DOM (matches app theme, not system preference)\n // This ensures the panel matches when user sets theme manually in the app\n const detectedTheme = this.detectThemeFromDOM();\n this.host.setAttribute('data-theme', detectedTheme);\n }\n }\n\n /**\n * Set up observer to watch for theme changes on documentElement\n */\n private setupThemeObserver(): void {\n // Only needed for auto mode\n if (this.config.theme.mode !== 'auto') return;\n \n this.themeObserver = new MutationObserver(() => {\n // Re-apply theme when DOM theme changes\n this.applyThemeMode();\n });\n\n this.themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'style'],\n });\n }\n\n /**\n * Update the theme at runtime\n */\n setTheme(themeConfig: Partial<ResolvedConfig['theme']>): void {\n // Merge new theme config with existing\n this.config = {\n ...this.config,\n theme: {\n ...this.config.theme,\n ...themeConfig,\n colors: { ...this.config.theme.colors, ...themeConfig.colors },\n darkColors: { ...this.config.theme.darkColors, ...themeConfig.darkColors },\n },\n };\n\n // Update theme mode attribute\n this.applyThemeMode();\n\n // Regenerate and update theme CSS\n const themeCSS = generateThemeCSS(this.config.theme);\n \n if (this.shadow) {\n // Shadow DOM mode: update styles in shadow root\n const existingThemeStyle = this.shadow.querySelector('style[data-pillar-theme]');\n \n if (existingThemeStyle && themeCSS) {\n existingThemeStyle.textContent = themeCSS;\n } else if (themeCSS && !existingThemeStyle) {\n const themeStyles = document.createElement('style');\n themeStyles.textContent = themeCSS;\n themeStyles.setAttribute('data-pillar-theme', '');\n // Insert after base styles\n const firstStyle = this.shadow.querySelector('style');\n if (firstStyle?.nextSibling) {\n this.shadow.insertBefore(themeStyles, firstStyle.nextSibling);\n } else {\n this.shadow.appendChild(themeStyles);\n }\n }\n } else {\n // Regular DOM mode: update styles in document head\n // Must transform :host selectors to [data-pillar-panel] attribute selectors\n const transformedThemeCSS = this.transformStylesForRegularDOM(themeCSS);\n const existingThemeStyle = document.getElementById('pillar-sdk-theme');\n \n if (existingThemeStyle && transformedThemeCSS) {\n existingThemeStyle.textContent = transformedThemeCSS;\n } else if (transformedThemeCSS && !existingThemeStyle) {\n const themeStyles = document.createElement('style');\n themeStyles.id = 'pillar-sdk-theme';\n themeStyles.textContent = transformedThemeCSS;\n document.head.appendChild(themeStyles);\n }\n }\n }\n}\n","/**\n * Text Selection Popover Component\n * Shows \"Ask AI\" button near selected text\n */\n\nimport { h } from 'preact';\nimport { useEffect, useRef, useState, useCallback } from 'preact/hooks';\n\nconst SPARKLE_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path d=\"M10 2a1 1 0 011 1v1.323l3.954 1.582 1.599-.8a1 1 0 01.894 1.79l-1.233.616 1.738 5.42a1 1 0 01-.285 1.05A3.989 3.989 0 0115 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.715-5.349L10 6.477l-3.763 1.105 1.715 5.349a1 1 0 01-.285 1.05A3.989 3.989 0 015 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.738-5.42-1.233-.617a1 1 0 01.894-1.788l1.599.799L9 4.323V3a1 1 0 011-1z\"/></svg>`;\n\ninterface TextSelectionPopoverProps {\n label: string;\n x: number;\n y: number;\n isVisible: boolean;\n onClick: () => void;\n}\n\nexport function TextSelectionPopover({\n label,\n x,\n y,\n isVisible,\n onClick,\n}: TextSelectionPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ x, y });\n const [isBelow, setIsBelow] = useState(false);\n\n const updatePosition = useCallback(() => {\n if (!popoverRef.current || !isVisible) return;\n\n const rect = popoverRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let adjustedX = x;\n let adjustedY = y;\n let showBelow = false;\n\n // Center horizontally on the selection point\n adjustedX = x - rect.width / 2;\n\n // Keep within viewport horizontally\n if (adjustedX < 10) {\n adjustedX = 10;\n } else if (adjustedX + rect.width > viewportWidth - 10) {\n adjustedX = viewportWidth - rect.width - 10;\n }\n\n // Position above selection by default, with offset for arrow\n adjustedY = y - rect.height - 10;\n\n // If not enough space above, show below\n if (adjustedY < 10) {\n adjustedY = y + 10;\n showBelow = true;\n }\n\n setPosition({ x: adjustedX, y: adjustedY });\n setIsBelow(showBelow);\n }, [x, y, isVisible]);\n\n useEffect(() => {\n if (isVisible) {\n // Initial position calculation\n requestAnimationFrame(updatePosition);\n }\n }, [isVisible, updatePosition, x, y]);\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n };\n\n const className = `pillar-text-selection-popover${isVisible ? ' pillar-text-selection-popover--visible' : ''}${isBelow ? ' pillar-text-selection-popover--below' : ''}`;\n\n return (\n <div\n ref={popoverRef}\n class={className}\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n }}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }}\n >\n <div class=\"pillar-text-selection-popover__content\">\n <span\n class=\"pillar-text-selection-popover__icon\"\n dangerouslySetInnerHTML={{ __html: SPARKLE_ICON }}\n />\n <span>{label}</span>\n </div>\n <div class=\"pillar-text-selection-popover__arrow\" />\n </div>\n );\n}\n\n","/**\n * Text Selection Manager\n * Detects text selection and shows \"Ask AI\" popover\n */\n\nimport { h, render } from 'preact';\nimport type { EventEmitter } from '../../core/events';\nimport type { ResolvedConfig } from '../../core/config';\nimport { TEXT_SELECTION_STYLES } from './styles';\nimport { TextSelectionPopover } from './TextSelectionPopover';\nimport { injectStyles } from '../../utils/dom';\nimport { addUserContext } from '../../store/chat';\n\nconst STYLES_ID = 'pillar-text-selection-styles';\nconst MIN_SELECTION_LENGTH = 3;\n\nexport class TextSelectionManager {\n private config: ResolvedConfig;\n private events: EventEmitter;\n private openPanel: () => void;\n\n private container: HTMLDivElement | null = null;\n private isVisible = false;\n private currentSelection = '';\n private stylesInjected = false;\n\n constructor(\n config: ResolvedConfig,\n events: EventEmitter,\n openPanel: () => void\n ) {\n this.config = config;\n this.events = events;\n this.openPanel = openPanel;\n }\n\n /**\n * Initialize the text selection manager\n */\n init(): void {\n // Inject styles\n if (!this.stylesInjected) {\n injectStyles(document, TEXT_SELECTION_STYLES, STYLES_ID);\n this.stylesInjected = true;\n }\n\n // Create container for popover\n this.container = document.createElement('div');\n this.container.id = 'pillar-text-selection-container';\n document.body.appendChild(this.container);\n\n // Bind events\n this.bindEvents();\n }\n\n /**\n * Destroy the text selection manager\n */\n destroy(): void {\n this.unbindEvents();\n\n // Unmount Preact component\n if (this.container) {\n render(null, this.container);\n this.container.remove();\n this.container = null;\n }\n\n // Remove styles\n document.getElementById(STYLES_ID)?.remove();\n this.stylesInjected = false;\n\n this.isVisible = false;\n this.currentSelection = '';\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private bindEvents(): void {\n document.addEventListener('mouseup', this.handleMouseUp);\n document.addEventListener('mousedown', this.handleMouseDown);\n document.addEventListener('keydown', this.handleKeyDown);\n document.addEventListener('scroll', this.handleScroll, true);\n }\n\n private unbindEvents(): void {\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.removeEventListener('mousedown', this.handleMouseDown);\n document.removeEventListener('keydown', this.handleKeyDown);\n document.removeEventListener('scroll', this.handleScroll, true);\n }\n\n private handleMouseUp = (e: MouseEvent): void => {\n // Delay to allow selection to be finalized\n setTimeout(() => {\n this.checkSelection(e);\n }, 10);\n };\n\n private handleMouseDown = (e: MouseEvent): void => {\n // Hide popover when clicking elsewhere (unless clicking on popover itself)\n const target = e.target as HTMLElement;\n if (!target.closest('.pillar-text-selection-popover')) {\n this.hidePopover();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n // Hide on Escape\n if (e.key === 'Escape') {\n this.hidePopover();\n }\n };\n\n private handleScroll = (): void => {\n // Hide on scroll\n if (this.isVisible) {\n this.hidePopover();\n }\n };\n\n private checkSelection(e: MouseEvent): void {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n\n const selectedText = selection.toString().trim();\n\n // Validate selection\n if (selectedText.length < MIN_SELECTION_LENGTH) {\n return;\n }\n\n // Check if selection is within Pillar panel (don't show popover there)\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container instanceof Element ? container : container.parentElement;\n \n if (element?.closest('[data-pillar-panel]') || element?.closest('.pillar-panel-host')) {\n return;\n }\n\n // Get position for popover (above the selection)\n const rect = range.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + window.scrollY;\n\n this.currentSelection = selectedText;\n this.showPopover(x, y);\n }\n\n private showPopover(x: number, y: number): void {\n if (!this.container) return;\n\n this.isVisible = true;\n\n render(\n <TextSelectionPopover\n label={this.config.textSelection.label}\n x={x}\n y={y}\n isVisible={true}\n onClick={this.handlePopoverClick}\n />,\n this.container\n );\n\n // Emit event\n this.events.emit('textSelection:shown', { text: this.currentSelection });\n }\n\n private hidePopover(): void {\n if (!this.container || !this.isVisible) return;\n\n this.isVisible = false;\n\n render(\n <TextSelectionPopover\n label={this.config.textSelection.label}\n x={0}\n y={0}\n isVisible={false}\n onClick={() => {}}\n />,\n this.container\n );\n }\n\n private handlePopoverClick = (): void => {\n if (!this.currentSelection) return;\n\n // Emit event\n this.events.emit('textSelection:click', { text: this.currentSelection });\n\n // Add highlighted text to user context\n addUserContext({\n type: 'highlighted_text',\n url_origin: window.location.href,\n text_content: this.currentSelection,\n });\n\n // Hide popover\n this.hidePopover();\n\n // Clear the text selection\n window.getSelection()?.removeAllRanges();\n\n // Open the panel\n this.openPanel();\n };\n}\n\n","/**\n * Text Selection Popover CSS Styles\n * Injected into the document head\n */\n\nexport const TEXT_SELECTION_STYLES = `\n/* Pillar Text Selection Popover Styles */\n.pillar-text-selection-popover {\n position: absolute;\n z-index: 99999;\n padding: 6px 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 13px;\n font-weight: 500;\n line-height: 1;\n color: #ffffff;\n background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3), 0 2px 4px rgba(0, 0, 0, 0.1);\n pointer-events: auto;\n opacity: 0;\n transform: translateY(4px) scale(0.95);\n transition: opacity 0.15s ease, transform 0.15s ease;\n cursor: pointer;\n user-select: none;\n}\n\n.pillar-text-selection-popover.pillar-text-selection-popover--visible {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.pillar-text-selection-popover:hover {\n background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);\n box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4), 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.pillar-text-selection-popover:active {\n transform: translateY(0) scale(0.98);\n}\n\n.pillar-text-selection-popover__content {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pillar-text-selection-popover__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n}\n\n.pillar-text-selection-popover__icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Arrow pointing down to selection */\n.pillar-text-selection-popover__arrow {\n position: absolute;\n bottom: -5px;\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n width: 10px;\n height: 10px;\n background: linear-gradient(135deg, #8b5cf6 0%, #8b5cf6 100%);\n}\n\n.pillar-text-selection-popover--below .pillar-text-selection-popover__arrow {\n bottom: auto;\n top: -5px;\n background: linear-gradient(135deg, #6366f1 0%, #6366f1 100%);\n}\n`;\n\n","/**\n * Positioning utilities for tooltips and floating elements\n */\n\nexport type Position = 'top' | 'bottom' | 'left' | 'right' | 'auto';\nexport type Alignment = 'start' | 'center' | 'end';\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PositionResult {\n x: number;\n y: number;\n position: Position;\n arrowX?: number;\n arrowY?: number;\n}\n\ninterface PositionOptions {\n position: Position;\n alignment?: Alignment;\n offset?: number;\n padding?: number;\n arrowSize?: number;\n}\n\n/**\n * Gets the bounding rect of an element\n */\nexport function getElementRect(element: Element): Rect {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/**\n * Gets the viewport rect\n */\nexport function getViewportRect(): Rect {\n return {\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\n/**\n * Calculates available space in each direction from an element\n */\nexport function getAvailableSpace(\n anchor: Rect,\n viewport: Rect,\n padding: number = 8\n): Record<Position, number> {\n return {\n top: anchor.y - viewport.y - padding,\n bottom: viewport.y + viewport.height - (anchor.y + anchor.height) - padding,\n left: anchor.x - viewport.x - padding,\n right: viewport.x + viewport.width - (anchor.x + anchor.width) - padding,\n auto: 0, // Not used for space calculation\n };\n}\n\n/**\n * Determines the best position for a floating element\n */\nexport function getBestPosition(\n anchor: Rect,\n floating: { width: number; height: number },\n options: PositionOptions\n): Position {\n if (options.position !== 'auto') {\n return options.position;\n }\n\n const viewport = getViewportRect();\n const space = getAvailableSpace(anchor, viewport, options.padding);\n const offset = options.offset || 8;\n\n // Check if each position has enough space\n const fits = {\n top: space.top >= floating.height + offset,\n bottom: space.bottom >= floating.height + offset,\n left: space.left >= floating.width + offset,\n right: space.right >= floating.width + offset,\n };\n\n // Priority: bottom, top, right, left\n if (fits.bottom) return 'bottom';\n if (fits.top) return 'top';\n if (fits.right) return 'right';\n if (fits.left) return 'left';\n\n // If nothing fits, use the position with most space\n const sorted = Object.entries(space)\n .filter(([key]) => key !== 'auto')\n .sort(([, a], [, b]) => b - a);\n\n return sorted[0][0] as Position;\n}\n\n/**\n * Calculates the position of a floating element relative to an anchor\n */\nexport function calculatePosition(\n anchor: Rect,\n floating: { width: number; height: number },\n options: PositionOptions\n): PositionResult {\n const {\n alignment = 'center',\n offset = 8,\n padding = 8,\n arrowSize = 8,\n } = options;\n\n const viewport = getViewportRect();\n const position = getBestPosition(anchor, floating, options);\n \n let x = 0;\n let y = 0;\n let arrowX: number | undefined;\n let arrowY: number | undefined;\n\n // Calculate base position\n switch (position) {\n case 'top':\n y = anchor.y - floating.height - offset;\n x = getAlignedX(anchor, floating, alignment);\n arrowX = anchor.x + anchor.width / 2 - arrowSize / 2;\n break;\n\n case 'bottom':\n y = anchor.y + anchor.height + offset;\n x = getAlignedX(anchor, floating, alignment);\n arrowX = anchor.x + anchor.width / 2 - arrowSize / 2;\n break;\n\n case 'left':\n x = anchor.x - floating.width - offset;\n y = getAlignedY(anchor, floating, alignment);\n arrowY = anchor.y + anchor.height / 2 - arrowSize / 2;\n break;\n\n case 'right':\n x = anchor.x + anchor.width + offset;\n y = getAlignedY(anchor, floating, alignment);\n arrowY = anchor.y + anchor.height / 2 - arrowSize / 2;\n break;\n }\n\n // Constrain to viewport\n x = Math.max(\n viewport.x + padding,\n Math.min(x, viewport.x + viewport.width - floating.width - padding)\n );\n y = Math.max(\n viewport.y + padding,\n Math.min(y, viewport.y + viewport.height - floating.height - padding)\n );\n\n // Adjust arrow position relative to constrained floating element\n if (arrowX !== undefined) {\n arrowX = Math.max(\n x + arrowSize,\n Math.min(arrowX, x + floating.width - arrowSize * 2)\n );\n arrowX -= x; // Make relative to floating element\n }\n if (arrowY !== undefined) {\n arrowY = Math.max(\n y + arrowSize,\n Math.min(arrowY, y + floating.height - arrowSize * 2)\n );\n arrowY -= y; // Make relative to floating element\n }\n\n return { x, y, position, arrowX, arrowY };\n}\n\nfunction getAlignedX(\n anchor: Rect,\n floating: { width: number },\n alignment: Alignment\n): number {\n switch (alignment) {\n case 'start':\n return anchor.x;\n case 'end':\n return anchor.x + anchor.width - floating.width;\n case 'center':\n default:\n return anchor.x + anchor.width / 2 - floating.width / 2;\n }\n}\n\nfunction getAlignedY(\n anchor: Rect,\n floating: { height: number },\n alignment: Alignment\n): number {\n switch (alignment) {\n case 'start':\n return anchor.y;\n case 'end':\n return anchor.y + anchor.height - floating.height;\n case 'center':\n default:\n return anchor.y + anchor.height / 2 - floating.height / 2;\n }\n}\n\n","/**\n * Tooltip Component\n * Individual tooltip rendered to document body\n */\n\nimport { h, render } from 'preact';\nimport { useEffect, useRef, useCallback, useState } from 'preact/hooks';\nimport type { TooltipData } from '../../api/client';\nimport type { TooltipTrigger, TooltipPosition } from '../../core/config';\nimport { calculatePosition, getElementRect, type Position } from '../../utils/positioning';\n\nconst ARROW_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z\" clip-rule=\"evenodd\"></path></svg>`;\nconst INFO_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\"></path></svg>`;\nconst CLOSE_ICON = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"></path></svg>`;\n\ninterface TooltipContentProps {\n data: TooltipData;\n anchor: HTMLElement;\n trigger: TooltipTrigger;\n position: TooltipPosition;\n isVisible: boolean;\n onLearnMore?: (articleSlug: string) => void;\n onHide: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nfunction TooltipContent({\n data,\n anchor,\n trigger,\n position: preferredPosition,\n isVisible,\n onLearnMore,\n onHide,\n onMouseEnter,\n onMouseLeave,\n}: TooltipContentProps) {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const arrowRef = useRef<HTMLDivElement>(null);\n const [positionClass, setPositionClass] = useState(preferredPosition);\n const [style, setStyle] = useState<{ left: number; top: number }>({ left: 0, top: 0 });\n const [arrowStyle, setArrowStyle] = useState<{ left?: number; top?: number }>({});\n\n const updatePosition = useCallback(() => {\n if (!tooltipRef.current || !isVisible) return;\n\n const anchorRect = getElementRect(anchor);\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const result = calculatePosition(\n anchorRect,\n { width: tooltipRect.width, height: tooltipRect.height },\n {\n position: preferredPosition as Position,\n offset: 10,\n arrowSize: 12,\n }\n );\n\n setStyle({ left: result.x, top: result.y });\n setPositionClass(result.position as TooltipPosition);\n\n if (result.arrowX !== undefined) {\n setArrowStyle({ left: result.arrowX });\n }\n if (result.arrowY !== undefined) {\n setArrowStyle({ top: result.arrowY });\n }\n }, [anchor, preferredPosition, isVisible]);\n\n useEffect(() => {\n if (isVisible) {\n // Initial position calculation\n requestAnimationFrame(updatePosition);\n\n // Update on scroll/resize\n window.addEventListener('scroll', updatePosition, true);\n window.addEventListener('resize', updatePosition);\n\n return () => {\n window.removeEventListener('scroll', updatePosition, true);\n window.removeEventListener('resize', updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n const handleLearnMore = (e: MouseEvent) => {\n e.stopPropagation();\n if (data.article_slug) {\n onLearnMore?.(data.article_slug);\n }\n };\n\n const handleClose = (e: MouseEvent) => {\n e.stopPropagation();\n onHide();\n };\n\n const className = `pillar-tooltip pillar-tooltip--${positionClass}${isVisible ? ' pillar-tooltip--visible' : ''}`;\n\n return (\n <div\n ref={tooltipRef}\n class={className}\n role=\"tooltip\"\n style={{\n left: `${style.left}px`,\n top: `${style.top}px`,\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <div\n class=\"pillar-tooltip__content\"\n dangerouslySetInnerHTML={{ __html: data.content_html || data.content }}\n />\n\n {data.show_learn_more && data.article_slug && (\n <button\n class=\"pillar-tooltip__learn-more\"\n onClick={handleLearnMore}\n type=\"button\"\n >\n {data.article_title || 'Learn more'}\n <span dangerouslySetInnerHTML={{ __html: ARROW_ICON }} />\n </button>\n )}\n\n {trigger === 'click' && (\n <button\n class=\"pillar-tooltip__close\"\n onClick={handleClose}\n aria-label=\"Close tooltip\"\n type=\"button\"\n dangerouslySetInnerHTML={{ __html: CLOSE_ICON }}\n />\n )}\n\n <div ref={arrowRef} class=\"pillar-tooltip__arrow\" style={arrowStyle} />\n </div>\n );\n}\n\nexport interface TooltipOptions {\n trigger: TooltipTrigger;\n position: TooltipPosition;\n onLearnMore?: (articleSlug: string) => void;\n onShow?: () => void;\n onHide?: () => void;\n}\n\n/**\n * Tooltip class that manages a single tooltip instance\n * Uses Preact for rendering but maintains imperative control\n */\nexport class Tooltip {\n private id: string;\n private data: TooltipData;\n private anchor: HTMLElement;\n private options: TooltipOptions;\n private container: HTMLElement | null = null;\n private iconElement: HTMLElement | null = null;\n private isVisible = false;\n private hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(data: TooltipData, anchor: HTMLElement, options: TooltipOptions) {\n this.id = `tooltip-${Math.random().toString(36).slice(2, 9)}`;\n this.data = data;\n this.anchor = anchor;\n this.options = options;\n }\n\n init(): void {\n // Create container for portal rendering\n this.container = document.createElement('div');\n this.container.id = this.id;\n document.body.appendChild(this.container);\n\n // Add icon if trigger is 'icon'\n if (this.options.trigger === 'icon') {\n this.createIcon();\n }\n\n // Bind events\n this.bindEvents();\n }\n\n show(): void {\n if (this.isVisible) return;\n\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n\n this.isVisible = true;\n this.renderTooltip();\n this.options.onShow?.();\n }\n\n hide(): void {\n if (!this.isVisible) return;\n\n this.isVisible = false;\n this.renderTooltip();\n\n // Remove from DOM after animation\n this.hideTimeout = setTimeout(() => {\n this.options.onHide?.();\n }, 150);\n }\n\n toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n destroy(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n }\n\n this.unbindEvents();\n\n // Unmount Preact component\n if (this.container) {\n render(null, this.container);\n this.container.remove();\n }\n\n this.iconElement?.remove();\n this.container = null;\n this.iconElement = null;\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private renderTooltip(): void {\n if (!this.container) return;\n\n // Only pass hover handlers if trigger is 'hover'\n const hoverHandlers = this.options.trigger === 'hover'\n ? {\n onMouseEnter: this.handleTooltipMouseEnter,\n onMouseLeave: this.handleTooltipMouseLeave,\n }\n : {};\n\n render(\n <TooltipContent\n data={this.data}\n anchor={this.anchor}\n trigger={this.options.trigger}\n position={this.options.position}\n isVisible={this.isVisible}\n onLearnMore={this.options.onLearnMore}\n onHide={() => this.hide()}\n {...hoverHandlers}\n />,\n this.container\n );\n }\n\n private createIcon(): void {\n const icon = document.createElement('span');\n icon.className = 'pillar-tooltip-icon';\n icon.innerHTML = INFO_ICON;\n icon.setAttribute('aria-label', 'More information');\n icon.setAttribute('role', 'button');\n icon.setAttribute('tabindex', '0');\n\n this.anchor.insertAdjacentElement('afterend', icon);\n this.iconElement = icon;\n }\n\n private bindEvents(): void {\n const target = this.options.trigger === 'icon' ? this.iconElement : this.anchor;\n if (!target) return;\n\n switch (this.options.trigger) {\n case 'hover':\n target.addEventListener('mouseenter', this.handleMouseEnter);\n target.addEventListener('mouseleave', this.handleMouseLeave);\n break;\n\n case 'click':\n case 'icon':\n target.addEventListener('click', this.handleClick);\n document.addEventListener('click', this.handleDocumentClick);\n break;\n\n case 'focus':\n target.addEventListener('focus', this.handleFocus);\n target.addEventListener('blur', this.handleBlur);\n break;\n }\n\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n private unbindEvents(): void {\n const target = this.options.trigger === 'icon' ? this.iconElement : this.anchor;\n if (!target) return;\n\n target.removeEventListener('mouseenter', this.handleMouseEnter);\n target.removeEventListener('mouseleave', this.handleMouseLeave);\n target.removeEventListener('click', this.handleClick);\n target.removeEventListener('focus', this.handleFocus);\n target.removeEventListener('blur', this.handleBlur);\n\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n private handleMouseEnter = (): void => {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n this.show();\n };\n\n private handleMouseLeave = (): void => {\n // Delay hide to allow moving to tooltip\n this.hideTimeout = setTimeout(() => this.hide(), 100);\n };\n\n // Handler for when mouse enters the tooltip element itself\n private handleTooltipMouseEnter = (): void => {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n };\n\n // Handler for when mouse leaves the tooltip element\n private handleTooltipMouseLeave = (): void => {\n // Delay hide to allow moving back to anchor\n this.hideTimeout = setTimeout(() => this.hide(), 100);\n };\n\n private handleClick = (e: Event): void => {\n e.stopPropagation();\n this.toggle();\n };\n\n private handleDocumentClick = (): void => {\n if (this.isVisible) {\n this.hide();\n }\n };\n\n private handleFocus = (): void => {\n this.show();\n };\n\n private handleBlur = (): void => {\n this.hide();\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.isVisible) {\n this.hide();\n }\n };\n}\n","/**\n * Tooltip CSS Styles\n * Injected into the document head\n */\n\nexport const TOOLTIP_STYLES = `\n/* Pillar Tooltip Styles */\n.pillar-tooltip {\n position: absolute;\n z-index: 99999;\n max-width: 320px;\n padding: 12px 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1a1a1a;\n background: #ffffff;\n border-radius: 8px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05);\n pointer-events: auto;\n opacity: 0;\n transform: scale(0.95);\n transition: opacity 0.15s ease, transform 0.15s ease;\n}\n\n.pillar-tooltip.pillar-tooltip--visible {\n opacity: 1;\n transform: scale(1);\n}\n\n.pillar-tooltip__content {\n margin: 0;\n}\n\n.pillar-tooltip__content p {\n margin: 0 0 8px;\n}\n\n.pillar-tooltip__content p:last-child {\n margin-bottom: 0;\n}\n\n.pillar-tooltip__content a {\n color: #2563eb;\n text-decoration: none;\n}\n\n.pillar-tooltip__content a:hover {\n text-decoration: underline;\n}\n\n.pillar-tooltip__learn-more {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 12px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n color: #2563eb;\n background: #eff6ff;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.pillar-tooltip__learn-more:hover {\n background: #dbeafe;\n}\n\n.pillar-tooltip__learn-more svg {\n width: 14px;\n height: 14px;\n}\n\n/* Arrow */\n.pillar-tooltip__arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: #ffffff;\n transform: rotate(45deg);\n box-shadow: -1px -1px 0 0 rgba(0, 0, 0, 0.05);\n}\n\n.pillar-tooltip--top .pillar-tooltip__arrow {\n bottom: -6px;\n box-shadow: 1px 1px 0 0 rgba(0, 0, 0, 0.05);\n}\n\n.pillar-tooltip--bottom .pillar-tooltip__arrow {\n top: -6px;\n}\n\n.pillar-tooltip--left .pillar-tooltip__arrow {\n right: -6px;\n box-shadow: 1px -1px 0 0 rgba(0, 0, 0, 0.05);\n}\n\n.pillar-tooltip--right .pillar-tooltip__arrow {\n left: -6px;\n box-shadow: -1px 1px 0 0 rgba(0, 0, 0, 0.05);\n}\n\n/* Tooltip Icon (for icon trigger) */\n.pillar-tooltip-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 4px;\n vertical-align: middle;\n color: #6b7280;\n cursor: help;\n transition: color 0.15s ease;\n}\n\n.pillar-tooltip-icon:hover {\n color: #2563eb;\n}\n\n.pillar-tooltip-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Close button */\n.pillar-tooltip__close {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n color: #9ca3af;\n background: none;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.pillar-tooltip__close:hover {\n color: #1a1a1a;\n background: #f3f4f6;\n}\n\n.pillar-tooltip__close svg {\n width: 12px;\n height: 12px;\n}\n`;\n\n","/**\n * Tooltip Manager\n * Scans DOM for tooltip elements and manages their lifecycle\n */\n\nimport type { EventEmitter } from '../../core/events';\nimport type { ResolvedConfig, TooltipTrigger, TooltipPosition } from '../../core/config';\nimport type { APIClient, TooltipData } from '../../api/client';\nimport { Tooltip } from './Tooltip';\nimport { TOOLTIP_STYLES } from './styles';\nimport { injectStyles } from '../../utils/dom';\n\nconst TOOLTIP_ATTRIBUTE = 'data-pillar-tooltip';\nconst TOOLTIP_TRIGGER_ATTR = 'data-pillar-trigger';\nconst TOOLTIP_POSITION_ATTR = 'data-pillar-position';\n\nexport class TooltipManager {\n private config: ResolvedConfig;\n private api: APIClient;\n private events: EventEmitter;\n private tooltips: Map<string, Tooltip> = new Map();\n private tooltipData: Map<string, TooltipData> = new Map();\n private observer: MutationObserver | null = null;\n private stylesInjected = false;\n\n constructor(config: ResolvedConfig, api: APIClient, events: EventEmitter) {\n this.config = config;\n this.api = api;\n this.events = events;\n }\n\n /**\n * Initialize the tooltip manager\n */\n async init(): Promise<void> {\n // Inject styles\n if (!this.stylesInjected) {\n injectStyles(document, TOOLTIP_STYLES, 'pillar-tooltip-styles');\n this.stylesInjected = true;\n }\n\n // Initial scan\n await this.scan();\n\n // Set up mutation observer for dynamic content\n this.setupObserver();\n }\n\n /**\n * Scan DOM for tooltip elements and initialize them\n */\n async scan(): Promise<void> {\n const elements = document.querySelectorAll<HTMLElement>(`[${TOOLTIP_ATTRIBUTE}]`);\n\n if (elements.length === 0) return;\n\n // Collect all tooltip IDs\n const tooltipIds = new Set<string>();\n elements.forEach((el) => {\n const id = el.getAttribute(TOOLTIP_ATTRIBUTE);\n if (id && !this.tooltipData.has(id)) {\n tooltipIds.add(id);\n }\n });\n\n // Fetch tooltip data if needed\n if (tooltipIds.size > 0) {\n try {\n const data = await this.api.getTooltips(Array.from(tooltipIds));\n data.forEach((tooltip) => {\n this.tooltipData.set(tooltip.tooltip_id, tooltip);\n });\n } catch (error) {\n console.warn('[Pillar] Failed to fetch tooltip data:', error);\n }\n }\n\n // Initialize tooltips for each element\n elements.forEach((element) => {\n const tooltipId = element.getAttribute(TOOLTIP_ATTRIBUTE);\n if (!tooltipId) return;\n\n // Skip if already initialized\n const existingKey = this.getElementKey(element);\n if (this.tooltips.has(existingKey)) return;\n\n // Get tooltip data\n const data = this.tooltipData.get(tooltipId);\n if (!data) {\n console.warn(`[Pillar] No data found for tooltip: ${tooltipId}`);\n return;\n }\n\n // Create tooltip\n this.createTooltip(element, data);\n });\n }\n\n /**\n * Show a specific tooltip\n */\n show(tooltipId: string): void {\n for (const [key, tooltip] of this.tooltips) {\n const element = document.querySelector(`[data-pillar-tooltip-key=\"${key}\"]`);\n const dataId = element?.getAttribute(TOOLTIP_ATTRIBUTE);\n if (dataId === tooltipId) {\n tooltip.show();\n return;\n }\n }\n }\n\n /**\n * Hide a specific tooltip\n */\n hide(tooltipId: string): void {\n for (const [key, tooltip] of this.tooltips) {\n const element = document.querySelector(`[data-pillar-tooltip-key=\"${key}\"]`);\n const dataId = element?.getAttribute(TOOLTIP_ATTRIBUTE);\n if (dataId === tooltipId) {\n tooltip.hide();\n return;\n }\n }\n }\n\n /**\n * Destroy the tooltip manager\n */\n destroy(): void {\n // Stop observer\n this.observer?.disconnect();\n this.observer = null;\n\n // Destroy all tooltips\n this.tooltips.forEach((tooltip) => tooltip.destroy());\n this.tooltips.clear();\n this.tooltipData.clear();\n\n // Remove styles\n document.getElementById('pillar-tooltip-styles')?.remove();\n this.stylesInjected = false;\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private createTooltip(element: HTMLElement, data: TooltipData): void {\n const trigger =\n (element.getAttribute(TOOLTIP_TRIGGER_ATTR) as TooltipTrigger) ||\n data.trigger ||\n this.config.tooltips.defaultTrigger;\n\n const position =\n (element.getAttribute(TOOLTIP_POSITION_ATTR) as TooltipPosition) ||\n data.position ||\n 'auto';\n\n const tooltip = new Tooltip(data, element, {\n trigger,\n position,\n onLearnMore: () => {\n // Emit event\n this.events.emit('tooltip:click', { tooltipId: data.tooltip_id });\n // Open panel via Pillar instance\n import('../../core/Pillar').then(({ Pillar }) => {\n Pillar.getInstance()?.open();\n });\n },\n onShow: () => {\n this.events.emit('tooltip:shown', { tooltipId: data.tooltip_id });\n },\n onHide: () => {\n this.events.emit('tooltip:hidden', { tooltipId: data.tooltip_id });\n },\n });\n\n tooltip.init();\n this.tooltips.set(this.getElementKey(element), tooltip);\n }\n\n private setupObserver(): void {\n this.observer = new MutationObserver((mutations) => {\n let needsScan = false;\n\n for (const mutation of mutations) {\n // Check added nodes\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement) {\n if (\n node.hasAttribute(TOOLTIP_ATTRIBUTE) ||\n node.querySelector(`[${TOOLTIP_ATTRIBUTE}]`)\n ) {\n needsScan = true;\n break;\n }\n }\n }\n\n // Check removed nodes\n for (const node of mutation.removedNodes) {\n if (node instanceof HTMLElement) {\n this.handleRemovedElement(node);\n }\n }\n\n if (needsScan) break;\n }\n\n if (needsScan) {\n this.scan();\n }\n });\n\n this.observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n private handleRemovedElement(element: HTMLElement): void {\n // Check if this element or any child has a tooltip\n const key = this.getElementKey(element);\n if (this.tooltips.has(key)) {\n this.tooltips.get(key)?.destroy();\n this.tooltips.delete(key);\n }\n\n // Check children\n element.querySelectorAll<HTMLElement>(`[${TOOLTIP_ATTRIBUTE}]`).forEach((child) => {\n const childKey = this.getElementKey(child);\n if (this.tooltips.has(childKey)) {\n this.tooltips.get(childKey)?.destroy();\n this.tooltips.delete(childKey);\n }\n });\n }\n\n private getElementKey(element: HTMLElement): string {\n let key = element.dataset.pillarTooltipKey;\n if (!key) {\n key = `tooltip-${Math.random().toString(36).slice(2, 9)}`;\n element.dataset.pillarTooltipKey = key;\n }\n return key;\n }\n}\n\n","/**\n * Product Context Types for Pillar SDK\n * \n * These types enable context-aware assistance by providing\n * information about what the user is doing in the product.\n */\n\n/**\n * Product context for the assistant.\n * Pass this to help the assistant understand what the user is doing.\n */\nexport interface ProductContext {\n /** Current page path (e.g., \"/settings/billing\") */\n currentPage?: string;\n\n /** Current feature or section (e.g., \"Billing Settings\") */\n currentFeature?: string;\n\n /** User's role in the product (e.g., \"admin\", \"member\") */\n userRole?: string;\n\n /** Current user state or mode (e.g., \"onboarding\", \"trial\") */\n userState?: string;\n\n /** Recent user actions for context */\n recentActions?: string[];\n\n /** Any error state the user is experiencing */\n errorState?: {\n code: string;\n message: string;\n };\n\n /** Custom context data */\n custom?: Record<string, unknown>;\n}\n\n/**\n * User profile for personalization.\n */\nexport interface UserProfile {\n /** User identifier (for conversation continuity) */\n userId?: string;\n\n /** User's name for personalized responses */\n name?: string;\n\n /** User's role/permissions */\n role?: string;\n\n /** Account/organization info */\n accountType?: string;\n\n /** User's experience level */\n experienceLevel?: 'beginner' | 'intermediate' | 'advanced';\n}\n\n/**\n * Suggestion returned from the suggestions API.\n */\nexport interface Suggestion {\n type: 'article' | 'video' | 'tutorial' | 'action';\n id: string;\n title: string;\n description: string;\n relevanceScore: number;\n url?: string;\n}\n\n/**\n * Combined context sent to the backend.\n */\nexport interface AssistantContext {\n product: ProductContext;\n user: UserProfile;\n}\n\n/**\n * Default empty context.\n */\nexport const DEFAULT_PRODUCT_CONTEXT: ProductContext = {\n recentActions: [],\n};\n\nexport const DEFAULT_USER_PROFILE: UserProfile = {};\n\n/**\n * Maximum number of recent actions to track.\n */\nexport const MAX_RECENT_ACTIONS = 10;\n\n","/**\n * Context Store\n * Signal-based state for product context and user profile\n * \n * Phase 3: Product Integration - Context-aware assistance\n */\n\nimport { signal, computed } from '@preact/signals';\nimport type { ProductContext, UserProfile } from '../core/context';\nimport { DEFAULT_PRODUCT_CONTEXT, DEFAULT_USER_PROFILE, MAX_RECENT_ACTIONS } from '../core/context';\n\n// Product context state\nexport const productContext = signal<ProductContext>({ ...DEFAULT_PRODUCT_CONTEXT });\n\n// User profile state\nexport const userProfile = signal<UserProfile>({ ...DEFAULT_USER_PROFILE });\n\n// Computed: has context (more than defaults)\nexport const hasContext = computed(() => {\n const ctx = productContext.value;\n return !!(\n ctx.currentPage ||\n ctx.currentFeature ||\n ctx.userRole ||\n ctx.errorState ||\n (ctx.recentActions && ctx.recentActions.length > 0)\n );\n});\n\n// Computed: has error state\nexport const hasError = computed(() => !!productContext.value.errorState);\n\n// Actions\n\n/**\n * Set the complete product context.\n */\nexport const setProductContext = (context: ProductContext) => {\n productContext.value = {\n ...context,\n recentActions: context.recentActions || [],\n };\n};\n\n/**\n * Update specific product context fields.\n */\nexport const updateContext = (updates: Partial<ProductContext>) => {\n productContext.value = {\n ...productContext.value,\n ...updates,\n };\n};\n\n/**\n * Set user profile.\n */\nexport const setUserProfile = (profile: UserProfile) => {\n userProfile.value = { ...profile };\n};\n\n/**\n * Report a user action.\n */\nexport const reportAction = (action: string) => {\n const recentActions = productContext.value.recentActions || [];\n \n productContext.value = {\n ...productContext.value,\n recentActions: [\n ...recentActions.slice(-(MAX_RECENT_ACTIONS - 1)),\n action,\n ],\n };\n};\n\n/**\n * Set error state.\n */\nexport const setErrorState = (code: string, message: string) => {\n productContext.value = {\n ...productContext.value,\n errorState: { code, message },\n };\n};\n\n/**\n * Clear error state.\n */\nexport const clearErrorState = () => {\n const { errorState: _, ...rest } = productContext.value;\n productContext.value = rest as ProductContext;\n};\n\n/**\n * Get the full assistant context for API calls.\n */\nexport const getAssistantContext = () => ({\n product: productContext.value,\n user_profile: userProfile.value,\n});\n\n/**\n * Reset all context state.\n */\nexport const resetContext = () => {\n productContext.value = { ...DEFAULT_PRODUCT_CONTEXT };\n userProfile.value = { ...DEFAULT_USER_PROFILE };\n};\n\n","/**\n * URL Parameters Utility\n * Handles parsing and managing URL search params for auto-opening the panel\n */\n\nexport interface PillarUrlParams {\n /** Open the panel to home view */\n open?: boolean;\n /** Article slug to open */\n article?: string;\n /** Category slug to open */\n category?: string;\n /** Search query to perform */\n search?: string;\n}\n\nconst DEFAULT_PREFIX = 'pillar-';\n\n/**\n * Parse URL search params for Pillar-specific parameters\n */\nexport function parsePillarUrlParams(prefix: string = DEFAULT_PREFIX): PillarUrlParams {\n if (typeof window === 'undefined' || !window.location) {\n return {};\n }\n\n const searchParams = new URLSearchParams(window.location.search);\n const result: PillarUrlParams = {};\n\n // Check for pillar-open (can be just present or have a value)\n if (searchParams.has(`${prefix}open`)) {\n result.open = true;\n }\n\n // Check for pillar-article\n const article = searchParams.get(`${prefix}article`);\n if (article) {\n result.article = article;\n }\n\n // Also support pillar-article-id as an alias\n const articleId = searchParams.get(`${prefix}article-id`);\n if (articleId && !result.article) {\n result.article = articleId;\n }\n\n // Check for pillar-category\n const category = searchParams.get(`${prefix}category`);\n if (category) {\n result.category = category;\n }\n\n // Check for pillar-search\n const search = searchParams.get(`${prefix}search`);\n if (search) {\n result.search = search;\n }\n\n return result;\n}\n\n/**\n * Check if any Pillar URL params are present\n */\nexport function hasPillarUrlParams(prefix: string = DEFAULT_PREFIX): boolean {\n const params = parsePillarUrlParams(prefix);\n return params.open || !!params.article || !!params.category || !!params.search;\n}\n\n/**\n * Remove Pillar URL params from the current URL\n * Useful for cleaning up after the panel has opened\n */\nexport function clearPillarUrlParams(prefix: string = DEFAULT_PREFIX): void {\n if (typeof window === 'undefined' || !window.location || !window.history) {\n return;\n }\n\n const url = new URL(window.location.href);\n const paramsToRemove = [\n `${prefix}open`,\n `${prefix}article`,\n `${prefix}article-id`,\n `${prefix}category`,\n `${prefix}search`,\n ];\n\n let hasChanges = false;\n for (const param of paramsToRemove) {\n if (url.searchParams.has(param)) {\n url.searchParams.delete(param);\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n window.history.replaceState({}, '', url.toString());\n }\n}\n\n","/**\n * Pillar SDK Configuration Types\n */\nimport type { Platform } from '../actions/types';\n\nexport type PanelPosition = 'left' | 'right';\nexport type PanelMode = 'overlay' | 'push';\nexport type FloatingButtonPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\nexport type FloatingButtonStyle = 'floating' | 'edge';\nexport type TooltipTrigger = 'hover' | 'click' | 'focus' | 'icon';\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right' | 'auto';\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n/**\n * Sidebar tab configuration\n */\nexport interface SidebarTabConfig {\n id: string;\n label: string;\n enabled: boolean;\n order: number;\n}\n\nexport const DEFAULT_SIDEBAR_TABS: SidebarTabConfig[] = [\n { id: 'assistant', label: 'Assistant', enabled: true, order: 0 },\n];\n\n/**\n * Theme color configuration\n * All colors should be valid CSS color values (hex, rgb, hsl, etc.)\n */\nexport interface ThemeColors {\n /** Primary brand color (buttons, links, accents) */\n primary?: string;\n /** Primary color on hover state */\n primaryHover?: string;\n /** Main background color */\n background?: string;\n /** Secondary/subtle background (inputs, cards) */\n backgroundSecondary?: string;\n /** Primary text color */\n text?: string;\n /** Muted/secondary text color */\n textMuted?: string;\n /** Border color */\n border?: string;\n /** Border color for subtle/light borders */\n borderLight?: string;\n}\n\n/**\n * Theme configuration for customizing panel appearance\n */\nexport interface ThemeConfig {\n /** \n * Color mode: 'light', 'dark', or 'auto' (follows system preference)\n * @default 'auto'\n */\n mode?: ThemeMode;\n /** Custom color overrides for light mode */\n colors?: ThemeColors;\n /** Custom color overrides for dark mode (when mode is 'auto' or 'dark') */\n darkColors?: ThemeColors;\n}\n\nexport interface PanelConfig {\n enabled?: boolean;\n position?: PanelPosition;\n /** Panel mode: 'overlay' slides over content, 'push' shifts content aside */\n mode?: PanelMode;\n width?: number;\n /** \n * Custom mount point for the panel.\n * - CSS selector string (e.g., '#pillar-panel')\n * - HTMLElement reference\n * - 'manual' for React component-based mounting\n * - undefined (default) mounts to document.body\n */\n container?: string | HTMLElement | 'manual';\n /**\n * Whether to use Shadow DOM for style isolation.\n * - false (default): Panel renders in regular DOM, inherits host app CSS.\n * Custom cards can use the host app's design system (Tailwind, etc.)\n * - true: Panel renders in Shadow DOM, fully isolated from host CSS.\n * Use this if you need style isolation on third-party sites.\n * @default false\n */\n useShadowDOM?: boolean;\n /**\n * Viewport width below which the panel switches from 'push' mode to 'hover' mode.\n * In hover mode, the panel floats over content instead of pushing it aside.\n * - number: The breakpoint in pixels (default: 1200)\n * - false: Disable responsive behavior, always use push mode\n * @default 1200\n */\n hoverBreakpoint?: number | false;\n /**\n * Whether to show a backdrop overlay when the panel is in hover mode.\n * Only applies when viewport is below hoverBreakpoint.\n * @default true\n */\n hoverBackdrop?: boolean;\n}\n\nexport interface FloatingButtonConfig {\n enabled?: boolean;\n position?: FloatingButtonPosition;\n label?: string;\n /**\n * Button style:\n * - 'edge': Slim vertical tab on screen edge, expands on hover (default)\n * - 'floating': Traditional floating pill button\n * @default 'edge'\n */\n style?: FloatingButtonStyle;\n}\n\nexport interface TooltipsConfig {\n enabled?: boolean;\n defaultTrigger?: TooltipTrigger;\n}\n\nexport interface UrlParamsConfig {\n /** Whether to check URL params for auto-opening the panel (default: true) */\n enabled?: boolean;\n /** Prefix for URL params (default: 'pillar-') */\n prefix?: string;\n /** Whether to clear URL params after opening (default: true) */\n clearAfterOpen?: boolean;\n}\n\nexport interface TextSelectionConfig {\n /** Whether to show \"Ask AI\" popover on text selection (default: true) */\n enabled?: boolean;\n /** Label for the popover button (default: 'Ask AI') */\n label?: string;\n}\n\nexport interface UserContext {\n id?: string;\n persona?: string;\n [key: string]: unknown;\n}\n\nexport interface PillarConfig {\n helpCenter: string;\n publicKey: string;\n \n /**\n * Platform identifier for code-first actions.\n * Used to filter actions by deployment platform.\n * @default 'web'\n */\n platform?: Platform;\n \n /**\n * App version for code-first actions.\n * Used to match actions to the correct deployment version.\n * @example '1.2.3' or git commit SHA\n */\n version?: string;\n \n // Panel settings\n panel?: PanelConfig;\n \n // Floating button\n floatingButton?: FloatingButtonConfig;\n \n // Tooltips\n tooltips?: TooltipsConfig;\n \n // URL params for auto-opening the panel\n urlParams?: UrlParamsConfig;\n \n // Text selection \"Ask AI\" popover\n textSelection?: TextSelectionConfig;\n \n // Sidebar tabs configuration\n sidebarTabs?: SidebarTabConfig[];\n \n // User context for personalization\n context?: {\n page?: string;\n user?: UserContext;\n };\n \n // API base URL (defaults to production)\n apiBaseUrl?: string;\n \n // Theme customization\n theme?: ThemeConfig;\n \n /** \n * Custom CSS to inject into the panel's Shadow DOM.\n * Use public class names (pillar-*) to override default styles.\n * @example\n * ```css\n * .pillar-header { padding: 24px; }\n * .pillar-message-user { border-radius: 8px; }\n * ```\n */\n customCSS?: string;\n \n // Callbacks\n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface ResolvedPanelConfig {\n enabled: boolean;\n position: PanelPosition;\n mode: PanelMode;\n width: number;\n /** Custom mount point - undefined means document.body */\n container?: string | HTMLElement | 'manual';\n /** Whether to use Shadow DOM for style isolation */\n useShadowDOM: boolean;\n /** Viewport width below which panel hovers instead of pushes. false = always push. */\n hoverBreakpoint: number | false;\n /** Whether to show backdrop when in hover mode */\n hoverBackdrop: boolean;\n}\n\nexport interface ResolvedThemeConfig {\n mode: ThemeMode;\n colors: ThemeColors;\n darkColors: ThemeColors;\n}\n\nexport interface ResolvedConfig {\n helpCenter: string;\n publicKey: string;\n apiBaseUrl: string;\n \n /** Platform for code-first actions (default: 'web') */\n platform: Platform;\n /** App version for code-first actions (optional) */\n version?: string;\n \n panel: ResolvedPanelConfig;\n floatingButton: Required<FloatingButtonConfig>;\n tooltips: Required<TooltipsConfig>;\n urlParams: Required<UrlParamsConfig>;\n textSelection: Required<TextSelectionConfig>;\n sidebarTabs: SidebarTabConfig[];\n theme: ResolvedThemeConfig;\n customCSS?: string;\n \n context: {\n page?: string;\n user?: UserContext;\n };\n \n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport const DEFAULT_CONFIG: Omit<ResolvedConfig, 'helpCenter' | 'publicKey'> = {\n apiBaseUrl: 'https://api.trypillar.com',\n platform: 'web',\n \n panel: {\n enabled: true,\n position: 'right',\n mode: 'push',\n width: 380,\n useShadowDOM: false,\n hoverBreakpoint: 1200,\n hoverBackdrop: true,\n },\n \n floatingButton: {\n enabled: true,\n position: 'bottom-right',\n label: 'Assistant',\n style: 'edge',\n },\n \n tooltips: {\n enabled: true,\n defaultTrigger: 'hover',\n },\n \n urlParams: {\n enabled: true,\n prefix: 'pillar-',\n clearAfterOpen: true,\n },\n \n textSelection: {\n enabled: true,\n label: 'Ask AI',\n },\n \n sidebarTabs: DEFAULT_SIDEBAR_TABS,\n \n theme: {\n mode: 'auto',\n colors: {},\n darkColors: {},\n },\n \n context: {},\n};\n\n/**\n * Merge user-provided sidebar tabs with defaults.\n * User tabs override default tabs by id. Assistant tab is always included.\n */\nfunction mergeSidebarTabs(userTabs?: SidebarTabConfig[]): SidebarTabConfig[] {\n if (!userTabs || userTabs.length === 0) {\n return DEFAULT_SIDEBAR_TABS;\n }\n \n // Create a map of user tabs by id\n const tabMap = new Map<string, SidebarTabConfig>();\n \n // Start with defaults\n for (const tab of DEFAULT_SIDEBAR_TABS) {\n tabMap.set(tab.id, { ...tab });\n }\n \n // Override/add with user tabs\n for (const tab of userTabs) {\n tabMap.set(tab.id, { ...tab });\n }\n \n // Ensure assistant tab is always enabled\n const assistantTab = tabMap.get('assistant');\n if (assistantTab) {\n assistantTab.enabled = true;\n }\n \n // Sort by order and return\n return Array.from(tabMap.values()).sort((a, b) => a.order - b.order);\n}\n\nexport function resolveConfig(config: PillarConfig): ResolvedConfig {\n return {\n helpCenter: config.helpCenter,\n publicKey: config.publicKey,\n apiBaseUrl: config.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl,\n platform: config.platform || 'web',\n version: config.version,\n \n panel: {\n ...DEFAULT_CONFIG.panel,\n ...config.panel,\n },\n \n floatingButton: {\n ...DEFAULT_CONFIG.floatingButton,\n ...config.floatingButton,\n },\n \n tooltips: {\n ...DEFAULT_CONFIG.tooltips,\n ...config.tooltips,\n },\n \n urlParams: {\n ...DEFAULT_CONFIG.urlParams,\n ...config.urlParams,\n },\n \n textSelection: {\n ...DEFAULT_CONFIG.textSelection,\n ...config.textSelection,\n },\n \n // Merge sidebar tabs: user tabs override defaults by id\n sidebarTabs: mergeSidebarTabs(config.sidebarTabs),\n \n theme: {\n mode: config.theme?.mode ?? DEFAULT_CONFIG.theme.mode,\n colors: { ...config.theme?.colors },\n darkColors: { ...config.theme?.darkColors },\n },\n \n customCSS: config.customCSS,\n \n context: config.context || {},\n \n onReady: config.onReady,\n onError: config.onError,\n };\n}\n\n/**\n * Server embed config type (matches backend response)\n */\nexport interface ServerEmbedConfig {\n panel?: {\n enabled?: boolean;\n position?: 'left' | 'right';\n width?: number;\n };\n floatingButton?: {\n enabled?: boolean;\n position?: string;\n label?: string;\n };\n features?: {\n aiChatEnabled?: boolean;\n searchEnabled?: boolean;\n tooltipsEnabled?: boolean;\n };\n sidebarTabs?: SidebarTabConfig[];\n theme?: {\n colors?: {\n primary?: string;\n };\n };\n}\n\n/**\n * Merge server config with local config.\n * \n * Priority: DEFAULT_CONFIG < serverConfig < localConfig\n * \n * Server values fill in gaps (admin-configured defaults),\n * but local config (passed to Pillar.init()) always wins.\n * \n * @param localConfig - Config passed to Pillar.init()\n * @param serverConfig - Config fetched from /api/public/products/{subdomain}/embed-config/\n * @returns Merged config with server values filling in gaps\n */\nexport function mergeServerConfig(\n localConfig: PillarConfig,\n serverConfig: ServerEmbedConfig | null\n): PillarConfig {\n if (!serverConfig) {\n return localConfig;\n }\n \n const merged: PillarConfig = { ...localConfig };\n \n // Panel: server provides defaults, local overrides\n if (serverConfig.panel) {\n merged.panel = {\n ...serverConfig.panel,\n ...localConfig.panel,\n };\n }\n \n // Floating button: server provides defaults, local overrides\n if (serverConfig.floatingButton) {\n merged.floatingButton = {\n ...serverConfig.floatingButton,\n ...localConfig.floatingButton,\n } as FloatingButtonConfig;\n }\n \n // Sidebar tabs: use server tabs if local not specified\n // If local specifies tabs, those take priority\n if (serverConfig.sidebarTabs && !localConfig.sidebarTabs) {\n merged.sidebarTabs = serverConfig.sidebarTabs;\n }\n \n // Theme: merge colors from server if local doesn't specify\n if (serverConfig.theme?.colors?.primary) {\n merged.theme = {\n ...merged.theme,\n colors: {\n primary: localConfig.theme?.colors?.primary ?? serverConfig.theme.colors.primary,\n ...localConfig.theme?.colors,\n },\n };\n }\n \n // Features could map to tooltips enabled, etc.\n // Currently we don't have a direct mapping, but this is where\n // serverConfig.features would be applied if needed\n \n return merged;\n}\n\n","/**\n * Simple EventEmitter for SDK events\n */\n\nimport type { ResolvedThemeConfig } from './config';\nimport type { ProductContext, UserProfile } from './context';\nimport type { ExecutionPlan, ExecutionStep } from './plan';\nimport type { Workflow, WorkflowStep } from './workflow';\n\nexport type EventCallback<T = unknown> = (data: T) => void;\n\n/**\n * Task execution payload - sent when a task button is clicked.\n */\nexport interface TaskExecutePayload {\n /** Database UUID for the task (used for confirmation) */\n id?: string;\n /** Task unique identifier (e.g., 'invite_team_member') */\n name: string;\n /** Task data payload */\n data: Record<string, unknown>;\n /** Task type hint */\n taskType?: 'navigate' | 'open_modal' | 'fill_form' | 'trigger_action' | 'copy_text' | 'external_link' | 'start_tutorial' | 'inline_ui';\n /** Path template for navigate type (already resolved with params) */\n path?: string;\n /** External URL for external_link type */\n externalUrl?: string;\n}\n\n/**\n * Callbacks provided to custom card renderers.\n */\nexport interface CardCallbacks {\n /** Called when user confirms the action. Pass modified data if needed. */\n onConfirm: (modifiedData?: Record<string, unknown>) => void;\n /** Called when user cancels the action */\n onCancel: () => void;\n /** Called to report card state changes (for analytics/confirmation) */\n onStateChange?: (state: 'loading' | 'success' | 'error', message?: string) => void;\n}\n\n/**\n * Card field schema definition for declarative card configuration.\n */\nexport interface CardFieldSchema {\n /** Field name/key */\n name: string;\n /** Display label */\n label: string;\n /** Field type */\n type: 'text' | 'number' | 'email' | 'select' | 'multiselect' | 'checkbox' | 'textarea' | 'date' | 'hidden';\n /** Whether field is required */\n required?: boolean;\n /** Default value */\n defaultValue?: unknown;\n /** Placeholder text */\n placeholder?: string;\n /** Help text shown below field */\n helpText?: string;\n /** Options for select/multiselect types */\n options?: Array<{ value: string; label: string }>;\n /** Validation rules */\n validation?: {\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n patternMessage?: string;\n };\n}\n\n/**\n * Enhanced card registration options.\n */\nexport interface CardRegistrationOptions {\n /** Card type identifier (e.g., 'add_to_deal', 'invite_member') */\n cardType: string;\n /** Human-readable card title */\n title?: string;\n /** Card description */\n description?: string;\n /** Schema defining form fields (for auto-generated forms) */\n schema?: CardFieldSchema[];\n /** Custom renderer function (overrides schema-based rendering) */\n renderer?: CardRenderer;\n /** Theme/styling options */\n theme?: {\n variant?: 'default' | 'compact' | 'wide';\n confirmLabel?: string;\n cancelLabel?: string;\n };\n}\n\n/**\n * Registered card with metadata.\n */\nexport interface RegisteredCard {\n cardType: string;\n options: CardRegistrationOptions;\n renderer?: CardRenderer;\n}\n\n/**\n * Card renderer function signature.\n * Customers register these to render custom confirmation cards.\n * \n * @param container - DOM element to render the card into\n * @param data - Action data including extracted values from AI\n * @param callbacks - Callbacks for confirm/cancel actions\n * @returns Optional cleanup function called when card is unmounted\n */\nexport type CardRenderer = (\n container: HTMLElement,\n data: Record<string, unknown>,\n callbacks: CardCallbacks\n) => (() => void) | void;\n\nexport interface PillarEvents {\n 'ready': void;\n 'error': Error;\n 'panel:open': void;\n 'panel:close': void;\n 'panel:navigate': { view: string; params?: Record<string, string> };\n 'tooltip:shown': { tooltipId: string };\n 'tooltip:hidden': { tooltipId: string };\n 'tooltip:click': { tooltipId: string };\n 'article:view': { articleSlug: string };\n 'search:query': { query: string };\n 'chat:message': { message: string };\n 'textSelection:shown': { text: string };\n 'textSelection:click': { text: string };\n // Context events\n 'context:change': { context: ProductContext };\n 'profile:change': { profile: UserProfile };\n 'action:report': { action: string; metadata?: Record<string, unknown> };\n // Query action events - for actions that return data to the agent\n 'action:result': { actionName: string; result: unknown };\n // Task events - for AI-suggested actions\n 'task:execute': TaskExecutePayload;\n 'task:complete': { id?: string; name: string; success: boolean; data?: Record<string, unknown> };\n\n // Workflow events - for multi-step sequences\n 'workflow:start': Workflow;\n 'workflow:step:active': { workflow: Workflow; step: WorkflowStep };\n 'workflow:step:complete': { workflow: Workflow; step: WorkflowStep; success: boolean };\n 'workflow:step:skip': { workflow: Workflow; step: WorkflowStep };\n 'workflow:complete': Workflow;\n 'workflow:cancel': Workflow;\n\n // Plan events - for server-generated multi-step plans\n 'plan:start': ExecutionPlan;\n 'plan:step:active': { plan: ExecutionPlan; step: ExecutionStep };\n 'plan:step:confirm': { plan: ExecutionPlan; step: ExecutionStep };\n 'plan:step:complete': { plan: ExecutionPlan; step: ExecutionStep; success: boolean };\n 'plan:step:skip': { plan: ExecutionPlan; step: ExecutionStep };\n 'plan:step:retry': { plan: ExecutionPlan; step: ExecutionStep; retryCount: number };\n 'plan:step:failed': { plan: ExecutionPlan; step: ExecutionStep; error: Error; canRetry?: boolean };\n 'plan:updated': ExecutionPlan;\n 'plan:complete': ExecutionPlan;\n 'plan:cancel': ExecutionPlan;\n 'plan:error': { plan: ExecutionPlan; error: Error };\n\n // Theme events\n 'theme:change': { theme: ResolvedThemeConfig };\n\n // Text selection feature toggle\n 'textSelection:change': { enabled: boolean };\n}\n\nexport class EventEmitter {\n private listeners: Map<string, Set<EventCallback>> = new Map();\n\n on<K extends keyof PillarEvents>(\n event: K,\n callback: EventCallback<PillarEvents[K]>\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n \n this.listeners.get(event)!.add(callback as EventCallback);\n \n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n off<K extends keyof PillarEvents>(\n event: K,\n callback: EventCallback<PillarEvents[K]>\n ): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.delete(callback as EventCallback);\n }\n }\n\n emit<K extends keyof PillarEvents>(\n event: K,\n data?: PillarEvents[K]\n ): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`[Pillar] Error in event handler for \"${event}\":`, error);\n }\n });\n }\n }\n\n removeAllListeners(event?: keyof PillarEvents): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n}\n","/**\n * Plan Persistence Module\n *\n * Handles localStorage persistence for active execution plans.\n * Enables plan recovery when the page is refreshed or the user\n * navigates away and returns.\n */\n\nimport type { ExecutionPlan } from '../core/plan';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst STORAGE_KEY = 'pillar:active_plan';\nconst STORAGE_VERSION = 1;\n\n/**\n * Stored plan data with metadata.\n */\ninterface StoredPlanData {\n version: number;\n plan: ExecutionPlan;\n siteId: string;\n storedAt: string;\n}\n\n// ============================================================================\n// Persistence Functions\n// ============================================================================\n\n/**\n * Save the active plan to localStorage.\n *\n * @param plan - The plan to persist\n * @param siteId - The site ID for scoping\n */\nexport function savePlan(plan: ExecutionPlan, siteId: string): void {\n if (!plan || !siteId) return;\n\n // Only save active plans (not completed/cancelled/failed)\n const activeStatuses = ['planning', 'ready', 'executing', 'awaiting_start', 'awaiting_input', 'awaiting_result'];\n if (!activeStatuses.includes(plan.status)) {\n // Clear instead of saving\n clearSavedPlan(siteId);\n return;\n }\n\n try {\n const data: StoredPlanData = {\n version: STORAGE_VERSION,\n plan,\n siteId,\n storedAt: new Date().toISOString(),\n };\n\n const key = getStorageKey(siteId);\n localStorage.setItem(key, JSON.stringify(data));\n\n console.log(`[PlanPersistence] Saved plan ${plan.id} to localStorage`);\n } catch (error) {\n console.warn('[PlanPersistence] Failed to save plan:', error);\n }\n}\n\n/**\n * Load a saved plan from localStorage.\n *\n * @param siteId - The site ID for scoping\n * @returns The saved plan or null if not found/invalid\n */\nexport function loadSavedPlan(siteId: string): ExecutionPlan | null {\n if (!siteId) return null;\n\n try {\n const key = getStorageKey(siteId);\n const stored = localStorage.getItem(key);\n\n if (!stored) return null;\n\n const data: StoredPlanData = JSON.parse(stored);\n\n // Version check\n if (data.version !== STORAGE_VERSION) {\n console.warn('[PlanPersistence] Stored plan has incompatible version, clearing');\n clearSavedPlan(siteId);\n return null;\n }\n\n // Site ID check\n if (data.siteId !== siteId) {\n console.warn('[PlanPersistence] Stored plan is for different site, clearing');\n clearSavedPlan(siteId);\n return null;\n }\n\n // Check if plan has timed out\n const storedAt = new Date(data.storedAt);\n const now = new Date();\n const timeoutMinutes = data.plan.timeout_minutes || 30;\n const ageMinutes = (now.getTime() - storedAt.getTime()) / (1000 * 60);\n\n if (ageMinutes > timeoutMinutes) {\n console.warn(\n `[PlanPersistence] Stored plan has timed out (${Math.round(ageMinutes)} minutes old, timeout: ${timeoutMinutes} minutes)`\n );\n clearSavedPlan(siteId);\n return null;\n }\n\n console.log(`[PlanPersistence] Loaded plan ${data.plan.id} from localStorage`);\n return data.plan;\n } catch (error) {\n console.warn('[PlanPersistence] Failed to load plan:', error);\n clearSavedPlan(siteId);\n return null;\n }\n}\n\n/**\n * Clear any saved plan from localStorage.\n *\n * @param siteId - The site ID for scoping\n */\nexport function clearSavedPlan(siteId: string): void {\n if (!siteId) return;\n\n try {\n const key = getStorageKey(siteId);\n localStorage.removeItem(key);\n console.log('[PlanPersistence] Cleared saved plan');\n } catch (error) {\n console.warn('[PlanPersistence] Failed to clear plan:', error);\n }\n}\n\n/**\n * Check if there's a saved plan without loading it.\n *\n * @param siteId - The site ID for scoping\n * @returns true if a plan exists\n */\nexport function hasSavedPlan(siteId: string): boolean {\n if (!siteId) return false;\n\n try {\n const key = getStorageKey(siteId);\n return localStorage.getItem(key) !== null;\n } catch {\n return false;\n }\n}\n\n/**\n * Get metadata about the saved plan without full deserialization.\n *\n * @param siteId - The site ID for scoping\n * @returns Plan metadata or null\n */\nexport function getSavedPlanMetadata(\n siteId: string\n): { planId: string; goal: string; storedAt: string; status: string } | null {\n if (!siteId) return null;\n\n try {\n const key = getStorageKey(siteId);\n const stored = localStorage.getItem(key);\n\n if (!stored) return null;\n\n const data: StoredPlanData = JSON.parse(stored);\n\n return {\n planId: data.plan.id,\n goal: data.plan.goal,\n storedAt: data.storedAt,\n status: data.plan.status,\n };\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Get the storage key scoped to a site.\n */\nfunction getStorageKey(siteId: string): string {\n return `${STORAGE_KEY}:${siteId}`;\n}\n","/**\n * PlanExecutor - Orchestrates execution of multi-step plans.\n *\n * Manages the execution lifecycle of server-generated execution plans:\n * - Receives plans from streaming events\n * - Executes steps using registered action handlers\n * - Sends results back to server when needed\n * - Handles user confirmations and cancellations\n * - Emits events for UI updates\n */\n\nimport type { ExecutionPlan, ExecutionStep } from './plan';\nimport type { EventEmitter } from './events';\nimport type { MCPClient } from '../api/mcp-client';\nimport { getActionDefinition, getHandler, hasAction } from '../actions/registry';\nimport {\n activePlan,\n updatePlan,\n updatePlanStep,\n clearPlan,\n setPlan,\n} from '../store/plan';\nimport {\n savePlan,\n loadSavedPlan,\n clearSavedPlan,\n} from '../store/plan-persistence';\n\nexport class PlanExecutor {\n private mcpClient: MCPClient;\n private events: EventEmitter;\n private siteId: string;\n\n constructor(mcpClient: MCPClient, events: EventEmitter, siteId: string) {\n this.mcpClient = mcpClient;\n this.events = events;\n this.siteId = siteId;\n }\n\n /**\n * Receive a new plan and start execution if auto_execute.\n *\n * Called when the ReAct agent creates a plan via the create_plan tool.\n */\n async handlePlanReceived(plan: ExecutionPlan): Promise<void> {\n console.log(\n `[PlanExecutor] Received plan: ${plan.id}, auto_execute=${plan.auto_execute}, status=${plan.status}`\n );\n\n setPlan(plan);\n this.persistPlan(plan);\n\n if (plan.auto_execute && plan.status === 'executing') {\n this.events.emit('plan:start', plan);\n await this.executeNextStep();\n }\n // If auto_execute=false (status='awaiting_start'), wait for startPlan() call\n }\n\n /**\n * Attempt to recover an active plan from localStorage.\n *\n * Called during SDK initialization to resume plans after page refresh.\n * Fetches latest state from server to ensure consistency.\n *\n * @returns The recovered plan or null if none found/invalid\n */\n async recoverPlan(): Promise<ExecutionPlan | null> {\n const savedPlan = loadSavedPlan(this.siteId);\n if (!savedPlan) {\n console.log('[PlanExecutor] No saved plan found');\n return null;\n }\n\n console.log(`[PlanExecutor] Found saved plan ${savedPlan.id}, fetching latest state from server`);\n\n try {\n // Fetch latest state from server\n const response = await this.mcpClient.getPlan(savedPlan.id);\n const latestPlan = response.plan;\n\n // Check if plan is still active\n const activeStatuses = ['planning', 'ready', 'executing', 'awaiting_start', 'awaiting_input', 'awaiting_result'];\n if (!activeStatuses.includes(latestPlan.status)) {\n console.log(\n `[PlanExecutor] Plan ${latestPlan.id} is no longer active (status: ${latestPlan.status}), clearing`\n );\n clearSavedPlan(this.siteId);\n return null;\n }\n\n // Restore the plan\n setPlan(latestPlan);\n this.events.emit('plan:updated', latestPlan);\n\n console.log(`[PlanExecutor] Recovered plan ${latestPlan.id} with status ${latestPlan.status}`);\n\n // If plan was executing, continue\n if (latestPlan.status === 'executing') {\n await this.executeNextStep();\n }\n\n return latestPlan;\n } catch (error) {\n console.error('[PlanExecutor] Failed to recover plan from server:', error);\n // Clear the stale saved plan\n clearSavedPlan(this.siteId);\n return null;\n }\n }\n\n /**\n * Persist the current plan to localStorage.\n */\n private persistPlan(plan: ExecutionPlan): void {\n savePlan(plan, this.siteId);\n }\n\n /**\n * User clicks \"Start Plan\" for plans with auto_execute=false.\n */\n async startPlan(): Promise<void> {\n const plan = activePlan.value;\n if (!plan) {\n console.warn('[PlanExecutor] No active plan to start');\n return;\n }\n\n if (plan.status !== 'awaiting_start') {\n console.warn(\n `[PlanExecutor] Plan ${plan.id} is not in awaiting_start status`\n );\n return;\n }\n\n try {\n const response = await this.mcpClient.startPlan(plan.id);\n updatePlan(response.plan);\n this.events.emit('plan:start', response.plan);\n await this.executeNextStep();\n } catch (error) {\n console.error('[PlanExecutor] Failed to start plan:', error);\n this.events.emit('plan:error', {\n plan,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Execute the next ready step.\n */\n private async executeNextStep(): Promise<void> {\n const plan = activePlan.value;\n if (!plan) return;\n\n // Find next step to execute - look for 'ready' status first\n let step = plan.steps.find((s) => s.status === 'ready');\n\n // If no ready step, check for steps awaiting confirmation\n if (!step) {\n step = plan.steps.find(\n (s) => s.status === 'awaiting_confirmation' && s.requires_user_confirmation\n );\n }\n\n if (!step) {\n // No more steps to execute - check if plan is complete\n const allDone = plan.steps.every(\n (s) =>\n s.status === 'completed' ||\n s.status === 'skipped' ||\n s.status === 'failed'\n );\n\n if (allDone) {\n console.log(`[PlanExecutor] Plan ${plan.id} complete`);\n this.events.emit('plan:complete', plan);\n clearPlan();\n clearSavedPlan(this.siteId);\n }\n return;\n }\n\n // If step needs confirmation, wait for user\n if (step.requires_user_confirmation && step.status !== 'awaiting_confirmation') {\n updatePlanStep(step.id, { status: 'awaiting_confirmation' });\n this.events.emit('plan:step:confirm', { plan: activePlan.value!, step });\n return;\n }\n\n // If step is awaiting confirmation, wait for confirmStep()\n if (step.status === 'awaiting_confirmation') {\n return;\n }\n\n // Execute the step\n await this.executeStep(step);\n }\n\n /**\n * User confirms a step requiring confirmation.\n *\n * @param stepId - UUID of the step to confirm\n * @param modifiedData - Optional modified data from user input\n */\n async confirmStep(\n stepId: string,\n modifiedData?: Record<string, unknown>\n ): Promise<void> {\n const plan = activePlan.value;\n if (!plan) return;\n\n const step = plan.steps.find((s) => s.id === stepId);\n if (!step) {\n console.warn(`[PlanExecutor] Step ${stepId} not found`);\n return;\n }\n\n // Merge modified data if provided\n if (modifiedData) {\n updatePlanStep(stepId, {\n action_data: { ...step.action_data, ...modifiedData },\n });\n }\n\n // Get the updated step\n const updatedPlan = activePlan.value;\n const updatedStep = updatedPlan?.steps.find((s) => s.id === stepId);\n if (!updatedStep) return;\n\n await this.executeStep(updatedStep);\n }\n\n /**\n * User skips a step.\n *\n * @param stepId - UUID of the step to skip\n */\n async skipStep(stepId: string): Promise<void> {\n const plan = activePlan.value;\n if (!plan) return;\n\n const step = plan.steps.find((s) => s.id === stepId);\n if (!step) {\n console.warn(`[PlanExecutor] Step ${stepId} not found`);\n return;\n }\n\n try {\n // Notify server about skip\n const response = await this.mcpClient.skipStep(plan.id, stepId);\n updatePlan(response.plan);\n this.events.emit('plan:step:skip', { plan: response.plan, step });\n\n // Continue to next step\n await this.executeNextStep();\n } catch (error) {\n console.error('[PlanExecutor] Failed to skip step:', error);\n // Update locally even if server call fails\n updatePlanStep(stepId, { status: 'skipped' });\n this.events.emit('plan:step:skip', { plan: activePlan.value!, step });\n await this.executeNextStep();\n }\n }\n\n /**\n * Retry a failed step.\n *\n * @param stepId - UUID of the step to retry\n */\n async retryStep(stepId: string): Promise<void> {\n const plan = activePlan.value;\n if (!plan) return;\n\n const step = plan.steps.find((s) => s.id === stepId);\n if (!step) {\n console.warn(`[PlanExecutor] Step ${stepId} not found`);\n return;\n }\n\n if (!step.is_retriable) {\n console.warn(`[PlanExecutor] Step ${stepId} is not retriable`);\n return;\n }\n\n if (step.retry_count >= step.max_retries) {\n console.warn(\n `[PlanExecutor] Step ${stepId} has exceeded max retries (${step.retry_count}/${step.max_retries})`\n );\n return;\n }\n\n try {\n // Notify server about retry\n const response = await this.mcpClient.retryStep(plan.id, stepId);\n updatePlan(response.plan);\n\n const updatedStep = response.plan.steps.find((s) => s.id === stepId);\n this.events.emit('plan:step:retry', {\n plan: response.plan,\n step: updatedStep || step,\n retryCount: updatedStep?.retry_count || step.retry_count + 1,\n });\n\n // Execute the step again\n await this.executeNextStep();\n } catch (error) {\n console.error('[PlanExecutor] Failed to retry step:', error);\n this.events.emit('plan:error', {\n plan: activePlan.value!,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Cancel the active plan.\n */\n async cancel(): Promise<void> {\n const plan = activePlan.value;\n if (!plan) {\n console.warn('[PlanExecutor] No active plan to cancel');\n return;\n }\n\n try {\n const response = await this.mcpClient.cancelPlan(plan.id);\n updatePlan(response.plan);\n this.events.emit('plan:cancel', response.plan);\n clearPlan(true);\n clearSavedPlan(this.siteId);\n } catch (error) {\n console.error('[PlanExecutor] Failed to cancel plan:', error);\n // Still clear locally even if server call fails\n this.events.emit('plan:cancel', plan);\n clearPlan(true);\n clearSavedPlan(this.siteId);\n }\n }\n\n /**\n * Complete a plan step by action name.\n * \n * Used by host apps when a wizard/flow completes (e.g., after user finishes\n * adding a knowledge source). The step must be in 'awaiting_result' status.\n * \n * @param actionName - The action name (e.g., 'add_new_source')\n * @param success - Whether the action completed successfully\n * @param data - Optional result data\n */\n async completeStepByAction(\n actionName: string,\n success: boolean = true,\n data?: Record<string, unknown>\n ): Promise<void> {\n const plan = activePlan.value;\n if (!plan) {\n console.warn('[PlanExecutor] No active plan');\n return;\n }\n\n // Find the step by action name that's awaiting result\n const step = plan.steps.find(\n (s) => s.action_name === actionName && s.status === 'awaiting_result'\n );\n\n if (!step) {\n console.warn(\n `[PlanExecutor] No awaiting step found for action: ${actionName}`\n );\n return;\n }\n\n console.log(\n `[PlanExecutor] Completing step ${step.index} (${actionName}) via callback`\n );\n\n if (success) {\n await this.markStepComplete(step.id, data);\n } else {\n // Mark step failed\n updatePlanStep(step.id, { status: 'failed', result: { error: 'Action failed by host app' } });\n\n this.events.emit('plan:step:failed', {\n plan: activePlan.value!,\n step: activePlan.value!.steps.find((s) => s.id === step.id)!,\n error: new Error('Action failed by host app'),\n canRetry: step.is_retriable,\n });\n }\n }\n\n /**\n * Mark a step as done by step ID.\n * \n * Called by UI when user clicks \"Done\" button for a wizard step.\n * The step must be in 'awaiting_result' status.\n * \n * @param stepId - UUID of the step to mark done\n */\n async markStepDone(stepId: string): Promise<void> {\n const plan = activePlan.value;\n if (!plan) {\n console.warn('[PlanExecutor] No active plan');\n return;\n }\n\n const step = plan.steps.find((s) => s.id === stepId);\n if (!step) {\n console.warn(`[PlanExecutor] Step ${stepId} not found`);\n return;\n }\n\n if (step.status !== 'awaiting_result') {\n console.warn(`[PlanExecutor] Step ${stepId} is not awaiting result (status: ${step.status})`);\n return;\n }\n\n console.log(`[PlanExecutor] Marking step ${step.index} as done via UI button`);\n await this.markStepComplete(stepId);\n }\n\n /**\n * Internal helper to mark a step complete and advance to next.\n */\n private async markStepComplete(stepId: string, data?: Record<string, unknown>): Promise<void> {\n updatePlanStep(stepId, { status: 'completed', result: data });\n\n const updatedPlan = activePlan.value!;\n const updatedStep = updatedPlan.steps.find((s) => s.id === stepId)!;\n\n this.events.emit('plan:step:complete', {\n plan: updatedPlan,\n step: updatedStep,\n success: true,\n });\n\n await this.executeNextStep();\n }\n\n /**\n * Execute a single step.\n */\n private async executeStep(step: ExecutionStep): Promise<void> {\n const plan = activePlan.value;\n if (!plan) return;\n\n console.log(\n `[PlanExecutor] Executing step ${step.index}: ${step.action_name}`\n );\n\n updatePlanStep(step.id, { status: 'executing' });\n this.events.emit('plan:step:active', { plan: activePlan.value!, step });\n\n try {\n // Get handler and definition from action registry\n const actionDefinition = hasAction(step.action_name) ? getActionDefinition(step.action_name) : undefined;\n const handler = actionDefinition?.handler;\n \n let result: unknown = undefined;\n \n if (handler) {\n // Use registered handler from defineActions()\n result = await handler(step.action_data);\n \n // If action returns data, send it back to the agent\n if (actionDefinition?.returns && result !== undefined) {\n const { default: Pillar } = await import('./Pillar');\n const pillar = Pillar.getInstance();\n if (pillar) {\n pillar.sendActionResult(step.action_name, result);\n }\n }\n } else {\n // Use Pillar's executeTask which routes through registered onTask handlers\n // and has proper fallback handling (using host app's router instead of hard reload)\n const { default: Pillar } = await import('./Pillar');\n const pillar = Pillar.getInstance();\n \n if (pillar) {\n const actionType = (step as unknown as { action_type?: string }).action_type as \n 'navigate' | 'open_modal' | 'fill_form' | 'trigger_action' | 'copy_text' | 'external_link' | 'start_tutorial' | 'inline_ui' | undefined;\n const path = step.action_data?.path as string | undefined;\n const externalUrl = step.action_data?.url as string | undefined;\n \n console.log(`[PlanExecutor] Executing via Pillar.executeTask: ${step.action_name}`);\n \n // executeTask will look for registered handlers (onTask) and use built-in fallbacks\n pillar.executeTask({\n id: step.id,\n name: step.action_name,\n taskType: actionType,\n path,\n externalUrl,\n data: step.action_data || {},\n });\n \n result = { executed: true, action: step.action_name };\n } else {\n throw new Error(`No handler for action: ${step.action_name} (Pillar not initialized)`);\n }\n }\n\n // If requires_result_feedback, send to server for analysis\n if (step.requires_result_feedback) {\n console.log(\n `[PlanExecutor] Sending step ${step.index} result to server`\n );\n const response = await this.mcpClient.continuePlan(\n plan.id,\n step.id,\n result\n );\n updatePlan(response.plan);\n this.events.emit('plan:updated', response.plan);\n } else if (step.auto_complete) {\n // Mark step complete locally and advance\n updatePlanStep(step.id, { status: 'completed', result });\n \n // Get the updated step for the event\n const updatedPlan = activePlan.value;\n const updatedStep = updatedPlan?.steps.find((s) => s.id === step.id);\n\n this.events.emit('plan:step:complete', {\n plan: updatedPlan!,\n step: updatedStep || step,\n success: true,\n });\n\n // Continue to next step\n await this.executeNextStep();\n } else {\n // Step has auto_complete=false - wait for host app to call completePlanStep()\n // This is used for wizard actions that require user to complete a flow\n console.log(`[PlanExecutor] Step ${step.index} awaiting callback (auto_complete=false)`);\n updatePlanStep(step.id, { status: 'awaiting_result', result });\n this.events.emit('plan:step:active', { plan: activePlan.value!, step });\n // Don't advance - wait for completePlanStep() or confirmPlanStep() to be called\n }\n } catch (error) {\n console.error(\n `[PlanExecutor] Step ${step.index} failed:`,\n error\n );\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n // Notify server about failure\n try {\n const response = await this.mcpClient.failStep(plan.id, step.id, errorMessage);\n updatePlan(response.plan);\n } catch (serverError) {\n console.error('[PlanExecutor] Failed to notify server of step failure:', serverError);\n // Update locally even if server call fails\n updatePlanStep(step.id, {\n status: 'failed',\n error_message: errorMessage,\n });\n }\n\n const updatedPlan = activePlan.value;\n const updatedStep = updatedPlan?.steps.find((s) => s.id === step.id);\n const canRetry = updatedStep\n ? updatedStep.is_retriable && updatedStep.retry_count < updatedStep.max_retries\n : step.is_retriable && step.retry_count < step.max_retries;\n\n // Emit failed event with retry info\n this.events.emit('plan:step:failed', {\n plan: updatedPlan!,\n step: updatedStep || step,\n error: error instanceof Error ? error : new Error(String(error)),\n canRetry,\n });\n\n this.events.emit('plan:step:complete', {\n plan: updatedPlan!,\n step: updatedStep || step,\n success: false,\n });\n\n // Only emit plan error if we can't retry\n if (!canRetry) {\n this.events.emit('plan:error', {\n plan: updatedPlan!,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n }\n\n /**\n * Get the current active plan.\n */\n getActivePlan(): ExecutionPlan | null {\n return activePlan.value;\n }\n}\n","/**\n * Main Pillar SDK Class\n * Entry point for all SDK functionality\n */\n\nimport { getActionDefinition, getHandler, hasAction, setClientInfo } from '../actions';\nimport { APIClient } from '../api/client';\nimport { MCPClient } from '../api/mcp-client';\nimport { EdgeTrigger } from '../components/Button/EdgeTrigger';\nimport { FloatingButton } from '../components/Button/FloatingButton';\nimport { Panel } from '../components/Panel/Panel';\nimport { TextSelectionManager } from '../components/TextSelection/TextSelectionManager';\nimport { TooltipManager } from '../components/Tooltips/TooltipManager';\nimport { resetChat } from '../store/chat';\nimport {\n resetContext,\n clearErrorState as storeClearErrorState,\n reportAction as storeReportAction,\n setErrorState as storeSetErrorState,\n setProductContext as storeSetProductContext,\n setUserProfile as storeSetUserProfile,\n updateContext as storeUpdateContext,\n} from '../store/context';\nimport {\n isHoverMode,\n isOpen as panelIsOpen,\n resetPanel\n} from '../store/panel';\nimport {\n activePlan,\n resetPlanStore,\n} from '../store/plan';\nimport {\n resetRouter\n} from '../store/router';\nimport {\n activeWorkflow,\n advanceToNextStep,\n resetWorkflow,\n cancelWorkflow as storeCancelWorkflow,\n completeWorkflow as storeCompleteWorkflow,\n startWorkflow as storeStartWorkflow,\n updateStepStatus\n} from '../store/workflow';\nimport { domReady } from '../utils/dom';\nimport { clearPillarUrlParams, parsePillarUrlParams } from '../utils/urlParams';\nimport { resolveConfig, mergeServerConfig, type PillarConfig, type ResolvedConfig, type ThemeConfig } from './config';\nimport {\n DEFAULT_PRODUCT_CONTEXT,\n DEFAULT_USER_PROFILE,\n MAX_RECENT_ACTIONS,\n type ProductContext,\n type Suggestion,\n type UserProfile,\n} from './context';\nimport { EventEmitter, type CardRenderer, type PillarEvents, type TaskExecutePayload } from './events';\nimport type { ExecutionPlan } from './plan';\nimport { PlanExecutor } from './plan-executor';\nimport type { Workflow, WorkflowStep } from './workflow';\n\nexport type PillarState = 'uninitialized' | 'initializing' | 'ready' | 'error';\n\nexport class Pillar {\n private static instance: Pillar | null = null;\n\n private _state: PillarState = 'uninitialized';\n private _config: ResolvedConfig | null = null;\n private _events: EventEmitter;\n private _api: APIClient | null = null;\n private _mcpClient: MCPClient | null = null;\n private _planExecutor: PlanExecutor | null = null;\n private _tooltipManager: TooltipManager | null = null;\n private _textSelectionManager: TextSelectionManager | null = null;\n private _panel: Panel | null = null;\n private _floatingButton: FloatingButton | EdgeTrigger | null = null;\n private _initPromise: Promise<void> | null = null;\n private _rootContainer: HTMLElement | null = null;\n private _unsubscribeHoverMode: (() => void) | null = null;\n\n // Product context state\n private _productContext: ProductContext = { ...DEFAULT_PRODUCT_CONTEXT };\n private _userProfile: UserProfile = { ...DEFAULT_USER_PROFILE };\n\n // Task handlers\n private _taskHandlers: Map<string, (data: Record<string, unknown>) => void> = new Map();\n private _anyTaskHandler: ((name: string, data: Record<string, unknown>) => void) | null = null;\n\n // Card renderers for inline_ui type actions\n private _cardRenderers: Map<string, CardRenderer> = new Map();\n\n constructor() {\n this._events = new EventEmitter();\n }\n\n /**\n * Create or get the shared root container for all Pillar UI elements.\n * Uses isolation: isolate to create a new stacking context.\n * Z-index changes based on hover mode (999 in hover mode, -1 in push mode).\n */\n private _createRootContainer(): HTMLElement {\n // Check if container already exists\n let container = document.getElementById('pillar-root');\n if (container) {\n // Subscribe to hover mode changes to update z-index\n this._subscribeToHoverModeForRoot(container);\n return container;\n }\n\n // Create new container\n container = document.createElement('div');\n container.id = 'pillar-root';\n // Initial z-index based on current hover mode\n const initialZIndex = isHoverMode.value ? '20' : '-1';\n container.style.cssText = `isolation: isolate; z-index: ${initialZIndex}; position: relative;`;\n document.body.appendChild(container);\n \n // Subscribe to hover mode changes to update z-index\n this._subscribeToHoverModeForRoot(container);\n \n return container;\n }\n\n /**\n * Subscribe to hover mode changes and update root container z-index.\n */\n private _subscribeToHoverModeForRoot(container: HTMLElement): void {\n // Clean up existing subscription if any\n this._unsubscribeHoverMode?.();\n\n this._unsubscribeHoverMode = isHoverMode.subscribe((inHoverMode) => {\n // Use z-index 999 in hover mode to integrate with page,\n // -1 in push mode since panel handles its own stacking\n container.style.zIndex = inHoverMode ? '20' : '-1';\n });\n }\n\n // ============================================================================\n // Static Methods\n // ============================================================================\n\n /**\n * Initialize the Pillar SDK\n */\n static async init(config: PillarConfig): Promise<Pillar> {\n if (!config.helpCenter || !config.publicKey) {\n throw new Error('[Pillar] helpCenter and publicKey are required');\n }\n\n // Create singleton if doesn't exist\n if (!Pillar.instance) {\n Pillar.instance = new Pillar();\n }\n\n await Pillar.instance._init(config);\n return Pillar.instance;\n }\n\n /**\n * Get the current Pillar instance\n */\n static getInstance(): Pillar | null {\n return Pillar.instance;\n }\n\n /**\n * Destroy the Pillar instance\n */\n static destroy(): void {\n if (Pillar.instance) {\n Pillar.instance._destroy();\n Pillar.instance = null;\n }\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Current SDK state\n */\n get state(): PillarState {\n return this._state;\n }\n\n /**\n * Whether SDK is ready\n */\n get isReady(): boolean {\n return this._state === 'ready';\n }\n\n /**\n * Whether the panel is currently open\n */\n get isPanelOpen(): boolean {\n return panelIsOpen.value;\n }\n\n /**\n * Get the resolved configuration\n */\n get config(): ResolvedConfig | null {\n return this._config;\n }\n\n /**\n * Subscribe to SDK events\n */\n on<K extends keyof PillarEvents>(\n event: K,\n callback: (data: PillarEvents[K]) => void\n ): () => void {\n return this._events.on(event, callback);\n }\n\n /**\n * Open the help panel\n */\n open(options?: { view?: string; article?: string; search?: string; focusInput?: boolean }): void {\n if (!this._panel) return;\n\n this._panel.open(options);\n this._events.emit('panel:open');\n }\n\n /**\n * Close the help panel\n */\n close(): void {\n if (!this._panel) return;\n\n this._panel.close();\n this._events.emit('panel:close');\n }\n\n /**\n * Toggle the help panel\n */\n toggle(): void {\n if (this.isPanelOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Navigate to a specific view in the panel\n */\n navigate(view: string, params?: Record<string, string>): void {\n this._panel?.navigate(view, params);\n this._events.emit('panel:navigate', { view, params });\n }\n\n /**\n * Update the user context\n */\n setContext(context: ResolvedConfig['context']): void {\n if (this._config) {\n this._config.context = { ...this._config.context, ...context };\n }\n }\n\n /**\n * Update the theme at runtime.\n * Use this to sync with your app's theme (e.g., dark mode toggle).\n * \n * @param theme - Partial theme config to merge with current theme\n * \n * @example\n * // Switch to dark mode\n * pillar.setTheme({ mode: 'dark' });\n * \n * // Switch to light mode with custom primary color\n * pillar.setTheme({ mode: 'light', colors: { primary: '#ff0000' } });\n * \n * // Let system preference decide\n * pillar.setTheme({ mode: 'auto' });\n */\n setTheme(theme: Partial<ThemeConfig>): void {\n if (!this._config) return;\n\n // Update config\n this._config.theme = {\n ...this._config.theme,\n ...theme,\n mode: theme.mode ?? this._config.theme.mode,\n colors: { ...this._config.theme.colors, ...theme.colors },\n darkColors: { ...this._config.theme.darkColors, ...theme.darkColors },\n };\n\n // Update panel theme\n this._panel?.setTheme(this._config.theme);\n\n // Emit event\n this._events.emit('theme:change', { theme: this._config.theme });\n }\n\n /**\n * Enable or disable the text selection \"Ask AI\" popover at runtime.\n * \n * @param enabled - Whether to show the popover when text is selected\n * \n * @example\n * // Disable text selection popover\n * pillar.setTextSelectionEnabled(false);\n * \n * // Re-enable it\n * pillar.setTextSelectionEnabled(true);\n */\n setTextSelectionEnabled(enabled: boolean): void {\n if (!this._config) return;\n\n const wasEnabled = this._config.textSelection.enabled;\n\n // No change needed\n if (wasEnabled === enabled) return;\n\n // Update config\n this._config.textSelection.enabled = enabled;\n\n if (enabled) {\n // Enable: initialize manager if panel is enabled\n if (this._config.panel.enabled && !this._textSelectionManager) {\n this._textSelectionManager = new TextSelectionManager(\n this._config,\n this._events,\n () => this.open()\n );\n this._textSelectionManager.init();\n }\n } else {\n // Disable: destroy manager if exists\n if (this._textSelectionManager) {\n this._textSelectionManager.destroy();\n this._textSelectionManager = null;\n }\n }\n\n // Emit event\n this._events.emit('textSelection:change', { enabled });\n }\n\n /**\n * Manually trigger tooltip scan\n */\n scanTooltips(): void {\n this._tooltipManager?.scan();\n }\n\n /**\n * Show a specific tooltip\n */\n showTooltip(tooltipId: string): void {\n this._tooltipManager?.show(tooltipId);\n }\n\n /**\n * Hide a specific tooltip\n */\n hideTooltip(tooltipId: string): void {\n this._tooltipManager?.hide(tooltipId);\n }\n\n /**\n * Mount the panel to a specific container element.\n * Used for manual mounting mode (e.g., from React component).\n */\n mountPanelTo(container: HTMLElement): void {\n this._panel?.mountTo(container);\n }\n\n /**\n * Get the panel host element for external mounting\n */\n getPanelHostElement(): HTMLElement | null {\n return this._panel?.getHostElement() ?? null;\n }\n\n // ============================================================================\n // Product Context API\n // ============================================================================\n\n /**\n * Get the current product context\n */\n get productContext(): ProductContext {\n return { ...this._productContext };\n }\n\n /**\n * Get the current user profile\n */\n get userProfile(): UserProfile {\n return { ...this._userProfile };\n }\n\n /**\n * Set the complete product context.\n * Use this when navigating to a new page or starting a new session.\n */\n setProductContext(context: ProductContext): void {\n this._productContext = {\n ...context,\n recentActions: context.recentActions || [],\n };\n // Sync to store for components\n storeSetProductContext(this._productContext);\n this._events.emit('context:change', { context: this._productContext });\n }\n\n /**\n * Update specific product context fields without replacing the entire context.\n * Use this for incremental updates like tracking actions.\n */\n updateContext(updates: Partial<ProductContext>): void {\n this._productContext = {\n ...this._productContext,\n ...updates,\n };\n // Sync to store for components\n storeUpdateContext(updates);\n this._events.emit('context:change', { context: this._productContext });\n }\n\n /**\n * Set the user profile for personalization.\n */\n setUserProfile(profile: UserProfile): void {\n this._userProfile = { ...profile };\n // Sync to store for components\n storeSetUserProfile(this._userProfile);\n this._events.emit('profile:change', { profile: this._userProfile });\n }\n\n /**\n * Report a user action for context building.\n * Recent actions are tracked and sent with chat requests for better context.\n * \n * @param action - Description of the action (e.g., \"clicked_upgrade\", \"viewed_invoice\")\n * @param metadata - Optional metadata about the action\n */\n reportAction(action: string, metadata?: Record<string, unknown>): void {\n const recentActions = this._productContext.recentActions || [];\n \n // Keep only the most recent actions\n const updatedActions = [\n ...recentActions.slice(-(MAX_RECENT_ACTIONS - 1)),\n action,\n ];\n\n this._productContext = {\n ...this._productContext,\n recentActions: updatedActions,\n };\n\n // Sync to store for components\n storeReportAction(action);\n this._events.emit('action:report', { action, metadata });\n }\n\n /**\n * Clear any error state from the context.\n */\n clearErrorState(): void {\n if (this._productContext.errorState) {\n const { errorState: _, ...rest } = this._productContext;\n this._productContext = rest as ProductContext;\n // Sync to store for components\n storeClearErrorState();\n this._events.emit('context:change', { context: this._productContext });\n }\n }\n\n /**\n * Set an error state in the context.\n * The assistant will use this to provide relevant troubleshooting help.\n */\n setErrorState(code: string, message: string): void {\n this._productContext = {\n ...this._productContext,\n errorState: { code, message },\n };\n // Sync to store for components\n storeSetErrorState(code, message);\n this._events.emit('context:change', { context: this._productContext });\n }\n\n /**\n * Get contextual help suggestions based on current product context.\n * Returns relevant articles, videos, and actions.\n */\n async getSuggestions(): Promise<Suggestion[]> {\n if (!this._api) {\n console.warn('[Pillar] SDK not initialized, cannot get suggestions');\n return [];\n }\n\n try {\n return await this._api.getSuggestions(this._productContext, this._userProfile);\n } catch (error) {\n console.error('[Pillar] Failed to get suggestions:', error);\n return [];\n }\n }\n\n /**\n * Get the full context object to send to the backend.\n * Used internally by the API client.\n */\n getAssistantContext(): { product: ProductContext; user: UserProfile } {\n return {\n product: this._productContext,\n user: this._userProfile,\n };\n }\n\n // ============================================================================\n // Task API - AI-suggested actions\n // ============================================================================\n\n /**\n * Register a handler for a specific task.\n * Called when the AI suggests a task and the user clicks it.\n * \n * @param taskName - The task identifier (e.g., 'invite_team_member')\n * @param handler - Function to handle the task execution\n * @returns Unsubscribe function\n * \n * @example\n * pillar.onTask('invite_team_member', (data) => {\n * openInviteModal(data);\n * });\n */\n onTask(taskName: string, handler: (data: Record<string, unknown>) => void): () => void {\n this._taskHandlers.set(taskName, handler);\n return () => this._taskHandlers.delete(taskName);\n }\n\n /**\n * Register a catch-all handler for any task.\n * Useful for logging, analytics, or handling unknown tasks.\n * \n * @param handler - Function called with task name and data\n * @returns Unsubscribe function\n * \n * @example\n * pillar.onAnyTask((name, data) => {\n * analytics.track('task_executed', { name, data });\n * });\n */\n onAnyTask(handler: (name: string, data: Record<string, unknown>) => void): () => void {\n this._anyTaskHandler = handler;\n return () => { this._anyTaskHandler = null; };\n }\n\n /**\n * Remove a task handler.\n * \n * @param taskName - The task identifier to stop handling\n */\n offTask(taskName: string): void {\n this._taskHandlers.delete(taskName);\n }\n\n /**\n * Execute a task programmatically.\n * This is called internally by the widget when a user clicks a task button.\n * Can also be called directly if you want to trigger a task.\n * \n * @param payload - Task execution payload\n */\n executeTask(payload: TaskExecutePayload): void {\n const { name, data, taskType, path, externalUrl } = payload;\n\n // Emit the event for external listeners\n this._events.emit('task:execute', payload);\n\n // Call the any-task handler if registered\n if (this._anyTaskHandler) {\n try {\n this._anyTaskHandler(name, data);\n } catch (error) {\n console.error(`[Pillar] Error in onAnyTask handler:`, error);\n }\n }\n\n // Look for handlers in this order:\n // 1. Code-first action registry (via defineActions)\n // 2. Specific handler by action name (via onTask)\n // 3. Generic handler by task type (e.g., \"navigate\")\n // 4. Built-in handlers as fallback\n const actionDefinition = hasAction(name) ? getActionDefinition(name) : undefined;\n const registryHandler = actionDefinition?.handler;\n const specificHandler = this._taskHandlers.get(name);\n const typeHandler = taskType ? this._taskHandlers.get(taskType) : undefined;\n const handler = registryHandler || specificHandler || typeHandler;\n\n if (handler) {\n try {\n // Merge path into data for navigate handlers\n const handlerData = taskType === 'navigate' && path \n ? { ...data, path } \n : data;\n const result = handler(handlerData);\n \n // If action returns data, send it back to the agent\n if (actionDefinition?.returns && result !== undefined) {\n // Handle both sync and async handlers\n Promise.resolve(result).then((resolvedResult) => {\n if (resolvedResult !== undefined) {\n this.sendActionResult(name, resolvedResult);\n }\n }).catch((error) => {\n console.error(`[Pillar] Error in query action \"${name}\":`, error);\n });\n }\n \n this._events.emit('task:complete', { name, success: true, data });\n } catch (error) {\n console.error(`[Pillar] Error executing task \"${name}\":`, error);\n this._events.emit('task:complete', { name, success: false, data });\n }\n } else {\n // Handle built-in task types if no custom handler\n switch (taskType) {\n case 'navigate':\n if (path && typeof window !== 'undefined') {\n // Fallback to hard redirect only if no handler was registered\n console.warn(`[Pillar] No 'navigate' handler registered. Using window.location.href as fallback.`);\n window.location.href = path;\n this._events.emit('task:complete', { name, success: true, data });\n }\n break;\n case 'external_link':\n if (externalUrl && typeof window !== 'undefined') {\n window.open(externalUrl, '_blank', 'noopener,noreferrer');\n this._events.emit('task:complete', { name, success: true, data });\n }\n break;\n case 'copy_text':\n if (data.text && typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(String(data.text)).then(() => {\n this._events.emit('task:complete', { name, success: true, data });\n }).catch(() => {\n this._events.emit('task:complete', { name, success: false, data });\n });\n }\n break;\n default:\n console.warn(`[Pillar] No handler registered for task \"${name}\". Register one with pillar.onTask('${name}', handler) or defineActions()`);\n // Emit failure for unhandled tasks\n this._events.emit('task:complete', { name, success: false, data: { error: 'No handler registered' } });\n }\n }\n }\n\n /**\n * Mark a task as complete.\n * Call this after your task handler finishes successfully.\n * \n * @param taskName - The task identifier\n * @param success - Whether the task completed successfully\n * @param data - Optional result data\n */\n completeTask(taskName: string, success: boolean = true, data?: Record<string, unknown>): void {\n this._events.emit('task:complete', { name: taskName, success, data });\n }\n\n /**\n * Confirm task execution result.\n * Call this after your task handler completes to report success/failure\n * back to Pillar for implementation status tracking.\n * \n * @param taskId - The database UUID of the task (from task:execute event)\n * @param status - 'success' or 'failure'\n * @param details - Optional execution details\n * \n * @example\n * pillar.on('task:execute', async (task) => {\n * const startTime = Date.now();\n * try {\n * await performAction(task);\n * pillar.confirmTaskExecution(task.id, 'success', {\n * duration_ms: Date.now() - startTime,\n * });\n * } catch (error) {\n * pillar.confirmTaskExecution(task.id, 'failure', {\n * error: error.message,\n * duration_ms: Date.now() - startTime,\n * });\n * }\n * });\n */\n confirmTaskExecution(\n taskId: string,\n status: 'success' | 'failure',\n details?: {\n error?: string;\n duration_ms?: number;\n [key: string]: unknown;\n }\n ): void {\n if (!taskId) {\n console.warn('[Pillar] confirmTaskExecution called without taskId');\n return;\n }\n\n if (!this._api) {\n console.warn('[Pillar] SDK not initialized, cannot confirm task execution');\n return;\n }\n\n // Fire-and-forget - don't block on response\n this._api.confirmTaskExecution(taskId, status, details);\n }\n\n // ============================================================================\n // Card Renderer API - Custom confirmation cards\n // ============================================================================\n\n /**\n * Register a custom card renderer for inline_ui type actions.\n * \n * When the AI returns an action with action_type: 'inline_ui' and\n * a card_type in its data, the SDK will look for a registered renderer\n * and call it to render the inline UI card.\n * \n * @param cardType - The card type identifier (e.g., 'invite_members')\n * @param renderer - Function that renders the card into a container\n * @returns Unsubscribe function\n * \n * @example\n * // Vanilla JS\n * pillar.registerCard('invite_members', (container, data, callbacks) => {\n * container.innerHTML = `\n * <div class=\"invite-card\">\n * <h3>Invite Team Members</h3>\n * ${data.emails.map(e => `<div>${e}</div>`).join('')}\n * <button id=\"confirm\">Send Invites</button>\n * </div>\n * `;\n * container.querySelector('#confirm').onclick = callbacks.onConfirm;\n * return () => container.innerHTML = ''; // cleanup\n * });\n */\n registerCard(cardType: string, renderer: CardRenderer): () => void {\n this._cardRenderers.set(cardType, renderer);\n return () => this._cardRenderers.delete(cardType);\n }\n\n /**\n * Get a registered card renderer by type.\n * Returns undefined if no renderer is registered for the given type.\n * \n * @param cardType - The card type identifier\n */\n getCardRenderer(cardType: string): CardRenderer | undefined {\n return this._cardRenderers.get(cardType);\n }\n\n /**\n * Check if a card renderer is registered for a given type.\n * \n * @param cardType - The card type identifier\n */\n hasCardRenderer(cardType: string): boolean {\n return this._cardRenderers.has(cardType);\n }\n\n // ============================================================================\n // Workflow API - Multi-step action sequences\n // ============================================================================\n\n /**\n * Get the active workflow, if any.\n */\n get workflow(): Workflow | null {\n return activeWorkflow.value;\n }\n\n /**\n * Start a workflow.\n * Called when the AI returns a workflow in its response.\n * \n * @param workflow - The workflow to start\n */\n startWorkflow(workflow: Workflow): void {\n storeStartWorkflow(workflow);\n this._events.emit('workflow:start', activeWorkflow.value!);\n\n // Auto-execute first step if it has auto_run enabled\n const firstStep = activeWorkflow.value!.steps[0];\n if (firstStep.auto_run) {\n this._executeWorkflowStep(firstStep);\n }\n // Otherwise, UI shows \"Start\" button\n }\n\n /**\n * Initiate a workflow step that requires user confirmation.\n * Called when user clicks \"Start\" on a step with auto_run=false.\n * \n * @param stepIndex - Optional step index (defaults to current)\n */\n initiateWorkflowStep(stepIndex?: number): void {\n const workflow = activeWorkflow.value;\n if (!workflow) {\n console.warn('[Pillar] No active workflow');\n return;\n }\n\n const idx = stepIndex ?? workflow.current_step;\n const step = workflow.steps[idx];\n\n if (!step) {\n console.warn(`[Pillar] Invalid step index: ${idx}`);\n return;\n }\n\n if (step.status !== 'awaiting_initiation') {\n console.warn(`[Pillar] Step ${idx} is not awaiting initiation`);\n return;\n }\n\n this._executeWorkflowStep(step);\n }\n\n /**\n * Confirm a workflow step as complete.\n * Called by the host app after the action is done.\n * Automatically advances to the next step.\n * \n * @param success - Whether the step completed successfully\n * @param stepIndex - Optional step index (defaults to current)\n */\n confirmWorkflowStep(success: boolean, stepIndex?: number): void {\n const workflow = activeWorkflow.value;\n if (!workflow) return;\n\n const idx = stepIndex ?? workflow.current_step;\n const step = workflow.steps[idx];\n\n // Update step status\n updateStepStatus(idx, success ? 'completed' : 'failed');\n this._events.emit('workflow:step:complete', {\n workflow: activeWorkflow.value!,\n step: activeWorkflow.value!.steps[idx],\n success,\n });\n\n if (!success) {\n // Don't advance on failure\n return;\n }\n\n // Try to advance to next step\n const nextStep = advanceToNextStep();\n\n if (!nextStep) {\n // Workflow complete\n this._events.emit('workflow:complete', activeWorkflow.value!);\n storeCompleteWorkflow();\n return;\n }\n\n this._events.emit('workflow:step:active', {\n workflow: activeWorkflow.value!,\n step: nextStep,\n });\n\n // Auto-execute next step if it has auto_run enabled\n if (nextStep.auto_run) {\n this._executeWorkflowStep(nextStep);\n }\n // Otherwise, UI shows \"Start\" button for next step\n }\n\n /**\n * Skip a workflow step.\n * \n * @param stepIndex - Optional step index (defaults to current)\n */\n skipWorkflowStep(stepIndex?: number): void {\n const workflow = activeWorkflow.value;\n if (!workflow) return;\n\n const idx = stepIndex ?? workflow.current_step;\n const step = workflow.steps[idx];\n\n updateStepStatus(idx, 'skipped');\n this._events.emit('workflow:step:skip', {\n workflow: activeWorkflow.value!,\n step: activeWorkflow.value!.steps[idx],\n });\n\n // Advance to next step\n const nextStep = advanceToNextStep();\n\n if (!nextStep) {\n // Workflow complete\n this._events.emit('workflow:complete', activeWorkflow.value!);\n storeCompleteWorkflow();\n return;\n }\n\n this._events.emit('workflow:step:active', {\n workflow: activeWorkflow.value!,\n step: nextStep,\n });\n\n // Auto-execute next step if it has auto_run enabled\n if (nextStep.auto_run) {\n this._executeWorkflowStep(nextStep);\n }\n }\n\n /**\n * Cancel the active workflow.\n */\n cancelWorkflow(): void {\n const workflow = activeWorkflow.value;\n if (!workflow) return;\n\n this._events.emit('workflow:cancel', workflow);\n storeCancelWorkflow();\n }\n\n /**\n * Execute a workflow step.\n * Internal method that runs the task and handles auto_complete.\n */\n private _executeWorkflowStep(step: WorkflowStep): void {\n updateStepStatus(step.index, 'active');\n\n // Execute the task\n this.executeTask({\n id: step.task_id,\n name: step.task_name,\n taskType: step.task_type,\n data: step.data,\n path: step.data?.path as string | undefined,\n externalUrl: step.data?.url as string | undefined,\n });\n\n // If auto_complete, immediately confirm\n if (step.auto_complete) {\n // Use setTimeout to allow the UI to update\n setTimeout(() => {\n this.confirmWorkflowStep(true, step.index);\n }, 100);\n }\n // Otherwise, wait for host app to call confirmWorkflowStep()\n }\n\n // ============================================================================\n // Plan API - Server-generated multi-step execution plans\n // ============================================================================\n\n /**\n * Get the active execution plan, if any.\n */\n get activePlan(): ExecutionPlan | null {\n return activePlan.value;\n }\n\n /**\n * Handle a plan received from the AI streaming response.\n * Called when the ReAct agent creates a plan via the create_plan tool.\n *\n * @param plan - The execution plan from the server\n */\n handlePlanReceived(plan: ExecutionPlan): void {\n this._planExecutor?.handlePlanReceived(plan);\n }\n\n /**\n * Start a plan that was waiting for user confirmation.\n * For plans with auto_execute=false, the user must explicitly start execution.\n */\n async startPlan(): Promise<void> {\n await this._planExecutor?.startPlan();\n }\n\n /**\n * Confirm a plan step requiring confirmation.\n *\n * @param stepId - UUID of the step to confirm\n * @param data - Optional modified data from user input\n */\n async confirmPlanStep(stepId: string, data?: Record<string, unknown>): Promise<void> {\n await this._planExecutor?.confirmStep(stepId, data);\n }\n\n /**\n * Skip a plan step.\n *\n * @param stepId - UUID of the step to skip\n */\n async skipPlanStep(stepId: string): Promise<void> {\n await this._planExecutor?.skipStep(stepId);\n }\n\n /**\n * Retry a failed step in the active plan.\n *\n * @param stepId - UUID of the step to retry\n */\n async retryPlanStep(stepId: string): Promise<void> {\n await this._planExecutor?.retryStep(stepId);\n }\n\n /**\n * Cancel the active plan.\n */\n async cancelPlan(): Promise<void> {\n await this._planExecutor?.cancel();\n }\n\n /**\n * Complete a plan step by action name.\n * \n * Use this when the host app completes a wizard or flow that was started\n * by a plan step. The plan will advance to the next step.\n * \n * @param actionName - The action name (e.g., 'add_new_source')\n * @param success - Whether the action completed successfully (default: true)\n * @param data - Optional result data\n * \n * @example\n * // In your source creation success handler:\n * pillar.completePlanStepByAction('add_new_source');\n */\n async completePlanStepByAction(\n actionName: string,\n success: boolean = true,\n data?: Record<string, unknown>\n ): Promise<void> {\n await this._planExecutor?.completeStepByAction(actionName, success, data);\n }\n\n /**\n * Mark a plan step as done by step ID.\n * \n * Use this when the UI \"Done\" button is clicked for a wizard step.\n * The step must be in 'awaiting_result' status.\n * \n * @param stepId - UUID of the step to mark as done\n */\n async markPlanStepDone(stepId: string): Promise<void> {\n await this._planExecutor?.markStepDone(stepId);\n }\n\n // ============================================================================\n // Query Action API - Actions that return data to the agent\n // ============================================================================\n\n /**\n * Send action result back to the agent.\n * \n * Called automatically for actions with `returns: true` after their\n * handler completes. The result is sent to the agent for further reasoning.\n * \n * @param actionName - The name of the action that was executed\n * @param result - The result data to send back to the agent\n * @internal\n */\n sendActionResult(actionName: string, result: unknown): void {\n if (!this._mcpClient) {\n console.warn('[Pillar] SDK not initialized, cannot send action result');\n return;\n }\n\n this._mcpClient.sendActionResult(actionName, result);\n this._events.emit('action:result', { actionName, result });\n }\n\n // ============================================================================\n // Internal Methods\n // ============================================================================\n\n /**\n * Internal initialization\n */\n private async _init(config: PillarConfig): Promise<void> {\n // If already initializing, wait for it to complete\n if (this._state === 'initializing' && this._initPromise) {\n console.log('[Pillar] Already initializing, waiting for completion');\n await this._initPromise;\n return;\n }\n\n if (this._state === 'ready') {\n console.log('[Pillar] Already initialized');\n return;\n }\n\n this._state = 'initializing';\n\n // Create and store the init promise so other callers can wait\n this._initPromise = this._doInit(config);\n await this._initPromise;\n }\n\n /**\n * Actual initialization logic\n */\n private async _doInit(config: PillarConfig): Promise<void> {\n try {\n // Wait for DOM to be ready\n await domReady();\n\n // Create temporary API client to fetch server config\n // We need a minimal resolved config for the API client\n const tempConfig = resolveConfig(config);\n const tempApi = new APIClient(tempConfig);\n \n // Fetch server-side embed config (admin-configured settings)\n // This allows admins to change SDK behavior without requiring\n // customers to update their integration code\n const serverConfig = await tempApi.fetchEmbedConfig().catch((error) => {\n console.warn('[Pillar] Failed to fetch server config, using local config only:', error);\n return null;\n });\n \n // Merge configs with priority: DEFAULT_CONFIG < serverConfig < localConfig\n // Local config (passed to Pillar.init) always wins\n const mergedConfig = mergeServerConfig(config, serverConfig);\n \n // Resolve the merged configuration\n this._config = resolveConfig(mergedConfig);\n\n // Set client info for action registry (used for manifest generation)\n if (this._config.platform && this._config.version) {\n setClientInfo(this._config.platform, this._config.version);\n }\n\n // Initialize API client with the final merged config\n this._api = new APIClient(this._config);\n\n // Initialize MCP client and PlanExecutor for multi-step plans\n this._mcpClient = new MCPClient(this._config);\n this._planExecutor = new PlanExecutor(\n this._mcpClient,\n this._events,\n this._config.helpCenter // Use helpCenter (Pillar slug) for plan persistence - unique across all sites\n );\n\n // Create shared root container for all Pillar UI elements\n // Uses isolation: isolate to create a new stacking context\n this._rootContainer = this._createRootContainer();\n\n // Initialize tooltips if enabled\n if (this._config.tooltips.enabled) {\n this._tooltipManager = new TooltipManager(this._config, this._api, this._events);\n await this._tooltipManager.init();\n }\n\n // Initialize panel if enabled\n if (this._config.panel.enabled) {\n this._panel = new Panel(this._config, this._api, this._events, this._rootContainer);\n await this._panel.init();\n }\n\n // Initialize floating button if enabled\n if (this._config.floatingButton.enabled) {\n // Choose button style based on config\n if (this._config.floatingButton.style === 'edge') {\n this._floatingButton = new EdgeTrigger(this._config, () => this.toggle(), this._rootContainer);\n } else {\n this._floatingButton = new FloatingButton(this._config, () => this.toggle());\n }\n this._floatingButton.init();\n }\n\n // Initialize text selection \"Ask AI\" popover if enabled\n if (this._config.textSelection.enabled && this._config.panel.enabled) {\n this._textSelectionManager = new TextSelectionManager(\n this._config,\n this._events,\n () => this.open()\n );\n this._textSelectionManager.init();\n }\n\n this._state = 'ready';\n this._events.emit('ready');\n this._config.onReady?.();\n\n console.log('[Pillar] SDK initialized successfully');\n\n // Attempt to recover any active plan from localStorage\n await this._planExecutor?.recoverPlan();\n\n // Check URL params for auto-opening\n if (this._config.urlParams.enabled) {\n await this._handleUrlParams();\n }\n } catch (error) {\n this._state = 'error';\n const err = error instanceof Error ? error : new Error(String(error));\n this._events.emit('error', err);\n this._config?.onError?.(err);\n console.error('[Pillar] Failed to initialize:', error);\n throw error;\n }\n }\n\n /**\n * Handle URL parameters for auto-opening the panel\n */\n private async _handleUrlParams(): Promise<void> {\n if (!this._config) return;\n\n const params = parsePillarUrlParams(this._config.urlParams.prefix);\n\n // Check for open param\n if (params.open) {\n this.open();\n } else {\n // No relevant params found\n return;\n }\n\n // Clear URL params after opening if configured\n if (this._config.urlParams.clearAfterOpen) {\n clearPillarUrlParams(this._config.urlParams.prefix);\n }\n }\n\n /**\n * Internal cleanup\n */\n private _destroy(): void {\n this._tooltipManager?.destroy();\n this._textSelectionManager?.destroy();\n this._panel?.destroy();\n this._floatingButton?.destroy();\n this._api?.cancelAllRequests();\n this._events.removeAllListeners();\n\n // Clean up hover mode subscription\n this._unsubscribeHoverMode?.();\n this._unsubscribeHoverMode = null;\n\n // Remove root container\n this._rootContainer?.remove();\n this._rootContainer = null;\n\n // Reset all stores\n resetPanel();\n resetRouter();\n resetChat();\n resetContext();\n resetWorkflow();\n resetPlanStore();\n\n // Reset internal context state\n this._productContext = { ...DEFAULT_PRODUCT_CONTEXT };\n this._userProfile = { ...DEFAULT_USER_PROFILE };\n\n // Clear task handlers\n this._taskHandlers.clear();\n this._anyTaskHandler = null;\n\n this._tooltipManager = null;\n this._textSelectionManager = null;\n this._panel = null;\n this._floatingButton = null;\n this._api = null;\n this._mcpClient = null;\n this._planExecutor = null;\n this._config = null;\n this._state = 'uninitialized';\n\n console.log('[Pillar] SDK destroyed');\n }\n}\n\n// Export for script tag usage\nexport default Pillar;\n","/**\n * Pillar SDK - Embedded Help for Your Application\n *\n * @example\n * // Script tag usage\n * <script src=\"https://cdn.trypillar.com/sdk/pillar.min.js\"></script>\n * <script>\n * Pillar.init({\n * helpCenter: 'your-help-center',\n * publicKey: 'pk_live_xxx',\n * });\n * </script>\n *\n * @example\n * // ES Module usage\n * import { Pillar } from '@pillar-ai/sdk';\n *\n * await Pillar.init({\n * helpCenter: 'your-help-center',\n * publicKey: 'pk_live_xxx',\n * });\n */\n\n// Core\nexport { Pillar, type PillarState } from './core/Pillar';\nexport { EventEmitter, type PillarEvents, type TaskExecutePayload, type CardRenderer, type CardCallbacks } from './core/events';\n\n// Configuration\nexport {\n type PillarConfig,\n type ResolvedConfig,\n type ResolvedPanelConfig,\n type PanelConfig,\n type FloatingButtonConfig,\n type TooltipsConfig,\n type UrlParamsConfig,\n type TextSelectionConfig,\n type UserContext,\n type PanelPosition,\n type PanelMode,\n type FloatingButtonPosition,\n type FloatingButtonStyle,\n type TooltipTrigger,\n type TooltipPosition,\n type ThemeMode,\n type ThemeColors,\n type ThemeConfig,\n type ResolvedThemeConfig,\n type SidebarTabConfig,\n DEFAULT_SIDEBAR_TABS,\n} from './core/config';\n\n// Context types\nexport {\n type ProductContext,\n type UserProfile,\n type Suggestion,\n type AssistantContext,\n} from './core/context';\n\n// Plan types (multi-step execution plans)\nexport {\n type PlanStatus,\n type StepStatus,\n type ExecutionLocation,\n type ExecutionPlan,\n type ExecutionStep,\n type PlanEvents,\n} from './core/plan';\n\n// Actions (code-first action definitions)\nexport {\n defineActions,\n setClientInfo,\n getClientInfo,\n getHandler,\n getActionDefinition,\n hasAction,\n getActionNames,\n getManifest,\n clearRegistry,\n getActionCount,\n type ActionType,\n type ActionDataSchema,\n type ActionDefinition,\n type ActionDefinitions,\n type ActionManifest,\n type ActionManifestEntry,\n type ClientInfo,\n type Platform,\n type SyncActionDefinition,\n type SyncActionDefinitions,\n // Type utilities for typed onTask\n type ActionTypeDataMap,\n type NavigateActionData,\n type TriggerActionData,\n type InlineUIData,\n type ExternalLinkData,\n type CopyTextData,\n type ActionDataType,\n type ActionNames,\n type TypedTaskHandler,\n type TypedOnTask,\n type TypedPillarMethods,\n} from './actions';\n\n// API\nexport {\n APIClient,\n type TooltipData,\n type ArticleData,\n type ArticleSummary,\n type ChatMessage,\n type ChatResponse,\n type ProgressEvent,\n} from './api/client';\n\n// MCP Client types (for image upload)\nexport {\n type ChatImage,\n type ImageUploadResponse,\n} from './api/mcp-client';\n\n// Auto-initialization for script tags\nimport { Pillar } from './core/Pillar';\n\n// Check for auto-init configuration in script tag\nif (typeof window !== 'undefined') {\n // Make Pillar available globally for script tag usage\n (window as unknown as { Pillar: typeof Pillar }).Pillar = Pillar;\n\n // Support auto-initialization via data attributes\n const autoInit = () => {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script) {\n const helpCenter = script.dataset.helpCenter;\n const publicKey = script.dataset.publicKey;\n\n if (helpCenter && publicKey) {\n Pillar.init({ helpCenter, publicKey }).catch(console.error);\n }\n }\n };\n\n // Run auto-init when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', autoInit);\n } else {\n // Script is being executed after DOM is ready (async/defer)\n // Try to find the script tag by searching for one with our data attributes\n const scripts = document.querySelectorAll('script[data-help-center][data-public-key]');\n if (scripts.length > 0) {\n const script = scripts[scripts.length - 1] as HTMLScriptElement;\n const helpCenter = script.dataset.helpCenter;\n const publicKey = script.dataset.publicKey;\n\n if (helpCenter && publicKey) {\n Pillar.init({ helpCenter, publicKey }).catch(console.error);\n }\n }\n }\n}\n\n// Default export for convenience\nexport default Pillar;\n"],"names":["state","actions","Map","clientInfo","setClientInfo","platform","version","getActionDefinition","name","get","hasAction","has","MCPClient","constructor","config","this","requestId","baseUrl","apiBaseUrl","headers","publicKey","helpCenter","nextId","callTool","args","request","jsonrpc","id","method","params","arguments","response","fetch","body","JSON","stringify","ok","errorData","json","catch","Error","error","message","status","jsonResponse","result","callToolStream","callbacks","signal","stream","Accept","errorText","text","statusText","reader","getReader","decoder","TextDecoder","buffer","collectedText","finalResult","done","value","read","decode","lines","split","pop","line","trim","startsWith","jsonStr","substring","event","parse","onError","progress","kind","token","push","onToken","plan","onPlan","onProgress","structuredContent","sources","onSources","onActions","conversationId","_meta","conversation_id","queryLogId","query_log_id","onComplete","parseError","console","releaseLock","content","type","join","isError","uploadImage","file","uploadUrl","formData","FormData","append","ask","query","options","articleSlug","article_slug","userContext","length","user_context","images","continuePlan","planId","stepId","plan_id","step_id","cancelPlan","getPlan","startPlan","retryStep","failStep","errorMessage","error_message","skipStep","sendActionResult","actionName","action_name","actionToTaskButton","action","taskType","action_type","data","autoRun","auto_run","autoComplete","auto_complete","APIClient","abortControllers","mcpClient","getVisitorId","window","KEY","localStorage","getItem","crypto","randomUUID","setItem","getSessionId","sessionStorage","getPageUrl","location","href","endpoint","abort","controller","AbortController","set","url","detail","delete","fetchEmbedConfig","warn","getTooltips","ids","getSuggestedQuestions","questions","Array","isArray","chat","history","onChunk","existingConversationId","fullMessage","s","a","map","p","meta","messageId","chatLegacy","context","includes","handleStreamingChat","answer","workflow","message_id","slice","parsed","submitFeedback","feedback","comment","confirmTaskExecution","taskId","details","payload","duration_ms","session_id","metadata","getSuggestions","productContext","userProfile","user_profile","suggestions","chatWithContext","product","cancelAllRequests","forEach","clear","n","l","u","t","i","o","r","e","f","c","h","v","y","d","w","g","parentNode","removeChild","m","props","key","ref","__k","__","__b","__e","__c","__v","__i","__u","vnode","k","children","x","S","C","base","M","__d","$","__r","debounceRendering","sort","shift","__P","O","__n","namespaceURI","N","I","_","b","String","L","D","P","B","A","nextSibling","insertBefore","nodeType","T","setProperty","test","j","style","cssText","replace","toLowerCase","addEventListener","removeEventListener","removeAttribute","setAttribute","F","H","prototype","render","contextType","__E","E","sub","__h","_sb","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","some","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","V","then","indexOf","z","localName","document","createTextNode","createElementNS","is","__m","call","childNodes","attributes","__html","innerHTML","q","diffed","current","unmount","componentWillUnmount","G","documentElement","defaultProps","firstChild","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Promise","bind","resolve","setTimeout","__source","__self","__H","__N","__f","filter","every","requestAnimationFrame","clearTimeout","cancelAnimationFrame","Symbol","for","W","watched","Z","unwatched","U","dispose","useSignal","__$f","__$u","ownerSVGElement","brand","subscribe","valueOf","toString","toJSON","peek","Object","defineProperty","displayName","defineProperties","configurable","__np","isOpen","activeTab","position","mode","width","hoverBreakpoint","hoverBackdrop","viewportWidth","innerWidth","resizeCleanup","isHoverMode","computed","bp","effectiveMode","classes","closePanel","overflow","resetPanel","injectStyles","container","css","createElement","textContent","Document","head","appendChild","HELP_ICON","TAB_ICONS","assistant","support","EdgeTriggerContent","tabs","currentActiveTab","onTabClick","panelOpen","panelWidthPx","theme","handleTabClick","useCallback","tabId","sidebarClassName","Boolean","enabledTabs","enabled","order","_jsx","class","tab","_jsxs","onClick","label","dangerouslySetInnerHTML","EdgeTrigger","rootContainer","stylesInjected","themeStylesInjected","_isHidden","unsubscribeOpen","unsubscribeWidth","unsubscribeHoverMode","unsubscribeActiveTab","themeObserver","currentTheme","setActiveTab","getEdgePosition","floatingButton","detectTheme","html","classList","contains","getAttribute","colorScheme","init","themeCSS","colors","darkColors","generateVars","primary","primaryHover","background","backgroundSecondary","textMuted","border","borderLight","lightVars","darkVars","generateEdgeTriggerThemeCSS","applyLayoutPadding","queueMicrotask","panelWidth","MutationObserver","newTheme","observe","attributeFilter","currentPanelWidth","inHoverMode","totalWidth","transition","paddingRight","paddingLeft","removeLayoutPadding","setOpen","_isOpen","show","display","hide","setPosition","setLabel","destroy","disconnect","remove","getElementById","sidebarTabs","FloatingButtonContent","handleClick","icon","FloatingButton","isHighlightedTextContext","item","messages","isLoading","progressStatus","isExpanded","currentSources","currentActions","prefillText","pendingMessage","focusInputTrigger","pendingUserContext","pendingImages","isUploadingImages","img","updateImageStatus","clearPendingImages","URL","revokeObjectURL","preview","updateLastAssistantMessage","msgs","role","existingMsg","actionStatus","setLoading","loading","setPendingMessage","triggerInputFocus","removeUserContext","resetChat","viewStack","currentView","canGoBack","isAtHome","navigate","view","goBack","stack","previousState","goHome","resetRouter","navigateToChat","CHECK_ICON","X_ICON","deriveTitle","word","charAt","toUpperCase","createDefaultConfirmCard","className","title","card_type","querySelector","onCancel","entries","displayValue","renderDataPreview","onConfirm","onStateChange","originalOnStateChange","newState","CONFIRM_CARD_STYLES","PillarContext","Set","add","Provider","__l","Consumer","createContext","PillarProvider","api","events","usePillar","useContext","useAPI","INLINE_PLAN_STYLES","ICONS","pending","ready","awaiting_confirmation","executing","awaiting_result","completed","skipped","failed","getStatusIcon","PlanStepItem","step","onSkip","onRetry","onDone","canRetry","is_retriable","retry_count","max_retries","description","PLAN_STEP_STYLES","activePlan","planHistory","hasActivePlan","steps","find","planProgress","total_steps","completed_steps","setPlan","updatePlan","updatePlanStep","updates","completedSteps","clearPlan","addToHistory","PlanView","isAwaitingStart","isExecuting","pillar","Pillar","getInstance","handleConfirmStep","confirmPlanStep","handleSkipStep","skipPlanStep","handleRetryStep","retryPlanStep","handleDoneStep","markPlanStepDone","goal","PLAN_STYLES","VIEW_TITLES","home","Header","customTitle","hideNavigation","showBack","showHome","QUOTE_ICON","ContextTag","onRemove","readOnly","text_content","getContextIcon","tooltip","source","url_origin","getContextTooltip","preventDefault","stopPropagation","ContextTagList","contexts","ctx","IMAGE_ICON","UnifiedChatInput","placeholder","disabled","onSubmit","showContextTags","showImageUpload","inputRef","useRef","fileInputRef","inputValue","setInputValue","useState","isDragging","setIsDragging","resizeTextarea","textarea","height","scrollHeight","overflowY","async","Date","now","Math","random","createObjectURL","image","errorMsg","undefined","handleImageFiles","files","imageFiles","from","availableSlots","handlePaste","items","clipboardData","getAsFile","handleDragOver","handleDragLeave","handleDrop","dataTransfer","handleFileSelect","input","target","openFilePicker","click","handleSubmit","trimmed","currentContext","currentImages","hasContext","hasImages","isUploading","canSubmit","onDragOver","onDragLeave","onDrop","accept","multiple","onChange","src","alt","removePendingImage","onInput","onKeyDown","shiftKey","onPaste","QuestionChip","QuestionChipSkeleton","HomeView","setQuestions","useEffect","mounted","err","loadQuestions","_Fragment","question","handleQuestionClick","marginTop","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","exec","caret","getRegex","RegExp","me","codeRemoveIndent","outputLinkReplace","indentCodeCompensation","beginningSpace","endingHash","startingSpaceChar","endingSpaceChar","nonSpaceChar","newLineCharGlobal","tabCharGlobal","multipleSpaceGlobal","blankLine","doubleBlankLine","blockquoteStart","blockquoteSetextReplace","blockquoteSetextReplace2","listReplaceTabs","listReplaceNesting","listIsTask","listReplaceTask","listTaskCheckbox","anyLine","hrefBrackets","tableDelimiter","tableAlignChars","tableRowBlankLine","tableAlignRight","tableAlignCenter","tableAlignLeft","startATag","endATag","startPreScriptTag","endPreScriptTag","startAngleBracket","endAngleBracket","pedanticHrefTitle","unicodeAlphaNumeric","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","unescapeTest","percentDecode","findPipe","splitPipe","slashPipe","carriageReturn","spaceLine","notSpaceStart","endingNewline","listItemRegex","nextBulletRegex","min","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","re","se","Oe","Q","ye","Pe","Se","ie","blockquote","code","def","fences","heading","hr","lheading","list","newline","paragraph","table","te","_e","Le","oe","K","ae","Ce","le","Be","ue","qe","ve","pe","De","He","Ze","Ge","Ne","Qe","Fe","je","ce","he","ne","_backpedal","anyPunctuation","autolink","blockSkip","br","del","emStrongLDelim","emStrongRDelimAst","emStrongRDelimUnd","escape","link","nolink","punctuation","reflink","reflinkSearch","tag","Ke","We","normal","Xe","ke","X","encodeURI","J","at","splice","ge","other","inLink","raw","tokens","inlineTokens","rules","lexer","space","block","codeBlockStyle","match","Je","lang","inline","depth","top","blockTokens","R","ordered","start","loose","repeat","trimStart","search","Y","ee","fe","task","trimEnd","inlineQueue","checked","unshift","pre","header","align","rows","inRawBlock","de","emStrong","lastIndex","index","codespan","inlineText","escaped","links","create","lex","lexInline","endsWith","startBlock","charCodeAt","keys","lastIndexOf","emStrongMask","startInline","parser","parseInline","listitem","checkbox","tablecell","tablerow","strong","em","textRenderer","renderers","static","preprocess","postprocess","processAllTokens","provideLexer","provideParser","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","use","concat","childTokens","flat","apply","level","passThroughHooks","passThroughHooksRespectAsync","all","reject","renderMarkdown","marked","getDefaults","TASK_TYPE_ICONS","open_modal","fill_form","trigger_action","copy_text","external_link","start_tutorial","settings","zap","download","copy","layout","edit","createTaskButton","onExecute","button","variant","getButtonClass","buttonVariant","iconName","iconSpan","labelSpan","path","externalUrl","executeTask","TASK_BUTTON_STYLES","ChatView","messagesRef","hasProcessedPending","pendingContext","sendMessage","scrollTop","unsubscribe","on","success","msg","newStatus","completedAt","setActionComplete","completionText","getCompletionText","updateActionMessageContent","handlePlanReceived","log","handleActionsReceived","autoRunActions","manualActions","messageIndex","setActionPending","addUserMessage","fullResponse","receivedActions","chunk","finalActions","handleFeedback","setMessageFeedback","handleInputSubmit","actionContainerRefs","confirmActions","buttonActions","card","wrapper","cardType","customRenderer","getCardRenderer","modifiedData","cleanup","_cleanup","defaultCard","createConfirmActionCard","buttonGroup","tasks","createTaskButtonGroup","imgIndex","slug","el","PanelContent","currentTab","isChatView","isHomeView","padding","textAlign","fontSize","fontWeight","marginBottom","color","renderAssistantView","generateThemeVariables","prefix","generateThemeCSS","lightOverrides","darkOverrides","PANEL_STYLES","activeWorkflow","workflowHistory","current_step","completedStepsCount","updateStepStatus","stepIndex","idx","advanceToNextStep","nextIndex","nextStatus","completeWorkflow","WORKFLOW_STYLES","Panel","host","shadow","backdrop","panelElement","renderRoot","isManualMount","handleKeyDown","panel","detectThemeFromDOM","pos","setMode","setWidth","handleResize","initViewportListener","createHost","createBackdrop","createPanel","renderPreact","bindEvents","subscribeToState","open","focusInput","setupFocusTrap","close","removePushModeStyles","currentValue","emit","previousOpen","previousEffectiveMode","updatePanelUI","currentOpen","isPushMode","panelPosition","showBackdrop","applyPushModeStyles","unsubscribeMode","currentMode","renderContainer","transformStylesForRegularDOM","injectStylesIntoHead","styleId","rawCSS","transformedCSS","styles","themeStyles","customCSS","customStyles","injectStylesIntoShadow","useShadowDOM","attachShadow","applyThemeMode","setupThemeObserver","defaultTarget","mountTarget","HTMLElement","mountTo","parentElement","getHostElement","manualClass","positionClass","focusable","focus","themeMode","detectedTheme","setTheme","themeConfig","existingThemeStyle","firstStyle","transformedThemeCSS","TextSelectionPopover","isVisible","popoverRef","isBelow","setIsBelow","updatePosition","rect","getBoundingClientRect","adjustedX","adjustedY","showBelow","left","tabIndex","STYLES_ID","TextSelectionManager","openPanel","currentSelection","handleMouseUp","checkSelection","handleMouseDown","closest","hidePopover","handleScroll","handlePopoverClick","newItem","addUserContext","getSelection","removeAllRanges","unbindEvents","selection","isCollapsed","selectedText","range","getRangeAt","commonAncestorContainer","element","Element","scrollY","showPopover","textSelection","getViewportRect","scrollX","innerHeight","calculatePosition","anchor","floating","alignment","offset","arrowSize","viewport","bottom","right","auto","getAvailableSpace","fits","sorted","getBestPosition","arrowX","arrowY","getAlignedX","getAlignedY","max","TooltipContent","trigger","preferredPosition","onLearnMore","onHide","onMouseEnter","onMouseLeave","tooltipRef","arrowRef","setPositionClass","setStyle","arrowStyle","setArrowStyle","anchorRect","getElementRect","tooltipRect","content_html","show_learn_more","article_title","Tooltip","iconElement","hideTimeout","handleMouseEnter","handleMouseLeave","handleTooltipMouseEnter","handleTooltipMouseLeave","toggle","handleDocumentClick","handleFocus","handleBlur","createIcon","renderTooltip","onShow","hoverHandlers","insertAdjacentElement","TOOLTIP_ATTRIBUTE","TooltipManager","tooltips","tooltipData","observer","scan","setupObserver","elements","querySelectorAll","tooltipIds","size","tooltip_id","tooltipId","existingKey","getElementKey","createTooltip","dataId","defaultTrigger","Pillar$1","mutations","needsScan","mutation","node","addedNodes","hasAttribute","removedNodes","handleRemovedElement","childList","subtree","child","childKey","dataset","pillarTooltipKey","DEFAULT_PRODUCT_CONTEXT","recentActions","DEFAULT_USER_PROFILE","currentPage","currentFeature","userRole","errorState","DEFAULT_PREFIX","DEFAULT_SIDEBAR_TABS","DEFAULT_CONFIG","clearAfterOpen","mergeSidebarTabs","userTabs","tabMap","assistantTab","values","resolveConfig","urlParams","onReady","EventEmitter","listeners","callback","off","eventListeners","removeAllListeners","clearSavedPlan","siteId","getStorageKey","removeItem","PlanExecutor","auto_execute","persistPlan","executeNextStep","recoverPlan","savedPlan","stored","storedAt","timeoutMinutes","timeout_minutes","ageMinutes","getTime","round","loadSavedPlan","latestPlan","toISOString","savePlan","requires_user_confirmation","allDone","executeStep","confirmStep","action_data","updatedPlan","updatedStep","retryCount","cancel","completeStepByAction","markStepComplete","markStepDone","actionDefinition","handler","returns","default","actionType","executed","requires_result_feedback","serverError","getActivePlan","_state","_config","_api","_mcpClient","_planExecutor","_tooltipManager","_textSelectionManager","_panel","_floatingButton","_initPromise","_rootContainer","_unsubscribeHoverMode","_productContext","_userProfile","_taskHandlers","_anyTaskHandler","_cardRenderers","_events","_createRootContainer","_subscribeToHoverModeForRoot","initialZIndex","zIndex","instance","_init","_destroy","isReady","isPanelOpen","panelIsOpen","setContext","setTextSelectionEnabled","scanTooltips","showTooltip","hideTooltip","mountPanelTo","getPanelHostElement","setProductContext","storeSetProductContext","updateContext","storeUpdateContext","setUserProfile","profile","storeSetUserProfile","reportAction","updatedActions","storeReportAction","clearErrorState","rest","storeClearErrorState","setErrorState","storeSetErrorState","getAssistantContext","user","onTask","taskName","onAnyTask","offTask","registryHandler","specificHandler","typeHandler","resolvedResult","navigator","clipboard","writeText","completeTask","registerCard","hasCardRenderer","startWorkflow","storeStartWorkflow","firstStep","_executeWorkflowStep","initiateWorkflowStep","confirmWorkflowStep","nextStep","storeCompleteWorkflow","skipWorkflowStep","cancelWorkflow","cancelled","storeCancelWorkflow","task_id","task_name","task_type","completePlanStepByAction","_doInit","readyState","once","tempConfig","tempApi","mergedConfig","localConfig","serverConfig","merged","mergeServerConfig","_handleUrlParams","searchParams","URLSearchParams","article","articleId","category","parsePillarUrlParams","paramsToRemove","hasChanges","param","replaceState","clearPillarUrlParams","autoInit","script","currentScript","scripts","definition","gitSha","entry","examples","external_url","returns_data","dataSchema","data_schema","defaultData","default_data","requiredContext","required_context","generatedAt"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,26]}
|