@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
@@ -0,0 +1,94 @@
1
+ <?php
2
+ /**
3
+ * Skill Connections Page — Manage skill relationships and dependencies
4
+ */
5
+
6
+ layout_start('Skill Connections', 'skill-connections');
7
+ ?>
8
+
9
+ <h2 class="title">Skill Connections</h2>
10
+ <p class="desc">Visualize and manage relationships between skills</p>
11
+
12
+ <div style="margin-bottom: 20px;">
13
+ <button class="btn btn-primary">+ Create Connection</button>
14
+ <button class="btn btn-secondary" style="margin-left: 10px;">View Network</button>
15
+ </div>
16
+
17
+ <div class="card">
18
+ <div class="card-t">Skill Network Overview</div>
19
+ <div class="empty">
20
+ <div class="empty-i">🔗</div>
21
+ <p>No skill connections configured</p>
22
+ <small>Create connections between skills to enable complex workflows</small>
23
+ </div>
24
+ </div>
25
+
26
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
27
+ <div class="card">
28
+ <div class="card-t">Connection Types</div>
29
+ <div style="padding: 20px;">
30
+ <div class="connection-type">
31
+ <span class="connection-indicator depends"></span>
32
+ <span>Dependencies</span>
33
+ <span class="badge">0</span>
34
+ </div>
35
+ <div class="connection-type">
36
+ <span class="connection-indicator enhances"></span>
37
+ <span>Enhancements</span>
38
+ <span class="badge">0</span>
39
+ </div>
40
+ <div class="connection-type">
41
+ <span class="connection-indicator conflicts"></span>
42
+ <span>Conflicts</span>
43
+ <span class="badge">0</span>
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+ <div class="card">
49
+ <div class="card-t">Recent Changes</div>
50
+ <div class="empty">
51
+ <div class="empty-i">📋</div>
52
+ <p>No recent changes</p>
53
+ <small>Connection updates will appear here</small>
54
+ </div>
55
+ </div>
56
+ </div>
57
+
58
+ <style>
59
+ .connection-type {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 12px;
63
+ padding: 12px 0;
64
+ border-bottom: 1px solid var(--border);
65
+ }
66
+ .connection-type:last-child {
67
+ border-bottom: none;
68
+ }
69
+ .connection-indicator {
70
+ width: 12px;
71
+ height: 12px;
72
+ border-radius: 3px;
73
+ flex-shrink: 0;
74
+ }
75
+ .connection-indicator.depends {
76
+ background: var(--info);
77
+ }
78
+ .connection-indicator.enhances {
79
+ background: var(--success);
80
+ }
81
+ .connection-indicator.conflicts {
82
+ background: var(--warning);
83
+ }
84
+ .connection-type .badge {
85
+ margin-left: auto;
86
+ background: var(--bg-tertiary);
87
+ color: var(--text-muted);
88
+ padding: 2px 8px;
89
+ border-radius: 12px;
90
+ font-size: 12px;
91
+ }
92
+ </style>
93
+
94
+ <?php layout_end(); ?>
@@ -0,0 +1,89 @@
1
+ <?php
2
+ /**
3
+ * Workforce Page — Agent scheduling and workload management
4
+ */
5
+
6
+ layout_start('Workforce', 'workforce');
7
+ ?>
8
+
9
+ <h2 class="title">Workforce</h2>
10
+ <p class="desc">Monitor agent schedules, workloads, and availability</p>
11
+
12
+ <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-bottom: 20px;">
13
+ <div class="stat-card">
14
+ <div class="stat-icon">🤖</div>
15
+ <div class="stat-value">0</div>
16
+ <div class="stat-label">Active Agents</div>
17
+ </div>
18
+ <div class="stat-card">
19
+ <div class="stat-icon">⏳</div>
20
+ <div class="stat-value">0</div>
21
+ <div class="stat-label">Pending Tasks</div>
22
+ </div>
23
+ <div class="stat-card">
24
+ <div class="stat-icon">📊</div>
25
+ <div class="stat-value">0%</div>
26
+ <div class="stat-label">Utilization</div>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="tabs">
31
+ <div class="tab active">Schedule</div>
32
+ <div class="tab">Workload</div>
33
+ <div class="tab">Analytics</div>
34
+ </div>
35
+
36
+ <div class="card">
37
+ <div class="card-t">Agent Schedule</div>
38
+ <div class="empty">
39
+ <div class="empty-i">🕐</div>
40
+ <p>No scheduled tasks</p>
41
+ <small>Agent schedules and time allocations will appear here</small>
42
+ </div>
43
+ </div>
44
+
45
+ <div style="display: grid; grid-template-columns: 2fr 1fr; gap: 20px; margin-top: 20px;">
46
+ <div class="card">
47
+ <div class="card-t">Workload Distribution</div>
48
+ <div class="empty">
49
+ <div class="empty-i">⚖️</div>
50
+ <p>No workload data</p>
51
+ <small>Agent workload distribution will appear here</small>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="card">
56
+ <div class="card-t">Performance Metrics</div>
57
+ <div class="empty">
58
+ <div class="empty-i">📈</div>
59
+ <p>No metrics available</p>
60
+ <small>Performance analytics will appear here</small>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <style>
66
+ .stat-card {
67
+ background: var(--bg-card);
68
+ border: 1px solid var(--border);
69
+ border-radius: var(--radius);
70
+ padding: 20px;
71
+ text-align: center;
72
+ }
73
+ .stat-icon {
74
+ font-size: 24px;
75
+ margin-bottom: 8px;
76
+ }
77
+ .stat-value {
78
+ font-size: 24px;
79
+ font-weight: 700;
80
+ color: var(--accent-text);
81
+ margin-bottom: 4px;
82
+ }
83
+ .stat-label {
84
+ font-size: 13px;
85
+ color: var(--text-muted);
86
+ }
87
+ </style>
88
+
89
+ <?php layout_end(); ?>
@@ -1,81 +1,175 @@
1
1
  /*
2
- * AgenticMail Enterprise Dashboard — PHP Edition Styles
3
- * Combines the original inline styles with the shared design system.
2
+ * AgenticMail Enterprise Dashboard — Professional Theme
3
+ * Updated to match main React dashboard styling
4
+ * Professional dark theme with indigo accents
4
5
  */
5
6
 
6
- /* ─── Theme Variables ─────────────────────────────────── */
7
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
8
- :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; }}
7
+ /* ═══════════════════════════════════════════════════════════
8
+ THEME SYSTEM CSS Custom Properties
9
+ ═══════════════════════════════════════════════════════════ */
10
+ :root {
11
+ --bg-primary: #0f1117;
12
+ --bg-secondary: #161822;
13
+ --bg-tertiary: #1c1f2e;
14
+ --bg-hover: #232738;
15
+ --bg-active: #2a2f45;
16
+ --bg-card: #181b28;
17
+ --bg-input: #1c1f2e;
18
+ --bg-modal: rgba(0,0,0,0.7);
19
+ --border: #2a2f45;
20
+ --border-light: #353a52;
21
+ --text-primary: #e8eaf0;
22
+ --text-secondary: #9ca3b8;
23
+ --text-muted: #6b7394;
24
+ --text-inverse: #0f1117;
25
+ --accent: #6366f1;
26
+ --accent-hover: #4f46e5;
27
+ --accent-soft: rgba(99,102,241,0.12);
28
+ --accent-text: #818cf8;
29
+ --success: #22c55e;
30
+ --success-soft: rgba(34,197,94,0.12);
31
+ --warning: #f59e0b;
32
+ --warning-soft: rgba(245,158,11,0.12);
33
+ --danger: #ef4444;
34
+ --danger-soft: rgba(239,68,68,0.12);
35
+ --danger-hover: #dc2626;
36
+ --info: #06b6d4;
37
+ --info-soft: rgba(6,182,212,0.12);
38
+ --radius: 8px;
39
+ --radius-lg: 12px;
40
+ --radius-xl: 16px;
41
+ --shadow: 0 1px 3px rgba(0,0,0,0.3);
42
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.4);
43
+ --shadow-xl: 0 8px 24px rgba(0,0,0,0.5);
44
+ --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
45
+ --font-mono: 'SF Mono', 'Fira Code', monospace;
46
+ --sidebar-w: 260px;
47
+ --sidebar-collapsed-w: 64px;
48
+ --sidebar-transition: width 200ms ease, box-shadow 200ms ease;
49
+ --header-h: 56px;
50
+ --transition: 150ms ease;
51
+ }
52
+
53
+ [data-theme="light"] {
54
+ --bg-primary: #f8f9fb;
55
+ --bg-secondary: #ffffff;
56
+ --bg-tertiary: #f1f3f8;
57
+ --bg-hover: #e8ebf0;
58
+ --bg-active: #dde1ea;
59
+ --bg-card: #ffffff;
60
+ --bg-input: #f1f3f8;
61
+ --bg-modal: rgba(0,0,0,0.4);
62
+ --border: #e2e5ed;
63
+ --border-light: #eceef4;
64
+ --text-primary: #111827;
65
+ --text-secondary: #4b5563;
66
+ --text-muted: #9ca3af;
67
+ --text-inverse: #ffffff;
68
+ --shadow: 0 1px 3px rgba(0,0,0,0.08);
69
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.1);
70
+ --shadow-xl: 0 8px 24px rgba(0,0,0,0.12);
71
+ }
9
72
 
10
- /* ─── Base ────────────────────────────────────────────── */
11
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); line-height: 1.6; }
73
+ /* ═══════════════════════════════════════════════════════════
74
+ RESET & BASE
75
+ ═══════════════════════════════════════════════════════════ */
76
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
77
+ html { font-size: 14px; }
78
+ body { font-family: var(--font); background: var(--bg-primary); color: var(--text-primary); line-height: 1.5; -webkit-font-smoothing: antialiased; }
79
+ a { color: var(--accent-text); text-decoration: none; }
80
+ a:hover { text-decoration: underline; }
12
81
 
13
- /* ─── Layout ──────────────────────────────────────────── */
82
+ /* ═══════════════════════════════════════════════════════════
83
+ LAYOUT
84
+ ═══════════════════════════════════════════════════════════ */
14
85
  .layout { display: flex; min-height: 100vh; }
15
86
 
16
- /* ─── Sidebar ─────────────────────────────────────────── */
17
- .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; }
18
- .sidebar-header { padding: 20px; border-bottom: 1px solid var(--border); }
19
- .sidebar-header h2 { font-size: 16px; } .sidebar-header h2 em { font-style:normal; color: var(--primary); }
20
- .sidebar-header small { font-size: 11px; color: var(--muted); display: block; margin-top: 2px; }
21
- .nav { flex: 1; padding: 8px 0; }
22
- .nav-sec { font-size:10px; text-transform:uppercase; letter-spacing:0.08em; color:var(--muted); padding:12px 20px 4px; }
23
- .nav a { display:flex; align-items:center; gap:10px; padding:10px 20px; color:var(--dim); text-decoration:none; font-size:13px; }
24
- .nav a:hover { color:var(--text); background:rgba(255,255,255,0.03); }
25
- .nav a.active { color:var(--primary); background:rgba(232,67,147,0.12); border-right:2px solid var(--primary); }
26
- .sidebar-footer { padding:16px 20px; border-top:1px solid var(--border); font-size:12px; }
27
-
28
- /* ─── Content ─────────────────────────────────────────── */
29
- .content { flex:1; margin-left:240px; padding:32px; max-width:1100px; }
30
- h2.title { font-size:22px; font-weight:700; margin-bottom:4px; }
31
- .desc { font-size:13px; color:var(--dim); margin-bottom:24px; }
32
-
33
- /* ─── Stats ───────────────────────────────────────────── */
34
- .stats { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:16px; margin-bottom:24px; }
35
- .stat { background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:20px; }
36
- .stat .l { font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; }
37
- .stat .v { font-size:30px; font-weight:700; margin-top:4px; }
38
-
39
- /* ─── Cards ───────────────────────────────────────────── */
40
- .card { background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:20px; margin-bottom:16px; }
41
- .card-t { font-size:13px; color:var(--dim); text-transform:uppercase; letter-spacing:0.05em; font-weight:600; margin-bottom:12px; }
42
-
43
- /* ─── Tables ──────────────────────────────────────────── */
44
- table { width:100%; border-collapse:collapse; font-size:13px; }
45
- th { text-align:left; padding:10px 12px; color:var(--muted); font-size:11px; text-transform:uppercase; letter-spacing:0.05em; border-bottom:1px solid var(--border); font-weight:600; }
46
- td { padding:12px; border-bottom:1px solid var(--border); }
47
- tr:hover td { background:rgba(255,255,255,0.015); }
48
-
49
- /* ─── Buttons ─────────────────────────────────────────── */
50
- .btn { display:inline-flex; align-items:center; padding:8px 16px; border-radius:var(--r); font-size:13px; font-weight:600; cursor:pointer; border:1px solid var(--border); background:var(--surface); color:var(--text); text-decoration:none; }
51
- .btn:hover { background:rgba(255,255,255,0.05); }
52
- .btn-p { background:var(--primary); border-color:var(--primary); color:#fff; }
53
- .btn-p:hover { background:#f06595; }
54
- .btn-d { color:var(--danger); border-color:var(--danger); }
55
- .btn-sm { padding:4px 10px; font-size:12px; }
56
-
57
- /* ─── Forms ───────────────────────────────────────────── */
58
- .input { width:100%; padding:10px 14px; background:var(--bg); border:1px solid var(--border); border-radius:var(--r); color:var(--text); font-size:14px; }
59
- .input:focus { outline:none; border-color:var(--primary); }
60
- .fg { margin-bottom:14px; }
61
- .fl { display:block; font-size:12px; color:var(--dim); margin-bottom:4px; font-weight:500; }
62
- select.input { appearance:auto; }
63
-
64
- /* ─── Alerts ──────────────────────────────────────────── */
65
- .alert { padding:12px 16px; border-radius:var(--r); margin-bottom:16px; font-size:13px; }
66
- .alert-e { background:rgba(239,68,68,0.1); border:1px solid var(--danger); color:var(--danger); }
67
- .alert-s { background:rgba(34,197,94,0.1); border:1px solid var(--success); color:var(--success); }
68
-
69
- /* ─── Empty States ────────────────────────────────────── */
70
- .empty { text-align:center; padding:48px 20px; color:var(--muted); }
71
- .empty-i { font-size:36px; margin-bottom:10px; }
72
-
73
- /* ─── Login ───────────────────────────────────────────── */
74
- .login-wrap { display:flex; align-items:center; justify-content:center; min-height:100vh; }
75
- .login-box { width:380px; max-width:90vw; }
76
- .login-box h1 { text-align:center; font-size:22px; margin-bottom:4px; }
77
- .login-box h1 em { font-style:normal; color:var(--primary); }
78
- .login-box .sub { text-align:center; color:var(--dim); font-size:13px; margin-bottom:32px; }
79
-
80
- /* ─── Responsive ──────────────────────────────────────── */
81
- @media(max-width:768px) { .sidebar{width:56px;} .sidebar-header h2,.sidebar-header small,.nav a span,.nav-sec,.sidebar-footer{display:none;} .nav a{justify-content:center;padding:14px 0;font-size:18px;} .content{margin-left:56px;padding:16px;} }
87
+ /* Sidebar */
88
+ .sidebar { width: var(--sidebar-w); background: var(--bg-secondary); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 50; }
89
+
90
+ /* Sidebar header */
91
+ .sidebar-header { padding: 16px; border-bottom: 1px solid var(--border); }
92
+ .sidebar-header h2 { font-size: 15px; font-weight: 700; }
93
+ .sidebar-header p { font-size: 11px; color: var(--text-muted); }
94
+
95
+ /* Navigation */
96
+ .nav { flex: 1; overflow-y: auto; padding: 8px; }
97
+ .nav-section { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); padding: 12px 12px 8px; margin-top: 16px; }
98
+ .nav-section:first-child { margin-top: 8px; }
99
+ .nav-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--radius); color: var(--text-secondary); cursor: pointer; transition: all var(--transition); font-size: 13px; font-weight: 500; border: none; background: transparent; width: 100%; text-align: left; text-decoration: none; }
100
+ .nav-item:hover { background: var(--bg-hover); color: var(--text-primary); text-decoration: none; }
101
+ .nav-item.active { background: var(--accent-soft); color: var(--accent-text); }
102
+ .nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
103
+
104
+ /* Main content area */
105
+ .main-content { margin-left: var(--sidebar-w); width: calc(100% - var(--sidebar-w)); min-height: 100vh; display: flex; flex-direction: column; }
106
+
107
+ /* Topbar */
108
+ .topbar { height: var(--header-h); border-bottom: 1px solid var(--border); background: var(--bg-secondary); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; }
109
+ .topbar-left { display: flex; align-items: center; gap: 16px; }
110
+ .topbar-title { font-size: 16px; font-weight: 600; }
111
+ .topbar-right { display: flex; align-items: center; gap: 8px; }
112
+ .page-content { flex: 1; padding: 24px; width: 100%; }
113
+
114
+ /* ═══════════════════════════════════════════════════════════
115
+ COMPONENTS
116
+ ═══════════════════════════════════════════════════════════ */
117
+ .btn { display: inline-flex; align-items: center; gap: 5px; padding: 6px 12px; border-radius: var(--radius); font-size: 12px; font-weight: 500; border: 1px solid transparent; cursor: pointer; transition: all var(--transition); font-family: var(--font); line-height: 1.4; text-decoration: none; }
118
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
119
+ .btn-primary { background: var(--accent); color: white; }
120
+ .btn-primary:hover:not(:disabled) { background: var(--accent-hover); }
121
+ .btn-secondary { background: transparent; color: var(--text-secondary); border-color: var(--border); }
122
+ .btn-secondary:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-light); }
123
+ .btn-danger { background: var(--danger); color: white; }
124
+ .btn-danger:hover:not(:disabled) { background: var(--danger-hover); }
125
+ .btn-sm { padding: 3px 8px; font-size: 11px; }
126
+ .btn-lg { padding: 8px 16px; font-size: 13px; }
127
+
128
+ .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; }
129
+ .card-header { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }
130
+ .card-header h3 { font-size: 14px; font-weight: 600; }
131
+ .card-body { padding: 20px; }
132
+
133
+ .input { width: 100%; padding: 8px 12px; background: var(--bg-input); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text-primary); font-size: 13px; font-family: var(--font); transition: border-color var(--transition); outline: none; }
134
+ .input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
135
+ .input::placeholder { color: var(--text-muted); }
136
+ select.input { cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M6 8L1 3h10z' fill='%239ca3b8'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; padding-right: 30px; }
137
+
138
+ .form-group { margin-bottom: 16px; }
139
+ .form-label { display: block; font-size: 12px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
140
+
141
+ .badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; }
142
+ .badge-primary { background: var(--accent-soft); color: var(--accent-text); }
143
+ .badge-success { background: var(--success-soft); color: var(--success); }
144
+ .badge-warning { background: var(--warning-soft); color: var(--warning); }
145
+ .badge-danger { background: var(--danger-soft); color: var(--danger); }
146
+
147
+ table { width: 100%; border-collapse: collapse; }
148
+ thead th { text-align: left; padding: 10px 16px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); border-bottom: 1px solid var(--border); background: var(--bg-tertiary); }
149
+ tbody td { padding: 12px 16px; border-bottom: 1px solid var(--border); font-size: 13px; }
150
+ tbody tr:last-child td { border-bottom: none; }
151
+ tbody tr:hover { background: var(--bg-hover); }
152
+
153
+ .empty-state { text-align: center; padding: 48px 24px; }
154
+ .empty-state svg { width: 48px; height: 48px; color: var(--text-muted); margin-bottom: 16px; }
155
+ .empty-state h3 { font-size: 15px; font-weight: 600; margin-bottom: 4px; }
156
+ .empty-state p { color: var(--text-muted); font-size: 13px; margin-bottom: 16px; }
157
+
158
+ .stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; }
159
+ .stat-label { font-size: 12px; color: var(--text-muted); font-weight: 500; }
160
+ .stat-value { font-size: 28px; font-weight: 700; margin-top: 4px; }
161
+ .stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
162
+
163
+ /* Login page */
164
+ .login-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--bg-primary); }
165
+ .login-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-xl); padding: 40px; width: 400px; box-shadow: var(--shadow-xl); }
166
+ .login-logo { text-align: center; margin-bottom: 32px; }
167
+ .login-logo h1 { font-size: 22px; font-weight: 700; margin-top: 12px; }
168
+ .login-logo p { color: var(--text-muted); font-size: 13px; margin-top: 4px; }
169
+
170
+ /* Responsive */
171
+ @media (max-width: 768px) {
172
+ .sidebar { transform: translateX(-100%); width: var(--sidebar-w); }
173
+ .main-content { margin-left: 0; width: 100%; }
174
+ .stat-grid { grid-template-columns: 1fr; }
175
+ }
@@ -34,6 +34,14 @@ from routes.messages import messages_bp
34
34
  from routes.compliance import compliance_bp
35
35
  from routes.vault import vault_bp
36
36
  from routes.skills import skills_bp
37
+ from routes.activity import activity_bp
38
+ from routes.approvals import approvals_bp
39
+ from routes.community_skills import community_skills_bp
40
+ from routes.domain_status import domain_status_bp
41
+ from routes.knowledge import knowledge_bp
42
+ from routes.knowledge_contributions import knowledge_contributions_bp
43
+ from routes.skill_connections import skill_connections_bp
44
+ from routes.workforce import workforce_bp
37
45
 
38
46
 
39
47
  def create_app():
@@ -55,6 +63,14 @@ def create_app():
55
63
  app.register_blueprint(compliance_bp)
56
64
  app.register_blueprint(vault_bp)
57
65
  app.register_blueprint(skills_bp)
66
+ app.register_blueprint(activity_bp)
67
+ app.register_blueprint(approvals_bp)
68
+ app.register_blueprint(community_skills_bp)
69
+ app.register_blueprint(domain_status_bp)
70
+ app.register_blueprint(knowledge_bp)
71
+ app.register_blueprint(knowledge_contributions_bp)
72
+ app.register_blueprint(skill_connections_bp)
73
+ app.register_blueprint(workforce_bp)
58
74
 
59
75
  # ─── Jinja2 Template Filters ──────────────────────────
60
76
  app.jinja_env.filters['badge'] = badge
@@ -0,0 +1,11 @@
1
+ """Activity Routes — Shows recent agent activity and system events"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ activity_bp = Blueprint('activity_bp', __name__)
7
+
8
+ @activity_bp.route('/activity')
9
+ @require_auth
10
+ def activity():
11
+ return render_template('activity.html', active_page='activity')
@@ -0,0 +1,11 @@
1
+ """Approvals Routes — Pending approvals and approval history"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ approvals_bp = Blueprint('approvals_bp', __name__)
7
+
8
+ @approvals_bp.route('/approvals')
9
+ @require_auth
10
+ def approvals():
11
+ return render_template('approvals.html', active_page='approvals')
@@ -0,0 +1,11 @@
1
+ """Community Skills Routes — Browse and install community-contributed skills"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ community_skills_bp = Blueprint('community_skills_bp', __name__)
7
+
8
+ @community_skills_bp.route('/community-skills')
9
+ @require_auth
10
+ def community_skills():
11
+ return render_template('community-skills.html', active_page='community_skills')
@@ -0,0 +1,11 @@
1
+ """Domain Status Routes — Domain health and email security status"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ domain_status_bp = Blueprint('domain_status_bp', __name__)
7
+
8
+ @domain_status_bp.route('/domain-status')
9
+ @require_auth
10
+ def domain_status():
11
+ return render_template('domain-status.html', active_page='domain_status')
@@ -0,0 +1,11 @@
1
+ """Knowledge Routes — Knowledge base management"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ knowledge_bp = Blueprint('knowledge_bp', __name__)
7
+
8
+ @knowledge_bp.route('/knowledge')
9
+ @require_auth
10
+ def knowledge():
11
+ return render_template('knowledge.html', active_page='knowledge')
@@ -0,0 +1,11 @@
1
+ """Knowledge Contributions Routes — Community knowledge sharing hub"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ knowledge_contributions_bp = Blueprint('knowledge_contributions_bp', __name__)
7
+
8
+ @knowledge_contributions_bp.route('/knowledge-contributions')
9
+ @require_auth
10
+ def knowledge_contributions():
11
+ return render_template('knowledge-contributions.html', active_page='knowledge_contributions')
@@ -0,0 +1,11 @@
1
+ """Skill Connections Routes — Manage skill integrations and connections"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ skill_connections_bp = Blueprint('skill_connections_bp', __name__)
7
+
8
+ @skill_connections_bp.route('/skill-connections')
9
+ @require_auth
10
+ def skill_connections():
11
+ return render_template('skill-connections.html', active_page='skill_connections')
@@ -0,0 +1,11 @@
1
+ """Workforce Routes — Agent workforce management and scheduling"""
2
+
3
+ from flask import Blueprint, render_template
4
+ from utils.auth import require_auth
5
+
6
+ workforce_bp = Blueprint('workforce_bp', __name__)
7
+
8
+ @workforce_bp.route('/workforce')
9
+ @require_auth
10
+ def workforce():
11
+ return render_template('workforce.html', active_page='workforce')