@devicai/ui 0.58.0 → 0.59.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 (153) hide show
  1. package/README.md +24 -0
  2. package/dist/cjs/api/assistantInfo.js.map +1 -1
  3. package/dist/cjs/api/client.js +17 -1
  4. package/dist/cjs/api/client.js.map +1 -1
  5. package/dist/cjs/api/types.js.map +1 -1
  6. package/dist/cjs/components/AICommandBar/AICommandBar.js +2 -1
  7. package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
  8. package/dist/cjs/components/AICommandBar/useAICommandBar.js +5 -1
  9. package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
  10. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +2 -1
  11. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  12. package/dist/cjs/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -1
  13. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +5 -1
  14. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  15. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +2 -1
  16. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  17. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +5 -1
  18. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  19. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +2 -1
  20. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  22. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  23. package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
  24. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  25. package/dist/cjs/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  26. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -1
  27. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  28. package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
  29. package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
  30. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  31. package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
  32. package/dist/cjs/components/ChatDrawer/ToolTimeline.js.map +1 -1
  33. package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
  34. package/dist/cjs/components/ChatDrawer/pastedText.js.map +1 -1
  35. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  36. package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
  37. package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
  38. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  39. package/dist/cjs/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  40. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  41. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  42. package/dist/cjs/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  43. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  44. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  45. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  46. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
  47. package/dist/cjs/components/IntegrationsModal/integrationChoice.js.map +1 -1
  48. package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
  49. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  50. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  51. package/dist/cjs/components/theme.js.map +1 -1
  52. package/dist/cjs/hooks/useDevicChat.js +10 -2
  53. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  54. package/dist/cjs/hooks/useModelInterface.js.map +1 -1
  55. package/dist/cjs/hooks/usePolling.js +117 -7
  56. package/dist/cjs/hooks/usePolling.js.map +1 -1
  57. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
  58. package/dist/cjs/i18n/translate.js.map +1 -1
  59. package/dist/cjs/i18n/useTranslations.js.map +1 -1
  60. package/dist/cjs/provider/DevicContext.js.map +1 -1
  61. package/dist/cjs/provider/DevicProvider.js +3 -1
  62. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  63. package/dist/cjs/provider/sharedSession.js.map +1 -1
  64. package/dist/cjs/utils/avatar.js.map +1 -1
  65. package/dist/cjs/utils/consumeChatStream.js +44 -0
  66. package/dist/cjs/utils/consumeChatStream.js.map +1 -0
  67. package/dist/cjs/utils/index.js.map +1 -1
  68. package/dist/cjs/utils/logger.js.map +1 -1
  69. package/dist/cjs/utils/toolGroups.js.map +1 -1
  70. package/dist/esm/api/assistantInfo.js.map +1 -1
  71. package/dist/esm/api/client.d.ts +5 -1
  72. package/dist/esm/api/client.js +17 -1
  73. package/dist/esm/api/client.js.map +1 -1
  74. package/dist/esm/api/types.d.ts +2 -0
  75. package/dist/esm/api/types.js.map +1 -1
  76. package/dist/esm/components/AICommandBar/AICommandBar.js +2 -1
  77. package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
  78. package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +6 -0
  79. package/dist/esm/components/AICommandBar/useAICommandBar.d.ts +2 -0
  80. package/dist/esm/components/AICommandBar/useAICommandBar.js +6 -2
  81. package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
  82. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +2 -1
  83. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  84. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +6 -0
  85. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -1
  86. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.d.ts +2 -0
  87. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +6 -2
  88. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  89. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +2 -1
  90. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  91. package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +6 -0
  92. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.d.ts +2 -0
  93. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +6 -2
  94. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  95. package/dist/esm/components/ChatDrawer/ChatDrawer.js +2 -1
  96. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  97. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +8 -0
  98. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  99. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  100. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  101. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  102. package/dist/esm/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  103. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -1
  104. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  105. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  106. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  107. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  108. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  109. package/dist/esm/components/ChatDrawer/ToolTimeline.js.map +1 -1
  110. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  111. package/dist/esm/components/ChatDrawer/pastedText.js.map +1 -1
  112. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  113. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  114. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  115. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  116. package/dist/esm/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  117. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  118. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  119. package/dist/esm/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  120. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  121. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  122. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  123. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  124. package/dist/esm/components/IntegrationsModal/integrationChoice.js.map +1 -1
  125. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  126. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  127. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  128. package/dist/esm/components/theme.js.map +1 -1
  129. package/dist/esm/hooks/index.d.ts +1 -1
  130. package/dist/esm/hooks/useDevicChat.d.ts +6 -0
  131. package/dist/esm/hooks/useDevicChat.js +12 -4
  132. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  133. package/dist/esm/hooks/useModelInterface.js.map +1 -1
  134. package/dist/esm/hooks/usePolling.d.ts +35 -0
  135. package/dist/esm/hooks/usePolling.js +114 -8
  136. package/dist/esm/hooks/usePolling.js.map +1 -1
  137. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  138. package/dist/esm/i18n/translate.js.map +1 -1
  139. package/dist/esm/i18n/useTranslations.js.map +1 -1
  140. package/dist/esm/provider/DevicContext.js.map +1 -1
  141. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  142. package/dist/esm/provider/DevicProvider.js +3 -1
  143. package/dist/esm/provider/DevicProvider.js.map +1 -1
  144. package/dist/esm/provider/sharedSession.js.map +1 -1
  145. package/dist/esm/provider/types.d.ts +18 -0
  146. package/dist/esm/utils/avatar.js.map +1 -1
  147. package/dist/esm/utils/consumeChatStream.d.ts +6 -0
  148. package/dist/esm/utils/consumeChatStream.js +42 -0
  149. package/dist/esm/utils/consumeChatStream.js.map +1 -0
  150. package/dist/esm/utils/index.js.map +1 -1
  151. package/dist/esm/utils/logger.js.map +1 -1
  152. package/dist/esm/utils/toolGroups.js.map +1 -1
  153. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AIElementWrapper.js","sources":["../../../../../src/components/AIElementWrapper/AIElementWrapper.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { useAIElementWrapper } from './useAIElementWrapper';\nimport {\n getActiveWrapper,\n setActiveWrapper,\n subscribeActiveWrapper,\n} from './activeWrapperRegistry';\nimport { generateId } from '../../utils';\nimport type {\n AIElementWrapperHandle,\n AIElementWrapperOptions,\n AIElementWrapperPlacement,\n AIElementWrapperProps,\n} from './AIElementWrapper.types';\nimport { DevicTranslationsProvider, useTranslations } from '../../i18n';\nimport './AIElementWrapper.css';\n\nconst DEFAULT_OPTIONS: Required<\n Omit<\n AIElementWrapperOptions,\n 'color' | 'drawerPromptPrefix' | 'defaultInlinePrompt' | 'translations'\n >\n> & {\n color?: string;\n drawerPromptPrefix?: AIElementWrapperOptions['drawerPromptPrefix'];\n defaultInlinePrompt?: string;\n translations?: AIElementWrapperOptions['translations'];\n} = {\n showOn: 'hover',\n triggerPlacement: 'bottom',\n tooltipPlacement: 'bottom',\n tooltipWidth: 360,\n triggerLabel: 'Preguntar a IA',\n highlightOnInteract: true,\n zIndex: 2147483000,\n triggerBorderRadius: 999,\n color: undefined,\n drawerPromptPrefix: undefined,\n defaultInlinePrompt: undefined,\n translations: undefined,\n};\n\ninterface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nfunction rectFromDom(rect: DOMRect): AnchorRect {\n return { top: rect.top, left: rect.left, width: rect.width, height: rect.height };\n}\n\nfunction placementStyle(\n placement: AIElementWrapperPlacement,\n anchor: AnchorRect,\n offset = 8\n): React.CSSProperties {\n const cx = anchor.left + anchor.width / 2;\n const cy = anchor.top + anchor.height / 2;\n switch (placement) {\n case 'top':\n return { position: 'fixed', top: anchor.top - offset, left: cx, transform: 'translate(-50%, -100%)' };\n case 'bottom':\n return { position: 'fixed', top: anchor.top + anchor.height + offset, left: cx, transform: 'translateX(-50%)' };\n case 'left':\n return { position: 'fixed', top: cy, left: anchor.left - offset, transform: 'translate(-100%, -50%)' };\n case 'right':\n return { position: 'fixed', top: cy, left: anchor.left + anchor.width + offset, transform: 'translateY(-50%)' };\n }\n}\n\n/**\n * AIElementWrapper wraps an arbitrary React node and exposes an AI trigger\n * that can either show an inline floating tooltip with the assistant's\n * answer (`behavior='inline'`) or push a reference to the registered\n * ChatDrawer (`behavior='drawer'`).\n *\n * The trigger and inline tooltip are rendered through a React portal anchored\n * to the wrapped element, so they always sit above other UI (including the\n * ChatDrawer) regardless of stacking context.\n */\nexport const AIElementWrapper = forwardRef<AIElementWrapperHandle, AIElementWrapperProps>(\n function AIElementWrapper(props, ref) {\n const {\n label,\n data,\n referenceContent,\n behavior = 'inline',\n trigger,\n options = {},\n assistantId,\n getPrompt,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n inlineRenderer,\n onActivate,\n onInlineResponse,\n onError,\n className,\n style,\n children,\n } = props;\n\n const merged = useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);\n\n const t = useTranslations(merged.translations);\n\n // Stable instance ID used by the active-wrapper registry (singleton)\n const wrapperIdRef = useRef<string>('');\n if (!wrapperIdRef.current) wrapperIdRef.current = generateId();\n\n const [activeWrapperId, setActiveWrapperLocal] = useState<string | null>(getActiveWrapper());\n useEffect(() => subscribeActiveWrapper(setActiveWrapperLocal), []);\n\n const context = useOptionalDevicContext();\n const containerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const [isHovered, setIsHovered] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const setHoveredImmediately = useCallback((v: boolean) => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n if (v) {\n setIsHovered(true);\n } else {\n // Grace period so the cursor can travel from the wrapper to the\n // portal-rendered trigger without the trigger disappearing mid-flight.\n hoverTimerRef.current = setTimeout(() => setIsHovered(false), 200);\n }\n }, []);\n useEffect(() => () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n }, []);\n const [isInlineOpen, setIsInlineOpen] = useState(false);\n const [containerRect, setContainerRect] = useState<AnchorRect | null>(null);\n const [selectionRect, setSelectionRect] = useState<AnchorRect | null>(null);\n\n const inline = useAIElementWrapper({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n onResponse: onInlineResponse,\n onError,\n });\n\n // What this wrapper would show if there were no coordination.\n const wantsTriggerVisible =\n merged.showOn === 'always' ||\n (merged.showOn === 'hover' && isHovered) ||\n (merged.showOn === 'click' && isInlineOpen) ||\n (merged.showOn === 'select' && selectionRect !== null);\n\n // Coordinate via the singleton registry so only one wrapper shows the\n // floating trigger at a time. The most recent wrapper to want visibility\n // wins; others hide until they are activated again.\n const isActive = activeWrapperId === wrapperIdRef.current;\n const triggerVisible = wantsTriggerVisible && (activeWrapperId === null || isActive);\n\n useEffect(() => {\n const id = wrapperIdRef.current;\n if (wantsTriggerVisible) {\n setActiveWrapper(id);\n } else if (getActiveWrapper() === id) {\n setActiveWrapper(null);\n }\n }, [wantsTriggerVisible]);\n\n // Release the registry slot if the component unmounts while active.\n useEffect(\n () => () => {\n if (getActiveWrapper() === wrapperIdRef.current) {\n setActiveWrapper(null);\n }\n },\n []\n );\n\n // Track container rect (for hover/click/always trigger and tooltip anchor)\n const updateContainerRect = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n setContainerRect(rectFromDom(el.getBoundingClientRect()));\n }, []);\n\n useLayoutEffect(() => {\n if (!triggerVisible && !isInlineOpen) return;\n updateContainerRect();\n const onScrollOrResize = () => updateContainerRect();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [triggerVisible, isInlineOpen, updateContainerRect]);\n\n // selectionchange listener for showOn='select'\n useEffect(() => {\n if (merged.showOn !== 'select') {\n setSelectionRect(null);\n return;\n }\n const isInside = (node: Node | null, cont: HTMLElement) => {\n if (!node) return false;\n if (node === cont) return true;\n return cont.contains(node);\n };\n const recompute = () => {\n const sel = window.getSelection();\n const cont = containerRef.current;\n if (!sel || sel.isCollapsed || !cont || sel.rangeCount === 0) {\n setSelectionRect(null);\n return;\n }\n // Don't react to selections happening elsewhere — but tolerate the\n // case where anchor or focus are inside our container.\n if (!isInside(sel.anchorNode, cont) && !isInside(sel.focusNode, cont)) {\n setSelectionRect(null);\n return;\n }\n const range = sel.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n setSelectionRect(null);\n return;\n }\n setSelectionRect(rectFromDom(rect));\n };\n const onMouseUp = () => {\n // Run on next tick so the browser commits the final selection state.\n setTimeout(recompute, 0);\n };\n document.addEventListener('selectionchange', recompute);\n document.addEventListener('mouseup', onMouseUp);\n return () => {\n document.removeEventListener('selectionchange', recompute);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [merged.showOn]);\n\n const buildPrompt = useCallback((): string => {\n if (getPrompt) return getPrompt({ data, label });\n if (merged.defaultInlinePrompt) return merged.defaultInlinePrompt;\n // Use selected text if available, otherwise fall back to label\n if (merged.showOn === 'select') {\n const sel = window.getSelection();\n const txt = sel?.toString().trim();\n if (txt) return t('Cuéntame más sobre: \"{text}\"', { text: txt });\n }\n return t('Cuéntame más sobre: {label}', { label });\n }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn, t]);\n\n const handleActivate = useCallback(() => {\n onActivate?.();\n\n if (behavior === 'inline') {\n if (!assistantId) {\n const err = new Error('assistantId is required for behavior=\"inline\"');\n onError?.(err);\n // eslint-disable-next-line no-console\n console.warn('[AIElementWrapper]', err.message);\n return;\n }\n setIsInlineOpen(true);\n inline.reset();\n inline.sendInlinePrompt(buildPrompt());\n return;\n }\n\n // drawer behavior\n if (!context) {\n // eslint-disable-next-line no-console\n console.warn(\n '[AIElementWrapper] behavior=\"drawer\" requires a DevicProvider ancestor.'\n );\n return;\n }\n // For 'select' showOn, prefer selected text as label content fallback\n let finalLabel = label;\n if (merged.showOn === 'select') {\n const txt = window.getSelection()?.toString().trim();\n if (txt) finalLabel = txt;\n }\n context.addReference({ label: finalLabel, content: referenceContent, data });\n context.openDrawer();\n }, [\n onActivate,\n behavior,\n assistantId,\n onError,\n inline,\n buildPrompt,\n context,\n label,\n referenceContent,\n data,\n merged.showOn,\n ]);\n\n const closeInline = useCallback(() => {\n setIsInlineOpen(false);\n inline.reset();\n }, [inline]);\n\n useImperativeHandle(\n ref,\n () => ({\n activate: handleActivate,\n close: closeInline,\n }),\n [handleActivate, closeInline]\n );\n\n // Click outside to close inline tooltip\n useEffect(() => {\n if (!isInlineOpen) return;\n const handler = (e: MouseEvent) => {\n const t = tooltipRef.current;\n const c = containerRef.current;\n const tr = triggerRef.current;\n const target = e.target as Node;\n if (\n t && !t.contains(target) &&\n c && !c.contains(target) &&\n (!tr || !tr.contains(target))\n ) {\n closeInline();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isInlineOpen, closeInline]);\n\n // Anchor for trigger: selection rect (when showOn='select') else container rect\n const triggerAnchor = merged.showOn === 'select' ? selectionRect : containerRect;\n // Tooltip anchor: container rect (or selection if select mode)\n const tooltipAnchor = merged.showOn === 'select' && selectionRect ? selectionRect : containerRect;\n\n const triggerStyle = useMemo<React.CSSProperties>(() => {\n if (!triggerAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.triggerPlacement, triggerAnchor),\n zIndex: merged.zIndex + 1,\n pointerEvents: 'auto',\n };\n }, [triggerAnchor, merged.triggerPlacement, merged.zIndex]);\n\n const tooltipStyle = useMemo<React.CSSProperties>(() => {\n const w = typeof merged.tooltipWidth === 'number' ? `${merged.tooltipWidth}px` : merged.tooltipWidth;\n if (!tooltipAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.tooltipPlacement, tooltipAnchor),\n width: w,\n zIndex: merged.zIndex,\n };\n }, [tooltipAnchor, merged.tooltipPlacement, merged.tooltipWidth, merged.zIndex]);\n\n const renderInlineContent = () => {\n if (inline.error) {\n return <div className=\"devic-aiwrap-error\">{inline.error.message}</div>;\n }\n if (inline.isProcessing) {\n return (\n <div className=\"devic-aiwrap-processing\">\n <span className=\"devic-aiwrap-spinner\" aria-hidden=\"true\" />\n <span>{t('Pensando…')}</span>\n </div>\n );\n }\n if (inline.response) {\n if (inlineRenderer) return inlineRenderer(inline.response);\n const text =\n typeof inline.response.content === 'string'\n ? inline.response.content\n : (inline.response.content as any)?.message || '';\n return <div className=\"devic-aiwrap-answer\">{text}</div>;\n }\n return null;\n };\n\n const triggerNode = trigger ?? (\n <button\n type=\"button\"\n className=\"devic-aiwrap-trigger\"\n style={{\n borderRadius:\n typeof merged.triggerBorderRadius === 'number'\n ? `${merged.triggerBorderRadius}px`\n : merged.triggerBorderRadius,\n ...(merged.color ? { ['--devic-aiwrap-color' as any]: merged.color } : {}),\n }}\n >\n <span className=\"devic-aiwrap-trigger-icon\" aria-hidden=\"true\">\n <SparklesIcon />\n </span>\n <span className=\"devic-aiwrap-trigger-label\">\n {t(merged.triggerLabel)}\n </span>\n </button>\n );\n\n const portalTarget = typeof document !== 'undefined' ? document.body : null;\n\n return (\n <DevicTranslationsProvider translations={merged.translations}>\n <span\n ref={containerRef}\n className={`devic-aiwrap-container ${className || ''}`}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n data-highlight={merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false'}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n >\n <span className=\"devic-aiwrap-content\">{children}</span>\n\n {portalTarget && triggerVisible &&\n createPortal(\n <div\n ref={triggerRef}\n className=\"devic-aiwrap-trigger-wrapper\"\n style={triggerStyle}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n onMouseDown={(e) => {\n // Prevent losing the text selection when interacting with trigger\n e.preventDefault();\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleActivate();\n }}\n >\n {triggerNode}\n </div>,\n portalTarget\n )}\n\n {portalTarget && behavior === 'inline' && isInlineOpen &&\n createPortal(\n <div\n ref={tooltipRef}\n className=\"devic-aiwrap-tooltip\"\n style={tooltipStyle}\n data-placement={merged.tooltipPlacement}\n >\n <div className=\"devic-aiwrap-tooltip-header\">\n <span className=\"devic-aiwrap-tooltip-label\">{label}</span>\n <button\n type=\"button\"\n className=\"devic-aiwrap-tooltip-close\"\n onClick={closeInline}\n aria-label={t('Cerrar')}\n >\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-aiwrap-tooltip-body\">{renderInlineContent()}</div>\n </div>,\n portalTarget\n )}\n </span>\n </DevicTranslationsProvider>\n );\n }\n);\n\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\" opacity=\"0.95\" />\n <path d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\" opacity=\"0.6\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\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"],"names":["forwardRef","useMemo","useTranslations","useRef","generateId","useState","getActiveWrapper","useEffect","subscribeActiveWrapper","useOptionalDevicContext","useCallback","useAIElementWrapper","setActiveWrapper","useLayoutEffect","useImperativeHandle","_jsx","_jsxs","DevicTranslationsProvider","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"AIElementWrapper.js","sources":["../../../../../src/components/AIElementWrapper/AIElementWrapper.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { useAIElementWrapper } from './useAIElementWrapper';\nimport {\n getActiveWrapper,\n setActiveWrapper,\n subscribeActiveWrapper,\n} from './activeWrapperRegistry';\nimport { generateId } from '../../utils';\nimport type {\n AIElementWrapperHandle,\n AIElementWrapperOptions,\n AIElementWrapperPlacement,\n AIElementWrapperProps,\n} from './AIElementWrapper.types';\nimport { DevicTranslationsProvider, useTranslations } from '../../i18n';\nimport './AIElementWrapper.css';\n\nconst DEFAULT_OPTIONS: Required<\n Omit<\n AIElementWrapperOptions,\n 'color' | 'drawerPromptPrefix' | 'defaultInlinePrompt' | 'translations'\n >\n> & {\n color?: string;\n drawerPromptPrefix?: AIElementWrapperOptions['drawerPromptPrefix'];\n defaultInlinePrompt?: string;\n translations?: AIElementWrapperOptions['translations'];\n} = {\n showOn: 'hover',\n triggerPlacement: 'bottom',\n tooltipPlacement: 'bottom',\n tooltipWidth: 360,\n triggerLabel: 'Preguntar a IA',\n highlightOnInteract: true,\n zIndex: 2147483000,\n triggerBorderRadius: 999,\n color: undefined,\n drawerPromptPrefix: undefined,\n defaultInlinePrompt: undefined,\n translations: undefined,\n};\n\ninterface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nfunction rectFromDom(rect: DOMRect): AnchorRect {\n return { top: rect.top, left: rect.left, width: rect.width, height: rect.height };\n}\n\nfunction placementStyle(\n placement: AIElementWrapperPlacement,\n anchor: AnchorRect,\n offset = 8\n): React.CSSProperties {\n const cx = anchor.left + anchor.width / 2;\n const cy = anchor.top + anchor.height / 2;\n switch (placement) {\n case 'top':\n return { position: 'fixed', top: anchor.top - offset, left: cx, transform: 'translate(-50%, -100%)' };\n case 'bottom':\n return { position: 'fixed', top: anchor.top + anchor.height + offset, left: cx, transform: 'translateX(-50%)' };\n case 'left':\n return { position: 'fixed', top: cy, left: anchor.left - offset, transform: 'translate(-100%, -50%)' };\n case 'right':\n return { position: 'fixed', top: cy, left: anchor.left + anchor.width + offset, transform: 'translateY(-50%)' };\n }\n}\n\n/**\n * AIElementWrapper wraps an arbitrary React node and exposes an AI trigger\n * that can either show an inline floating tooltip with the assistant's\n * answer (`behavior='inline'`) or push a reference to the registered\n * ChatDrawer (`behavior='drawer'`).\n *\n * The trigger and inline tooltip are rendered through a React portal anchored\n * to the wrapped element, so they always sit above other UI (including the\n * ChatDrawer) regardless of stacking context.\n */\nexport const AIElementWrapper = forwardRef<AIElementWrapperHandle, AIElementWrapperProps>(\n function AIElementWrapper(props, ref) {\n const {\n label,\n data,\n referenceContent,\n behavior = 'inline',\n trigger,\n options = {},\n assistantId,\n getPrompt,\n apiKey,\n baseUrl,\n pollingInterval,\n streaming,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n inlineRenderer,\n onActivate,\n onInlineResponse,\n onError,\n className,\n style,\n children,\n } = props;\n\n const merged = useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);\n\n const t = useTranslations(merged.translations);\n\n // Stable instance ID used by the active-wrapper registry (singleton)\n const wrapperIdRef = useRef<string>('');\n if (!wrapperIdRef.current) wrapperIdRef.current = generateId();\n\n const [activeWrapperId, setActiveWrapperLocal] = useState<string | null>(getActiveWrapper());\n useEffect(() => subscribeActiveWrapper(setActiveWrapperLocal), []);\n\n const context = useOptionalDevicContext();\n const containerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const [isHovered, setIsHovered] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const setHoveredImmediately = useCallback((v: boolean) => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n if (v) {\n setIsHovered(true);\n } else {\n // Grace period so the cursor can travel from the wrapper to the\n // portal-rendered trigger without the trigger disappearing mid-flight.\n hoverTimerRef.current = setTimeout(() => setIsHovered(false), 200);\n }\n }, []);\n useEffect(() => () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n }, []);\n const [isInlineOpen, setIsInlineOpen] = useState(false);\n const [containerRect, setContainerRect] = useState<AnchorRect | null>(null);\n const [selectionRect, setSelectionRect] = useState<AnchorRect | null>(null);\n\n const inline = useAIElementWrapper({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n streaming,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n onResponse: onInlineResponse,\n onError,\n });\n\n // What this wrapper would show if there were no coordination.\n const wantsTriggerVisible =\n merged.showOn === 'always' ||\n (merged.showOn === 'hover' && isHovered) ||\n (merged.showOn === 'click' && isInlineOpen) ||\n (merged.showOn === 'select' && selectionRect !== null);\n\n // Coordinate via the singleton registry so only one wrapper shows the\n // floating trigger at a time. The most recent wrapper to want visibility\n // wins; others hide until they are activated again.\n const isActive = activeWrapperId === wrapperIdRef.current;\n const triggerVisible = wantsTriggerVisible && (activeWrapperId === null || isActive);\n\n useEffect(() => {\n const id = wrapperIdRef.current;\n if (wantsTriggerVisible) {\n setActiveWrapper(id);\n } else if (getActiveWrapper() === id) {\n setActiveWrapper(null);\n }\n }, [wantsTriggerVisible]);\n\n // Release the registry slot if the component unmounts while active.\n useEffect(\n () => () => {\n if (getActiveWrapper() === wrapperIdRef.current) {\n setActiveWrapper(null);\n }\n },\n []\n );\n\n // Track container rect (for hover/click/always trigger and tooltip anchor)\n const updateContainerRect = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n setContainerRect(rectFromDom(el.getBoundingClientRect()));\n }, []);\n\n useLayoutEffect(() => {\n if (!triggerVisible && !isInlineOpen) return;\n updateContainerRect();\n const onScrollOrResize = () => updateContainerRect();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [triggerVisible, isInlineOpen, updateContainerRect]);\n\n // selectionchange listener for showOn='select'\n useEffect(() => {\n if (merged.showOn !== 'select') {\n setSelectionRect(null);\n return;\n }\n const isInside = (node: Node | null, cont: HTMLElement) => {\n if (!node) return false;\n if (node === cont) return true;\n return cont.contains(node);\n };\n const recompute = () => {\n const sel = window.getSelection();\n const cont = containerRef.current;\n if (!sel || sel.isCollapsed || !cont || sel.rangeCount === 0) {\n setSelectionRect(null);\n return;\n }\n // Don't react to selections happening elsewhere — but tolerate the\n // case where anchor or focus are inside our container.\n if (!isInside(sel.anchorNode, cont) && !isInside(sel.focusNode, cont)) {\n setSelectionRect(null);\n return;\n }\n const range = sel.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n setSelectionRect(null);\n return;\n }\n setSelectionRect(rectFromDom(rect));\n };\n const onMouseUp = () => {\n // Run on next tick so the browser commits the final selection state.\n setTimeout(recompute, 0);\n };\n document.addEventListener('selectionchange', recompute);\n document.addEventListener('mouseup', onMouseUp);\n return () => {\n document.removeEventListener('selectionchange', recompute);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [merged.showOn]);\n\n const buildPrompt = useCallback((): string => {\n if (getPrompt) return getPrompt({ data, label });\n if (merged.defaultInlinePrompt) return merged.defaultInlinePrompt;\n // Use selected text if available, otherwise fall back to label\n if (merged.showOn === 'select') {\n const sel = window.getSelection();\n const txt = sel?.toString().trim();\n if (txt) return t('Cuéntame más sobre: \"{text}\"', { text: txt });\n }\n return t('Cuéntame más sobre: {label}', { label });\n }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn, t]);\n\n const handleActivate = useCallback(() => {\n onActivate?.();\n\n if (behavior === 'inline') {\n if (!assistantId) {\n const err = new Error('assistantId is required for behavior=\"inline\"');\n onError?.(err);\n // eslint-disable-next-line no-console\n console.warn('[AIElementWrapper]', err.message);\n return;\n }\n setIsInlineOpen(true);\n inline.reset();\n inline.sendInlinePrompt(buildPrompt());\n return;\n }\n\n // drawer behavior\n if (!context) {\n // eslint-disable-next-line no-console\n console.warn(\n '[AIElementWrapper] behavior=\"drawer\" requires a DevicProvider ancestor.'\n );\n return;\n }\n // For 'select' showOn, prefer selected text as label content fallback\n let finalLabel = label;\n if (merged.showOn === 'select') {\n const txt = window.getSelection()?.toString().trim();\n if (txt) finalLabel = txt;\n }\n context.addReference({ label: finalLabel, content: referenceContent, data });\n context.openDrawer();\n }, [\n onActivate,\n behavior,\n assistantId,\n onError,\n inline,\n buildPrompt,\n context,\n label,\n referenceContent,\n data,\n merged.showOn,\n ]);\n\n const closeInline = useCallback(() => {\n setIsInlineOpen(false);\n inline.reset();\n }, [inline]);\n\n useImperativeHandle(\n ref,\n () => ({\n activate: handleActivate,\n close: closeInline,\n }),\n [handleActivate, closeInline]\n );\n\n // Click outside to close inline tooltip\n useEffect(() => {\n if (!isInlineOpen) return;\n const handler = (e: MouseEvent) => {\n const t = tooltipRef.current;\n const c = containerRef.current;\n const tr = triggerRef.current;\n const target = e.target as Node;\n if (\n t && !t.contains(target) &&\n c && !c.contains(target) &&\n (!tr || !tr.contains(target))\n ) {\n closeInline();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isInlineOpen, closeInline]);\n\n // Anchor for trigger: selection rect (when showOn='select') else container rect\n const triggerAnchor = merged.showOn === 'select' ? selectionRect : containerRect;\n // Tooltip anchor: container rect (or selection if select mode)\n const tooltipAnchor = merged.showOn === 'select' && selectionRect ? selectionRect : containerRect;\n\n const triggerStyle = useMemo<React.CSSProperties>(() => {\n if (!triggerAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.triggerPlacement, triggerAnchor),\n zIndex: merged.zIndex + 1,\n pointerEvents: 'auto',\n };\n }, [triggerAnchor, merged.triggerPlacement, merged.zIndex]);\n\n const tooltipStyle = useMemo<React.CSSProperties>(() => {\n const w = typeof merged.tooltipWidth === 'number' ? `${merged.tooltipWidth}px` : merged.tooltipWidth;\n if (!tooltipAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.tooltipPlacement, tooltipAnchor),\n width: w,\n zIndex: merged.zIndex,\n };\n }, [tooltipAnchor, merged.tooltipPlacement, merged.tooltipWidth, merged.zIndex]);\n\n const renderInlineContent = () => {\n if (inline.error) {\n return <div className=\"devic-aiwrap-error\">{inline.error.message}</div>;\n }\n if (inline.isProcessing) {\n return (\n <div className=\"devic-aiwrap-processing\">\n <span className=\"devic-aiwrap-spinner\" aria-hidden=\"true\" />\n <span>{t('Pensando…')}</span>\n </div>\n );\n }\n if (inline.response) {\n if (inlineRenderer) return inlineRenderer(inline.response);\n const text =\n typeof inline.response.content === 'string'\n ? inline.response.content\n : (inline.response.content as any)?.message || '';\n return <div className=\"devic-aiwrap-answer\">{text}</div>;\n }\n return null;\n };\n\n const triggerNode = trigger ?? (\n <button\n type=\"button\"\n className=\"devic-aiwrap-trigger\"\n style={{\n borderRadius:\n typeof merged.triggerBorderRadius === 'number'\n ? `${merged.triggerBorderRadius}px`\n : merged.triggerBorderRadius,\n ...(merged.color ? { ['--devic-aiwrap-color' as any]: merged.color } : {}),\n }}\n >\n <span className=\"devic-aiwrap-trigger-icon\" aria-hidden=\"true\">\n <SparklesIcon />\n </span>\n <span className=\"devic-aiwrap-trigger-label\">\n {t(merged.triggerLabel)}\n </span>\n </button>\n );\n\n const portalTarget = typeof document !== 'undefined' ? document.body : null;\n\n return (\n <DevicTranslationsProvider translations={merged.translations}>\n <span\n ref={containerRef}\n className={`devic-aiwrap-container ${className || ''}`}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n data-highlight={merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false'}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n >\n <span className=\"devic-aiwrap-content\">{children}</span>\n\n {portalTarget && triggerVisible &&\n createPortal(\n <div\n ref={triggerRef}\n className=\"devic-aiwrap-trigger-wrapper\"\n style={triggerStyle}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n onMouseDown={(e) => {\n // Prevent losing the text selection when interacting with trigger\n e.preventDefault();\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleActivate();\n }}\n >\n {triggerNode}\n </div>,\n portalTarget\n )}\n\n {portalTarget && behavior === 'inline' && isInlineOpen &&\n createPortal(\n <div\n ref={tooltipRef}\n className=\"devic-aiwrap-tooltip\"\n style={tooltipStyle}\n data-placement={merged.tooltipPlacement}\n >\n <div className=\"devic-aiwrap-tooltip-header\">\n <span className=\"devic-aiwrap-tooltip-label\">{label}</span>\n <button\n type=\"button\"\n className=\"devic-aiwrap-tooltip-close\"\n onClick={closeInline}\n aria-label={t('Cerrar')}\n >\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-aiwrap-tooltip-body\">{renderInlineContent()}</div>\n </div>,\n portalTarget\n )}\n </span>\n </DevicTranslationsProvider>\n );\n }\n);\n\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\" opacity=\"0.95\" />\n <path d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\" opacity=\"0.6\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\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"],"names":["forwardRef","useMemo","useTranslations","useRef","generateId","useState","getActiveWrapper","useEffect","subscribeActiveWrapper","useOptionalDevicContext","useCallback","useAIElementWrapper","setActiveWrapper","useLayoutEffect","useImperativeHandle","_jsx","_jsxs","DevicTranslationsProvider","createPortal"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"activeWrapperRegistry.js","sources":["../../../../../src/components/AIElementWrapper/activeWrapperRegistry.ts"],"sourcesContent":["/**\n * Module-level singleton that coordinates which AIElementWrapper instance\n * currently owns the floating trigger. Ensures only one wrapper shows its\n * trigger at any given time across the page.\n */\n\ntype Listener = (activeId: string | null) => void;\n\nlet activeId: string | null = null;\nconst listeners = new Set<Listener>();\n\nexport function getActiveWrapper(): string | null {\n return activeId;\n}\n\nexport function setActiveWrapper(id: string | null): void {\n if (activeId === id) return;\n activeId = id;\n for (const l of listeners) l(activeId);\n}\n\nexport function subscribeActiveWrapper(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n"],"names":[],"mappings":";;AAAA;;;;AAIG;AAIH,IAAI,QAAQ,GAAkB,IAAI;AAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;SAErB,gBAAgB,GAAA;AAC9B,IAAA,OAAO,QAAQ;AACjB;AAEM,SAAU,gBAAgB,CAAC,EAAiB,EAAA;IAChD,IAAI,QAAQ,KAAK,EAAE;QAAE;IACrB,QAAQ,GAAG,EAAE;IACb,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,CAAC,CAAC,QAAQ,CAAC;AACxC;AAEM,SAAU,sBAAsB,CAAC,QAAkB,EAAA;AACvD,IAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvB,IAAA,OAAO,MAAK;AACV,QAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,CAAC;AACH;;;;"}
1
+ {"version":3,"file":"activeWrapperRegistry.js","sources":["../../../../../src/components/AIElementWrapper/activeWrapperRegistry.ts"],"sourcesContent":["/**\n * Module-level singleton that coordinates which AIElementWrapper instance\n * currently owns the floating trigger. Ensures only one wrapper shows its\n * trigger at any given time across the page.\n */\n\ntype Listener = (activeId: string | null) => void;\n\nlet activeId: string | null = null;\nconst listeners = new Set<Listener>();\n\nexport function getActiveWrapper(): string | null {\n return activeId;\n}\n\nexport function setActiveWrapper(id: string | null): void {\n if (activeId === id) return;\n activeId = id;\n for (const l of listeners) l(activeId);\n}\n\nexport function subscribeActiveWrapper(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n"],"names":[],"mappings":";;AAAA;;;;AAIG;AAIH,IAAI,QAAQ,GAAkB,IAAI;AAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;SAErB,gBAAgB,GAAA;AAC9B,IAAA,OAAO,QAAQ;AACjB;AAEM,SAAU,gBAAgB,CAAC,EAAiB,EAAA;IAChD,IAAI,QAAQ,KAAK,EAAE;QAAE;IACrB,QAAQ,GAAG,EAAE;IACb,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,CAAC,CAAC,QAAQ,CAAC;AACxC;AAEM,SAAU,sBAAsB,CAAC,QAAkB,EAAA;AACvD,IAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvB,IAAA,OAAO,MAAK;AACV,QAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,CAAC;AACH;;;;;;"}
@@ -14,7 +14,7 @@ var useTranslations = require('../../i18n/useTranslations.js');
14
14
  * without the modal/tooltip UI orchestration.
15
15
  */
16
16
  function useAIElementWrapper(options) {
17
- const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, pollingInterval: propsPollingInterval, modelInterfaceTools = [], onResponse, onError, } = options;
17
+ const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, pollingInterval: propsPollingInterval, streaming: propsStreaming, modelInterfaceTools = [], onResponse, onError, } = options;
18
18
  const t = useTranslations.useTranslations();
19
19
  const context = DevicContext.useOptionalDevicContext();
20
20
  const apiKey = propsApiKey || context?.apiKey;
@@ -24,6 +24,7 @@ function useAIElementWrapper(options) {
24
24
  const resolvedTenantId = tenantId || context?.tenantId;
25
25
  const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };
26
26
  const pollingInterval = usePolling.resolvePollingInterval(propsPollingInterval, context?.pollingInterval);
27
+ const streaming = usePolling.resolveStreaming(propsStreaming, context?.streaming);
27
28
  const [isProcessing, setIsProcessing] = React.useState(false);
28
29
  const [response, setResponse] = React.useState(null);
29
30
  const [error, setError] = React.useState(null);
@@ -71,6 +72,9 @@ function useAIElementWrapper(options) {
71
72
  return clientRef.current.getRealtimeHistory(assistantId, chatUid);
72
73
  }, {
73
74
  interval: pollingInterval,
75
+ streamFn: streaming
76
+ ? (onSnapshot, signal, onActivity) => clientRef.current.streamRealtimeHistory(assistantId, chatUid, onSnapshot, signal, onActivity)
77
+ : undefined,
74
78
  enabled: shouldPoll,
75
79
  stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],
76
80
  onUpdate: async (data) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useAIElementWrapper.js","sources":["../../../../../src/components/AIElementWrapper/useAIElementWrapper.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } 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';\n\nexport interface UseAIElementWrapperOptions {\n assistantId?: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Poll cadence (ms) for the generation in progress (overrides the provider's). */\n pollingInterval?: number;\n modelInterfaceTools?: ModelInterfaceTool[];\n onResponse?: (message: ChatMessage) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseAIElementWrapperResult {\n isProcessing: boolean;\n response: ChatMessage | null;\n error: Error | null;\n /** Send a prompt to the inline assistant. */\n sendInlinePrompt: (prompt: string) => Promise<void>;\n /** Reset response/error state. */\n reset: () => void;\n}\n\n/**\n * Hook that manages the inline AI generation flow for AIElementWrapper.\n * Reuses sendMessageAsync + polling, similar to useAIGenerationButton but\n * without the modal/tooltip UI orchestration.\n */\nexport function useAIElementWrapper(\n options: UseAIElementWrapperOptions\n): UseAIElementWrapperResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n pollingInterval: propsPollingInterval,\n modelInterfaceTools = [],\n onResponse,\n onError,\n } = options;\n\n const t = useTranslations();\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 pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [response, setResponse] = useState<ChatMessage | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [shouldPoll, setShouldPoll] = useState(false);\n\n const onResponseRef = useRef(onResponse);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onResponseRef.current = onResponse;\n onErrorRef.current = onError;\n });\n\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({ tools: modelInterfaceTools });\n\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid || !assistantId) return;\n const pendingCalls =\n data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\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 usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid || !assistantId) {\n throw new Error(t('Cannot poll without client, chatUid or assistantId'));\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 if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error(t('Processing failed'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n if (data?.status === 'completed') {\n setIsProcessing(false);\n const assistantMessages = data.chatHistory.filter(\n (m: ChatMessage) => m.role === 'assistant'\n );\n const last = assistantMessages[assistantMessages.length - 1];\n if (last) {\n setResponse(last);\n onResponseRef.current?.(last);\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n const sendInlinePrompt = useCallback(\n async (prompt: string) => {\n if (!assistantId) {\n const err = new Error(t('assistantId is required for inline behavior'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n if (!clientRef.current) {\n const err = new Error(\n t('API client not configured. Please provide an API key.')\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n const trimmed = prompt.trim();\n if (!trimmed) {\n const err = new Error(t('Prompt is empty'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n setIsProcessing(true);\n setError(null);\n setResponse(null);\n\n try {\n const dto = {\n message: trimmed,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n const resp = await clientRef.current.sendMessageAsync(assistantId, dto);\n if (resp.chatUid) setChatUid(resp.chatUid);\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [assistantId, resolvedTenantId, resolvedTenantMetadata, toolSchemas]\n );\n\n const reset = useCallback(() => {\n setIsProcessing(false);\n setResponse(null);\n setError(null);\n setChatUid(null);\n setShouldPoll(false);\n }, []);\n\n return {\n isProcessing,\n response,\n error,\n sendInlinePrompt,\n reset,\n };\n}\n"],"names":["useTranslations","useOptionalDevicContext","resolvePollingInterval","useState","useRef","useEffect","DevicApiClient","useModelInterface","useCallback","usePolling"],"mappings":"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"}
1
+ {"version":3,"file":"useAIElementWrapper.js","sources":["../../../../../src/components/AIElementWrapper/useAIElementWrapper.ts"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { usePolling, resolvePollingInterval, resolveStreaming } from '../../hooks/usePolling';\nimport { useModelInterface } from '../../hooks/useModelInterface';\nimport { useTranslations } from '../../i18n';\nimport type {\n ChatMessage,\n ModelInterfaceTool,\n RealtimeChatHistory,\n} from '../../api/types';\n\nexport interface UseAIElementWrapperOptions {\n assistantId?: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Poll cadence (ms) for the generation in progress (overrides the provider's). */\n pollingInterval?: number;\n /** Follow it over a server-sent event stream instead of polling (overrides the provider's). */\n streaming?: boolean;\n modelInterfaceTools?: ModelInterfaceTool[];\n onResponse?: (message: ChatMessage) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseAIElementWrapperResult {\n isProcessing: boolean;\n response: ChatMessage | null;\n error: Error | null;\n /** Send a prompt to the inline assistant. */\n sendInlinePrompt: (prompt: string) => Promise<void>;\n /** Reset response/error state. */\n reset: () => void;\n}\n\n/**\n * Hook that manages the inline AI generation flow for AIElementWrapper.\n * Reuses sendMessageAsync + polling, similar to useAIGenerationButton but\n * without the modal/tooltip UI orchestration.\n */\nexport function useAIElementWrapper(\n options: UseAIElementWrapperOptions\n): UseAIElementWrapperResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n pollingInterval: propsPollingInterval,\n streaming: propsStreaming,\n modelInterfaceTools = [],\n onResponse,\n onError,\n } = options;\n\n const t = useTranslations();\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 pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n const streaming = resolveStreaming(propsStreaming, context?.streaming);\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [response, setResponse] = useState<ChatMessage | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [shouldPoll, setShouldPoll] = useState(false);\n\n const onResponseRef = useRef(onResponse);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onResponseRef.current = onResponse;\n onErrorRef.current = onError;\n });\n\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({ tools: modelInterfaceTools });\n\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid || !assistantId) return;\n const pendingCalls =\n data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\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 usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid || !assistantId) {\n throw new Error(t('Cannot poll without client, chatUid or assistantId'));\n }\n return clientRef.current.getRealtimeHistory(assistantId, chatUid);\n },\n {\n interval: pollingInterval,\n streamFn: streaming\n ? (onSnapshot, signal, onActivity) => clientRef.current!.streamRealtimeHistory(assistantId!, chatUid!, onSnapshot, signal, onActivity)\n : undefined,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],\n onUpdate: async (data: RealtimeChatHistory) => {\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error(t('Processing failed'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n if (data?.status === 'completed') {\n setIsProcessing(false);\n const assistantMessages = data.chatHistory.filter(\n (m: ChatMessage) => m.role === 'assistant'\n );\n const last = assistantMessages[assistantMessages.length - 1];\n if (last) {\n setResponse(last);\n onResponseRef.current?.(last);\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n const sendInlinePrompt = useCallback(\n async (prompt: string) => {\n if (!assistantId) {\n const err = new Error(t('assistantId is required for inline behavior'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n if (!clientRef.current) {\n const err = new Error(\n t('API client not configured. Please provide an API key.')\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n const trimmed = prompt.trim();\n if (!trimmed) {\n const err = new Error(t('Prompt is empty'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n setIsProcessing(true);\n setError(null);\n setResponse(null);\n\n try {\n const dto = {\n message: trimmed,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n const resp = await clientRef.current.sendMessageAsync(assistantId, dto);\n if (resp.chatUid) setChatUid(resp.chatUid);\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [assistantId, resolvedTenantId, resolvedTenantMetadata, toolSchemas]\n );\n\n const reset = useCallback(() => {\n setIsProcessing(false);\n setResponse(null);\n setError(null);\n setChatUid(null);\n setShouldPoll(false);\n }, []);\n\n return {\n isProcessing,\n response,\n error,\n sendInlinePrompt,\n reset,\n };\n}\n"],"names":["useTranslations","useOptionalDevicContext","resolvePollingInterval","resolveStreaming","useState","useRef","useEffect","DevicApiClient","useModelInterface","useCallback","usePolling"],"mappings":"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"}
@@ -77,7 +77,7 @@ const DEFAULT_OPTIONS = {
77
77
  * ```
78
78
  */
79
79
  const AIGenerationButton = React.forwardRef(function AIGenerationButton(props, ref) {
80
- const { assistantId, apiKey, baseUrl, pollingInterval, tenantId, tenantMetadata, tags, options = {}, modelInterfaceTools, onResponse, onBeforeSend, onError, onStart, onOpen, onClose, disabled, className, containerClassName, children, theme, } = props;
80
+ const { assistantId, apiKey, baseUrl, pollingInterval, streaming, tenantId, tenantMetadata, tags, options = {}, modelInterfaceTools, onResponse, onBeforeSend, onError, onStart, onOpen, onClose, disabled, className, containerClassName, children, theme, } = props;
81
81
  const mergedOptions = React.useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);
82
82
  const t = useTranslations.useTranslations(mergedOptions.translations);
83
83
  const hook = useAIGenerationButton.useAIGenerationButton({
@@ -85,6 +85,7 @@ const AIGenerationButton = React.forwardRef(function AIGenerationButton(props, r
85
85
  apiKey,
86
86
  baseUrl,
87
87
  pollingInterval,
88
+ streaming,
88
89
  tenantId,
89
90
  tenantMetadata,
90
91
  tags,
@@ -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 { 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":["forwardRef","useMemo","useTranslations","useAIGenerationButton","useImperativeHandle","useRef","useEffect","useCallback","_jsxs","_jsx","segmentToolCalls","DevicTranslationsProvider","_Fragment"],"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 streaming,\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 streaming,\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":["forwardRef","useMemo","useTranslations","useAIGenerationButton","useImperativeHandle","useRef","useEffect","useCallback","_jsxs","_jsx","segmentToolCalls","DevicTranslationsProvider","_Fragment"],"mappings":"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"}
@@ -12,7 +12,7 @@ var useTranslations = require('../../i18n/useTranslations.js');
12
12
  * Hook for managing AIGenerationButton state and behavior
13
13
  */
14
14
  function useAIGenerationButton(options) {
15
- const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, tags, pollingInterval: propsPollingInterval, options: buttonOptions = {}, modelInterfaceTools = [], onResponse, onBeforeSend, onError, onStart, onOpen, onClose, disabled, } = options;
15
+ const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, tags, pollingInterval: propsPollingInterval, streaming: propsStreaming, options: buttonOptions = {}, modelInterfaceTools = [], onResponse, onBeforeSend, onError, onStart, onOpen, onClose, disabled, } = options;
16
16
  const { mode = 'modal' } = buttonOptions;
17
17
  const t = useTranslations.useTranslations();
18
18
  // Get context
@@ -25,6 +25,7 @@ function useAIGenerationButton(options) {
25
25
  const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };
26
26
  const resolvedTags = Array.from(new Set([...(context?.tags ?? []), ...(tags ?? [])]));
27
27
  const pollingInterval = usePolling.resolvePollingInterval(propsPollingInterval, context?.pollingInterval);
28
+ const streaming = usePolling.resolveStreaming(propsStreaming, context?.streaming);
28
29
  // State
29
30
  const [isOpen, setIsOpen] = React.useState(false);
30
31
  const [isProcessing, setIsProcessing] = React.useState(false);
@@ -146,6 +147,9 @@ function useAIGenerationButton(options) {
146
147
  return clientRef.current.getRealtimeHistory(assistantId, chatUid);
147
148
  }, {
148
149
  interval: pollingInterval,
150
+ streamFn: streaming
151
+ ? (onSnapshot, signal, onActivity) => clientRef.current.streamRealtimeHistory(assistantId, chatUid, onSnapshot, signal, onActivity)
152
+ : undefined,
149
153
  enabled: shouldPoll,
150
154
  stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],
151
155
  onUpdate: async (data) => {