@devicai/ui 0.56.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 (172) hide show
  1. package/README.md +180 -5
  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 +27 -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 +55 -14
  20. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/CompactionWidget.js +23 -6
  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 +28 -13
  96. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  97. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +51 -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 +55 -14
  102. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  103. package/dist/esm/components/ChatDrawer/CompactionWidget.d.ts +20 -4
  104. package/dist/esm/components/ChatDrawer/CompactionWidget.js +23 -6
  105. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  106. package/dist/esm/components/ChatDrawer/ConversationSelector.js +6 -4
  107. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  108. package/dist/esm/components/ChatDrawer/GuardrailNotice.d.ts +36 -0
  109. package/dist/esm/components/ChatDrawer/GuardrailNotice.js +38 -0
  110. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  111. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  112. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  113. package/dist/esm/components/ChatDrawer/LimitBanner.js +19 -9
  114. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  115. package/dist/esm/components/ChatDrawer/QueueNotice.js +19 -7
  116. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  117. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  118. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  119. package/dist/esm/components/ChatDrawer/ReferenceChip.js +3 -1
  120. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  121. package/dist/esm/components/ChatDrawer/UsageBar.js +23 -18
  122. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  123. package/dist/esm/components/ChatDrawer/index.d.ts +2 -0
  124. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  125. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  126. package/dist/esm/components/Feedback/FeedbackModal.js +5 -1
  127. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  128. package/dist/esm/components/Feedback/MessageActions.js +3 -1
  129. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  130. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  131. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  132. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js +5 -3
  133. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  134. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  135. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  136. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.d.ts +1 -1
  137. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  138. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  139. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.d.ts +1 -1
  140. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  141. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  142. package/dist/esm/components/IntegrationsModal/McpConnectForm.js +15 -7
  143. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  144. package/dist/esm/components/IntegrationsModal/McpServersSection.js +32 -19
  145. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  146. package/dist/esm/components/IntegrationsModal/useIntegrations.js +3 -1
  147. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  148. package/dist/esm/components/IntegrationsModal/useTenantMcp.js +3 -1
  149. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  150. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +63 -40
  151. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  152. package/dist/esm/hooks/useDevicChat.js +12 -6
  153. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  154. package/dist/esm/hooks/useSpeechRecording.js +8 -4
  155. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  156. package/dist/esm/i18n/index.d.ts +4 -0
  157. package/dist/esm/i18n/translate.d.ts +23 -0
  158. package/dist/esm/i18n/translate.js +43 -0
  159. package/dist/esm/i18n/translate.js.map +1 -0
  160. package/dist/esm/i18n/types.d.ts +27 -0
  161. package/dist/esm/i18n/useTranslations.d.ts +32 -0
  162. package/dist/esm/i18n/useTranslations.js +53 -0
  163. package/dist/esm/i18n/useTranslations.js.map +1 -0
  164. package/dist/esm/index.d.ts +4 -2
  165. package/dist/esm/index.js +3 -0
  166. package/dist/esm/index.js.map +1 -1
  167. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  168. package/dist/esm/provider/DevicProvider.js +3 -1
  169. package/dist/esm/provider/DevicProvider.js.map +1 -1
  170. package/dist/esm/provider/types.d.ts +33 -0
  171. package/dist/esm/styles.css +1 -1
  172. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AIGenerationButton.js","sources":["../../../../src/components/AIGenerationButton/AIGenerationButton.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAIGenerationButton } from './useAIGenerationButton';\nimport type {\n AIGenerationButtonProps,\n AIGenerationButtonHandle,\n AIGenerationButtonOptions,\n} from './AIGenerationButton.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport './AIGenerationButton.css';\n\nconst DEFAULT_OPTIONS: Required<AIGenerationButtonOptions> = {\n mode: 'modal',\n prompt: '',\n placeholder: 'Describe what you want to generate...',\n modalTitle: 'Generate with AI',\n modalDescription: '',\n confirmText: 'Generate',\n cancelText: 'Cancel',\n tooltipPlacement: 'top',\n tooltipWidth: 300,\n variant: 'primary',\n size: 'medium',\n icon: undefined as any,\n hideIcon: false,\n label: 'Generate with AI',\n hideLabel: false,\n loadingLabel: 'Generating...',\n color: '#3b82f6',\n backgroundColor: '',\n textColor: '',\n borderColor: '',\n borderRadius: 8,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n zIndex: 10000,\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n toolGroups: undefined as any,\n};\n\n/**\n * AIGenerationButton component - a button that triggers AI generation with configurable interaction modes\n *\n * @example\n * ```tsx\n * // Direct mode - sends predefined prompt on click\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'direct',\n * prompt: 'Generate a summary of the current page',\n * label: 'Summarize',\n * }}\n * onResponse={({ message }) => console.log(message.content)}\n * />\n *\n * // Modal mode - opens modal for user input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'modal',\n * modalTitle: 'Generate Content',\n * placeholder: 'Describe what you want...',\n * }}\n * onResponse={({ message }) => setContent(message.content.message)}\n * />\n *\n * // Tooltip mode - quick inline input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'tooltip',\n * tooltipPlacement: 'bottom',\n * }}\n * onResponse={handleGeneration}\n * />\n * ```\n */\nexport const AIGenerationButton = forwardRef<AIGenerationButtonHandle, AIGenerationButtonProps>(\n function AIGenerationButton(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n className,\n containerClassName,\n children,\n theme,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAIGenerationButton({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n generate: hook.generate,\n open: hook.open,\n close: hook.close,\n reset: hook.reset,\n isProcessing: hook.isProcessing,\n }));\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = 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-gen-primary', mergedOptions.color],\n ['----devic-gen-bg', mergedOptions.backgroundColor || undefined],\n ['--devic-gen-text', mergedOptions.textColor || undefined],\n ['--devic-gen-border', mergedOptions.borderColor || undefined],\n ['--devic-gen-font-family', mergedOptions.fontFamily],\n ['--devic-gen-font-size', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-gen-radius', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-gen-z-index', String(mergedOptions.zIndex)],\n ['--devic-gen-animation-duration', `${mergedOptions.animationDuration}ms`],\n ];\n\n // Apply theme from parent if provided\n if (theme) {\n if (theme.backgroundColor) vars.push(['--devic-gen-modal-bg', theme.backgroundColor]);\n if (theme.textColor) vars.push(['--devic-gen-modal-text', theme.textColor]);\n if (theme.borderColor) vars.push(['--devic-gen-modal-border', theme.borderColor]);\n if (theme.primaryColor) vars.push(['--devic-gen-primary', theme.primaryColor]);\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, theme]);\n\n // Click outside to close tooltip\n useEffect(() => {\n if (!hook.isOpen || mergedOptions.mode !== 'tooltip') return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const tooltip = tooltipRef.current;\n const container = containerRef.current;\n if (\n tooltip &&\n container &&\n !tooltip.contains(e.target as Node) &&\n !container.contains(e.target as Node)\n ) {\n hook.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isOpen, mergedOptions.mode, hook.close]);\n\n // Handle button click\n const handleButtonClick = useCallback(() => {\n if (disabled || hook.isProcessing) return;\n\n if (mergedOptions.mode === 'direct') {\n hook.generate();\n } else {\n hook.open();\n }\n }, [disabled, hook.isProcessing, mergedOptions.mode, hook.generate, hook.open]);\n\n // Handle confirm in modal/tooltip\n const handleConfirm = useCallback(() => {\n hook.generate();\n }, [hook.generate]);\n\n // Tooltip position styles\n const tooltipPositionStyle = useMemo(() => {\n const placement = mergedOptions.tooltipPlacement;\n const width = typeof mergedOptions.tooltipWidth === 'number'\n ? `${mergedOptions.tooltipWidth}px`\n : mergedOptions.tooltipWidth;\n\n const baseStyle: React.CSSProperties = {\n width,\n position: 'absolute',\n zIndex: mergedOptions.zIndex,\n };\n\n switch (placement) {\n case 'top':\n return { ...baseStyle, bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px' };\n case 'bottom':\n return { ...baseStyle, top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: '8px' };\n case 'left':\n return { ...baseStyle, right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: '8px' };\n case 'right':\n return { ...baseStyle, left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: '8px' };\n default:\n return baseStyle;\n }\n }, [mergedOptions.tooltipPlacement, mergedOptions.tooltipWidth, mergedOptions.zIndex]);\n\n // Render button content\n // Only show loading state on button for direct mode (modal/tooltip have their own loading)\n const showButtonLoading = hook.isProcessing && mergedOptions.mode === 'direct';\n\n const renderButtonContent = () => {\n if (children) {\n return children;\n }\n\n return (\n <>\n {!mergedOptions.hideIcon && (\n <span className=\"devic-gen-button-icon\">\n {showButtonLoading ? (\n <span className=\"devic-gen-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </span>\n )}\n {!mergedOptions.hideLabel && (\n <span className=\"devic-gen-button-label\">\n {showButtonLoading ? mergedOptions.loadingLabel : mergedOptions.label}\n </span>\n )}\n </>\n );\n };\n\n // Render a single tool call item (default rendering)\n const renderSingleToolCall = (tc: ToolCallSummary) => {\n const customRenderer = mergedOptions.toolRenderers?.[tc.name];\n if (customRenderer && tc.status === 'completed') {\n return (\n <div key={tc.id} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n\n const customIcon = mergedOptions.toolIcons?.[tc.name];\n const isExecuting = tc.status === 'executing';\n\n return (\n <div\n key={tc.id}\n className=\"devic-gen-tool-item\"\n data-status={tc.status}\n >\n <span className=\"devic-gen-tool-icon\">\n {isExecuting ? (\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n ) : customIcon ? (\n customIcon\n ) : (\n <CheckIcon />\n )}\n </span>\n <span className=\"devic-gen-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n };\n\n // Render tool calls display\n const renderToolCalls = () => {\n if (!hook.isProcessing || hook.toolCalls.length === 0) {\n return null;\n }\n\n // Separate completed calls (for grouping) from still-active calls\n const completedCalls = hook.toolCalls.filter((tc) => tc.status === 'completed');\n const activeCalls = hook.toolCalls.filter((tc) => tc.status !== 'completed');\n\n let completedElements: React.ReactNode[];\n\n if (mergedOptions.toolGroups && mergedOptions.toolGroups.length > 0 && completedCalls.length > 0) {\n const calls: ToolGroupCall[] = completedCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, mergedOptions.toolGroups);\n completedElements = [];\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 completedElements.push(\n <div key={`gen-group-${groupKey}`} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n completedElements.push(renderSingleToolCall(completedCalls[callIdx]));\n callIdx += 1;\n }\n }\n } else {\n completedElements = completedCalls.map(renderSingleToolCall);\n }\n\n return (\n <div className=\"devic-gen-tool-calls\">\n {completedElements}\n {activeCalls.map(renderSingleToolCall)}\n </div>\n );\n };\n\n // Render processing status\n const renderProcessingStatus = () => {\n if (!hook.isProcessing) return null;\n\n return (\n <div className=\"devic-gen-processing-status\">\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n <span className=\"devic-gen-processing-text\">\n {hook.currentToolSummary || mergedOptions.processingMessage}\n </span>\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-gen-container ${containerClassName || ''}`}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {/* Button */}\n <button\n type=\"button\"\n className={`devic-gen-button ${className || ''}`}\n data-variant={mergedOptions.variant}\n data-size={mergedOptions.size}\n data-processing={showButtonLoading}\n onClick={handleButtonClick}\n disabled={disabled || showButtonLoading}\n >\n {renderButtonContent()}\n </button>\n\n {/* Tooltip */}\n {mergedOptions.mode === 'tooltip' && hook.isOpen && (\n <div\n ref={tooltipRef}\n className=\"devic-gen-tooltip\"\n style={tooltipPositionStyle}\n data-placement={mergedOptions.tooltipPlacement}\n >\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={3}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n <div className=\"devic-gen-tooltip-actions\">\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Modal */}\n {mergedOptions.mode === 'modal' && hook.isOpen && (\n <div\n className=\"devic-gen-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget && !hook.isProcessing) hook.close();\n }}\n >\n <div className=\"devic-gen-modal\">\n <div className=\"devic-gen-modal-header\">\n <h3 className=\"devic-gen-modal-title\">{mergedOptions.modalTitle}</h3>\n <button\n type=\"button\"\n className=\"devic-gen-modal-close\"\n onClick={hook.close}\n aria-label=\"Close\"\n disabled={hook.isProcessing}\n >\n <CloseIcon />\n </button>\n </div>\n {mergedOptions.modalDescription && (\n <p className=\"devic-gen-modal-description\">{mergedOptions.modalDescription}</p>\n )}\n <div className=\"devic-gen-modal-body\">\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={4}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n </div>\n <div className=\"devic-gen-modal-footer\">\n <button\n type=\"button\"\n className=\"devic-gen-modal-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {mergedOptions.cancelText}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-modal-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {mergedOptions.loadingLabel}\n </>\n ) : (\n mergedOptions.confirmText\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\n/**\n * Default sparkles icon\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\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 <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 <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Close icon\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\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 <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n/**\n * Check icon for completed tool calls\n */\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n width=\"14\"\n height=\"14\"\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"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"AIGenerationButton.js","sources":["../../../../src/components/AIGenerationButton/AIGenerationButton.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAIGenerationButton } from './useAIGenerationButton';\nimport type {\n AIGenerationButtonProps,\n AIGenerationButtonHandle,\n AIGenerationButtonOptions,\n} from './AIGenerationButton.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport { DevicTranslationsProvider, useTranslations } from '../../i18n';\nimport './AIGenerationButton.css';\n\nconst DEFAULT_OPTIONS: Required<AIGenerationButtonOptions> = {\n mode: 'modal',\n prompt: '',\n placeholder: 'Describe what you want to generate...',\n modalTitle: 'Generate with AI',\n modalDescription: '',\n confirmText: 'Generate',\n cancelText: 'Cancel',\n tooltipPlacement: 'top',\n tooltipWidth: 300,\n variant: 'primary',\n size: 'medium',\n icon: undefined as any,\n hideIcon: false,\n label: 'Generate with AI',\n hideLabel: false,\n loadingLabel: 'Generating...',\n color: '#3b82f6',\n backgroundColor: '',\n textColor: '',\n borderColor: '',\n borderRadius: 8,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n zIndex: 10000,\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n translations: undefined as any,\n toolGroups: undefined as any,\n};\n\n/**\n * AIGenerationButton component - a button that triggers AI generation with configurable interaction modes\n *\n * @example\n * ```tsx\n * // Direct mode - sends predefined prompt on click\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'direct',\n * prompt: 'Generate a summary of the current page',\n * label: 'Summarize',\n * }}\n * onResponse={({ message }) => console.log(message.content)}\n * />\n *\n * // Modal mode - opens modal for user input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'modal',\n * modalTitle: 'Generate Content',\n * placeholder: 'Describe what you want...',\n * }}\n * onResponse={({ message }) => setContent(message.content.message)}\n * />\n *\n * // Tooltip mode - quick inline input\n * <AIGenerationButton\n * assistantId=\"my-assistant\"\n * options={{\n * mode: 'tooltip',\n * tooltipPlacement: 'bottom',\n * }}\n * onResponse={handleGeneration}\n * />\n * ```\n */\nexport const AIGenerationButton = forwardRef<AIGenerationButtonHandle, AIGenerationButtonProps>(\n function AIGenerationButton(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n className,\n containerClassName,\n children,\n theme,\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 = useAIGenerationButton({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n modelInterfaceTools,\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n generate: hook.generate,\n open: hook.open,\n close: hook.close,\n reset: hook.reset,\n isProcessing: hook.isProcessing,\n }));\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = 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-gen-primary', mergedOptions.color],\n ['----devic-gen-bg', mergedOptions.backgroundColor || undefined],\n ['--devic-gen-text', mergedOptions.textColor || undefined],\n ['--devic-gen-border', mergedOptions.borderColor || undefined],\n ['--devic-gen-font-family', mergedOptions.fontFamily],\n ['--devic-gen-font-size', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-gen-radius', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-gen-z-index', String(mergedOptions.zIndex)],\n ['--devic-gen-animation-duration', `${mergedOptions.animationDuration}ms`],\n ];\n\n // Apply theme from parent if provided\n if (theme) {\n if (theme.backgroundColor) vars.push(['--devic-gen-modal-bg', theme.backgroundColor]);\n if (theme.textColor) vars.push(['--devic-gen-modal-text', theme.textColor]);\n if (theme.borderColor) vars.push(['--devic-gen-modal-border', theme.borderColor]);\n if (theme.primaryColor) vars.push(['--devic-gen-primary', theme.primaryColor]);\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, theme]);\n\n // Click outside to close tooltip\n useEffect(() => {\n if (!hook.isOpen || mergedOptions.mode !== 'tooltip') return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const tooltip = tooltipRef.current;\n const container = containerRef.current;\n if (\n tooltip &&\n container &&\n !tooltip.contains(e.target as Node) &&\n !container.contains(e.target as Node)\n ) {\n hook.close();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isOpen, mergedOptions.mode, hook.close]);\n\n // Handle button click\n const handleButtonClick = useCallback(() => {\n if (disabled || hook.isProcessing) return;\n\n if (mergedOptions.mode === 'direct') {\n hook.generate();\n } else {\n hook.open();\n }\n }, [disabled, hook.isProcessing, mergedOptions.mode, hook.generate, hook.open]);\n\n // Handle confirm in modal/tooltip\n const handleConfirm = useCallback(() => {\n hook.generate();\n }, [hook.generate]);\n\n // Tooltip position styles\n const tooltipPositionStyle = useMemo(() => {\n const placement = mergedOptions.tooltipPlacement;\n const width = typeof mergedOptions.tooltipWidth === 'number'\n ? `${mergedOptions.tooltipWidth}px`\n : mergedOptions.tooltipWidth;\n\n const baseStyle: React.CSSProperties = {\n width,\n position: 'absolute',\n zIndex: mergedOptions.zIndex,\n };\n\n switch (placement) {\n case 'top':\n return { ...baseStyle, bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px' };\n case 'bottom':\n return { ...baseStyle, top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: '8px' };\n case 'left':\n return { ...baseStyle, right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: '8px' };\n case 'right':\n return { ...baseStyle, left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: '8px' };\n default:\n return baseStyle;\n }\n }, [mergedOptions.tooltipPlacement, mergedOptions.tooltipWidth, mergedOptions.zIndex]);\n\n // Render button content\n // Only show loading state on button for direct mode (modal/tooltip have their own loading)\n const showButtonLoading = hook.isProcessing && mergedOptions.mode === 'direct';\n\n const renderButtonContent = () => {\n if (children) {\n return children;\n }\n\n return (\n <>\n {!mergedOptions.hideIcon && (\n <span className=\"devic-gen-button-icon\">\n {showButtonLoading ? (\n <span className=\"devic-gen-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </span>\n )}\n {!mergedOptions.hideLabel && (\n <span className=\"devic-gen-button-label\">\n {showButtonLoading\n ? t(mergedOptions.loadingLabel)\n : t(mergedOptions.label)}\n </span>\n )}\n </>\n );\n };\n\n // Render a single tool call item (default rendering)\n const renderSingleToolCall = (tc: ToolCallSummary) => {\n const customRenderer = mergedOptions.toolRenderers?.[tc.name];\n if (customRenderer && tc.status === 'completed') {\n return (\n <div key={tc.id} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n\n const customIcon = mergedOptions.toolIcons?.[tc.name];\n const isExecuting = tc.status === 'executing';\n\n return (\n <div\n key={tc.id}\n className=\"devic-gen-tool-item\"\n data-status={tc.status}\n >\n <span className=\"devic-gen-tool-icon\">\n {isExecuting ? (\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n ) : customIcon ? (\n customIcon\n ) : (\n <CheckIcon />\n )}\n </span>\n <span className=\"devic-gen-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n };\n\n // Render tool calls display\n const renderToolCalls = () => {\n if (!hook.isProcessing || hook.toolCalls.length === 0) {\n return null;\n }\n\n // Separate completed calls (for grouping) from still-active calls\n const completedCalls = hook.toolCalls.filter((tc) => tc.status === 'completed');\n const activeCalls = hook.toolCalls.filter((tc) => tc.status !== 'completed');\n\n let completedElements: React.ReactNode[];\n\n if (mergedOptions.toolGroups && mergedOptions.toolGroups.length > 0 && completedCalls.length > 0) {\n const calls: ToolGroupCall[] = completedCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, mergedOptions.toolGroups);\n completedElements = [];\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 completedElements.push(\n <div key={`gen-group-${groupKey}`} className=\"devic-gen-tool-item devic-gen-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n completedElements.push(renderSingleToolCall(completedCalls[callIdx]));\n callIdx += 1;\n }\n }\n } else {\n completedElements = completedCalls.map(renderSingleToolCall);\n }\n\n return (\n <div className=\"devic-gen-tool-calls\">\n {completedElements}\n {activeCalls.map(renderSingleToolCall)}\n </div>\n );\n };\n\n // Render processing status\n const renderProcessingStatus = () => {\n if (!hook.isProcessing) return null;\n\n return (\n <div className=\"devic-gen-processing-status\">\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n <span className=\"devic-gen-processing-text\">\n {hook.currentToolSummary || t(mergedOptions.processingMessage)}\n </span>\n </div>\n );\n };\n\n return (\n <DevicTranslationsProvider translations={mergedOptions.translations}>\n <div\n ref={containerRef}\n className={`devic-gen-container ${containerClassName || ''}`}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {/* Button */}\n <button\n type=\"button\"\n className={`devic-gen-button ${className || ''}`}\n data-variant={mergedOptions.variant}\n data-size={mergedOptions.size}\n data-processing={showButtonLoading}\n onClick={handleButtonClick}\n disabled={disabled || showButtonLoading}\n >\n {renderButtonContent()}\n </button>\n\n {/* Tooltip */}\n {mergedOptions.mode === 'tooltip' && hook.isOpen && (\n <div\n ref={tooltipRef}\n className=\"devic-gen-tooltip\"\n style={tooltipPositionStyle}\n data-placement={mergedOptions.tooltipPlacement}\n >\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={t(mergedOptions.placeholder)}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={3}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n <div className=\"devic-gen-tooltip-actions\">\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {t(mergedOptions.cancelText)}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-tooltip-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {t(mergedOptions.loadingLabel)}\n </>\n ) : (\n t(mergedOptions.confirmText)\n )}\n </button>\n </div>\n </div>\n )}\n\n {/* Modal */}\n {mergedOptions.mode === 'modal' && hook.isOpen && (\n <div\n className=\"devic-gen-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget && !hook.isProcessing) hook.close();\n }}\n >\n <div className=\"devic-gen-modal\">\n <div className=\"devic-gen-modal-header\">\n <h3 className=\"devic-gen-modal-title\">\n {t(mergedOptions.modalTitle)}\n </h3>\n <button\n type=\"button\"\n className=\"devic-gen-modal-close\"\n onClick={hook.close}\n aria-label={t('Close')}\n disabled={hook.isProcessing}\n >\n <CloseIcon />\n </button>\n </div>\n {mergedOptions.modalDescription && (\n <p className=\"devic-gen-modal-description\">{mergedOptions.modalDescription}</p>\n )}\n <div className=\"devic-gen-modal-body\">\n {/* Tool calls display */}\n {renderToolCalls()}\n {/* Processing status when no tool calls yet */}\n {hook.isProcessing && hook.toolCalls.length === 0 && renderProcessingStatus()}\n <textarea\n ref={hook.inputRef}\n className=\"devic-gen-input\"\n placeholder={t(mergedOptions.placeholder)}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n rows={4}\n disabled={hook.isProcessing}\n />\n {hook.error && (\n <div className=\"devic-gen-error\">{hook.error.message}</div>\n )}\n </div>\n <div className=\"devic-gen-modal-footer\">\n <button\n type=\"button\"\n className=\"devic-gen-modal-cancel\"\n onClick={hook.close}\n disabled={hook.isProcessing}\n >\n {t(mergedOptions.cancelText)}\n </button>\n <button\n type=\"button\"\n className=\"devic-gen-modal-confirm\"\n onClick={handleConfirm}\n disabled={hook.isProcessing || !hook.inputValue.trim()}\n >\n {hook.isProcessing ? (\n <>\n <span className=\"devic-gen-spinner devic-gen-spinner-small\" />\n {t(mergedOptions.loadingLabel)}\n </>\n ) : (\n t(mergedOptions.confirmText)\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </DevicTranslationsProvider>\n );\n }\n);\n\n/**\n * Default sparkles icon\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\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 <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 <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Close icon\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\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 <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n/**\n * Check icon for completed tool calls\n */\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n width=\"14\"\n height=\"14\"\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"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { ChatMessage, ModelInterfaceTool, ToolGroupConfig } from '../../api/types';
2
2
  import type { FeedbackTheme } from '../Feedback';
3
3
  import type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';
4
+ import type { DevicTranslations } from '../../i18n';
4
5
  /**
5
6
  * Interaction mode for the AIGenerationButton
6
7
  * - 'direct': Sends a message immediately on button click (uses predefined prompt)
@@ -157,6 +158,15 @@ export interface AIGenerationButtonOptions {
157
158
  * Tool group configurations for rendering consecutive tool calls together.
158
159
  */
159
160
  toolGroups?: ToolGroupConfig[];
161
+ /**
162
+ * Translations for the texts this component renders itself, keyed by the
163
+ * exact English text: `{ 'Cancel': 'Cancelar' }`.
164
+ *
165
+ * Merged on top of the `DevicProvider`'s `translations` and passed down to
166
+ * everything mounted below. Anything absent stays as the provider left it,
167
+ * or in English.
168
+ */
169
+ translations?: DevicTranslations;
160
170
  }
161
171
  /**
162
172
  * Handle for programmatically controlling the AIGenerationButton
@@ -4,6 +4,7 @@ import { useOptionalDevicContext } from '../../provider/DevicContext.js';
4
4
  import { DevicApiClient } from '../../api/client.js';
5
5
  import { resolvePollingInterval, usePolling } from '../../hooks/usePolling.js';
6
6
  import { useModelInterface } from '../../hooks/useModelInterface.js';
7
+ import { useTranslations } from '../../i18n/useTranslations.js';
7
8
 
8
9
  /**
9
10
  * Hook for managing AIGenerationButton state and behavior
@@ -11,6 +12,7 @@ import { useModelInterface } from '../../hooks/useModelInterface.js';
11
12
  function useAIGenerationButton(options) {
12
13
  const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, tags, pollingInterval: propsPollingInterval, options: buttonOptions = {}, modelInterfaceTools = [], onResponse, onBeforeSend, onError, onStart, onOpen, onClose, disabled, } = options;
13
14
  const { mode = 'modal' } = buttonOptions;
15
+ const t = useTranslations();
14
16
  // Get context
15
17
  const context = useOptionalDevicContext();
16
18
  const apiKey = propsApiKey || context?.apiKey;
@@ -137,7 +139,7 @@ function useAIGenerationButton(options) {
137
139
  // Polling
138
140
  usePolling(shouldPoll ? chatUid : null, async () => {
139
141
  if (!clientRef.current || !chatUid) {
140
- throw new Error('Cannot poll without client or chatUid');
142
+ throw new Error(t('Cannot poll without client or chatUid'));
141
143
  }
142
144
  return clientRef.current.getRealtimeHistory(assistantId, chatUid);
143
145
  }, {
@@ -163,7 +165,7 @@ function useAIGenerationButton(options) {
163
165
  setShouldPoll(false);
164
166
  if (data?.status === 'error') {
165
167
  setIsProcessing(false);
166
- const err = new Error('Processing failed');
168
+ const err = new Error(t('Processing failed'));
167
169
  setError(err);
168
170
  onErrorRef.current?.(err);
169
171
  resolveRef.current?.(null);
@@ -236,7 +238,7 @@ function useAIGenerationButton(options) {
236
238
  finalPrompt = buttonOptions.prompt || '';
237
239
  }
238
240
  if (!finalPrompt.trim()) {
239
- const err = new Error('Prompt is required');
241
+ const err = new Error(t('Prompt is required'));
240
242
  setError(err);
241
243
  onErrorRef.current?.(err);
242
244
  return null;
@@ -245,7 +247,7 @@ function useAIGenerationButton(options) {
245
247
  return null;
246
248
  }
247
249
  if (!clientRef.current) {
248
- const err = new Error('API client not configured. Please provide an API key.');
250
+ const err = new Error(t('API client not configured. Please provide an API key.'));
249
251
  setError(err);
250
252
  onErrorRef.current?.(err);
251
253
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"useAIGenerationButton.js","sources":["../../../../src/components/AIGenerationButton/useAIGenerationButton.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } 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 AIGenerationButtonOptions,\n GenerationResult,\n} from './AIGenerationButton.types';\nimport type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';\n\nexport interface UseAIGenerationButtonOptions {\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 generation in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AIGenerationButtonOptions;\n modelInterfaceTools?: ModelInterfaceTool[];\n onResponse?: (result: GenerationResult) => void;\n onBeforeSend?: (prompt: string) => string | undefined | Promise<string | undefined>;\n onError?: (error: Error) => void;\n onStart?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n disabled?: boolean;\n}\n\nexport interface UseAIGenerationButtonResult {\n // State\n isOpen: boolean;\n isProcessing: boolean;\n inputValue: string;\n setInputValue: (value: string) => void;\n error: Error | null;\n result: GenerationResult | null;\n\n // Tool calls state\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Input ref\n inputRef: React.RefObject<HTMLTextAreaElement>;\n\n // Actions\n open: () => void;\n close: () => void;\n toggle: () => void;\n generate: (prompt?: string) => Promise<GenerationResult | null>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n}\n\n/**\n * Hook for managing AIGenerationButton state and behavior\n */\nexport function useAIGenerationButton(\n options: UseAIGenerationButtonOptions\n): UseAIGenerationButtonResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: buttonOptions = {},\n modelInterfaceTools = [],\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n } = options;\n\n const { mode = 'modal' } = buttonOptions;\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 // State\n const [isOpen, setIsOpen] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<GenerationResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // Tool calls state\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Refs\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const resolveRef = useRef<((value: GenerationResult | null) => void) | null>(null);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onBeforeSendRef = useRef(onBeforeSend);\n const onStartRef = useRef(onStart);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onBeforeSendRef.current = onBeforeSend;\n onStartRef.current = onStart;\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 });\n\n /**\n * Format tool name to human-readable (fallback when no summary)\n */\n const formatToolName = (toolName: string): string => {\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 * Process tool calls from realtime data\n */\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 - show executing tool or last tool\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 resolveRef.current?.(null);\n resolveRef.current = null;\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: ChatMessage) => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const finalToolCalls = processToolCalls(data.chatHistory);\n const generationResult: GenerationResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: finalToolCalls,\n rawResponse: data,\n };\n\n setResult(generationResult);\n onResponseRef.current?.(generationResult);\n resolveRef.current?.(generationResult);\n resolveRef.current = null;\n\n // Close modal/tooltip after successful generation\n setIsOpen(false);\n onCloseRef.current?.();\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n resolveRef.current?.(null);\n resolveRef.current = null;\n },\n }\n );\n\n // Open modal/tooltip\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n setError(null);\n onOpenRef.current?.();\n // Focus input after opening\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [disabled]);\n\n // Close modal/tooltip\n const close = useCallback(() => {\n setIsOpen(false);\n setInputValue('');\n onCloseRef.current?.();\n }, []);\n\n // Toggle\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n // Generate\n const generate = useCallback(\n async (prompt?: string): Promise<GenerationResult | null> => {\n // Determine the prompt to use\n let finalPrompt = prompt ?? inputValue;\n\n // For direct mode, use predefined prompt if no prompt provided\n if (mode === 'direct' && !finalPrompt) {\n finalPrompt = buttonOptions.prompt || '';\n }\n\n if (!finalPrompt.trim()) {\n const err = new Error('Prompt is required');\n setError(err);\n onErrorRef.current?.(err);\n return null;\n }\n\n if (disabled) {\n return null;\n }\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 null;\n }\n\n // Call onBeforeSend hook\n if (onBeforeSendRef.current) {\n const modifiedPrompt = await onBeforeSendRef.current(finalPrompt);\n if (modifiedPrompt !== undefined) {\n finalPrompt = modifiedPrompt;\n }\n }\n\n // Start processing\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n onStartRef.current?.();\n\n // Create a promise that will resolve when generation completes\n const resultPromise = new Promise<GenerationResult | null>((resolve) => {\n resolveRef.current = resolve;\n });\n\n try {\n const dto = {\n message: finalPrompt,\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) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n\n return resultPromise;\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 return null;\n }\n },\n [\n inputValue,\n mode,\n buttonOptions.prompt,\n disabled,\n assistantId,\n resolvedTenantId,\n resolvedTenantMetadata,\n resolvedTags,\n toolSchemas,\n ]\n );\n\n // Reset\n const reset = useCallback(() => {\n setIsOpen(false);\n setIsProcessing(false);\n setInputValue('');\n setError(null);\n setResult(null);\n setChatUid(null);\n setShouldPoll(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\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 close();\n return;\n }\n\n // Handle Enter to submit (Cmd/Ctrl + Enter or Enter without Shift)\n if (e.key === 'Enter' && !isProcessing) {\n if (e.metaKey || e.ctrlKey || !e.shiftKey) {\n e.preventDefault();\n generate();\n }\n }\n },\n [isProcessing, generate, close]\n );\n\n return {\n isOpen,\n isProcessing,\n inputValue,\n setInputValue,\n error,\n result,\n toolCalls,\n currentToolSummary,\n inputRef,\n open,\n close,\n toggle,\n generate,\n reset,\n handleKeyDown,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAIGenerationButton.js","sources":["../../../../src/components/AIGenerationButton/useAIGenerationButton.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } 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 AIGenerationButtonOptions,\n GenerationResult,\n} from './AIGenerationButton.types';\nimport type { ToolCallSummary } from '../AICommandBar/AICommandBar.types';\n\nexport interface UseAIGenerationButtonOptions {\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 generation in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AIGenerationButtonOptions;\n modelInterfaceTools?: ModelInterfaceTool[];\n onResponse?: (result: GenerationResult) => void;\n onBeforeSend?: (prompt: string) => string | undefined | Promise<string | undefined>;\n onError?: (error: Error) => void;\n onStart?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n disabled?: boolean;\n}\n\nexport interface UseAIGenerationButtonResult {\n // State\n isOpen: boolean;\n isProcessing: boolean;\n inputValue: string;\n setInputValue: (value: string) => void;\n error: Error | null;\n result: GenerationResult | null;\n\n // Tool calls state\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Input ref\n inputRef: React.RefObject<HTMLTextAreaElement>;\n\n // Actions\n open: () => void;\n close: () => void;\n toggle: () => void;\n generate: (prompt?: string) => Promise<GenerationResult | null>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n}\n\n/**\n * Hook for managing AIGenerationButton state and behavior\n */\nexport function useAIGenerationButton(\n options: UseAIGenerationButtonOptions\n): UseAIGenerationButtonResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: buttonOptions = {},\n modelInterfaceTools = [],\n onResponse,\n onBeforeSend,\n onError,\n onStart,\n onOpen,\n onClose,\n disabled,\n } = options;\n\n const { mode = 'modal' } = buttonOptions;\n const t = useTranslations();\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 // State\n const [isOpen, setIsOpen] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<Error | null>(null);\n const [result, setResult] = useState<GenerationResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // Tool calls state\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Refs\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const resolveRef = useRef<((value: GenerationResult | null) => void) | null>(null);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onBeforeSendRef = useRef(onBeforeSend);\n const onStartRef = useRef(onStart);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onBeforeSendRef.current = onBeforeSend;\n onStartRef.current = onStart;\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 });\n\n /**\n * Format tool name to human-readable (fallback when no summary)\n */\n const formatToolName = (toolName: string): string => {\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 * Process tool calls from realtime data\n */\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 - show executing tool or last tool\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 resolveRef.current?.(null);\n resolveRef.current = null;\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: ChatMessage) => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const finalToolCalls = processToolCalls(data.chatHistory);\n const generationResult: GenerationResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: finalToolCalls,\n rawResponse: data,\n };\n\n setResult(generationResult);\n onResponseRef.current?.(generationResult);\n resolveRef.current?.(generationResult);\n resolveRef.current = null;\n\n // Close modal/tooltip after successful generation\n setIsOpen(false);\n onCloseRef.current?.();\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n resolveRef.current?.(null);\n resolveRef.current = null;\n },\n }\n );\n\n // Open modal/tooltip\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n setError(null);\n onOpenRef.current?.();\n // Focus input after opening\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [disabled]);\n\n // Close modal/tooltip\n const close = useCallback(() => {\n setIsOpen(false);\n setInputValue('');\n onCloseRef.current?.();\n }, []);\n\n // Toggle\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n // Generate\n const generate = useCallback(\n async (prompt?: string): Promise<GenerationResult | null> => {\n // Determine the prompt to use\n let finalPrompt = prompt ?? inputValue;\n\n // For direct mode, use predefined prompt if no prompt provided\n if (mode === 'direct' && !finalPrompt) {\n finalPrompt = buttonOptions.prompt || '';\n }\n\n if (!finalPrompt.trim()) {\n const err = new Error(t('Prompt is required'));\n setError(err);\n onErrorRef.current?.(err);\n return null;\n }\n\n if (disabled) {\n return null;\n }\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 null;\n }\n\n // Call onBeforeSend hook\n if (onBeforeSendRef.current) {\n const modifiedPrompt = await onBeforeSendRef.current(finalPrompt);\n if (modifiedPrompt !== undefined) {\n finalPrompt = modifiedPrompt;\n }\n }\n\n // Start processing\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n onStartRef.current?.();\n\n // Create a promise that will resolve when generation completes\n const resultPromise = new Promise<GenerationResult | null>((resolve) => {\n resolveRef.current = resolve;\n });\n\n try {\n const dto = {\n message: finalPrompt,\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) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n\n return resultPromise;\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 return null;\n }\n },\n [\n inputValue,\n mode,\n buttonOptions.prompt,\n disabled,\n assistantId,\n resolvedTenantId,\n resolvedTenantMetadata,\n resolvedTags,\n toolSchemas,\n ]\n );\n\n // Reset\n const reset = useCallback(() => {\n setIsOpen(false);\n setIsProcessing(false);\n setInputValue('');\n setError(null);\n setResult(null);\n setChatUid(null);\n setShouldPoll(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\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 close();\n return;\n }\n\n // Handle Enter to submit (Cmd/Ctrl + Enter or Enter without Shift)\n if (e.key === 'Enter' && !isProcessing) {\n if (e.metaKey || e.ctrlKey || !e.shiftKey) {\n e.preventDefault();\n generate();\n }\n }\n },\n [isProcessing, generate, close]\n );\n\n return {\n isOpen,\n isProcessing,\n inputValue,\n setInputValue,\n error,\n result,\n toolCalls,\n currentToolSummary,\n inputRef,\n open,\n close,\n toggle,\n generate,\n reset,\n handleKeyDown,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { forwardRef, useMemo, useState, useCallback, useRef, useEffect, useImperativeHandle } from 'react';
3
3
  import { useDevicChat } from '../../hooks/useDevicChat.js';
4
4
  import { useOptionalDevicContext } from '../../provider/DevicContext.js';
@@ -15,6 +15,7 @@ import { DEFAULT_CORE_MEMORY_LABELS, CoreMemoryModal } from '../CoreMemoryModal/
15
15
  import { IntegrationsModal } from '../IntegrationsModal/IntegrationsModal.js';
16
16
  import 'react-dom';
17
17
  import { isDarkTheme } from '../theme.js';
18
+ import { useTranslations, DevicTranslationsProvider } from '../../i18n/useTranslations.js';
18
19
  import { useIntegrations } from '../IntegrationsModal/useIntegrations.js';
19
20
  import { useTenantMcp } from '../IntegrationsModal/useTenantMcp.js';
20
21
  import { IntegrationsLauncher } from '../IntegrationsModal/IntegrationsLauncher.js';
@@ -94,7 +95,9 @@ const DEFAULT_OPTIONS = {
94
95
  showRecalledMemories: true,
95
96
  recalledMemoriesRenderer: undefined,
96
97
  showCompaction: true,
98
+ expandableCompaction: false,
97
99
  compactionRenderer: undefined,
100
+ guardrailRenderer: undefined,
98
101
  showCoreMemoryButton: false,
99
102
  coreMemoryLabels: undefined,
100
103
  showIntegrationsButton: true,
@@ -106,6 +109,7 @@ const DEFAULT_OPTIONS = {
106
109
  integrationsHintLabel: undefined,
107
110
  showIntegrationsToggle: true,
108
111
  integrationsToggleLabel: 'Apps in this chat',
112
+ translations: undefined,
109
113
  };
110
114
  /**
111
115
  * Chat drawer component for Devic assistants
@@ -138,6 +142,12 @@ const ChatDrawer = forwardRef(function ChatDrawer(props, ref) {
138
142
  function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, enabledTools, modelInterfaceTools, tenantId, tenantMetadata, subtenantId, subtenantMetadata, tags, apiKey, baseUrl, pollingInterval, onMessageSent, onMessageReceived, onToolCall, onError, onChatCreated, onFileUpload, onOpen, onClose, isOpen: controlledIsOpen, className, mode = 'drawer', onConversationChange, forwardedRef, }) {
139
143
  // Merge options with defaults
140
144
  const mergedOptions = useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);
145
+ // Texts the drawer renders itself, translated through the dictionary of the
146
+ // provider plus this drawer's own. Applied to the option defaults too, so a
147
+ // host that leaves `title` or `inputPlaceholder` alone still gets them in
148
+ // its language; a host that sets its own text keeps it, unless it also put
149
+ // that text in the dictionary.
150
+ const t = useTranslations(mergedOptions.translations);
141
151
  // localStorage key for persisting selected conversation
142
152
  const storageKey = mergedOptions.persistConversation
143
153
  ? `devic-ui-chatUid-${assistantId}`
@@ -399,7 +409,7 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
399
409
  // can transcribe audio (binary or URL) and attach the resulting transcriptId.
400
410
  const transcribeAudio = useCallback((audio, transcribeOptions) => {
401
411
  if (!resolvedApiKey && !resolvedTenantSession) {
402
- return Promise.reject(new Error('No credentials configured. Cannot transcribe audio.'));
412
+ return Promise.reject(new Error(t('No credentials configured. Cannot transcribe audio.')));
403
413
  }
404
414
  const client = new DevicApiClient({ apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, getTenantSession: resolvedTenantSession, onSessionExpired });
405
415
  return client.transcribeAudio(audio, {
@@ -498,8 +508,8 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
498
508
  // two do not, and the only sign of them would otherwise be the text
499
509
  // reappearing in the box with no explanation.
500
510
  setQueueAlert(result.reason === 'queue_full'
501
- ? `${result.message} Your message is back in the box.`
502
- : 'The assistant is not taking messages while it works. Your message is back in the box.');
511
+ ? `${result.message} ${t('Your message is back in the box.')}`
512
+ : t('The assistant is not taking messages while it works. Your message is back in the box.'));
503
513
  }
504
514
  return result;
505
515
  }
@@ -520,7 +530,9 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
520
530
  const result = await chat.stopChat();
521
531
  setQueueDisposition(undefined);
522
532
  setQueueAlert(result.discarded
523
- ? `${result.discarded === 1 ? 'A queued message was' : `${result.discarded} queued messages were`} not sent — the text is back in the box.`
533
+ ? result.discarded === 1
534
+ ? t('A queued message was not sent — the text is back in the box.')
535
+ : t('{count} queued messages were not sent — the text is back in the box.', { count: result.discarded })
524
536
  : null);
525
537
  return result;
526
538
  }, [chat]);
@@ -653,7 +665,8 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
653
665
  // through a portal into document.body, so the variables set above — which
654
666
  // live on the drawer element — never reach them.
655
667
  // The brain button says what the modal it opens is called.
656
- const coreMemoryTitle = mergedOptions.coreMemoryLabels?.title ?? DEFAULT_CORE_MEMORY_LABELS.title;
668
+ const coreMemoryTitle = mergedOptions.coreMemoryLabels?.title ??
669
+ t(DEFAULT_CORE_MEMORY_LABELS.title);
657
670
  const modalTheme = useMemo(() => ({
658
671
  color: mergedOptions.color !== DEFAULT_OPTIONS.color
659
672
  ? mergedOptions.color
@@ -679,7 +692,7 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
679
692
  // something to switch — the control returns null with nothing connected —
680
693
  // and hidden outright by `showIntegrationsToggle: false`.
681
694
  const integrationsToggleNode = mergedOptions.showIntegrationsButton !== false &&
682
- mergedOptions.showIntegrationsToggle !== false ? (jsx(IntegrationsToggle, { state: integrationsState, mcp: mcpState, disabled: disabledIntegrations, onChange: setDisabledIntegrations, onManage: () => setIntegrationsOpen(true), label: mergedOptions.integrationsToggleLabel, dark: isDarkTheme(modalTheme), busy: chat.isLoading, loading: integrationsDeciding })) : null;
695
+ mergedOptions.showIntegrationsToggle !== false ? (jsx(IntegrationsToggle, { state: integrationsState, mcp: mcpState, disabled: disabledIntegrations, onChange: setDisabledIntegrations, onManage: () => setIntegrationsOpen(true), label: t(mergedOptions.integrationsToggleLabel), dark: isDarkTheme(modalTheme), busy: chat.isLoading, loading: integrationsDeciding })) : null;
683
696
  // Resizable drawer
684
697
  const [resizedWidth, setResizedWidth] = useState(null);
685
698
  const handleResizeStart = useCallback((e) => {
@@ -722,9 +735,11 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
722
735
  [mergedOptions.position]: 20,
723
736
  bottom: 20,
724
737
  }), [mergedOptions.zIndex, mergedOptions.position]);
725
- return (jsxs(Fragment, { children: [!isInline && (jsx("div", { className: "devic-drawer-overlay", "data-open": isOpen, style: overlayStyle, onClick: handleClose })), jsxs("div", { ref: drawerRef, className: `devic-chat-drawer ${className || ''}`, "data-position": mergedOptions.position, "data-open": isOpen, "data-mode": mode, style: drawerStyle, children: [mergedOptions.resizable && (jsx("div", { className: "devic-resize-handle", "data-position": mergedOptions.position, onMouseDown: handleResizeStart })), jsxs("div", { className: "devic-drawer-header", children: [avatarUrl && (jsx("img", { className: "devic-drawer-avatar", src: avatarUrl, alt: "", "aria-hidden": "true" })), jsx("h2", { className: "devic-drawer-title", children: mergedOptions.title }), jsx(ConversationSelector, { assistantId: assistantId, currentChatUid: chat.chatUid, onSelect: handleConversationSelect, onNewChat: handleNewChat, apiKey: apiKey, baseUrl: baseUrl, tenantId: tenantId, subtenantId: subtenantId, conversationPreview: mergedOptions.conversationPreview }), jsxs("div", { className: "devic-drawer-header-actions", children: [mergedOptions.showIntegrationsButton !== false && (jsx(IntegrationsLauncher, { state: integrationsState, mcp: mcpState, onClick: () => setIntegrationsOpen(true), label: mergedOptions.integrationsLabel, maxLogos: mergedOptions.maxIntegrationLogos, dark: isDarkTheme(modalTheme), placeholders: pendingIntegrations, loading: integrationsDeciding })), mergedOptions.showCoreMemoryButton && (jsx("button", { className: "devic-new-chat-btn", onClick: () => setCoreMemoryOpen(true), type: "button", "aria-label": coreMemoryTitle, title: coreMemoryTitle, children: jsx(BrainIcon, {}) })), jsx("button", { className: "devic-new-chat-btn", onClick: handleNewChat, type: "button", "aria-label": "New chat", title: "New chat", children: jsx(PlusIcon, {}) }), !isInline && (jsx("button", { className: "devic-drawer-close", onClick: handleClose, type: "button", "aria-label": "Close chat", children: jsx(CloseIcon, {}) }))] })] }), chat.error && (jsx("div", { className: "devic-error", children: chat.error.message })), jsx(ChatMessages, { messages: chat.messages, allMessages: chat.messages, isLoading: chat.isLoading, welcomeMessage: mergedOptions.welcomeMessage, suggestedMessages: mergedOptions.suggestedMessages, onSuggestedClick: handleSuggestedClick, showToolTimeline: mergedOptions.showToolTimeline, toolRenderers: mergedOptions.toolRenderers, toolIcons: mergedOptions.toolIcons, loadingIndicator: mergedOptions.loadingIndicator, showFeedback: mergedOptions.showFeedback, feedbackMap: feedbackMap, onFeedback: handleFeedback, handedOffSubThreadId: chat.handedOffSubThreadId || undefined, onHandoffCompleted: chat.onHandoffCompleted, handoffWidgetRenderer: mergedOptions.handoffWidgetRenderer, toolGroups: mergedOptions.toolGroups, userMessageRenderer: mergedOptions.userMessageRenderer, assistantMessageRenderer: mergedOptions.assistantMessageRenderer, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, pollingInterval: pollingInterval, pendingInlineWidgets: inlineWidgets, onSubmitWidget: chat.submitWidgetResponse, onCancelWidget: chat.cancelWidgetCall, recalledMemories: mergedOptions.showRecalledMemories
738
+ return (jsxs(DevicTranslationsProvider, { translations: mergedOptions.translations, children: [!isInline && (jsx("div", { className: "devic-drawer-overlay", "data-open": isOpen, style: overlayStyle, onClick: handleClose })), jsxs("div", { ref: drawerRef, className: `devic-chat-drawer ${className || ''}`, "data-position": mergedOptions.position, "data-open": isOpen, "data-mode": mode, style: drawerStyle, children: [mergedOptions.resizable && (jsx("div", { className: "devic-resize-handle", "data-position": mergedOptions.position, onMouseDown: handleResizeStart })), jsxs("div", { className: "devic-drawer-header", children: [avatarUrl && (jsx("img", { className: "devic-drawer-avatar", src: avatarUrl, alt: "", "aria-hidden": "true" })), jsx("h2", { className: "devic-drawer-title", children: typeof mergedOptions.title === 'string'
739
+ ? t(mergedOptions.title)
740
+ : mergedOptions.title }), jsx(ConversationSelector, { assistantId: assistantId, currentChatUid: chat.chatUid, onSelect: handleConversationSelect, onNewChat: handleNewChat, apiKey: apiKey, baseUrl: baseUrl, tenantId: tenantId, subtenantId: subtenantId, conversationPreview: mergedOptions.conversationPreview }), jsxs("div", { className: "devic-drawer-header-actions", children: [mergedOptions.showIntegrationsButton !== false && (jsx(IntegrationsLauncher, { state: integrationsState, mcp: mcpState, onClick: () => setIntegrationsOpen(true), label: t(mergedOptions.integrationsLabel), maxLogos: mergedOptions.maxIntegrationLogos, dark: isDarkTheme(modalTheme), placeholders: pendingIntegrations, loading: integrationsDeciding })), mergedOptions.showCoreMemoryButton && (jsx("button", { className: "devic-new-chat-btn", onClick: () => setCoreMemoryOpen(true), type: "button", "aria-label": coreMemoryTitle, title: coreMemoryTitle, children: jsx(BrainIcon, {}) })), jsx("button", { className: "devic-new-chat-btn", onClick: handleNewChat, type: "button", "aria-label": t('New chat'), title: t('New chat'), children: jsx(PlusIcon, {}) }), !isInline && (jsx("button", { className: "devic-drawer-close", onClick: handleClose, type: "button", "aria-label": t('Close chat'), children: jsx(CloseIcon, {}) }))] })] }), chat.error && (jsx("div", { className: "devic-error", children: chat.error.message })), jsx(ChatMessages, { messages: chat.messages, allMessages: chat.messages, isLoading: chat.isLoading, welcomeMessage: mergedOptions.welcomeMessage, suggestedMessages: mergedOptions.suggestedMessages, onSuggestedClick: handleSuggestedClick, showToolTimeline: mergedOptions.showToolTimeline, toolRenderers: mergedOptions.toolRenderers, toolIcons: mergedOptions.toolIcons, loadingIndicator: mergedOptions.loadingIndicator, showFeedback: mergedOptions.showFeedback, feedbackMap: feedbackMap, onFeedback: handleFeedback, handedOffSubThreadId: chat.handedOffSubThreadId || undefined, onHandoffCompleted: chat.onHandoffCompleted, handoffWidgetRenderer: mergedOptions.handoffWidgetRenderer, toolGroups: mergedOptions.toolGroups, userMessageRenderer: mergedOptions.userMessageRenderer, assistantMessageRenderer: mergedOptions.assistantMessageRenderer, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, pollingInterval: pollingInterval, pendingInlineWidgets: inlineWidgets, onSubmitWidget: chat.submitWidgetResponse, onCancelWidget: chat.cancelWidgetCall, recalledMemories: mergedOptions.showRecalledMemories
726
741
  ? chat.recalledMemories
727
- : undefined, recalledMemoriesRenderer: mergedOptions.recalledMemoriesRenderer, compactions: mergedOptions.showCompaction ? chat.compactions : undefined, compaction: mergedOptions.showCompaction ? chat.compaction : undefined, compactionRenderer: mergedOptions.compactionRenderer }), mergedOptions.customPromptBox ? (jsxs("div", { className: "devic-input-area", children: [limitBannerNode, usageBarNode, integrationsHintNode, queueNoticeNode, mergedOptions.customPromptBox({
742
+ : undefined, recalledMemoriesRenderer: mergedOptions.recalledMemoriesRenderer, compactions: mergedOptions.showCompaction ? chat.compactions : undefined, compaction: mergedOptions.showCompaction ? chat.compaction : undefined, compactionRenderer: mergedOptions.compactionRenderer, guardrailRenderer: mergedOptions.guardrailRenderer, expandableCompaction: mergedOptions.expandableCompaction }), mergedOptions.customPromptBox ? (jsxs("div", { className: "devic-input-area", children: [limitBannerNode, usageBarNode, integrationsHintNode, queueNoticeNode, mergedOptions.customPromptBox({
728
743
  sendMessage: handleSend,
729
744
  transcribeAudio,
730
745
  stop: chat.stopChat,
@@ -745,11 +760,11 @@ function ChatDrawerInner({ assistantId, chatUid: initialChatUid, options = {}, e
745
760
  (chat.isLoading && !canQueue) ||
746
761
  (chat.handedOff && !canQueue) ||
747
762
  inlineWidgets.length > 0 ||
748
- !!chat.limitExceeded, placeholder: mergedOptions.inputPlaceholder, enableFileUploads: mergedOptions.enableFileUploads, allowedFileTypes: mergedOptions.allowedFileTypes, maxFileSize: mergedOptions.maxFileSize, enableLongTextPaste: mergedOptions.enableLongTextPaste, longTextPasteThreshold: mergedOptions.longTextPasteThreshold, enableSpeechToText: mergedOptions.enableSpeechToText, speechLanguage: mergedOptions.speechLanguage, speechTenantId: tenantId, speechAutoStop: mergedOptions.speechAutoStop, speechAutoStopCountdownMs: mergedOptions.speechAutoStopCountdownMs, speechAutoStopSilenceMs: mergedOptions.speechAutoStopSilenceMs, speechAutoStopSilenceRatio: mergedOptions.speechAutoStopSilenceRatio, speechAutoStopSilenceLevel: mergedOptions.speechAutoStopSilenceLevel, speechAutoStopSpeechLevel: mergedOptions.speechAutoStopSpeechLevel, speechHandoff: mergedOptions.speechHandoff, speechHandoffSendDelayMs: mergedOptions.speechHandoffSendDelayMs, speechHandoffHoldMs: mergedOptions.speechHandoffHoldMs, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, sendButtonContent: mergedOptions.sendButtonContent, disabledMessage: chat.handedOff
749
- ? 'Waiting for subagent to complete'
763
+ !!chat.limitExceeded, placeholder: t(mergedOptions.inputPlaceholder), enableFileUploads: mergedOptions.enableFileUploads, allowedFileTypes: mergedOptions.allowedFileTypes, maxFileSize: mergedOptions.maxFileSize, enableLongTextPaste: mergedOptions.enableLongTextPaste, longTextPasteThreshold: mergedOptions.longTextPasteThreshold, enableSpeechToText: mergedOptions.enableSpeechToText, speechLanguage: mergedOptions.speechLanguage, speechTenantId: tenantId, speechAutoStop: mergedOptions.speechAutoStop, speechAutoStopCountdownMs: mergedOptions.speechAutoStopCountdownMs, speechAutoStopSilenceMs: mergedOptions.speechAutoStopSilenceMs, speechAutoStopSilenceRatio: mergedOptions.speechAutoStopSilenceRatio, speechAutoStopSilenceLevel: mergedOptions.speechAutoStopSilenceLevel, speechAutoStopSpeechLevel: mergedOptions.speechAutoStopSpeechLevel, speechHandoff: mergedOptions.speechHandoff, speechHandoffSendDelayMs: mergedOptions.speechHandoffSendDelayMs, speechHandoffHoldMs: mergedOptions.speechHandoffHoldMs, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, sendButtonContent: mergedOptions.sendButtonContent, disabledMessage: chat.handedOff
764
+ ? t('Waiting for subagent to complete')
750
765
  : inlineWidgets.length > 0
751
- ? 'Waiting for tool response'
752
- : undefined, isProcessing: chat.isLoading && !chat.handedOff, onStop: handleStopChat, allowQueueing: canQueue, queueNotice: queueNoticeNode, stopButtonContent: mergedOptions.stopButtonContent, pendingInputWidget: inputWidget, onSubmitWidget: chat.submitWidgetResponse, onCancelWidget: chat.cancelWidgetCall, references: references, onRemoveReference: removeReference, usageBar: usageBarNode, limitBanner: limitBannerNode, integrationsHint: integrationsHintNode, integrationsToggle: integrationsToggleNode }))] }), !isInline && !isOpen && (jsx("button", { className: "devic-trigger", onClick: handleOpen, style: triggerStyle, type: "button", "aria-label": "Open chat", children: jsx(ChatIcon, {}) })), mergedOptions.showCoreMemoryButton && (jsx(CoreMemoryModal, { isOpen: coreMemoryOpen, onClose: () => setCoreMemoryOpen(false), assistantId: assistantId, tenantId: tenantId, subtenantId: subtenantId, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, labels: mergedOptions.coreMemoryLabels, theme: modalTheme })), mergedOptions.showIntegrationsButton !== false && (jsx(IntegrationsModal, { isOpen: integrationsOpen, onClose: () => setIntegrationsOpen(false), assistantId: assistantId, tenantId: tenantId, subtenantId: subtenantId, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, title: mergedOptions.integrationsLabel, theme: modalTheme, state: integrationsState, mcpState: mcpState }))] }));
766
+ ? t('Waiting for tool response')
767
+ : undefined, isProcessing: chat.isLoading && !chat.handedOff, onStop: handleStopChat, allowQueueing: canQueue, queueNotice: queueNoticeNode, stopButtonContent: mergedOptions.stopButtonContent, pendingInputWidget: inputWidget, onSubmitWidget: chat.submitWidgetResponse, onCancelWidget: chat.cancelWidgetCall, references: references, onRemoveReference: removeReference, usageBar: usageBarNode, limitBanner: limitBannerNode, integrationsHint: integrationsHintNode, integrationsToggle: integrationsToggleNode }))] }), !isInline && !isOpen && (jsx("button", { className: "devic-trigger", onClick: handleOpen, style: triggerStyle, type: "button", "aria-label": t('Open chat'), children: jsx(ChatIcon, {}) })), mergedOptions.showCoreMemoryButton && (jsx(CoreMemoryModal, { isOpen: coreMemoryOpen, onClose: () => setCoreMemoryOpen(false), assistantId: assistantId, tenantId: tenantId, subtenantId: subtenantId, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, labels: mergedOptions.coreMemoryLabels, theme: modalTheme })), mergedOptions.showIntegrationsButton !== false && (jsx(IntegrationsModal, { isOpen: integrationsOpen, onClose: () => setIntegrationsOpen(false), assistantId: assistantId, tenantId: tenantId, subtenantId: subtenantId, apiKey: resolvedApiKey, baseUrl: resolvedBaseUrl, title: t(mergedOptions.integrationsLabel), theme: modalTheme, state: integrationsState, mcpState: mcpState }))] }));
753
768
  }
754
769
  /**
755
770
  * Brain icon for the core memory button