@agenticmail/enterprise 0.5.199 → 0.5.200

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 (86) hide show
  1. package/dist/dashboard/pages/activity.js +14 -1
  2. package/dist/dashboard/pages/agent-detail/activity.js +17 -1
  3. package/dist/dashboard/pages/agent-detail/autonomy.js +17 -1
  4. package/dist/dashboard/pages/agent-detail/budget.js +25 -2
  5. package/dist/dashboard/pages/agent-detail/channels.js +10 -1
  6. package/dist/dashboard/pages/agent-detail/communication.js +10 -1
  7. package/dist/dashboard/pages/agent-detail/configuration.js +42 -1
  8. package/dist/dashboard/pages/agent-detail/deployment.js +147 -16
  9. package/dist/dashboard/pages/agent-detail/email.js +10 -1
  10. package/dist/dashboard/pages/agent-detail/guardrails.js +27 -3
  11. package/dist/dashboard/pages/agent-detail/manager.js +15 -1
  12. package/dist/dashboard/pages/agent-detail/meeting-browser.js +14 -2
  13. package/dist/dashboard/pages/agent-detail/memory.js +24 -5
  14. package/dist/dashboard/pages/agent-detail/overview.js +159 -21
  15. package/dist/dashboard/pages/agent-detail/permissions.js +28 -7
  16. package/dist/dashboard/pages/agent-detail/personal-details.js +17 -1
  17. package/dist/dashboard/pages/agent-detail/security.js +21 -5
  18. package/dist/dashboard/pages/agent-detail/skills-section.js +9 -1
  19. package/dist/dashboard/pages/agent-detail/tool-security.js +35 -8
  20. package/dist/dashboard/pages/agent-detail/tools.js +10 -1
  21. package/dist/dashboard/pages/agent-detail/whatsapp.js +11 -1
  22. package/dist/dashboard/pages/agent-detail/workforce.js +19 -4
  23. package/dist/dashboard/pages/agents.js +15 -1
  24. package/dist/dashboard/pages/approvals.js +15 -1
  25. package/dist/dashboard/pages/audit.js +23 -1
  26. package/dist/dashboard/pages/compliance.js +24 -2
  27. package/dist/dashboard/pages/dashboard.js +25 -6
  28. package/dist/dashboard/pages/dlp.js +23 -2
  29. package/dist/dashboard/pages/domain-status.js +51 -7
  30. package/dist/dashboard/pages/guardrails.js +29 -3
  31. package/dist/dashboard/pages/journal.js +24 -4
  32. package/dist/dashboard/pages/knowledge-contributions.js +69 -3
  33. package/dist/dashboard/pages/knowledge-import.js +6 -1
  34. package/dist/dashboard/pages/knowledge.js +51 -9
  35. package/dist/dashboard/pages/messages.js +28 -5
  36. package/dist/dashboard/pages/org-chart.js +18 -1
  37. package/dist/dashboard/pages/settings.js +30 -6
  38. package/dist/dashboard/pages/skill-connections.js +18 -4
  39. package/dist/dashboard/pages/skills.js +11 -1
  40. package/dist/dashboard/pages/users.js +14 -1
  41. package/dist/dashboard/pages/vault.js +22 -2
  42. package/dist/dashboard/pages/workforce.js +17 -1
  43. package/package.json +1 -1
  44. package/src/dashboard/HELP-TOOLTIPS-GUIDE.md +45 -0
  45. package/src/dashboard/pages/activity.js +14 -1
  46. package/src/dashboard/pages/agent-detail/activity.js +17 -1
  47. package/src/dashboard/pages/agent-detail/autonomy.js +17 -1
  48. package/src/dashboard/pages/agent-detail/budget.js +25 -2
  49. package/src/dashboard/pages/agent-detail/channels.js +10 -1
  50. package/src/dashboard/pages/agent-detail/communication.js +10 -1
  51. package/src/dashboard/pages/agent-detail/configuration.js +42 -1
  52. package/src/dashboard/pages/agent-detail/deployment.js +147 -16
  53. package/src/dashboard/pages/agent-detail/email.js +10 -1
  54. package/src/dashboard/pages/agent-detail/guardrails.js +27 -3
  55. package/src/dashboard/pages/agent-detail/manager.js +15 -1
  56. package/src/dashboard/pages/agent-detail/meeting-browser.js +14 -2
  57. package/src/dashboard/pages/agent-detail/memory.js +24 -5
  58. package/src/dashboard/pages/agent-detail/overview.js +159 -21
  59. package/src/dashboard/pages/agent-detail/permissions.js +28 -7
  60. package/src/dashboard/pages/agent-detail/personal-details.js +17 -1
  61. package/src/dashboard/pages/agent-detail/security.js +21 -5
  62. package/src/dashboard/pages/agent-detail/skills-section.js +9 -1
  63. package/src/dashboard/pages/agent-detail/tool-security.js +35 -8
  64. package/src/dashboard/pages/agent-detail/tools.js +10 -1
  65. package/src/dashboard/pages/agent-detail/whatsapp.js +11 -1
  66. package/src/dashboard/pages/agent-detail/workforce.js +19 -4
  67. package/src/dashboard/pages/agents.js +15 -1
  68. package/src/dashboard/pages/approvals.js +15 -1
  69. package/src/dashboard/pages/audit.js +23 -1
  70. package/src/dashboard/pages/compliance.js +24 -2
  71. package/src/dashboard/pages/dashboard.js +25 -6
  72. package/src/dashboard/pages/dlp.js +23 -2
  73. package/src/dashboard/pages/domain-status.js +51 -7
  74. package/src/dashboard/pages/guardrails.js +29 -3
  75. package/src/dashboard/pages/journal.js +24 -4
  76. package/src/dashboard/pages/knowledge-contributions.js +69 -3
  77. package/src/dashboard/pages/knowledge-import.js +6 -1
  78. package/src/dashboard/pages/knowledge.js +51 -9
  79. package/src/dashboard/pages/messages.js +28 -5
  80. package/src/dashboard/pages/org-chart.js +18 -1
  81. package/src/dashboard/pages/settings.js +30 -6
  82. package/src/dashboard/pages/skill-connections.js +18 -4
  83. package/src/dashboard/pages/skills.js +11 -1
  84. package/src/dashboard/pages/users.js +14 -1
  85. package/src/dashboard/pages/vault.js +22 -2
  86. package/src/dashboard/pages/workforce.js +17 -1
@@ -1,5 +1,6 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, engineCall, buildAgentDataMap, renderAgentBadge, getOrgId } from '../components/utils.js';
2
2
  import { DetailModal } from '../components/modal.js';
3
+ import { HelpButton } from '../components/help-button.js';
3
4
 
4
5
  const PAGE_SIZE = 25;
5
6
 
@@ -85,9 +86,21 @@ export function ActivityPage() {
85
86
  const eventsPages = Math.ceil(eventsTotal / PAGE_SIZE);
86
87
  const toolsPages = Math.ceil(toolsTotal / PAGE_SIZE);
87
88
 
89
+ var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
90
+ var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
91
+ var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
92
+
88
93
  return h(Fragment, null,
89
94
  h('div', { style: { marginBottom: 20 } },
90
- h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Activity'),
95
+ h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Activity', h(HelpButton, { label: 'Activity' },
96
+ h('p', null, 'A real-time feed of everything your agents are doing — events they generate and tools they call.'),
97
+ h('h4', { style: _h4 }, 'Two views'),
98
+ h('ul', { style: _ul },
99
+ h('li', null, h('strong', null, 'Events'), ' — High-level actions: agent started, stopped, deployed, errored, etc.'),
100
+ h('li', null, h('strong', null, 'Tool Calls'), ' — Granular tool usage: which tool, duration, success/failure, parameters and results.')
101
+ ),
102
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use the agent and type filters to zero in on specific behavior. Click any row to see full details.')
103
+ )),
91
104
  h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Real-time activity and tool usage across all agents')
92
105
  ),
93
106
 
@@ -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 { DetailModal } from '../../components/modal.js';
4
+ import { HelpButton } from '../../components/help-button.js';
4
5
 
5
6
  // --- ActivitySection ------------------------------------------------
6
7
 
@@ -136,7 +137,22 @@ export function ActivitySection(props) {
136
137
 
137
138
  return h('div', { className: 'card' },
138
139
  h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
139
- h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600 } }, 'Activity'),
140
+ h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Activity',
141
+ h(HelpButton, { label: 'Agent Activity Log' },
142
+ h('p', null, 'A chronological log of everything this agent has done — conversations, tasks completed, emails sent, tools used, errors encountered, and guardrail interventions.'),
143
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Event Types'),
144
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
145
+ h('li', null, h('strong', null, 'Message'), ' — Chat messages sent or received.'),
146
+ h('li', null, h('strong', null, 'Task'), ' — Tasks started, completed, or failed.'),
147
+ h('li', null, h('strong', null, 'Tool Use'), ' — External tools or APIs the agent called.'),
148
+ h('li', null, h('strong', null, 'Error'), ' — Failures, timeouts, or API errors.'),
149
+ h('li', null, h('strong', null, 'Guardrail'), ' — Policy violations or interventions.'),
150
+ h('li', null, h('strong', null, 'System'), ' — Deploy, restart, config changes.')
151
+ ),
152
+ h('p', null, 'Click on any event to see full details including request/response data.'),
153
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use filters to narrow down to specific event types. If debugging an issue, start with "Error" events.')
154
+ )
155
+ ),
140
156
  h('div', { style: { display: 'flex', gap: 8, alignItems: 'center' } },
141
157
  h('span', { style: { fontSize: 11, color: 'var(--text-muted)' } }, filtered.length + ' items'),
142
158
  h('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh())
@@ -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, EmptyState } from './shared.js?v=4';
5
+ import { HelpButton } from '../../components/help-button.js';
5
6
 
6
7
  // ════════════════════════════════════════════════════════════
7
8
  // AGENT DETAIL PAGE (Main Orchestrator)
@@ -118,7 +119,22 @@ export function AutonomySection(props) {
118
119
  // Header
119
120
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
120
121
  h('div', null,
121
- h('div', { style: { fontSize: 15, fontWeight: 600 } }, 'Agent Autonomy Settings'),
122
+ h('div', { style: { fontSize: 15, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Agent Autonomy Settings',
123
+ h(HelpButton, { label: 'Autonomy Settings' },
124
+ h('p', null, 'Autonomy settings control what the agent does automatically without being asked. Think of it as the agent\'s daily routine.'),
125
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Automated Behaviors'),
126
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
127
+ h('li', null, h('strong', null, 'Auto Clock-In/Out'), ' — Agent automatically starts and stops work based on its schedule in the Workforce tab.'),
128
+ h('li', null, h('strong', null, 'Daily Catch-up'), ' — At a set time each day, the agent reviews unread emails, messages, and pending tasks to stay on top of things.'),
129
+ h('li', null, h('strong', null, 'Weekly Catch-up'), ' — A deeper weekly review that may include summaries, reports, or planning.'),
130
+ h('li', null, h('strong', null, 'Goal Check'), ' — Periodic check-ins against assigned goals/OKRs.'),
131
+ h('li', null, h('strong', null, 'Knowledge Contributions'), ' — Agent periodically contributes learnings to the organization\'s knowledge base.'),
132
+ h('li', null, h('strong', null, 'Escalation'), ' — Automatically escalates issues it can\'t handle to its manager.'),
133
+ h('li', null, h('strong', null, 'Guardrail Enforcement'), ' — Self-monitors for compliance with organizational policies.')
134
+ ),
135
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Start with daily catch-up enabled and add more behaviors as the agent proves reliable. The master switch lets you disable all autonomy instantly.')
136
+ )
137
+ ),
122
138
  h('div', { style: { fontSize: 12, color: 'var(--text-muted)' } }, 'Configure automated behaviors — all times use agent timezone')
123
139
  ),
124
140
  h('div', { style: { display: 'flex', gap: 8 } },
@@ -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 { StatCard, ProgressBar, formatNumber, formatCost } from './shared.js?v=4';
4
+ import { HelpButton } from '../../components/help-button.js';
4
5
 
5
6
  // ════════════════════════════════════════════════════════════
6
7
  // BUDGET SECTION
@@ -117,7 +118,19 @@ export function BudgetSection(props) {
117
118
  // ─── Budget Limits Card ─────────────────────────────
118
119
  h('div', { className: 'card', style: { marginBottom: 20 } },
119
120
  h('div', { className: 'card-header', style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
120
- h('span', null, 'Budget Limits'),
121
+ h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Budget Limits',
122
+ h(HelpButton, { label: 'Budget Limits' },
123
+ h('p', null, 'Set spending caps to prevent this agent from exceeding your API budget. When a limit is reached, the agent is automatically paused.'),
124
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Limit Types'),
125
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
126
+ h('li', null, h('strong', null, 'Daily Limit'), ' — Maximum spend per day (resets at midnight UTC). Prevents runaway costs from a single day\'s usage.'),
127
+ h('li', null, h('strong', null, 'Monthly Limit'), ' — Maximum spend per calendar month. Your overall budget control.'),
128
+ h('li', null, h('strong', null, 'Per-Request Limit'), ' — Maximum cost for a single API call. Prevents accidentally using expensive models or very long prompts.')
129
+ ),
130
+ h('p', null, 'Set to 0 or leave blank for no limit. The progress bars show current usage against each limit.'),
131
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Start with a conservative daily limit, monitor usage for a week, then adjust. It\'s easier to raise limits than to deal with a surprise $500 bill.')
132
+ )
133
+ ),
121
134
  !editing && h('button', { className: 'btn btn-secondary btn-sm', onClick: function() { setEditing(true); } }, 'Edit Budget')
122
135
  ),
123
136
  h('div', { className: 'card-body' },
@@ -177,7 +190,17 @@ export function BudgetSection(props) {
177
190
 
178
191
  // ─── Budget Alerts Table ────────────────────────────
179
192
  h('div', { className: 'card', style: { marginBottom: 20 } },
180
- h('div', { className: 'card-header' }, h('span', null, 'Budget Alerts')),
193
+ h('div', { className: 'card-header' }, h('span', { style: { display: 'flex', alignItems: 'center' } }, 'Budget Alerts',
194
+ h(HelpButton, { label: 'Budget Alerts' },
195
+ h('p', null, 'Get notified when the agent approaches or exceeds budget thresholds.'),
196
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
197
+ h('li', null, h('strong', null, 'Warning'), ' — Sent when usage reaches a percentage of the limit (e.g., 80%). Agent continues running.'),
198
+ h('li', null, h('strong', null, 'Critical'), ' — Sent when usage is very close to the limit (e.g., 95%). Consider pausing non-essential tasks.'),
199
+ h('li', null, h('strong', null, 'Exceeded'), ' — The limit was hit and the agent was automatically paused. Requires manual resume or limit increase.')
200
+ ),
201
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Alerts are sent to the agent\'s manager (if configured) and to the admin email.')
202
+ )
203
+ )),
181
204
  budgetAlerts.length > 0
182
205
  ? h('div', { className: 'card-body-flush' },
183
206
  h('table', { className: 'data-table' },
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, useApp, apiCall, engineCall, 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
 
5
6
  // ─── Styles ───
6
7
 
@@ -449,7 +450,15 @@ export function ChannelsSection(props) {
449
450
  var noChannels = !caps?.whatsapp && !caps?.telegram;
450
451
 
451
452
  return h('div', null,
452
- h('h2', { style: { fontSize: '20px', marginBottom: '16px' } }, 'Manager Messaging Channels'),
453
+ h('h2', { style: { fontSize: '20px', marginBottom: '16px', display: 'flex', alignItems: 'center' } }, 'Manager Messaging Channels', h(HelpButton, { label: 'Manager Messaging Channels' },
454
+ h('p', null, 'Connect personal messaging platforms so you can chat with your AI agent directly from WhatsApp or Telegram. These are your private channels — for customer-facing messaging, use the WhatsApp Business tab.'),
455
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
456
+ h('li', null, h('strong', null, 'Manager Identity'), ' — Set your phone number/user ID so the agent recognizes you across platforms.'),
457
+ h('li', null, h('strong', null, 'WhatsApp'), ' — Link via QR code. Uses your personal WhatsApp as a linked device.'),
458
+ h('li', null, h('strong', null, 'Telegram'), ' — Create a bot via @BotFather and paste the token.')
459
+ ),
460
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Add trusted contacts to control who can message the agent. Only trusted contacts get responses — everyone else gets an auto-reply.')
461
+ )),
453
462
 
454
463
  noChannels && h('div', { style: Object.assign({}, cardStyle, { textAlign: 'center', padding: '40px' }) },
455
464
  h('div', { style: { marginBottom: '12px' } }, E.chat(40)),
@@ -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, EmptyState } from './shared.js?v=4';
5
+ import { HelpButton } from '../../components/help-button.js';
5
6
 
6
7
  // --- CommunicationSection -------------------------------------------
7
8
 
@@ -126,7 +127,15 @@ export function CommunicationSection(props) {
126
127
 
127
128
  return h('div', { className: 'card' },
128
129
  h('div', { className: 'card-header', style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' } },
129
- h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600 } }, 'Communication'),
130
+ h('h3', { style: { margin: 0, fontSize: 15, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Communication', h(HelpButton, { label: 'Communication' },
131
+ h('p', null, 'Inter-agent messaging system. Agents can send messages to each other for coordination, task delegation, and information sharing.'),
132
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
133
+ h('li', null, h('strong', null, 'All Messages'), ' — Complete message history (sent and received).'),
134
+ h('li', null, h('strong', null, 'Inbox'), ' — Unread messages waiting for this agent. Mark as read after review.'),
135
+ h('li', null, h('strong', null, 'Topology'), ' — Visual map of which agents communicate with each other and how frequently.')
136
+ ),
137
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use priority levels (urgent, high, normal, low) to help agents triage incoming messages.')
138
+ )),
130
139
  h('div', { style: { display: 'flex', gap: 8 } },
131
140
  h('button', { className: 'btn btn-primary btn-sm', onClick: function() { setShowSend(true); } }, I.plus(), ' Send Message'),
132
141
  h('button', { className: 'btn btn-ghost btn-sm', onClick: refreshCurrent }, I.refresh(), ' Refresh')
@@ -1,6 +1,12 @@
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';
5
+
6
+ // ─── Help tooltip styles ───
7
+ var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
8
+ var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
9
+ var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
4
10
 
5
11
  // ─── Voice Voices ───
6
12
 
@@ -38,7 +44,7 @@ var rowStyle = { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 };
38
44
 
39
45
  function CardHeader(props) {
40
46
  return h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
41
- h('h4', { style: { margin: 0, fontSize: 14, fontWeight: 600 } }, props.title),
47
+ h('h4', { style: { margin: 0, fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, props.title, props.help || null),
42
48
  props.onEdit && !props.editing
43
49
  ? h('button', { className: 'btn btn-ghost btn-sm', onClick: props.onEdit }, 'Edit')
44
50
  : props.editing
@@ -270,6 +276,16 @@ export function ConfigurationSection(props) {
270
276
  h('div', { className: 'card', style: { padding: 20, marginBottom: 20 } },
271
277
  h(CardHeader, {
272
278
  title: 'Default LLM Model',
279
+ help: h(HelpButton, { label: 'Default LLM Model' },
280
+ h('p', null, 'The primary AI model this agent uses for all conversations and tasks.'),
281
+ h('h4', { style: _h4 }, 'Settings'),
282
+ h('ul', { style: _ul },
283
+ h('li', null, h('strong', null, 'Provider'), ' — The AI provider (Anthropic, OpenAI, Google, etc.). Must have an API key configured in Settings > API Keys.'),
284
+ h('li', null, h('strong', null, 'Model'), ' — The specific model to use (e.g., claude-sonnet-4-20250514, gpt-4o). Newer models are generally smarter but cost more.'),
285
+ h('li', null, h('strong', null, 'Thinking Level'), ' — Extended reasoning capability. Higher levels let the model "think step by step" before responding, improving quality for complex tasks at the cost of more tokens.')
286
+ ),
287
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use Model Routing below to assign different models for different task types — e.g., a cheaper model for chat and a smarter one for complex tasks.')
288
+ ),
273
289
  editing: editingModel,
274
290
  saving: saving,
275
291
  onEdit: function() {
@@ -323,6 +339,19 @@ export function ConfigurationSection(props) {
323
339
  h('div', { className: 'card', style: { padding: 20, marginBottom: 20 } },
324
340
  h(CardHeader, {
325
341
  title: 'Model Routing',
342
+ help: h(HelpButton, { label: 'Model Routing' },
343
+ h('p', null, 'Assign different AI models to different types of tasks. This lets you optimize for cost and quality.'),
344
+ h('h4', { style: _h4 }, 'Task Types'),
345
+ h('ul', { style: _ul },
346
+ h('li', null, h('strong', null, 'Chat'), ' — Real-time conversations (Slack, Teams, WhatsApp). Usually benefits from a fast model.'),
347
+ h('li', null, h('strong', null, 'Meeting'), ' — Meeting summaries and follow-ups. Often needs a larger context window.'),
348
+ h('li', null, h('strong', null, 'Email'), ' — Composing and replying to emails. Benefits from a capable writing model.'),
349
+ h('li', null, h('strong', null, 'Task'), ' — Delegated tasks from managers or other agents.'),
350
+ h('li', null, h('strong', null, 'Scheduling'), ' — Calendar management and scheduling tasks.')
351
+ ),
352
+ h('p', null, 'Leave a route empty to use the Default LLM Model for that task type.'),
353
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use cheaper models (e.g., claude-haiku, gpt-4o-mini) for simple chat and expensive ones (claude-opus, gpt-4o) for complex tasks to save costs.')
354
+ ),
326
355
  editing: editingRouting,
327
356
  saving: saving,
328
357
  onEdit: function() {
@@ -397,6 +426,14 @@ export function ConfigurationSection(props) {
397
426
  h('div', { className: 'card', style: { padding: 20, marginBottom: 20 } },
398
427
  h(CardHeader, {
399
428
  title: 'Meeting Voice (ElevenLabs)',
429
+ help: h(HelpButton, { label: 'Meeting Voice' },
430
+ h('p', null, 'Configure a text-to-speech voice for this agent to use in meetings and voice interactions via ElevenLabs.'),
431
+ h('ul', { style: _ul },
432
+ h('li', null, 'The voice ID comes from your ElevenLabs dashboard (elevenlabs.io > Voices > Copy Voice ID).'),
433
+ h('li', null, 'Name is just a label for your reference.')
434
+ ),
435
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'ElevenLabs offers free tier voices. Clone a custom voice for your agent\'s unique identity.')
436
+ ),
400
437
  editing: editingVoice,
401
438
  saving: saving,
402
439
  onEdit: function() {
@@ -432,6 +469,10 @@ export function ConfigurationSection(props) {
432
469
  h('div', { className: 'card', style: { padding: 20, marginBottom: 20 } },
433
470
  h(CardHeader, {
434
471
  title: 'Description',
472
+ help: h(HelpButton, { label: 'Agent Description' },
473
+ h('p', null, 'A human-readable description of what this agent does. This is shown to other agents and team members, and is included in the agent\'s system prompt to help it understand its role.'),
474
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Be specific about the agent\'s responsibilities. "Handles customer support for billing questions" is better than "support agent".')
475
+ ),
435
476
  editing: editingDesc,
436
477
  saving: saving,
437
478
  onEdit: function() {
@@ -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
- var deleteAgent = function() {
212
- showConfirm({
213
- title: 'Delete Agent',
214
- message: 'Are you sure you want to delete agent "' + (ea.name || identity.name || agentId) + '"? This will remove all associated data.',
215
- warning: 'This action cannot be undone.',
216
- danger: true,
217
- confirmText: 'Delete Agent'
218
- }).then(function(confirmed) {
219
- if (!confirmed) return;
220
- apiCall('/bridge/agents/' + agentId, { method: 'DELETE' })
221
- .then(function() { toast('Agent deleted', 'success'); if (onBack) onBack(); })
222
- .catch(function(err) { toast(err.message, 'error'); });
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', null, 'Edit Deployment Configuration'),
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', null, 'Knowledge Bases')),
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: deleteAgent }, I.trash(), ' Delete Agent')
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', null, 'Interventions')),
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', null, 'DLP Violations')),
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', null, 'Pending Approvals (' + pendingApprovals.length + ')')),
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