@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.
- package/dist/dashboard/pages/activity.js +14 -1
- package/dist/dashboard/pages/agent-detail/activity.js +17 -1
- package/dist/dashboard/pages/agent-detail/autonomy.js +17 -1
- package/dist/dashboard/pages/agent-detail/budget.js +25 -2
- package/dist/dashboard/pages/agent-detail/channels.js +10 -1
- package/dist/dashboard/pages/agent-detail/communication.js +10 -1
- package/dist/dashboard/pages/agent-detail/configuration.js +42 -1
- package/dist/dashboard/pages/agent-detail/deployment.js +147 -16
- package/dist/dashboard/pages/agent-detail/email.js +10 -1
- package/dist/dashboard/pages/agent-detail/guardrails.js +27 -3
- package/dist/dashboard/pages/agent-detail/manager.js +15 -1
- package/dist/dashboard/pages/agent-detail/meeting-browser.js +14 -2
- package/dist/dashboard/pages/agent-detail/memory.js +24 -5
- package/dist/dashboard/pages/agent-detail/overview.js +159 -21
- package/dist/dashboard/pages/agent-detail/permissions.js +28 -7
- package/dist/dashboard/pages/agent-detail/personal-details.js +17 -1
- package/dist/dashboard/pages/agent-detail/security.js +21 -5
- package/dist/dashboard/pages/agent-detail/skills-section.js +9 -1
- package/dist/dashboard/pages/agent-detail/tool-security.js +35 -8
- package/dist/dashboard/pages/agent-detail/tools.js +10 -1
- package/dist/dashboard/pages/agent-detail/whatsapp.js +11 -1
- package/dist/dashboard/pages/agent-detail/workforce.js +19 -4
- package/dist/dashboard/pages/agents.js +15 -1
- package/dist/dashboard/pages/approvals.js +15 -1
- package/dist/dashboard/pages/audit.js +23 -1
- package/dist/dashboard/pages/compliance.js +24 -2
- package/dist/dashboard/pages/dashboard.js +25 -6
- package/dist/dashboard/pages/dlp.js +23 -2
- package/dist/dashboard/pages/domain-status.js +51 -7
- package/dist/dashboard/pages/guardrails.js +29 -3
- package/dist/dashboard/pages/journal.js +24 -4
- package/dist/dashboard/pages/knowledge-contributions.js +69 -3
- package/dist/dashboard/pages/knowledge-import.js +6 -1
- package/dist/dashboard/pages/knowledge.js +51 -9
- package/dist/dashboard/pages/messages.js +28 -5
- package/dist/dashboard/pages/org-chart.js +18 -1
- package/dist/dashboard/pages/settings.js +30 -6
- package/dist/dashboard/pages/skill-connections.js +18 -4
- package/dist/dashboard/pages/skills.js +11 -1
- package/dist/dashboard/pages/users.js +14 -1
- package/dist/dashboard/pages/vault.js +22 -2
- package/dist/dashboard/pages/workforce.js +17 -1
- package/package.json +1 -1
- package/src/dashboard/HELP-TOOLTIPS-GUIDE.md +45 -0
- package/src/dashboard/pages/activity.js +14 -1
- package/src/dashboard/pages/agent-detail/activity.js +17 -1
- package/src/dashboard/pages/agent-detail/autonomy.js +17 -1
- package/src/dashboard/pages/agent-detail/budget.js +25 -2
- package/src/dashboard/pages/agent-detail/channels.js +10 -1
- package/src/dashboard/pages/agent-detail/communication.js +10 -1
- package/src/dashboard/pages/agent-detail/configuration.js +42 -1
- package/src/dashboard/pages/agent-detail/deployment.js +147 -16
- package/src/dashboard/pages/agent-detail/email.js +10 -1
- package/src/dashboard/pages/agent-detail/guardrails.js +27 -3
- package/src/dashboard/pages/agent-detail/manager.js +15 -1
- package/src/dashboard/pages/agent-detail/meeting-browser.js +14 -2
- package/src/dashboard/pages/agent-detail/memory.js +24 -5
- package/src/dashboard/pages/agent-detail/overview.js +159 -21
- package/src/dashboard/pages/agent-detail/permissions.js +28 -7
- package/src/dashboard/pages/agent-detail/personal-details.js +17 -1
- package/src/dashboard/pages/agent-detail/security.js +21 -5
- package/src/dashboard/pages/agent-detail/skills-section.js +9 -1
- package/src/dashboard/pages/agent-detail/tool-security.js +35 -8
- package/src/dashboard/pages/agent-detail/tools.js +10 -1
- package/src/dashboard/pages/agent-detail/whatsapp.js +11 -1
- package/src/dashboard/pages/agent-detail/workforce.js +19 -4
- package/src/dashboard/pages/agents.js +15 -1
- package/src/dashboard/pages/approvals.js +15 -1
- package/src/dashboard/pages/audit.js +23 -1
- package/src/dashboard/pages/compliance.js +24 -2
- package/src/dashboard/pages/dashboard.js +25 -6
- package/src/dashboard/pages/dlp.js +23 -2
- package/src/dashboard/pages/domain-status.js +51 -7
- package/src/dashboard/pages/guardrails.js +29 -3
- package/src/dashboard/pages/journal.js +24 -4
- package/src/dashboard/pages/knowledge-contributions.js +69 -3
- package/src/dashboard/pages/knowledge-import.js +6 -1
- package/src/dashboard/pages/knowledge.js +51 -9
- package/src/dashboard/pages/messages.js +28 -5
- package/src/dashboard/pages/org-chart.js +18 -1
- package/src/dashboard/pages/settings.js +30 -6
- package/src/dashboard/pages/skill-connections.js +18 -4
- package/src/dashboard/pages/skills.js +11 -1
- package/src/dashboard/pages/users.js +14 -1
- package/src/dashboard/pages/vault.js +22 -2
- package/src/dashboard/pages/workforce.js +17 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { h, useState, useEffect, Fragment, useApp, engineCall, buildAgentEmailMap, buildAgentDataMap, resolveAgentEmail, renderAgentBadge, getOrgId } from '../components/utils.js';
|
|
2
2
|
import { I } from '../components/icons.js';
|
|
3
|
+
import { HelpButton } from '../components/help-button.js';
|
|
3
4
|
|
|
4
5
|
export function JournalPage() {
|
|
5
6
|
const { toast } = useApp();
|
|
@@ -23,12 +24,31 @@ export function JournalPage() {
|
|
|
23
24
|
try { const r = await engineCall('/journal/' + id + '/rollback', { method: 'POST', body: JSON.stringify({}) }); if (r.success) { toast('Action rolled back', 'success'); load(); } else toast('Rollback failed: ' + (r.error || 'Unknown'), 'error'); } catch (e) { toast(e.message, 'error'); }
|
|
24
25
|
};
|
|
25
26
|
|
|
27
|
+
var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
|
|
28
|
+
var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
|
|
29
|
+
var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
|
|
30
|
+
|
|
26
31
|
return h('div', { className: 'page-inner' },
|
|
27
|
-
h('div', { className: 'page-header' }, h('h1',
|
|
32
|
+
h('div', { className: 'page-header' }, h('h1', { style: { display: 'flex', alignItems: 'center' } }, 'Action Journal', h(HelpButton, { label: 'Action Journal' },
|
|
33
|
+
h('p', null, 'A tamper-proof log of every action agents have taken. Think of it as an audit trail — every tool call, every side effect, recorded with full context.'),
|
|
34
|
+
h('h4', { style: _h4 }, 'Why it matters'),
|
|
35
|
+
h('ul', { style: _ul },
|
|
36
|
+
h('li', null, h('strong', null, 'Accountability'), ' — Know exactly what each agent did and when.'),
|
|
37
|
+
h('li', null, h('strong', null, 'Rollback'), ' — Reverse actions that were mistakes or caused issues.'),
|
|
38
|
+
h('li', null, h('strong', null, 'Compliance'), ' — Maintain a full audit trail for regulatory needs.')
|
|
39
|
+
),
|
|
40
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use the Rollback button on reversible actions to undo agent mistakes without manual intervention.')
|
|
41
|
+
))),
|
|
28
42
|
stats && h('div', { className: 'stat-grid', style: { marginBottom: 16 } },
|
|
29
|
-
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.total), h('div', { className: 'stat-label' }, 'Total Actions'
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.total), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Total Actions', h(HelpButton, { label: 'Total Actions' },
|
|
44
|
+
h('p', null, 'The total number of tool calls and side effects recorded across all agents.')
|
|
45
|
+
))),
|
|
46
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.reversible), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Reversible', h(HelpButton, { label: 'Reversible' },
|
|
47
|
+
h('p', null, 'Actions that can be undone (rolled back). Not all actions are reversible — for example, sent emails cannot be unsent.')
|
|
48
|
+
))),
|
|
49
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.reversed), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Rolled Back', h(HelpButton, { label: 'Rolled Back' },
|
|
50
|
+
h('p', null, 'Actions that have been reversed by an admin. A high number may indicate agents need tighter permissions or better instructions.')
|
|
51
|
+
)))
|
|
32
52
|
),
|
|
33
53
|
h('div', { className: 'card' },
|
|
34
54
|
h('table', { className: 'data-table' },
|
|
@@ -267,7 +267,19 @@ export function KnowledgeContributionsPage() {
|
|
|
267
267
|
|
|
268
268
|
return h(Fragment, null,
|
|
269
269
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
|
|
270
|
-
h('span', { style: { fontSize: 13, color: 'var(--text-muted)' } }, bases.length + ' knowledge base' + (bases.length !== 1 ? 's' : '')
|
|
270
|
+
h('span', { style: { fontSize: 13, color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, bases.length + ' knowledge base' + (bases.length !== 1 ? 's' : ''),
|
|
271
|
+
h(HelpButton, { label: 'Knowledge Bases' },
|
|
272
|
+
h('p', null, 'Each knowledge base is a searchable collection of documents. Agents use these to answer questions with real organizational data instead of guessing.'),
|
|
273
|
+
h('h4', { style: _h4 }, 'How It Works'),
|
|
274
|
+
h('ul', { style: _ul },
|
|
275
|
+
h('li', null, h('strong', null, 'Create'), ' a knowledge base and give it a descriptive name (e.g., "HR Policies", "Product Docs").'),
|
|
276
|
+
h('li', null, h('strong', null, 'Import'), ' documents via the Knowledge Import page — upload files, crawl URLs, or paste text.'),
|
|
277
|
+
h('li', null, h('strong', null, 'Assign'), ' the knowledge base to agents in their Deployment tab.'),
|
|
278
|
+
h('li', null, h('strong', null, 'Search'), ' happens automatically when agents use the knowledge_base_search tool.')
|
|
279
|
+
),
|
|
280
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Click on a knowledge base to see its documents and chunks. Chunks are the small pieces of text that get matched during search — smaller chunks give more precise results.')
|
|
281
|
+
)
|
|
282
|
+
),
|
|
271
283
|
h('button', { className: 'btn btn-primary', onClick: function() { setShowCreateBase(true); } }, I.plus(), ' Create Knowledge Base')
|
|
272
284
|
),
|
|
273
285
|
bases.length === 0
|
|
@@ -425,6 +437,21 @@ export function KnowledgeContributionsPage() {
|
|
|
425
437
|
var agentData = buildAgentDataMap(agents);
|
|
426
438
|
|
|
427
439
|
var renderContributions = function() {
|
|
440
|
+
// Header with help
|
|
441
|
+
var _contribHeader = h('div', { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 12 } },
|
|
442
|
+
h('span', { style: { fontSize: 14, fontWeight: 600 } }, 'Agent Contributions'),
|
|
443
|
+
h(HelpButton, { label: 'Agent Contributions' },
|
|
444
|
+
h('p', null, 'Every entry here is a piece of knowledge an agent contributed — a fact learned, a decision recorded, a process documented, or an insight captured during work.'),
|
|
445
|
+
h('h4', { style: _h4 }, 'Contribution Details'),
|
|
446
|
+
h('ul', { style: _ul },
|
|
447
|
+
h('li', null, h('strong', null, 'Confidence'), ' — How certain the agent is about this knowledge (0-100%). Higher confidence = more reliable. Contributions below your threshold are flagged for review.'),
|
|
448
|
+
h('li', null, h('strong', null, 'Category'), ' — The type of knowledge (fact, process, decision, preference, etc.). Helps organize and filter.'),
|
|
449
|
+
h('li', null, h('strong', null, 'Source'), ' — Where the agent learned this (conversation, email, document, etc.).')
|
|
450
|
+
),
|
|
451
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Review low-confidence contributions periodically. You can edit, approve, or delete them. High-quality contributions improve all agents that share this knowledge base.')
|
|
452
|
+
)
|
|
453
|
+
);
|
|
454
|
+
|
|
428
455
|
// Filter
|
|
429
456
|
var filtered = contributions;
|
|
430
457
|
if (contribAgent) filtered = filtered.filter(function(c) { return c.agentId === contribAgent; });
|
|
@@ -440,6 +467,7 @@ export function KnowledgeContributionsPage() {
|
|
|
440
467
|
var paged = filtered.slice(contribPage * CONTRIB_PAGE_SIZE, (contribPage + 1) * CONTRIB_PAGE_SIZE);
|
|
441
468
|
|
|
442
469
|
return h(Fragment, null,
|
|
470
|
+
_contribHeader,
|
|
443
471
|
// Filter bar
|
|
444
472
|
h('div', { style: { display: 'flex', gap: 10, marginBottom: 14, flexWrap: 'wrap', alignItems: 'center' } },
|
|
445
473
|
h('input', {
|
|
@@ -506,7 +534,18 @@ export function KnowledgeContributionsPage() {
|
|
|
506
534
|
var renderSchedules = function() {
|
|
507
535
|
return h(Fragment, null,
|
|
508
536
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 } },
|
|
509
|
-
h('span', { style: { fontSize: 13, color: 'var(--text-muted)' } }, schedules.length + ' schedule' + (schedules.length !== 1 ? 's' : '')
|
|
537
|
+
h('span', { style: { fontSize: 13, color: 'var(--text-muted)', display: 'flex', alignItems: 'center' } }, schedules.length + ' schedule' + (schedules.length !== 1 ? 's' : ''),
|
|
538
|
+
h(HelpButton, { label: 'Contribution Schedules' },
|
|
539
|
+
h('p', null, 'Schedules automate knowledge contributions. Instead of relying on agents to contribute spontaneously, schedules trigger periodic knowledge synthesis.'),
|
|
540
|
+
h('h4', { style: _h4 }, 'How Schedules Work'),
|
|
541
|
+
h('ul', { style: _ul },
|
|
542
|
+
h('li', null, 'Pick an agent and a target knowledge base.'),
|
|
543
|
+
h('li', null, 'Set the frequency (hourly, daily, weekly, monthly) and a minimum confidence threshold.'),
|
|
544
|
+
h('li', null, 'At each interval, the agent reviews its recent memories and contributes relevant knowledge above the confidence threshold.')
|
|
545
|
+
),
|
|
546
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Weekly schedules with 60%+ confidence work well for most use cases. Daily schedules generate more granular but potentially noisier contributions.')
|
|
547
|
+
)
|
|
548
|
+
),
|
|
510
549
|
h('button', { className: 'btn btn-primary', onClick: function() { setShowCreateSchedule(true); } }, I.plus(), ' Create Schedule')
|
|
511
550
|
),
|
|
512
551
|
schedules.length === 0
|
|
@@ -1183,6 +1222,20 @@ export function KnowledgeContributionsPage() {
|
|
|
1183
1222
|
var m = searchMetrics;
|
|
1184
1223
|
|
|
1185
1224
|
return h('div', null,
|
|
1225
|
+
h('div', { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 16 } },
|
|
1226
|
+
h('span', { style: { fontSize: 14, fontWeight: 600 } }, 'Search Metrics'),
|
|
1227
|
+
h(HelpButton, { label: 'Search Metrics' },
|
|
1228
|
+
h('p', null, 'Track how agents are searching your knowledge bases. This helps you understand which bases are useful and where there are gaps.'),
|
|
1229
|
+
h('h4', { style: _h4 }, 'Key Metrics'),
|
|
1230
|
+
h('ul', { style: _ul },
|
|
1231
|
+
h('li', null, h('strong', null, 'Total Searches'), ' — How many times agents searched knowledge bases in the selected period.'),
|
|
1232
|
+
h('li', null, h('strong', null, 'KB vs Hub Searches'), ' — KB searches target a specific knowledge base; Hub searches query across all bases.'),
|
|
1233
|
+
h('li', null, h('strong', null, 'Hit Rate'), ' — Percentage of searches that returned useful results. Low hit rates mean agents are searching for things not in your knowledge bases.'),
|
|
1234
|
+
h('li', null, h('strong', null, 'Avg Results'), ' — Average number of results per search. Too few = gaps in content; too many = content may be too broad.')
|
|
1235
|
+
),
|
|
1236
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'If hit rate is low, check the "Top Queries with No Results" section to see what\'s missing from your knowledge bases, then import relevant content.')
|
|
1237
|
+
)
|
|
1238
|
+
),
|
|
1186
1239
|
// Filters
|
|
1187
1240
|
h('div', { style: { display: 'flex', gap: 12, marginBottom: 20 } },
|
|
1188
1241
|
h('select', {
|
|
@@ -1325,7 +1378,20 @@ export function KnowledgeContributionsPage() {
|
|
|
1325
1378
|
// Header
|
|
1326
1379
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
|
|
1327
1380
|
h('div', null,
|
|
1328
|
-
h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Knowledge Contributions'
|
|
1381
|
+
h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Knowledge Contributions',
|
|
1382
|
+
h(HelpButton, { label: 'Knowledge Contributions' },
|
|
1383
|
+
h('p', null, 'This is where your agents build shared organizational knowledge. Agents contribute what they learn from conversations, tasks, and research into knowledge bases that all agents can search.'),
|
|
1384
|
+
h('h4', { style: _h4 }, 'Tabs'),
|
|
1385
|
+
h('ul', { style: _ul },
|
|
1386
|
+
h('li', null, h('strong', null, 'Knowledge Bases'), ' — Create and manage knowledge bases. Each is a collection of documents that agents can search via RAG (Retrieval-Augmented Generation).'),
|
|
1387
|
+
h('li', null, h('strong', null, 'Contributions'), ' — Browse individual knowledge entries that agents have contributed. Filter by agent, search by content, and review quality.'),
|
|
1388
|
+
h('li', null, h('strong', null, 'Schedules'), ' — Automate knowledge contributions on a schedule (e.g., weekly synthesis of learnings).'),
|
|
1389
|
+
h('li', null, h('strong', null, 'Stats'), ' — Charts showing contribution volume, confidence levels, category distribution, and agent quality over time.'),
|
|
1390
|
+
h('li', null, h('strong', null, 'Search Metrics'), ' — How agents are using knowledge search — query volume, hit rates, and which bases are most useful.')
|
|
1391
|
+
),
|
|
1392
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Start by creating a knowledge base, then enable knowledge contributions in each agent\'s Autonomy settings. Agents will automatically contribute what they learn.')
|
|
1393
|
+
)
|
|
1394
|
+
),
|
|
1329
1395
|
h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } },
|
|
1330
1396
|
'Collaborative knowledge building from agent memories and experiences'
|
|
1331
1397
|
)
|
|
@@ -12,6 +12,7 @@ import { h, useState, useEffect, useRef, Fragment, useApp, engineCall, getOrgId
|
|
|
12
12
|
import { I } from '../components/icons.js';
|
|
13
13
|
import { ProviderLogo } from '../assets/provider-logos.js';
|
|
14
14
|
import { Modal } from '../components/modal.js';
|
|
15
|
+
import { HelpButton } from '../components/help-button.js';
|
|
15
16
|
|
|
16
17
|
// ─── Platform Definitions ────────────────────────────
|
|
17
18
|
|
|
@@ -421,7 +422,11 @@ export function ImportJobsList({ kbId }) {
|
|
|
421
422
|
|
|
422
423
|
return h('div', { className: 'card', style: { marginTop: 16 } },
|
|
423
424
|
h('div', { className: 'card-header' },
|
|
424
|
-
h('h3', { style: { margin: 0, fontSize: 14 } }, 'Import History'
|
|
425
|
+
h('h3', { style: { margin: 0, fontSize: 14, display: 'flex', alignItems: 'center' } }, 'Import History', h(HelpButton, { label: 'Import History' },
|
|
426
|
+
h('p', null, 'Shows all previous import jobs for this knowledge base. Track the status, source, and results of each import.'),
|
|
427
|
+
h('p', null, h('strong', null, 'Statuses: '), 'completed (all documents imported), running (in progress), failed (error occurred), cancelled (manually stopped).'),
|
|
428
|
+
h('p', { style: { marginTop: 8, padding: 8, background: 'var(--bg-secondary, #1e293b)', borderRadius: 6, fontSize: 13 } }, h('strong', null, 'Tip: '), 'If an import fails, check the source URL and credentials, then try again.')
|
|
429
|
+
)),
|
|
425
430
|
),
|
|
426
431
|
h('div', { className: 'card-body-flush' },
|
|
427
432
|
h('table', null,
|
|
@@ -2,6 +2,7 @@ import { h, useState, useEffect, useCallback, Fragment, useApp, engineCall, getO
|
|
|
2
2
|
import { I } from '../components/icons.js';
|
|
3
3
|
import { Modal } from '../components/modal.js';
|
|
4
4
|
import { KnowledgeImportWizard, ImportJobsList } from './knowledge-import.js';
|
|
5
|
+
import { HelpButton } from '../components/help-button.js';
|
|
5
6
|
|
|
6
7
|
export function KnowledgeBasePage() {
|
|
7
8
|
const { toast } = useApp();
|
|
@@ -120,6 +121,10 @@ export function KnowledgeBasePage() {
|
|
|
120
121
|
} catch (e) { toast(e.message, 'error'); }
|
|
121
122
|
};
|
|
122
123
|
|
|
124
|
+
var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
|
|
125
|
+
var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
|
|
126
|
+
var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
|
|
127
|
+
|
|
123
128
|
// ── Detail View ──
|
|
124
129
|
if (selected) {
|
|
125
130
|
return h(Fragment, null,
|
|
@@ -128,7 +133,16 @@ export function KnowledgeBasePage() {
|
|
|
128
133
|
h('button', { className: 'btn btn-secondary btn-sm', onClick: () => setSelected(null) }, '\u2190 Back'),
|
|
129
134
|
editing
|
|
130
135
|
? h('input', { className: 'input', value: editForm.name, onChange: e => setEditForm(f => ({ ...f, name: e.target.value })), style: { fontSize: 18, fontWeight: 700, padding: '4px 8px' } })
|
|
131
|
-
: h('h1', { style: { fontSize: 20, fontWeight: 700, margin: 0 } }, selected.name
|
|
136
|
+
: h('h1', { style: { fontSize: 20, fontWeight: 700, margin: 0, display: 'flex', alignItems: 'center' } }, selected.name, h(HelpButton, { label: 'Knowledge Base Detail' },
|
|
137
|
+
h('p', null, 'This is the detail view for a single knowledge base. Here you can manage documents, view chunks, and import new content.'),
|
|
138
|
+
h('h4', { style: _h4 }, 'Key Actions'),
|
|
139
|
+
h('ul', { style: _ul },
|
|
140
|
+
h('li', null, h('strong', null, 'Import Docs'), ' — Add documents from GitHub, Google Drive, websites, or file uploads.'),
|
|
141
|
+
h('li', null, h('strong', null, 'Edit'), ' — Rename or update the description of this knowledge base.'),
|
|
142
|
+
h('li', null, h('strong', null, 'Delete'), ' — Permanently remove this knowledge base and all its documents.')
|
|
143
|
+
),
|
|
144
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Click a document on the left to preview its chunks on the right. You can edit individual chunks for fine-grained control.')
|
|
145
|
+
))
|
|
132
146
|
),
|
|
133
147
|
h('div', { style: { display: 'flex', gap: 8 } },
|
|
134
148
|
editing
|
|
@@ -162,13 +176,13 @@ export function KnowledgeBasePage() {
|
|
|
162
176
|
// Stats
|
|
163
177
|
selected.stats && h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 12, marginBottom: 16 } },
|
|
164
178
|
[
|
|
165
|
-
{ label: 'Documents', value: selected.stats?.documentCount || selected.stats?.documents || selected.stats?.totalDocuments || docs.length },
|
|
166
|
-
{ label: 'Chunks', value: selected.stats?.chunkCount || selected.stats?.chunks || selected.stats?.totalChunks || 0 },
|
|
167
|
-
{ label: 'Total Tokens', value: selected.stats?.totalTokens || 0 },
|
|
168
|
-
{ label: 'Queries', value: selected.stats?.queryCount || 0 },
|
|
179
|
+
{ label: 'Documents', value: selected.stats?.documentCount || selected.stats?.documents || selected.stats?.totalDocuments || docs.length, help: 'Total number of source documents imported into this knowledge base.' },
|
|
180
|
+
{ label: 'Chunks', value: selected.stats?.chunkCount || selected.stats?.chunks || selected.stats?.totalChunks || 0, help: 'Total text segments created from your documents. More chunks = more granular retrieval.' },
|
|
181
|
+
{ label: 'Total Tokens', value: selected.stats?.totalTokens || 0, help: 'Total token count across all chunks. This affects storage costs and retrieval context size.' },
|
|
182
|
+
{ label: 'Queries', value: selected.stats?.queryCount || 0, help: 'Number of times agents have searched this knowledge base. Higher usage means this KB is valuable.' },
|
|
169
183
|
].map(s => h('div', { key: s.label, className: 'card', style: { textAlign: 'center', padding: 12 } },
|
|
170
184
|
h('div', { style: { fontSize: 22, fontWeight: 700, color: 'var(--brand-color, #6366f1)' } }, typeof s.value === 'number' && s.value > 1000 ? (s.value / 1000).toFixed(1) + 'K' : s.value),
|
|
171
|
-
h('div', { style: { fontSize: 12, color: 'var(--text-muted)', marginTop: 2 } }, s.label)
|
|
185
|
+
h('div', { style: { fontSize: 12, color: 'var(--text-muted)', marginTop: 2, display: 'flex', alignItems: 'center', justifyContent: 'center' } }, s.label, h(HelpButton, { label: s.label }, h('p', null, s.help)))
|
|
172
186
|
))
|
|
173
187
|
),
|
|
174
188
|
|
|
@@ -179,7 +193,16 @@ export function KnowledgeBasePage() {
|
|
|
179
193
|
h('div', { className: 'card' },
|
|
180
194
|
h('div', { className: 'card-header' },
|
|
181
195
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } },
|
|
182
|
-
h('h3', { style: { margin: 0 } }, 'Documents'
|
|
196
|
+
h('h3', { style: { margin: 0, display: 'flex', alignItems: 'center' } }, 'Documents', h(HelpButton, { label: 'Documents' },
|
|
197
|
+
h('p', null, 'Documents are the source files you\'ve imported into this knowledge base. Each document is automatically split into smaller chunks for efficient retrieval.'),
|
|
198
|
+
h('h4', { style: _h4 }, 'Managing Documents'),
|
|
199
|
+
h('ul', { style: _ul },
|
|
200
|
+
h('li', null, h('strong', null, 'Click'), ' a document to view its chunks in the right panel.'),
|
|
201
|
+
h('li', null, h('strong', null, 'Rename'), ' — Click the edit icon to rename a document.'),
|
|
202
|
+
h('li', null, h('strong', null, 'Delete'), ' — Remove a document and all its chunks.')
|
|
203
|
+
),
|
|
204
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Use "Import Docs" to add more documents from various sources like GitHub, Google Drive, or direct file upload.')
|
|
205
|
+
)),
|
|
183
206
|
h('span', { className: 'badge badge-neutral' }, docs.length)
|
|
184
207
|
)
|
|
185
208
|
),
|
|
@@ -218,7 +241,16 @@ export function KnowledgeBasePage() {
|
|
|
218
241
|
// Chunk preview
|
|
219
242
|
h('div', { className: 'card' },
|
|
220
243
|
h('div', { className: 'card-header' },
|
|
221
|
-
h('h3', { style: { margin: 0 } }, selectedDoc ? 'Chunks: ' + (selectedDoc.name || selectedDoc.id) : 'Select a document'
|
|
244
|
+
h('h3', { style: { margin: 0, display: 'flex', alignItems: 'center' } }, selectedDoc ? 'Chunks: ' + (selectedDoc.name || selectedDoc.id) : 'Select a document', h(HelpButton, { label: 'Chunks' },
|
|
245
|
+
h('p', null, 'Chunks are the smaller text segments that documents are split into for RAG (Retrieval-Augmented Generation). When an agent queries the knowledge base, the most relevant chunks are retrieved and included in the prompt.'),
|
|
246
|
+
h('h4', { style: _h4 }, 'Why Chunks Matter'),
|
|
247
|
+
h('ul', { style: _ul },
|
|
248
|
+
h('li', null, h('strong', null, 'Granularity'), ' — Smaller chunks allow more precise retrieval of relevant information.'),
|
|
249
|
+
h('li', null, h('strong', null, 'Token count'), ' — Each chunk has a token count that affects how much context is used.'),
|
|
250
|
+
h('li', null, h('strong', null, 'Editing'), ' — You can manually edit chunks to improve quality or fix errors.')
|
|
251
|
+
),
|
|
252
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'If an agent gives incorrect answers, check the relevant chunks — you may need to edit them for clarity or accuracy.')
|
|
253
|
+
))
|
|
222
254
|
),
|
|
223
255
|
h('div', { className: 'card-body', style: { maxHeight: 500, overflow: 'auto' } },
|
|
224
256
|
!selectedDoc
|
|
@@ -267,7 +299,17 @@ export function KnowledgeBasePage() {
|
|
|
267
299
|
return h(Fragment, null,
|
|
268
300
|
h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20 } },
|
|
269
301
|
h('div', null,
|
|
270
|
-
h('h1', { style: { fontSize: 20, fontWeight: 700 } }, 'Knowledge Bases'
|
|
302
|
+
h('h1', { style: { fontSize: 20, fontWeight: 700, display: 'flex', alignItems: 'center' } }, 'Knowledge Bases', h(HelpButton, { label: 'Knowledge Bases' },
|
|
303
|
+
h('p', null, 'Knowledge bases store documents that your agents can search and reference when answering questions. This is the foundation of RAG (Retrieval-Augmented Generation).'),
|
|
304
|
+
h('h4', { style: _h4 }, 'How It Works'),
|
|
305
|
+
h('ul', { style: _ul },
|
|
306
|
+
h('li', null, h('strong', null, 'Create'), ' a knowledge base to organize related documents together.'),
|
|
307
|
+
h('li', null, h('strong', null, 'Import'), ' documents from GitHub, Google Drive, SharePoint, websites, or file uploads.'),
|
|
308
|
+
h('li', null, h('strong', null, 'Assign'), ' knowledge bases to agents so they can search and retrieve relevant information.'),
|
|
309
|
+
h('li', null, h('strong', null, 'Query'), ' — When an agent needs information, it searches the knowledge base and retrieves the most relevant chunks.')
|
|
310
|
+
),
|
|
311
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Organize knowledge bases by topic or department. Smaller, focused knowledge bases often produce better search results than one large one.')
|
|
312
|
+
)),
|
|
271
313
|
h('p', { style: { color: 'var(--text-muted)', fontSize: 13 } }, 'Document ingestion and RAG retrieval for agents')
|
|
272
314
|
),
|
|
273
315
|
h('button', { className: 'btn btn-primary', onClick: () => setCreating(true) }, I.plus(), ' New Knowledge Base')
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { h, useState, useEffect, useRef, Fragment, useApp, engineCall, buildAgentEmailMap, resolveAgentEmail, buildAgentDataMap, renderAgentBadge, getOrgId } from '../components/utils.js';
|
|
2
2
|
import { I } from '../components/icons.js';
|
|
3
|
+
import { HelpButton } from '../components/help-button.js';
|
|
3
4
|
|
|
4
5
|
export function MessagesPage() {
|
|
5
6
|
const { toast } = useApp();
|
|
@@ -194,16 +195,38 @@ export function MessagesPage() {
|
|
|
194
195
|
);
|
|
195
196
|
};
|
|
196
197
|
|
|
198
|
+
var _h4 = { marginTop: 16, marginBottom: 8, fontSize: 14 };
|
|
199
|
+
var _ul = { paddingLeft: 20, margin: '4px 0 8px' };
|
|
200
|
+
var _tip = { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 };
|
|
201
|
+
|
|
197
202
|
return h('div', { className: 'page-inner' },
|
|
198
203
|
// Page header
|
|
199
|
-
h('div', { className: 'page-header' }, h('h1',
|
|
204
|
+
h('div', { className: 'page-header' }, h('h1', { style: { display: 'flex', alignItems: 'center' } }, 'Agent Messages', h(HelpButton, { label: 'Agent Messages' },
|
|
205
|
+
h('p', null, 'All inter-agent and external communications in one place. See how your agents talk to each other and to the outside world.'),
|
|
206
|
+
h('h4', { style: _h4 }, 'Message types'),
|
|
207
|
+
h('ul', { style: _ul },
|
|
208
|
+
h('li', null, h('strong', null, 'Internal'), ' — Agent-to-agent messages within your organization.'),
|
|
209
|
+
h('li', null, h('strong', null, 'External'), ' — Messages sent to or received from outside (email, APIs, etc.).'),
|
|
210
|
+
h('li', null, h('strong', null, 'Tasks/Handoffs'), ' — Structured work delegation between agents.'),
|
|
211
|
+
h('li', null, h('strong', null, 'Broadcasts'), ' — One-to-many announcements.')
|
|
212
|
+
),
|
|
213
|
+
h('div', { style: _tip }, h('strong', null, 'Tip: '), 'Switch to the Topology tab to visualize which agents communicate most. Click nodes to see communication details.')
|
|
214
|
+
)), h('button', { className: 'btn btn-primary', onClick: () => setShowModal(true) }, I.plus(), ' New Message')),
|
|
200
215
|
|
|
201
216
|
// Stats cards
|
|
202
217
|
h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(160px, 1fr))', gap: 12, marginBottom: 20 } },
|
|
203
|
-
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.totalMessages), h('div', { className: 'stat-label' }, 'Total'
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.
|
|
218
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.totalMessages), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Total', h(HelpButton, { label: 'Total Messages' },
|
|
219
|
+
h('p', null, 'The total count of all messages across all directions and types.')
|
|
220
|
+
))),
|
|
221
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.internalMessages), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'Internal', h(HelpButton, { label: 'Internal Messages' },
|
|
222
|
+
h('p', null, 'Messages exchanged between agents within your organization. High internal traffic usually means healthy collaboration.')
|
|
223
|
+
))),
|
|
224
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.externalOutbound), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'External Out', h(HelpButton, { label: 'External Outbound' },
|
|
225
|
+
h('p', null, 'Messages sent by agents to external recipients (customers, partners, APIs). Monitor this to ensure agents aren\'t over-communicating.')
|
|
226
|
+
))),
|
|
227
|
+
h('div', { className: 'stat-card' }, h('div', { className: 'stat-value' }, stats.externalInbound), h('div', { className: 'stat-label', style: { display: 'flex', alignItems: 'center' } }, 'External In', h(HelpButton, { label: 'External Inbound' },
|
|
228
|
+
h('p', null, 'Messages received from outside your organization. These trigger agent workflows and responses.')
|
|
229
|
+
)))
|
|
207
230
|
),
|
|
208
231
|
|
|
209
232
|
// Main tabs: Messages | Topology
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { h, useState, useEffect, useCallback, useRef, Fragment, useApp, engineCall, getOrgId } from '../components/utils.js';
|
|
2
2
|
import { I } from '../components/icons.js';
|
|
3
|
+
import { HelpButton } from '../components/help-button.js';
|
|
3
4
|
|
|
4
5
|
// ─── Layout Constants ────────────────────────────────────
|
|
5
6
|
const NODE_W = 220;
|
|
@@ -297,7 +298,23 @@ export function OrgChartPage() {
|
|
|
297
298
|
return h('div', { style: { height: '100%', display: 'flex', flexDirection: 'column', background: BG, borderRadius: 'var(--radius-lg)', overflow: 'hidden' } },
|
|
298
299
|
// Toolbar
|
|
299
300
|
h('div', { style: { display: 'flex', alignItems: 'center', gap: 12, padding: '12px 20px', borderBottom: '1px solid rgba(255,255,255,0.08)', background: 'rgba(0,0,0,0.3)', flexShrink: 0 } },
|
|
300
|
-
h('div', { style: { fontWeight: 700, fontSize: 16, color: '#fff' } }, 'Organization Chart'
|
|
301
|
+
h('div', { style: { fontWeight: 700, fontSize: 16, color: '#fff', display: 'flex', alignItems: 'center' } }, 'Organization Chart', h(HelpButton, { label: 'Organization Chart' },
|
|
302
|
+
h('p', null, 'Visual hierarchy of all agents in your organization. Shows reporting relationships, status, and activity at a glance.'),
|
|
303
|
+
h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Interactions'),
|
|
304
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
305
|
+
h('li', null, h('strong', null, 'Hover'), ' — Highlights the agent\'s full chain (managers above, reports below) and shows a detail tooltip.'),
|
|
306
|
+
h('li', null, h('strong', null, 'Scroll'), ' — Zoom in/out.'),
|
|
307
|
+
h('li', null, h('strong', null, 'Click & drag'), ' — Pan the canvas.'),
|
|
308
|
+
h('li', null, h('strong', null, 'Fit'), ' — Auto-zoom to fit all agents in view.')
|
|
309
|
+
),
|
|
310
|
+
h('h4', { style: { marginTop: 16, marginBottom: 8, fontSize: 14 } }, 'Node badges'),
|
|
311
|
+
h('ul', { style: { paddingLeft: 20, margin: '4px 0 8px' } },
|
|
312
|
+
h('li', null, h('strong', null, 'MGR'), ' — This agent manages other agents.'),
|
|
313
|
+
h('li', null, h('strong', null, 'N tasks'), ' — Currently active tasks.'),
|
|
314
|
+
h('li', null, h('strong', null, 'N err'), ' — Errors recorded today.')
|
|
315
|
+
),
|
|
316
|
+
h('div', { style: { marginTop: 12, padding: 12, background: 'var(--bg-secondary, #1e293b)', borderRadius: 'var(--radius, 8px)', fontSize: 13 } }, h('strong', null, 'Tip: '), 'Purple nodes represent external (human) managers. Configure manager relationships in each agent\'s settings.')
|
|
317
|
+
)),
|
|
301
318
|
h('div', { style: { color: 'rgba(255,255,255,0.4)', fontSize: 13 } }, positioned.length + ' agents'),
|
|
302
319
|
h('div', { style: { flex: 1 } }),
|
|
303
320
|
// Legend
|
|
@@ -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',
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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'
|
|
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
|
|