@devicai/ui 0.57.0 → 0.58.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.
Files changed (171) hide show
  1. package/README.md +162 -0
  2. package/dist/cjs/api/types.js.map +1 -1
  3. package/dist/cjs/components/AICommandBar/AICommandBar.js +10 -7
  4. package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
  5. package/dist/cjs/components/AICommandBar/useAICommandBar.js +7 -5
  6. package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
  7. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +17 -14
  8. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  9. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +7 -5
  10. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  11. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +11 -6
  12. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  13. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +6 -4
  14. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  15. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +26 -12
  16. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  17. package/dist/cjs/components/ChatDrawer/ChatInput.js +21 -15
  18. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  19. package/dist/cjs/components/ChatDrawer/ChatMessages.js +54 -13
  20. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/CompactionWidget.js +13 -4
  22. package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
  23. package/dist/cjs/components/ChatDrawer/ConversationSelector.js +6 -4
  24. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  25. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js +40 -0
  26. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  27. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  28. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  29. package/dist/cjs/components/ChatDrawer/LimitBanner.js +19 -9
  30. package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
  31. package/dist/cjs/components/ChatDrawer/QueueNotice.js +19 -7
  32. package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
  33. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  34. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  35. package/dist/cjs/components/ChatDrawer/ReferenceChip.js +3 -1
  36. package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
  37. package/dist/cjs/components/ChatDrawer/UsageBar.js +23 -18
  38. package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
  39. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  40. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  41. package/dist/cjs/components/Feedback/FeedbackModal.js +5 -1
  42. package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
  43. package/dist/cjs/components/Feedback/MessageActions.js +3 -1
  44. package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
  45. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  46. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  47. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js +5 -3
  48. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  49. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  50. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  51. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  52. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  53. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  54. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  55. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js +15 -7
  56. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  57. package/dist/cjs/components/IntegrationsModal/McpServersSection.js +32 -19
  58. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
  59. package/dist/cjs/components/IntegrationsModal/useIntegrations.js +3 -1
  60. package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
  61. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js +3 -1
  62. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  63. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js +63 -40
  64. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  65. package/dist/cjs/hooks/useDevicChat.js +11 -5
  66. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  67. package/dist/cjs/hooks/useSpeechRecording.js +8 -4
  68. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
  69. package/dist/cjs/i18n/translate.js +48 -0
  70. package/dist/cjs/i18n/translate.js.map +1 -0
  71. package/dist/cjs/i18n/useTranslations.js +57 -0
  72. package/dist/cjs/i18n/useTranslations.js.map +1 -0
  73. package/dist/cjs/index.js +11 -0
  74. package/dist/cjs/index.js.map +1 -1
  75. package/dist/cjs/provider/DevicProvider.js +3 -1
  76. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  77. package/dist/cjs/styles.css +1 -1
  78. package/dist/esm/api/types.d.ts +10 -1
  79. package/dist/esm/api/types.js.map +1 -1
  80. package/dist/esm/components/AICommandBar/AICommandBar.js +11 -8
  81. package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
  82. package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +10 -0
  83. package/dist/esm/components/AICommandBar/useAICommandBar.js +7 -5
  84. package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
  85. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +17 -14
  86. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  87. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +10 -0
  88. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +7 -5
  89. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  90. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +12 -7
  91. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  92. package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +10 -0
  93. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +6 -4
  94. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  95. package/dist/esm/components/ChatDrawer/ChatDrawer.js +27 -13
  96. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  97. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +33 -0
  98. package/dist/esm/components/ChatDrawer/ChatInput.js +21 -15
  99. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  100. package/dist/esm/components/ChatDrawer/ChatMessages.d.ts +1 -1
  101. package/dist/esm/components/ChatDrawer/ChatMessages.js +54 -13
  102. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  103. package/dist/esm/components/ChatDrawer/CompactionWidget.js +13 -4
  104. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  105. package/dist/esm/components/ChatDrawer/ConversationSelector.js +6 -4
  106. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  107. package/dist/esm/components/ChatDrawer/GuardrailNotice.d.ts +36 -0
  108. package/dist/esm/components/ChatDrawer/GuardrailNotice.js +38 -0
  109. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  110. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  111. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  112. package/dist/esm/components/ChatDrawer/LimitBanner.js +19 -9
  113. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  114. package/dist/esm/components/ChatDrawer/QueueNotice.js +19 -7
  115. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  116. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  117. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  118. package/dist/esm/components/ChatDrawer/ReferenceChip.js +3 -1
  119. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  120. package/dist/esm/components/ChatDrawer/UsageBar.js +23 -18
  121. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  122. package/dist/esm/components/ChatDrawer/index.d.ts +2 -0
  123. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  124. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  125. package/dist/esm/components/Feedback/FeedbackModal.js +5 -1
  126. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  127. package/dist/esm/components/Feedback/MessageActions.js +3 -1
  128. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  129. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  130. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  131. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js +5 -3
  132. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  133. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  134. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  135. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.d.ts +1 -1
  136. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  137. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  138. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.d.ts +1 -1
  139. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  140. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  141. package/dist/esm/components/IntegrationsModal/McpConnectForm.js +15 -7
  142. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  143. package/dist/esm/components/IntegrationsModal/McpServersSection.js +32 -19
  144. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  145. package/dist/esm/components/IntegrationsModal/useIntegrations.js +3 -1
  146. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  147. package/dist/esm/components/IntegrationsModal/useTenantMcp.js +3 -1
  148. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  149. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +63 -40
  150. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  151. package/dist/esm/hooks/useDevicChat.js +12 -6
  152. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  153. package/dist/esm/hooks/useSpeechRecording.js +8 -4
  154. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  155. package/dist/esm/i18n/index.d.ts +4 -0
  156. package/dist/esm/i18n/translate.d.ts +23 -0
  157. package/dist/esm/i18n/translate.js +43 -0
  158. package/dist/esm/i18n/translate.js.map +1 -0
  159. package/dist/esm/i18n/types.d.ts +27 -0
  160. package/dist/esm/i18n/useTranslations.d.ts +32 -0
  161. package/dist/esm/i18n/useTranslations.js +53 -0
  162. package/dist/esm/i18n/useTranslations.js.map +1 -0
  163. package/dist/esm/index.d.ts +4 -2
  164. package/dist/esm/index.js +3 -0
  165. package/dist/esm/index.js.map +1 -1
  166. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  167. package/dist/esm/provider/DevicProvider.js +3 -1
  168. package/dist/esm/provider/DevicProvider.js.map +1 -1
  169. package/dist/esm/provider/types.d.ts +33 -0
  170. package/dist/esm/styles.css +1 -1
  171. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AICommandBar.js","sources":["../../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions, ToolCallSummary } from './AICommandBar.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n toolGroups: undefined as any,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if ((resolvedApiKey || context?.getTenantSession) && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: context?.getTenantSession,\n onSessionExpired: context?.onSessionExpired,\n });\n }\n }, [resolvedApiKey, context?.getTenantSession, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n // Render tool call items with optional toolGroups segmentation\n const renderToolCallItems = (toolCalls: ToolCallSummary[], opts: Required<AICommandBarOptions>) => {\n if (opts.toolGroups && opts.toolGroups.length > 0) {\n const calls: ToolGroupCall[] = toolCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, opts.toolGroups);\n const elements: React.ReactNode[] = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n elements.push(\n <div key={`cmd-group-${groupKey}`} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n const tc = toolCalls[callIdx];\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>,\n );\n } else {\n const customIcon = opts.toolIcons?.[tc.name];\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>,\n );\n }\n callIdx += 1;\n }\n }\n\n return elements;\n }\n\n // Default: no toolGroups, render individually\n return toolCalls.map((tc) => {\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n const customIcon = opts.toolIcons?.[tc.name];\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n });\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Commands</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> to navigate, <kbd>Enter</kbd> to select\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Command History</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">No history yet</div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>Tool calls</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {renderToolCallItems(hook.result.toolCalls, mergedOptions)}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">No response</span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || mergedOptions.processingMessage}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useAICommandBar","useImperativeHandle","useState","useRef","useOptionalDevicContext","useEffect","DevicApiClient","useCallback","segmentToolCalls","_jsx","_jsxs","MessageActions","formatShortcut"],"mappings":"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"}
1
+ {"version":3,"file":"AICommandBar.js","sources":["../../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions, ToolCallSummary } from './AICommandBar.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport { DevicTranslationsProvider, useTranslations } from '../../i18n';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n toolGroups: undefined as any,\n translations: undefined as any,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const t = useTranslations(mergedOptions.translations);\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if ((resolvedApiKey || context?.getTenantSession) && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: context?.getTenantSession,\n onSessionExpired: context?.onSessionExpired,\n });\n }\n }, [resolvedApiKey, context?.getTenantSession, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n // Render tool call items with optional toolGroups segmentation\n const renderToolCallItems = (toolCalls: ToolCallSummary[], opts: Required<AICommandBarOptions>) => {\n if (opts.toolGroups && opts.toolGroups.length > 0) {\n const calls: ToolGroupCall[] = toolCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, opts.toolGroups);\n const elements: React.ReactNode[] = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n elements.push(\n <div key={`cmd-group-${groupKey}`} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n const tc = toolCalls[callIdx];\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>,\n );\n } else {\n const customIcon = opts.toolIcons?.[tc.name];\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>,\n );\n }\n callIdx += 1;\n }\n }\n\n return elements;\n }\n\n // Default: no toolGroups, render individually\n return toolCalls.map((tc) => {\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n const customIcon = opts.toolIcons?.[tc.name];\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n });\n };\n\n return (\n <DevicTranslationsProvider translations={mergedOptions.translations}>\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>{t('Commands')}</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> {t('to navigate,')} <kbd>Enter</kbd>{' '}\n {t('to select')}\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>{t('Command History')}</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n {t('Clear')}\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">\n {t('No history yet')}\n </div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>{t('Tool calls')}</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {renderToolCallItems(hook.result.toolCalls, mergedOptions)}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">\n {t('No response')}\n </span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || t(mergedOptions.processingMessage)}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={t(mergedOptions.placeholder)}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n </DevicTranslationsProvider>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useTranslations","useAICommandBar","useImperativeHandle","useState","useRef","useOptionalDevicContext","useEffect","DevicApiClient","useCallback","segmentToolCalls","_jsx","_jsxs","DevicTranslationsProvider","MessageActions","formatShortcut"],"mappings":";;;;;;;;;;;AAaA;;AAEG;AACH,SAAS,WAAW,CAAC,KAAa,EAAA;;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;AAE5E,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI;QACvD,OAAO,UAAU,GAAG,GAAG;IACzB;;IAEA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC;IAC9D,IAAI,QAAQ,EAAE;QACZ,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACnC,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI;QACvD,OAAO,UAAU,GAAG,GAAG;IACzB;AACA,IAAA,OAAO,KAAK;AACd;AAEA;;AAEG;AACH,SAAS,WAAW,CAAC,KAAa,EAAE,MAAc,EAAA;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AAC5E,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AAC5E,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AAC5E,IAAA,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAClH;AAEA,MAAM,eAAe,GAAkC;AACrD,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,IAAI,EAAE,SAAgB;AACtB,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,UAAU,EAAE,mEAAmE;AAC/E,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,OAAO,EAAE,WAAW;AACpB,IAAA,SAAS,EAAE,+BAA+B;AAC1C,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,aAAa,EAAE,SAAgB;AAC/B,IAAA,SAAS,EAAE,SAAgB;AAC3B,IAAA,iBAAiB,EAAE,eAAe;AAClC,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,iBAAiB,EAAE,2BAA2B;AAC9C,IAAA,QAAQ,EAAE,SAAgB;AAC1B,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,UAAU,EAAE,SAAgB;AAC5B,IAAA,YAAY,EAAE,SAAgB;CAC/B;AAED;;;;;;;;;;;;;;;;AAgBG;AACI,MAAM,YAAY,GAAGA,gBAAU,CACpC,SAAS,YAAY,CAAC,KAAK,EAAE,GAAG,EAAA;IAC9B,MAAM,EACJ,WAAW,EACX,MAAM,EACN,OAAO,EACP,eAAe,EACf,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,OAAO,GAAG,EAAE,EACZ,SAAS,EAAE,iBAAiB,EAC5B,kBAAkB,EAClB,SAAS,GAAG,UAAU,EACtB,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,OAAO,EACP,MAAM,EACN,OAAO,EACP,SAAS,GACV,GAAG,KAAK;IAET,MAAM,aAAa,GAAGC,aAAO,CAC3B,OAAO,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC,EAC1C,CAAC,OAAO,CAAC,CACV;IAED,MAAM,CAAC,GAAGC,+BAAe,CAAC,aAAa,CAAC,YAAY,CAAC;IAErD,MAAM,IAAI,GAAGC,+BAAe,CAAC;QAC3B,WAAW;QACX,MAAM;QACN,OAAO;QACP,eAAe;QACf,QAAQ;QACR,cAAc;QACd,IAAI;AACJ,QAAA,OAAO,EAAE,aAAa;AACtB,QAAA,SAAS,EAAE,iBAAiB;QAC5B,kBAAkB;QAClB,SAAS;QACT,aAAa;QACb,UAAU;QACV,mBAAmB;QACnB,QAAQ;QACR,UAAU;QACV,OAAO;QACP,MAAM;QACN,OAAO;AACR,KAAA,CAAC;;AAGF,IAAAC,yBAAmB,CAAC,GAAG,EAAE,OAAO;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;AAClB,KAAA,CAAC,CAAC;;IAGH,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC;;IAGzD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAgB,MAAM,CAAC;AACzE,IAAA,MAAM,iBAAiB,GAAGC,YAAM,CAAwB,IAAI,CAAC;;AAG7D,IAAA,MAAM,OAAO,GAAGC,oCAAuB,EAAE;AACzC,IAAA,MAAM,cAAc,GAAG,MAAM,IAAI,OAAO,EAAE,MAAM;IAChD,MAAM,eAAe,GAAG,OAAO,IAAI,OAAO,EAAE,OAAO,IAAI,sBAAsB;;IAG7EC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,cAAc,IAAI,OAAO,EAAE,gBAAgB,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE;AAC/E,YAAA,iBAAiB,CAAC,OAAO,GAAG,IAAIC,qBAAc,CAAC;AAC7C,gBAAA,MAAM,EAAE,cAAc;AACtB,gBAAA,OAAO,EAAE,eAAe;gBACxB,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;gBAC3C,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;AAC5C,aAAA,CAAC;QACJ;IACF,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;;IAGhED,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,gBAAgB,CAAC,MAAM,CAAC;QAC1B;AACF,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;;AAGpD,IAAA,MAAM,cAAc,GAAGE,iBAAW,CAChC,OAAO,SAAiB,EAAE,QAAiB,EAAE,OAAgB,KAAI;QAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO;YAAE;AAEzD,QAAA,IAAI;AACF,YAAA,MAAM,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACnF,SAAS;AACT,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,eAAe,EAAE,OAAO;AACzB,aAAA,CAAC;YAEF,gBAAgB,CAAC,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;QACtD;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AAChD,YAAA,MAAM,GAAG;QACX;IACF,CAAC,EACD,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CACpC;;AAGD,IAAA,MAAM,YAAY,GAAGJ,YAAM,CAAiB,IAAI,CAAC;;IAGjDE,eAAS,CAAC,MAAK;AACb,QAAA,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,EAAE;YAAE;AAET,QAAA,MAAM,IAAI,GAAmC;AAC3C,YAAA,CAAC,yBAAyB,EAAE,aAAa,CAAC,eAAe,CAAC;AAC1D,YAAA,CAAC,2BAA2B,EAAE,aAAa,CAAC,SAAS,CAAC;AACtD,YAAA,CAAC,6BAA6B,EAAE,aAAa,CAAC,WAAW,CAAC;AAC1D,YAAA,CAAC,8BAA8B,EAAE,aAAa,CAAC,KAAK,CAAC;AACrD,YAAA,CAAC,kCAAkC,EAAE,aAAa,CAAC,UAAU,CAAC;YAC9D,CAAC,gCAAgC,EAAE,OAAO,aAAa,CAAC,QAAQ,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAA,EAAA,CAAI,GAAG,aAAa,CAAC,QAAQ,CAAC;YACvI,CAAC,6BAA6B,EAAE,OAAO,aAAa,CAAC,YAAY,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,YAAY,CAAA,EAAA,CAAI,GAAG,aAAa,CAAC,YAAY,CAAC;AAChJ,YAAA,CAAC,6BAA6B,EAAE,aAAa,CAAC,SAAS,CAAC;AACxD,YAAA,CAAC,yCAAyC,EAAE,CAAA,EAAG,aAAa,CAAC,iBAAiB,IAAI,CAAC;SACpF;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YAChC,IAAI,KAAK,EAAE;gBACT,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;YACnC;iBAAO;AACL,gBAAA,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;YAC/B;QACF;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;IAGnBA,eAAS,CAAC,MAAK;QACb,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,kBAAkB,GAAG,CAAC,CAAa,KAAI;AAC3C,YAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,YAAA,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE;;AAEtD,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,IAAI,CAAC,KAAK,EAAE;gBACd;gBACA,IAAI,CAAC,KAAK,EAAE;YACd;AACF,QAAA,CAAC;;AAGD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC;QAC1D,OAAO,MAAM,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC;AAC5E,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;AAGzD,IAAA,MAAM,aAAa,GAAGP,aAAO,CAAC,MAAgC;AAC5D,QAAA,MAAM,EAAE,GAAG,aAAa,CAAC,eAAe;AACxC,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS;AACpC,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW;AACxC,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK;;AAGnC,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,SAAS;AAElC,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,GAAG,KAAK;QAE3C,OAAO;AACL,YAAA,eAAe,EAAE,EAAE;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,cAAc,EAAE,IAAI,IAAI,EAAE,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,SAAS;AAClG,YAAA,wBAAwB,EAAE,EAAE,IAAI,MAAM,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,SAAS;AAChG,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,YAAY,EAAE,OAAO;AACrB,YAAA,iBAAiB,EAAE,OAAO,IAAI,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,SAAS;SACzG;AACH,IAAA,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;;AAG5G,IAAA,MAAM,cAAc,GAAGA,aAAO,CAAC,MAAK;AAClC,QAAA,MAAM,KAAK,GAAwB;YACjC,KAAK,EAAE,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,KAAK,CAAA,EAAA,CAAI,GAAG,aAAa,CAAC,KAAK;YACjG,QAAQ,EAAE,OAAO,aAAa,CAAC,QAAQ,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAA,EAAA,CAAI,GAAG,aAAa,CAAC,QAAQ;YAC7G,MAAM,EAAE,aAAa,CAAC,MAAM;SAC7B;AAED,QAAA,IAAI,aAAa,CAAC,QAAQ,KAAK,OAAO,EAAE;AACtC,YAAA,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,cAAc,IAAI,EAAE;YACvE,IAAI,GAAG,KAAK,SAAS;AAAE,gBAAA,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAA,EAAA,CAAI,GAAG,GAAG;YAC7E,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,KAAK,CAAC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK,CAAA,EAAA,CAAI,GAAG,KAAK;YACvF,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,KAAK,CAAC,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,GAAG,MAAM,CAAA,EAAA,CAAI,GAAG,MAAM;YAC5F,IAAI,IAAI,KAAK,SAAS;AAAE,gBAAA,KAAK,CAAC,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,GAAG,IAAI,CAAA,EAAA,CAAI,GAAG,IAAI;QACpF;AAEA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;AAGnB,IAAA,MAAM,QAAQ,GAAGA,aAAO,CAAC,MAAK;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,EAAE;AAC/E,YAAA,OAAO,SAAS;QAClB;QACA,OAAO;YACL,OAAO,EAAE,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ,GAAG,GAAG,aAAa,CAAC,OAAO,CAAA,EAAA,CAAI,GAAG,aAAa,CAAC,OAAO;SAC1G;AACH,IAAA,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;;AAG3B,IAAA,MAAM,kBAAkB,GAAGA,aAAO,CAAC,MAAK;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,mBAAmB,IAAI,aAAa,CAAC,mBAAmB,KAAK,eAAe,CAAC,mBAAmB,EAAE;AACnH,YAAA,OAAO,SAAS;QAClB;QACA,OAAO;AACL,YAAA,SAAS,EAAE,OAAO,aAAa,CAAC,mBAAmB,KAAK;AACtD,kBAAE,CAAA,EAAG,aAAa,CAAC,mBAAmB,CAAA,EAAA;kBACpC,aAAa,CAAC,mBAAmB;SACtC;AACH,IAAA,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;;AAGvC,IAAA,MAAM,mBAAmB,GAAG,CAAC,SAA4B,EAAE,IAAmC,KAAI;AAChG,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YACjD,MAAM,KAAK,GAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;gBACpD,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,UAAU,EAAE,EAAE,CAAC,EAAE;AAClB,aAAA,CAAC,CAAC;YACH,MAAM,QAAQ,GAAGU,2BAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;YACzD,MAAM,QAAQ,GAAsB,EAAE;YACtC,IAAI,OAAO,GAAG,CAAC;AAEf,YAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,gBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;oBAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACjE,QAAQ,CAAC,IAAI,CACXC,cAAA,CAAA,KAAA,EAAA,EAAmC,SAAS,EAAC,yEAAyE,EAAA,QAAA,EACnH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAA,EAD/B,aAAa,QAAQ,CAAA,CAAE,CAE3B,CACP;AACD,oBAAA,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;gBACjC;qBAAO;AACL,oBAAA,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;oBAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC;oBACpD,IAAI,cAAc,EAAE;wBAClB,QAAQ,CAAC,IAAI,CACXA,cAAA,CAAA,KAAA,EAAA,EAAiB,SAAS,EAAC,yEAAyE,EAAA,QAAA,EACjG,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAA,EAD5B,EAAE,CAAC,EAAE,CAET,CACP;oBACH;yBAAO;wBACL,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;wBAC5C,QAAQ,CAAC,IAAI,CACXC,eAAA,CAAA,KAAA,EAAA,EAAiB,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,CAC5D,UAAU,IACTD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAE,UAAU,GAAQ,KAExEA,cAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,oCAAoC,EAAA,CAAG,CAC7D,EACDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,EAN3E,EAAE,CAAC,EAAE,CAOT,CACP;oBACH;oBACA,OAAO,IAAI,CAAC;gBACd;YACF;AAEA,YAAA,OAAO,QAAQ;QACjB;;AAGA,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;YAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC;YACpD,IAAI,cAAc,EAAE;gBAClB,QACEA,wBAAiB,SAAS,EAAC,yEAAyE,EAAA,QAAA,EACjG,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAA,EAD5B,EAAE,CAAC,EAAE,CAET;YAEV;YACA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;YAC5C,QACEC,yBAAiB,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,CAC5D,UAAU,IACTD,yBAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAE,UAAU,EAAA,CAAQ,KAExEA,cAAA,CAAC,SAAS,IAAC,SAAS,EAAC,oCAAoC,EAAA,CAAG,CAC7D,EACDA,yBAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,EAN3E,EAAE,CAAC,EAAE,CAOT;AAEV,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,QACEA,cAAA,CAACE,yCAAyB,EAAA,EAAC,YAAY,EAAE,aAAa,CAAC,YAAY,EAAA,QAAA,EACnED,eAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,CAAA,4BAAA,EAA+B,SAAS,IAAI,EAAE,CAAA,CAAE,EAAA,eAAA,EAC5C,aAAa,CAAC,QAAQ,kBACvB,IAAI,CAAC,SAAS,EAC5B,KAAK,EAAE,cAAc,EAAA,QAAA,EAAA,CAGpB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,KACvDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CACzCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDD,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,UAAU,CAAC,EAAA,CAAQ,EAC5BC,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,iCAAiC,aAC/CD,cAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,QAAA,EAAA,CAAY,EAAAA,cAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,QAAA,EAAA,CAAY,EAAA,GAAA,EAAE,CAAC,CAAC,cAAc,CAAC,EAAA,GAAA,EAAEA,cAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,OAAA,EAAA,CAAgB,EAAC,GAAG,EAChE,CAAC,CAAC,WAAW,CAAC,CAAA,EAAA,CACV,CAAA,EAAA,CACH,EACNA,wBAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC7C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,MACpCC,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,iCAAiC,EAAA,eAAA,EAC5B,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAClD,OAAO,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EACtC,YAAY,EAAE,MAAK,EAAkD,CAAC,EAAA,QAAA,EAAA,CAErE,GAAG,CAAC,IAAI,KACPD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAE,GAAG,CAAC,IAAI,EAAA,CAAQ,CACpE,EACDC,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,CAAA,GAAA,EAAG,GAAG,CAAC,OAAO,CAAA,EAAA,CAAQ,EAC1ED,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,iCAAiC,YAAE,GAAG,CAAC,WAAW,EAAA,CAAQ,CAAA,EAAA,EAVrE,GAAG,CAAC,OAAO,CAWZ,CACP,CAAC,EAAA,CACE,CAAA,EAAA,CACF,CACP,EAGA,IAAI,CAAC,cAAc,KAClBC,yBAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CACzCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDD,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,iBAAiB,CAAC,EAAA,CAAQ,EAClC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KACtBA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,kCAAkC,EAC5C,OAAO,EAAE,MAAK;wCACZ,IAAI,CAAC,YAAY,EAAE;AACnB,wCAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC/B,oCAAA,CAAC,EACD,IAAI,EAAC,QAAQ,YAEZ,CAAC,CAAC,OAAO,CAAC,EAAA,CACJ,CACV,CAAA,EAAA,CACG,EACNA,wBAAK,SAAS,EAAC,iCAAiC,EAAC,KAAK,EAAE,kBAAkB,EAAA,QAAA,EACvE,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IACxBA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC9C,CAAC,CAAC,gBAAgB,CAAC,EAAA,CAChB,KAEN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAC3BC,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,gEAAgE,EAC1E,OAAO,EAAE,MAAK;AACZ,oCAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC7B,oCAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oCACxB,IAAI,CAAC,KAAK,EAAE;gCACd,CAAC,EAAA,QAAA,EAAA,CAEDD,eAAC,WAAW,EAAA,EAAC,SAAS,EAAC,iCAAiC,GAAG,EAC3DA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gCAAgC,YAAE,IAAI,EAAA,CAAQ,KATzD,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAUnB,CACP,CAAC,CACH,GACG,CAAA,EAAA,CACF,CACP,EAGA,aAAa,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,eAAe,KAC3FC,yBAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,CAEtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,KAC/BA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC7CA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,uCAAuC,mBAClC,aAAa,EAC5B,OAAO,EAAE,MAAM,gBAAgB,CAAC,CAAC,aAAa,CAAC,aAE/CD,cAAA,CAAC,WAAW,IAAC,SAAS,EAAC,wCAAwC,EAAA,CAAG,EAClEA,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,YAAY,CAAC,EAAA,CAAQ,EAC9BA,yBAAM,SAAS,EAAC,sCAAsC,EAAA,QAAA,EACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GACxB,CAAA,EAAA,CACH,EACNA,wBACE,SAAS,EAAC,qCAAqC,EAAA,eAAA,EAChC,aAAa,EAAA,QAAA,EAE3B,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,EAAA,CACtD,CAAA,EAAA,CACF,CACP,EAGDA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAC,KAAK,EAAE,kBAAkB,EAAA,QAAA,EACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,KACnCA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gCAAgC,YAC7C,CAAC,CAAC,aAAa,CAAC,EAAA,CACZ,CACR,EAAA,CACG,EAGNA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,YACvCA,cAAA,CAACG,6BAAc,IACb,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAClC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EACpD,eAAe,EAAE,aAAa,EAC9B,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,IAAI,EACd,YAAY,EAAE,IAAI,EAClB,KAAK,EAAE,aAAa,EAAA,CACpB,EAAA,CACE,CAAA,EAAA,CACF,CACP,EAGA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,KAC/BH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,YACrC,IAAI,CAAC,KAAK,CAAC,OAAO,GACf,CACP,EAGDC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,QAAQ,EAAA,QAAA,EAAA,CAEhDD,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wBAAwB,YACpC,IAAI,CAAC,YAAY,IAChBA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,CAAG,KAE7C,aAAa,CAAC,IAAI,IAAIA,eAAC,YAAY,EAAA,EAAA,CAAG,CACvC,EAAA,CACG,EAGL,IAAI,CAAC,YAAY,IAChBC,yBAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CACvC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAA,KAAA,CAAA,EAAA,CAC1D,KAEND,cAAA,CAAA,OAAA,EAAA,EACE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,yBAAyB,EACnC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,EACzC,KAAK,EAAE,IAAI,CAAC,UAAU,EACtB,QAAQ,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACnD,SAAS,EAAE,IAAI,CAAC,aAAa,GAC7B,CACH,EAGA,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,KAC7EA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EACxCI,8BAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAA,CACnC,CACP,CAAA,EAAA,CACG,CAAA,EAAA,CACF,EAAA,CACsB;AAEhC,CAAC;AAGH;;AAEG;AACH,SAAS,YAAY,GAAA;AACnB,IAAA,QACCH,eAAA,CAAA,KAAA,EAAA,EACW,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,4BAA4B,EAAA,QAAA,EAAA,CAGlCD,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,kEAAkE,EACpE,IAAI,EAAC,cAAc,EACnB,OAAO,EAAC,KAAK,EAAA,CACb,EAEFA,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,gEAAgE,EAClE,IAAI,EAAC,cAAc,EACnB,OAAO,EAAC,KAAK,EAAA,CACb,EAEFA,cAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,cAAc,EAAC,OAAO,EAAC,KAAK,EAAA,CAAG,CAAA,EAAA,CAC7D;AAElB;AAEA;;AAEG;AACH,SAAS,WAAW,CAAC,EAAE,SAAS,EAA0B,EAAA;IACxD,QACEA,wBACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,YAEtBA,cAAA,CAAA,UAAA,EAAA,EAAU,MAAM,EAAC,gBAAgB,EAAA,CAAG,EAAA,CAChC;AAEV;AAEA;;AAEG;AACH,SAAS,SAAS,CAAC,EAAE,SAAS,EAA0B,EAAA;IACtD,QACEA,wBACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,YAEtBA,cAAA,CAAA,UAAA,EAAA,EAAU,MAAM,EAAC,gBAAgB,EAAA,CAAG,EAAA,CAChC;AAEV;AAEA;;AAEG;AACH,SAAS,WAAW,CAAC,EAAE,SAAS,EAA0B,EAAA;IACxD,QACEC,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EAAA,QAAA,EAAA,CAEtBD,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,UAAU,EAAA,CAAG,EACrBA,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,8BAA8B,EAAA,CAAG,EACzCA,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,aAAa,EAAA,CAAG,CAAA,EAAA,CACpB;AAEV;;"}
@@ -6,6 +6,7 @@ var DevicContext = require('../../provider/DevicContext.js');
6
6
  var client = require('../../api/client.js');
7
7
  var usePolling = require('../../hooks/usePolling.js');
8
8
  var useModelInterface = require('../../hooks/useModelInterface.js');
9
+ var useTranslations = require('../../i18n/useTranslations.js');
9
10
 
10
11
  /**
11
12
  * Parse a shortcut string like "cmd+j" into its components
@@ -57,6 +58,7 @@ function formatToolName(toolName) {
57
58
  function useAICommandBar(options) {
58
59
  const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, tags, pollingInterval: propsPollingInterval, options: barOptions = {}, isVisible: controlledVisible, onVisibilityChange, onExecute = 'callback', chatDrawerRef, onResponse, modelInterfaceTools = [], onSubmit, onToolCall, onError, onOpen, onClose, } = options;
59
60
  const { shortcut } = barOptions;
61
+ const t = useTranslations.useTranslations(barOptions.translations);
60
62
  // Get context
61
63
  const context = DevicContext.useOptionalDevicContext();
62
64
  const apiKey = propsApiKey || context?.apiKey;
@@ -108,9 +110,9 @@ function useAICommandBar(options) {
108
110
  // Built-in history command
109
111
  const historyCommand = React.useMemo(() => ({
110
112
  keyword: 'history',
111
- description: 'Show command history',
113
+ description: t('Show command history'),
112
114
  message: '', // Special handling
113
- }), []);
115
+ }), [t]);
114
116
  // All available commands (user commands + built-in)
115
117
  const allCommands = React.useMemo(() => {
116
118
  const userCommands = commands;
@@ -356,7 +358,7 @@ function useAICommandBar(options) {
356
358
  // Polling
357
359
  usePolling.usePolling(shouldPoll ? chatUid : null, async () => {
358
360
  if (!clientRef.current || !chatUid) {
359
- throw new Error('Cannot poll without client or chatUid');
361
+ throw new Error(t('Cannot poll without client or chatUid'));
360
362
  }
361
363
  return clientRef.current.getRealtimeHistory(assistantId, chatUid);
362
364
  }, {
@@ -383,7 +385,7 @@ function useAICommandBar(options) {
383
385
  setShouldPoll(false);
384
386
  if (data?.status === 'error') {
385
387
  setIsProcessing(false);
386
- const err = new Error('Processing failed');
388
+ const err = new Error(t('Processing failed'));
387
389
  setError(err);
388
390
  onErrorRef.current?.(err);
389
391
  return;
@@ -431,7 +433,7 @@ function useAICommandBar(options) {
431
433
  if (!msg.trim())
432
434
  return;
433
435
  if (!clientRef.current) {
434
- const err = new Error('API client not configured. Please provide an API key.');
436
+ const err = new Error(t('API client not configured. Please provide an API key.'));
435
437
  setError(err);
436
438
  onErrorRef.current?.(err);
437
439
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useAICommandBar.js","sources":["../../../../../src/components/AICommandBar/useAICommandBar.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { usePolling, resolvePollingInterval } from '../../hooks/usePolling';\nimport { useModelInterface } from '../../hooks/useModelInterface';\nimport type {\n ChatMessage,\n ModelInterfaceTool,\n RealtimeChatHistory,\n} from '../../api/types';\nimport type {\n AICommandBarOptions,\n AICommandBarCommand,\n CommandBarResult,\n ToolCallSummary,\n ChatDrawerHandle,\n} from './AICommandBar.types';\n\nexport interface UseAICommandBarOptions {\n assistantId: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Tags applied to the conversation (merged/deduped with the provider's). */\n tags?: string[];\n /** Poll cadence (ms) for the command in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AICommandBarOptions;\n isVisible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n onExecute?: 'openDrawer' | 'callback';\n chatDrawerRef?: React.RefObject<ChatDrawerHandle>;\n onResponse?: (response: CommandBarResult) => void;\n modelInterfaceTools?: ModelInterfaceTool[];\n onSubmit?: (message: string) => void;\n onToolCall?: (toolName: string, params: Record<string, any>) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface UseAICommandBarResult {\n // Visibility\n isVisible: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n // Input\n inputValue: string;\n setInputValue: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n focus: () => void;\n\n // Processing state\n isProcessing: boolean;\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Result\n result: CommandBarResult | null;\n chatUid: string | null;\n error: Error | null;\n\n // History\n history: string[];\n historyIndex: number;\n showingHistory: boolean;\n setShowingHistory: (show: boolean) => void;\n\n // Commands\n showingCommands: boolean;\n filteredCommands: AICommandBarCommand[];\n selectedCommandIndex: number;\n selectCommand: (command: AICommandBarCommand) => void;\n\n // Actions\n submit: (message?: string) => Promise<void>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n clearHistory: () => void;\n}\n\n/**\n * Parse a shortcut string like \"cmd+j\" into its components\n */\nfunction parseShortcut(shortcut: string): { key: string; modifiers: string[] } {\n const parts = shortcut.toLowerCase().split('+');\n const key = parts.pop() || '';\n const modifiers = parts;\n return { key, modifiers };\n}\n\n/**\n * Check if a keyboard event matches a shortcut string\n */\nfunction matchShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const { key, modifiers } = parseShortcut(shortcut);\n\n const keyMatch = event.key.toLowerCase() === key;\n const cmdMatch = modifiers.includes('cmd') === (event.metaKey || event.ctrlKey);\n const shiftMatch = modifiers.includes('shift') === event.shiftKey;\n const altMatch = modifiers.includes('alt') === event.altKey;\n\n return keyMatch && cmdMatch && shiftMatch && altMatch;\n}\n\n/**\n * Format a shortcut string for display\n */\nexport function formatShortcut(shortcut: string): string {\n const isMac = typeof navigator !== 'undefined' && /Mac/.test(navigator.platform);\n return shortcut\n .replace(/cmd/gi, isMac ? '\\u2318' : 'Ctrl')\n .replace(/shift/gi, '\\u21E7')\n .replace(/alt/gi, isMac ? '\\u2325' : 'Alt')\n .replace(/\\+/g, ' ')\n .replace(/([a-z])/gi, (match) => match.toUpperCase());\n}\n\n/**\n * Format tool name to human-readable (fallback when no summary)\n */\nfunction formatToolName(toolName: string): string {\n // Convert snake_case or camelCase to human-readable\n return toolName\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase()\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/**\n * Hook for managing AICommandBar state and behavior\n */\nexport function useAICommandBar(options: UseAICommandBarOptions): UseAICommandBarResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: barOptions = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools = [],\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n } = options;\n\n const { shortcut } = barOptions;\n\n // Get context\n const context = useOptionalDevicContext();\n const apiKey = propsApiKey || context?.apiKey;\n const getTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const resolvedTags = Array.from(\n new Set([...(context?.tags ?? []), ...(tags ?? [])])\n );\n const pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n\n // Visibility state\n const [internalVisible, setInternalVisible] = useState(false);\n const isVisible = controlledVisible ?? internalVisible;\n\n // Input state\n const [inputValue, setInputValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Processing state\n const [isProcessing, setIsProcessing] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Result state\n const [result, setResult] = useState<CommandBarResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // History state\n const enableHistory = barOptions.enableHistory !== false; // default true\n const maxHistoryItems = barOptions.maxHistoryItems ?? 50;\n const historyStorageKey = barOptions.historyStorageKey ?? 'devic-command-bar-history';\n const showHistoryCommand = barOptions.showHistoryCommand !== false; // default true\n\n const [history, setHistory] = useState<string[]>(() => {\n if (!enableHistory || typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(historyStorageKey);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n });\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showingHistory, setShowingHistory] = useState(false);\n const [tempInput, setTempInput] = useState(''); // Store current input when navigating history\n\n // Commands state\n const commands = barOptions.commands ?? [];\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Built-in history command\n const historyCommand: AICommandBarCommand = useMemo(() => ({\n keyword: 'history',\n description: 'Show command history',\n message: '', // Special handling\n }), []);\n\n // All available commands (user commands + built-in)\n const allCommands = useMemo(() => {\n const userCommands = commands;\n // Add history command if enabled and not overwritten\n if (showHistoryCommand && !userCommands.some(c => c.keyword === 'history')) {\n return [...userCommands, historyCommand];\n }\n return userCommands;\n }, [commands, showHistoryCommand, historyCommand]);\n\n // Detect if showing command suggestions\n const isCommandMode = inputValue.startsWith('/');\n const commandQuery = isCommandMode ? inputValue.slice(1).toLowerCase() : '';\n const showingCommands = isCommandMode && !isProcessing && !result;\n\n // Filter commands based on query\n const filteredCommands = useMemo(() => {\n if (!showingCommands) return [];\n if (commandQuery === '') return allCommands;\n return allCommands.filter(cmd =>\n cmd.keyword.toLowerCase().includes(commandQuery) ||\n cmd.description.toLowerCase().includes(commandQuery)\n );\n }, [showingCommands, commandQuery, allCommands]);\n\n // Reset command selection when filtered list changes\n useEffect(() => {\n setSelectedCommandIndex(0);\n }, [filteredCommands.length]);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onToolCallRef = useRef(onToolCall);\n const onSubmitRef = useRef(onSubmit);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onToolCallRef.current = onToolCall;\n onSubmitRef.current = onSubmit;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n });\n\n // API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Model interface\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Visibility controls\n const open = useCallback(() => {\n setInternalVisible(true);\n onVisibilityChange?.(true);\n onOpenRef.current?.();\n // Focus input after visibility change\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [onVisibilityChange]);\n\n const close = useCallback(() => {\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n }, [onVisibilityChange]);\n\n const toggle = useCallback(() => {\n if (isVisible) {\n close();\n } else {\n open();\n }\n }, [isVisible, open, close]);\n\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Save history to localStorage\n const saveHistory = useCallback((newHistory: string[]) => {\n if (!enableHistory || typeof window === 'undefined') return;\n try {\n localStorage.setItem(historyStorageKey, JSON.stringify(newHistory));\n } catch {\n // Ignore localStorage errors\n }\n }, [enableHistory, historyStorageKey]);\n\n // Add item to history\n const addToHistory = useCallback((message: string) => {\n if (!enableHistory || !message.trim() || message.startsWith('/')) return;\n\n setHistory(prev => {\n // Don't add duplicates at the top\n const filtered = prev.filter(item => item !== message);\n const newHistory = [message, ...filtered].slice(0, maxHistoryItems);\n saveHistory(newHistory);\n return newHistory;\n });\n setHistoryIndex(-1);\n }, [enableHistory, maxHistoryItems, saveHistory]);\n\n // Clear history\n const clearHistory = useCallback(() => {\n setHistory([]);\n setHistoryIndex(-1);\n if (enableHistory && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(historyStorageKey);\n } catch {\n // Ignore\n }\n }\n }, [enableHistory, historyStorageKey]);\n\n // Navigate history\n const navigateHistory = useCallback((direction: 'up' | 'down') => {\n if (!enableHistory || history.length === 0) return;\n\n if (direction === 'up') {\n if (historyIndex === -1) {\n // Save current input before navigating\n setTempInput(inputValue);\n setHistoryIndex(0);\n setInputValue(history[0]);\n } else if (historyIndex < history.length - 1) {\n const newIndex = historyIndex + 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n }\n } else {\n if (historyIndex > 0) {\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n } else if (historyIndex === 0) {\n setHistoryIndex(-1);\n setInputValue(tempInput);\n }\n }\n }, [enableHistory, history, historyIndex, inputValue, tempInput]);\n\n // Ref to hold submit function (to avoid circular dependency)\n const submitRef = useRef<(message?: string) => Promise<void>>();\n\n // Select a command\n const selectCommand = useCallback((command: AICommandBarCommand) => {\n if (command.keyword === 'history') {\n // Special handling for history command\n setShowingHistory(true);\n setInputValue('');\n } else {\n // Send the command's message\n setInputValue('');\n submitRef.current?.(command.message);\n }\n }, []);\n\n // Navigate commands\n const navigateCommands = useCallback((direction: 'up' | 'down') => {\n if (filteredCommands.length === 0) return;\n\n if (direction === 'down') {\n setSelectedCommandIndex(prev =>\n prev < filteredCommands.length - 1 ? prev + 1 : 0\n );\n } else {\n setSelectedCommandIndex(prev =>\n prev > 0 ? prev - 1 : filteredCommands.length - 1\n );\n }\n }, [filteredCommands.length]);\n\n // Register keyboard shortcut\n useEffect(() => {\n if (!shortcut) return;\n\n const handler = (e: KeyboardEvent) => {\n if (matchShortcut(e, shortcut)) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcut, toggle]);\n\n // Process tool calls from realtime data\n const processToolCalls = useCallback((messages: ChatMessage[]): ToolCallSummary[] => {\n const summaries: ToolCallSummary[] = [];\n const toolResponseMap = new Map<string, any>();\n\n // Collect tool responses\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.tool_call_id) {\n toolResponseMap.set(msg.tool_call_id, msg.content);\n }\n }\n\n // Collect tool calls from assistant messages\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n const hasResponse = toolResponseMap.has(tc.id);\n let input: any;\n try {\n input = JSON.parse(tc.function.arguments || '{}');\n } catch {\n input = {};\n }\n\n // Use message summary if available, otherwise format tool name\n const summaryText = msg.summary || formatToolName(tc.function.name);\n\n summaries.push({\n id: tc.id,\n name: tc.function.name,\n status: hasResponse ? 'completed' : 'executing',\n summary: summaryText,\n input,\n output: toolResponseMap.get(tc.id),\n });\n }\n }\n }\n\n return summaries;\n }, []);\n\n // Handle pending client-side tool calls\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\n\n try {\n const { responses } = await executeToolCalls(pendingCalls);\n if (responses.length > 0) {\n await clientRef.current.sendToolResponses(\n assistantId,\n chatUid,\n responses,\n toolSchemas\n );\n setShouldPoll(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, executeToolCalls, extractPendingToolCalls, toolSchemas]\n );\n\n // Polling\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid) {\n throw new Error('Cannot poll without client or chatUid');\n }\n return clientRef.current.getRealtimeHistory(assistantId, chatUid);\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],\n onUpdate: async (data: RealtimeChatHistory) => {\n // Update tool calls display\n const summaries = processToolCalls(data.chatHistory);\n setToolCalls(summaries);\n\n // Update current tool summary\n // Prefer showing an executing tool, but fall back to the last tool (completed or not)\n if (summaries.length > 0) {\n const lastExecuting = summaries.filter(s => s.status === 'executing').pop();\n const lastTool = summaries[summaries.length - 1];\n setCurrentToolSummary(lastExecuting?.summary || lastTool?.summary || null);\n }\n\n // Handle client-side tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error('Processing failed');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n if (data?.status === 'completed') {\n setIsProcessing(false);\n\n // Extract final assistant message\n const assistantMessages = data.chatHistory.filter(m => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const commandResult: CommandBarResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: processToolCalls(data.chatHistory),\n };\n\n setResult(commandResult);\n\n // Handle execution mode\n if (onExecute === 'openDrawer' && chatDrawerRef?.current) {\n chatDrawerRef.current.setChatUid(chatUid);\n chatDrawerRef.current.open();\n // Close and reset the command bar when handing off to drawer\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n } else {\n onResponseRef.current?.(commandResult);\n }\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n // Submit message\n const submit = useCallback(\n async (message?: string) => {\n const msg = message ?? inputValue;\n if (!msg.trim()) return;\n\n if (!clientRef.current) {\n const err = new Error('API client not configured. Please provide an API key.');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Add to history before processing\n addToHistory(msg);\n\n // Clear input and start processing\n setInputValue('');\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setShowingHistory(false);\n setHistoryIndex(-1);\n\n onSubmitRef.current?.(msg);\n\n try {\n const dto = {\n message: msg,\n chatUid: chatUid || undefined,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(resolvedTags.length > 0 && { tags: resolvedTags }),\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n\n if (response.chatUid && response.chatUid !== chatUid) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [inputValue, chatUid, assistantId, resolvedTenantId, resolvedTenantMetadata, resolvedTags, toolSchemas, addToHistory]\n );\n\n // Update submit ref for use in selectCommand\n submitRef.current = submit;\n\n // Reset state\n const reset = useCallback(() => {\n setInputValue('');\n setIsProcessing(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setResult(null);\n setChatUid(null);\n setError(null);\n setShouldPoll(false);\n }, []);\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Handle Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n if (showingHistory) {\n setShowingHistory(false);\n return;\n }\n if (showingCommands) {\n setInputValue('');\n return;\n }\n // Reset if there's a result or if processing\n if (result || isProcessing) {\n reset();\n }\n close();\n return;\n }\n\n // Handle arrow keys for commands\n if (showingCommands && filteredCommands.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n navigateCommands('down');\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateCommands('up');\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n selectCommand(selectedCommand);\n }\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n setInputValue('/' + selectedCommand.keyword + ' ');\n }\n return;\n }\n }\n\n // Handle arrow keys for history (only when not in command mode)\n if (!showingCommands && !isProcessing) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateHistory('up');\n return;\n }\n if (e.key === 'ArrowDown' && historyIndex >= 0) {\n e.preventDefault();\n navigateHistory('down');\n return;\n }\n }\n\n // Handle Enter to submit\n if (e.key === 'Enter' && !e.shiftKey && !isProcessing) {\n e.preventDefault();\n submit();\n }\n },\n [\n isProcessing,\n result,\n showingCommands,\n showingHistory,\n filteredCommands,\n selectedCommandIndex,\n historyIndex,\n submit,\n reset,\n close,\n navigateCommands,\n navigateHistory,\n selectCommand,\n ]\n );\n\n return {\n isVisible,\n open,\n close,\n toggle,\n inputValue,\n setInputValue,\n inputRef,\n focus,\n isProcessing,\n toolCalls,\n currentToolSummary,\n result,\n chatUid,\n error,\n history,\n historyIndex,\n showingHistory,\n setShowingHistory,\n showingCommands,\n filteredCommands,\n selectedCommandIndex,\n selectCommand,\n submit,\n reset,\n handleKeyDown,\n clearHistory,\n };\n}\n"],"names":["useOptionalDevicContext","resolvePollingInterval","useState","useRef","useMemo","useEffect","DevicApiClient","useModelInterface","useCallback","usePolling"],"mappings":";;;;;;;;;AAoFA;;AAEG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAA;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;IAC7B,MAAM,SAAS,GAAG,KAAK;AACvB,IAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE;AAC3B;AAEA;;AAEG;AACH,SAAS,aAAa,CAAC,KAAoB,EAAE,QAAgB,EAAA;IAC3D,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC;IAElD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG;AAChD,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAC/E,IAAA,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,QAAQ;AACjE,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM;AAE3D,IAAA,OAAO,QAAQ,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ;AACvD;AAEA;;AAEG;AACG,SAAU,cAAc,CAAC,QAAgB,EAAA;AAC7C,IAAA,MAAM,KAAK,GAAG,OAAO,SAAS,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;AAChF,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM;AAC1C,SAAA,OAAO,CAAC,SAAS,EAAE,QAAQ;AAC3B,SAAA,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK;AACzC,SAAA,OAAO,CAAC,KAAK,EAAE,GAAG;AAClB,SAAA,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;AACzD;AAEA;;AAEG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAA;;AAEtC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,SAAA,OAAO,CAAC,UAAU,EAAE,KAAK;AACzB,SAAA,IAAI;AACJ,SAAA,WAAW;AACX,SAAA,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1C;AAEA;;AAEG;AACG,SAAU,eAAe,CAAC,OAA+B,EAAA;IAC7D,MAAM,EACJ,WAAW,EACX,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,YAAY,EACrB,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,eAAe,EAAE,oBAAoB,EACrC,OAAO,EAAE,UAAU,GAAG,EAAE,EACxB,SAAS,EAAE,iBAAiB,EAC5B,kBAAkB,EAClB,SAAS,GAAG,UAAU,EACtB,aAAa,EACb,UAAU,EACV,mBAAmB,GAAG,EAAE,EACxB,QAAQ,EACR,UAAU,EACV,OAAO,EACP,MAAM,EACN,OAAO,GACR,GAAG,OAAO;AAEX,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU;;AAG/B,IAAA,MAAM,OAAO,GAAGA,oCAAuB,EAAE;AACzC,IAAA,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,EAAE,MAAM;AAC7C,IAAA,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB;AAClD,IAAA,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB;IAClD,MAAM,OAAO,GAAG,YAAY,IAAI,OAAO,EAAE,OAAO,IAAI,sBAAsB;AAC1E,IAAA,MAAM,gBAAgB,GAAG,QAAQ,IAAI,OAAO,EAAE,QAAQ;IACtD,MAAM,sBAAsB,GAAG,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;AAChF,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,IAAI,GAAG,CAAC,CAAC,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CACrD;IACD,MAAM,eAAe,GAAGC,iCAAsB,CAC5C,oBAAoB,EACpB,OAAO,EAAE,eAAe,CACzB;;IAGD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC;AAC7D,IAAA,MAAM,SAAS,GAAG,iBAAiB,IAAI,eAAe;;IAGtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;AAChD,IAAA,MAAM,QAAQ,GAAGC,YAAM,CAAmB,IAAI,CAAC;;IAG/C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGD,cAAQ,CAAC,KAAK,CAAC;IACvD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAoB,EAAE,CAAC;IACjE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;;IAGjF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAA0B,IAAI,CAAC;IACnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IAC3D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAe,IAAI,CAAC;;IAGtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;IAGnD,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,KAAK,KAAK,CAAC;AACzD,IAAA,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,IAAI,EAAE;AACxD,IAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,IAAI,2BAA2B;IACrF,MAAM,kBAAkB,GAAG,UAAU,CAAC,kBAAkB,KAAK,KAAK,CAAC;IAEnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAW,MAAK;AACpD,QAAA,IAAI,CAAC,aAAa,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,EAAE;AAC9D,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACtD,YAAA,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QACzC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;QACX;AACF,IAAA,CAAC,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AAC3D,IAAA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC,CAAC;;AAG/C,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE;IAC1C,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAGA,cAAQ,CAAC,CAAC,CAAC;;AAGnE,IAAA,MAAM,cAAc,GAAwBE,aAAO,CAAC,OAAO;AACzD,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,EAAE;KACZ,CAAC,EAAE,EAAE,CAAC;;AAGP,IAAA,MAAM,WAAW,GAAGA,aAAO,CAAC,MAAK;QAC/B,MAAM,YAAY,GAAG,QAAQ;;AAE7B,QAAA,IAAI,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE;AAC1E,YAAA,OAAO,CAAC,GAAG,YAAY,EAAE,cAAc,CAAC;QAC1C;AACA,QAAA,OAAO,YAAY;IACrB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;;IAGlD,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;AAChD,IAAA,MAAM,YAAY,GAAG,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3E,MAAM,eAAe,GAAG,aAAa,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;;AAGjE,IAAA,MAAM,gBAAgB,GAAGA,aAAO,CAAC,MAAK;AACpC,QAAA,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,EAAE;QAC/B,IAAI,YAAY,KAAK,EAAE;AAAE,YAAA,OAAO,WAAW;AAC3C,QAAA,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,IAC3B,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAChD,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CACrD;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;;IAGhDC,eAAS,CAAC,MAAK;QACb,uBAAuB,CAAC,CAAC,CAAC;AAC5B,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;;AAG7B,IAAA,MAAM,UAAU,GAAGF,YAAM,CAAC,OAAO,CAAC;AAClC,IAAA,MAAM,aAAa,GAAGA,YAAM,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,aAAa,GAAGA,YAAM,CAAC,UAAU,CAAC;AACxC,IAAA,MAAM,WAAW,GAAGA,YAAM,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,SAAS,GAAGA,YAAM,CAAC,MAAM,CAAC;AAChC,IAAA,MAAM,UAAU,GAAGA,YAAM,CAAC,OAAO,CAAC;IAElCE,eAAS,CAAC,MAAK;AACb,QAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAC5B,QAAA,aAAa,CAAC,OAAO,GAAG,UAAU;AAClC,QAAA,aAAa,CAAC,OAAO,GAAG,UAAU;AAClC,QAAA,WAAW,CAAC,OAAO,GAAG,QAAQ;AAC9B,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM;AAC1B,QAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAC9B,IAAA,CAAC,CAAC;;AAGF,IAAA,MAAM,SAAS,GAAGF,YAAM,CAAwB,IAAI,CAAC;IACrD,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,MAAM,IAAI,gBAAgB,CAAC,EAAE;AACtD,QAAA,SAAS,CAAC,OAAO,GAAG,IAAIG,qBAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACjG;IAEAD,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,SAAS,CAAC,OAAO,IAAI,MAAM,EAAE;YAC/B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAClD;AACF,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;IAGrB,MAAM,EACJ,WAAW,EACX,eAAe,EAAE,gBAAgB,EACjC,uBAAuB,GACxB,GAAGE,mCAAiB,CAAC;AACpB,QAAA,KAAK,EAAE,mBAAmB;AAC1B,QAAA,aAAa,EAAE,UAAU;AAC1B,KAAA,CAAC;;AAGF,IAAA,MAAM,IAAI,GAAGC,iBAAW,CAAC,MAAK;QAC5B,kBAAkB,CAAC,IAAI,CAAC;AACxB,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAC1B,QAAA,SAAS,CAAC,OAAO,IAAI;;AAErB,QAAA,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACjD,IAAA,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;AAExB,IAAA,MAAM,KAAK,GAAGA,iBAAW,CAAC,MAAK;QAC7B,kBAAkB,CAAC,KAAK,CAAC;AACzB,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAC3B,QAAA,UAAU,CAAC,OAAO,IAAI;AACxB,IAAA,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;AAExB,IAAA,MAAM,MAAM,GAAGA,iBAAW,CAAC,MAAK;QAC9B,IAAI,SAAS,EAAE;AACb,YAAA,KAAK,EAAE;QACT;aAAO;AACL,YAAA,IAAI,EAAE;QACR;IACF,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE5B,IAAA,MAAM,KAAK,GAAGA,iBAAW,CAAC,MAAK;AAC7B,QAAA,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE;IAC3B,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,WAAW,GAAGA,iBAAW,CAAC,CAAC,UAAoB,KAAI;AACvD,QAAA,IAAI,CAAC,aAAa,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE;AACrD,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrE;AAAE,QAAA,MAAM;;QAER;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;;AAGtC,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAAC,CAAC,OAAe,KAAI;AACnD,QAAA,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE;QAElE,UAAU,CAAC,IAAI,IAAG;;AAEhB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC;AACtD,YAAA,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;YACnE,WAAW,CAAC,UAAU,CAAC;AACvB,YAAA,OAAO,UAAU;AACnB,QAAA,CAAC,CAAC;AACF,QAAA,eAAe,CAAC,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;;AAGjD,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAAC,MAAK;QACpC,UAAU,CAAC,EAAE,CAAC;AACd,QAAA,eAAe,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,aAAa,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAClD,YAAA,IAAI;AACF,gBAAA,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAC5C;AAAE,YAAA,MAAM;;YAER;QACF;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;;AAGtC,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,CAAC,SAAwB,KAAI;AAC/D,QAAA,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;AAE5C,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,YAAA,IAAI,YAAY,KAAK,EAAE,EAAE;;gBAEvB,YAAY,CAAC,UAAU,CAAC;gBACxB,eAAe,CAAC,CAAC,CAAC;AAClB,gBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B;iBAAO,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,gBAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC;gBACjC,eAAe,CAAC,QAAQ,CAAC;AACzB,gBAAA,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC;QACF;aAAO;AACL,YAAA,IAAI,YAAY,GAAG,CAAC,EAAE;AACpB,gBAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,CAAC;gBACjC,eAAe,CAAC,QAAQ,CAAC;AACzB,gBAAA,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC;AAAO,iBAAA,IAAI,YAAY,KAAK,CAAC,EAAE;AAC7B,gBAAA,eAAe,CAAC,EAAE,CAAC;gBACnB,aAAa,CAAC,SAAS,CAAC;YAC1B;QACF;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;;AAGjE,IAAA,MAAM,SAAS,GAAGL,YAAM,EAAuC;;AAG/D,IAAA,MAAM,aAAa,GAAGK,iBAAW,CAAC,CAAC,OAA4B,KAAI;AACjE,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;;YAEjC,iBAAiB,CAAC,IAAI,CAAC;YACvB,aAAa,CAAC,EAAE,CAAC;QACnB;aAAO;;YAEL,aAAa,CAAC,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACtC;IACF,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,gBAAgB,GAAGA,iBAAW,CAAC,CAAC,SAAwB,KAAI;AAChE,QAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE;AAEnC,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,uBAAuB,CAAC,IAAI,IAC1B,IAAI,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAClD;QACH;aAAO;YACL,uBAAuB,CAAC,IAAI,IAC1B,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAClD;QACH;AACF,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;;IAG7BH,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,MAAM,OAAO,GAAG,CAAC,CAAgB,KAAI;AACnC,YAAA,IAAI,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;gBAC9B,CAAC,CAAC,cAAc,EAAE;AAClB,gBAAA,MAAM,EAAE;YACV;AACF,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC3C,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC7D,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;AAGtB,IAAA,MAAM,gBAAgB,GAAGG,iBAAW,CAAC,CAAC,QAAuB,KAAuB;QAClF,MAAM,SAAS,GAAsB,EAAE;AACvC,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAe;;AAG9C,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3C,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC;YACpD;QACF;;AAGA,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAC1B,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE;AACtD,gBAAA,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE;oBAC/B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9C,oBAAA,IAAI,KAAU;AACd,oBAAA,IAAI;AACF,wBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;oBACnD;AAAE,oBAAA,MAAM;wBACN,KAAK,GAAG,EAAE;oBACZ;;AAGA,oBAAA,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAEnE,SAAS,CAAC,IAAI,CAAC;wBACb,EAAE,EAAE,EAAE,CAAC,EAAE;AACT,wBAAA,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;wBACtB,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW;AAC/C,wBAAA,OAAO,EAAE,WAAW;wBACpB,KAAK;wBACL,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;AACnC,qBAAA,CAAC;gBACJ;YACF;QACF;AAEA,QAAA,OAAO,SAAS;IAClB,CAAC,EAAE,EAAE,CAAC;;IAGN,MAAM,sBAAsB,GAAGA,iBAAW,CACxC,OAAO,IAAyB,KAAI;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO;YAAE;AAEpC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC;AACvF,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;AAE/B,QAAA,IAAI;YACF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC;AAC1D,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,gBAAA,MAAM,SAAS,CAAC,OAAO,CAAC,iBAAiB,CACvC,WAAW,EACX,OAAO,EACP,SAAS,EACT,WAAW,CACZ;gBACD,aAAa,CAAC,IAAI,CAAC;YACrB;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,CAAC;AACf,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B;AACF,IAAA,CAAC,EACD,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,CAAC,CAC/E;;AAGD,IAAAC,qBAAU,CACR,UAAU,GAAG,OAAO,GAAG,IAAI,EAC3B,YAAW;QACT,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;QAC1D;QACA,OAAO,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC;AACnE,IAAA,CAAC,EACD;AACE,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,2BAA2B,CAAC;AACjE,QAAA,QAAQ,EAAE,OAAO,IAAyB,KAAI;;YAE5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC;YACpD,YAAY,CAAC,SAAS,CAAC;;;AAIvB,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,EAAE;gBAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChD,qBAAqB,CAAC,aAAa,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,IAAI,CAAC;YAC5E;;AAGA,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,2BAA2B,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE;AAChF,gBAAA,MAAM,sBAAsB,CAAC,IAAI,CAAC;YACpC;QACF,CAAC;AACD,QAAA,MAAM,EAAE,CAAC,IAAI,KAAI;YACf,aAAa,CAAC,KAAK,CAAC;AAEpB,YAAA,IAAI,IAAI,EAAE,MAAM,KAAK,OAAO,EAAE;gBAC5B,eAAe,CAAC,KAAK,CAAC;AACtB,gBAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC;gBAC1C,QAAQ,CAAC,GAAG,CAAC;AACb,gBAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;gBACzB;YACF;AAEA,YAAA,IAAI,IAAI,EAAE,MAAM,KAAK,WAAW,EAAE;gBAChC,eAAe,CAAC,KAAK,CAAC;;AAGtB,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;gBAC9E,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;AAE5E,gBAAA,IAAI,oBAAoB,IAAI,OAAO,EAAE;AACnC,oBAAA,MAAM,aAAa,GAAqB;wBACtC,OAAO;AACP,wBAAA,OAAO,EAAE,oBAAoB;AAC7B,wBAAA,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC9C;oBAED,SAAS,CAAC,aAAa,CAAC;;oBAGxB,IAAI,SAAS,KAAK,YAAY,IAAI,aAAa,EAAE,OAAO,EAAE;AACxD,wBAAA,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;AACzC,wBAAA,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE;;wBAE5B,SAAS,CAAC,IAAI,CAAC;wBACf,YAAY,CAAC,EAAE,CAAC;wBAChB,qBAAqB,CAAC,IAAI,CAAC;wBAC3B,kBAAkB,CAAC,KAAK,CAAC;AACzB,wBAAA,kBAAkB,GAAG,KAAK,CAAC;AAC3B,wBAAA,UAAU,CAAC,OAAO,IAAI;oBACxB;yBAAO;AACL,wBAAA,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC;oBACxC;gBACF;YACF;QACF,CAAC;AACD,QAAA,OAAO,EAAE,CAAC,GAAG,KAAI;YACf,QAAQ,CAAC,GAAG,CAAC;YACb,eAAe,CAAC,KAAK,CAAC;YACtB,aAAa,CAAC,KAAK,CAAC;AACpB,YAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;QAC3B,CAAC;AACF,KAAA,CACF;;IAGD,MAAM,MAAM,GAAGD,iBAAW,CACxB,OAAO,OAAgB,KAAI;AACzB,QAAA,MAAM,GAAG,GAAG,OAAO,IAAI,UAAU;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE;AAEjB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,uDAAuD,CAAC;YAC9E,QAAQ,CAAC,GAAG,CAAC;AACb,YAAA,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;YACzB;QACF;;QAGA,YAAY,CAAC,GAAG,CAAC;;QAGjB,aAAa,CAAC,EAAE,CAAC;QACjB,eAAe,CAAC,IAAI,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC;QACd,SAAS,CAAC,IAAI,CAAC;QACf,YAAY,CAAC,EAAE,CAAC;QAChB,qBAAqB,CAAC,IAAI,CAAC;QAC3B,iBAAiB,CAAC,KAAK,CAAC;AACxB,QAAA,eAAe,CAAC,EAAE,CAAC;AAEnB,QAAA,WAAW,CAAC,OAAO,GAAG,GAAG,CAAC;AAE1B,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG;AACV,gBAAA,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,OAAO,IAAI,SAAS;AAC7B,gBAAA,QAAQ,EAAE,sBAAsB;AAChC,gBAAA,QAAQ,EAAE,gBAAgB;AAC1B,gBAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACtD,gBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aACtD;AAED,YAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC;YAE3E,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE;AACpD,gBAAA,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC9B;YAEA,aAAa,CAAC,IAAI,CAAC;QACrB;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,CAAC;YACf,eAAe,CAAC,KAAK,CAAC;AACtB,YAAA,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B;AACF,IAAA,CAAC,EACD,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CACtH;;AAGD,IAAA,SAAS,CAAC,OAAO,GAAG,MAAM;;AAG1B,IAAA,MAAM,KAAK,GAAGA,iBAAW,CAAC,MAAK;QAC7B,aAAa,CAAC,EAAE,CAAC;QACjB,eAAe,CAAC,KAAK,CAAC;QACtB,YAAY,CAAC,EAAE,CAAC;QAChB,qBAAqB,CAAC,IAAI,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC;QACf,UAAU,CAAC,IAAI,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC;QACd,aAAa,CAAC,KAAK,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAC/B,CAAC,CAAsB,KAAI;;AAEzB,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YACtB,CAAC,CAAC,cAAc,EAAE;YAClB,IAAI,cAAc,EAAE;gBAClB,iBAAiB,CAAC,KAAK,CAAC;gBACxB;YACF;YACA,IAAI,eAAe,EAAE;gBACnB,aAAa,CAAC,EAAE,CAAC;gBACjB;YACF;;AAEA,YAAA,IAAI,MAAM,IAAI,YAAY,EAAE;AAC1B,gBAAA,KAAK,EAAE;YACT;AACA,YAAA,KAAK,EAAE;YACP;QACF;;QAGA,IAAI,eAAe,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AAClD,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE;gBACzB,CAAC,CAAC,cAAc,EAAE;gBAClB,gBAAgB,CAAC,MAAM,CAAC;gBACxB;YACF;AACA,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;gBACvB,CAAC,CAAC,cAAc,EAAE;gBAClB,gBAAgB,CAAC,IAAI,CAAC;gBACtB;YACF;YACA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACpC,CAAC,CAAC,cAAc,EAAE;AAClB,gBAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;gBAC9D,IAAI,eAAe,EAAE;oBACnB,aAAa,CAAC,eAAe,CAAC;gBAChC;gBACA;YACF;AACA,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE;gBACnB,CAAC,CAAC,cAAc,EAAE;AAClB,gBAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;gBAC9D,IAAI,eAAe,EAAE;oBACnB,aAAa,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,GAAG,GAAG,CAAC;gBACpD;gBACA;YACF;QACF;;AAGA,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE;AACrC,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;gBACvB,CAAC,CAAC,cAAc,EAAE;gBAClB,eAAe,CAAC,IAAI,CAAC;gBACrB;YACF;YACA,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,YAAY,IAAI,CAAC,EAAE;gBAC9C,CAAC,CAAC,cAAc,EAAE;gBAClB,eAAe,CAAC,MAAM,CAAC;gBACvB;YACF;QACF;;AAGA,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE;YACrD,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,MAAM,EAAE;QACV;AACF,IAAA,CAAC,EACD;QACE,YAAY;QACZ,MAAM;QACN,eAAe;QACf,cAAc;QACd,gBAAgB;QAChB,oBAAoB;QACpB,YAAY;QACZ,MAAM;QACN,KAAK;QACL,KAAK;QACL,gBAAgB;QAChB,eAAe;QACf,aAAa;AACd,KAAA,CACF;IAED,OAAO;QACL,SAAS;QACT,IAAI;QACJ,KAAK;QACL,MAAM;QACN,UAAU;QACV,aAAa;QACb,QAAQ;QACR,KAAK;QACL,YAAY;QACZ,SAAS;QACT,kBAAkB;QAClB,MAAM;QACN,OAAO;QACP,KAAK;QACL,OAAO;QACP,YAAY;QACZ,cAAc;QACd,iBAAiB;QACjB,eAAe;QACf,gBAAgB;QAChB,oBAAoB;QACpB,aAAa;QACb,MAAM;QACN,KAAK;QACL,aAAa;QACb,YAAY;KACb;AACH;;;"}
1
+ {"version":3,"file":"useAICommandBar.js","sources":["../../../../../src/components/AICommandBar/useAICommandBar.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { usePolling, resolvePollingInterval } from '../../hooks/usePolling';\nimport { useModelInterface } from '../../hooks/useModelInterface';\nimport { useTranslations } from '../../i18n';\nimport type {\n ChatMessage,\n ModelInterfaceTool,\n RealtimeChatHistory,\n} from '../../api/types';\nimport type {\n AICommandBarOptions,\n AICommandBarCommand,\n CommandBarResult,\n ToolCallSummary,\n ChatDrawerHandle,\n} from './AICommandBar.types';\n\nexport interface UseAICommandBarOptions {\n assistantId: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Tags applied to the conversation (merged/deduped with the provider's). */\n tags?: string[];\n /** Poll cadence (ms) for the command in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AICommandBarOptions;\n isVisible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n onExecute?: 'openDrawer' | 'callback';\n chatDrawerRef?: React.RefObject<ChatDrawerHandle>;\n onResponse?: (response: CommandBarResult) => void;\n modelInterfaceTools?: ModelInterfaceTool[];\n onSubmit?: (message: string) => void;\n onToolCall?: (toolName: string, params: Record<string, any>) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface UseAICommandBarResult {\n // Visibility\n isVisible: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n // Input\n inputValue: string;\n setInputValue: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n focus: () => void;\n\n // Processing state\n isProcessing: boolean;\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Result\n result: CommandBarResult | null;\n chatUid: string | null;\n error: Error | null;\n\n // History\n history: string[];\n historyIndex: number;\n showingHistory: boolean;\n setShowingHistory: (show: boolean) => void;\n\n // Commands\n showingCommands: boolean;\n filteredCommands: AICommandBarCommand[];\n selectedCommandIndex: number;\n selectCommand: (command: AICommandBarCommand) => void;\n\n // Actions\n submit: (message?: string) => Promise<void>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n clearHistory: () => void;\n}\n\n/**\n * Parse a shortcut string like \"cmd+j\" into its components\n */\nfunction parseShortcut(shortcut: string): { key: string; modifiers: string[] } {\n const parts = shortcut.toLowerCase().split('+');\n const key = parts.pop() || '';\n const modifiers = parts;\n return { key, modifiers };\n}\n\n/**\n * Check if a keyboard event matches a shortcut string\n */\nfunction matchShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const { key, modifiers } = parseShortcut(shortcut);\n\n const keyMatch = event.key.toLowerCase() === key;\n const cmdMatch = modifiers.includes('cmd') === (event.metaKey || event.ctrlKey);\n const shiftMatch = modifiers.includes('shift') === event.shiftKey;\n const altMatch = modifiers.includes('alt') === event.altKey;\n\n return keyMatch && cmdMatch && shiftMatch && altMatch;\n}\n\n/**\n * Format a shortcut string for display\n */\nexport function formatShortcut(shortcut: string): string {\n const isMac = typeof navigator !== 'undefined' && /Mac/.test(navigator.platform);\n return shortcut\n .replace(/cmd/gi, isMac ? '\\u2318' : 'Ctrl')\n .replace(/shift/gi, '\\u21E7')\n .replace(/alt/gi, isMac ? '\\u2325' : 'Alt')\n .replace(/\\+/g, ' ')\n .replace(/([a-z])/gi, (match) => match.toUpperCase());\n}\n\n/**\n * Format tool name to human-readable (fallback when no summary)\n */\nfunction formatToolName(toolName: string): string {\n // Convert snake_case or camelCase to human-readable\n return toolName\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase()\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/**\n * Hook for managing AICommandBar state and behavior\n */\nexport function useAICommandBar(options: UseAICommandBarOptions): UseAICommandBarResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: barOptions = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools = [],\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n } = options;\n\n const { shortcut } = barOptions;\n\n const t = useTranslations(barOptions.translations);\n\n // Get context\n const context = useOptionalDevicContext();\n const apiKey = propsApiKey || context?.apiKey;\n const getTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const resolvedTags = Array.from(\n new Set([...(context?.tags ?? []), ...(tags ?? [])])\n );\n const pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n\n // Visibility state\n const [internalVisible, setInternalVisible] = useState(false);\n const isVisible = controlledVisible ?? internalVisible;\n\n // Input state\n const [inputValue, setInputValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Processing state\n const [isProcessing, setIsProcessing] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Result state\n const [result, setResult] = useState<CommandBarResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // History state\n const enableHistory = barOptions.enableHistory !== false; // default true\n const maxHistoryItems = barOptions.maxHistoryItems ?? 50;\n const historyStorageKey = barOptions.historyStorageKey ?? 'devic-command-bar-history';\n const showHistoryCommand = barOptions.showHistoryCommand !== false; // default true\n\n const [history, setHistory] = useState<string[]>(() => {\n if (!enableHistory || typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(historyStorageKey);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n });\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showingHistory, setShowingHistory] = useState(false);\n const [tempInput, setTempInput] = useState(''); // Store current input when navigating history\n\n // Commands state\n const commands = barOptions.commands ?? [];\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Built-in history command\n const historyCommand: AICommandBarCommand = useMemo(() => ({\n keyword: 'history',\n description: t('Show command history'),\n message: '', // Special handling\n }), [t]);\n\n // All available commands (user commands + built-in)\n const allCommands = useMemo(() => {\n const userCommands = commands;\n // Add history command if enabled and not overwritten\n if (showHistoryCommand && !userCommands.some(c => c.keyword === 'history')) {\n return [...userCommands, historyCommand];\n }\n return userCommands;\n }, [commands, showHistoryCommand, historyCommand]);\n\n // Detect if showing command suggestions\n const isCommandMode = inputValue.startsWith('/');\n const commandQuery = isCommandMode ? inputValue.slice(1).toLowerCase() : '';\n const showingCommands = isCommandMode && !isProcessing && !result;\n\n // Filter commands based on query\n const filteredCommands = useMemo(() => {\n if (!showingCommands) return [];\n if (commandQuery === '') return allCommands;\n return allCommands.filter(cmd =>\n cmd.keyword.toLowerCase().includes(commandQuery) ||\n cmd.description.toLowerCase().includes(commandQuery)\n );\n }, [showingCommands, commandQuery, allCommands]);\n\n // Reset command selection when filtered list changes\n useEffect(() => {\n setSelectedCommandIndex(0);\n }, [filteredCommands.length]);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onToolCallRef = useRef(onToolCall);\n const onSubmitRef = useRef(onSubmit);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onToolCallRef.current = onToolCall;\n onSubmitRef.current = onSubmit;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n });\n\n // API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Model interface\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Visibility controls\n const open = useCallback(() => {\n setInternalVisible(true);\n onVisibilityChange?.(true);\n onOpenRef.current?.();\n // Focus input after visibility change\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [onVisibilityChange]);\n\n const close = useCallback(() => {\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n }, [onVisibilityChange]);\n\n const toggle = useCallback(() => {\n if (isVisible) {\n close();\n } else {\n open();\n }\n }, [isVisible, open, close]);\n\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Save history to localStorage\n const saveHistory = useCallback((newHistory: string[]) => {\n if (!enableHistory || typeof window === 'undefined') return;\n try {\n localStorage.setItem(historyStorageKey, JSON.stringify(newHistory));\n } catch {\n // Ignore localStorage errors\n }\n }, [enableHistory, historyStorageKey]);\n\n // Add item to history\n const addToHistory = useCallback((message: string) => {\n if (!enableHistory || !message.trim() || message.startsWith('/')) return;\n\n setHistory(prev => {\n // Don't add duplicates at the top\n const filtered = prev.filter(item => item !== message);\n const newHistory = [message, ...filtered].slice(0, maxHistoryItems);\n saveHistory(newHistory);\n return newHistory;\n });\n setHistoryIndex(-1);\n }, [enableHistory, maxHistoryItems, saveHistory]);\n\n // Clear history\n const clearHistory = useCallback(() => {\n setHistory([]);\n setHistoryIndex(-1);\n if (enableHistory && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(historyStorageKey);\n } catch {\n // Ignore\n }\n }\n }, [enableHistory, historyStorageKey]);\n\n // Navigate history\n const navigateHistory = useCallback((direction: 'up' | 'down') => {\n if (!enableHistory || history.length === 0) return;\n\n if (direction === 'up') {\n if (historyIndex === -1) {\n // Save current input before navigating\n setTempInput(inputValue);\n setHistoryIndex(0);\n setInputValue(history[0]);\n } else if (historyIndex < history.length - 1) {\n const newIndex = historyIndex + 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n }\n } else {\n if (historyIndex > 0) {\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n } else if (historyIndex === 0) {\n setHistoryIndex(-1);\n setInputValue(tempInput);\n }\n }\n }, [enableHistory, history, historyIndex, inputValue, tempInput]);\n\n // Ref to hold submit function (to avoid circular dependency)\n const submitRef = useRef<(message?: string) => Promise<void>>();\n\n // Select a command\n const selectCommand = useCallback((command: AICommandBarCommand) => {\n if (command.keyword === 'history') {\n // Special handling for history command\n setShowingHistory(true);\n setInputValue('');\n } else {\n // Send the command's message\n setInputValue('');\n submitRef.current?.(command.message);\n }\n }, []);\n\n // Navigate commands\n const navigateCommands = useCallback((direction: 'up' | 'down') => {\n if (filteredCommands.length === 0) return;\n\n if (direction === 'down') {\n setSelectedCommandIndex(prev =>\n prev < filteredCommands.length - 1 ? prev + 1 : 0\n );\n } else {\n setSelectedCommandIndex(prev =>\n prev > 0 ? prev - 1 : filteredCommands.length - 1\n );\n }\n }, [filteredCommands.length]);\n\n // Register keyboard shortcut\n useEffect(() => {\n if (!shortcut) return;\n\n const handler = (e: KeyboardEvent) => {\n if (matchShortcut(e, shortcut)) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcut, toggle]);\n\n // Process tool calls from realtime data\n const processToolCalls = useCallback((messages: ChatMessage[]): ToolCallSummary[] => {\n const summaries: ToolCallSummary[] = [];\n const toolResponseMap = new Map<string, any>();\n\n // Collect tool responses\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.tool_call_id) {\n toolResponseMap.set(msg.tool_call_id, msg.content);\n }\n }\n\n // Collect tool calls from assistant messages\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n const hasResponse = toolResponseMap.has(tc.id);\n let input: any;\n try {\n input = JSON.parse(tc.function.arguments || '{}');\n } catch {\n input = {};\n }\n\n // Use message summary if available, otherwise format tool name\n const summaryText = msg.summary || formatToolName(tc.function.name);\n\n summaries.push({\n id: tc.id,\n name: tc.function.name,\n status: hasResponse ? 'completed' : 'executing',\n summary: summaryText,\n input,\n output: toolResponseMap.get(tc.id),\n });\n }\n }\n }\n\n return summaries;\n }, []);\n\n // Handle pending client-side tool calls\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\n\n try {\n const { responses } = await executeToolCalls(pendingCalls);\n if (responses.length > 0) {\n await clientRef.current.sendToolResponses(\n assistantId,\n chatUid,\n responses,\n toolSchemas\n );\n setShouldPoll(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, executeToolCalls, extractPendingToolCalls, toolSchemas]\n );\n\n // Polling\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid) {\n throw new Error(t('Cannot poll without client or chatUid'));\n }\n return clientRef.current.getRealtimeHistory(assistantId, chatUid);\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],\n onUpdate: async (data: RealtimeChatHistory) => {\n // Update tool calls display\n const summaries = processToolCalls(data.chatHistory);\n setToolCalls(summaries);\n\n // Update current tool summary\n // Prefer showing an executing tool, but fall back to the last tool (completed or not)\n if (summaries.length > 0) {\n const lastExecuting = summaries.filter(s => s.status === 'executing').pop();\n const lastTool = summaries[summaries.length - 1];\n setCurrentToolSummary(lastExecuting?.summary || lastTool?.summary || null);\n }\n\n // Handle client-side tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error(t('Processing failed'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n if (data?.status === 'completed') {\n setIsProcessing(false);\n\n // Extract final assistant message\n const assistantMessages = data.chatHistory.filter(m => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const commandResult: CommandBarResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: processToolCalls(data.chatHistory),\n };\n\n setResult(commandResult);\n\n // Handle execution mode\n if (onExecute === 'openDrawer' && chatDrawerRef?.current) {\n chatDrawerRef.current.setChatUid(chatUid);\n chatDrawerRef.current.open();\n // Close and reset the command bar when handing off to drawer\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n } else {\n onResponseRef.current?.(commandResult);\n }\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n // Submit message\n const submit = useCallback(\n async (message?: string) => {\n const msg = message ?? inputValue;\n if (!msg.trim()) return;\n\n if (!clientRef.current) {\n const err = new Error(\n t('API client not configured. Please provide an API key.')\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Add to history before processing\n addToHistory(msg);\n\n // Clear input and start processing\n setInputValue('');\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setShowingHistory(false);\n setHistoryIndex(-1);\n\n onSubmitRef.current?.(msg);\n\n try {\n const dto = {\n message: msg,\n chatUid: chatUid || undefined,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(resolvedTags.length > 0 && { tags: resolvedTags }),\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n\n if (response.chatUid && response.chatUid !== chatUid) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [inputValue, chatUid, assistantId, resolvedTenantId, resolvedTenantMetadata, resolvedTags, toolSchemas, addToHistory]\n );\n\n // Update submit ref for use in selectCommand\n submitRef.current = submit;\n\n // Reset state\n const reset = useCallback(() => {\n setInputValue('');\n setIsProcessing(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setResult(null);\n setChatUid(null);\n setError(null);\n setShouldPoll(false);\n }, []);\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Handle Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n if (showingHistory) {\n setShowingHistory(false);\n return;\n }\n if (showingCommands) {\n setInputValue('');\n return;\n }\n // Reset if there's a result or if processing\n if (result || isProcessing) {\n reset();\n }\n close();\n return;\n }\n\n // Handle arrow keys for commands\n if (showingCommands && filteredCommands.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n navigateCommands('down');\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateCommands('up');\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n selectCommand(selectedCommand);\n }\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n setInputValue('/' + selectedCommand.keyword + ' ');\n }\n return;\n }\n }\n\n // Handle arrow keys for history (only when not in command mode)\n if (!showingCommands && !isProcessing) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateHistory('up');\n return;\n }\n if (e.key === 'ArrowDown' && historyIndex >= 0) {\n e.preventDefault();\n navigateHistory('down');\n return;\n }\n }\n\n // Handle Enter to submit\n if (e.key === 'Enter' && !e.shiftKey && !isProcessing) {\n e.preventDefault();\n submit();\n }\n },\n [\n isProcessing,\n result,\n showingCommands,\n showingHistory,\n filteredCommands,\n selectedCommandIndex,\n historyIndex,\n submit,\n reset,\n close,\n navigateCommands,\n navigateHistory,\n selectCommand,\n ]\n );\n\n return {\n isVisible,\n open,\n close,\n toggle,\n inputValue,\n setInputValue,\n inputRef,\n focus,\n isProcessing,\n toolCalls,\n currentToolSummary,\n result,\n chatUid,\n error,\n history,\n historyIndex,\n showingHistory,\n setShowingHistory,\n showingCommands,\n filteredCommands,\n selectedCommandIndex,\n selectCommand,\n submit,\n reset,\n handleKeyDown,\n clearHistory,\n };\n}\n"],"names":["useTranslations","useOptionalDevicContext","resolvePollingInterval","useState","useRef","useMemo","useEffect","DevicApiClient","useModelInterface","useCallback","usePolling"],"mappings":"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"}
@@ -7,6 +7,7 @@ var DevicContext = require('../../provider/DevicContext.js');
7
7
  var index = require('../../utils/index.js');
8
8
  var useAIElementWrapper = require('./useAIElementWrapper.js');
9
9
  var activeWrapperRegistry = require('./activeWrapperRegistry.js');
10
+ var useTranslations = require('../../i18n/useTranslations.js');
10
11
 
11
12
  const DEFAULT_OPTIONS = {
12
13
  showOn: 'hover',
@@ -20,6 +21,7 @@ const DEFAULT_OPTIONS = {
20
21
  color: undefined,
21
22
  drawerPromptPrefix: undefined,
22
23
  defaultInlinePrompt: undefined,
24
+ translations: undefined,
23
25
  };
24
26
  function rectFromDom(rect) {
25
27
  return { top: rect.top, left: rect.left, width: rect.width, height: rect.height };
@@ -51,6 +53,7 @@ function placementStyle(placement, anchor, offset = 8) {
51
53
  const AIElementWrapper = React.forwardRef(function AIElementWrapper(props, ref) {
52
54
  const { label, data, referenceContent, behavior = 'inline', trigger, options = {}, assistantId, getPrompt, apiKey, baseUrl, pollingInterval, tenantId, tenantMetadata, modelInterfaceTools, inlineRenderer, onActivate, onInlineResponse, onError, className, style, children, } = props;
53
55
  const merged = React.useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);
56
+ const t = useTranslations.useTranslations(merged.translations);
54
57
  // Stable instance ID used by the active-wrapper registry (singleton)
55
58
  const wrapperIdRef = React.useRef('');
56
59
  if (!wrapperIdRef.current)
@@ -194,10 +197,10 @@ const AIElementWrapper = React.forwardRef(function AIElementWrapper(props, ref)
194
197
  const sel = window.getSelection();
195
198
  const txt = sel?.toString().trim();
196
199
  if (txt)
197
- return `Cuéntame más sobre: "${txt}"`;
200
+ return t('Cuéntame más sobre: "{text}"', { text: txt });
198
201
  }
199
- return `Cuéntame más sobre: ${label}`;
200
- }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn]);
202
+ return t('Cuéntame más sobre: {label}', { label });
203
+ }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn, t]);
201
204
  const handleActivate = React.useCallback(() => {
202
205
  onActivate?.();
203
206
  if (behavior === 'inline') {
@@ -295,7 +298,7 @@ const AIElementWrapper = React.forwardRef(function AIElementWrapper(props, ref)
295
298
  return jsxRuntime.jsx("div", { className: "devic-aiwrap-error", children: inline.error.message });
296
299
  }
297
300
  if (inline.isProcessing) {
298
- return (jsxRuntime.jsxs("div", { className: "devic-aiwrap-processing", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-spinner", "aria-hidden": "true" }), jsxRuntime.jsx("span", { children: "Pensando\u2026" })] }));
301
+ return (jsxRuntime.jsxs("div", { className: "devic-aiwrap-processing", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-spinner", "aria-hidden": "true" }), jsxRuntime.jsx("span", { children: t('Pensando…') })] }));
299
302
  }
300
303
  if (inline.response) {
301
304
  if (inlineRenderer)
@@ -312,17 +315,17 @@ const AIElementWrapper = React.forwardRef(function AIElementWrapper(props, ref)
312
315
  ? `${merged.triggerBorderRadius}px`
313
316
  : merged.triggerBorderRadius,
314
317
  ...(merged.color ? { ['--devic-aiwrap-color']: merged.color } : {}),
315
- }, children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-icon", "aria-hidden": "true", children: jsxRuntime.jsx(SparklesIcon, {}) }), jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-label", children: merged.triggerLabel })] }));
318
+ }, children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-icon", "aria-hidden": "true", children: jsxRuntime.jsx(SparklesIcon, {}) }), jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-label", children: t(merged.triggerLabel) })] }));
316
319
  const portalTarget = typeof document !== 'undefined' ? document.body : null;
317
- return (jsxRuntime.jsxs("span", { ref: containerRef, className: `devic-aiwrap-container ${className || ''}`, style: { position: 'relative', display: 'inline-block', ...style }, "data-highlight": merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false', onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-content", children: children }), portalTarget && triggerVisible &&
318
- reactDom.createPortal(jsxRuntime.jsx("div", { ref: triggerRef, className: "devic-aiwrap-trigger-wrapper", style: triggerStyle, onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), onMouseDown: (e) => {
319
- // Prevent losing the text selection when interacting with trigger
320
- e.preventDefault();
321
- }, onClick: (e) => {
322
- e.stopPropagation();
323
- handleActivate();
324
- }, children: triggerNode }), portalTarget), portalTarget && behavior === 'inline' && isInlineOpen &&
325
- reactDom.createPortal(jsxRuntime.jsxs("div", { ref: tooltipRef, className: "devic-aiwrap-tooltip", style: tooltipStyle, "data-placement": merged.tooltipPlacement, children: [jsxRuntime.jsxs("div", { className: "devic-aiwrap-tooltip-header", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-tooltip-label", children: label }), jsxRuntime.jsx("button", { type: "button", className: "devic-aiwrap-tooltip-close", onClick: closeInline, "aria-label": "Cerrar", children: jsxRuntime.jsx(CloseIcon, {}) })] }), jsxRuntime.jsx("div", { className: "devic-aiwrap-tooltip-body", children: renderInlineContent() })] }), portalTarget)] }));
320
+ return (jsxRuntime.jsx(useTranslations.DevicTranslationsProvider, { translations: merged.translations, children: jsxRuntime.jsxs("span", { ref: containerRef, className: `devic-aiwrap-container ${className || ''}`, style: { position: 'relative', display: 'inline-block', ...style }, "data-highlight": merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false', onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-content", children: children }), portalTarget && triggerVisible &&
321
+ reactDom.createPortal(jsxRuntime.jsx("div", { ref: triggerRef, className: "devic-aiwrap-trigger-wrapper", style: triggerStyle, onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), onMouseDown: (e) => {
322
+ // Prevent losing the text selection when interacting with trigger
323
+ e.preventDefault();
324
+ }, onClick: (e) => {
325
+ e.stopPropagation();
326
+ handleActivate();
327
+ }, children: triggerNode }), portalTarget), portalTarget && behavior === 'inline' && isInlineOpen &&
328
+ reactDom.createPortal(jsxRuntime.jsxs("div", { ref: tooltipRef, className: "devic-aiwrap-tooltip", style: tooltipStyle, "data-placement": merged.tooltipPlacement, children: [jsxRuntime.jsxs("div", { className: "devic-aiwrap-tooltip-header", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-tooltip-label", children: label }), jsxRuntime.jsx("button", { type: "button", className: "devic-aiwrap-tooltip-close", onClick: closeInline, "aria-label": t('Cerrar'), children: jsxRuntime.jsx(CloseIcon, {}) })] }), jsxRuntime.jsx("div", { className: "devic-aiwrap-tooltip-body", children: renderInlineContent() })] }), portalTarget)] }) }));
326
329
  });
327
330
  function SparklesIcon() {
328
331
  return (jsxRuntime.jsxs("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: [jsxRuntime.jsx("path", { d: "M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z", opacity: "0.95" }), jsxRuntime.jsx("path", { d: "M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z", opacity: "0.6" })] }));