@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.
- package/README.md +162 -0
- package/dist/cjs/api/types.js.map +1 -1
- package/dist/cjs/components/AICommandBar/AICommandBar.js +10 -7
- package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
- package/dist/cjs/components/AICommandBar/useAICommandBar.js +7 -5
- package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
- package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +17 -14
- package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
- package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +7 -5
- package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
- package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +11 -6
- package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
- package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +6 -4
- package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ChatDrawer.js +26 -12
- package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ChatInput.js +21 -15
- package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ChatMessages.js +54 -13
- package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/CompactionWidget.js +13 -4
- package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ConversationSelector.js +6 -4
- package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/GuardrailNotice.js +40 -0
- package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -0
- package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
- package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/LimitBanner.js +19 -9
- package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/QueueNotice.js +19 -7
- package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
- package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/ReferenceChip.js +3 -1
- package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
- package/dist/cjs/components/ChatDrawer/UsageBar.js +23 -18
- package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
- package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
- package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
- package/dist/cjs/components/Feedback/FeedbackModal.js +5 -1
- package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
- package/dist/cjs/components/Feedback/MessageActions.js +3 -1
- package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
- package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js +5 -3
- package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
- package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js +34 -24
- package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js +15 -6
- package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/McpConnectForm.js +15 -7
- package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/McpServersSection.js +32 -19
- package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/useIntegrations.js +3 -1
- package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
- package/dist/cjs/components/IntegrationsModal/useTenantMcp.js +3 -1
- package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
- package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js +63 -40
- package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
- package/dist/cjs/hooks/useDevicChat.js +11 -5
- package/dist/cjs/hooks/useDevicChat.js.map +1 -1
- package/dist/cjs/hooks/useSpeechRecording.js +8 -4
- package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
- package/dist/cjs/i18n/translate.js +48 -0
- package/dist/cjs/i18n/translate.js.map +1 -0
- package/dist/cjs/i18n/useTranslations.js +57 -0
- package/dist/cjs/i18n/useTranslations.js.map +1 -0
- package/dist/cjs/index.js +11 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/provider/DevicProvider.js +3 -1
- package/dist/cjs/provider/DevicProvider.js.map +1 -1
- package/dist/cjs/styles.css +1 -1
- package/dist/esm/api/types.d.ts +10 -1
- package/dist/esm/api/types.js.map +1 -1
- package/dist/esm/components/AICommandBar/AICommandBar.js +11 -8
- package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
- package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +10 -0
- package/dist/esm/components/AICommandBar/useAICommandBar.js +7 -5
- package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
- package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +17 -14
- package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
- package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +10 -0
- package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +7 -5
- package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +12 -7
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
- package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +10 -0
- package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +6 -4
- package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ChatDrawer.js +27 -13
- package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +33 -0
- package/dist/esm/components/ChatDrawer/ChatInput.js +21 -15
- package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ChatMessages.d.ts +1 -1
- package/dist/esm/components/ChatDrawer/ChatMessages.js +54 -13
- package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
- package/dist/esm/components/ChatDrawer/CompactionWidget.js +13 -4
- package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ConversationSelector.js +6 -4
- package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
- package/dist/esm/components/ChatDrawer/GuardrailNotice.d.ts +36 -0
- package/dist/esm/components/ChatDrawer/GuardrailNotice.js +38 -0
- package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -0
- package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
- package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
- package/dist/esm/components/ChatDrawer/LimitBanner.js +19 -9
- package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
- package/dist/esm/components/ChatDrawer/QueueNotice.js +19 -7
- package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
- package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
- package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
- package/dist/esm/components/ChatDrawer/ReferenceChip.js +3 -1
- package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
- package/dist/esm/components/ChatDrawer/UsageBar.js +23 -18
- package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
- package/dist/esm/components/ChatDrawer/index.d.ts +2 -0
- package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
- package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
- package/dist/esm/components/Feedback/FeedbackModal.js +5 -1
- package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
- package/dist/esm/components/Feedback/MessageActions.js +3 -1
- package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
- package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsHint.js +5 -3
- package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
- package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsPanel.d.ts +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js +34 -24
- package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsToggle.d.ts +1 -1
- package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js +15 -6
- package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/McpConnectForm.js +15 -7
- package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/McpServersSection.js +32 -19
- package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/useIntegrations.js +3 -1
- package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
- package/dist/esm/components/IntegrationsModal/useTenantMcp.js +3 -1
- package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
- package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +63 -40
- package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
- package/dist/esm/hooks/useDevicChat.js +12 -6
- package/dist/esm/hooks/useDevicChat.js.map +1 -1
- package/dist/esm/hooks/useSpeechRecording.js +8 -4
- package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
- package/dist/esm/i18n/index.d.ts +4 -0
- package/dist/esm/i18n/translate.d.ts +23 -0
- package/dist/esm/i18n/translate.js +43 -0
- package/dist/esm/i18n/translate.js.map +1 -0
- package/dist/esm/i18n/types.d.ts +27 -0
- package/dist/esm/i18n/useTranslations.d.ts +32 -0
- package/dist/esm/i18n/useTranslations.js +53 -0
- package/dist/esm/i18n/useTranslations.js.map +1 -0
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/provider/DevicProvider.d.ts +1 -1
- package/dist/esm/provider/DevicProvider.js +3 -1
- package/dist/esm/provider/DevicProvider.js.map +1 -1
- package/dist/esm/provider/types.d.ts +33 -0
- package/dist/esm/styles.css +1 -1
- 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
|
|
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] || {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
|
270
|
-
|
|
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:
|
|
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;
|