apteva 0.4.44 → 0.4.51

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 (85) hide show
  1. package/dist/{ActivityPage.c48n83h2.js → ActivityPage.sw9p594m.js} +1 -1
  2. package/dist/{ApiDocsPage.yzcxx5ax.js → ApiDocsPage.90e03bz7.js} +1 -1
  3. package/dist/App.3vnrera5.js +4 -0
  4. package/dist/App.94x6mh7f.js +20 -0
  5. package/dist/{App.qzbx5wtj.js → App.9sryp183.js} +1 -1
  6. package/dist/App.9t1zc5r7.js +53 -0
  7. package/dist/{App.r5serxkt.js → App.jhb45d7r.js} +1 -1
  8. package/dist/App.k4nmqgek.js +221 -0
  9. package/dist/App.p7jjw1zf.js +4 -0
  10. package/dist/App.pfbdzrhh.js +4 -0
  11. package/dist/App.stgng5bx.js +13 -0
  12. package/dist/{App.152mbs1r.js → App.tm3k7h4b.js} +1 -1
  13. package/dist/App.vkg121c6.js +4 -0
  14. package/dist/App.vza4fxg0.js +4 -0
  15. package/dist/App.wghtdzsk.js +1 -0
  16. package/dist/App.xva0tfzh.js +4 -0
  17. package/dist/App.ysxy7akk.js +61 -0
  18. package/dist/App.yzkh4gq2.js +4 -0
  19. package/dist/ConnectionsPage.q5f9fd37.js +3 -0
  20. package/dist/McpPage.f3ccrezb.js +3 -0
  21. package/dist/SettingsPage.q1pqcc93.js +3 -0
  22. package/dist/SkillsPage.whxnez67.js +3 -0
  23. package/dist/TasksPage.zp4jfevw.js +3 -0
  24. package/dist/TelemetryPage.an0ky78c.js +3 -0
  25. package/dist/TestsPage.18krj0d1.js +3 -0
  26. package/dist/ThreadsPage.nnphgy98.js +3 -0
  27. package/dist/apteva-kit.css +1 -1
  28. package/dist/index.html +1 -1
  29. package/dist/styles.css +1 -1
  30. package/package.json +10 -9
  31. package/src/db.ts +60 -22
  32. package/src/providers.ts +14 -9
  33. package/src/routes/api/agent-utils.ts +25 -3
  34. package/src/routes/api/telemetry.ts +21 -2
  35. package/src/server.ts +53 -1
  36. package/src/web/App.tsx +2 -2
  37. package/src/web/components/agents/AgentCard.tsx +9 -7
  38. package/src/web/components/agents/AgentPanel.tsx +205 -44
  39. package/src/web/components/agents/CreateAgentModal.tsx +5 -5
  40. package/src/web/components/auth/LoginPage.tsx +2 -2
  41. package/src/web/components/common/LoadingSpinner.tsx +1 -1
  42. package/src/web/components/common/Modal.tsx +6 -6
  43. package/src/web/components/common/Select.tsx +2 -2
  44. package/src/web/components/connections/ConnectionsPage.tsx +1 -1
  45. package/src/web/components/connections/IntegrationsTab.tsx +3 -3
  46. package/src/web/components/connections/OverviewTab.tsx +3 -3
  47. package/src/web/components/connections/TriggersTab.tsx +8 -8
  48. package/src/web/components/dashboard/Dashboard.tsx +4 -4
  49. package/src/web/components/layout/Header.tsx +3 -3
  50. package/src/web/components/layout/Sidebar.tsx +6 -5
  51. package/src/web/components/mcp/McpPage.tsx +13 -13
  52. package/src/web/components/onboarding/OnboardingWizard.tsx +2 -2
  53. package/src/web/components/settings/SettingsPage.tsx +59 -26
  54. package/src/web/components/skills/SkillsPage.tsx +7 -7
  55. package/src/web/components/tasks/TasksPage.tsx +212 -36
  56. package/src/web/components/telemetry/TelemetryPage.tsx +414 -94
  57. package/src/web/components/tests/TestsPage.tsx +2 -2
  58. package/src/web/components/threads/ThreadsPage.tsx +2 -2
  59. package/src/web/context/TelemetryContext.tsx +1 -0
  60. package/src/web/context/ThemeContext.tsx +31 -10
  61. package/src/web/index.html +1 -6
  62. package/src/web/styles.css +47 -0
  63. package/src/web/themes.ts +68 -5
  64. package/src/web/types.ts +1 -1
  65. package/dist/App.09yb8t0b.js +0 -1
  66. package/dist/App.3a67nx9w.js +0 -4
  67. package/dist/App.9epx6785.js +0 -4
  68. package/dist/App.d8955awp.js +0 -4
  69. package/dist/App.drwb57jq.js +0 -4
  70. package/dist/App.gssbmajb.js +0 -4
  71. package/dist/App.qw70pc29.js +0 -53
  72. package/dist/App.tpmp9020.js +0 -20
  73. package/dist/App.v2wb4d7d.js +0 -61
  74. package/dist/App.vxmaaj0m.js +0 -13
  75. package/dist/App.w4p2tda9.js +0 -4
  76. package/dist/App.wv2ng55q.js +0 -221
  77. package/dist/App.yncnrn0f.js +0 -4
  78. package/dist/ConnectionsPage.k6cspyqq.js +0 -3
  79. package/dist/McpPage.cdxm48xj.js +0 -3
  80. package/dist/SettingsPage.evpv7c2y.js +0 -3
  81. package/dist/SkillsPage.pvzp6c1a.js +0 -3
  82. package/dist/TasksPage.6jnvbpsy.js +0 -3
  83. package/dist/TelemetryPage.t7vk24zc.js +0 -3
  84. package/dist/TestsPage.5x6658aa.js +0 -3
  85. package/dist/ThreadsPage.3fvhtevh.js +0 -3
@@ -8,7 +8,7 @@ interface ModalProps {
8
8
  export function Modal({ children, onClose }: ModalProps) {
9
9
  return (
10
10
  <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
11
- <div className="bg-[var(--color-surface)] rounded p-6 w-full max-w-xl lg:max-w-2xl border border-[var(--color-border)] max-h-[90vh] overflow-y-auto">
11
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-xl lg:max-w-2xl max-h-[90vh] overflow-y-auto">
12
12
  {children}
13
13
  </div>
14
14
  </div>
@@ -37,19 +37,19 @@ export function ConfirmModal({
37
37
  }: ConfirmModalProps) {
38
38
  return (
39
39
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
40
- <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-sm">
40
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-sm">
41
41
  {title && <h3 className="font-medium mb-2">{title}</h3>}
42
42
  <p className="text-sm text-[var(--color-text)] mb-4">{message}</p>
43
43
  <div className="flex gap-2">
44
44
  <button
45
45
  onClick={onCancel}
46
- className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 rounded transition"
46
+ className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] btn px-4 py-2 transition"
47
47
  >
48
48
  {cancelText}
49
49
  </button>
50
50
  <button
51
51
  onClick={onConfirm}
52
- className={`flex-1 text-sm text-white px-4 py-2 rounded transition ${
52
+ className={`flex-1 text-sm text-white px-4 py-2 btn transition ${
53
53
  confirmVariant === "danger"
54
54
  ? "bg-red-500 hover:bg-red-600"
55
55
  : "bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)]"
@@ -93,7 +93,7 @@ export function AlertModal({
93
93
 
94
94
  return (
95
95
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
96
- <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-sm text-center">
96
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-sm text-center">
97
97
  <div
98
98
  className={`w-12 h-12 rounded-full flex items-center justify-center mx-auto mb-3 ${iconColors[variant]}`}
99
99
  >
@@ -103,7 +103,7 @@ export function AlertModal({
103
103
  <p className="text-sm text-[var(--color-text)] mb-4">{message}</p>
104
104
  <button
105
105
  onClick={onClose}
106
- className="w-full text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 rounded transition"
106
+ className="w-full text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 btn transition"
107
107
  >
108
108
  {buttonText}
109
109
  </button>
@@ -35,7 +35,7 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
35
35
  <button
36
36
  type="button"
37
37
  onClick={() => setIsOpen(!isOpen)}
38
- className={`w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between focus:outline-none focus:border-[var(--color-accent)] text-[var(--color-text)] hover:border-[var(--color-border-light)] transition`}
38
+ className={`w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] btn ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between focus:outline-none focus:border-[var(--color-accent)] text-[var(--color-text)] hover:border-[var(--color-border-light)] transition`}
39
39
  >
40
40
  <span className={selectedOption ? "text-[var(--color-text)]" : "text-[var(--color-text-muted)]"}>
41
41
  {selectedOption ? (
@@ -51,7 +51,7 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
51
51
  </button>
52
52
 
53
53
  {isOpen && (
54
- <div className="absolute z-50 w-full min-w-max mt-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded shadow-lg max-h-60 overflow-y-auto scrollbar-hide">
54
+ <div className="absolute z-50 w-full min-w-max mt-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] shadow-lg max-h-60 overflow-y-auto scrollbar-hide" style={{ borderRadius: "var(--radius-button)" }}>
55
55
  {options.map((option) => (
56
56
  <button
57
57
  key={option.value}
@@ -28,7 +28,7 @@ export function ConnectionsPage() {
28
28
  </div>
29
29
 
30
30
  {/* Tabs */}
31
- <div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-1 w-fit">
31
+ <div className="flex gap-1 mb-6 bg-[var(--color-surface)] card p-1 w-fit">
32
32
  {tabs.map(tab => (
33
33
  <button
34
34
  key={tab.id}
@@ -74,7 +74,7 @@ export function IntegrationsTab() {
74
74
  {providers.length > 1 && (
75
75
  <div className="flex items-center gap-2 mb-4">
76
76
  <span className="text-xs text-[var(--color-text-muted)]">Provider:</span>
77
- <div className="flex gap-1 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-0.5">
77
+ <div className="flex gap-1 bg-[var(--color-surface)] card p-0.5">
78
78
  {providers.map(p => (
79
79
  <button
80
80
  key={p.id}
@@ -93,7 +93,7 @@ export function IntegrationsTab() {
93
93
  )}
94
94
 
95
95
  {providers.length === 0 ? (
96
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
96
+ <div className="bg-[var(--color-surface)] card p-8 text-center">
97
97
  <p className="text-[var(--color-text-muted)]">No integration providers configured.</p>
98
98
  <p className="text-sm text-[var(--color-text-faint)] mt-1">Add API keys for Composio or AgentDojo in Settings.</p>
99
99
  </div>
@@ -133,7 +133,7 @@ export function IntegrationsTab() {
133
133
  ) : (
134
134
  <div className="space-y-2">
135
135
  {triggerTypes.map(tt => (
136
- <div key={tt.slug} className="bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg p-3">
136
+ <div key={tt.slug} className="bg-[var(--color-bg)] card p-3">
137
137
  <div className="flex items-start gap-3">
138
138
  {tt.logo ? (
139
139
  <img src={tt.logo} alt={tt.toolkit_name} className="w-6 h-6 rounded object-contain flex-shrink-0 mt-0.5" />
@@ -75,7 +75,7 @@ export function OverviewTab() {
75
75
  <section>
76
76
  <h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">Subscriptions ({subscriptions.length})</h3>
77
77
  {subscriptions.length === 0 ? (
78
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center text-[var(--color-text-muted)] text-sm">
78
+ <div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
79
79
  No subscriptions yet. Go to the Triggers tab to create one.
80
80
  </div>
81
81
  ) : (
@@ -83,7 +83,7 @@ export function OverviewTab() {
83
83
  {subscriptions.map(sub => {
84
84
  const agent = agentMap.get(sub.agent_id);
85
85
  return (
86
- <div key={sub.id} className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-3 flex items-center gap-3">
86
+ <div key={sub.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
87
87
  <div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[var(--color-text-faint)]"}`} />
88
88
  <div className="flex-1 min-w-0">
89
89
  <div className="text-sm font-medium truncate">
@@ -127,7 +127,7 @@ function StatCard({
127
127
  valueColor?: string;
128
128
  }) {
129
129
  return (
130
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4">
130
+ <div className="bg-[var(--color-surface)] card p-4">
131
131
  <div className="text-xs text-[var(--color-text-muted)] mb-1">{label}</div>
132
132
  <div className={`text-2xl font-bold ${valueColor || "text-[var(--color-text)]"}`}>
133
133
  {value}
@@ -594,7 +594,7 @@ export function TriggersTab() {
594
594
 
595
595
  if (providers.length === 0 && !triggersLoading) {
596
596
  return (
597
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
597
+ <div className="bg-[var(--color-surface)] card p-8 text-center">
598
598
  <p className="text-[var(--color-text-muted)]">No trigger providers configured.</p>
599
599
  <p className="text-sm text-[var(--color-text-faint)] mt-1">Add API keys for Composio or AgentDojo in Settings to enable triggers.</p>
600
600
  </div>
@@ -615,7 +615,7 @@ export function TriggersTab() {
615
615
  {providers.length > 1 && (
616
616
  <div className="flex items-center gap-2">
617
617
  <span className="text-xs text-[var(--color-text-muted)]">Provider:</span>
618
- <div className="flex gap-1 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-0.5">
618
+ <div className="flex gap-1 bg-[var(--color-surface)] card p-0.5">
619
619
  {providers.map(p => (
620
620
  <button
621
621
  key={p.id}
@@ -654,7 +654,7 @@ export function TriggersTab() {
654
654
  </div>
655
655
 
656
656
  {subscriptions.length === 0 ? (
657
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center text-[var(--color-text-muted)] text-sm">
657
+ <div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
658
658
  No subscriptions yet. Add one to route trigger events to an agent.
659
659
  </div>
660
660
  ) : (
@@ -662,7 +662,7 @@ export function TriggersTab() {
662
662
  {subscriptions.map(sub => {
663
663
  const agent = agentMap.get(sub.agent_id);
664
664
  return (
665
- <div key={sub.id} className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-3 flex items-center gap-3">
665
+ <div key={sub.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
666
666
  <div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
667
667
  <div className="flex-1 min-w-0">
668
668
  <div className="text-sm font-medium truncate">
@@ -712,13 +712,13 @@ export function TriggersTab() {
712
712
  {triggersLoading ? (
713
713
  <div className="text-center py-6 text-[var(--color-text-muted)] text-sm">Loading triggers...</div>
714
714
  ) : triggers.length === 0 ? (
715
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center text-[var(--color-text-muted)] text-sm">
715
+ <div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
716
716
  No trigger instances. Browse trigger types below to create one.
717
717
  </div>
718
718
  ) : (
719
719
  <div className="space-y-2">
720
720
  {triggers.map(trigger => (
721
- <div key={trigger.id} className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-3 flex items-center gap-3">
721
+ <div key={trigger.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
722
722
  <div className={`w-2 h-2 rounded-full flex-shrink-0 ${trigger.status === "active" ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
723
723
  <div className="flex-1 min-w-0">
724
724
  <div className="text-sm font-medium truncate">
@@ -770,7 +770,7 @@ export function TriggersTab() {
770
770
  {triggersLoading ? (
771
771
  <div className="text-center py-6 text-[var(--color-text-muted)] text-sm">Loading subscriptions...</div>
772
772
  ) : triggers.length === 0 ? (
773
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center text-[var(--color-text-muted)] text-sm">
773
+ <div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
774
774
  No active subscriptions. Browse trigger types below to create one.
775
775
  </div>
776
776
  ) : (
@@ -779,7 +779,7 @@ export function TriggersTab() {
779
779
  const localSub = subscriptions.find(s => s.trigger_instance_id === trigger.id);
780
780
  const agent = localSub ? agentMap.get(localSub.agent_id) : null;
781
781
  return (
782
- <div key={trigger.id} className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-3 flex items-center gap-3">
782
+ <div key={trigger.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
783
783
  <div className={`w-2 h-2 rounded-full flex-shrink-0 ${trigger.status === "active" ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
784
784
  <div className="flex-1 min-w-0">
785
785
  <div className="text-sm font-medium truncate">
@@ -181,8 +181,8 @@ export function Dashboard({
181
181
  {/* Activity Feed */}
182
182
  <DashboardCard
183
183
  title="Activity"
184
- actionLabel="Telemetry"
185
- onAction={() => onNavigate("telemetry")}
184
+ actionLabel="Analytics"
185
+ onAction={() => onNavigate("analytics")}
186
186
  >
187
187
  {activities.length === 0 ? (
188
188
  <div className="p-4 text-center text-[var(--color-text-muted)]">
@@ -454,12 +454,12 @@ function QuickMessageModal({ agent, onClose }: { agent: Agent; onClose: () => vo
454
454
  onKeyDown={e => e.key === "Enter" && handleSend()}
455
455
  placeholder={`Message ${agent.name}...`}
456
456
  disabled={sending}
457
- className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:border-[var(--color-accent)] placeholder-[#444] disabled:opacity-50"
457
+ className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] btn px-3 py-2.5 text-sm focus:outline-none focus:border-[var(--color-accent)] placeholder-[#444] disabled:opacity-50"
458
458
  />
459
459
  <button
460
460
  onClick={handleSend}
461
461
  disabled={sending || !message.trim()}
462
- className="px-4 py-2.5 bg-[var(--color-accent)] text-black rounded-lg text-sm font-medium hover:bg-[var(--color-accent-hover)] transition disabled:opacity-30"
462
+ className="px-4 py-2.5 bg-[var(--color-accent)] text-black btn text-sm font-medium hover:bg-[var(--color-accent-hover)] transition disabled:opacity-30"
463
463
  >
464
464
  {sending ? "..." : "Send"}
465
465
  </button>
@@ -161,7 +161,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
161
161
  <div className="relative ml-2 md:ml-4">
162
162
  <button
163
163
  onClick={() => setShowProjectMenu(!showProjectMenu)}
164
- className="flex items-center gap-2 px-3 py-1.5 rounded transition text-sm"
164
+ className="flex items-center gap-2 px-3 py-1.5 btn transition text-sm"
165
165
  style={{ border: "1px solid var(--color-border-light)", backgroundColor: "var(--color-surface)" }}
166
166
  >
167
167
  <span
@@ -174,7 +174,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
174
174
  <ChevronDownIcon />
175
175
  </button>
176
176
  {showProjectMenu && (
177
- <div className="absolute left-0 top-full mt-1 w-56 rounded-lg shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)", border: "1px solid var(--color-border-light)" }}>
177
+ <div className="absolute left-0 top-full mt-1 w-56 card shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)" }}>
178
178
  <div className="py-1 max-h-64 overflow-y-auto">
179
179
  <button
180
180
  onClick={() => handleProjectSelect(null)}
@@ -262,7 +262,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
262
262
  {showNotifications && (
263
263
  <>
264
264
  <div className="fixed inset-0 z-40" onClick={() => setShowNotifications(false)} />
265
- <div className="absolute right-0 top-full mt-1 w-80 rounded-lg shadow-xl z-50 max-h-96 overflow-y-auto" style={{ backgroundColor: "var(--color-surface)", border: "1px solid var(--color-border-light)" }}>
265
+ <div className="absolute right-0 top-full mt-1 w-80 card shadow-xl z-50 max-h-96 overflow-y-auto" style={{ backgroundColor: "var(--color-surface)" }}>
266
266
  <div className="px-4 py-3 flex items-center justify-between" style={{ borderBottom: "1px solid var(--color-border-light)" }}>
267
267
  <span className="text-sm font-medium">Notifications</span>
268
268
  {notifications.length > 0 && (
@@ -119,9 +119,9 @@ export function Sidebar({ route, agentCount, taskCount, onNavigate, isOpen, onCl
119
119
  />
120
120
  <NavButton
121
121
  icon={<TelemetryIcon />}
122
- label="Telemetry"
123
- active={route === "telemetry"}
124
- onClick={() => handleNavigate("telemetry")}
122
+ label="Analytics"
123
+ active={route === "analytics"}
124
+ onClick={() => handleNavigate("analytics")}
125
125
  />
126
126
  <NavButton
127
127
  icon={<ApiIcon />}
@@ -158,7 +158,7 @@ export function Sidebar({ route, agentCount, taskCount, onNavigate, isOpen, onCl
158
158
  {showUserMenu && (
159
159
  <>
160
160
  <div className="fixed inset-0 z-40" onClick={() => setShowUserMenu(false)} />
161
- <div className="absolute left-3 bottom-full mb-1 w-48 rounded-lg shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)", border: "1px solid var(--color-border-light)" }}>
161
+ <div className="absolute left-3 bottom-full mb-1 w-48 card shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)" }}>
162
162
  <button
163
163
  onClick={handleLogout}
164
164
  className="w-full px-4 py-2.5 text-left text-sm text-red-400 transition rounded-lg"
@@ -189,8 +189,9 @@ function NavButton({ icon, label, active, onClick, badge }: NavButtonProps) {
189
189
  return (
190
190
  <button
191
191
  onClick={onClick}
192
- className="w-full flex items-center gap-3 px-3 py-2 rounded font-medium transition"
192
+ className="w-full flex items-center gap-3 px-3 py-2 font-medium transition"
193
193
  style={{
194
+ borderRadius: "var(--radius-button)",
194
195
  backgroundColor: active ? "var(--color-surface)" : "transparent",
195
196
  color: active ? "var(--color-text)" : "var(--color-text-muted)",
196
197
  }}
@@ -156,7 +156,7 @@ export function McpPage() {
156
156
  </div>
157
157
 
158
158
  {/* Tabs */}
159
- <div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-1 w-fit">
159
+ <div className="flex gap-1 mb-6 bg-[var(--color-surface)] card p-1 w-fit">
160
160
  <button
161
161
  onClick={() => setActiveTab("servers")}
162
162
  className={`px-4 py-2 rounded text-sm font-medium transition ${
@@ -199,7 +199,7 @@ export function McpPage() {
199
199
 
200
200
  {/* Empty State */}
201
201
  {!loading && filteredServers.length === 0 && servers.length === 0 && (
202
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
202
+ <div className="bg-[var(--color-surface)] card p-8 text-center">
203
203
  <McpIcon className="w-12 h-12 text-[var(--color-border-light)] mx-auto mb-4" />
204
204
  <h3 className="text-lg font-medium mb-2">No MCP servers configured</h3>
205
205
  <p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
@@ -225,7 +225,7 @@ export function McpPage() {
225
225
 
226
226
  {/* Empty filter state */}
227
227
  {!loading && filteredServers.length === 0 && servers.length > 0 && (
228
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center">
228
+ <div className="bg-[var(--color-surface)] card p-6 text-center">
229
229
  <p className="text-[var(--color-text-muted)]">No servers match this filter.</p>
230
230
  </div>
231
231
  )}
@@ -298,7 +298,7 @@ export function McpPage() {
298
298
 
299
299
  {/* Info - only show on servers tab */}
300
300
  {activeTab === "servers" && (
301
- <div className="mt-8 p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg">
301
+ <div className="mt-8 p-4 bg-[var(--color-surface)] card">
302
302
  <h3 className="font-medium mb-2">Quick Start</h3>
303
303
  <p className="text-sm text-[var(--color-text-muted)] mb-3">
304
304
  Add an MCP server by providing its npm package name. For example:
@@ -523,7 +523,7 @@ function ToolsPanel({
523
523
  }, [server.id, authFetch]);
524
524
 
525
525
  return (
526
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg overflow-hidden">
526
+ <div className="bg-[var(--color-surface)] card overflow-hidden">
527
527
  {/* Header */}
528
528
  <div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between">
529
529
  <div>
@@ -859,7 +859,7 @@ function RegistryBrowser({
859
859
  {servers.map((server) => (
860
860
  <div
861
861
  key={server.id}
862
- className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 hover:border-[var(--color-border-light)] transition"
862
+ className="bg-[var(--color-surface)] card p-4 hover:border-[var(--color-border-light)] transition"
863
863
  >
864
864
  <div className="flex items-start justify-between gap-3">
865
865
  <div className="flex-1 min-w-0">
@@ -913,7 +913,7 @@ function RegistryBrowser({
913
913
  )}
914
914
 
915
915
  {/* Registry info */}
916
- <div className="p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg text-sm text-[var(--color-text-muted)]">
916
+ <div className="p-4 bg-[var(--color-surface)] card text-sm text-[var(--color-text-muted)]">
917
917
  <p>
918
918
  Servers are sourced from the{" "}
919
919
  <a
@@ -1060,7 +1060,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1060
1060
 
1061
1061
  if (!hasAnyConnection) {
1062
1062
  return (
1063
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
1063
+ <div className="bg-[var(--color-surface)] card p-8 text-center">
1064
1064
  <p className="text-[var(--color-text-secondary)] mb-2">No hosted MCP services connected</p>
1065
1065
  <p className="text-sm text-[var(--color-text-muted)] mb-4">
1066
1066
  Connect Composio, Smithery, or AgentDojo in Settings to access cloud-based MCP servers.
@@ -1206,7 +1206,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1206
1206
  {loadingConfigs ? (
1207
1207
  <div className="text-center py-6 text-[var(--color-text-muted)]">Loading configs...</div>
1208
1208
  ) : composioConfigs.length === 0 ? (
1209
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
1209
+ <div className="bg-[var(--color-surface)] card p-4 text-center">
1210
1210
  <p className="text-sm text-[var(--color-text-muted)]">No MCP configs found</p>
1211
1211
  <p className="text-xs text-[var(--color-text-faint)] mt-2">
1212
1212
  First <button onClick={() => setSubTab("connect")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">connect some apps</button>, then create a config.
@@ -1310,7 +1310,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1310
1310
  Browse Smithery →
1311
1311
  </a>
1312
1312
  </div>
1313
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
1313
+ <div className="bg-[var(--color-surface)] card p-4 text-center">
1314
1314
  <p className="text-sm text-[var(--color-text-muted)]">
1315
1315
  Smithery servers can be added from the <strong>Browse Registry</strong> tab.
1316
1316
  </p>
@@ -1498,7 +1498,7 @@ function AgentDojoContent({
1498
1498
  {loadingConfigs ? (
1499
1499
  <div className="text-center py-6 text-[var(--color-text-muted)]">Loading servers...</div>
1500
1500
  ) : configs.length === 0 ? (
1501
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
1501
+ <div className="bg-[var(--color-surface)] card p-4 text-center">
1502
1502
  <p className="text-sm text-[var(--color-text-muted)]">No MCP servers found</p>
1503
1503
  <p className="text-xs text-[var(--color-text-faint)] mt-2">
1504
1504
  <button onClick={() => setSubTab("toolkits")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">
@@ -1845,7 +1845,7 @@ function AddServerModal({
1845
1845
 
1846
1846
  return (
1847
1847
  <div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
1848
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
1848
+ <div className="bg-[var(--color-surface)] card w-full max-w-lg max-h-[90vh] overflow-y-auto">
1849
1849
  <div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
1850
1850
  <h2 className="text-lg font-semibold">Add MCP Server</h2>
1851
1851
  <button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
@@ -2303,7 +2303,7 @@ function EditServerModal({
2303
2303
 
2304
2304
  return (
2305
2305
  <div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
2306
- <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
2306
+ <div className="bg-[var(--color-surface)] card w-full max-w-lg max-h-[90vh] overflow-y-auto">
2307
2307
  <div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
2308
2308
  <h2 className="text-lg font-semibold">Edit MCP Server</h2>
2309
2309
  <button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
@@ -125,7 +125,7 @@ export function OnboardingWizard({ onComplete, needsAccount = false }: Onboardin
125
125
  const currentStep = needsAccount ? step : step - 1;
126
126
 
127
127
  return (
128
- <div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] font-mono flex items-center justify-center p-8">
128
+ <div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center p-8">
129
129
  <div className="w-full max-w-2xl">
130
130
  {/* Logo */}
131
131
  <div className="text-center mb-8">
@@ -149,7 +149,7 @@ export function OnboardingWizard({ onComplete, needsAccount = false }: Onboardin
149
149
  <div className={`w-3 h-3 rounded-full ${step >= 2 ? 'bg-[var(--color-accent)]' : 'bg-[var(--color-surface-raised)]'}`} />
150
150
  </div>
151
151
 
152
- <div className="bg-[var(--color-surface)] rounded-lg border border-[var(--color-border)] p-8">
152
+ <div className="bg-[var(--color-surface)] card p-8">
153
153
  {step === 0 && needsAccount && (
154
154
  <CreateAccountStep onComplete={handleAccountCreated} />
155
155
  )}