@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.
Files changed (159) hide show
  1. package/README.md +608 -923
  2. package/dashboards/django/app.py +12 -0
  3. package/dashboards/django/static/styles.css +449 -246
  4. package/dashboards/django/templates/activity.html +130 -0
  5. package/dashboards/django/templates/approvals.html +115 -0
  6. package/dashboards/django/templates/community-skills.html +89 -0
  7. package/dashboards/django/templates/domain-status.html +59 -0
  8. package/dashboards/django/templates/knowledge-contributions.html +58 -0
  9. package/dashboards/django/templates/knowledge.html +104 -0
  10. package/dashboards/django/templates/layout.html +161 -36
  11. package/dashboards/django/templates/skill-connections.html +73 -0
  12. package/dashboards/django/templates/workforce.html +116 -0
  13. package/dashboards/django/views/__init__.py +14 -0
  14. package/dashboards/django/views/new_pages.py +38 -0
  15. package/dashboards/dotnet/Program.cs +8 -0
  16. package/dashboards/dotnet/Routes/ActivityRoutes.cs +35 -0
  17. package/dashboards/dotnet/Routes/ApprovalRoutes.cs +36 -0
  18. package/dashboards/dotnet/Routes/CommunitySkillRoutes.cs +36 -0
  19. package/dashboards/dotnet/Routes/DomainStatusRoutes.cs +49 -0
  20. package/dashboards/dotnet/Routes/KnowledgeContributionRoutes.cs +42 -0
  21. package/dashboards/dotnet/Routes/KnowledgeRoutes.cs +40 -0
  22. package/dashboards/dotnet/Routes/SkillConnectionRoutes.cs +52 -0
  23. package/dashboards/dotnet/Routes/WorkforceRoutes.cs +55 -0
  24. package/dashboards/dotnet/Services/HtmlBuilder.cs +17 -8
  25. package/dashboards/dotnet/wwwroot/styles.css +508 -246
  26. package/dashboards/express/app.js +8 -0
  27. package/dashboards/express/public/styles.css +163 -272
  28. package/dashboards/express/routes/activity.js +101 -0
  29. package/dashboards/express/routes/approvals.js +100 -0
  30. package/dashboards/express/routes/community-skills.js +83 -0
  31. package/dashboards/express/routes/domain-status.js +78 -0
  32. package/dashboards/express/routes/knowledge-contributions.js +85 -0
  33. package/dashboards/express/routes/knowledge.js +83 -0
  34. package/dashboards/express/routes/skill-connections.js +86 -0
  35. package/dashboards/express/routes/workforce.js +126 -0
  36. package/dashboards/express/views/layout.js +54 -33
  37. package/dashboards/go/handlers/activity.go +30 -0
  38. package/dashboards/go/handlers/approvals.go +31 -0
  39. package/dashboards/go/handlers/community_skills.go +32 -0
  40. package/dashboards/go/handlers/domain_status.go +62 -0
  41. package/dashboards/go/handlers/knowledge.go +35 -0
  42. package/dashboards/go/handlers/knowledge_contributions.go +37 -0
  43. package/dashboards/go/handlers/skill_connections.go +59 -0
  44. package/dashboards/go/handlers/workforce.go +60 -0
  45. package/dashboards/go/main.go +8 -0
  46. package/dashboards/go/static/styles.css +508 -246
  47. package/dashboards/go/templates/layout.go +16 -11
  48. package/dashboards/html/index.html +136 -15
  49. package/dashboards/html/public/styles.css +531 -134
  50. package/dashboards/html/src/pages/activity.js +137 -0
  51. package/dashboards/html/src/pages/approvals.js +155 -0
  52. package/dashboards/html/src/pages/community-skills.js +236 -0
  53. package/dashboards/html/src/pages/domain-status.js +182 -0
  54. package/dashboards/html/src/pages/knowledge-contributions.js +319 -0
  55. package/dashboards/html/src/pages/knowledge.js +251 -0
  56. package/dashboards/html/src/pages/skill-connections.js +293 -0
  57. package/dashboards/html/src/pages/workforce.js +418 -0
  58. package/dashboards/html/src/router.js +51 -0
  59. package/dashboards/java/AgenticMailDashboard.java +8 -0
  60. package/dashboards/java/handlers/ActivityHandler.java +42 -0
  61. package/dashboards/java/handlers/ApprovalsHandler.java +43 -0
  62. package/dashboards/java/handlers/CommunitySkillsHandler.java +45 -0
  63. package/dashboards/java/handlers/DomainStatusHandler.java +58 -0
  64. package/dashboards/java/handlers/KnowledgeContributionsHandler.java +51 -0
  65. package/dashboards/java/handlers/KnowledgeHandler.java +49 -0
  66. package/dashboards/java/handlers/SkillConnectionsHandler.java +61 -0
  67. package/dashboards/java/handlers/WorkforceHandler.java +64 -0
  68. package/dashboards/java/static/styles.css +508 -250
  69. package/dashboards/java/templates/Layout.java +14 -6
  70. package/dashboards/laravel/controllers/ActivityController.php +18 -0
  71. package/dashboards/laravel/controllers/ApprovalsController.php +18 -0
  72. package/dashboards/laravel/controllers/CommunitySkillsController.php +18 -0
  73. package/dashboards/laravel/controllers/DomainStatusController.php +18 -0
  74. package/dashboards/laravel/controllers/KnowledgeContributionsController.php +18 -0
  75. package/dashboards/laravel/controllers/KnowledgeController.php +18 -0
  76. package/dashboards/laravel/controllers/SkillConnectionsController.php +18 -0
  77. package/dashboards/laravel/controllers/WorkforceController.php +18 -0
  78. package/dashboards/laravel/index.php +56 -0
  79. package/dashboards/laravel/public/styles.css +163 -279
  80. package/dashboards/laravel/views/activity.php +127 -0
  81. package/dashboards/laravel/views/approvals.php +152 -0
  82. package/dashboards/laravel/views/community-skills.php +131 -0
  83. package/dashboards/laravel/views/domain-status.php +167 -0
  84. package/dashboards/laravel/views/knowledge-contributions.php +185 -0
  85. package/dashboards/laravel/views/knowledge.php +167 -0
  86. package/dashboards/laravel/views/layout.php +54 -41
  87. package/dashboards/laravel/views/skill-connections.php +192 -0
  88. package/dashboards/laravel/views/workforce.php +265 -0
  89. package/dashboards/php/components/layout.php +21 -16
  90. package/dashboards/php/index.php +1 -1
  91. package/dashboards/php/pages/activity.php +35 -0
  92. package/dashboards/php/pages/approvals.php +36 -0
  93. package/dashboards/php/pages/community-skills.php +39 -0
  94. package/dashboards/php/pages/domain-status.php +87 -0
  95. package/dashboards/php/pages/knowledge-contributions.php +47 -0
  96. package/dashboards/php/pages/knowledge.php +43 -0
  97. package/dashboards/php/pages/skill-connections.php +94 -0
  98. package/dashboards/php/pages/workforce.php +89 -0
  99. package/dashboards/php/public/styles.css +168 -74
  100. package/dashboards/python/app.py +16 -0
  101. package/dashboards/python/routes/activity.py +11 -0
  102. package/dashboards/python/routes/approvals.py +11 -0
  103. package/dashboards/python/routes/community_skills.py +11 -0
  104. package/dashboards/python/routes/domain_status.py +11 -0
  105. package/dashboards/python/routes/knowledge.py +11 -0
  106. package/dashboards/python/routes/knowledge_contributions.py +11 -0
  107. package/dashboards/python/routes/skill_connections.py +11 -0
  108. package/dashboards/python/routes/workforce.py +11 -0
  109. package/dashboards/python/static/styles.css +163 -276
  110. package/dashboards/python/templates/activity.html +87 -0
  111. package/dashboards/python/templates/approvals.html +86 -0
  112. package/dashboards/python/templates/community-skills.html +69 -0
  113. package/dashboards/python/templates/domain-status.html +64 -0
  114. package/dashboards/python/templates/knowledge-contributions.html +71 -0
  115. package/dashboards/python/templates/knowledge.html +69 -0
  116. package/dashboards/python/templates/layout.html +103 -68
  117. package/dashboards/python/templates/skill-connections.html +72 -0
  118. package/dashboards/python/templates/workforce.html +112 -0
  119. package/dashboards/rails/app.rb +8 -0
  120. package/dashboards/rails/public/styles.css +506 -259
  121. package/dashboards/rails/routes/activity.rb +10 -0
  122. package/dashboards/rails/routes/approvals.rb +10 -0
  123. package/dashboards/rails/routes/community_skills.rb +11 -0
  124. package/dashboards/rails/routes/domain_status.rb +16 -0
  125. package/dashboards/rails/routes/knowledge.rb +11 -0
  126. package/dashboards/rails/routes/knowledge_contributions.rb +12 -0
  127. package/dashboards/rails/routes/skill_connections.rb +15 -0
  128. package/dashboards/rails/routes/workforce.rb +16 -0
  129. package/dashboards/rails/views/activity.erb +56 -0
  130. package/dashboards/rails/views/approvals.erb +60 -0
  131. package/dashboards/rails/views/community_skills.erb +69 -0
  132. package/dashboards/rails/views/domain_status.erb +75 -0
  133. package/dashboards/rails/views/knowledge.erb +67 -0
  134. package/dashboards/rails/views/knowledge_contributions.erb +70 -0
  135. package/dashboards/rails/views/layout.erb +23 -15
  136. package/dashboards/rails/views/skill_connections.erb +109 -0
  137. package/dashboards/rails/views/workforce.erb +124 -0
  138. package/dashboards/ruby/app.rb +8 -0
  139. package/dashboards/ruby/public/styles.css +506 -254
  140. package/dashboards/ruby/routes/activity.rb +10 -0
  141. package/dashboards/ruby/routes/approvals.rb +10 -0
  142. package/dashboards/ruby/routes/community_skills.rb +11 -0
  143. package/dashboards/ruby/routes/domain_status.rb +16 -0
  144. package/dashboards/ruby/routes/knowledge.rb +11 -0
  145. package/dashboards/ruby/routes/knowledge_contributions.rb +12 -0
  146. package/dashboards/ruby/routes/skill_connections.rb +15 -0
  147. package/dashboards/ruby/routes/workforce.rb +16 -0
  148. package/dashboards/ruby/views/activity.erb +56 -0
  149. package/dashboards/ruby/views/approvals.erb +60 -0
  150. package/dashboards/ruby/views/community_skills.erb +69 -0
  151. package/dashboards/ruby/views/domain_status.erb +75 -0
  152. package/dashboards/ruby/views/knowledge.erb +67 -0
  153. package/dashboards/ruby/views/knowledge_contributions.erb +70 -0
  154. package/dashboards/ruby/views/layout.erb +22 -13
  155. package/dashboards/ruby/views/skill_connections.erb +109 -0
  156. package/dashboards/ruby/views/workforce.erb +124 -0
  157. package/dashboards/shared/styles.css +505 -281
  158. package/dashboards/shared-styles.css +534 -45
  159. package/package.json +1 -1
@@ -4,48 +4,173 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
6
6
  <title>AgenticMail Enterprise — Django</title>
7
- <style>
8
- *{box-sizing:border-box;margin:0;padding:0}:root,[data-theme=light]{--bg:#f8f9fa;--surface:#fff;--border:#dee2e6;--text:#212529;--dim:#495057;--muted:#868e96;--primary:#e84393;--success:#2b8a3e;--danger:#c92a2a;--warning:#e67700;--r:6px;color-scheme:light dark}[data-theme=dark]{--bg:#0f1114;--surface:#16181d;--border:#2c3038;--text:#e1e4e8;--dim:#b0b8c4;--muted:#6b7280;--primary:#f06595;--success:#37b24d;--danger:#f03e3e;--warning:#f08c00}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0f1114;--surface:#16181d;--border:#2c3038;--text:#e1e4e8;--dim:#b0b8c4;--muted:#6b7280;--primary:#f06595;--success:#37b24d;--danger:#f03e3e;--warning:#f08c00}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.5;font-size:14px}.layout{display:flex;min-height:100vh}.sidebar{width:240px;background:var(--surface);border-right:1px solid var(--border);position:fixed;top:0;left:0;bottom:0;display:flex;flex-direction:column}.sh{padding:20px;border-bottom:1px solid var(--border)}.sh h2{font-size:16px}.sh h2 em{font-style:normal;color:var(--primary)}.sh small{font-size:11px;color:var(--muted);display:block;margin-top:2px}.nav{flex:1;padding:8px 0}.ns{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);padding:12px 20px 4px}.nav a{display:flex;align-items:center;gap:10px;padding:10px 20px;color:var(--dim);text-decoration:none;font-size:13px}.nav a:hover{color:var(--text);background:rgba(255,255,255,.03)}.nav a.on{color:var(--primary);background:rgba(232,67,147,.12);border-right:2px solid var(--primary)}.sf{padding:16px 20px;border-top:1px solid var(--border);font-size:12px}.content{flex:1;margin-left:240px;padding:32px;max-width:1100px}h2.t{font-size:22px;font-weight:700;margin-bottom:4px}.desc{font-size:13px;color:var(--dim);margin-bottom:24px}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-bottom:24px}.stat{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:20px}.stat .l{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.stat .v{font-size:30px;font-weight:700;margin-top:4px}.card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:20px;margin-bottom:16px}.ct{font-size:13px;color:var(--dim);text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:12px}table{width:100%;border-collapse:collapse;font-size:13px}th{text-align:left;padding:10px 12px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--border)}td{padding:12px;border-bottom:1px solid var(--border)}.badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600}.b-a{background:rgba(34,197,94,.12);color:var(--success)}.b-r{background:rgba(136,136,160,.1);color:var(--dim)}.b-w{background:rgba(245,158,11,.12);color:var(--warning)}.b-p{background:rgba(232,67,147,.12);color:var(--primary)}.b-blue{background:rgba(59,130,246,.12);color:#3b82f6}.b-info{background:rgba(6,182,212,.12);color:#06b6d4}.b-neutral{background:rgba(136,136,160,.08);color:var(--muted)}.empty{text-align:center;padding:48px 20px;color:var(--muted)}.btn{display:inline-flex;align-items:center;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--border);background:var(--surface);color:var(--text);text-decoration:none}.btn-p{background:var(--primary);border-color:var(--primary);color:#fff}.btn-d{color:var(--danger);border-color:var(--danger)}.btn-sm{padding:4px 10px;font-size:12px}.input{width:100%;padding:10px 14px;background:var(--bg);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:14px;outline:none}.input:focus{border-color:var(--primary)}.fg{margin-bottom:14px}.fl{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weight:500}.flash{padding:12px 16px;border-radius:8px;margin-bottom:16px;font-size:13px;background:rgba(34,197,94,.1);border:1px solid var(--success);color:var(--success)}.flash-err{background:rgba(239,68,68,.1);border-color:var(--danger);color:var(--danger)}
9
- </style>
7
+ <link rel="stylesheet" href="/static/styles.css">
10
8
  </head>
11
9
  <body>
12
- <div class="layout">
10
+ <div class="app-layout">
13
11
  <div class="sidebar">
14
- <div class="sh"><h2>&#x1f3e2; <em>Agentic</em>Mail</h2><small>Enterprise &middot; Django</small></div>
15
- <div class="nav">
16
- <div class="ns">Overview</div>
17
- <a href="/" class="{% if page_name == 'dashboard' %}on{% endif %}">&#x1f4ca; <span>Dashboard</span></a>
18
- <div class="ns">Manage</div>
19
- <a href="/agents" class="{% if page_name == 'agents' %}on{% endif %}">&#x1f916; <span>Agents</span></a>
20
- <a href="/users" class="{% if page_name == 'users' %}on{% endif %}">&#x1f465; <span>Users</span></a>
21
- <a href="/api-keys" class="{% if page_name == 'keys' %}on{% endif %}">&#x1f511; <span>API Keys</span></a>
22
- <a href="/vault" class="{% if page_name == 'vault' %}on{% endif %}">&#x1f510; <span>Vault</span></a>
23
- <a href="/skills" class="{% if page_name == 'skills' %}on{% endif %}">&#x1f9e9; <span>Skills</span></a>
24
- <div class="ns">Management</div>
25
- <a href="/messages" class="{% if page_name == 'messages' %}on{% endif %}">&#x1f4e8; <span>Messages</span></a>
26
- <a href="/guardrails" class="{% if page_name == 'guardrails' %}on{% endif %}">&#x1f6e1; <span>Guardrails</span></a>
27
- <a href="/journal" class="{% if page_name == 'journal' %}on{% endif %}">&#x1f4d3; <span>Journal</span></a>
28
- <div class="ns">System</div>
29
- <a href="/audit" class="{% if page_name == 'audit' %}on{% endif %}">&#x1f4cb; <span>Audit Log</span></a>
30
- <a href="/dlp" class="{% if page_name == 'dlp' %}on{% endif %}">&#x1f512; <span>DLP</span></a>
31
- <a href="/compliance" class="{% if page_name == 'compliance' %}on{% endif %}">&#x1f4c4; <span>Compliance</span></a>
32
- <a href="/settings" class="{% if page_name == 'settings' %}on{% endif %}">&#x2699;&#xfe0f; <span>Settings</span></a>
12
+ <div class="sidebar-brand">
13
+ <h2>AgenticMail</h2>
14
+ <p>Enterprise</p>
33
15
  </div>
34
- <div class="sf">
35
- <div style="color:var(--dim)">{{ user.name }}</div>
36
- <div style="color:var(--muted);font-size:11px">{{ user.email }}</div>
37
- <a href="/logout" style="color:var(--muted);font-size:11px;margin-top:6px;display:inline-block">Sign out</a>
16
+ <div class="sidebar-nav">
17
+ <div class="sidebar-section">
18
+ <div class="sidebar-section-title">Overview</div>
19
+ <a href="/" class="nav-item {% if page_name == 'dashboard' %}active{% endif %}">
20
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
21
+ <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/>
22
+ </svg>
23
+ <span>Dashboard</span>
24
+ </a>
25
+ </div>
26
+
27
+ <div class="sidebar-section">
28
+ <div class="sidebar-section-title">Management</div>
29
+ <a href="/agents" class="nav-item {% if page_name == 'agents' %}active{% endif %}">
30
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
31
+ <path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10z"/>
32
+ </svg>
33
+ <span>Agents</span>
34
+ </a>
35
+ <a href="/skills" class="nav-item {% if page_name == 'skills' %}active{% endif %}">
36
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
37
+ <path d="M5.5 2A3.5 3.5 0 0 0 2 5.5v5A3.5 3.5 0 0 0 5.5 14h5a3.5 3.5 0 0 0 3.5-3.5V8a.5.5 0 0 1 1 0v2.5a4.5 4.5 0 0 1-4.5 4.5h-5A4.5 4.5 0 0 1 1 10.5v-5A4.5 4.5 0 0 1 5.5 1H8a.5.5 0 0 1 0 1H5.5z"/>
38
+ </svg>
39
+ <span>Skills</span>
40
+ </a>
41
+ <a href="/community-skills" class="nav-item {% if page_name == 'community-skills' %}active{% endif %}">
42
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
43
+ <path d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zM1.5 8a6.5 6.5 0 1 1 13 0 6.5 6.5 0 0 1-13 0z"/>
44
+ </svg>
45
+ <span>Community Skills</span>
46
+ </a>
47
+ <a href="/skill-connections" class="nav-item {% if page_name == 'skill-connections' %}active{% endif %}">
48
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
49
+ <path d="M4.715 6.542 3.248 7.17a.5.5 0 1 1-.4-.8l1.838-.918a.5.5 0 0 1 .478.011l1.06.53H8.5a.5.5 0 0 1 0 1H6.086l-1.371-.458z"/>
50
+ </svg>
51
+ <span>Skill Connections</span>
52
+ </a>
53
+ <a href="/knowledge" class="nav-item {% if page_name == 'knowledge' %}active{% endif %}">
54
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
55
+ <path d="M1 2.828c.885-.37 2.154-.769 3.388-.893 1.33-.134 2.458.063 3.112.752v9.746c-.935-.53-2.12-.603-3.213-.493-1.18.12-2.37.461-3.287.811V2.828zm7.5-.141c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/>
56
+ </svg>
57
+ <span>Knowledge Bases</span>
58
+ </a>
59
+ <a href="/knowledge-contributions" class="nav-item {% if page_name == 'knowledge-contributions' %}active{% endif %}">
60
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
61
+ <path d="M1 2.828c.885-.37 2.154-.769 3.388-.893 1.33-.134 2.458.063 3.112.752v9.746c-.935-.53-2.12-.603-3.213-.493-1.18.12-2.37.461-3.287.811V2.828zm7.5-.141c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/>
62
+ </svg>
63
+ <span>Knowledge Hub</span>
64
+ </a>
65
+ <a href="/approvals" class="nav-item {% if page_name == 'approvals' %}active{% endif %}">
66
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
67
+ <path d="M8.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.061L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z"/>
68
+ </svg>
69
+ <span>Approvals</span>
70
+ </a>
71
+ </div>
72
+
73
+ <div class="sidebar-section">
74
+ <div class="sidebar-section-title">Operations</div>
75
+ <a href="/workforce" class="nav-item {% if page_name == 'workforce' %}active{% endif %}">
76
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
77
+ <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
78
+ </svg>
79
+ <span>Workforce</span>
80
+ </a>
81
+ <a href="/activity" class="nav-item {% if page_name == 'activity' %}active{% endif %}">
82
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
83
+ <path d="M1.5 1.5A.5.5 0 0 0 1 2v4.8a2.5 2.5 0 0 0 2.5 2.5h9A2.5 2.5 0 0 0 15 6.8V2a.5.5 0 0 0-.5-.5h-13zM1 10.5A1.5 1.5 0 0 1 2.5 9h1A1.5 1.5 0 0 1 5 10.5v1A1.5 1.5 0 0 1 3.5 13h-1A1.5 1.5 0 0 1 1 11.5v-1zm6.5-9a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm2 0a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm2 0a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0z"/>
84
+ </svg>
85
+ <span>Activity</span>
86
+ </a>
87
+ <a href="/messages" class="nav-item {% if page_name == 'messages' %}active{% endif %}">
88
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
89
+ <path d="M5 8a.5.5 0 0 1-.5-.5V5.707l2.146 2.147a.5.5 0 0 0 .708 0L9.5 5.707V7.5a.5.5 0 0 1-1 0V4.5A1.5 1.5 0 0 1 10 3h3a1.5 1.5 0 0 1 1.5 1.5v7A1.5 1.5 0 0 1 13 13H3a1.5 1.5 0 0 1-1.5-1.5V4.5A1.5 1.5 0 0 1 3 3h3a1.5 1.5 0 0 1 1.5 1.5V7.5A.5.5 0 0 1 7 8H5z"/>
90
+ </svg>
91
+ <span>Messages</span>
92
+ </a>
93
+ <a href="/guardrails" class="nav-item {% if page_name == 'guardrails' %}active{% endif %}">
94
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
95
+ <path d="M5.338 1.59a61.44 61.44 0 0 0-2.837.856.481.481 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.725 10.725 0 0 0 2.287 2.233c.346.244.652.42.893.533.12.057.218.095.293.118a.55.55 0 0 0 .101.025.615.615 0 0 0 .1-.025c.076-.023.174-.061.294-.118.24-.113.547-.29.893-.533a10.726 10.726 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.775 11.775 0 0 1-2.517 2.453 7.159 7.159 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7.158 7.158 0 0 1-1.048-.625 11.777 11.777 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 62.456 62.456 0 0 1 5.072.56z"/>
96
+ </svg>
97
+ <span>Guardrails</span>
98
+ </a>
99
+ <a href="/journal" class="nav-item {% if page_name == 'journal' %}active{% endif %}">
100
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
101
+ <path d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z"/>
102
+ </svg>
103
+ <span>Journal</span>
104
+ </a>
105
+ </div>
106
+
107
+ <div class="sidebar-section">
108
+ <div class="sidebar-section-title">Administration</div>
109
+ <a href="/dlp" class="nav-item {% if page_name == 'dlp' %}active{% endif %}">
110
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
111
+ <path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10.24 8.051a.5.5 0 0 0-.128.334v2.115l-2.222 1.112a.5.5 0 0 1-.778-.416V8.385a.5.5 0 0 0-.128-.334L2.128 3.84A.5.5 0 0 1 2 3.5v-2z"/>
112
+ </svg>
113
+ <span>DLP</span>
114
+ </a>
115
+ <a href="/compliance" class="nav-item {% if page_name == 'compliance' %}active{% endif %}">
116
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
117
+ <path d="M9.669.864 8 0 6.331.864l-1.858.282-.842 1.68-1.337 1.32L2.6 6l-.306 1.854 1.337 1.32.842 1.68 1.858.282L8 16l1.669-.864 1.858-.282.842-1.68 1.337-1.32L13.4 10l.306-1.854-1.337-1.32-.842-1.68L9.669.864zm1.196 1.193.684 1.365 1.086 1.072L12.387 6l.248 1.506-1.086 1.072-.684 1.365-1.51.229L8 10.874l-1.355-.702-1.51-.229-.684-1.365-1.086-1.072L3.614 6l-.25-1.506 1.087-1.072.684-1.365 1.51-.229L8 1.126l1.356.702 1.509.229z"/>
118
+ </svg>
119
+ <span>Compliance</span>
120
+ </a>
121
+ <a href="/domain-status" class="nav-item {% if page_name == 'domain-status' %}active{% endif %}">
122
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
123
+ <path d="M5.338 1.59a61.44 61.44 0 0 0-2.837.856.481.481 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.725 10.725 0 0 0 2.287 2.233c.346.244.652.42.893.533.12.057.218.095.293.118a.55.55 0 0 0 .101.025.615.615 0 0 0 .1-.025c.076-.023.174-.061.294-.118.24-.113.547-.29.893-.533a10.726 10.726 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.775 11.775 0 0 1-2.517 2.453 7.159 7.159 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7.158 7.158 0 0 1-1.048-.625 11.777 11.777 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 62.456 62.456 0 0 1 5.072.56z"/>
124
+ </svg>
125
+ <span>Domain</span>
126
+ </a>
127
+ <a href="/users" class="nav-item {% if page_name == 'users' %}active{% endif %}">
128
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
129
+ <path d="M7 14s-1 0-1-1 1-4 5-4 5 3 5 4-1 1-1 1H7zm4-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/>
130
+ </svg>
131
+ <span>Users</span>
132
+ </a>
133
+ <a href="/vault" class="nav-item {% if page_name == 'vault' %}active{% endif %}">
134
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
135
+ <path d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z"/>
136
+ </svg>
137
+ <span>Vault</span>
138
+ </a>
139
+ <a href="/audit" class="nav-item {% if page_name == 'audit' %}active{% endif %}">
140
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
141
+ <path d="M8.5 5.5a.5.5 0 0 0-1 0v3.362l-1.429 2.38a.5.5 0 1 0 .858.515l1.5-2.5A.5.5 0 0 0 8.5 9V5.5z"/>
142
+ </svg>
143
+ <span>Audit Log</span>
144
+ </a>
145
+ <a href="/settings" class="nav-item {% if page_name == 'settings' %}active{% endif %}">
146
+ <svg width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
147
+ <path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"/>
148
+ </svg>
149
+ <span>Settings</span>
150
+ </a>
151
+ </div>
152
+ </div>
153
+ <div class="sidebar-footer">
154
+ <div class="sidebar-user">
155
+ <div class="avatar">{{ user.name.0|default:'A'|upper }}</div>
156
+ <div class="user-info">
157
+ <div class="user-name">{{ user.name|default:user.email }}</div>
158
+ <div class="user-role">{{ user.role|default:'admin' }}</div>
159
+ </div>
160
+ </div>
38
161
  </div>
39
162
  </div>
40
- <div class="content">
41
- {% if flash_msg %}
42
- {% if 'error' in flash_msg|lower or 'failed' in flash_msg|lower %}
43
- <div class="flash flash-err">{{ flash_msg }}</div>
44
- {% else %}
45
- <div class="flash">{{ flash_msg }}</div>
46
- {% endif %}
47
- {% endif %}
48
- {% block content %}{% endblock %}
163
+ <div class="main-content">
164
+ <div class="page-content">
165
+ {% if flash_msg %}
166
+ {% if 'error' in flash_msg|lower or 'failed' in flash_msg|lower %}
167
+ <div class="alert alert-error">{{ flash_msg }}</div>
168
+ {% else %}
169
+ <div class="alert alert-success">{{ flash_msg }}</div>
170
+ {% endif %}
171
+ {% endif %}
172
+ {% block content %}{% endblock %}
173
+ </div>
49
174
  </div>
50
175
  </div>
51
176
  </body>
@@ -0,0 +1,73 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="page-title">Skill Connections</div>
5
+
6
+ <div class="stat-grid">
7
+ <div class="stat-card">
8
+ <div class="stat-label">Active Connections</div>
9
+ <div class="stat-value">156</div>
10
+ <div class="stat-change" style="color: var(--success)">+8 this week</div>
11
+ </div>
12
+ <div class="stat-card">
13
+ <div class="stat-label">Skill Networks</div>
14
+ <div class="stat-value">23</div>
15
+ <div class="stat-change" style="color: var(--success)">+2 new</div>
16
+ </div>
17
+ <div class="stat-card">
18
+ <div class="stat-label">Connection Health</div>
19
+ <div class="stat-value" style="color: var(--success)">98%</div>
20
+ <div class="stat-change" style="color: var(--success)">Excellent</div>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="card">
25
+ <div class="card-header">
26
+ <h3>Connection Map</h3>
27
+ <button class="btn btn-secondary">View Network</button>
28
+ </div>
29
+ <div class="card-body">
30
+ <div style="background: var(--bg-tertiary); border-radius: var(--radius); padding: 40px; text-align: center; margin-bottom: 24px;">
31
+ <div style="font-size: 14px; color: var(--text-muted); margin-bottom: 16px;">
32
+ Interactive skill connection visualization would be displayed here
33
+ </div>
34
+ <button class="btn btn-secondary">Launch Network Viewer</button>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="card">
40
+ <div class="card-header">
41
+ <h3>Active Connections</h3>
42
+ </div>
43
+ <div class="card-body">
44
+ <table>
45
+ <thead>
46
+ <tr>
47
+ <th>Connection</th>
48
+ <th>Skill</th>
49
+ <th>Type</th>
50
+ <th>Usage</th>
51
+ <th>Status</th>
52
+ </tr>
53
+ </thead>
54
+ <tbody>
55
+ <tr>
56
+ <td>Alice ↔ Bob</td>
57
+ <td>Data Analytics</td>
58
+ <td><span class="badge badge-primary">Bidirectional</span></td>
59
+ <td>847 calls</td>
60
+ <td><span class="badge badge-success">Active</span></td>
61
+ </tr>
62
+ <tr>
63
+ <td>Bob → Charlie</td>
64
+ <td>API Integration</td>
65
+ <td><span class="badge badge-info">Unidirectional</span></td>
66
+ <td>234 calls</td>
67
+ <td><span class="badge badge-success">Active</span></td>
68
+ </tr>
69
+ </tbody>
70
+ </table>
71
+ </div>
72
+ </div>
73
+ {% endblock %}
@@ -0,0 +1,116 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="page-title">Agent Workforce</div>
5
+
6
+ <div class="stat-grid">
7
+ <div class="stat-card">
8
+ <div class="stat-label">Active Agents</div>
9
+ <div class="stat-value">24</div>
10
+ <div class="stat-change" style="color: var(--success)">+3 this week</div>
11
+ </div>
12
+ <div class="stat-card">
13
+ <div class="stat-label">CPU Usage</div>
14
+ <div class="stat-value">67%</div>
15
+ <div class="stat-change" style="color: var(--warning)">Moderate load</div>
16
+ </div>
17
+ <div class="stat-card">
18
+ <div class="stat-label">Tasks Completed</div>
19
+ <div class="stat-value">1,847</div>
20
+ <div class="stat-change" style="color: var(--success)">+18% today</div>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="card">
25
+ <div class="card-header">
26
+ <h3>Agent Fleet</h3>
27
+ <div>
28
+ <button class="btn btn-secondary">Start All</button>
29
+ <button class="btn btn-secondary" style="margin-left: 8px;">Stop All</button>
30
+ </div>
31
+ </div>
32
+ <div class="card-body">
33
+ <table>
34
+ <thead>
35
+ <tr>
36
+ <th>Agent</th>
37
+ <th>Department</th>
38
+ <th>Status</th>
39
+ <th>Tasks</th>
40
+ <th>CPU</th>
41
+ <th>Uptime</th>
42
+ <th>Actions</th>
43
+ </tr>
44
+ </thead>
45
+ <tbody>
46
+ <tr>
47
+ <td>
48
+ <div style="display: flex; align-items: center; gap: 8px;">
49
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">A1</div>
50
+ Alice Support
51
+ </div>
52
+ </td>
53
+ <td><span class="badge badge-primary">Customer Support</span></td>
54
+ <td>
55
+ <div style="display: flex; align-items: center; gap: 6px;">
56
+ <div style="width: 8px; height: 8px; border-radius: 50%; background: var(--success);"></div>
57
+ <span class="status-running">Running</span>
58
+ </div>
59
+ </td>
60
+ <td>247 completed</td>
61
+ <td>45%</td>
62
+ <td>12h 34m</td>
63
+ <td>
64
+ <button class="btn btn-sm btn-secondary" style="margin-right: 4px;">View</button>
65
+ <button class="btn btn-sm btn-danger">Stop</button>
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <td>
70
+ <div style="display: flex; align-items: center; gap: 8px;">
71
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--success-soft); color: var(--success); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">B1</div>
72
+ Bob Analytics
73
+ </div>
74
+ </td>
75
+ <td><span class="badge badge-info">Operations</span></td>
76
+ <td>
77
+ <div style="display: flex; align-items: center; gap: 6px;">
78
+ <div style="width: 8px; height: 8px; border-radius: 50%; background: var(--success);"></div>
79
+ <span class="status-running">Running</span>
80
+ </div>
81
+ </td>
82
+ <td>189 completed</td>
83
+ <td>78%</td>
84
+ <td>8h 12m</td>
85
+ <td>
86
+ <button class="btn btn-sm btn-secondary" style="margin-right: 4px;">View</button>
87
+ <button class="btn btn-sm btn-danger">Stop</button>
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td>
92
+ <div style="display: flex; align-items: center; gap: 8px;">
93
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--warning-soft); color: var(--warning); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">C1</div>
94
+ Charlie Sales
95
+ </div>
96
+ </td>
97
+ <td><span class="badge badge-success">Sales</span></td>
98
+ <td>
99
+ <div style="display: flex; align-items: center; gap: 6px;">
100
+ <div style="width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted);"></div>
101
+ <span class="status-stopped">Idle</span>
102
+ </div>
103
+ </td>
104
+ <td>34 completed</td>
105
+ <td>12%</td>
106
+ <td>15h 45m</td>
107
+ <td>
108
+ <button class="btn btn-sm" style="background: var(--success); color: white; margin-right: 4px;">Start</button>
109
+ <button class="btn btn-sm btn-secondary">View</button>
110
+ </td>
111
+ </tr>
112
+ </tbody>
113
+ </table>
114
+ </div>
115
+ </div>
116
+ {% endblock %}
@@ -16,6 +16,11 @@ from views.messages import messages_view
16
16
  from views.compliance import compliance_view
17
17
  from views.vault import vault_view
18
18
  from views.skills import skills_view
19
+ # New pages
20
+ from views.new_pages import (
21
+ activity_view, approvals_view, community_skills_view, domain_status_view,
22
+ knowledge_view, knowledge_contributions_view, skill_connections_view, workforce_view
23
+ )
19
24
 
20
25
  __all__ = [
21
26
  'login_view',
@@ -35,4 +40,13 @@ __all__ = [
35
40
  'compliance_view',
36
41
  'vault_view',
37
42
  'skills_view',
43
+ # New pages
44
+ 'activity_view',
45
+ 'approvals_view',
46
+ 'community_skills_view',
47
+ 'domain_status_view',
48
+ 'knowledge_view',
49
+ 'knowledge_contributions_view',
50
+ 'skill_connections_view',
51
+ 'workforce_view',
38
52
  ]
@@ -0,0 +1,38 @@
1
+ """
2
+ Views for new pages added to match main dashboard
3
+ """
4
+ from django.shortcuts import render
5
+ from utils.api import api_call
6
+ from utils.auth import require_auth
7
+
8
+ @require_auth
9
+ def activity_view(request):
10
+ return render(request, 'activity.html', {'page_name': 'activity'})
11
+
12
+ @require_auth
13
+ def approvals_view(request):
14
+ return render(request, 'approvals.html', {'page_name': 'approvals'})
15
+
16
+ @require_auth
17
+ def community_skills_view(request):
18
+ return render(request, 'community-skills.html', {'page_name': 'community-skills'})
19
+
20
+ @require_auth
21
+ def domain_status_view(request):
22
+ return render(request, 'domain-status.html', {'page_name': 'domain-status'})
23
+
24
+ @require_auth
25
+ def knowledge_view(request):
26
+ return render(request, 'knowledge.html', {'page_name': 'knowledge'})
27
+
28
+ @require_auth
29
+ def knowledge_contributions_view(request):
30
+ return render(request, 'knowledge-contributions.html', {'page_name': 'knowledge-contributions'})
31
+
32
+ @require_auth
33
+ def skill_connections_view(request):
34
+ return render(request, 'skill-connections.html', {'page_name': 'skill-connections'})
35
+
36
+ @require_auth
37
+ def workforce_view(request):
38
+ return render(request, 'workforce.html', {'page_name': 'workforce'})
@@ -67,6 +67,14 @@ JournalRoutes.Map(app);
67
67
  SettingRoutes.Map(app);
68
68
  VaultRoutes.Map(app);
69
69
  SkillRoutes.Map(app);
70
+ ActivityRoutes.Map(app);
71
+ ApprovalRoutes.Map(app);
72
+ CommunitySkillRoutes.Map(app);
73
+ DomainStatusRoutes.Map(app);
74
+ KnowledgeRoutes.Map(app);
75
+ KnowledgeContributionRoutes.Map(app);
76
+ SkillConnectionRoutes.Map(app);
77
+ WorkforceRoutes.Map(app);
70
78
 
71
79
  // --- Start ---
72
80
  var port = Environment.GetEnvironmentVariable("PORT") ?? "5002";
@@ -0,0 +1,35 @@
1
+ using AgenticMailDashboard.Services;
2
+ using static AgenticMailDashboard.Services.HtmlBuilder;
3
+
4
+ namespace AgenticMailDashboard.Routes;
5
+
6
+ public static class ActivityRoutes
7
+ {
8
+ public static void Map(WebApplication app)
9
+ {
10
+ app.MapGet("/activity", (HttpContext ctx) =>
11
+ {
12
+ var html = @"<div class='page-header'>
13
+ <h1>Activity</h1>
14
+ <p>Real-time activity and tool usage across all agents</p>
15
+ </div>
16
+
17
+ <div style='margin-bottom:20px'>
18
+ <button class='btn btn-primary' onclick=""location.href='#events'"">Events</button>
19
+ <button class='btn' onclick=""location.href='#tools'"">Tool Calls</button>
20
+ </div>
21
+
22
+ <div class='card'>
23
+ <h3>Recent Events</h3>
24
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#128203;</div>No events recorded<br><small>Agent activity will appear here</small></div>
25
+ </div>
26
+
27
+ <div class='card'>
28
+ <h3>Tool Usage</h3>
29
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#128295;</div>No tool calls recorded<br><small>Tool usage statistics will appear here</small></div>
30
+ </div>";
31
+
32
+ return Results.Content(Page(ctx, "/activity", html), "text/html");
33
+ });
34
+ }
35
+ }
@@ -0,0 +1,36 @@
1
+ using AgenticMailDashboard.Services;
2
+ using static AgenticMailDashboard.Services.HtmlBuilder;
3
+
4
+ namespace AgenticMailDashboard.Routes;
5
+
6
+ public static class ApprovalRoutes
7
+ {
8
+ public static void Map(WebApplication app)
9
+ {
10
+ app.MapGet("/approvals", (HttpContext ctx) =>
11
+ {
12
+ var html = @"<div class='page-header'>
13
+ <h1>Approvals</h1>
14
+ <p>Review and manage pending approval requests</p>
15
+ </div>
16
+
17
+ <div style='margin-bottom:20px'>
18
+ <button class='btn btn-primary'>Pending</button>
19
+ <button class='btn'>Approved</button>
20
+ <button class='btn'>Rejected</button>
21
+ </div>
22
+
23
+ <div class='card'>
24
+ <h3>Pending Approvals</h3>
25
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#9989;</div>No pending approvals<br><small>Agent approval requests will appear here</small></div>
26
+ </div>
27
+
28
+ <div class='card'>
29
+ <h3>Approval History</h3>
30
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#128203;</div>No approval history<br><small>Past approvals and rejections will appear here</small></div>
31
+ </div>";
32
+
33
+ return Results.Content(Page(ctx, "/approvals", html), "text/html");
34
+ });
35
+ }
36
+ }
@@ -0,0 +1,36 @@
1
+ using AgenticMailDashboard.Services;
2
+ using static AgenticMailDashboard.Services.HtmlBuilder;
3
+
4
+ namespace AgenticMailDashboard.Routes;
5
+
6
+ public static class CommunitySkillRoutes
7
+ {
8
+ public static void Map(WebApplication app)
9
+ {
10
+ app.MapGet("/community-skills", (HttpContext ctx) =>
11
+ {
12
+ var html = @"<div class='page-header'>
13
+ <h1>Community Skills</h1>
14
+ <p>Browse and install skills shared by the community</p>
15
+ </div>
16
+
17
+ <div class='card'>
18
+ <h3>Featured Skills</h3>
19
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#127978;</div>No community skills available<br><small>Community-shared skills will appear here</small></div>
20
+ </div>
21
+
22
+ <div style='display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px'>
23
+ <div class='card'>
24
+ <h3>Popular Categories</h3>
25
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#127991;&#65039;</div>No categories</div>
26
+ </div>
27
+ <div class='card'>
28
+ <h3>My Contributions</h3>
29
+ <div class='empty-state'><div style='font-size:36px;margin-bottom:10px'>&#128228;</div>No contributions</div>
30
+ </div>
31
+ </div>";
32
+
33
+ return Results.Content(Page(ctx, "/community-skills", html), "text/html");
34
+ });
35
+ }
36
+ }