@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
@@ -231,7 +231,11 @@ export function SettingsPage() {
231
231
 
232
232
  tab === 'general' && h('div', null,
233
233
  h('div', { className: 'card', style: { marginBottom: 16 } },
234
- h('div', { className: 'card-header' }, h('h3', null, 'Organization')),
234
+ h('div', { className: 'card-header' }, h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Organization', h(HelpButton, { label: 'Organization Settings' },
235
+ h('p', null, 'Core settings for your AgenticMail Enterprise instance — company name, domain, branding, and plan tier.'),
236
+ h('p', null, h('strong', null, 'Plan: '), 'Self-hosted installations have no restrictions. Set a plan tier to enforce agent limits if needed.'),
237
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Your brand color and logo are used throughout the dashboard and in agent-facing UIs.')
238
+ ))),
235
239
  h('div', { className: 'card-body' },
236
240
  h('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 } },
237
241
  h('div', { className: 'form-group' },
@@ -278,7 +282,10 @@ export function SettingsPage() {
278
282
  // ─── Email Signature Template ─────────────────────
279
283
  h('div', { className: 'card' },
280
284
  h('div', { className: 'card-header' },
281
- h('h3', null, 'Email Signature Template'),
285
+ h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Email Signature Template', h(HelpButton, { label: 'Email Signature Template' },
286
+ h('p', null, 'Define a shared HTML signature that all agents use in their outgoing emails. Use template variables like {{name}}, {{role}}, {{email}} to personalize per agent.'),
287
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Test your signature by previewing it below the editor. The preview uses sample data to show how it will look.')
288
+ )),
282
289
  h('span', { style: { fontSize: 12, color: 'var(--text-muted)', marginLeft: 8 } }, 'Applied to all agents')
283
290
  ),
284
291
  h('div', { className: 'card-body' },
@@ -331,7 +338,11 @@ export function SettingsPage() {
331
338
 
332
339
  h('div', { className: 'card' },
333
340
  h('div', { className: 'card-header' },
334
- h('h3', null, 'Organization Email'),
341
+ h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Organization Email', h(HelpButton, { label: 'Organization Email' },
342
+ h('p', null, 'Set up a shared OAuth application (Google or Microsoft) that all agents use for email access. Each agent still authorizes individually, but they share the same Client ID and Secret.'),
343
+ h('p', null, h('strong', null, 'Why: '), 'Without this, each agent would need its own OAuth app registration. This centralizes the setup.'),
344
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Follow the setup instructions carefully — you\'ll need to create an OAuth app in the provider\'s developer console and add the correct redirect URI.')
345
+ )),
335
346
  orgEmail.configured && h('span', { className: 'badge badge-success', style: { marginLeft: 8 } }, orgEmail.label || 'Configured')
336
347
  ),
337
348
  h('div', { className: 'card-body' },
@@ -515,7 +526,12 @@ export function SettingsPage() {
515
526
  tab === 'authentication' && h('div', null,
516
527
  h(TwoFactorCard, { toast: toast }),
517
528
  h('div', { className: 'card', style: { marginBottom: 16 } },
518
- h('div', { className: 'card-header' }, h('h3', null, 'Single Sign-On (SSO)')),
529
+ h('div', { className: 'card-header' }, h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Single Sign-On (SSO)', h(HelpButton, { label: 'Single Sign-On (SSO)' },
530
+ h('p', null, 'Let your team sign into AgenticMail using their existing corporate identity provider (Okta, Google Workspace, Azure AD, etc.).'),
531
+ h('p', null, h('strong', null, 'SAML 2.0'), ' — Enterprise standard, works with Okta, OneLogin, Azure AD.'),
532
+ h('p', null, h('strong', null, 'OIDC'), ' — Modern alternative, works with Google, Microsoft, Auth0.'),
533
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use the Quick Setup section below to pre-fill provider discovery URLs. You still need to create an OAuth app in the provider\'s console.')
534
+ ))),
519
535
  h('div', { className: 'card-body' },
520
536
  h('p', { style: { color: 'var(--text-secondary)', fontSize: 13, marginBottom: 16 } }, 'Configure SAML 2.0 or OIDC to let team members sign in with their corporate identity provider.'),
521
537
  h('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 } },
@@ -626,7 +642,12 @@ export function SettingsPage() {
626
642
  )
627
643
  ),
628
644
  h('div', { className: 'card' },
629
- h('div', { className: 'card-header' }, h('h3', null, 'Email & Domain Configuration')),
645
+ h('div', { className: 'card-header' }, h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Email & Domain Configuration', h(HelpButton, { label: 'Email & Domain Configuration' },
646
+ h('p', null, 'Configure how your agents send and receive email. Choose between a simple Gmail/Outlook relay or a professional custom domain setup.'),
647
+ h('p', null, h('strong', null, 'Relay'), ' — Easy, agents send from yourname+agent@gmail.com. Great for getting started.'),
648
+ h('p', null, h('strong', null, 'Custom Domain'), ' — Professional, agents send from agent@yourdomain.com with DKIM/SPF/DMARC.'),
649
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Start with relay for quick setup. Upgrade to a custom domain when you need professional email branding.')
650
+ ))),
630
651
  h('div', { className: 'card-body' },
631
652
  h('p', { style: { color: 'var(--text-secondary)', fontSize: 13, marginBottom: 20 } }, 'Configure how agents send and receive email. Choose between a relay (Gmail/Outlook forwarding) or a custom domain with full DKIM/SPF/DMARC.'),
632
653
  h('div', { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 } },
@@ -670,7 +691,10 @@ export function SettingsPage() {
670
691
  h('div', { className: 'card', style: { marginBottom: 16 } },
671
692
  h('div', { className: 'card-header' },
672
693
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
673
- h('h3', null, 'Deploy Credentials'),
694
+ h('h3', { style: { display: 'flex', alignItems: 'center' } }, 'Deploy Credentials', h(HelpButton, { label: 'Deploy Credentials' },
695
+ h('p', null, 'Store credentials for deploying agents to external platforms (Docker registries, cloud providers, etc.). These are encrypted at rest with AES-256-GCM.'),
696
+ h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Add credentials here before using the agent deployment feature. Each credential is tied to a specific target type (Docker, Kubernetes, etc.).')
697
+ )),
674
698
  h('button', { className: 'btn btn-primary btn-sm', onClick: () => { setDeployForm({ name: '', targetType: 'docker', config: {} }); setShowDeployModal(true); } }, I.plus(), ' Add Credential')
675
699
  )
676
700
  ),
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall } from '../components/utils.js';
2
2
  import { I } from '../components/icons.js';
3
3
  import { Modal } from '../components/modal.js';
4
+ import { HelpButton } from '../components/help-button.js';
4
5
 
5
6
  // Auth help: where to get API keys/tokens for each skill
6
7
  var AUTH_HELP = {
@@ -334,11 +335,24 @@ export function SkillConnectionsPage() {
334
335
  );
335
336
  }
336
337
 
338
+ var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
339
+ var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
340
+ var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
341
+
337
342
  return h(Fragment, null,
338
343
  // Page Header
339
344
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
340
345
  h('div', null,
341
- h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Skill Connections'),
346
+ h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Skill Connections', h(HelpButton, { label: 'Skill Connections' },
347
+ h('p', null, 'Manage the authentication and configuration for your installed community skills. Each skill needs to be connected to its external service before agents can use it.'),
348
+ h('h4', { style: _h4 }, 'Connection Types'),
349
+ h('ul', { style: _ul },
350
+ h('li', null, h('strong', null, 'OAuth'), ' — Secure token-based auth. Click "Connect" to authorize via the service\'s login page.'),
351
+ h('li', null, h('strong', null, 'API Key / Token'), ' — Paste credentials from the service\'s developer portal.'),
352
+ h('li', null, h('strong', null, 'Configure'), ' — Set custom options like default channels, project IDs, or behavior tweaks.')
353
+ ),
354
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Look for the "How to connect" box on each skill card — it links directly to where you get credentials.')
355
+ )),
342
356
  h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Connect external services and configure skill settings')
343
357
  ),
344
358
  h('button', { className: 'btn btn-secondary', onClick: load }, I.refresh(), ' Refresh')
@@ -347,15 +361,15 @@ export function SkillConnectionsPage() {
347
361
  // Stats Bar
348
362
  h('div', { className: 'stat-grid', style: { marginBottom: 20 } },
349
363
  h('div', { className: 'stat-card' },
350
- h('div', { className: 'stat-label' }, 'Total Installed'),
364
+ h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Total Installed', h(HelpButton, { label: 'Total Installed' }, h('p', null, 'The number of community skills you\'ve installed from the marketplace. These are available to connect and use with your agents.'))),
351
365
  h('div', { className: 'stat-value' }, totalInstalled)
352
366
  ),
353
367
  h('div', { className: 'stat-card' },
354
- h('div', { className: 'stat-label' }, 'Connected'),
368
+ h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Connected', h(HelpButton, { label: 'Connected' }, h('p', null, 'Skills that have been successfully authenticated with their external service. Connected skills are ready for agents to use.'))),
355
369
  h('div', { className: 'stat-value', style: { color: 'var(--success)' } }, connectedCount)
356
370
  ),
357
371
  h('div', { className: 'stat-card' },
358
- h('div', { className: 'stat-label' }, 'Needs Configuration'),
372
+ h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Needs Configuration', h(HelpButton, { label: 'Needs Configuration' }, h('p', null, 'Skills that are installed but not yet connected. They need API keys, OAuth authorization, or other credentials before agents can use them.'))),
359
373
  h('div', { className: 'stat-value', style: { color: needsConfigCount > 0 ? 'var(--warning)' : 'var(--text-muted)' } }, needsConfigCount)
360
374
  )
361
375
  ),
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, getOrgId } from '../components/utils.js';
2
2
  import { I } from '../components/icons.js';
3
3
  import { Modal } from '../components/modal.js';
4
+ import { HelpButton } from '../components/help-button.js';
4
5
 
5
6
  export function SkillsPage() {
6
7
  var app = useApp();
@@ -551,7 +552,16 @@ export function SkillsPage() {
551
552
  // Header with stats
552
553
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
553
554
  h('div', null,
554
- h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Skills & Integrations'),
555
+ h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Skills & Integrations', h(HelpButton, { label: 'Skills & Integrations' },
556
+ h('p', null, 'Skills give your agents the ability to interact with external services. Integrations connect to third-party platforms like Slack, GitHub, Jira, and more.'),
557
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Tabs'),
558
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
559
+ h('li', null, h('strong', null, 'Integrations'), ' — Connect external services (OAuth, API keys, credentials). Connected services give agents real tools.'),
560
+ h('li', null, h('strong', null, 'Builtin Skills'), ' — Pre-packaged capabilities that come with the platform. Always available.'),
561
+ h('li', null, h('strong', null, 'Installed'), ' — Community skills you\'ve installed from the marketplace. Manage connections and configuration here.')
562
+ ),
563
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 8, fontSize: 13 } }, h('strong', null, 'Tip: '), 'Start with Integrations tab — connect the services your agents need, and they\'ll automatically get access to the relevant tools.')
564
+ )),
555
565
  h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } },
556
566
  allSkills.length + ' builtin \u00B7 ' + integrations.length + ' integrations \u00B7 ' + intConnectedCount + ' connected'
557
567
  )
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, Fragment, useApp, apiCall, showConfirm } from '../components/utils.js';
2
2
  import { I } from '../components/icons.js';
3
3
  import { Modal } from '../components/modal.js';
4
+ import { HelpButton } from '../components/help-button.js';
4
5
 
5
6
  export function UsersPage() {
6
7
  var { toast } = useApp();
@@ -58,7 +59,19 @@ export function UsersPage() {
58
59
 
59
60
  return h(Fragment, null,
60
61
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
61
- h('div', null, h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Users'), h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Manage team members and their access')),
62
+ h('div', null, h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Users', h(HelpButton, { label: 'Users' },
63
+ h('p', null, 'Manage dashboard users who can access and administer the AgenticMail Enterprise console. Each user has a role that controls what they can see and do.'),
64
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Roles'),
65
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
66
+ h('li', null, h('strong', null, 'Owner'), ' — Full access including billing, user management, and destructive actions.'),
67
+ h('li', null, h('strong', null, 'Admin'), ' — Can manage agents, policies, and most settings. Cannot manage billing.'),
68
+ h('li', null, h('strong', null, 'Member'), ' — Can view dashboards and interact with agents. Limited config access.'),
69
+ h('li', null, h('strong', null, 'Viewer'), ' — Read-only access to dashboards and reports.')
70
+ ),
71
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, '2FA (Two-Factor Authentication)'),
72
+ h('p', null, 'Users can enable TOTP-based 2FA for extra security. The 2FA column shows whether it\'s active.'),
73
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Use the lock icon to reset a user\'s password. The "Generate" button creates a secure random password.')
74
+ )), h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Manage team members and their access')),
62
75
  h('button', { className: 'btn btn-primary', onClick: function() { setCreating(true); } }, I.plus(), ' Add User')
63
76
  ),
64
77
 
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, getOrgId } from '../components/utils.js';
2
2
  import { I } from '../components/icons.js';
3
3
  import { Modal } from '../components/modal.js';
4
+ import { HelpButton } from '../components/help-button.js';
4
5
 
5
6
  var PAGE_SIZE = 25;
6
7
 
@@ -522,7 +523,16 @@ export function VaultPage() {
522
523
 
523
524
  h('div', { className: 'card' },
524
525
  h('div', { className: 'card-header' },
525
- h('h3', { style: { fontSize: 14, fontWeight: 600 } }, 'Secrets by Category')
526
+ h('h3', { style: { fontSize: 14, fontWeight: 600, display: 'flex', alignItems: 'center' } }, 'Secrets by Category', h(HelpButton, { label: 'Secrets by Category' },
527
+ h('p', null, 'Breakdown of stored secrets by their category. Helps you understand what types of credentials are in your vault.'),
528
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
529
+ h('li', null, h('strong', null, 'Deploy Credentials'), ' — Infrastructure and deployment secrets.'),
530
+ h('li', null, h('strong', null, 'Skill Credentials'), ' — API keys for agent tools (OpenAI, Slack, etc).'),
531
+ h('li', null, h('strong', null, 'Cloud Storage'), ' — AWS, GCP, and other cloud provider keys.'),
532
+ h('li', null, h('strong', null, 'API Keys'), ' — General-purpose API keys.'),
533
+ h('li', null, h('strong', null, 'Custom'), ' — User-defined secrets.')
534
+ )
535
+ ))
526
536
  ),
527
537
  h('div', { className: 'card-body' },
528
538
  Object.keys(byCategory).length === 0
@@ -563,7 +573,17 @@ export function VaultPage() {
563
573
  return h(Fragment, null,
564
574
  h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
565
575
  h('div', null,
566
- h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Vault'),
576
+ h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Vault', h(HelpButton, { label: 'Vault' },
577
+ h('p', null, 'Securely store and manage API keys, passwords, and credentials used by your agents. All secrets are encrypted at rest with AES-256-GCM.'),
578
+ h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Key features'),
579
+ h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
580
+ h('li', null, h('strong', null, 'Platform presets'), ' — Quick setup for OpenAI, Anthropic, GitHub, Stripe, and more.'),
581
+ h('li', null, h('strong', null, 'Key rotation'), ' — Re-encrypt secrets with fresh keys without changing the value.'),
582
+ h('li', null, h('strong', null, 'Full audit trail'), ' — Every read, create, delete, and rotate is logged.'),
583
+ h('li', null, h('strong', null, 'Auto-detection'), ' — Secrets stored as skill:<platform>:<key> are auto-detected by agent tools.')
584
+ ),
585
+ h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Rotate secrets periodically. Use "Rotate All" for bulk re-encryption after a security incident.')
586
+ )),
567
587
  h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Encrypted secrets management with AES-256-GCM')
568
588
  ),
569
589
  h('button', { className: 'btn btn-secondary', onClick: function() { loadSecrets(); loadStatus(); if (tab === 'audit') loadAudit(); } }, I.refresh(), ' Refresh')
@@ -1,6 +1,7 @@
1
1
  import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, buildAgentEmailMap, resolveAgentEmail, buildAgentDataMap, renderAgentBadge, getOrgId } from '../components/utils.js';
2
2
  import { I } from '../components/icons.js';
3
3
  import { TimezoneSelect } from '../components/timezones.js';
4
+ import { HelpButton } from '../components/help-button.js';
4
5
 
5
6
  export function WorkforcePage() {
6
7
  const { toast } = useApp();
@@ -245,9 +246,24 @@ export function WorkforcePage() {
245
246
  { key: 'history', label: 'Clock History' },
246
247
  ];
247
248
 
249
+ var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
250
+ var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
251
+ var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
252
+
248
253
  return h('div', { className: 'page-inner' },
249
254
  h('div', { className: 'page-header' },
250
- h('h1', null, 'Workforce Management'),
255
+ h('h1', { style: { display: 'flex', alignItems: 'center' } }, 'Workforce Management', h(HelpButton, { label: 'Workforce Management' },
256
+ h('p', null, 'Manage your agents like employees — set work schedules, assign tasks, track budgets, and monitor clock-in/out history.'),
257
+ h('h4', { style: _h4 }, 'Key sections'),
258
+ h('ul', { style: _ul },
259
+ h('li', null, h('strong', null, 'Overview'), ' — See which agents are clocked in, off duty, or unscheduled.'),
260
+ h('li', null, h('strong', null, 'Schedules'), ' — Define working hours, shifts, and auto-wake rules.'),
261
+ h('li', null, h('strong', null, 'Task Queue'), ' — Assign and track tasks for specific agents.'),
262
+ h('li', null, h('strong', null, 'Budgets'), ' — Set token caps to control agent spending.'),
263
+ h('li', null, h('strong', null, 'Clock History'), ' — Audit trail of all clock-in/out events.')
264
+ ),
265
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use schedules with auto-wake to have agents automatically start working at their scheduled time each day.')
266
+ )),
251
267
  h('button', { className: 'btn btn-ghost', onClick: loadData }, I.refresh(), ' Refresh')
252
268
  ),
253
269
  // Tab bar
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.199",
3
+ "version": "0.5.200",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,45 @@
1
+ # Help Tooltips Implementation Guide
2
+
3
+ ## Pattern
4
+ Use the existing `HelpButton` component from `../components/help-button.js` (or `../../components/help-button.js` for agent-detail).
5
+
6
+ ### Import
7
+ ```js
8
+ import { HelpButton } from '../components/help-button.js';
9
+ ```
10
+
11
+ ### Usage
12
+ Add HelpButton next to section titles, card headers, stat labels, and tab headers:
13
+ ```js
14
+ h('h3', { style: { display: 'flex', alignItems: 'center' } },
15
+ 'Section Title',
16
+ h(HelpButton, { label: 'Section Title' },
17
+ h('p', null, 'Main explanation of what this section does.'),
18
+ h('h4', { style: _h4 }, 'Key Concepts'),
19
+ h('ul', { style: _ul },
20
+ h('li', null, 'Concept 1 explanation'),
21
+ h('li', null, 'Concept 2 explanation'),
22
+ ),
23
+ h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Helpful tip here.')
24
+ )
25
+ )
26
+ ```
27
+
28
+ ### Style Variables (define at top of render function)
29
+ ```js
30
+ var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
31
+ var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
32
+ var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
33
+ ```
34
+
35
+ ## Rules
36
+ 1. Add HelpButton to EVERY card header, section title, and stat label
37
+ 2. Keep help text concise but useful — explain what it is, why it matters, and how to use it
38
+ 3. Include "Tip:" boxes for actionable advice
39
+ 4. Use h4 for sub-headings within help modals
40
+ 5. Use ul/li for lists of concepts
41
+ 6. Don't repeat obvious UI labels — explain the WHY
42
+ 7. Reference the existing knowledge-contributions.js page for the gold standard example
43
+ 8. Make sure to import HelpButton at the top of each file
44
+ 9. DO NOT change any existing functionality — only ADD help tooltips
45
+ 10. Test that the file is valid JS after changes (no syntax errors)
@@ -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')