@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
@@ -6,61 +6,70 @@ var reactDom = require('react-dom');
6
6
  var DevicContext = require('../../provider/DevicContext.js');
7
7
  var client = require('../../api/client.js');
8
8
  var types = require('../../api/types.js');
9
+ var useTranslations = require('../../i18n/useTranslations.js');
9
10
 
10
11
  /* ── State configuration map ── */
11
- function getStateConfig(state, subthreadCount) {
12
+ function getStateConfig(t, state, subthreadCount) {
12
13
  const configs = {
13
14
  [types.AgentThreadState.QUEUED]: {
14
15
  color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',
15
- text: 'Queued', iconType: null,
16
+ text: t('Queued'), iconType: null,
16
17
  },
17
18
  [types.AgentThreadState.PROCESSING]: {
18
19
  color: 'processing', bgColor: '#e6f4ff', borderColor: '#91caff',
19
- text: 'Processing', iconType: 'spinner',
20
+ text: t('Processing'), iconType: 'spinner',
20
21
  },
21
22
  [types.AgentThreadState.COMPLETED]: {
22
23
  color: 'success', bgColor: '#f6ffed', borderColor: '#b7eb8f',
23
- text: 'Completed', iconType: null,
24
+ text: t('Completed'), iconType: null,
24
25
  },
25
26
  [types.AgentThreadState.FAILED]: {
26
27
  color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',
27
- text: 'Failed', iconType: null,
28
+ text: t('Failed'), iconType: null,
28
29
  },
29
30
  [types.AgentThreadState.TERMINATED]: {
30
31
  color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9',
31
- text: 'Terminated', iconType: null,
32
+ text: t('Terminated'), iconType: null,
32
33
  },
33
34
  [types.AgentThreadState.GUARDRAIL_TRIGGER]: {
34
35
  color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',
35
- text: 'Guardrail Triggered', iconType: 'shield',
36
+ text: t('Guardrail Triggered'), iconType: 'shield',
36
37
  },
37
38
  [types.AgentThreadState.PAUSED]: {
38
39
  color: 'purple', bgColor: '#f9f0ff', borderColor: '#d3adf7',
39
- text: 'Paused', iconType: 'pause',
40
+ text: t('Paused'), iconType: 'pause',
40
41
  },
41
42
  [types.AgentThreadState.PAUSED_FOR_APPROVAL]: {
42
43
  color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',
43
- text: 'Waiting for approval', iconType: 'warning',
44
+ text: t('Waiting for approval'), iconType: 'warning',
44
45
  },
45
46
  [types.AgentThreadState.APPROVAL_REJECTED]: {
46
47
  color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',
47
- text: 'Approval rejected', iconType: null,
48
+ text: t('Approval rejected'), iconType: null,
48
49
  },
49
50
  [types.AgentThreadState.WAITING_FOR_RESPONSE]: {
50
51
  color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',
51
- text: 'Waiting for response', iconType: 'envelope',
52
+ text: t('Waiting for response'), iconType: 'envelope',
52
53
  },
53
54
  [types.AgentThreadState.PAUSED_FOR_RESUME]: {
54
55
  color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',
55
- text: 'Resume scheduled', iconType: 'clock',
56
+ text: t('Resume scheduled'), iconType: 'clock',
56
57
  },
57
58
  [types.AgentThreadState.HANDED_OFF]: {
58
59
  color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',
59
- text: subthreadCount && subthreadCount > 1 ? `Handed off (${subthreadCount})` : 'Handed off',
60
+ text: subthreadCount && subthreadCount > 1
61
+ ? t('Handed off ({count})', { count: subthreadCount })
62
+ : t('Handed off'),
60
63
  iconType: 'handoff',
61
64
  },
62
65
  };
63
- return configs[state] || { color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9', text: 'Unknown', iconType: null };
66
+ return (configs[state] || {
67
+ color: 'default',
68
+ bgColor: '#fafafa',
69
+ borderColor: '#d9d9d9',
70
+ text: t('Unknown'),
71
+ iconType: null,
72
+ });
64
73
  }
65
74
  /* ── SVG Icons ── */
66
75
  function SpinnerIcon() {
@@ -129,6 +138,7 @@ function Modal({ open, onClose, title, titleIcon, children, footer, }) {
129
138
  }
130
139
  /* ── Explain Modal with typing effect ── */
131
140
  function ExplainModal({ open, onClose, explanation, isLoading, agentName, }) {
141
+ const t = useTranslations.useTranslations();
132
142
  const [displayedText, setDisplayedText] = React.useState('');
133
143
  const [fullTextDisplayed, setFullTextDisplayed] = React.useState(false);
134
144
  const charIndexRef = React.useRef(0);
@@ -156,28 +166,33 @@ function ExplainModal({ open, onClose, explanation, isLoading, agentName, }) {
156
166
  setFullTextDisplayed(false);
157
167
  onClose();
158
168
  };
159
- return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: `Thread execution description of "${agentName}"`, titleIcon: jsxRuntime.jsx(LightbulbIcon, {}), children: isLoading ? (jsxRuntime.jsx("div", { className: "devic-state-loading", children: jsxRuntime.jsx("div", { className: "devic-state-loading-spinner" }) })) : (jsxRuntime.jsxs("div", { className: "devic-explain-content", children: [displayedText, !fullTextDisplayed && jsxRuntime.jsx("span", { className: "devic-typing-cursor", children: "|" })] })) }));
169
+ return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: t('Thread execution description of "{agent}"', {
170
+ agent: agentName,
171
+ }), titleIcon: jsxRuntime.jsx(LightbulbIcon, {}), children: isLoading ? (jsxRuntime.jsx("div", { className: "devic-state-loading", children: jsxRuntime.jsx("div", { className: "devic-state-loading-spinner" }) })) : (jsxRuntime.jsxs("div", { className: "devic-explain-content", children: [displayedText, !fullTextDisplayed && jsxRuntime.jsx("span", { className: "devic-typing-cursor", children: "|" })] })) }));
160
172
  }
161
173
  /* ── Approval Modal ── */
162
174
  function ApprovalModal({ open, onClose, onApprove, isLoading, pausedReason, }) {
175
+ const t = useTranslations.useTranslations();
163
176
  const [feedback, setFeedback] = React.useState('');
164
177
  const handleClose = () => {
165
178
  setFeedback('');
166
179
  onClose();
167
180
  };
168
- return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: "Review Agent Request", titleIcon: jsxRuntime.jsx(EyeIcon, {}), children: jsxRuntime.jsxs("div", { className: "devic-approval-layout", children: [jsxRuntime.jsxs("div", { className: "devic-approval-request", children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, marginBottom: 8, fontSize: 13 }, children: "Agent's request:" }), jsxRuntime.jsx("div", { style: { whiteSpace: 'pre-wrap' }, children: pausedReason || 'Agent is waiting for approval to resume execution.' })] }), jsxRuntime.jsxs("div", { className: "devic-approval-actions", children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, fontSize: 13 }, children: "Your feedback:" }), jsxRuntime.jsx("textarea", { className: "devic-approval-textarea", value: feedback, onChange: (e) => setFeedback(e.target.value), placeholder: "Optional feedback for the agent..." }), jsxRuntime.jsxs("div", { className: "devic-approval-buttons", children: [jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-danger", onClick: () => onApprove('rejected', false, feedback), disabled: isLoading, type: "button", children: "Reject and finish" }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: () => onApprove('rejected', true, feedback), disabled: isLoading || !feedback.trim(), type: "button", children: "Continue with feedback" }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-success", onClick: () => onApprove('approved', false), disabled: isLoading, type: "button", children: "Approve" })] })] })] }) }));
181
+ return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: t('Review Agent Request'), titleIcon: jsxRuntime.jsx(EyeIcon, {}), children: jsxRuntime.jsxs("div", { className: "devic-approval-layout", children: [jsxRuntime.jsxs("div", { className: "devic-approval-request", children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, marginBottom: 8, fontSize: 13 }, children: t("Agent's request:") }), jsxRuntime.jsx("div", { style: { whiteSpace: 'pre-wrap' }, children: pausedReason ||
182
+ t('Agent is waiting for approval to resume execution.') })] }), jsxRuntime.jsxs("div", { className: "devic-approval-actions", children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, fontSize: 13 }, children: t('Your feedback:') }), jsxRuntime.jsx("textarea", { className: "devic-approval-textarea", value: feedback, onChange: (e) => setFeedback(e.target.value), placeholder: t('Optional feedback for the agent...') }), jsxRuntime.jsxs("div", { className: "devic-approval-buttons", children: [jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-danger", onClick: () => onApprove('rejected', false, feedback), disabled: isLoading, type: "button", children: t('Reject and finish') }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: () => onApprove('rejected', true, feedback), disabled: isLoading || !feedback.trim(), type: "button", children: t('Continue with feedback') }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-success", onClick: () => onApprove('approved', false), disabled: isLoading, type: "button", children: t('Approve') })] })] })] }) }));
169
183
  }
170
184
  /* ── Send Message Modal ── */
171
185
  function SendMessageModal({ open, onClose, onSend, isLoading, state, }) {
186
+ const t = useTranslations.useTranslations();
172
187
  const [message, setMessage] = React.useState('');
173
188
  const handleClose = () => {
174
189
  setMessage('');
175
190
  onClose();
176
191
  };
177
192
  const isRunning = state === types.AgentThreadState.PROCESSING || state === types.AgentThreadState.QUEUED;
178
- return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: "Send message to thread", titleIcon: jsxRuntime.jsx(SendIcon, {}), footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: handleClose, type: "button", children: "Cancel" }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: () => onSend(message), disabled: isLoading || !message.trim(), type: "button", children: "Send" })] }), children: jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("p", { style: { margin: '4px 0 12px', color: '#666', fontSize: 13 }, children: isRunning
179
- ? 'The agent is still running. Your message will be considered on its next turn, right after the current tool response.'
180
- : 'This will add your message and re-queue the thread so the agent runs again with it.' }), jsxRuntime.jsx("textarea", { className: "devic-approval-textarea", value: message, onChange: (e) => setMessage(e.target.value), placeholder: "Type a message to continue the thread...", onKeyDown: (e) => {
193
+ return (jsxRuntime.jsx(Modal, { open: open, onClose: handleClose, title: t('Send message to thread'), titleIcon: jsxRuntime.jsx(SendIcon, {}), footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: handleClose, type: "button", children: t('Cancel') }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: () => onSend(message), disabled: isLoading || !message.trim(), type: "button", children: t('Send') })] }), children: jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("p", { style: { margin: '4px 0 12px', color: '#666', fontSize: 13 }, children: isRunning
194
+ ? t('The agent is still running. Your message will be considered on its next turn, right after the current tool response.')
195
+ : t('This will add your message and re-queue the thread so the agent runs again with it.') }), jsxRuntime.jsx("textarea", { className: "devic-approval-textarea", value: message, onChange: (e) => setMessage(e.target.value), placeholder: t('Type a message to continue the thread...'), onKeyDown: (e) => {
181
196
  if (e.key === 'Enter' && (e.ctrlKey || e.metaKey) && message.trim()) {
182
197
  e.preventDefault();
183
198
  onSend(message);
@@ -186,15 +201,18 @@ function SendMessageModal({ open, onClose, onSend, isLoading, state, }) {
186
201
  }
187
202
  /* ── Complete Thread Modal ── */
188
203
  function CompleteModal({ open, onClose, onComplete, }) {
204
+ const t = useTranslations.useTranslations();
189
205
  const [completionState, setCompletionState] = React.useState('terminated');
190
- return (jsxRuntime.jsx(Modal, { open: open, onClose: onClose, title: "Complete Execution Manually", titleIcon: jsxRuntime.jsx(WrenchIcon, {}), footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: onClose, type: "button", children: "Cancel" }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-danger", onClick: () => onComplete(completionState), type: "button", children: "Complete" })] }), children: jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, marginBottom: 4 }, children: "Confirm Manual Completion" }), jsxRuntime.jsx("p", { style: { margin: '4px 0 12px', color: '#666', fontSize: 13 }, children: "You are about to manually complete this agent's execution." }), jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 500, marginBottom: 6, fontSize: 13 }, children: "Complete as:" }), jsxRuntime.jsxs("select", { className: "devic-completion-select", value: completionState, onChange: (e) => setCompletionState(e.target.value), children: [jsxRuntime.jsx("option", { value: "terminated", children: "Terminated - Finish thread as manually terminated" }), jsxRuntime.jsx("option", { value: "completed", children: "Completed - Finish thread as successfully completed" }), jsxRuntime.jsx("option", { value: "failed", children: "Failed - Finish thread as failed or with errors" })] })] }), jsxRuntime.jsxs("div", { className: "devic-state-warning", children: [jsxRuntime.jsx(InfoIcon, {}), jsxRuntime.jsx("span", { children: "This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion." })] })] }) }));
206
+ return (jsxRuntime.jsx(Modal, { open: open, onClose: onClose, title: t('Complete Execution Manually'), titleIcon: jsxRuntime.jsx(WrenchIcon, {}), footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: onClose, type: "button", children: t('Cancel') }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-danger", onClick: () => onComplete(completionState), type: "button", children: t('Complete') })] }), children: jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 600, marginBottom: 4 }, children: t('Confirm Manual Completion') }), jsxRuntime.jsx("p", { style: { margin: '4px 0 12px', color: '#666', fontSize: 13 }, children: t("You are about to manually complete this agent's execution.") }), jsxRuntime.jsxs("div", { style: { marginBottom: 12 }, children: [jsxRuntime.jsx("div", { style: { fontWeight: 500, marginBottom: 6, fontSize: 13 }, children: t('Complete as:') }), jsxRuntime.jsxs("select", { className: "devic-completion-select", value: completionState, onChange: (e) => setCompletionState(e.target.value), children: [jsxRuntime.jsx("option", { value: "terminated", children: t('Terminated - Finish thread as manually terminated') }), jsxRuntime.jsx("option", { value: "completed", children: t('Completed - Finish thread as successfully completed') }), jsxRuntime.jsx("option", { value: "failed", children: t('Failed - Finish thread as failed or with errors') })] })] }), jsxRuntime.jsxs("div", { className: "devic-state-warning", children: [jsxRuntime.jsx(InfoIcon, {}), jsxRuntime.jsx("span", { children: t('This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion.') })] })] }) }));
191
207
  }
192
208
  /* ── Confirm Modal (Pause/Resume) ── */
193
209
  function ConfirmModal({ open, onClose, onConfirm, title, icon, message, confirmText, }) {
194
- return (jsxRuntime.jsx(Modal, { open: open, onClose: onClose, title: title, titleIcon: icon, footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: onClose, type: "button", children: "Cancel" }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: onConfirm, type: "button", children: confirmText })] }), children: jsxRuntime.jsx("p", { style: { margin: 0, color: '#666', fontSize: 14 }, children: message }) }));
210
+ const t = useTranslations.useTranslations();
211
+ return (jsxRuntime.jsx(Modal, { open: open, onClose: onClose, title: title, titleIcon: icon, footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { className: "devic-state-btn", onClick: onClose, type: "button", children: t('Cancel') }), jsxRuntime.jsx("button", { className: "devic-state-btn devic-state-btn-primary", onClick: onConfirm, type: "button", children: confirmText })] }), children: jsxRuntime.jsx("p", { style: { margin: 0, color: '#666', fontSize: 14 }, children: message }) }));
195
212
  }
196
213
  /* ── Main ThreadStateTag ── */
197
214
  function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIcon, pausedReason, approvalRejectedMessage, finishReason, onActionComplete, pauseUntil, subthreadCount, showAdminActions = false, apiKey, baseUrl, interactive = true, }) {
215
+ const t = useTranslations.useTranslations();
198
216
  const context = DevicContext.useOptionalDevicContext();
199
217
  const resolvedApiKey = apiKey || context?.apiKey;
200
218
  const resolvedTenantSession = context?.getTenantSession;
@@ -243,9 +261,9 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
243
261
  });
244
262
  }, [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]);
245
263
  // Config
246
- const config = getStateConfig(state, subthreadCount);
264
+ const config = getStateConfig(t, state, subthreadCount);
247
265
  if (!state) {
248
- return jsxRuntime.jsx("span", { className: "devic-state-tag", "data-color": "default", children: "Unknown" });
266
+ return (jsxRuntime.jsx("span", { className: "devic-state-tag", "data-color": "default", children: t('Unknown') }));
249
267
  }
250
268
  // Icon
251
269
  const renderIcon = () => {
@@ -260,26 +278,31 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
260
278
  const getTooltipContent = () => {
261
279
  switch (state) {
262
280
  case types.AgentThreadState.PAUSED_FOR_APPROVAL:
263
- return 'Agent is waiting for approval to resume execution';
281
+ return t('Agent is waiting for approval to resume execution');
264
282
  case types.AgentThreadState.PAUSED_FOR_RESUME:
265
283
  if (pauseUntil) {
266
284
  const timeDiff = new Date(pauseUntil).getTime() - Date.now();
267
285
  const hours = Math.floor(timeDiff / 3600000);
268
286
  const minutes = Math.floor(timeDiff / 60000);
269
- const timeStr = hours > 0 ? `${hours} hours` : `${minutes} minutes`;
270
- return `Agent paused, will resume at ${new Date(pauseUntil).toLocaleString()} (${timeStr})`;
287
+ const timeStr = hours > 0
288
+ ? t('{count} hours', { count: hours })
289
+ : t('{count} minutes', { count: minutes });
290
+ return t('Agent paused, will resume at {when} ({in})', {
291
+ when: new Date(pauseUntil).toLocaleString(),
292
+ in: timeStr,
293
+ });
271
294
  }
272
- return 'Agent paused, will resume at a scheduled time';
295
+ return t('Agent paused, will resume at a scheduled time');
273
296
  case types.AgentThreadState.WAITING_FOR_RESPONSE:
274
- return pausedReason || 'Agent is waiting for response';
297
+ return pausedReason || t('Agent is waiting for response');
275
298
  case types.AgentThreadState.COMPLETED:
276
299
  case types.AgentThreadState.FAILED:
277
300
  case types.AgentThreadState.TERMINATED:
278
- return finishReason || 'Manually finished thread';
301
+ return finishReason || t('Manually finished thread');
279
302
  case types.AgentThreadState.APPROVAL_REJECTED:
280
- return approvalRejectedMessage || 'Approval was rejected';
303
+ return approvalRejectedMessage || t('Approval was rejected');
281
304
  case types.AgentThreadState.GUARDRAIL_TRIGGER:
282
- return 'Agent execution paused due to guardrail trigger';
305
+ return t('Agent execution paused due to guardrail trigger');
283
306
  default:
284
307
  return null;
285
308
  }
@@ -292,7 +315,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
292
315
  setThreadExplanation(null);
293
316
  const client = getClient();
294
317
  if (!client) {
295
- setThreadExplanation('API key not configured.');
318
+ setThreadExplanation(t('API key not configured.'));
296
319
  setIsLoadingExplanation(false);
297
320
  return;
298
321
  }
@@ -301,7 +324,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
301
324
  setThreadExplanation(explanation);
302
325
  }
303
326
  catch {
304
- setThreadExplanation('Could not obtain the thread explanation.');
327
+ setThreadExplanation(t('Could not obtain the thread explanation.'));
305
328
  }
306
329
  finally {
307
330
  setIsLoadingExplanation(false);
@@ -397,7 +420,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
397
420
  dropdownItems.push({
398
421
  key: 'complete',
399
422
  icon: jsxRuntime.jsx(WrenchIcon, {}),
400
- label: 'Complete manually',
423
+ label: t('Complete manually'),
401
424
  onClick: () => { setDropdownOpen(false); setCompleteModalOpen(true); },
402
425
  });
403
426
  }
@@ -405,7 +428,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
405
428
  dropdownItems.push({
406
429
  key: 'pause',
407
430
  icon: jsxRuntime.jsx(PauseIcon, {}),
408
- label: 'Pause',
431
+ label: t('Pause'),
409
432
  onClick: () => { setDropdownOpen(false); setPauseModalOpen(true); },
410
433
  });
411
434
  }
@@ -413,7 +436,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
413
436
  dropdownItems.push({
414
437
  key: 'resume',
415
438
  icon: jsxRuntime.jsx(PlayIcon, {}),
416
- label: 'Resume',
439
+ label: t('Resume'),
417
440
  onClick: () => { setDropdownOpen(false); setResumeModalOpen(true); },
418
441
  });
419
442
  }
@@ -421,7 +444,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
421
444
  dropdownItems.push({
422
445
  key: 'review',
423
446
  icon: jsxRuntime.jsx(EyeIcon, {}),
424
- label: 'Review',
447
+ label: t('Review'),
425
448
  onClick: () => { setDropdownOpen(false); setReviewModalOpen(true); },
426
449
  });
427
450
  }
@@ -429,14 +452,14 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
429
452
  dropdownItems.push({
430
453
  key: 'send_message',
431
454
  icon: jsxRuntime.jsx(SendIcon, {}),
432
- label: 'Send message...',
455
+ label: t('Send message...'),
433
456
  onClick: () => { setDropdownOpen(false); setSendMessageModalOpen(true); },
434
457
  });
435
458
  }
436
459
  dropdownItems.push({
437
460
  key: 'explain',
438
461
  icon: jsxRuntime.jsx(LightbulbIcon, {}),
439
- label: 'Explain thread...',
462
+ label: t('Explain thread...'),
440
463
  onClick: handleExplain,
441
464
  });
442
465
  const canInteract = interactive && threadId;
@@ -466,7 +489,7 @@ function ThreadStateTag({ state, threadId, agentName, showIcon = true, customIco
466
489
  }
467
490
  setShowTooltip(true);
468
491
  }
469
- }, onMouseLeave: () => setShowTooltip(false), children: [renderIcon(), config.text, canInteract && (jsxRuntime.jsx("span", { className: "devic-state-tag-caret", children: jsxRuntime.jsx(CaretDownIcon, {}) }))] }), showTooltip && tooltipContent && !dropdownOpen && reactDom.createPortal(jsxRuntime.jsx("div", { className: "devic-state-tooltip-portal", style: tooltipStyle, children: tooltipContent }), document.body), dropdownOpen && canInteract && reactDom.createPortal(jsxRuntime.jsx("div", { ref: dropdownRef, className: "devic-state-dropdown-portal", style: dropdownStyle, children: dropdownItems.map((item) => (jsxRuntime.jsxs("button", { className: "devic-state-dropdown-item", onClick: (e) => { e.stopPropagation(); item.onClick(); }, type: "button", children: [jsxRuntime.jsx("span", { className: "devic-state-dropdown-item-icon", children: item.icon }), item.label] }, item.key))) }), document.body), jsxRuntime.jsx(ExplainModal, { open: explainModalOpen, onClose: () => setExplainModalOpen(false), explanation: threadExplanation, isLoading: isLoadingExplanation, agentName: agentName }), jsxRuntime.jsx(CompleteModal, { open: completeModalOpen, onClose: () => setCompleteModalOpen(false), onComplete: handleComplete }), jsxRuntime.jsx(ConfirmModal, { open: pauseModalOpen, onClose: () => setPauseModalOpen(false), onConfirm: handlePause, title: "Pause Thread", icon: jsxRuntime.jsx(PauseIcon, {}), message: "You are about to pause this queued thread. It can be resumed later.", confirmText: "Pause" }), jsxRuntime.jsx(ConfirmModal, { open: resumeModalOpen, onClose: () => setResumeModalOpen(false), onConfirm: handleResume, title: "Resume Thread", icon: jsxRuntime.jsx(PlayIcon, {}), message: "You are about to resume this thread. It will go back to the queue and be processed when possible.", confirmText: "Resume" }), jsxRuntime.jsx(ApprovalModal, { open: reviewModalOpen, onClose: () => setReviewModalOpen(false), onApprove: handleApproval, isLoading: isLoadingApproval, pausedReason: pausedReason }), jsxRuntime.jsx(SendMessageModal, { open: sendMessageModalOpen, onClose: () => setSendMessageModalOpen(false), onSend: handleSendMessage, isLoading: isSendingMessage, state: state })] }));
492
+ }, onMouseLeave: () => setShowTooltip(false), children: [renderIcon(), config.text, canInteract && (jsxRuntime.jsx("span", { className: "devic-state-tag-caret", children: jsxRuntime.jsx(CaretDownIcon, {}) }))] }), showTooltip && tooltipContent && !dropdownOpen && reactDom.createPortal(jsxRuntime.jsx("div", { className: "devic-state-tooltip-portal", style: tooltipStyle, children: tooltipContent }), document.body), dropdownOpen && canInteract && reactDom.createPortal(jsxRuntime.jsx("div", { ref: dropdownRef, className: "devic-state-dropdown-portal", style: dropdownStyle, children: dropdownItems.map((item) => (jsxRuntime.jsxs("button", { className: "devic-state-dropdown-item", onClick: (e) => { e.stopPropagation(); item.onClick(); }, type: "button", children: [jsxRuntime.jsx("span", { className: "devic-state-dropdown-item-icon", children: item.icon }), item.label] }, item.key))) }), document.body), jsxRuntime.jsx(ExplainModal, { open: explainModalOpen, onClose: () => setExplainModalOpen(false), explanation: threadExplanation, isLoading: isLoadingExplanation, agentName: agentName }), jsxRuntime.jsx(CompleteModal, { open: completeModalOpen, onClose: () => setCompleteModalOpen(false), onComplete: handleComplete }), jsxRuntime.jsx(ConfirmModal, { open: pauseModalOpen, onClose: () => setPauseModalOpen(false), onConfirm: handlePause, title: t('Pause Thread'), icon: jsxRuntime.jsx(PauseIcon, {}), message: t('You are about to pause this queued thread. It can be resumed later.'), confirmText: t('Pause') }), jsxRuntime.jsx(ConfirmModal, { open: resumeModalOpen, onClose: () => setResumeModalOpen(false), onConfirm: handleResume, title: t('Resume Thread'), icon: jsxRuntime.jsx(PlayIcon, {}), message: t('You are about to resume this thread. It will go back to the queue and be processed when possible.'), confirmText: t('Resume') }), jsxRuntime.jsx(ApprovalModal, { open: reviewModalOpen, onClose: () => setReviewModalOpen(false), onApprove: handleApproval, isLoading: isLoadingApproval, pausedReason: pausedReason }), jsxRuntime.jsx(SendMessageModal, { open: sendMessageModalOpen, onClose: () => setSendMessageModalOpen(false), onSend: handleSendMessage, isLoading: isSendingMessage, state: state })] }));
470
493
  }
471
494
 
472
495
  exports.ThreadStateTag = ThreadStateTag;