@agenticmail/enterprise 0.5.199 → 0.5.201
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/dist/agent-heartbeat-EGMBRD3R.js +510 -0
- package/dist/chunk-5C3SCMY5.js +4457 -0
- package/dist/chunk-6OZYUTPL.js +1224 -0
- package/dist/chunk-ZR4Z42HT.js +3679 -0
- package/dist/cli-agent-PLMDHMRR.js +1602 -0
- package/dist/cli-serve-PLBAWN7N.js +114 -0
- package/dist/cli.js +3 -3
- package/dist/dashboard/app.js +3 -0
- package/dist/dashboard/components/icons.js +1 -0
- package/dist/dashboard/pages/activity.js +14 -1
- package/dist/dashboard/pages/agent-detail/activity.js +17 -1
- package/dist/dashboard/pages/agent-detail/autonomy.js +17 -1
- package/dist/dashboard/pages/agent-detail/budget.js +25 -2
- package/dist/dashboard/pages/agent-detail/channels.js +10 -1
- package/dist/dashboard/pages/agent-detail/communication.js +10 -1
- package/dist/dashboard/pages/agent-detail/configuration.js +42 -1
- package/dist/dashboard/pages/agent-detail/deployment.js +147 -16
- package/dist/dashboard/pages/agent-detail/email.js +10 -1
- package/dist/dashboard/pages/agent-detail/guardrails.js +27 -3
- package/dist/dashboard/pages/agent-detail/manager.js +15 -1
- package/dist/dashboard/pages/agent-detail/meeting-browser.js +14 -2
- package/dist/dashboard/pages/agent-detail/memory.js +24 -5
- package/dist/dashboard/pages/agent-detail/overview.js +159 -21
- package/dist/dashboard/pages/agent-detail/permissions.js +28 -7
- package/dist/dashboard/pages/agent-detail/personal-details.js +17 -1
- package/dist/dashboard/pages/agent-detail/security.js +21 -5
- package/dist/dashboard/pages/agent-detail/skills-section.js +9 -1
- package/dist/dashboard/pages/agent-detail/tool-security.js +35 -8
- package/dist/dashboard/pages/agent-detail/tools.js +10 -1
- package/dist/dashboard/pages/agent-detail/whatsapp.js +11 -1
- package/dist/dashboard/pages/agent-detail/workforce.js +19 -4
- package/dist/dashboard/pages/agents.js +15 -1
- package/dist/dashboard/pages/approvals.js +15 -1
- package/dist/dashboard/pages/audit.js +23 -1
- package/dist/dashboard/pages/compliance.js +24 -2
- package/dist/dashboard/pages/dashboard.js +25 -6
- package/dist/dashboard/pages/dlp.js +23 -2
- package/dist/dashboard/pages/domain-status.js +51 -7
- package/dist/dashboard/pages/guardrails.js +29 -3
- package/dist/dashboard/pages/journal.js +24 -4
- package/dist/dashboard/pages/knowledge-contributions.js +69 -3
- package/dist/dashboard/pages/knowledge-import.js +6 -1
- package/dist/dashboard/pages/knowledge.js +51 -9
- package/dist/dashboard/pages/messages.js +28 -5
- package/dist/dashboard/pages/org-chart.js +18 -1
- package/dist/dashboard/pages/settings.js +30 -6
- package/dist/dashboard/pages/skill-connections.js +18 -4
- package/dist/dashboard/pages/skills.js +11 -1
- package/dist/dashboard/pages/task-pipeline.js +455 -0
- package/dist/dashboard/pages/users.js +14 -1
- package/dist/dashboard/pages/vault.js +22 -2
- package/dist/dashboard/pages/workforce.js +17 -1
- package/dist/index.js +3 -3
- package/dist/routes-KHABOHOV.js +13273 -0
- package/dist/runtime-6WFHCG3N.js +45 -0
- package/dist/server-BENJQHTB.js +15 -0
- package/dist/setup-7RQIFV5Y.js +20 -0
- package/package.json +1 -1
- package/src/dashboard/HELP-TOOLTIPS-GUIDE.md +45 -0
- package/src/dashboard/app.js +3 -0
- package/src/dashboard/components/icons.js +1 -0
- package/src/dashboard/pages/activity.js +14 -1
- package/src/dashboard/pages/agent-detail/activity.js +17 -1
- package/src/dashboard/pages/agent-detail/autonomy.js +17 -1
- package/src/dashboard/pages/agent-detail/budget.js +25 -2
- package/src/dashboard/pages/agent-detail/channels.js +10 -1
- package/src/dashboard/pages/agent-detail/communication.js +10 -1
- package/src/dashboard/pages/agent-detail/configuration.js +42 -1
- package/src/dashboard/pages/agent-detail/deployment.js +147 -16
- package/src/dashboard/pages/agent-detail/email.js +10 -1
- package/src/dashboard/pages/agent-detail/guardrails.js +27 -3
- package/src/dashboard/pages/agent-detail/manager.js +15 -1
- package/src/dashboard/pages/agent-detail/meeting-browser.js +14 -2
- package/src/dashboard/pages/agent-detail/memory.js +24 -5
- package/src/dashboard/pages/agent-detail/overview.js +159 -21
- package/src/dashboard/pages/agent-detail/permissions.js +28 -7
- package/src/dashboard/pages/agent-detail/personal-details.js +17 -1
- package/src/dashboard/pages/agent-detail/security.js +21 -5
- package/src/dashboard/pages/agent-detail/skills-section.js +9 -1
- package/src/dashboard/pages/agent-detail/tool-security.js +35 -8
- package/src/dashboard/pages/agent-detail/tools.js +10 -1
- package/src/dashboard/pages/agent-detail/whatsapp.js +11 -1
- package/src/dashboard/pages/agent-detail/workforce.js +19 -4
- package/src/dashboard/pages/agents.js +15 -1
- package/src/dashboard/pages/approvals.js +15 -1
- package/src/dashboard/pages/audit.js +23 -1
- package/src/dashboard/pages/compliance.js +24 -2
- package/src/dashboard/pages/dashboard.js +25 -6
- package/src/dashboard/pages/dlp.js +23 -2
- package/src/dashboard/pages/domain-status.js +51 -7
- package/src/dashboard/pages/guardrails.js +29 -3
- package/src/dashboard/pages/journal.js +24 -4
- package/src/dashboard/pages/knowledge-contributions.js +69 -3
- package/src/dashboard/pages/knowledge-import.js +6 -1
- package/src/dashboard/pages/knowledge.js +51 -9
- package/src/dashboard/pages/messages.js +28 -5
- package/src/dashboard/pages/org-chart.js +18 -1
- package/src/dashboard/pages/settings.js +30 -6
- package/src/dashboard/pages/skill-connections.js +18 -4
- package/src/dashboard/pages/skills.js +11 -1
- package/src/dashboard/pages/task-pipeline.js +455 -0
- package/src/dashboard/pages/users.js +14 -1
- package/src/dashboard/pages/vault.js +22 -2
- package/src/dashboard/pages/workforce.js +17 -1
- package/src/engine/model-fallback.ts +141 -0
- package/src/engine/routes.ts +5 -0
- package/src/engine/task-queue-after-spawn.ts +66 -0
- package/src/engine/task-queue-before-spawn.ts +109 -0
- package/src/engine/task-queue-routes.ts +133 -0
- package/src/engine/task-queue.ts +369 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { h, useState, useEffect, useCallback, Fragment, useApp, apiCall, engineCall, formatUptime, buildAgentDataMap, renderAgentBadge, showConfirm, getOrgId } from '../../components/utils.js';
|
|
2
2
|
import { I } from '../../components/icons.js';
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
4
5
|
import { TagInput } from '../../components/tag-input.js';
|
|
5
6
|
import { Badge, StatCard, EmptyState } from './shared.js?v=4';
|
|
6
7
|
|
|
@@ -208,19 +209,29 @@ export function DeploymentSection(props) {
|
|
|
208
209
|
.catch(function(err) { toast(err.message, 'error'); });
|
|
209
210
|
};
|
|
210
211
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
212
|
+
// 5-step delete confirmation flow
|
|
213
|
+
var [deleteStep, setDeleteStep] = useState(0);
|
|
214
|
+
var [deleteTyped, setDeleteTyped] = useState('');
|
|
215
|
+
var _agentName = ea.name || identity.name || agentId;
|
|
216
|
+
|
|
217
|
+
var startDelete = function() { setDeleteStep(1); setDeleteTyped(''); };
|
|
218
|
+
var cancelDelete = function() { setDeleteStep(0); setDeleteTyped(''); };
|
|
219
|
+
var [deleting, setDeleting] = useState(false);
|
|
220
|
+
|
|
221
|
+
var advanceDelete = async function() {
|
|
222
|
+
if (deleteStep < 5) { setDeleteStep(deleteStep + 1); return; }
|
|
223
|
+
if (deleteStep === 5) {
|
|
224
|
+
if (deleteTyped.trim().toLowerCase() !== _agentName.trim().toLowerCase()) {
|
|
225
|
+
toast('Agent name does not match', 'error'); return;
|
|
226
|
+
}
|
|
227
|
+
setDeleting(true);
|
|
228
|
+
try {
|
|
229
|
+
await apiCall('/bridge/agents/' + agentId, { method: 'DELETE' });
|
|
230
|
+
toast('Agent deleted', 'success');
|
|
231
|
+
if (onBack) onBack();
|
|
232
|
+
} catch (err) { toast(err.message, 'error'); }
|
|
233
|
+
setDeleting(false); setDeleteStep(0);
|
|
234
|
+
}
|
|
224
235
|
};
|
|
225
236
|
|
|
226
237
|
if (loading) {
|
|
@@ -232,7 +243,18 @@ export function DeploymentSection(props) {
|
|
|
232
243
|
// ─── Deployment Edit Card ─────────────────────────────
|
|
233
244
|
editingDeploy && h('div', { className: 'card', style: { marginBottom: 20, border: '2px solid var(--accent)' } },
|
|
234
245
|
h('div', { className: 'card-header', style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
|
|
235
|
-
h('span',
|
|
246
|
+
h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Edit Deployment Configuration',
|
|
247
|
+
h(HelpButton, { label: 'Deployment Configuration' },
|
|
248
|
+
h('p', null, 'Configure where and how this agent is deployed. These settings control the agent\'s runtime environment.'),
|
|
249
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
250
|
+
h('li', null, h('strong', null, 'Target'), ' — The cloud platform or infrastructure (Fly.io, AWS, GCP, local, etc.).'),
|
|
251
|
+
h('li', null, h('strong', null, 'Region'), ' — Where the agent runs. Choose a region close to your users for lower latency.'),
|
|
252
|
+
h('li', null, h('strong', null, 'Resources'), ' — CPU/memory allocation. More resources = faster responses but higher cost.'),
|
|
253
|
+
h('li', null, h('strong', null, 'Environment Variables'), ' — Secrets and config values injected at runtime. Never hard-code API keys in agent code.')
|
|
254
|
+
),
|
|
255
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use the smallest resource allocation that handles your load. You can always scale up later.')
|
|
256
|
+
)
|
|
257
|
+
),
|
|
236
258
|
h('div', { style: { display: 'flex', gap: 8 } },
|
|
237
259
|
h('button', { className: 'btn btn-ghost btn-sm', onClick: function() { setEditingDeploy(false); } }, 'Cancel'),
|
|
238
260
|
h('button', { className: 'btn btn-primary btn-sm', disabled: savingDeploy, onClick: saveDeploy }, savingDeploy ? 'Saving...' : 'Save')
|
|
@@ -658,7 +680,13 @@ export function DeploymentSection(props) {
|
|
|
658
680
|
|
|
659
681
|
// ─── Knowledge Bases Card ───────────────────────────
|
|
660
682
|
h('div', { className: 'card', style: { marginBottom: 20 } },
|
|
661
|
-
h('div', { className: 'card-header' }, h('span',
|
|
683
|
+
h('div', { className: 'card-header' }, h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Knowledge Bases',
|
|
684
|
+
h(HelpButton, { label: 'Knowledge Bases' },
|
|
685
|
+
h('p', null, 'Connect knowledge bases to give this agent access to your organization\'s documents, FAQs, and reference material.'),
|
|
686
|
+
h('p', null, 'When a knowledge base is connected, the agent can search and retrieve relevant information during conversations — this is called Retrieval-Augmented Generation (RAG).'),
|
|
687
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Create knowledge bases from the Knowledge page first, then connect them here. An agent can have multiple knowledge bases.')
|
|
688
|
+
)
|
|
689
|
+
)),
|
|
662
690
|
knowledgeBases.length > 0
|
|
663
691
|
? h('div', { className: 'card-body-flush' },
|
|
664
692
|
h('table', { className: 'data-table' },
|
|
@@ -759,7 +787,110 @@ export function DeploymentSection(props) {
|
|
|
759
787
|
h('div', { style: { fontSize: 14, fontWeight: 600, marginBottom: 4 } }, 'Delete Agent'),
|
|
760
788
|
h('div', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Permanently delete this agent and all associated data. This action cannot be undone.')
|
|
761
789
|
),
|
|
762
|
-
h('button', { className: 'btn btn-danger btn-sm', onClick:
|
|
790
|
+
h('button', { className: 'btn btn-danger btn-sm', onClick: startDelete }, I.trash(), ' Delete Agent')
|
|
791
|
+
)
|
|
792
|
+
)
|
|
793
|
+
),
|
|
794
|
+
|
|
795
|
+
// ─── 5-Step Delete Confirmation Modal ──────────────────
|
|
796
|
+
deleteStep >= 1 && h('div', { className: 'modal-overlay', onClick: cancelDelete },
|
|
797
|
+
h('div', { className: 'modal', onClick: function(e) { e.stopPropagation(); }, style: { width: 480 } },
|
|
798
|
+
h('div', { className: 'modal-header' },
|
|
799
|
+
h('h2', { style: { color: 'var(--danger)' } },
|
|
800
|
+
['', 'Step 1: Are you sure?', 'Step 2: Data Loss Warning', 'Step 3: Memory & Knowledge Loss', 'Step 4: Communication & Integration Impact', 'Step 5: Final Confirmation'][deleteStep]
|
|
801
|
+
),
|
|
802
|
+
h('button', { className: 'btn btn-ghost btn-icon', onClick: cancelDelete }, '\u00D7')
|
|
803
|
+
),
|
|
804
|
+
h('div', { style: { display: 'flex', gap: 4, padding: '0 20px', paddingTop: 12 } },
|
|
805
|
+
[1,2,3,4,5].map(function(s) {
|
|
806
|
+
return h('div', { key: s, style: { flex: 1, height: 4, borderRadius: 2, background: s <= deleteStep ? 'var(--danger)' : 'var(--border)' } });
|
|
807
|
+
})
|
|
808
|
+
),
|
|
809
|
+
h('div', { className: 'modal-body', style: { padding: 20 } },
|
|
810
|
+
deleteStep === 1 && h(Fragment, null,
|
|
811
|
+
h('p', { style: { marginBottom: 12 } }, 'You are about to delete agent ', h('strong', null, _agentName), '.'),
|
|
812
|
+
h('p', { style: { color: 'var(--text-muted)', fontSize: 13, marginBottom: 12 } }, 'This is a destructive action that will permanently remove this agent and everything associated with it. There is no undo, no recycle bin, and no way to recover.'),
|
|
813
|
+
h('p', { style: { fontSize: 13 } }, 'Please proceed through the next steps to understand exactly what will be lost.'),
|
|
814
|
+
h('div', { style: { display: 'flex', gap: 8, marginTop: 20, justifyContent: 'flex-end' } },
|
|
815
|
+
h('button', { className: 'btn btn-secondary', onClick: cancelDelete }, 'Cancel'),
|
|
816
|
+
h('button', { className: 'btn btn-danger', onClick: advanceDelete }, 'I understand, continue')
|
|
817
|
+
)
|
|
818
|
+
),
|
|
819
|
+
deleteStep === 2 && h(Fragment, null,
|
|
820
|
+
h('div', { style: { background: 'var(--danger-soft)', border: '1px solid var(--danger)', borderRadius: 'var(--radius)', padding: 12, marginBottom: 16 } },
|
|
821
|
+
h('strong', { style: { color: 'var(--danger)', display: 'block', marginBottom: 6 } }, 'ALL AGENT DATA WILL BE DESTROYED'),
|
|
822
|
+
h('ul', { style: { margin: '4px 0 0', paddingLeft: 18, fontSize: 13 } },
|
|
823
|
+
h('li', null, 'All email messages (inbox, sent, drafts, folders)'),
|
|
824
|
+
h('li', null, 'All conversation sessions and chat history'),
|
|
825
|
+
h('li', null, 'All tool execution logs and audit trails'),
|
|
826
|
+
h('li', null, 'All configuration, settings, and deployment config'),
|
|
827
|
+
h('li', null, 'All scheduled jobs, cron tasks, and automations')
|
|
828
|
+
)
|
|
829
|
+
),
|
|
830
|
+
h('p', { style: { fontSize: 13, color: 'var(--text-muted)' } }, 'If you need any of this data, export it BEFORE proceeding.'),
|
|
831
|
+
h('div', { style: { display: 'flex', gap: 8, marginTop: 20, justifyContent: 'flex-end' } },
|
|
832
|
+
h('button', { className: 'btn btn-secondary', onClick: cancelDelete }, 'Cancel'),
|
|
833
|
+
h('button', { className: 'btn btn-danger', onClick: advanceDelete }, 'Continue anyway')
|
|
834
|
+
)
|
|
835
|
+
),
|
|
836
|
+
deleteStep === 3 && h(Fragment, null,
|
|
837
|
+
h('div', { style: { background: 'var(--danger-soft)', border: '1px solid var(--danger)', borderRadius: 'var(--radius)', padding: 12, marginBottom: 16 } },
|
|
838
|
+
h('strong', { style: { color: 'var(--danger)', display: 'block', marginBottom: 6 } }, 'MEMORY & KNOWLEDGE PERMANENTLY LOST'),
|
|
839
|
+
h('ul', { style: { margin: '4px 0 0', paddingLeft: 18, fontSize: 13 } },
|
|
840
|
+
h('li', null, 'All long-term memory entries the agent has built over time'),
|
|
841
|
+
h('li', null, 'All learned preferences, patterns, and behavioral adaptations'),
|
|
842
|
+
h('li', null, 'All knowledge base contributions and embeddings'),
|
|
843
|
+
h('li', null, 'All training data, fine-tuning, and custom instructions'),
|
|
844
|
+
h('li', null, 'The agent\'s entire personality and relationship context')
|
|
845
|
+
)
|
|
846
|
+
),
|
|
847
|
+
h('p', { style: { fontSize: 13, color: 'var(--text-muted)' } }, 'This agent has been learning and building context. Once deleted, this knowledge cannot be reconstructed even if you create a new agent with the same name.'),
|
|
848
|
+
h('div', { style: { display: 'flex', gap: 8, marginTop: 20, justifyContent: 'flex-end' } },
|
|
849
|
+
h('button', { className: 'btn btn-secondary', onClick: cancelDelete }, 'Cancel'),
|
|
850
|
+
h('button', { className: 'btn btn-danger', onClick: advanceDelete }, 'Continue anyway')
|
|
851
|
+
)
|
|
852
|
+
),
|
|
853
|
+
deleteStep === 4 && h(Fragment, null,
|
|
854
|
+
h('div', { style: { background: 'var(--danger-soft)', border: '1px solid var(--danger)', borderRadius: 'var(--radius)', padding: 12, marginBottom: 16 } },
|
|
855
|
+
h('strong', { style: { color: 'var(--danger)', display: 'block', marginBottom: 6 } }, 'COMMUNICATION & INTEGRATION IMPACT'),
|
|
856
|
+
h('ul', { style: { margin: '4px 0 0', paddingLeft: 18, fontSize: 13 } },
|
|
857
|
+
h('li', null, 'The agent\'s email address will stop working immediately'),
|
|
858
|
+
h('li', null, 'Any external services or APIs relying on this agent will break'),
|
|
859
|
+
h('li', null, 'Other agents that communicate with this agent will lose their connection'),
|
|
860
|
+
h('li', null, 'Active workflows, approval chains, and escalation paths will be disrupted'),
|
|
861
|
+
h('li', null, 'Contacts and external parties will receive bounced emails')
|
|
862
|
+
)
|
|
863
|
+
),
|
|
864
|
+
h('p', { style: { fontSize: 13, color: 'var(--text-muted)' } }, 'If this agent is part of a team or workflow, consider reassigning its responsibilities first.'),
|
|
865
|
+
h('div', { style: { display: 'flex', gap: 8, marginTop: 20, justifyContent: 'flex-end' } },
|
|
866
|
+
h('button', { className: 'btn btn-secondary', onClick: cancelDelete }, 'Cancel'),
|
|
867
|
+
h('button', { className: 'btn btn-danger', onClick: advanceDelete }, 'I accept the consequences')
|
|
868
|
+
)
|
|
869
|
+
),
|
|
870
|
+
deleteStep === 5 && h(Fragment, null,
|
|
871
|
+
h('div', { style: { background: 'var(--danger-soft)', border: '1px solid var(--danger)', borderRadius: 'var(--radius)', padding: 12, marginBottom: 16, textAlign: 'center' } },
|
|
872
|
+
h('strong', { style: { color: 'var(--danger)', fontSize: 15 } }, 'THIS ACTION IS PERMANENT AND IRREVERSIBLE')
|
|
873
|
+
),
|
|
874
|
+
h('p', { style: { marginBottom: 12 } }, 'To confirm deletion, type the agent name ', h('strong', { style: { fontFamily: 'var(--font-mono)', background: 'var(--bg-tertiary)', padding: '2px 6px', borderRadius: 4 } }, _agentName), ' below:'),
|
|
875
|
+
h('input', {
|
|
876
|
+
type: 'text',
|
|
877
|
+
className: 'form-control',
|
|
878
|
+
placeholder: 'Type agent name to confirm...',
|
|
879
|
+
value: deleteTyped,
|
|
880
|
+
autoFocus: true,
|
|
881
|
+
onInput: function(e) { setDeleteTyped(e.target.value); },
|
|
882
|
+
onKeyDown: function(e) { if (e.key === 'Enter') advanceDelete(); },
|
|
883
|
+
style: { marginBottom: 16, borderColor: deleteTyped.trim().toLowerCase() === _agentName.trim().toLowerCase() ? 'var(--danger)' : 'var(--border)' }
|
|
884
|
+
}),
|
|
885
|
+
h('div', { style: { display: 'flex', gap: 8, justifyContent: 'flex-end' } },
|
|
886
|
+
h('button', { className: 'btn btn-secondary', onClick: cancelDelete }, 'Cancel'),
|
|
887
|
+
h('button', {
|
|
888
|
+
className: 'btn btn-danger',
|
|
889
|
+
disabled: deleteTyped.trim().toLowerCase() !== _agentName.trim().toLowerCase() || deleting,
|
|
890
|
+
onClick: advanceDelete
|
|
891
|
+
}, deleting ? 'Deleting...' : 'Permanently delete agent')
|
|
892
|
+
)
|
|
893
|
+
)
|
|
763
894
|
)
|
|
764
895
|
)
|
|
765
896
|
)
|
|
@@ -3,6 +3,7 @@ import { I } from '../../components/icons.js';
|
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
4
|
import { ProviderLogo } from '../../assets/provider-logos.js';
|
|
5
5
|
import { Badge, EmptyState } from './shared.js?v=4';
|
|
6
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
6
7
|
|
|
7
8
|
export function EmailSection(props) {
|
|
8
9
|
var agentId = props.agentId;
|
|
@@ -222,7 +223,15 @@ export function EmailSection(props) {
|
|
|
222
223
|
return h('div', { className: 'card' },
|
|
223
224
|
h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
|
|
224
225
|
h('div', null,
|
|
225
|
-
h('h3', { className: 'card-title' }, 'Email Connection'
|
|
226
|
+
h('h3', { className: 'card-title', style: { display: 'flex', alignItems: 'center' } }, 'Email Connection', h(HelpButton, { label: 'Email Connection' },
|
|
227
|
+
h('p', null, 'Connect this agent to an email account so it can send and receive emails autonomously. Supports IMAP/SMTP (any provider), Microsoft OAuth, and Google OAuth.'),
|
|
228
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
229
|
+
h('li', null, h('strong', null, 'Email + Password'), ' — Works with any email provider. Use app passwords with 2FA.'),
|
|
230
|
+
h('li', null, h('strong', null, 'Microsoft OAuth'), ' — For Microsoft 365 / Outlook. Requires Azure AD app registration.'),
|
|
231
|
+
h('li', null, h('strong', null, 'Google OAuth'), ' — For Google Workspace / Gmail. Requires Google Cloud project.')
|
|
232
|
+
),
|
|
233
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Create a dedicated email address for each agent (e.g., support-agent@company.com). Don\'t share your personal email — agents need their own accounts.')
|
|
234
|
+
)),
|
|
226
235
|
h('p', { style: { fontSize: 12, color: 'var(--text-muted)', margin: '2px 0 0' } }, 'Connect this agent to an email account so it can send and receive emails.')
|
|
227
236
|
),
|
|
228
237
|
statusBadge
|
|
@@ -2,6 +2,7 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, apiCall, engineC
|
|
|
2
2
|
import { I } from '../../components/icons.js';
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
4
|
import { TagInput } from '../../components/tag-input.js';
|
|
5
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
5
6
|
import { Badge, EmptyState } from './shared.js?v=4';
|
|
6
7
|
|
|
7
8
|
// ════════════════════════════════════════════════════════════
|
|
@@ -301,7 +302,18 @@ export function GuardrailsSection(props) {
|
|
|
301
302
|
|
|
302
303
|
// ─── Interventions Tab ──────────────────────────────
|
|
303
304
|
subTab === 'interventions' && h('div', { className: 'card' },
|
|
304
|
-
h('div', { className: 'card-header' }, h('span',
|
|
305
|
+
h('div', { className: 'card-header' }, h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Interventions',
|
|
306
|
+
h(HelpButton, { label: 'Guardrail Interventions' },
|
|
307
|
+
h('p', null, 'A log of every time a guardrail rule was triggered for this agent. Each entry shows what happened and what action was taken.'),
|
|
308
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
309
|
+
h('li', null, h('strong', null, 'Log'), ' — The event was recorded but no action was taken.'),
|
|
310
|
+
h('li', null, h('strong', null, 'Warn'), ' — The agent was warned about the violation and continued.'),
|
|
311
|
+
h('li', null, h('strong', null, 'Pause'), ' — The agent was automatically paused and needs manual resume.'),
|
|
312
|
+
h('li', null, h('strong', null, 'Block'), ' — The specific action was blocked but the agent continued.')
|
|
313
|
+
),
|
|
314
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Frequent interventions from the same rule may mean the agent\'s instructions conflict with the guardrail — review and adjust either one.')
|
|
315
|
+
)
|
|
316
|
+
)),
|
|
305
317
|
interventions.length > 0
|
|
306
318
|
? h('div', { style: { padding: 0 } },
|
|
307
319
|
interventions.map(function(inv, i) {
|
|
@@ -322,7 +334,13 @@ export function GuardrailsSection(props) {
|
|
|
322
334
|
|
|
323
335
|
// ─── DLP Tab ────────────────────────────────────────
|
|
324
336
|
subTab === 'dlp' && h('div', { className: 'card' },
|
|
325
|
-
h('div', { className: 'card-header' }, h('span',
|
|
337
|
+
h('div', { className: 'card-header' }, h('span', { style: { display: 'flex', alignItems: 'center' } }, 'DLP Violations',
|
|
338
|
+
h(HelpButton, { label: 'DLP Violations' },
|
|
339
|
+
h('p', null, 'Data Loss Prevention (DLP) violations occur when the agent attempts to share sensitive data (PII, credentials, proprietary info) in a way that violates your DLP policies.'),
|
|
340
|
+
h('p', null, 'Each entry shows what data was detected, the severity level, and what action was taken (redacted, blocked, or logged).'),
|
|
341
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Configure DLP rules at the organization level in the DLP page. Agent-specific overrides can be set here.')
|
|
342
|
+
)
|
|
343
|
+
)),
|
|
326
344
|
dlpViolations.length > 0
|
|
327
345
|
? h('div', { style: { padding: 0 } },
|
|
328
346
|
dlpViolations.map(function(v, i) {
|
|
@@ -371,7 +389,13 @@ export function GuardrailsSection(props) {
|
|
|
371
389
|
// ─── Approvals Tab ──────────────────────────────────
|
|
372
390
|
subTab === 'approvals' && h('div', null,
|
|
373
391
|
pendingApprovals.length > 0 && h('div', { className: 'card', style: { marginBottom: 12 } },
|
|
374
|
-
h('div', { className: 'card-header' }, h('span',
|
|
392
|
+
h('div', { className: 'card-header' }, h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Pending Approvals (' + pendingApprovals.length + ')',
|
|
393
|
+
h(HelpButton, { label: 'Pending Approvals' },
|
|
394
|
+
h('p', null, 'Actions the agent wants to take that require human approval before proceeding. This is part of the human-in-the-loop safety system.'),
|
|
395
|
+
h('p', null, 'Review each request and approve or reject it. The agent will be notified and continue or find an alternative approach.'),
|
|
396
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'If you find yourself always approving the same type of request, consider updating the guardrail rule to auto-approve that action.')
|
|
397
|
+
)
|
|
398
|
+
)),
|
|
375
399
|
h('div', { style: { padding: 0 } },
|
|
376
400
|
pendingApprovals.map(function(a) {
|
|
377
401
|
return h('div', { key: a.id, style: { display: 'flex', gap: 10, padding: '10px 16px', borderBottom: '1px solid var(--border)', fontSize: 12, alignItems: 'center' } },
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { h, useState, useEffect, useCallback, Fragment, useApp, apiCall, engineCall, formatUptime, buildAgentDataMap, renderAgentBadge, showConfirm, getOrgId } from '../../components/utils.js';
|
|
2
2
|
import { I } from '../../components/icons.js';
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
4
5
|
import { Badge, EmptyState, formatTime } from './shared.js?v=4';
|
|
5
6
|
|
|
6
7
|
// ════════════════════════════════════════════════════════════
|
|
@@ -277,7 +278,20 @@ export function ManagerCatchUpSection(props) {
|
|
|
277
278
|
|
|
278
279
|
return h(Fragment, null,
|
|
279
280
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
|
|
280
|
-
h('h3', { style: { margin: 0, fontSize: 16, fontWeight: 600 } }, 'Manager & Daily Catch-Up'
|
|
281
|
+
h('h3', { style: { margin: 0, fontSize: 16, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Manager & Daily Catch-Up',
|
|
282
|
+
h(HelpButton, { label: 'Manager & Daily Catch-Up' },
|
|
283
|
+
h('p', null, 'Define who this agent reports to and configure automated daily briefings.'),
|
|
284
|
+
h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Manager'),
|
|
285
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
286
|
+
h('li', null, h('strong', null, 'Internal Manager'), ' — Another agent in your organization that supervises this one. Escalations and reports go to them.'),
|
|
287
|
+
h('li', null, h('strong', null, 'External Manager'), ' — A human outside the system (e.g., via email). The agent sends reports and escalations to this email address.'),
|
|
288
|
+
h('li', null, h('strong', null, 'No Manager'), ' — The agent operates independently. Escalations go to the system admin.')
|
|
289
|
+
),
|
|
290
|
+
h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Daily Catch-Up'),
|
|
291
|
+
h('p', null, 'When enabled, the agent sends a daily summary to its manager covering what it did, any issues encountered, and upcoming tasks. You can choose which platforms (email, chat, etc.) receive the catch-up.'),
|
|
292
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Daily catch-ups help you stay aware of what the agent is doing without manually checking. Start with email summaries, then add chat if you want real-time updates.')
|
|
293
|
+
)
|
|
294
|
+
),
|
|
281
295
|
h('button', { className: 'btn btn-primary btn-sm', onClick: startEdit }, I.journal(), ' Edit')
|
|
282
296
|
),
|
|
283
297
|
|
|
@@ -3,6 +3,7 @@ import { I } from '../../components/icons.js';
|
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
4
|
import { ProviderLogo } from '../../assets/provider-logos.js';
|
|
5
5
|
import { Badge, EmptyState } from './shared.js?v=4';
|
|
6
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
6
7
|
|
|
7
8
|
// ════════════════════════════════════════════════════════════
|
|
8
9
|
// BROWSER CONFIG CARD — Configurable browser settings per agent
|
|
@@ -348,7 +349,15 @@ export function BrowserConfigCard(props) {
|
|
|
348
349
|
onClick: function() { setCollapsed(!collapsed); }
|
|
349
350
|
},
|
|
350
351
|
h('span', { style: { display: 'flex', alignItems: 'center', gap: 8 } },
|
|
351
|
-
'\uD83C\uDF10 Browser & Web Automation',
|
|
352
|
+
'\uD83C\uDF10 Browser & Web Automation', h(HelpButton, { label: 'Browser & Web Automation' },
|
|
353
|
+
h('p', null, 'Configure how this agent accesses web pages. Choose from local Chromium, remote browsers (CDP), or cloud browser services.'),
|
|
354
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
355
|
+
h('li', null, h('strong', null, 'Local Chromium'), ' — Built-in headless browser. Best for most automation tasks.'),
|
|
356
|
+
h('li', null, h('strong', null, 'Remote CDP'), ' — Connect to a browser on another machine. Required for video calls.'),
|
|
357
|
+
h('li', null, h('strong', null, 'Cloud services'), ' — Browserless, Browserbase, Steel, ScrapingBee for scalable browser access.')
|
|
358
|
+
),
|
|
359
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Local Chromium works for most tasks. Use Remote CDP or cloud services when you need persistent sessions, anti-detection, or video call support.')
|
|
360
|
+
),
|
|
352
361
|
cfg.provider && cfg.provider !== 'local' && h('span', { className: 'badge', style: { fontSize: 10, padding: '1px 6px', background: 'var(--accent-soft)', color: 'var(--accent)' } },
|
|
353
362
|
providers.find(function(p) { return p.id === cfg.provider; })?.name || cfg.provider
|
|
354
363
|
)
|
|
@@ -801,7 +810,10 @@ export function ToolRestrictionsCard(props) {
|
|
|
801
810
|
style: { cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
|
|
802
811
|
onClick: function() { setCollapsed(!collapsed); }
|
|
803
812
|
},
|
|
804
|
-
h('span',
|
|
813
|
+
h('span', { style: { display: 'flex', alignItems: 'center' } }, '\uD83D\uDD12 Tool Restrictions', h(HelpButton, { label: 'Tool Restrictions' },
|
|
814
|
+
h('p', null, 'Per-agent restrictions on file sizes, shell access, web fetching, email sending, database access, and file sharing. These are independent of tool security sandboxes.'),
|
|
815
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use these to limit what an agent can do beyond its tool security settings. For example, block shell execution for agents that only need email access.')
|
|
816
|
+
)),
|
|
805
817
|
h('span', { style: { fontSize: 12, color: 'var(--text-muted)' } }, collapsed ? E.triangleDown(12) : E.triangleUp(12))
|
|
806
818
|
),
|
|
807
819
|
!collapsed && h('div', { style: { padding: 16, display: 'grid', gap: 16 } },
|
|
@@ -2,6 +2,7 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, apiCall, engineC
|
|
|
2
2
|
import { I } from '../../components/icons.js';
|
|
3
3
|
import { E } from '../../assets/icons/emoji-icons.js';
|
|
4
4
|
import { Badge, StatCard, EmptyState, formatTime, MEMORY_CATEGORIES, memCatColor, memCatLabel, importanceBadgeColor } from './shared.js?v=4';
|
|
5
|
+
import { HelpButton } from '../../components/help-button.js';
|
|
5
6
|
|
|
6
7
|
// --- MemorySection --------------------------------------------------
|
|
7
8
|
|
|
@@ -164,9 +165,27 @@ export function MemorySection(props) {
|
|
|
164
165
|
var fmtDate = function(d) { if (!d) return '-'; var dt = new Date(d); return dt.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' }); };
|
|
165
166
|
var fmtTime = function(d) { if (!d) return ''; var dt = new Date(d); return dt.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' }); };
|
|
166
167
|
|
|
168
|
+
var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
|
|
169
|
+
var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
|
|
170
|
+
var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
|
|
171
|
+
|
|
167
172
|
return h('div', { className: 'card' },
|
|
168
173
|
h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
|
|
169
|
-
h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600 } }, 'Memory'
|
|
174
|
+
h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Memory', h(HelpButton, { label: 'Memory' },
|
|
175
|
+
h('p', null, 'Agent memory stores learned facts, preferences, interaction patterns, and organizational knowledge. Memories persist across sessions so the agent can recall context.'),
|
|
176
|
+
h('h4', { style: _h4 }, 'Key Concepts'),
|
|
177
|
+
h('ul', { style: _ul },
|
|
178
|
+
h('li', null, h('strong', null, 'Categories'), ' — Classify memories (org knowledge, preferences, skills, etc.) to keep them organized.'),
|
|
179
|
+
h('li', null, h('strong', null, 'Confidence'), ' — How certain the agent is about this memory. Decays over time if not accessed.'),
|
|
180
|
+
h('li', null, h('strong', null, 'Importance'), ' — Critical, high, normal, or low. Affects retrieval priority.')
|
|
181
|
+
),
|
|
182
|
+
h('h4', { style: _h4 }, 'Actions'),
|
|
183
|
+
h('ul', { style: _ul },
|
|
184
|
+
h('li', null, h('strong', null, 'Prune'), ' — Removes expired/stale entries with low confidence.'),
|
|
185
|
+
h('li', null, h('strong', null, 'Decay'), ' — Reduces confidence of memories not accessed recently (simulates forgetting).')
|
|
186
|
+
),
|
|
187
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Regularly prune stale memories to keep the agent focused on relevant, high-quality knowledge.')
|
|
188
|
+
)),
|
|
170
189
|
h('div', { style: { display: 'flex', gap: 6 } },
|
|
171
190
|
h('button', { className: 'btn btn-ghost btn-sm', onClick: pruneStale, title: 'Prune stale entries' }, I.trash()),
|
|
172
191
|
h('button', { className: 'btn btn-ghost btn-sm', onClick: runDecay, title: 'Run confidence decay' }, I.clock()),
|
|
@@ -178,10 +197,10 @@ export function MemorySection(props) {
|
|
|
178
197
|
|
|
179
198
|
// Compact stats bar
|
|
180
199
|
h('div', { style: { display: 'flex', gap: 24, padding: '10px 16px', borderBottom: '1px solid var(--border)', fontSize: 13 } },
|
|
181
|
-
h('span', { style: { color: 'var(--text-muted)' } }, 'Total: ', h('strong', null, totalMemories)),
|
|
182
|
-
h('span', { style: { color: 'var(--text-muted)' } }, 'Categories: ', h('strong', null, categoriesUsed)),
|
|
183
|
-
h('span', { style: { color: 'var(--text-muted)' } }, 'Avg Conf: ', h('strong', null, avgConfidence)),
|
|
184
|
-
h('span', { style: { color: 'var(--text-muted)' } }, 'Sources: ', h('strong', null, sourcesCount)),
|
|
200
|
+
h('span', { style: { color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, 'Total: ', h('strong', null, totalMemories), h(HelpButton, { label: 'Total Memories' }, h('p', null, 'Total number of memory entries stored for this agent.'))),
|
|
201
|
+
h('span', { style: { color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, 'Categories: ', h('strong', null, categoriesUsed), h(HelpButton, { label: 'Categories Used' }, h('p', null, 'Number of distinct memory categories in use. More categories means broader knowledge coverage.'))),
|
|
202
|
+
h('span', { style: { color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, 'Avg Conf: ', h('strong', null, avgConfidence), h(HelpButton, { label: 'Average Confidence' }, h('p', null, 'Average confidence score across all memories. Higher is better — it means the agent trusts its stored knowledge. Confidence decays over time for unused memories.'))),
|
|
203
|
+
h('span', { style: { color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, 'Sources: ', h('strong', null, sourcesCount), h(HelpButton, { label: 'Sources' }, h('p', null, 'Number of distinct sources that contributed memories (e.g., email processing, user input, agent reflection).'))),
|
|
185
204
|
h('div', { style: { flex: 1 } }),
|
|
186
205
|
h('span', { style: { color: 'var(--text-muted)' } }, 'Showing ', h('strong', null, filtered.length), ' of ', totalMemories)
|
|
187
206
|
),
|