@agenticmail/enterprise 0.4.3 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +608 -923
- package/dashboards/django/app.py +12 -0
- package/dashboards/django/static/styles.css +449 -246
- package/dashboards/django/templates/activity.html +130 -0
- package/dashboards/django/templates/approvals.html +115 -0
- package/dashboards/django/templates/community-skills.html +89 -0
- package/dashboards/django/templates/domain-status.html +59 -0
- package/dashboards/django/templates/knowledge-contributions.html +58 -0
- package/dashboards/django/templates/knowledge.html +104 -0
- package/dashboards/django/templates/layout.html +161 -36
- package/dashboards/django/templates/skill-connections.html +73 -0
- package/dashboards/django/templates/workforce.html +116 -0
- package/dashboards/django/views/__init__.py +14 -0
- package/dashboards/django/views/new_pages.py +38 -0
- package/dashboards/dotnet/Program.cs +8 -0
- package/dashboards/dotnet/Routes/ActivityRoutes.cs +35 -0
- package/dashboards/dotnet/Routes/ApprovalRoutes.cs +36 -0
- package/dashboards/dotnet/Routes/CommunitySkillRoutes.cs +36 -0
- package/dashboards/dotnet/Routes/DomainStatusRoutes.cs +49 -0
- package/dashboards/dotnet/Routes/KnowledgeContributionRoutes.cs +42 -0
- package/dashboards/dotnet/Routes/KnowledgeRoutes.cs +40 -0
- package/dashboards/dotnet/Routes/SkillConnectionRoutes.cs +52 -0
- package/dashboards/dotnet/Routes/WorkforceRoutes.cs +55 -0
- package/dashboards/dotnet/Services/HtmlBuilder.cs +17 -8
- package/dashboards/dotnet/wwwroot/styles.css +508 -246
- package/dashboards/express/app.js +8 -0
- package/dashboards/express/public/styles.css +163 -272
- package/dashboards/express/routes/activity.js +101 -0
- package/dashboards/express/routes/approvals.js +100 -0
- package/dashboards/express/routes/community-skills.js +83 -0
- package/dashboards/express/routes/domain-status.js +78 -0
- package/dashboards/express/routes/knowledge-contributions.js +85 -0
- package/dashboards/express/routes/knowledge.js +83 -0
- package/dashboards/express/routes/skill-connections.js +86 -0
- package/dashboards/express/routes/workforce.js +126 -0
- package/dashboards/express/views/layout.js +54 -33
- package/dashboards/go/handlers/activity.go +30 -0
- package/dashboards/go/handlers/approvals.go +31 -0
- package/dashboards/go/handlers/community_skills.go +32 -0
- package/dashboards/go/handlers/domain_status.go +62 -0
- package/dashboards/go/handlers/knowledge.go +35 -0
- package/dashboards/go/handlers/knowledge_contributions.go +37 -0
- package/dashboards/go/handlers/skill_connections.go +59 -0
- package/dashboards/go/handlers/workforce.go +60 -0
- package/dashboards/go/main.go +8 -0
- package/dashboards/go/static/styles.css +508 -246
- package/dashboards/go/templates/layout.go +16 -11
- package/dashboards/html/index.html +136 -15
- package/dashboards/html/public/styles.css +531 -134
- package/dashboards/html/src/pages/activity.js +137 -0
- package/dashboards/html/src/pages/approvals.js +155 -0
- package/dashboards/html/src/pages/community-skills.js +236 -0
- package/dashboards/html/src/pages/domain-status.js +182 -0
- package/dashboards/html/src/pages/knowledge-contributions.js +319 -0
- package/dashboards/html/src/pages/knowledge.js +251 -0
- package/dashboards/html/src/pages/skill-connections.js +293 -0
- package/dashboards/html/src/pages/workforce.js +418 -0
- package/dashboards/html/src/router.js +51 -0
- package/dashboards/java/AgenticMailDashboard.java +8 -0
- package/dashboards/java/handlers/ActivityHandler.java +42 -0
- package/dashboards/java/handlers/ApprovalsHandler.java +43 -0
- package/dashboards/java/handlers/CommunitySkillsHandler.java +45 -0
- package/dashboards/java/handlers/DomainStatusHandler.java +58 -0
- package/dashboards/java/handlers/KnowledgeContributionsHandler.java +51 -0
- package/dashboards/java/handlers/KnowledgeHandler.java +49 -0
- package/dashboards/java/handlers/SkillConnectionsHandler.java +61 -0
- package/dashboards/java/handlers/WorkforceHandler.java +64 -0
- package/dashboards/java/static/styles.css +508 -250
- package/dashboards/java/templates/Layout.java +14 -6
- package/dashboards/laravel/controllers/ActivityController.php +18 -0
- package/dashboards/laravel/controllers/ApprovalsController.php +18 -0
- package/dashboards/laravel/controllers/CommunitySkillsController.php +18 -0
- package/dashboards/laravel/controllers/DomainStatusController.php +18 -0
- package/dashboards/laravel/controllers/KnowledgeContributionsController.php +18 -0
- package/dashboards/laravel/controllers/KnowledgeController.php +18 -0
- package/dashboards/laravel/controllers/SkillConnectionsController.php +18 -0
- package/dashboards/laravel/controllers/WorkforceController.php +18 -0
- package/dashboards/laravel/index.php +56 -0
- package/dashboards/laravel/public/styles.css +163 -279
- package/dashboards/laravel/views/activity.php +127 -0
- package/dashboards/laravel/views/approvals.php +152 -0
- package/dashboards/laravel/views/community-skills.php +131 -0
- package/dashboards/laravel/views/domain-status.php +167 -0
- package/dashboards/laravel/views/knowledge-contributions.php +185 -0
- package/dashboards/laravel/views/knowledge.php +167 -0
- package/dashboards/laravel/views/layout.php +54 -41
- package/dashboards/laravel/views/skill-connections.php +192 -0
- package/dashboards/laravel/views/workforce.php +265 -0
- package/dashboards/php/components/layout.php +21 -16
- package/dashboards/php/index.php +1 -1
- package/dashboards/php/pages/activity.php +35 -0
- package/dashboards/php/pages/approvals.php +36 -0
- package/dashboards/php/pages/community-skills.php +39 -0
- package/dashboards/php/pages/domain-status.php +87 -0
- package/dashboards/php/pages/knowledge-contributions.php +47 -0
- package/dashboards/php/pages/knowledge.php +43 -0
- package/dashboards/php/pages/skill-connections.php +94 -0
- package/dashboards/php/pages/workforce.php +89 -0
- package/dashboards/php/public/styles.css +168 -74
- package/dashboards/python/app.py +16 -0
- package/dashboards/python/routes/activity.py +11 -0
- package/dashboards/python/routes/approvals.py +11 -0
- package/dashboards/python/routes/community_skills.py +11 -0
- package/dashboards/python/routes/domain_status.py +11 -0
- package/dashboards/python/routes/knowledge.py +11 -0
- package/dashboards/python/routes/knowledge_contributions.py +11 -0
- package/dashboards/python/routes/skill_connections.py +11 -0
- package/dashboards/python/routes/workforce.py +11 -0
- package/dashboards/python/static/styles.css +163 -276
- package/dashboards/python/templates/activity.html +87 -0
- package/dashboards/python/templates/approvals.html +86 -0
- package/dashboards/python/templates/community-skills.html +69 -0
- package/dashboards/python/templates/domain-status.html +64 -0
- package/dashboards/python/templates/knowledge-contributions.html +71 -0
- package/dashboards/python/templates/knowledge.html +69 -0
- package/dashboards/python/templates/layout.html +103 -68
- package/dashboards/python/templates/skill-connections.html +72 -0
- package/dashboards/python/templates/workforce.html +112 -0
- package/dashboards/rails/app.rb +8 -0
- package/dashboards/rails/public/styles.css +506 -259
- package/dashboards/rails/routes/activity.rb +10 -0
- package/dashboards/rails/routes/approvals.rb +10 -0
- package/dashboards/rails/routes/community_skills.rb +11 -0
- package/dashboards/rails/routes/domain_status.rb +16 -0
- package/dashboards/rails/routes/knowledge.rb +11 -0
- package/dashboards/rails/routes/knowledge_contributions.rb +12 -0
- package/dashboards/rails/routes/skill_connections.rb +15 -0
- package/dashboards/rails/routes/workforce.rb +16 -0
- package/dashboards/rails/views/activity.erb +56 -0
- package/dashboards/rails/views/approvals.erb +60 -0
- package/dashboards/rails/views/community_skills.erb +69 -0
- package/dashboards/rails/views/domain_status.erb +75 -0
- package/dashboards/rails/views/knowledge.erb +67 -0
- package/dashboards/rails/views/knowledge_contributions.erb +70 -0
- package/dashboards/rails/views/layout.erb +23 -15
- package/dashboards/rails/views/skill_connections.erb +109 -0
- package/dashboards/rails/views/workforce.erb +124 -0
- package/dashboards/ruby/app.rb +8 -0
- package/dashboards/ruby/public/styles.css +506 -254
- package/dashboards/ruby/routes/activity.rb +10 -0
- package/dashboards/ruby/routes/approvals.rb +10 -0
- package/dashboards/ruby/routes/community_skills.rb +11 -0
- package/dashboards/ruby/routes/domain_status.rb +16 -0
- package/dashboards/ruby/routes/knowledge.rb +11 -0
- package/dashboards/ruby/routes/knowledge_contributions.rb +12 -0
- package/dashboards/ruby/routes/skill_connections.rb +15 -0
- package/dashboards/ruby/routes/workforce.rb +16 -0
- package/dashboards/ruby/views/activity.erb +56 -0
- package/dashboards/ruby/views/approvals.erb +60 -0
- package/dashboards/ruby/views/community_skills.erb +69 -0
- package/dashboards/ruby/views/domain_status.erb +75 -0
- package/dashboards/ruby/views/knowledge.erb +67 -0
- package/dashboards/ruby/views/knowledge_contributions.erb +70 -0
- package/dashboards/ruby/views/layout.erb +22 -13
- package/dashboards/ruby/views/skill_connections.erb +109 -0
- package/dashboards/ruby/views/workforce.erb +124 -0
- package/dashboards/shared/styles.css +505 -281
- package/dashboards/shared-styles.css +534 -45
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ const { esc } = require('../utils/helpers');
|
|
|
7
7
|
|
|
8
8
|
function layout(activePage, user, content, flash) {
|
|
9
9
|
const nav = (href, icon, label, key) =>
|
|
10
|
-
`<a href="${href}" class="${activePage === key ? 'active' : ''}">
|
|
10
|
+
`<a href="${href}" class="nav-item ${activePage === key ? 'active' : ''}">
|
|
11
11
|
${icon} <span>${label}</span>
|
|
12
12
|
</a>`;
|
|
13
13
|
|
|
@@ -26,38 +26,59 @@ function layout(activePage, user, content, flash) {
|
|
|
26
26
|
<link rel="stylesheet" href="/styles.css">
|
|
27
27
|
</head>
|
|
28
28
|
<body>
|
|
29
|
-
<
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
29
|
+
<div class="layout">
|
|
30
|
+
<aside class="sidebar">
|
|
31
|
+
<div class="sidebar-header">
|
|
32
|
+
<h2>AgenticMail</h2>
|
|
33
|
+
<p>Enterprise Dashboard</p>
|
|
34
|
+
</div>
|
|
35
|
+
<nav class="nav">
|
|
36
|
+
<div class="nav-section">Overview</div>
|
|
37
|
+
${nav('/', '📊', 'Dashboard', 'dashboard')}
|
|
38
|
+
|
|
39
|
+
<div class="nav-section">Management</div>
|
|
40
|
+
${nav('/agents', '🤖', 'Agents', 'agents')}
|
|
41
|
+
${nav('/skills', '⚡', 'Skills', 'skills')}
|
|
42
|
+
${nav('/community-skills', '🏪', 'Community Skills', 'community-skills')}
|
|
43
|
+
${nav('/skill-connections', '🔗', 'Skill Connections', 'skill-connections')}
|
|
44
|
+
${nav('/knowledge', '📚', 'Knowledge Bases', 'knowledge')}
|
|
45
|
+
${nav('/knowledge-contributions', '🧠', 'Knowledge Hub', 'knowledge-contributions')}
|
|
46
|
+
${nav('/approvals', '✅', 'Approvals', 'approvals')}
|
|
47
|
+
|
|
48
|
+
<div class="nav-section">Management</div>
|
|
49
|
+
${nav('/workforce', '⏰', 'Workforce', 'workforce')}
|
|
50
|
+
${nav('/messages', '💬', 'Messages', 'messages')}
|
|
51
|
+
${nav('/guardrails', '🛡️', 'Guardrails', 'guardrails')}
|
|
52
|
+
${nav('/journal', '📝', 'Journal', 'journal')}
|
|
53
|
+
|
|
54
|
+
<div class="nav-section">Administration</div>
|
|
55
|
+
${nav('/dlp', '🔍', 'DLP', 'dlp')}
|
|
56
|
+
${nav('/compliance', '✔️', 'Compliance', 'compliance')}
|
|
57
|
+
${nav('/domain-status', '🛡️', 'Domain', 'domain-status')}
|
|
58
|
+
${nav('/users', '👥', 'Users', 'users')}
|
|
59
|
+
${nav('/vault', '🔐', 'Vault', 'vault')}
|
|
60
|
+
${nav('/audit', '📋', 'Audit Log', 'audit')}
|
|
61
|
+
${nav('/settings', '⚙️', 'Settings', 'settings')}
|
|
62
|
+
</nav>
|
|
63
|
+
</aside>
|
|
64
|
+
|
|
65
|
+
<main class="main-content">
|
|
66
|
+
<div class="topbar">
|
|
67
|
+
<div class="topbar-left">
|
|
68
|
+
<div class="topbar-title">AgenticMail Enterprise</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="topbar-right">
|
|
71
|
+
<span>${esc(user?.email || user?.name || 'Admin')}</span>
|
|
72
|
+
<a href="/logout" class="btn btn-secondary btn-sm">Sign Out</a>
|
|
73
|
+
<button class="btn btn-secondary btn-sm theme-toggle" title="Toggle theme">🌙</button>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="page-content">
|
|
77
|
+
${flashHtml}
|
|
78
|
+
${content}
|
|
79
|
+
</div>
|
|
80
|
+
</main>
|
|
81
|
+
</div>
|
|
61
82
|
<script>
|
|
62
83
|
if(localStorage.getItem('dark')==='1') document.documentElement.setAttribute('data-theme','dark');
|
|
63
84
|
document.querySelector('.theme-toggle')?.addEventListener('click',function(){
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleActivity renders the activity page with real-time events and tool usage.
|
|
11
|
+
func HandleActivity(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Activity</h2><p class="desc">Real-time activity and tool usage across all agents</p>
|
|
15
|
+
<div style="margin-bottom: 20px;">
|
|
16
|
+
<button class="btn btn-p" onclick="location.href='#events'">Events</button>
|
|
17
|
+
<button class="btn" onclick="location.href='#tools'">Tool Calls</button>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="card">
|
|
20
|
+
<div class="ct">Recent Events</div>
|
|
21
|
+
<div class="empty"><div class="empty-i">📋</div>No events recorded<br><small>Agent activity will appear here</small></div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="card">
|
|
24
|
+
<div class="ct">Tool Usage</div>
|
|
25
|
+
<div class="empty"><div class="empty-i">🛠️</div>No tool calls recorded<br><small>Tool usage statistics will appear here</small></div>
|
|
26
|
+
</div>`
|
|
27
|
+
|
|
28
|
+
w.Header().Set("Content-Type", "text/html")
|
|
29
|
+
fmt.Fprint(w, templates.Layout("activity", s.User, content))
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleApprovals renders the approvals page for pending approval requests.
|
|
11
|
+
func HandleApprovals(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Approvals</h2><p class="desc">Review and manage pending approval requests</p>
|
|
15
|
+
<div style="margin-bottom: 20px;">
|
|
16
|
+
<button class="btn btn-p">Pending</button>
|
|
17
|
+
<button class="btn">Approved</button>
|
|
18
|
+
<button class="btn">Rejected</button>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="card">
|
|
21
|
+
<div class="ct">Pending Approvals</div>
|
|
22
|
+
<div class="empty"><div class="empty-i">✅</div>No pending approvals<br><small>Agent approval requests will appear here</small></div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="card">
|
|
25
|
+
<div class="ct">Approval History</div>
|
|
26
|
+
<div class="empty"><div class="empty-i">📋</div>No approval history<br><small>Past approvals and rejections will appear here</small></div>
|
|
27
|
+
</div>`
|
|
28
|
+
|
|
29
|
+
w.Header().Set("Content-Type", "text/html")
|
|
30
|
+
fmt.Fprint(w, templates.Layout("approvals", s.User, content))
|
|
31
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleCommunitySkills renders the community skills page for browsing and installing shared skills.
|
|
11
|
+
func HandleCommunitySkills(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Community Skills</h2><p class="desc">Browse and install skills shared by the community</p>
|
|
15
|
+
<div class="card">
|
|
16
|
+
<div class="ct">Featured Skills</div>
|
|
17
|
+
<div class="empty"><div class="empty-i">🏪</div>No community skills available<br><small>Community-shared skills will appear here</small></div>
|
|
18
|
+
</div>
|
|
19
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
|
20
|
+
<div class="card">
|
|
21
|
+
<div class="ct">Popular Categories</div>
|
|
22
|
+
<div class="empty"><div class="empty-i">🏷️</div>No categories</div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="card">
|
|
25
|
+
<div class="ct">My Contributions</div>
|
|
26
|
+
<div class="empty"><div class="empty-i">📤</div>No contributions</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>`
|
|
29
|
+
|
|
30
|
+
w.Header().Set("Content-Type", "text/html")
|
|
31
|
+
fmt.Fprint(w, templates.Layout("community-skills", s.User, content))
|
|
32
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleDomainStatus renders the domain status page for monitoring domain configuration.
|
|
11
|
+
func HandleDomainStatus(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Domain Status</h2><p class="desc">Monitor domain configuration and security status</p>
|
|
15
|
+
<style>
|
|
16
|
+
.status-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 20px; }
|
|
17
|
+
.status-item { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border); }
|
|
18
|
+
.status-item:last-child { border-bottom: none; }
|
|
19
|
+
.status-indicator { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
|
|
20
|
+
.status-success { background: var(--success); }
|
|
21
|
+
.status-warning { background: var(--warning); }
|
|
22
|
+
</style>
|
|
23
|
+
<div class="status-grid">
|
|
24
|
+
<div class="card">
|
|
25
|
+
<div class="ct">Domain Configuration</div>
|
|
26
|
+
<div class="status-item">
|
|
27
|
+
<span class="status-indicator status-success"></span>
|
|
28
|
+
<span>Domain connected</span>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="status-item">
|
|
31
|
+
<span class="status-indicator status-success"></span>
|
|
32
|
+
<span>DNS configured</span>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="status-item">
|
|
35
|
+
<span class="status-indicator status-success"></span>
|
|
36
|
+
<span>SSL certificate valid</span>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="card">
|
|
40
|
+
<div class="ct">Security Status</div>
|
|
41
|
+
<div class="status-item">
|
|
42
|
+
<span class="status-indicator status-success"></span>
|
|
43
|
+
<span>DKIM configured</span>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="status-item">
|
|
46
|
+
<span class="status-indicator status-success"></span>
|
|
47
|
+
<span>SPF record valid</span>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="status-item">
|
|
50
|
+
<span class="status-indicator status-warning"></span>
|
|
51
|
+
<span>DMARC recommended</span>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="card">
|
|
56
|
+
<div class="ct">Domain Health Monitoring</div>
|
|
57
|
+
<div class="empty"><div class="empty-i">📊</div>Domain monitoring dashboard<br><small>Real-time domain health metrics will appear here</small></div>
|
|
58
|
+
</div>`
|
|
59
|
+
|
|
60
|
+
w.Header().Set("Content-Type", "text/html")
|
|
61
|
+
fmt.Fprint(w, templates.Layout("domain-status", s.User, content))
|
|
62
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleKnowledge renders the knowledge bases management page.
|
|
11
|
+
func HandleKnowledge(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Knowledge Bases</h2><p class="desc">Manage and organize knowledge bases for your agents</p>
|
|
15
|
+
<div style="margin-bottom: 20px;">
|
|
16
|
+
<button class="btn btn-p">+ Create Knowledge Base</button>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="card">
|
|
19
|
+
<div class="ct">Active Knowledge Bases</div>
|
|
20
|
+
<div class="empty"><div class="empty-i">📚</div>No knowledge bases created<br><small>Create your first knowledge base to get started</small></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
|
23
|
+
<div class="card">
|
|
24
|
+
<div class="ct">Recent Activity</div>
|
|
25
|
+
<div class="empty"><div class="empty-i">📈</div>No recent activity</div>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="card">
|
|
28
|
+
<div class="ct">Knowledge Stats</div>
|
|
29
|
+
<div class="empty"><div class="empty-i">📊</div>No statistics available</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>`
|
|
32
|
+
|
|
33
|
+
w.Header().Set("Content-Type", "text/html")
|
|
34
|
+
fmt.Fprint(w, templates.Layout("knowledge", s.User, content))
|
|
35
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleKnowledgeContributions renders the knowledge hub for community sharing.
|
|
11
|
+
func HandleKnowledgeContributions(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Knowledge Hub</h2><p class="desc">Share knowledge and learn from the community</p>
|
|
15
|
+
<div style="margin-bottom: 20px;">
|
|
16
|
+
<button class="btn btn-p">Community</button>
|
|
17
|
+
<button class="btn">My Contributions</button>
|
|
18
|
+
<button class="btn">Bookmarks</button>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="card">
|
|
21
|
+
<div class="ct">Featured Knowledge</div>
|
|
22
|
+
<div class="empty"><div class="empty-i">🌟</div>No featured knowledge available<br><small>Community-shared knowledge will appear here</small></div>
|
|
23
|
+
</div>
|
|
24
|
+
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 20px; margin-top: 20px;">
|
|
25
|
+
<div class="card">
|
|
26
|
+
<div class="ct">Latest Contributions</div>
|
|
27
|
+
<div class="empty"><div class="empty-i">📝</div>No contributions yet<br><small>Recent knowledge contributions will appear here</small></div>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="card">
|
|
30
|
+
<div class="ct">Trending Topics</div>
|
|
31
|
+
<div class="empty"><div class="empty-i">🔥</div>No trending topics<br><small>Popular knowledge topics will appear here</small></div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>`
|
|
34
|
+
|
|
35
|
+
w.Header().Set("Content-Type", "text/html")
|
|
36
|
+
fmt.Fprint(w, templates.Layout("knowledge-contributions", s.User, content))
|
|
37
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleSkillConnections renders the skill connections page for managing relationships between skills.
|
|
11
|
+
func HandleSkillConnections(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Skill Connections</h2><p class="desc">Visualize and manage relationships between skills</p>
|
|
15
|
+
<style>
|
|
16
|
+
.connection-type { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--border); }
|
|
17
|
+
.connection-type:last-child { border-bottom: none; }
|
|
18
|
+
.connection-indicator { width: 12px; height: 12px; border-radius: 3px; flex-shrink: 0; }
|
|
19
|
+
.connection-depends { background: #06b6d4; }
|
|
20
|
+
.connection-enhances { background: var(--success); }
|
|
21
|
+
.connection-conflicts { background: var(--warning); }
|
|
22
|
+
.badge { margin-left: auto; background: var(--bg); color: var(--muted); padding: 2px 8px; border-radius: 12px; font-size: 12px; }
|
|
23
|
+
</style>
|
|
24
|
+
<div style="margin-bottom: 20px;">
|
|
25
|
+
<button class="btn btn-p">+ Create Connection</button>
|
|
26
|
+
<button class="btn" style="margin-left: 10px;">View Network</button>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="card">
|
|
29
|
+
<div class="ct">Skill Network Overview</div>
|
|
30
|
+
<div class="empty"><div class="empty-i">🔗</div>No skill connections configured<br><small>Create connections between skills to enable complex workflows</small></div>
|
|
31
|
+
</div>
|
|
32
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
|
33
|
+
<div class="card">
|
|
34
|
+
<div class="ct">Connection Types</div>
|
|
35
|
+
<div class="connection-type">
|
|
36
|
+
<span class="connection-indicator connection-depends"></span>
|
|
37
|
+
<span>Dependencies</span>
|
|
38
|
+
<span class="badge">0</span>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="connection-type">
|
|
41
|
+
<span class="connection-indicator connection-enhances"></span>
|
|
42
|
+
<span>Enhancements</span>
|
|
43
|
+
<span class="badge">0</span>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="connection-type">
|
|
46
|
+
<span class="connection-indicator connection-conflicts"></span>
|
|
47
|
+
<span>Conflicts</span>
|
|
48
|
+
<span class="badge">0</span>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="card">
|
|
52
|
+
<div class="ct">Recent Changes</div>
|
|
53
|
+
<div class="empty"><div class="empty-i">📋</div>No recent changes<br><small>Connection updates will appear here</small></div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>`
|
|
56
|
+
|
|
57
|
+
w.Header().Set("Content-Type", "text/html")
|
|
58
|
+
fmt.Fprint(w, templates.Layout("skill-connections", s.User, content))
|
|
59
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
package handlers
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"agenticmail-dashboard/services"
|
|
5
|
+
"agenticmail-dashboard/templates"
|
|
6
|
+
"fmt"
|
|
7
|
+
"net/http"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// HandleWorkforce renders the workforce management page for agent scheduling and workloads.
|
|
11
|
+
func HandleWorkforce(w http.ResponseWriter, r *http.Request) {
|
|
12
|
+
s := services.GetSession(r)
|
|
13
|
+
|
|
14
|
+
content := `<h2 class="t">Workforce</h2><p class="desc">Monitor agent schedules, workloads, and availability</p>
|
|
15
|
+
<style>
|
|
16
|
+
.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r); padding: 20px; text-align: center; }
|
|
17
|
+
.stat-icon { font-size: 24px; margin-bottom: 8px; }
|
|
18
|
+
.stat-value { font-size: 24px; font-weight: 700; color: var(--primary); margin-bottom: 4px; }
|
|
19
|
+
.stat-label { font-size: 13px; color: var(--muted); }
|
|
20
|
+
</style>
|
|
21
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-bottom: 20px;">
|
|
22
|
+
<div class="stat-card">
|
|
23
|
+
<div class="stat-icon">🤖</div>
|
|
24
|
+
<div class="stat-value">0</div>
|
|
25
|
+
<div class="stat-label">Active Agents</div>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="stat-card">
|
|
28
|
+
<div class="stat-icon">⏳</div>
|
|
29
|
+
<div class="stat-value">0</div>
|
|
30
|
+
<div class="stat-label">Pending Tasks</div>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="stat-card">
|
|
33
|
+
<div class="stat-icon">📊</div>
|
|
34
|
+
<div class="stat-value">0%</div>
|
|
35
|
+
<div class="stat-label">Utilization</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div style="margin-bottom: 20px;">
|
|
39
|
+
<button class="btn btn-p">Schedule</button>
|
|
40
|
+
<button class="btn">Workload</button>
|
|
41
|
+
<button class="btn">Analytics</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="card">
|
|
44
|
+
<div class="ct">Agent Schedule</div>
|
|
45
|
+
<div class="empty"><div class="empty-i">🕐</div>No scheduled tasks<br><small>Agent schedules and time allocations will appear here</small></div>
|
|
46
|
+
</div>
|
|
47
|
+
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 20px; margin-top: 20px;">
|
|
48
|
+
<div class="card">
|
|
49
|
+
<div class="ct">Workload Distribution</div>
|
|
50
|
+
<div class="empty"><div class="empty-i">⚖️</div>No workload data<br><small>Agent workload distribution will appear here</small></div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="card">
|
|
53
|
+
<div class="ct">Performance Metrics</div>
|
|
54
|
+
<div class="empty"><div class="empty-i">📈</div>No metrics available<br><small>Performance analytics will appear here</small></div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>`
|
|
57
|
+
|
|
58
|
+
w.Header().Set("Content-Type", "text/html")
|
|
59
|
+
fmt.Fprint(w, templates.Layout("workforce", s.User, content))
|
|
60
|
+
}
|
package/dashboards/go/main.go
CHANGED
|
@@ -49,6 +49,14 @@ func main() {
|
|
|
49
49
|
mux.HandleFunc("/settings", middleware.RequireAuth(handlers.HandleSettings))
|
|
50
50
|
mux.HandleFunc("/vault", middleware.RequireAuth(handlers.HandleVault))
|
|
51
51
|
mux.HandleFunc("/skills", middleware.RequireAuth(handlers.HandleSkills))
|
|
52
|
+
mux.HandleFunc("/activity", middleware.RequireAuth(handlers.HandleActivity))
|
|
53
|
+
mux.HandleFunc("/approvals", middleware.RequireAuth(handlers.HandleApprovals))
|
|
54
|
+
mux.HandleFunc("/community-skills", middleware.RequireAuth(handlers.HandleCommunitySkills))
|
|
55
|
+
mux.HandleFunc("/domain-status", middleware.RequireAuth(handlers.HandleDomainStatus))
|
|
56
|
+
mux.HandleFunc("/knowledge", middleware.RequireAuth(handlers.HandleKnowledge))
|
|
57
|
+
mux.HandleFunc("/knowledge-contributions", middleware.RequireAuth(handlers.HandleKnowledgeContributions))
|
|
58
|
+
mux.HandleFunc("/skill-connections", middleware.RequireAuth(handlers.HandleSkillConnections))
|
|
59
|
+
mux.HandleFunc("/workforce", middleware.RequireAuth(handlers.HandleWorkforce))
|
|
52
60
|
|
|
53
61
|
port := os.Getenv("PORT")
|
|
54
62
|
if port == "" {
|