@devicai/ui 0.57.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +162 -0
  2. package/dist/cjs/api/types.js.map +1 -1
  3. package/dist/cjs/components/AICommandBar/AICommandBar.js +10 -7
  4. package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
  5. package/dist/cjs/components/AICommandBar/useAICommandBar.js +7 -5
  6. package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
  7. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +17 -14
  8. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  9. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +7 -5
  10. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  11. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +11 -6
  12. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  13. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +6 -4
  14. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  15. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +26 -12
  16. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  17. package/dist/cjs/components/ChatDrawer/ChatInput.js +21 -15
  18. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  19. package/dist/cjs/components/ChatDrawer/ChatMessages.js +54 -13
  20. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/CompactionWidget.js +13 -4
  22. package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
  23. package/dist/cjs/components/ChatDrawer/ConversationSelector.js +6 -4
  24. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  25. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js +40 -0
  26. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  27. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  28. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  29. package/dist/cjs/components/ChatDrawer/LimitBanner.js +19 -9
  30. package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
  31. package/dist/cjs/components/ChatDrawer/QueueNotice.js +19 -7
  32. package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
  33. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  34. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  35. package/dist/cjs/components/ChatDrawer/ReferenceChip.js +3 -1
  36. package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
  37. package/dist/cjs/components/ChatDrawer/UsageBar.js +23 -18
  38. package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
  39. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  40. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  41. package/dist/cjs/components/Feedback/FeedbackModal.js +5 -1
  42. package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
  43. package/dist/cjs/components/Feedback/MessageActions.js +3 -1
  44. package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
  45. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  46. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  47. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js +5 -3
  48. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  49. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  50. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  51. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  52. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  53. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  54. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  55. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js +15 -7
  56. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  57. package/dist/cjs/components/IntegrationsModal/McpServersSection.js +32 -19
  58. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
  59. package/dist/cjs/components/IntegrationsModal/useIntegrations.js +3 -1
  60. package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
  61. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js +3 -1
  62. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  63. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js +63 -40
  64. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  65. package/dist/cjs/hooks/useDevicChat.js +11 -5
  66. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  67. package/dist/cjs/hooks/useSpeechRecording.js +8 -4
  68. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
  69. package/dist/cjs/i18n/translate.js +48 -0
  70. package/dist/cjs/i18n/translate.js.map +1 -0
  71. package/dist/cjs/i18n/useTranslations.js +57 -0
  72. package/dist/cjs/i18n/useTranslations.js.map +1 -0
  73. package/dist/cjs/index.js +11 -0
  74. package/dist/cjs/index.js.map +1 -1
  75. package/dist/cjs/provider/DevicProvider.js +3 -1
  76. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  77. package/dist/cjs/styles.css +1 -1
  78. package/dist/esm/api/types.d.ts +10 -1
  79. package/dist/esm/api/types.js.map +1 -1
  80. package/dist/esm/components/AICommandBar/AICommandBar.js +11 -8
  81. package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
  82. package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +10 -0
  83. package/dist/esm/components/AICommandBar/useAICommandBar.js +7 -5
  84. package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
  85. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +17 -14
  86. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  87. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +10 -0
  88. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +7 -5
  89. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  90. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +12 -7
  91. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  92. package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +10 -0
  93. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +6 -4
  94. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  95. package/dist/esm/components/ChatDrawer/ChatDrawer.js +27 -13
  96. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  97. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +33 -0
  98. package/dist/esm/components/ChatDrawer/ChatInput.js +21 -15
  99. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  100. package/dist/esm/components/ChatDrawer/ChatMessages.d.ts +1 -1
  101. package/dist/esm/components/ChatDrawer/ChatMessages.js +54 -13
  102. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  103. package/dist/esm/components/ChatDrawer/CompactionWidget.js +13 -4
  104. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  105. package/dist/esm/components/ChatDrawer/ConversationSelector.js +6 -4
  106. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  107. package/dist/esm/components/ChatDrawer/GuardrailNotice.d.ts +36 -0
  108. package/dist/esm/components/ChatDrawer/GuardrailNotice.js +38 -0
  109. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  110. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  111. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  112. package/dist/esm/components/ChatDrawer/LimitBanner.js +19 -9
  113. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  114. package/dist/esm/components/ChatDrawer/QueueNotice.js +19 -7
  115. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  116. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  117. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  118. package/dist/esm/components/ChatDrawer/ReferenceChip.js +3 -1
  119. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  120. package/dist/esm/components/ChatDrawer/UsageBar.js +23 -18
  121. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  122. package/dist/esm/components/ChatDrawer/index.d.ts +2 -0
  123. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  124. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  125. package/dist/esm/components/Feedback/FeedbackModal.js +5 -1
  126. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  127. package/dist/esm/components/Feedback/MessageActions.js +3 -1
  128. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  129. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  130. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  131. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js +5 -3
  132. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  133. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  134. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  135. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.d.ts +1 -1
  136. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  137. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  138. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.d.ts +1 -1
  139. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  140. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  141. package/dist/esm/components/IntegrationsModal/McpConnectForm.js +15 -7
  142. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  143. package/dist/esm/components/IntegrationsModal/McpServersSection.js +32 -19
  144. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  145. package/dist/esm/components/IntegrationsModal/useIntegrations.js +3 -1
  146. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  147. package/dist/esm/components/IntegrationsModal/useTenantMcp.js +3 -1
  148. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  149. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +63 -40
  150. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  151. package/dist/esm/hooks/useDevicChat.js +12 -6
  152. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  153. package/dist/esm/hooks/useSpeechRecording.js +8 -4
  154. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  155. package/dist/esm/i18n/index.d.ts +4 -0
  156. package/dist/esm/i18n/translate.d.ts +23 -0
  157. package/dist/esm/i18n/translate.js +43 -0
  158. package/dist/esm/i18n/translate.js.map +1 -0
  159. package/dist/esm/i18n/types.d.ts +27 -0
  160. package/dist/esm/i18n/useTranslations.d.ts +32 -0
  161. package/dist/esm/i18n/useTranslations.js +53 -0
  162. package/dist/esm/i18n/useTranslations.js.map +1 -0
  163. package/dist/esm/index.d.ts +4 -2
  164. package/dist/esm/index.js +3 -0
  165. package/dist/esm/index.js.map +1 -1
  166. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  167. package/dist/esm/provider/DevicProvider.js +3 -1
  168. package/dist/esm/provider/DevicProvider.js.map +1 -1
  169. package/dist/esm/provider/types.d.ts +33 -0
  170. package/dist/esm/styles.css +1 -1
  171. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { forwardRef, useMemo, useImperativeHandle, useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { useAICommandBar, formatShortcut } from './useAICommandBar.js';
4
+ import { useTranslations, DevicTranslationsProvider } from '../../i18n/useTranslations.js';
4
5
  import { MessageActions } from '../Feedback/MessageActions.js';
5
6
  import { useOptionalDevicContext } from '../../provider/DevicContext.js';
6
7
  import { DevicApiClient } from '../../api/client.js';
@@ -72,6 +73,7 @@ const DEFAULT_OPTIONS = {
72
73
  commands: undefined,
73
74
  showHistoryCommand: true,
74
75
  toolGroups: undefined,
76
+ translations: undefined,
75
77
  };
76
78
  /**
77
79
  * AI Command Bar component - a floating input for quick AI interactions
@@ -93,6 +95,7 @@ const DEFAULT_OPTIONS = {
93
95
  const AICommandBar = forwardRef(function AICommandBar(props, ref) {
94
96
  const { assistantId, apiKey, baseUrl, pollingInterval, tenantId, tenantMetadata, tags, options = {}, isVisible: controlledVisible, onVisibilityChange, onExecute = 'callback', chatDrawerRef, onResponse, modelInterfaceTools, onSubmit, onToolCall, onError, onOpen, onClose, className, } = props;
95
97
  const mergedOptions = useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);
98
+ const t = useTranslations(mergedOptions.translations);
96
99
  const hook = useAICommandBar({
97
100
  assistantId,
98
101
  apiKey,
@@ -314,14 +317,14 @@ const AICommandBar = forwardRef(function AICommandBar(props, ref) {
314
317
  return (jsxs("div", { className: "devic-command-bar-result-tool-item", children: [customIcon ? (jsx("span", { className: "devic-command-bar-result-tool-icon", children: customIcon })) : (jsx(CheckIcon, { className: "devic-command-bar-result-tool-icon" })), jsx("span", { className: "devic-command-bar-result-tool-name", children: tc.summary || tc.name })] }, tc.id));
315
318
  });
316
319
  };
317
- return (jsxs("div", { ref: containerRef, className: `devic-command-bar-container ${className || ''}`, "data-position": mergedOptions.position, "data-visible": hook.isVisible, style: containerStyle, children: [hook.showingCommands && hook.filteredCommands.length > 0 && (jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsx("span", { children: "Commands" }), jsxs("span", { className: "devic-command-bar-dropdown-hint", children: [jsx("kbd", { children: "\u2191" }), jsx("kbd", { children: "\u2193" }), " to navigate, ", jsx("kbd", { children: "Enter" }), " to select"] })] }), jsx("div", { className: "devic-command-bar-dropdown-list", children: hook.filteredCommands.map((cmd, index) => (jsxs("div", { className: "devic-command-bar-dropdown-item", "data-selected": index === hook.selectedCommandIndex, onClick: () => hook.selectCommand(cmd), onMouseEnter: () => { }, children: [cmd.icon && (jsx("span", { className: "devic-command-bar-dropdown-icon", children: cmd.icon })), jsxs("span", { className: "devic-command-bar-dropdown-keyword", children: ["/", cmd.keyword] }), jsx("span", { className: "devic-command-bar-dropdown-desc", children: cmd.description })] }, cmd.keyword))) })] })), hook.showingHistory && (jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsx("span", { children: "Command History" }), hook.history.length > 0 && (jsx("button", { className: "devic-command-bar-dropdown-clear", onClick: () => {
318
- hook.clearHistory();
320
+ return (jsx(DevicTranslationsProvider, { translations: mergedOptions.translations, children: jsxs("div", { ref: containerRef, className: `devic-command-bar-container ${className || ''}`, "data-position": mergedOptions.position, "data-visible": hook.isVisible, style: containerStyle, children: [hook.showingCommands && hook.filteredCommands.length > 0 && (jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsx("span", { children: t('Commands') }), jsxs("span", { className: "devic-command-bar-dropdown-hint", children: [jsx("kbd", { children: "\u2191" }), jsx("kbd", { children: "\u2193" }), " ", t('to navigate,'), " ", jsx("kbd", { children: "Enter" }), ' ', t('to select')] })] }), jsx("div", { className: "devic-command-bar-dropdown-list", children: hook.filteredCommands.map((cmd, index) => (jsxs("div", { className: "devic-command-bar-dropdown-item", "data-selected": index === hook.selectedCommandIndex, onClick: () => hook.selectCommand(cmd), onMouseEnter: () => { }, children: [cmd.icon && (jsx("span", { className: "devic-command-bar-dropdown-icon", children: cmd.icon })), jsxs("span", { className: "devic-command-bar-dropdown-keyword", children: ["/", cmd.keyword] }), jsx("span", { className: "devic-command-bar-dropdown-desc", children: cmd.description })] }, cmd.keyword))) })] })), hook.showingHistory && (jsxs("div", { className: "devic-command-bar-dropdown", children: [jsxs("div", { className: "devic-command-bar-dropdown-header", children: [jsx("span", { children: t('Command History') }), hook.history.length > 0 && (jsx("button", { className: "devic-command-bar-dropdown-clear", onClick: () => {
321
+ hook.clearHistory();
322
+ hook.setShowingHistory(false);
323
+ }, type: "button", children: t('Clear') }))] }), jsx("div", { className: "devic-command-bar-dropdown-list", style: resultMessageStyle, children: hook.history.length === 0 ? (jsx("div", { className: "devic-command-bar-dropdown-empty", children: t('No history yet') })) : (hook.history.map((item, index) => (jsxs("div", { className: "devic-command-bar-dropdown-item devic-command-bar-history-item", onClick: () => {
319
324
  hook.setShowingHistory(false);
320
- }, type: "button", children: "Clear" }))] }), jsx("div", { className: "devic-command-bar-dropdown-list", style: resultMessageStyle, children: hook.history.length === 0 ? (jsx("div", { className: "devic-command-bar-dropdown-empty", children: "No history yet" })) : (hook.history.map((item, index) => (jsxs("div", { className: "devic-command-bar-dropdown-item devic-command-bar-history-item", onClick: () => {
321
- hook.setShowingHistory(false);
322
- hook.setInputValue(item);
323
- hook.focus();
324
- }, children: [jsx(HistoryIcon, { className: "devic-command-bar-dropdown-icon" }), jsx("span", { className: "devic-command-bar-history-text", children: item })] }, `${item}-${index}`)))) })] })), mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (jsxs("div", { className: "devic-command-bar-result", children: [hook.result.toolCalls.length > 0 && (jsxs("div", { className: "devic-command-bar-result-tools", children: [jsxs("div", { className: "devic-command-bar-result-tools-header", "data-expanded": toolsExpanded, onClick: () => setToolsExpanded(!toolsExpanded), children: [jsx(ChevronIcon, { className: "devic-command-bar-result-tools-chevron" }), jsx("span", { children: "Tool calls" }), jsx("span", { className: "devic-command-bar-result-tools-count", children: hook.result.toolCalls.length })] }), jsx("div", { className: "devic-command-bar-result-tools-list", "data-expanded": toolsExpanded, children: renderToolCallItems(hook.result.toolCalls, mergedOptions) })] })), jsx("div", { className: "devic-command-bar-result-message", style: resultMessageStyle, children: hook.result.message.content?.message || (jsx("span", { className: "devic-command-bar-result-empty", children: "No response" })) }), jsx("div", { className: "devic-cmd-result-actions", children: jsx(MessageActions, { messageId: hook.result.message.uid, messageContent: hook.result.message.content?.message, currentFeedback: feedbackState, onFeedback: handleFeedback, showCopy: true, showFeedback: true, theme: feedbackTheme }) })] })), hook.error && !hook.isProcessing && (jsx("div", { className: "devic-command-bar-error", children: hook.error.message })), jsxs("div", { className: "devic-command-bar", style: barStyle, children: [jsx("div", { className: "devic-command-bar-icon", children: hook.isProcessing ? (jsx("div", { className: "devic-command-bar-spinner" })) : (mergedOptions.icon || jsx(SparklesIcon, {})) }), hook.isProcessing ? (jsxs("div", { className: "devic-command-bar-summary", children: [hook.currentToolSummary || mergedOptions.processingMessage, "..."] })) : (jsx("input", { ref: hook.inputRef, type: "text", className: "devic-command-bar-input", placeholder: mergedOptions.placeholder, value: hook.inputValue, onChange: (e) => hook.setInputValue(e.target.value), onKeyDown: hook.handleKeyDown })), mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (jsx("div", { className: "devic-command-bar-shortcut", children: formatShortcut(mergedOptions.shortcut) }))] })] }));
325
+ hook.setInputValue(item);
326
+ hook.focus();
327
+ }, children: [jsx(HistoryIcon, { className: "devic-command-bar-dropdown-icon" }), jsx("span", { className: "devic-command-bar-history-text", children: item })] }, `${item}-${index}`)))) })] })), mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (jsxs("div", { className: "devic-command-bar-result", children: [hook.result.toolCalls.length > 0 && (jsxs("div", { className: "devic-command-bar-result-tools", children: [jsxs("div", { className: "devic-command-bar-result-tools-header", "data-expanded": toolsExpanded, onClick: () => setToolsExpanded(!toolsExpanded), children: [jsx(ChevronIcon, { className: "devic-command-bar-result-tools-chevron" }), jsx("span", { children: t('Tool calls') }), jsx("span", { className: "devic-command-bar-result-tools-count", children: hook.result.toolCalls.length })] }), jsx("div", { className: "devic-command-bar-result-tools-list", "data-expanded": toolsExpanded, children: renderToolCallItems(hook.result.toolCalls, mergedOptions) })] })), jsx("div", { className: "devic-command-bar-result-message", style: resultMessageStyle, children: hook.result.message.content?.message || (jsx("span", { className: "devic-command-bar-result-empty", children: t('No response') })) }), jsx("div", { className: "devic-cmd-result-actions", children: jsx(MessageActions, { messageId: hook.result.message.uid, messageContent: hook.result.message.content?.message, currentFeedback: feedbackState, onFeedback: handleFeedback, showCopy: true, showFeedback: true, theme: feedbackTheme }) })] })), hook.error && !hook.isProcessing && (jsx("div", { className: "devic-command-bar-error", children: hook.error.message })), jsxs("div", { className: "devic-command-bar", style: barStyle, children: [jsx("div", { className: "devic-command-bar-icon", children: hook.isProcessing ? (jsx("div", { className: "devic-command-bar-spinner" })) : (mergedOptions.icon || jsx(SparklesIcon, {})) }), hook.isProcessing ? (jsxs("div", { className: "devic-command-bar-summary", children: [hook.currentToolSummary || t(mergedOptions.processingMessage), "..."] })) : (jsx("input", { ref: hook.inputRef, type: "text", className: "devic-command-bar-input", placeholder: t(mergedOptions.placeholder), value: hook.inputValue, onChange: (e) => hook.setInputValue(e.target.value), onKeyDown: hook.handleKeyDown })), mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (jsx("div", { className: "devic-command-bar-shortcut", children: formatShortcut(mergedOptions.shortcut) }))] })] }) }));
325
328
  });
326
329
  /**
327
330
  * Sparkles icon (default)
@@ -1 +1 @@
1
- {"version":3,"file":"AICommandBar.js","sources":["../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions, ToolCallSummary } from './AICommandBar.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n toolGroups: undefined as any,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if ((resolvedApiKey || context?.getTenantSession) && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: context?.getTenantSession,\n onSessionExpired: context?.onSessionExpired,\n });\n }\n }, [resolvedApiKey, context?.getTenantSession, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n // Render tool call items with optional toolGroups segmentation\n const renderToolCallItems = (toolCalls: ToolCallSummary[], opts: Required<AICommandBarOptions>) => {\n if (opts.toolGroups && opts.toolGroups.length > 0) {\n const calls: ToolGroupCall[] = toolCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, opts.toolGroups);\n const elements: React.ReactNode[] = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n elements.push(\n <div key={`cmd-group-${groupKey}`} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n const tc = toolCalls[callIdx];\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>,\n );\n } else {\n const customIcon = opts.toolIcons?.[tc.name];\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>,\n );\n }\n callIdx += 1;\n }\n }\n\n return elements;\n }\n\n // Default: no toolGroups, render individually\n return toolCalls.map((tc) => {\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n const customIcon = opts.toolIcons?.[tc.name];\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n });\n };\n\n return (\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Commands</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> to navigate, <kbd>Enter</kbd> to select\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>Command History</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">No history yet</div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>Tool calls</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {renderToolCallItems(hook.result.toolCalls, mergedOptions)}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">No response</span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || mergedOptions.processingMessage}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={mergedOptions.placeholder}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"AICommandBar.js","sources":["../../../../src/components/AICommandBar/AICommandBar.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useState, useMemo, useEffect, useRef, useCallback } from 'react';\nimport { useAICommandBar, formatShortcut } from './useAICommandBar';\nimport { MessageActions } from '../Feedback';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport type { AICommandBarProps, AICommandBarHandle, AICommandBarOptions, ToolCallSummary } from './AICommandBar.types';\nimport type { ToolGroupCall } from '../../api/types';\nimport { segmentToolCalls } from '../../utils/toolGroups';\nimport { DevicTranslationsProvider, useTranslations } from '../../i18n';\nimport type { FeedbackState, FeedbackTheme } from '../Feedback';\nimport './AICommandBar.css';\nimport '../Feedback/Feedback.css';\n\n/**\n * Detect if a color is dark based on perceived brightness\n */\nfunction isColorDark(color: string): boolean {\n // Handle hex colors\n const hex = color.replace('#', '');\n if (hex.length === 3 || hex.length === 6) {\n const r = parseInt(hex.length === 3 ? hex[0] + hex[0] : hex.slice(0, 2), 16);\n const g = parseInt(hex.length === 3 ? hex[1] + hex[1] : hex.slice(2, 4), 16);\n const b = parseInt(hex.length === 3 ? hex[2] + hex[2] : hex.slice(4, 6), 16);\n // Perceived brightness formula\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n // Handle rgb/rgba\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 128;\n }\n return false;\n}\n\n/**\n * Lighten or darken a hex color\n */\nfunction adjustColor(color: string, amount: number): string {\n const hex = color.replace('#', '');\n const r = Math.min(255, Math.max(0, parseInt(hex.slice(0, 2), 16) + amount));\n const g = Math.min(255, Math.max(0, parseInt(hex.slice(2, 4), 16) + amount));\n const b = Math.min(255, Math.max(0, parseInt(hex.slice(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nconst DEFAULT_OPTIONS: Required<AICommandBarOptions> = {\n position: 'inline',\n fixedPlacement: {},\n shortcut: '',\n showShortcutHint: true,\n placeholder: 'Ask AI...',\n icon: undefined as any,\n width: 400,\n maxWidth: '100%',\n zIndex: 9999,\n showResultCard: true,\n resultCardMaxHeight: 300,\n color: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderColor: '#e5e7eb',\n borderRadius: 12,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 14,\n padding: '12px 16px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n animationDuration: 200,\n toolRenderers: undefined as any,\n toolIcons: undefined as any,\n processingMessage: 'Processing...',\n enableHistory: true,\n maxHistoryItems: 50,\n historyStorageKey: 'devic-command-bar-history',\n commands: undefined as any,\n showHistoryCommand: true,\n toolGroups: undefined as any,\n translations: undefined as any,\n};\n\n/**\n * AI Command Bar component - a floating input for quick AI interactions\n *\n * @example\n * ```tsx\n * <AICommandBar\n * assistantId=\"support-assistant\"\n * options={{\n * position: 'fixed',\n * fixedPlacement: { bottom: 20, right: 20 },\n * shortcut: 'cmd+j',\n * placeholder: 'Ask AI...',\n * }}\n * onResponse={({ message }) => console.log('Response:', message.content)}\n * />\n * ```\n */\nexport const AICommandBar = forwardRef<AICommandBarHandle, AICommandBarProps>(\n function AICommandBar(props, ref) {\n const {\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n className,\n } = props;\n\n const mergedOptions = useMemo(\n () => ({ ...DEFAULT_OPTIONS, ...options }),\n [options]\n );\n\n const t = useTranslations(mergedOptions.translations);\n\n const hook = useAICommandBar({\n assistantId,\n apiKey,\n baseUrl,\n pollingInterval,\n tenantId,\n tenantMetadata,\n tags,\n options: mergedOptions,\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute,\n chatDrawerRef,\n onResponse,\n modelInterfaceTools,\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n });\n\n // Expose handle\n useImperativeHandle(ref, () => ({\n open: hook.open,\n close: hook.close,\n toggle: hook.toggle,\n focus: hook.focus,\n submit: hook.submit,\n reset: hook.reset,\n }));\n\n // Tool list expansion state\n const [toolsExpanded, setToolsExpanded] = useState(false);\n\n // Feedback state\n const [feedbackState, setFeedbackState] = useState<FeedbackState>('none');\n const feedbackClientRef = useRef<DevicApiClient | null>(null);\n\n // Get context for API client\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // Initialize feedback client\n useEffect(() => {\n if ((resolvedApiKey || context?.getTenantSession) && !feedbackClientRef.current) {\n feedbackClientRef.current = new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: context?.getTenantSession,\n onSessionExpired: context?.onSessionExpired,\n });\n }\n }, [resolvedApiKey, context?.getTenantSession, resolvedBaseUrl]);\n\n // Reset feedback state when result changes\n useEffect(() => {\n if (hook.result) {\n setFeedbackState('none');\n }\n }, [hook.result?.chatUid, hook.result?.message.uid]);\n\n // Handle feedback submission\n const handleFeedback = useCallback(\n async (messageId: string, positive: boolean, comment?: string) => {\n if (!hook.result?.chatUid || !feedbackClientRef.current) return;\n\n try {\n await feedbackClientRef.current.submitChatFeedback(assistantId, hook.result.chatUid, {\n messageId,\n feedback: positive,\n feedbackComment: comment,\n });\n\n setFeedbackState(positive ? 'positive' : 'negative');\n } catch (err) {\n console.error('Failed to submit feedback:', err);\n throw err;\n }\n },\n [hook.result?.chatUid, assistantId]\n );\n\n // Container ref for theming\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Apply CSS variables for theming\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const vars: [string, string | undefined][] = [\n ['--devic-cmd-bg-override', mergedOptions.backgroundColor],\n ['--devic-cmd-text-override', mergedOptions.textColor],\n ['--devic-cmd-border-override', mergedOptions.borderColor],\n ['--devic-cmd-primary-override', mergedOptions.color],\n ['--devic-cmd-font-family-override', mergedOptions.fontFamily],\n ['--devic-cmd-font-size-override', typeof mergedOptions.fontSize === 'number' ? `${mergedOptions.fontSize}px` : mergedOptions.fontSize],\n ['--devic-cmd-radius-override', typeof mergedOptions.borderRadius === 'number' ? `${mergedOptions.borderRadius}px` : mergedOptions.borderRadius],\n ['--devic-cmd-shadow-override', mergedOptions.boxShadow],\n ['--devic-cmd-animation-duration-override', `${mergedOptions.animationDuration}ms`],\n ];\n\n for (const [name, value] of vars) {\n if (value) {\n el.style.setProperty(name, value);\n } else {\n el.style.removeProperty(name);\n }\n }\n }, [mergedOptions]);\n\n // Click-outside detection to close the bar\n useEffect(() => {\n if (!hook.isVisible) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const container = containerRef.current;\n if (container && !container.contains(e.target as Node)) {\n // Reset if there's a result, otherwise just close\n if (hook.result) {\n hook.reset();\n }\n hook.close();\n }\n };\n\n // Use mousedown instead of click to prevent race conditions\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [hook.isVisible, hook.result, hook.reset, hook.close]);\n\n // Feedback theme derived from command bar options\n const feedbackTheme = useMemo((): FeedbackTheme | undefined => {\n const bg = mergedOptions.backgroundColor;\n const text = mergedOptions.textColor;\n const border = mergedOptions.borderColor;\n const primary = mergedOptions.color;\n\n // Only create theme if we have some custom colors\n if (!bg && !text) return undefined;\n\n const isDark = bg ? isColorDark(bg) : false;\n\n return {\n backgroundColor: bg,\n textColor: text,\n textMutedColor: text && bg ? (isDark ? adjustColor(text, -60) : adjustColor(text, 60)) : undefined,\n secondaryBackgroundColor: bg ? (isDark ? adjustColor(bg, 20) : adjustColor(bg, -15)) : undefined,\n borderColor: border,\n primaryColor: primary,\n primaryHoverColor: primary ? (isDark ? adjustColor(primary, 20) : adjustColor(primary, -20)) : undefined,\n };\n }, [mergedOptions.backgroundColor, mergedOptions.textColor, mergedOptions.borderColor, mergedOptions.color]);\n\n // Container styles\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: typeof mergedOptions.width === 'number' ? `${mergedOptions.width}px` : mergedOptions.width,\n maxWidth: typeof mergedOptions.maxWidth === 'number' ? `${mergedOptions.maxWidth}px` : mergedOptions.maxWidth,\n zIndex: mergedOptions.zIndex,\n };\n\n if (mergedOptions.position === 'fixed') {\n const { top, right, bottom, left } = mergedOptions.fixedPlacement || {};\n if (top !== undefined) style.top = typeof top === 'number' ? `${top}px` : top;\n if (right !== undefined) style.right = typeof right === 'number' ? `${right}px` : right;\n if (bottom !== undefined) style.bottom = typeof bottom === 'number' ? `${bottom}px` : bottom;\n if (left !== undefined) style.left = typeof left === 'number' ? `${left}px` : left;\n }\n\n return style;\n }, [mergedOptions]);\n\n // Bar padding style\n const barStyle = useMemo(() => {\n if (!mergedOptions.padding || mergedOptions.padding === DEFAULT_OPTIONS.padding) {\n return undefined;\n }\n return {\n padding: typeof mergedOptions.padding === 'number' ? `${mergedOptions.padding}px` : mergedOptions.padding,\n };\n }, [mergedOptions.padding]);\n\n // Result card max height style\n const resultMessageStyle = useMemo(() => {\n if (!mergedOptions.resultCardMaxHeight || mergedOptions.resultCardMaxHeight === DEFAULT_OPTIONS.resultCardMaxHeight) {\n return undefined;\n }\n return {\n maxHeight: typeof mergedOptions.resultCardMaxHeight === 'number'\n ? `${mergedOptions.resultCardMaxHeight}px`\n : mergedOptions.resultCardMaxHeight,\n };\n }, [mergedOptions.resultCardMaxHeight]);\n\n // Render tool call items with optional toolGroups segmentation\n const renderToolCallItems = (toolCalls: ToolCallSummary[], opts: Required<AICommandBarOptions>) => {\n if (opts.toolGroups && opts.toolGroups.length > 0) {\n const calls: ToolGroupCall[] = toolCalls.map((tc) => ({\n name: tc.name,\n input: tc.input,\n output: tc.output,\n toolCallId: tc.id,\n }));\n const segments = segmentToolCalls(calls, opts.toolGroups);\n const elements: React.ReactNode[] = [];\n let callIdx = 0;\n\n for (const segment of segments) {\n if (segment.type === 'group') {\n const groupKey = segment.calls.map((c) => c.toolCallId).join('-');\n elements.push(\n <div key={`cmd-group-${groupKey}`} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {segment.config.renderer(segment.calls)}\n </div>,\n );\n callIdx += segment.calls.length;\n } else {\n const tc = toolCalls[callIdx];\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>,\n );\n } else {\n const customIcon = opts.toolIcons?.[tc.name];\n elements.push(\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>,\n );\n }\n callIdx += 1;\n }\n }\n\n return elements;\n }\n\n // Default: no toolGroups, render individually\n return toolCalls.map((tc) => {\n const customRenderer = opts.toolRenderers?.[tc.name];\n if (customRenderer) {\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item devic-command-bar-result-tool-custom\">\n {customRenderer(tc.input, tc.output)}\n </div>\n );\n }\n const customIcon = opts.toolIcons?.[tc.name];\n return (\n <div key={tc.id} className=\"devic-command-bar-result-tool-item\">\n {customIcon ? (\n <span className=\"devic-command-bar-result-tool-icon\">{customIcon}</span>\n ) : (\n <CheckIcon className=\"devic-command-bar-result-tool-icon\" />\n )}\n <span className=\"devic-command-bar-result-tool-name\">{tc.summary || tc.name}</span>\n </div>\n );\n });\n };\n\n return (\n <DevicTranslationsProvider translations={mergedOptions.translations}>\n <div\n ref={containerRef}\n className={`devic-command-bar-container ${className || ''}`}\n data-position={mergedOptions.position}\n data-visible={hook.isVisible}\n style={containerStyle}\n >\n {/* Commands dropdown */}\n {hook.showingCommands && hook.filteredCommands.length > 0 && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>{t('Commands')}</span>\n <span className=\"devic-command-bar-dropdown-hint\">\n <kbd>↑</kbd><kbd>↓</kbd> {t('to navigate,')} <kbd>Enter</kbd>{' '}\n {t('to select')}\n </span>\n </div>\n <div className=\"devic-command-bar-dropdown-list\">\n {hook.filteredCommands.map((cmd, index) => (\n <div\n key={cmd.keyword}\n className=\"devic-command-bar-dropdown-item\"\n data-selected={index === hook.selectedCommandIndex}\n onClick={() => hook.selectCommand(cmd)}\n onMouseEnter={() => {/* Could update selectedCommandIndex on hover */}}\n >\n {cmd.icon && (\n <span className=\"devic-command-bar-dropdown-icon\">{cmd.icon}</span>\n )}\n <span className=\"devic-command-bar-dropdown-keyword\">/{cmd.keyword}</span>\n <span className=\"devic-command-bar-dropdown-desc\">{cmd.description}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* History list */}\n {hook.showingHistory && (\n <div className=\"devic-command-bar-dropdown\">\n <div className=\"devic-command-bar-dropdown-header\">\n <span>{t('Command History')}</span>\n {hook.history.length > 0 && (\n <button\n className=\"devic-command-bar-dropdown-clear\"\n onClick={() => {\n hook.clearHistory();\n hook.setShowingHistory(false);\n }}\n type=\"button\"\n >\n {t('Clear')}\n </button>\n )}\n </div>\n <div className=\"devic-command-bar-dropdown-list\" style={resultMessageStyle}>\n {hook.history.length === 0 ? (\n <div className=\"devic-command-bar-dropdown-empty\">\n {t('No history yet')}\n </div>\n ) : (\n hook.history.map((item, index) => (\n <div\n key={`${item}-${index}`}\n className=\"devic-command-bar-dropdown-item devic-command-bar-history-item\"\n onClick={() => {\n hook.setShowingHistory(false);\n hook.setInputValue(item);\n hook.focus();\n }}\n >\n <HistoryIcon className=\"devic-command-bar-dropdown-icon\" />\n <span className=\"devic-command-bar-history-text\">{item}</span>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Result card (above bar when completed) */}\n {mergedOptions.showResultCard && hook.result && !hook.showingHistory && !hook.showingCommands && (\n <div className=\"devic-command-bar-result\">\n {/* Tool calls section */}\n {hook.result.toolCalls.length > 0 && (\n <div className=\"devic-command-bar-result-tools\">\n <div\n className=\"devic-command-bar-result-tools-header\"\n data-expanded={toolsExpanded}\n onClick={() => setToolsExpanded(!toolsExpanded)}\n >\n <ChevronIcon className=\"devic-command-bar-result-tools-chevron\" />\n <span>{t('Tool calls')}</span>\n <span className=\"devic-command-bar-result-tools-count\">\n {hook.result.toolCalls.length}\n </span>\n </div>\n <div\n className=\"devic-command-bar-result-tools-list\"\n data-expanded={toolsExpanded}\n >\n {renderToolCallItems(hook.result.toolCalls, mergedOptions)}\n </div>\n </div>\n )}\n\n {/* Message section */}\n <div className=\"devic-command-bar-result-message\" style={resultMessageStyle}>\n {hook.result.message.content?.message || (\n <span className=\"devic-command-bar-result-empty\">\n {t('No response')}\n </span>\n )}\n </div>\n\n {/* Feedback actions */}\n <div className=\"devic-cmd-result-actions\">\n <MessageActions\n messageId={hook.result.message.uid}\n messageContent={hook.result.message.content?.message}\n currentFeedback={feedbackState}\n onFeedback={handleFeedback}\n showCopy={true}\n showFeedback={true}\n theme={feedbackTheme}\n />\n </div>\n </div>\n )}\n\n {/* Error display */}\n {hook.error && !hook.isProcessing && (\n <div className=\"devic-command-bar-error\">\n {hook.error.message}\n </div>\n )}\n\n {/* Main bar */}\n <div className=\"devic-command-bar\" style={barStyle}>\n {/* Left: Icon or Loader */}\n <div className=\"devic-command-bar-icon\">\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-spinner\" />\n ) : (\n mergedOptions.icon || <SparklesIcon />\n )}\n </div>\n\n {/* Center: Input or Processing Summary */}\n {hook.isProcessing ? (\n <div className=\"devic-command-bar-summary\">\n {hook.currentToolSummary || t(mergedOptions.processingMessage)}...\n </div>\n ) : (\n <input\n ref={hook.inputRef}\n type=\"text\"\n className=\"devic-command-bar-input\"\n placeholder={t(mergedOptions.placeholder)}\n value={hook.inputValue}\n onChange={(e) => hook.setInputValue(e.target.value)}\n onKeyDown={hook.handleKeyDown}\n />\n )}\n\n {/* Right: Shortcut hint */}\n {mergedOptions.showShortcutHint && mergedOptions.shortcut && !hook.isProcessing && (\n <div className=\"devic-command-bar-shortcut\">\n {formatShortcut(mergedOptions.shortcut)}\n </div>\n )}\n </div>\n </div>\n </DevicTranslationsProvider>\n );\n }\n);\n\n/**\n * Sparkles icon (default)\n */\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {/* Main star - 4-point diamond */}\n <path\n d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\"\n fill=\"currentColor\"\n opacity=\"0.9\"\n />\n {/* Small accent star - top right */}\n <path\n d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n {/* Tiny accent dot - bottom left */}\n <circle cx=\"4\" cy=\"15\" r=\"1\" fill=\"currentColor\" opacity=\"0.4\" />\n </svg>\n );\n}\n\n/**\n * Chevron right icon\n */\nfunction ChevronIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\n/**\n * Check icon\n */\nfunction CheckIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * History icon\n */\nfunction HistoryIcon({ className }: { className?: string }): JSX.Element {\n return (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v5h5\" />\n <path d=\"M3.05 13A9 9 0 1 0 6 5.3L3 8\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { ChatMessage, ModelInterfaceTool, ToolGroupConfig } from '../../api/types';
2
+ import type { DevicTranslations } from '../../i18n';
2
3
  /**
3
4
  * Command definition for the command bar
4
5
  */
@@ -168,6 +169,15 @@ export interface AICommandBarOptions {
168
169
  * Tool group configurations for rendering consecutive tool calls together.
169
170
  */
170
171
  toolGroups?: ToolGroupConfig[];
172
+ /**
173
+ * Translations for the texts this component renders itself, keyed by the
174
+ * exact English text: `{ 'Cancel': 'Cancelar' }`.
175
+ *
176
+ * Merged on top of the `DevicProvider`'s `translations` and passed down to
177
+ * everything mounted below. Anything absent stays as the provider left it,
178
+ * or in English.
179
+ */
180
+ translations?: DevicTranslations;
171
181
  }
172
182
  /**
173
183
  * Result returned after command bar execution
@@ -4,6 +4,7 @@ import { useOptionalDevicContext } from '../../provider/DevicContext.js';
4
4
  import { DevicApiClient } from '../../api/client.js';
5
5
  import { resolvePollingInterval, usePolling } from '../../hooks/usePolling.js';
6
6
  import { useModelInterface } from '../../hooks/useModelInterface.js';
7
+ import { useTranslations } from '../../i18n/useTranslations.js';
7
8
 
8
9
  /**
9
10
  * Parse a shortcut string like "cmd+j" into its components
@@ -55,6 +56,7 @@ function formatToolName(toolName) {
55
56
  function useAICommandBar(options) {
56
57
  const { assistantId, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, tags, pollingInterval: propsPollingInterval, options: barOptions = {}, isVisible: controlledVisible, onVisibilityChange, onExecute = 'callback', chatDrawerRef, onResponse, modelInterfaceTools = [], onSubmit, onToolCall, onError, onOpen, onClose, } = options;
57
58
  const { shortcut } = barOptions;
59
+ const t = useTranslations(barOptions.translations);
58
60
  // Get context
59
61
  const context = useOptionalDevicContext();
60
62
  const apiKey = propsApiKey || context?.apiKey;
@@ -106,9 +108,9 @@ function useAICommandBar(options) {
106
108
  // Built-in history command
107
109
  const historyCommand = useMemo(() => ({
108
110
  keyword: 'history',
109
- description: 'Show command history',
111
+ description: t('Show command history'),
110
112
  message: '', // Special handling
111
- }), []);
113
+ }), [t]);
112
114
  // All available commands (user commands + built-in)
113
115
  const allCommands = useMemo(() => {
114
116
  const userCommands = commands;
@@ -354,7 +356,7 @@ function useAICommandBar(options) {
354
356
  // Polling
355
357
  usePolling(shouldPoll ? chatUid : null, async () => {
356
358
  if (!clientRef.current || !chatUid) {
357
- throw new Error('Cannot poll without client or chatUid');
359
+ throw new Error(t('Cannot poll without client or chatUid'));
358
360
  }
359
361
  return clientRef.current.getRealtimeHistory(assistantId, chatUid);
360
362
  }, {
@@ -381,7 +383,7 @@ function useAICommandBar(options) {
381
383
  setShouldPoll(false);
382
384
  if (data?.status === 'error') {
383
385
  setIsProcessing(false);
384
- const err = new Error('Processing failed');
386
+ const err = new Error(t('Processing failed'));
385
387
  setError(err);
386
388
  onErrorRef.current?.(err);
387
389
  return;
@@ -429,7 +431,7 @@ function useAICommandBar(options) {
429
431
  if (!msg.trim())
430
432
  return;
431
433
  if (!clientRef.current) {
432
- const err = new Error('API client not configured. Please provide an API key.');
434
+ const err = new Error(t('API client not configured. Please provide an API key.'));
433
435
  setError(err);
434
436
  onErrorRef.current?.(err);
435
437
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useAICommandBar.js","sources":["../../../../src/components/AICommandBar/useAICommandBar.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { usePolling, resolvePollingInterval } from '../../hooks/usePolling';\nimport { useModelInterface } from '../../hooks/useModelInterface';\nimport type {\n ChatMessage,\n ModelInterfaceTool,\n RealtimeChatHistory,\n} from '../../api/types';\nimport type {\n AICommandBarOptions,\n AICommandBarCommand,\n CommandBarResult,\n ToolCallSummary,\n ChatDrawerHandle,\n} from './AICommandBar.types';\n\nexport interface UseAICommandBarOptions {\n assistantId: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Tags applied to the conversation (merged/deduped with the provider's). */\n tags?: string[];\n /** Poll cadence (ms) for the command in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AICommandBarOptions;\n isVisible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n onExecute?: 'openDrawer' | 'callback';\n chatDrawerRef?: React.RefObject<ChatDrawerHandle>;\n onResponse?: (response: CommandBarResult) => void;\n modelInterfaceTools?: ModelInterfaceTool[];\n onSubmit?: (message: string) => void;\n onToolCall?: (toolName: string, params: Record<string, any>) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface UseAICommandBarResult {\n // Visibility\n isVisible: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n // Input\n inputValue: string;\n setInputValue: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n focus: () => void;\n\n // Processing state\n isProcessing: boolean;\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Result\n result: CommandBarResult | null;\n chatUid: string | null;\n error: Error | null;\n\n // History\n history: string[];\n historyIndex: number;\n showingHistory: boolean;\n setShowingHistory: (show: boolean) => void;\n\n // Commands\n showingCommands: boolean;\n filteredCommands: AICommandBarCommand[];\n selectedCommandIndex: number;\n selectCommand: (command: AICommandBarCommand) => void;\n\n // Actions\n submit: (message?: string) => Promise<void>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n clearHistory: () => void;\n}\n\n/**\n * Parse a shortcut string like \"cmd+j\" into its components\n */\nfunction parseShortcut(shortcut: string): { key: string; modifiers: string[] } {\n const parts = shortcut.toLowerCase().split('+');\n const key = parts.pop() || '';\n const modifiers = parts;\n return { key, modifiers };\n}\n\n/**\n * Check if a keyboard event matches a shortcut string\n */\nfunction matchShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const { key, modifiers } = parseShortcut(shortcut);\n\n const keyMatch = event.key.toLowerCase() === key;\n const cmdMatch = modifiers.includes('cmd') === (event.metaKey || event.ctrlKey);\n const shiftMatch = modifiers.includes('shift') === event.shiftKey;\n const altMatch = modifiers.includes('alt') === event.altKey;\n\n return keyMatch && cmdMatch && shiftMatch && altMatch;\n}\n\n/**\n * Format a shortcut string for display\n */\nexport function formatShortcut(shortcut: string): string {\n const isMac = typeof navigator !== 'undefined' && /Mac/.test(navigator.platform);\n return shortcut\n .replace(/cmd/gi, isMac ? '\\u2318' : 'Ctrl')\n .replace(/shift/gi, '\\u21E7')\n .replace(/alt/gi, isMac ? '\\u2325' : 'Alt')\n .replace(/\\+/g, ' ')\n .replace(/([a-z])/gi, (match) => match.toUpperCase());\n}\n\n/**\n * Format tool name to human-readable (fallback when no summary)\n */\nfunction formatToolName(toolName: string): string {\n // Convert snake_case or camelCase to human-readable\n return toolName\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase()\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/**\n * Hook for managing AICommandBar state and behavior\n */\nexport function useAICommandBar(options: UseAICommandBarOptions): UseAICommandBarResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: barOptions = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools = [],\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n } = options;\n\n const { shortcut } = barOptions;\n\n // Get context\n const context = useOptionalDevicContext();\n const apiKey = propsApiKey || context?.apiKey;\n const getTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const resolvedTags = Array.from(\n new Set([...(context?.tags ?? []), ...(tags ?? [])])\n );\n const pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n\n // Visibility state\n const [internalVisible, setInternalVisible] = useState(false);\n const isVisible = controlledVisible ?? internalVisible;\n\n // Input state\n const [inputValue, setInputValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Processing state\n const [isProcessing, setIsProcessing] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Result state\n const [result, setResult] = useState<CommandBarResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // History state\n const enableHistory = barOptions.enableHistory !== false; // default true\n const maxHistoryItems = barOptions.maxHistoryItems ?? 50;\n const historyStorageKey = barOptions.historyStorageKey ?? 'devic-command-bar-history';\n const showHistoryCommand = barOptions.showHistoryCommand !== false; // default true\n\n const [history, setHistory] = useState<string[]>(() => {\n if (!enableHistory || typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(historyStorageKey);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n });\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showingHistory, setShowingHistory] = useState(false);\n const [tempInput, setTempInput] = useState(''); // Store current input when navigating history\n\n // Commands state\n const commands = barOptions.commands ?? [];\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Built-in history command\n const historyCommand: AICommandBarCommand = useMemo(() => ({\n keyword: 'history',\n description: 'Show command history',\n message: '', // Special handling\n }), []);\n\n // All available commands (user commands + built-in)\n const allCommands = useMemo(() => {\n const userCommands = commands;\n // Add history command if enabled and not overwritten\n if (showHistoryCommand && !userCommands.some(c => c.keyword === 'history')) {\n return [...userCommands, historyCommand];\n }\n return userCommands;\n }, [commands, showHistoryCommand, historyCommand]);\n\n // Detect if showing command suggestions\n const isCommandMode = inputValue.startsWith('/');\n const commandQuery = isCommandMode ? inputValue.slice(1).toLowerCase() : '';\n const showingCommands = isCommandMode && !isProcessing && !result;\n\n // Filter commands based on query\n const filteredCommands = useMemo(() => {\n if (!showingCommands) return [];\n if (commandQuery === '') return allCommands;\n return allCommands.filter(cmd =>\n cmd.keyword.toLowerCase().includes(commandQuery) ||\n cmd.description.toLowerCase().includes(commandQuery)\n );\n }, [showingCommands, commandQuery, allCommands]);\n\n // Reset command selection when filtered list changes\n useEffect(() => {\n setSelectedCommandIndex(0);\n }, [filteredCommands.length]);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onToolCallRef = useRef(onToolCall);\n const onSubmitRef = useRef(onSubmit);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onToolCallRef.current = onToolCall;\n onSubmitRef.current = onSubmit;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n });\n\n // API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Model interface\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Visibility controls\n const open = useCallback(() => {\n setInternalVisible(true);\n onVisibilityChange?.(true);\n onOpenRef.current?.();\n // Focus input after visibility change\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [onVisibilityChange]);\n\n const close = useCallback(() => {\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n }, [onVisibilityChange]);\n\n const toggle = useCallback(() => {\n if (isVisible) {\n close();\n } else {\n open();\n }\n }, [isVisible, open, close]);\n\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Save history to localStorage\n const saveHistory = useCallback((newHistory: string[]) => {\n if (!enableHistory || typeof window === 'undefined') return;\n try {\n localStorage.setItem(historyStorageKey, JSON.stringify(newHistory));\n } catch {\n // Ignore localStorage errors\n }\n }, [enableHistory, historyStorageKey]);\n\n // Add item to history\n const addToHistory = useCallback((message: string) => {\n if (!enableHistory || !message.trim() || message.startsWith('/')) return;\n\n setHistory(prev => {\n // Don't add duplicates at the top\n const filtered = prev.filter(item => item !== message);\n const newHistory = [message, ...filtered].slice(0, maxHistoryItems);\n saveHistory(newHistory);\n return newHistory;\n });\n setHistoryIndex(-1);\n }, [enableHistory, maxHistoryItems, saveHistory]);\n\n // Clear history\n const clearHistory = useCallback(() => {\n setHistory([]);\n setHistoryIndex(-1);\n if (enableHistory && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(historyStorageKey);\n } catch {\n // Ignore\n }\n }\n }, [enableHistory, historyStorageKey]);\n\n // Navigate history\n const navigateHistory = useCallback((direction: 'up' | 'down') => {\n if (!enableHistory || history.length === 0) return;\n\n if (direction === 'up') {\n if (historyIndex === -1) {\n // Save current input before navigating\n setTempInput(inputValue);\n setHistoryIndex(0);\n setInputValue(history[0]);\n } else if (historyIndex < history.length - 1) {\n const newIndex = historyIndex + 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n }\n } else {\n if (historyIndex > 0) {\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n } else if (historyIndex === 0) {\n setHistoryIndex(-1);\n setInputValue(tempInput);\n }\n }\n }, [enableHistory, history, historyIndex, inputValue, tempInput]);\n\n // Ref to hold submit function (to avoid circular dependency)\n const submitRef = useRef<(message?: string) => Promise<void>>();\n\n // Select a command\n const selectCommand = useCallback((command: AICommandBarCommand) => {\n if (command.keyword === 'history') {\n // Special handling for history command\n setShowingHistory(true);\n setInputValue('');\n } else {\n // Send the command's message\n setInputValue('');\n submitRef.current?.(command.message);\n }\n }, []);\n\n // Navigate commands\n const navigateCommands = useCallback((direction: 'up' | 'down') => {\n if (filteredCommands.length === 0) return;\n\n if (direction === 'down') {\n setSelectedCommandIndex(prev =>\n prev < filteredCommands.length - 1 ? prev + 1 : 0\n );\n } else {\n setSelectedCommandIndex(prev =>\n prev > 0 ? prev - 1 : filteredCommands.length - 1\n );\n }\n }, [filteredCommands.length]);\n\n // Register keyboard shortcut\n useEffect(() => {\n if (!shortcut) return;\n\n const handler = (e: KeyboardEvent) => {\n if (matchShortcut(e, shortcut)) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcut, toggle]);\n\n // Process tool calls from realtime data\n const processToolCalls = useCallback((messages: ChatMessage[]): ToolCallSummary[] => {\n const summaries: ToolCallSummary[] = [];\n const toolResponseMap = new Map<string, any>();\n\n // Collect tool responses\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.tool_call_id) {\n toolResponseMap.set(msg.tool_call_id, msg.content);\n }\n }\n\n // Collect tool calls from assistant messages\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n const hasResponse = toolResponseMap.has(tc.id);\n let input: any;\n try {\n input = JSON.parse(tc.function.arguments || '{}');\n } catch {\n input = {};\n }\n\n // Use message summary if available, otherwise format tool name\n const summaryText = msg.summary || formatToolName(tc.function.name);\n\n summaries.push({\n id: tc.id,\n name: tc.function.name,\n status: hasResponse ? 'completed' : 'executing',\n summary: summaryText,\n input,\n output: toolResponseMap.get(tc.id),\n });\n }\n }\n }\n\n return summaries;\n }, []);\n\n // Handle pending client-side tool calls\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\n\n try {\n const { responses } = await executeToolCalls(pendingCalls);\n if (responses.length > 0) {\n await clientRef.current.sendToolResponses(\n assistantId,\n chatUid,\n responses,\n toolSchemas\n );\n setShouldPoll(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, executeToolCalls, extractPendingToolCalls, toolSchemas]\n );\n\n // Polling\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid) {\n throw new Error('Cannot poll without client or chatUid');\n }\n return clientRef.current.getRealtimeHistory(assistantId, chatUid);\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],\n onUpdate: async (data: RealtimeChatHistory) => {\n // Update tool calls display\n const summaries = processToolCalls(data.chatHistory);\n setToolCalls(summaries);\n\n // Update current tool summary\n // Prefer showing an executing tool, but fall back to the last tool (completed or not)\n if (summaries.length > 0) {\n const lastExecuting = summaries.filter(s => s.status === 'executing').pop();\n const lastTool = summaries[summaries.length - 1];\n setCurrentToolSummary(lastExecuting?.summary || lastTool?.summary || null);\n }\n\n // Handle client-side tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error('Processing failed');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n if (data?.status === 'completed') {\n setIsProcessing(false);\n\n // Extract final assistant message\n const assistantMessages = data.chatHistory.filter(m => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const commandResult: CommandBarResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: processToolCalls(data.chatHistory),\n };\n\n setResult(commandResult);\n\n // Handle execution mode\n if (onExecute === 'openDrawer' && chatDrawerRef?.current) {\n chatDrawerRef.current.setChatUid(chatUid);\n chatDrawerRef.current.open();\n // Close and reset the command bar when handing off to drawer\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n } else {\n onResponseRef.current?.(commandResult);\n }\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n // Submit message\n const submit = useCallback(\n async (message?: string) => {\n const msg = message ?? inputValue;\n if (!msg.trim()) return;\n\n if (!clientRef.current) {\n const err = new Error('API client not configured. Please provide an API key.');\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Add to history before processing\n addToHistory(msg);\n\n // Clear input and start processing\n setInputValue('');\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setShowingHistory(false);\n setHistoryIndex(-1);\n\n onSubmitRef.current?.(msg);\n\n try {\n const dto = {\n message: msg,\n chatUid: chatUid || undefined,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(resolvedTags.length > 0 && { tags: resolvedTags }),\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n\n if (response.chatUid && response.chatUid !== chatUid) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [inputValue, chatUid, assistantId, resolvedTenantId, resolvedTenantMetadata, resolvedTags, toolSchemas, addToHistory]\n );\n\n // Update submit ref for use in selectCommand\n submitRef.current = submit;\n\n // Reset state\n const reset = useCallback(() => {\n setInputValue('');\n setIsProcessing(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setResult(null);\n setChatUid(null);\n setError(null);\n setShouldPoll(false);\n }, []);\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Handle Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n if (showingHistory) {\n setShowingHistory(false);\n return;\n }\n if (showingCommands) {\n setInputValue('');\n return;\n }\n // Reset if there's a result or if processing\n if (result || isProcessing) {\n reset();\n }\n close();\n return;\n }\n\n // Handle arrow keys for commands\n if (showingCommands && filteredCommands.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n navigateCommands('down');\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateCommands('up');\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n selectCommand(selectedCommand);\n }\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n setInputValue('/' + selectedCommand.keyword + ' ');\n }\n return;\n }\n }\n\n // Handle arrow keys for history (only when not in command mode)\n if (!showingCommands && !isProcessing) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateHistory('up');\n return;\n }\n if (e.key === 'ArrowDown' && historyIndex >= 0) {\n e.preventDefault();\n navigateHistory('down');\n return;\n }\n }\n\n // Handle Enter to submit\n if (e.key === 'Enter' && !e.shiftKey && !isProcessing) {\n e.preventDefault();\n submit();\n }\n },\n [\n isProcessing,\n result,\n showingCommands,\n showingHistory,\n filteredCommands,\n selectedCommandIndex,\n historyIndex,\n submit,\n reset,\n close,\n navigateCommands,\n navigateHistory,\n selectCommand,\n ]\n );\n\n return {\n isVisible,\n open,\n close,\n toggle,\n inputValue,\n setInputValue,\n inputRef,\n focus,\n isProcessing,\n toolCalls,\n currentToolSummary,\n result,\n chatUid,\n error,\n history,\n historyIndex,\n showingHistory,\n setShowingHistory,\n showingCommands,\n filteredCommands,\n selectedCommandIndex,\n selectCommand,\n submit,\n reset,\n handleKeyDown,\n clearHistory,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAICommandBar.js","sources":["../../../../src/components/AICommandBar/useAICommandBar.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { usePolling, resolvePollingInterval } from '../../hooks/usePolling';\nimport { useModelInterface } from '../../hooks/useModelInterface';\nimport { useTranslations } from '../../i18n';\nimport type {\n ChatMessage,\n ModelInterfaceTool,\n RealtimeChatHistory,\n} from '../../api/types';\nimport type {\n AICommandBarOptions,\n AICommandBarCommand,\n CommandBarResult,\n ToolCallSummary,\n ChatDrawerHandle,\n} from './AICommandBar.types';\n\nexport interface UseAICommandBarOptions {\n assistantId: string;\n apiKey?: string;\n baseUrl?: string;\n tenantId?: string;\n tenantMetadata?: Record<string, any>;\n /** Tags applied to the conversation (merged/deduped with the provider's). */\n tags?: string[];\n /** Poll cadence (ms) for the command in progress (overrides the provider's). */\n pollingInterval?: number;\n options?: AICommandBarOptions;\n isVisible?: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n onExecute?: 'openDrawer' | 'callback';\n chatDrawerRef?: React.RefObject<ChatDrawerHandle>;\n onResponse?: (response: CommandBarResult) => void;\n modelInterfaceTools?: ModelInterfaceTool[];\n onSubmit?: (message: string) => void;\n onToolCall?: (toolName: string, params: Record<string, any>) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface UseAICommandBarResult {\n // Visibility\n isVisible: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n // Input\n inputValue: string;\n setInputValue: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n focus: () => void;\n\n // Processing state\n isProcessing: boolean;\n toolCalls: ToolCallSummary[];\n currentToolSummary: string | null;\n\n // Result\n result: CommandBarResult | null;\n chatUid: string | null;\n error: Error | null;\n\n // History\n history: string[];\n historyIndex: number;\n showingHistory: boolean;\n setShowingHistory: (show: boolean) => void;\n\n // Commands\n showingCommands: boolean;\n filteredCommands: AICommandBarCommand[];\n selectedCommandIndex: number;\n selectCommand: (command: AICommandBarCommand) => void;\n\n // Actions\n submit: (message?: string) => Promise<void>;\n reset: () => void;\n handleKeyDown: (e: React.KeyboardEvent) => void;\n clearHistory: () => void;\n}\n\n/**\n * Parse a shortcut string like \"cmd+j\" into its components\n */\nfunction parseShortcut(shortcut: string): { key: string; modifiers: string[] } {\n const parts = shortcut.toLowerCase().split('+');\n const key = parts.pop() || '';\n const modifiers = parts;\n return { key, modifiers };\n}\n\n/**\n * Check if a keyboard event matches a shortcut string\n */\nfunction matchShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const { key, modifiers } = parseShortcut(shortcut);\n\n const keyMatch = event.key.toLowerCase() === key;\n const cmdMatch = modifiers.includes('cmd') === (event.metaKey || event.ctrlKey);\n const shiftMatch = modifiers.includes('shift') === event.shiftKey;\n const altMatch = modifiers.includes('alt') === event.altKey;\n\n return keyMatch && cmdMatch && shiftMatch && altMatch;\n}\n\n/**\n * Format a shortcut string for display\n */\nexport function formatShortcut(shortcut: string): string {\n const isMac = typeof navigator !== 'undefined' && /Mac/.test(navigator.platform);\n return shortcut\n .replace(/cmd/gi, isMac ? '\\u2318' : 'Ctrl')\n .replace(/shift/gi, '\\u21E7')\n .replace(/alt/gi, isMac ? '\\u2325' : 'Alt')\n .replace(/\\+/g, ' ')\n .replace(/([a-z])/gi, (match) => match.toUpperCase());\n}\n\n/**\n * Format tool name to human-readable (fallback when no summary)\n */\nfunction formatToolName(toolName: string): string {\n // Convert snake_case or camelCase to human-readable\n return toolName\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase()\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/**\n * Hook for managing AICommandBar state and behavior\n */\nexport function useAICommandBar(options: UseAICommandBarOptions): UseAICommandBarResult {\n const {\n assistantId,\n apiKey: propsApiKey,\n baseUrl: propsBaseUrl,\n tenantId,\n tenantMetadata,\n tags,\n pollingInterval: propsPollingInterval,\n options: barOptions = {},\n isVisible: controlledVisible,\n onVisibilityChange,\n onExecute = 'callback',\n chatDrawerRef,\n onResponse,\n modelInterfaceTools = [],\n onSubmit,\n onToolCall,\n onError,\n onOpen,\n onClose,\n } = options;\n\n const { shortcut } = barOptions;\n\n const t = useTranslations(barOptions.translations);\n\n // Get context\n const context = useOptionalDevicContext();\n const apiKey = propsApiKey || context?.apiKey;\n const getTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const baseUrl = propsBaseUrl || context?.baseUrl || 'https://api.devic.ai';\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedTenantMetadata = { ...context?.tenantMetadata, ...tenantMetadata };\n const resolvedTags = Array.from(\n new Set([...(context?.tags ?? []), ...(tags ?? [])])\n );\n const pollingInterval = resolvePollingInterval(\n propsPollingInterval,\n context?.pollingInterval\n );\n\n // Visibility state\n const [internalVisible, setInternalVisible] = useState(false);\n const isVisible = controlledVisible ?? internalVisible;\n\n // Input state\n const [inputValue, setInputValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Processing state\n const [isProcessing, setIsProcessing] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCallSummary[]>([]);\n const [currentToolSummary, setCurrentToolSummary] = useState<string | null>(null);\n\n // Result state\n const [result, setResult] = useState<CommandBarResult | null>(null);\n const [chatUid, setChatUid] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Polling state\n const [shouldPoll, setShouldPoll] = useState(false);\n\n // History state\n const enableHistory = barOptions.enableHistory !== false; // default true\n const maxHistoryItems = barOptions.maxHistoryItems ?? 50;\n const historyStorageKey = barOptions.historyStorageKey ?? 'devic-command-bar-history';\n const showHistoryCommand = barOptions.showHistoryCommand !== false; // default true\n\n const [history, setHistory] = useState<string[]>(() => {\n if (!enableHistory || typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(historyStorageKey);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n });\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showingHistory, setShowingHistory] = useState(false);\n const [tempInput, setTempInput] = useState(''); // Store current input when navigating history\n\n // Commands state\n const commands = barOptions.commands ?? [];\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Built-in history command\n const historyCommand: AICommandBarCommand = useMemo(() => ({\n keyword: 'history',\n description: t('Show command history'),\n message: '', // Special handling\n }), [t]);\n\n // All available commands (user commands + built-in)\n const allCommands = useMemo(() => {\n const userCommands = commands;\n // Add history command if enabled and not overwritten\n if (showHistoryCommand && !userCommands.some(c => c.keyword === 'history')) {\n return [...userCommands, historyCommand];\n }\n return userCommands;\n }, [commands, showHistoryCommand, historyCommand]);\n\n // Detect if showing command suggestions\n const isCommandMode = inputValue.startsWith('/');\n const commandQuery = isCommandMode ? inputValue.slice(1).toLowerCase() : '';\n const showingCommands = isCommandMode && !isProcessing && !result;\n\n // Filter commands based on query\n const filteredCommands = useMemo(() => {\n if (!showingCommands) return [];\n if (commandQuery === '') return allCommands;\n return allCommands.filter(cmd =>\n cmd.keyword.toLowerCase().includes(commandQuery) ||\n cmd.description.toLowerCase().includes(commandQuery)\n );\n }, [showingCommands, commandQuery, allCommands]);\n\n // Reset command selection when filtered list changes\n useEffect(() => {\n setSelectedCommandIndex(0);\n }, [filteredCommands.length]);\n\n // Callback refs\n const onErrorRef = useRef(onError);\n const onResponseRef = useRef(onResponse);\n const onToolCallRef = useRef(onToolCall);\n const onSubmitRef = useRef(onSubmit);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n\n useEffect(() => {\n onErrorRef.current = onError;\n onResponseRef.current = onResponse;\n onToolCallRef.current = onToolCall;\n onSubmitRef.current = onSubmit;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n });\n\n // API client\n const clientRef = useRef<DevicApiClient | null>(null);\n if (!clientRef.current && (apiKey || getTenantSession)) {\n clientRef.current = new DevicApiClient({ apiKey, baseUrl, getTenantSession, onSessionExpired });\n }\n\n useEffect(() => {\n if (clientRef.current && apiKey) {\n clientRef.current.setConfig({ apiKey, baseUrl });\n }\n }, [apiKey, baseUrl]);\n\n // Model interface\n const {\n toolSchemas,\n handleToolCalls: executeToolCalls,\n extractPendingToolCalls,\n } = useModelInterface({\n tools: modelInterfaceTools,\n onToolExecute: onToolCall,\n });\n\n // Visibility controls\n const open = useCallback(() => {\n setInternalVisible(true);\n onVisibilityChange?.(true);\n onOpenRef.current?.();\n // Focus input after visibility change\n setTimeout(() => inputRef.current?.focus(), 50);\n }, [onVisibilityChange]);\n\n const close = useCallback(() => {\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n }, [onVisibilityChange]);\n\n const toggle = useCallback(() => {\n if (isVisible) {\n close();\n } else {\n open();\n }\n }, [isVisible, open, close]);\n\n const focus = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Save history to localStorage\n const saveHistory = useCallback((newHistory: string[]) => {\n if (!enableHistory || typeof window === 'undefined') return;\n try {\n localStorage.setItem(historyStorageKey, JSON.stringify(newHistory));\n } catch {\n // Ignore localStorage errors\n }\n }, [enableHistory, historyStorageKey]);\n\n // Add item to history\n const addToHistory = useCallback((message: string) => {\n if (!enableHistory || !message.trim() || message.startsWith('/')) return;\n\n setHistory(prev => {\n // Don't add duplicates at the top\n const filtered = prev.filter(item => item !== message);\n const newHistory = [message, ...filtered].slice(0, maxHistoryItems);\n saveHistory(newHistory);\n return newHistory;\n });\n setHistoryIndex(-1);\n }, [enableHistory, maxHistoryItems, saveHistory]);\n\n // Clear history\n const clearHistory = useCallback(() => {\n setHistory([]);\n setHistoryIndex(-1);\n if (enableHistory && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(historyStorageKey);\n } catch {\n // Ignore\n }\n }\n }, [enableHistory, historyStorageKey]);\n\n // Navigate history\n const navigateHistory = useCallback((direction: 'up' | 'down') => {\n if (!enableHistory || history.length === 0) return;\n\n if (direction === 'up') {\n if (historyIndex === -1) {\n // Save current input before navigating\n setTempInput(inputValue);\n setHistoryIndex(0);\n setInputValue(history[0]);\n } else if (historyIndex < history.length - 1) {\n const newIndex = historyIndex + 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n }\n } else {\n if (historyIndex > 0) {\n const newIndex = historyIndex - 1;\n setHistoryIndex(newIndex);\n setInputValue(history[newIndex]);\n } else if (historyIndex === 0) {\n setHistoryIndex(-1);\n setInputValue(tempInput);\n }\n }\n }, [enableHistory, history, historyIndex, inputValue, tempInput]);\n\n // Ref to hold submit function (to avoid circular dependency)\n const submitRef = useRef<(message?: string) => Promise<void>>();\n\n // Select a command\n const selectCommand = useCallback((command: AICommandBarCommand) => {\n if (command.keyword === 'history') {\n // Special handling for history command\n setShowingHistory(true);\n setInputValue('');\n } else {\n // Send the command's message\n setInputValue('');\n submitRef.current?.(command.message);\n }\n }, []);\n\n // Navigate commands\n const navigateCommands = useCallback((direction: 'up' | 'down') => {\n if (filteredCommands.length === 0) return;\n\n if (direction === 'down') {\n setSelectedCommandIndex(prev =>\n prev < filteredCommands.length - 1 ? prev + 1 : 0\n );\n } else {\n setSelectedCommandIndex(prev =>\n prev > 0 ? prev - 1 : filteredCommands.length - 1\n );\n }\n }, [filteredCommands.length]);\n\n // Register keyboard shortcut\n useEffect(() => {\n if (!shortcut) return;\n\n const handler = (e: KeyboardEvent) => {\n if (matchShortcut(e, shortcut)) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [shortcut, toggle]);\n\n // Process tool calls from realtime data\n const processToolCalls = useCallback((messages: ChatMessage[]): ToolCallSummary[] => {\n const summaries: ToolCallSummary[] = [];\n const toolResponseMap = new Map<string, any>();\n\n // Collect tool responses\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.tool_call_id) {\n toolResponseMap.set(msg.tool_call_id, msg.content);\n }\n }\n\n // Collect tool calls from assistant messages\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n const hasResponse = toolResponseMap.has(tc.id);\n let input: any;\n try {\n input = JSON.parse(tc.function.arguments || '{}');\n } catch {\n input = {};\n }\n\n // Use message summary if available, otherwise format tool name\n const summaryText = msg.summary || formatToolName(tc.function.name);\n\n summaries.push({\n id: tc.id,\n name: tc.function.name,\n status: hasResponse ? 'completed' : 'executing',\n summary: summaryText,\n input,\n output: toolResponseMap.get(tc.id),\n });\n }\n }\n }\n\n return summaries;\n }, []);\n\n // Handle pending client-side tool calls\n const handlePendingToolCalls = useCallback(\n async (data: RealtimeChatHistory) => {\n if (!clientRef.current || !chatUid) return;\n\n const pendingCalls = data.pendingToolCalls || extractPendingToolCalls(data.chatHistory);\n if (pendingCalls.length === 0) return;\n\n try {\n const { responses } = await executeToolCalls(pendingCalls);\n if (responses.length > 0) {\n await clientRef.current.sendToolResponses(\n assistantId,\n chatUid,\n responses,\n toolSchemas\n );\n setShouldPoll(true);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n }\n },\n [chatUid, assistantId, executeToolCalls, extractPendingToolCalls, toolSchemas]\n );\n\n // Polling\n usePolling(\n shouldPoll ? chatUid : null,\n async () => {\n if (!clientRef.current || !chatUid) {\n throw new Error(t('Cannot poll without client or chatUid'));\n }\n return clientRef.current.getRealtimeHistory(assistantId, chatUid);\n },\n {\n interval: pollingInterval,\n enabled: shouldPoll,\n stopStatuses: ['completed', 'error', 'waiting_for_tool_response'],\n onUpdate: async (data: RealtimeChatHistory) => {\n // Update tool calls display\n const summaries = processToolCalls(data.chatHistory);\n setToolCalls(summaries);\n\n // Update current tool summary\n // Prefer showing an executing tool, but fall back to the last tool (completed or not)\n if (summaries.length > 0) {\n const lastExecuting = summaries.filter(s => s.status === 'executing').pop();\n const lastTool = summaries[summaries.length - 1];\n setCurrentToolSummary(lastExecuting?.summary || lastTool?.summary || null);\n }\n\n // Handle client-side tool calls\n if (data.status === 'waiting_for_tool_response' || data.pendingToolCalls?.length) {\n await handlePendingToolCalls(data);\n }\n },\n onStop: (data) => {\n setShouldPoll(false);\n\n if (data?.status === 'error') {\n setIsProcessing(false);\n const err = new Error(t('Processing failed'));\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n if (data?.status === 'completed') {\n setIsProcessing(false);\n\n // Extract final assistant message\n const assistantMessages = data.chatHistory.filter(m => m.role === 'assistant');\n const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];\n\n if (lastAssistantMessage && chatUid) {\n const commandResult: CommandBarResult = {\n chatUid,\n message: lastAssistantMessage,\n toolCalls: processToolCalls(data.chatHistory),\n };\n\n setResult(commandResult);\n\n // Handle execution mode\n if (onExecute === 'openDrawer' && chatDrawerRef?.current) {\n chatDrawerRef.current.setChatUid(chatUid);\n chatDrawerRef.current.open();\n // Close and reset the command bar when handing off to drawer\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setInternalVisible(false);\n onVisibilityChange?.(false);\n onCloseRef.current?.();\n } else {\n onResponseRef.current?.(commandResult);\n }\n }\n }\n },\n onError: (err) => {\n setError(err);\n setIsProcessing(false);\n setShouldPoll(false);\n onErrorRef.current?.(err);\n },\n }\n );\n\n // Submit message\n const submit = useCallback(\n async (message?: string) => {\n const msg = message ?? inputValue;\n if (!msg.trim()) return;\n\n if (!clientRef.current) {\n const err = new Error(\n t('API client not configured. Please provide an API key.')\n );\n setError(err);\n onErrorRef.current?.(err);\n return;\n }\n\n // Add to history before processing\n addToHistory(msg);\n\n // Clear input and start processing\n setInputValue('');\n setIsProcessing(true);\n setError(null);\n setResult(null);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setShowingHistory(false);\n setHistoryIndex(-1);\n\n onSubmitRef.current?.(msg);\n\n try {\n const dto = {\n message: msg,\n chatUid: chatUid || undefined,\n metadata: resolvedTenantMetadata,\n tenantId: resolvedTenantId,\n ...(resolvedTags.length > 0 && { tags: resolvedTags }),\n ...(toolSchemas.length > 0 && { tools: toolSchemas }),\n };\n\n const response = await clientRef.current.sendMessageAsync(assistantId, dto);\n\n if (response.chatUid && response.chatUid !== chatUid) {\n setChatUid(response.chatUid);\n }\n\n setShouldPoll(true);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsProcessing(false);\n onErrorRef.current?.(error);\n }\n },\n [inputValue, chatUid, assistantId, resolvedTenantId, resolvedTenantMetadata, resolvedTags, toolSchemas, addToHistory]\n );\n\n // Update submit ref for use in selectCommand\n submitRef.current = submit;\n\n // Reset state\n const reset = useCallback(() => {\n setInputValue('');\n setIsProcessing(false);\n setToolCalls([]);\n setCurrentToolSummary(null);\n setResult(null);\n setChatUid(null);\n setError(null);\n setShouldPoll(false);\n }, []);\n\n // Handle keyboard events\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Handle Escape\n if (e.key === 'Escape') {\n e.preventDefault();\n if (showingHistory) {\n setShowingHistory(false);\n return;\n }\n if (showingCommands) {\n setInputValue('');\n return;\n }\n // Reset if there's a result or if processing\n if (result || isProcessing) {\n reset();\n }\n close();\n return;\n }\n\n // Handle arrow keys for commands\n if (showingCommands && filteredCommands.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n navigateCommands('down');\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateCommands('up');\n return;\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n selectCommand(selectedCommand);\n }\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n const selectedCommand = filteredCommands[selectedCommandIndex];\n if (selectedCommand) {\n setInputValue('/' + selectedCommand.keyword + ' ');\n }\n return;\n }\n }\n\n // Handle arrow keys for history (only when not in command mode)\n if (!showingCommands && !isProcessing) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n navigateHistory('up');\n return;\n }\n if (e.key === 'ArrowDown' && historyIndex >= 0) {\n e.preventDefault();\n navigateHistory('down');\n return;\n }\n }\n\n // Handle Enter to submit\n if (e.key === 'Enter' && !e.shiftKey && !isProcessing) {\n e.preventDefault();\n submit();\n }\n },\n [\n isProcessing,\n result,\n showingCommands,\n showingHistory,\n filteredCommands,\n selectedCommandIndex,\n historyIndex,\n submit,\n reset,\n close,\n navigateCommands,\n navigateHistory,\n selectCommand,\n ]\n );\n\n return {\n isVisible,\n open,\n close,\n toggle,\n inputValue,\n setInputValue,\n inputRef,\n focus,\n isProcessing,\n toolCalls,\n currentToolSummary,\n result,\n chatUid,\n error,\n history,\n historyIndex,\n showingHistory,\n setShowingHistory,\n showingCommands,\n filteredCommands,\n selectedCommandIndex,\n selectCommand,\n submit,\n reset,\n handleKeyDown,\n clearHistory,\n };\n}\n"],"names":[],"mappings":"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"}