apteva 0.4.41 → 0.4.44

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 (102) hide show
  1. package/dist/ActivityPage.c48n83h2.js +3 -0
  2. package/dist/ApiDocsPage.yzcxx5ax.js +4 -0
  3. package/dist/App.09yb8t0b.js +1 -0
  4. package/dist/App.152mbs1r.js +4 -0
  5. package/dist/App.3a67nx9w.js +4 -0
  6. package/dist/App.9epx6785.js +4 -0
  7. package/dist/App.d8955awp.js +4 -0
  8. package/dist/App.drwb57jq.js +4 -0
  9. package/dist/App.gssbmajb.js +4 -0
  10. package/dist/App.qw70pc29.js +53 -0
  11. package/dist/{App.7fb3e7mp.js → App.qzbx5wtj.js} +1 -1
  12. package/dist/App.r5serxkt.js +8 -0
  13. package/dist/App.tpmp9020.js +20 -0
  14. package/dist/App.v2wb4d7d.js +61 -0
  15. package/dist/App.vxmaaj0m.js +13 -0
  16. package/dist/App.w4p2tda9.js +4 -0
  17. package/dist/App.wv2ng55q.js +221 -0
  18. package/dist/App.yncnrn0f.js +4 -0
  19. package/dist/ConnectionsPage.k6cspyqq.js +3 -0
  20. package/dist/McpPage.cdxm48xj.js +3 -0
  21. package/dist/SettingsPage.evpv7c2y.js +3 -0
  22. package/dist/SkillsPage.pvzp6c1a.js +3 -0
  23. package/dist/TasksPage.6jnvbpsy.js +3 -0
  24. package/dist/TelemetryPage.t7vk24zc.js +3 -0
  25. package/dist/TestsPage.5x6658aa.js +3 -0
  26. package/dist/ThreadsPage.3fvhtevh.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 +8 -8
  31. package/src/db.ts +19 -9
  32. package/src/integrations/agentdojo.ts +1 -0
  33. package/src/mcp-platform.ts +418 -63
  34. package/src/openapi.ts +96 -0
  35. package/src/providers.ts +50 -24
  36. package/src/routes/api/agent-utils.ts +0 -1
  37. package/src/routes/api/agents.ts +19 -1
  38. package/src/routes/api/meta-agent.ts +2 -0
  39. package/src/routes/api/system.ts +90 -1
  40. package/src/routes/api/telemetry.ts +19 -1
  41. package/src/routes/share.ts +85 -0
  42. package/src/server.ts +12 -0
  43. package/src/web/App.tsx +89 -11
  44. package/src/web/components/activity/ActivityPage.tsx +14 -14
  45. package/src/web/components/agents/AgentCard.tsx +14 -14
  46. package/src/web/components/agents/AgentPanel.tsx +358 -198
  47. package/src/web/components/agents/AgentsView.tsx +4 -4
  48. package/src/web/components/agents/CreateAgentModal.tsx +21 -79
  49. package/src/web/components/api/ApiDocsPage.tsx +66 -66
  50. package/src/web/components/auth/CreateAccountStep.tsx +16 -16
  51. package/src/web/components/auth/LoginPage.tsx +10 -10
  52. package/src/web/components/common/LoadingSpinner.tsx +2 -2
  53. package/src/web/components/common/Modal.tsx +8 -8
  54. package/src/web/components/common/Select.tsx +9 -9
  55. package/src/web/components/connections/ConnectionsPage.tsx +4 -4
  56. package/src/web/components/connections/IntegrationsTab.tsx +18 -18
  57. package/src/web/components/connections/OverviewTab.tsx +13 -13
  58. package/src/web/components/connections/TriggersTab.tsx +99 -99
  59. package/src/web/components/dashboard/Dashboard.tsx +32 -32
  60. package/src/web/components/layout/Header.tsx +50 -34
  61. package/src/web/components/layout/Sidebar.tsx +34 -15
  62. package/src/web/components/mcp/IntegrationsPanel.tsx +40 -40
  63. package/src/web/components/mcp/McpPage.tsx +208 -208
  64. package/src/web/components/meta-agent/MetaAgent.tsx +12 -10
  65. package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
  66. package/src/web/components/settings/SettingsPage.tsx +258 -175
  67. package/src/web/components/skills/SkillsPage.tsx +88 -88
  68. package/src/web/components/tasks/TasksPage.tsx +339 -54
  69. package/src/web/components/telemetry/TelemetryPage.tsx +135 -64
  70. package/src/web/components/tests/TestsPage.tsx +50 -50
  71. package/src/web/components/threads/ThreadsPage.tsx +23 -21
  72. package/src/web/context/ProjectContext.tsx +6 -1
  73. package/src/web/context/ThemeContext.tsx +69 -0
  74. package/src/web/context/index.ts +2 -0
  75. package/src/web/styles.css +5 -3
  76. package/src/web/themes.ts +99 -0
  77. package/src/web/types.ts +0 -4
  78. package/dist/ActivityPage.7907h64p.js +0 -3
  79. package/dist/ApiDocsPage.k3jjenpq.js +0 -4
  80. package/dist/App.01nq20st.js +0 -4
  81. package/dist/App.1maqvamf.js +0 -4
  82. package/dist/App.2yjrh32f.js +0 -4
  83. package/dist/App.3qw8nben.js +0 -20
  84. package/dist/App.7sy3wq8c.js +0 -4
  85. package/dist/App.apjrmctz.js +0 -57
  86. package/dist/App.av6t2yhe.js +0 -4
  87. package/dist/App.jqj5a094.js +0 -46
  88. package/dist/App.mc7xf85h.js +0 -4
  89. package/dist/App.myxqcj9x.js +0 -4
  90. package/dist/App.nm91r1mp.js +0 -13
  91. package/dist/App.p02f4ret.js +0 -1
  92. package/dist/App.qcknavjz.js +0 -221
  93. package/dist/App.vc7vfhg4.js +0 -4
  94. package/dist/App.z4s9zkw5.js +0 -4
  95. package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
  96. package/dist/McpPage.8vc97z0b.js +0 -3
  97. package/dist/SettingsPage.p61bz8kd.js +0 -3
  98. package/dist/SkillsPage.r9x43g3g.js +0 -3
  99. package/dist/TasksPage.1e0zkye4.js +0 -3
  100. package/dist/TelemetryPage.p9vbe4gf.js +0 -3
  101. package/dist/TestsPage.d4xy504e.js +0 -3
  102. package/dist/ThreadsPage.m016am3x.js +0 -3
@@ -141,14 +141,14 @@ export function McpPage() {
141
141
  <div className="flex items-center justify-between mb-6">
142
142
  <div>
143
143
  <h1 className="text-2xl font-semibold mb-1">MCP Servers</h1>
144
- <p className="text-[#666]">
144
+ <p className="text-[var(--color-text-muted)]">
145
145
  Manage Model Context Protocol servers for tool integrations.
146
146
  </p>
147
147
  </div>
148
148
  {activeTab === "servers" && (
149
149
  <button
150
150
  onClick={() => setShowAdd(true)}
151
- className="bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition"
151
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
152
152
  >
153
153
  + Add Server
154
154
  </button>
@@ -156,13 +156,13 @@ export function McpPage() {
156
156
  </div>
157
157
 
158
158
  {/* Tabs */}
159
- <div className="flex gap-1 mb-6 bg-[#111] border border-[#1a1a1a] rounded-lg p-1 w-fit">
159
+ <div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg 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 ${
163
163
  activeTab === "servers"
164
- ? "bg-[#1a1a1a] text-white"
165
- : "text-[#666] hover:text-[#888]"
164
+ ? "bg-[var(--color-surface-raised)] text-white"
165
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
166
166
  }`}
167
167
  >
168
168
  My Servers
@@ -171,8 +171,8 @@ export function McpPage() {
171
171
  onClick={() => setActiveTab("hosted")}
172
172
  className={`px-4 py-2 rounded text-sm font-medium transition ${
173
173
  activeTab === "hosted"
174
- ? "bg-[#1a1a1a] text-white"
175
- : "text-[#666] hover:text-[#888]"
174
+ ? "bg-[var(--color-surface-raised)] text-white"
175
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
176
176
  }`}
177
177
  >
178
178
  Hosted Services
@@ -181,8 +181,8 @@ export function McpPage() {
181
181
  onClick={() => setActiveTab("registry")}
182
182
  className={`px-4 py-2 rounded text-sm font-medium transition ${
183
183
  activeTab === "registry"
184
- ? "bg-[#1a1a1a] text-white"
185
- : "text-[#666] hover:text-[#888]"
184
+ ? "bg-[var(--color-surface-raised)] text-white"
185
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
186
186
  }`}
187
187
  >
188
188
  Browse Registry
@@ -194,28 +194,28 @@ export function McpPage() {
194
194
  <>
195
195
  {/* Loading */}
196
196
  {loading && (
197
- <div className="text-center py-8 text-[#666]">Loading...</div>
197
+ <div className="text-center py-8 text-[var(--color-text-muted)]">Loading...</div>
198
198
  )}
199
199
 
200
200
  {/* Empty State */}
201
201
  {!loading && filteredServers.length === 0 && servers.length === 0 && (
202
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center">
203
- <McpIcon className="w-12 h-12 text-[#333] mx-auto mb-4" />
202
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
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
- <p className="text-[#666] mb-6 max-w-md mx-auto">
205
+ <p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
206
206
  MCP servers extend your agents with tools like file access, web browsing,
207
207
  database connections, and more.
208
208
  </p>
209
209
  <div className="flex gap-3 justify-center">
210
210
  <button
211
211
  onClick={() => setShowAdd(true)}
212
- className="bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition"
212
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
213
213
  >
214
214
  Add Manually
215
215
  </button>
216
216
  <button
217
217
  onClick={() => setActiveTab("registry")}
218
- className="border border-[#333] hover:border-[#666] px-4 py-2 rounded font-medium transition"
218
+ className="border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] px-4 py-2 rounded font-medium transition"
219
219
  >
220
220
  Browse Registry
221
221
  </button>
@@ -225,8 +225,8 @@ export function McpPage() {
225
225
 
226
226
  {/* Empty filter state */}
227
227
  {!loading && filteredServers.length === 0 && servers.length > 0 && (
228
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-6 text-center">
229
- <p className="text-[#666]">No servers match this filter.</p>
228
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center">
229
+ <p className="text-[var(--color-text-muted)]">No servers match this filter.</p>
230
230
  </div>
231
231
  )}
232
232
 
@@ -298,9 +298,9 @@ 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-[#111] border border-[#1a1a1a] rounded-lg">
301
+ <div className="mt-8 p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg">
302
302
  <h3 className="font-medium mb-2">Quick Start</h3>
303
- <p className="text-sm text-[#666] mb-3">
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:
305
305
  </p>
306
306
  <div className="flex flex-wrap gap-2">
@@ -309,7 +309,7 @@ export function McpPage() {
309
309
  { name: "fetch", pkg: "@modelcontextprotocol/server-fetch" },
310
310
  { name: "memory", pkg: "@modelcontextprotocol/server-memory" },
311
311
  ].map(s => (
312
- <code key={s.name} className="text-xs bg-[#0a0a0a] px-2 py-1 rounded">
312
+ <code key={s.name} className="text-xs bg-[var(--color-bg)] px-2 py-1 rounded">
313
313
  {s.pkg}
314
314
  </code>
315
315
  ))}
@@ -396,7 +396,7 @@ function McpServerCard({
396
396
  }
397
397
  if (server.project_id === null) {
398
398
  return (
399
- <span className="text-xs text-[#666] bg-[#1a1a1a] px-1.5 py-0.5 rounded">
399
+ <span className="text-xs text-[var(--color-text-muted)] bg-[var(--color-surface-raised)] px-1.5 py-0.5 rounded">
400
400
  Global
401
401
  </span>
402
402
  );
@@ -406,28 +406,28 @@ function McpServerCard({
406
406
 
407
407
  return (
408
408
  <div
409
- className={`bg-[#111] border rounded-lg p-4 cursor-pointer transition ${
410
- selected ? "border-[#f97316]" : "border-[#1a1a1a] hover:border-[#333]"
409
+ className={`bg-[var(--color-surface)] border rounded-lg p-4 cursor-pointer transition ${
410
+ selected ? "border-[var(--color-accent)]" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
411
411
  }`}
412
412
  onClick={isAvailable ? onSelect : undefined}
413
413
  >
414
414
  <div className="flex items-center justify-between">
415
415
  <div className="flex items-center gap-3">
416
416
  <div className={`w-2 h-2 rounded-full ${
417
- isAvailable ? "bg-green-400" : "bg-[#444]"
417
+ isAvailable ? "bg-green-400" : "bg-[var(--color-scrollbar)]"
418
418
  }`} />
419
419
  <div>
420
420
  <div className="flex items-center gap-2">
421
421
  <h3 className="font-medium">{server.name}</h3>
422
422
  {getScopeBadge()}
423
423
  </div>
424
- <p className="text-sm text-[#666]">{getServerInfo()}</p>
424
+ <p className="text-sm text-[var(--color-text-muted)]">{getServerInfo()}</p>
425
425
  </div>
426
426
  </div>
427
427
  <div className="flex items-center gap-2">
428
428
  <button
429
429
  onClick={(e) => { e.stopPropagation(); onEdit(); }}
430
- className="text-sm text-[#666] hover:text-[#888] px-3 py-1 transition"
430
+ className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] px-3 py-1 transition"
431
431
  title="Edit server settings"
432
432
  >
433
433
  Edit
@@ -436,7 +436,7 @@ function McpServerCard({
436
436
  // Remote servers: no start/stop, just delete
437
437
  <button
438
438
  onClick={(e) => { e.stopPropagation(); onDelete(); }}
439
- className="text-sm text-[#666] hover:text-red-400 px-3 py-1 transition"
439
+ className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
440
440
  >
441
441
  Remove
442
442
  </button>
@@ -445,19 +445,19 @@ function McpServerCard({
445
445
  <>
446
446
  <button
447
447
  onClick={(e) => { e.stopPropagation(); onSelect(); }}
448
- className="text-sm text-[#f97316] hover:text-[#fb923c] px-3 py-1 transition"
448
+ className="text-sm text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] px-3 py-1 transition"
449
449
  >
450
450
  Tools
451
451
  </button>
452
452
  <button
453
453
  onClick={(e) => { e.stopPropagation(); onStop(); }}
454
- className="text-sm text-[#666] hover:text-red-400 px-3 py-1 transition"
454
+ className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
455
455
  >
456
456
  Stop
457
457
  </button>
458
458
  <button
459
459
  onClick={(e) => { e.stopPropagation(); onDelete(); }}
460
- className="text-sm text-[#666] hover:text-red-400 px-3 py-1 transition"
460
+ className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
461
461
  >
462
462
  Delete
463
463
  </button>
@@ -467,13 +467,13 @@ function McpServerCard({
467
467
  <>
468
468
  <button
469
469
  onClick={(e) => { e.stopPropagation(); onStart(); }}
470
- className="text-sm text-[#666] hover:text-green-400 px-3 py-1 transition"
470
+ className="text-sm text-[var(--color-text-muted)] hover:text-green-400 px-3 py-1 transition"
471
471
  >
472
472
  Start
473
473
  </button>
474
474
  <button
475
475
  onClick={(e) => { e.stopPropagation(); onDelete(); }}
476
- className="text-sm text-[#666] hover:text-red-400 px-3 py-1 transition"
476
+ className="text-sm text-[var(--color-text-muted)] hover:text-red-400 px-3 py-1 transition"
477
477
  >
478
478
  Delete
479
479
  </button>
@@ -523,20 +523,20 @@ function ToolsPanel({
523
523
  }, [server.id, authFetch]);
524
524
 
525
525
  return (
526
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg overflow-hidden">
526
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg overflow-hidden">
527
527
  {/* Header */}
528
- <div className="p-4 border-b border-[#1a1a1a] flex items-center justify-between">
528
+ <div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between">
529
529
  <div>
530
530
  <h3 className="font-medium">{server.name} Tools</h3>
531
531
  {serverInfo && (
532
- <p className="text-xs text-[#666]">
532
+ <p className="text-xs text-[var(--color-text-muted)]">
533
533
  {serverInfo.name} v{serverInfo.version}
534
534
  </p>
535
535
  )}
536
536
  </div>
537
537
  <button
538
538
  onClick={onClose}
539
- className="text-[#666] hover:text-[#888] text-xl leading-none"
539
+ className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] text-xl leading-none"
540
540
  >
541
541
  ×
542
542
  </button>
@@ -544,7 +544,7 @@ function ToolsPanel({
544
544
 
545
545
  {/* Content */}
546
546
  <div className="p-4 max-h-[500px] overflow-auto">
547
- {loading && <p className="text-[#666]">Loading tools...</p>}
547
+ {loading && <p className="text-[var(--color-text-muted)]">Loading tools...</p>}
548
548
 
549
549
  {error && (
550
550
  <div className="text-red-400 text-sm p-3 bg-red-500/10 rounded">
@@ -553,7 +553,7 @@ function ToolsPanel({
553
553
  )}
554
554
 
555
555
  {!loading && !error && tools.length === 0 && (
556
- <p className="text-[#666]">No tools available from this server.</p>
556
+ <p className="text-[var(--color-text-muted)]">No tools available from this server.</p>
557
557
  )}
558
558
 
559
559
  {!loading && !error && tools.length > 0 && !selectedTool && (
@@ -562,11 +562,11 @@ function ToolsPanel({
562
562
  <button
563
563
  key={tool.name}
564
564
  onClick={() => setSelectedTool(tool)}
565
- className="w-full text-left p-3 bg-[#0a0a0a] hover:bg-[#1a1a1a] border border-[#222] hover:border-[#333] rounded transition"
565
+ className="w-full text-left p-3 bg-[var(--color-bg)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-border-light)] rounded transition"
566
566
  >
567
567
  <div className="font-medium text-sm">{tool.name}</div>
568
568
  {tool.description && (
569
- <div className="text-xs text-[#666] mt-1">{tool.description}</div>
569
+ <div className="text-xs text-[var(--color-text-muted)] mt-1">{tool.description}</div>
570
570
  )}
571
571
  </button>
572
572
  ))}
@@ -658,25 +658,25 @@ function ToolTester({
658
658
  <div className="flex items-center gap-2">
659
659
  <button
660
660
  onClick={onBack}
661
- className="text-[#666] hover:text-[#888] text-sm"
661
+ className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] text-sm"
662
662
  >
663
663
  ← Back
664
664
  </button>
665
- <span className="text-[#444]">/</span>
665
+ <span className="text-[var(--color-text-faint)]">/</span>
666
666
  <span className="font-medium">{tool.name}</span>
667
667
  </div>
668
668
 
669
669
  {/* Description */}
670
670
  {tool.description && (
671
- <p className="text-sm text-[#666]">{tool.description}</p>
671
+ <p className="text-sm text-[var(--color-text-muted)]">{tool.description}</p>
672
672
  )}
673
673
 
674
674
  {/* Schema info */}
675
675
  {tool.inputSchema && (
676
676
  <div className="text-xs">
677
677
  <details className="cursor-pointer">
678
- <summary className="text-[#666] hover:text-[#888]">Input Schema</summary>
679
- <pre className="mt-2 p-2 bg-[#0a0a0a] rounded text-[#888] overflow-auto max-h-32">
678
+ <summary className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">Input Schema</summary>
679
+ <pre className="mt-2 p-2 bg-[var(--color-bg)] rounded text-[var(--color-text-secondary)] overflow-auto max-h-32">
680
680
  {JSON.stringify(tool.inputSchema, null, 2)}
681
681
  </pre>
682
682
  </details>
@@ -685,11 +685,11 @@ function ToolTester({
685
685
 
686
686
  {/* Arguments input */}
687
687
  <div>
688
- <label className="block text-sm text-[#666] mb-1">Arguments (JSON)</label>
688
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Arguments (JSON)</label>
689
689
  <textarea
690
690
  value={args}
691
691
  onChange={(e) => setArgs(e.target.value)}
692
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 h-32 font-mono text-sm focus:outline-none focus:border-[#f97316] resize-none"
692
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 h-32 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)] resize-none"
693
693
  placeholder="{}"
694
694
  />
695
695
  </div>
@@ -698,7 +698,7 @@ function ToolTester({
698
698
  <button
699
699
  onClick={callTool}
700
700
  disabled={loading}
701
- className="w-full bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
701
+ className="w-full bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
702
702
  >
703
703
  {loading ? "Calling..." : "Call Tool"}
704
704
  </button>
@@ -713,7 +713,7 @@ function ToolTester({
713
713
  {/* Result */}
714
714
  {result && (
715
715
  <div className="space-y-2">
716
- <div className="text-sm text-[#666]">
716
+ <div className="text-sm text-[var(--color-text-muted)]">
717
717
  Result {result.isError && <span className="text-red-400">(error)</span>}
718
718
  </div>
719
719
  <div className={`p-3 rounded text-sm ${result.isError ? "bg-red-500/10" : "bg-green-500/10"}`}>
@@ -829,12 +829,12 @@ function RegistryBrowser({
829
829
  value={search}
830
830
  onChange={(e) => setSearch(e.target.value)}
831
831
  placeholder="Search MCP servers (e.g., filesystem, github, slack...)"
832
- className="flex-1 bg-[#111] border border-[#333] rounded-lg px-4 py-3 focus:outline-none focus:border-[#f97316]"
832
+ className="flex-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
833
833
  />
834
834
  <button
835
835
  type="submit"
836
836
  disabled={loading}
837
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition"
837
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition"
838
838
  >
839
839
  {loading ? "..." : "Search"}
840
840
  </button>
@@ -849,7 +849,7 @@ function RegistryBrowser({
849
849
 
850
850
  {/* Results */}
851
851
  {!loading && searched && servers.length === 0 && (
852
- <div className="text-center py-8 text-[#666]">
852
+ <div className="text-center py-8 text-[var(--color-text-muted)]">
853
853
  No servers found. Try a different search term.
854
854
  </div>
855
855
  )}
@@ -859,15 +859,15 @@ function RegistryBrowser({
859
859
  {servers.map((server) => (
860
860
  <div
861
861
  key={server.id}
862
- className="bg-[#111] border border-[#1a1a1a] rounded-lg p-4 hover:border-[#333] transition"
862
+ className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg 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">
866
866
  <h3 className="font-medium truncate">{server.name}</h3>
867
- <p className="text-sm text-[#666] mt-1 line-clamp-2">
867
+ <p className="text-sm text-[var(--color-text-muted)] mt-1 line-clamp-2">
868
868
  {server.description || "No description"}
869
869
  </p>
870
- <div className="flex items-center gap-2 mt-2 text-xs text-[#555]">
870
+ <div className="flex items-center gap-2 mt-2 text-xs text-[var(--color-text-faint)]">
871
871
  {server.version && <span>v{server.version}</span>}
872
872
  <span className={`px-1.5 py-0.5 rounded ${
873
873
  server.npmPackage ? "bg-green-500/10 text-green-400" : "bg-blue-500/10 text-blue-400"
@@ -875,7 +875,7 @@ function RegistryBrowser({
875
875
  {server.npmPackage ? "npm" : "remote"}
876
876
  </span>
877
877
  </div>
878
- <code className="text-xs text-[#555] bg-[#0a0a0a] px-2 py-0.5 rounded mt-2 inline-block truncate max-w-full">
878
+ <code className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] px-2 py-0.5 rounded mt-2 inline-block truncate max-w-full">
879
879
  {server.npmPackage || server.fullName}
880
880
  </code>
881
881
  </div>
@@ -884,7 +884,7 @@ function RegistryBrowser({
884
884
  <button
885
885
  onClick={() => installServer(server)}
886
886
  disabled={installing === server.id}
887
- className="text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition disabled:opacity-50"
887
+ className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-3 py-1.5 rounded transition disabled:opacity-50"
888
888
  >
889
889
  {installing === server.id ? "Adding..." : "Add"}
890
890
  </button>
@@ -893,7 +893,7 @@ function RegistryBrowser({
893
893
  href={server.repository}
894
894
  target="_blank"
895
895
  rel="noopener noreferrer"
896
- className="text-sm text-[#666] hover:text-[#f97316] transition"
896
+ className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
897
897
  >
898
898
  View →
899
899
  </a>
@@ -907,20 +907,20 @@ function RegistryBrowser({
907
907
 
908
908
  {/* Loading */}
909
909
  {loading && (
910
- <div className="text-center py-8 text-[#666]">
910
+ <div className="text-center py-8 text-[var(--color-text-muted)]">
911
911
  Searching registry...
912
912
  </div>
913
913
  )}
914
914
 
915
915
  {/* Registry info */}
916
- <div className="p-4 bg-[#111] border border-[#1a1a1a] rounded-lg text-sm text-[#666]">
916
+ <div className="p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg text-sm text-[var(--color-text-muted)]">
917
917
  <p>
918
918
  Servers are sourced from the{" "}
919
919
  <a
920
920
  href="https://github.com/modelcontextprotocol/servers"
921
921
  target="_blank"
922
922
  rel="noopener noreferrer"
923
- className="text-[#f97316] hover:underline"
923
+ className="text-[var(--color-accent)] hover:underline"
924
924
  >
925
925
  official MCP registry
926
926
  </a>
@@ -1052,7 +1052,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1052
1052
  }, [authFetch, projectId]);
1053
1053
 
1054
1054
  if (loading) {
1055
- return <div className="text-center py-8 text-[#666]">Loading...</div>;
1055
+ return <div className="text-center py-8 text-[var(--color-text-muted)]">Loading...</div>;
1056
1056
  }
1057
1057
 
1058
1058
  const hasAnyConnection = composioConnected || smitheryConnected || agentDojoConnected;
@@ -1060,14 +1060,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1060
1060
 
1061
1061
  if (!hasAnyConnection) {
1062
1062
  return (
1063
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center">
1064
- <p className="text-[#888] mb-2">No hosted MCP services connected</p>
1065
- <p className="text-sm text-[#666] mb-4">
1063
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
1064
+ <p className="text-[var(--color-text-secondary)] mb-2">No hosted MCP services connected</p>
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.
1067
1067
  </p>
1068
1068
  <a
1069
1069
  href="/settings"
1070
- className="inline-block bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-4 py-2 rounded text-sm font-medium transition"
1070
+ className="inline-block bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-4 py-2 rounded text-sm font-medium transition"
1071
1071
  >
1072
1072
  Go to Settings →
1073
1073
  </a>
@@ -1081,14 +1081,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1081
1081
  <div className="space-y-6">
1082
1082
  {/* Provider Tabs - show when multiple providers are connected */}
1083
1083
  {connectedCount > 1 && (
1084
- <div className="flex gap-1 bg-[#0a0a0a] border border-[#222] rounded-lg p-1 w-fit">
1084
+ <div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1 w-fit">
1085
1085
  {composioConnected && (
1086
1086
  <button
1087
1087
  onClick={() => { setActiveProvider("composio"); setSubTab("configs"); }}
1088
1088
  className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
1089
1089
  activeProvider === "composio"
1090
- ? "bg-[#1a1a1a] text-white"
1091
- : "text-[#666] hover:text-[#888]"
1090
+ ? "bg-[var(--color-surface-raised)] text-white"
1091
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1092
1092
  }`}
1093
1093
  >
1094
1094
  <span className="w-2 h-2 rounded-full bg-purple-500" />
@@ -1100,8 +1100,8 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1100
1100
  onClick={() => setActiveProvider("smithery")}
1101
1101
  className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
1102
1102
  activeProvider === "smithery"
1103
- ? "bg-[#1a1a1a] text-white"
1104
- : "text-[#666] hover:text-[#888]"
1103
+ ? "bg-[var(--color-surface-raised)] text-white"
1104
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1105
1105
  }`}
1106
1106
  >
1107
1107
  <span className="w-2 h-2 rounded-full bg-blue-500" />
@@ -1113,8 +1113,8 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1113
1113
  onClick={() => setActiveProvider("agentdojo")}
1114
1114
  className={`px-4 py-2 rounded text-sm font-medium transition flex items-center gap-2 ${
1115
1115
  activeProvider === "agentdojo"
1116
- ? "bg-[#1a1a1a] text-white"
1117
- : "text-[#666] hover:text-[#888]"
1116
+ ? "bg-[var(--color-surface-raised)] text-white"
1117
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1118
1118
  }`}
1119
1119
  >
1120
1120
  <span className="w-2 h-2 rounded-full bg-green-500" />
@@ -1129,13 +1129,13 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1129
1129
  <>
1130
1130
  {/* Sub-tabs for Composio */}
1131
1131
  <div className="flex items-center justify-between">
1132
- <div className="flex gap-1 bg-[#0a0a0a] border border-[#222] rounded-lg p-1">
1132
+ <div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1">
1133
1133
  <button
1134
1134
  onClick={() => setSubTab("configs")}
1135
1135
  className={`px-4 py-2 rounded text-sm font-medium transition ${
1136
1136
  subTab === "configs"
1137
- ? "bg-[#1a1a1a] text-white"
1138
- : "text-[#666] hover:text-[#888]"
1137
+ ? "bg-[var(--color-surface-raised)] text-white"
1138
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1139
1139
  }`}
1140
1140
  >
1141
1141
  MCP Configs
@@ -1144,15 +1144,15 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1144
1144
  onClick={() => setSubTab("connect")}
1145
1145
  className={`px-4 py-2 rounded text-sm font-medium transition ${
1146
1146
  subTab === "connect"
1147
- ? "bg-[#1a1a1a] text-white"
1148
- : "text-[#666] hover:text-[#888]"
1147
+ ? "bg-[var(--color-surface-raised)] text-white"
1148
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1149
1149
  }`}
1150
1150
  >
1151
1151
  Connect Apps
1152
1152
  </button>
1153
1153
  </div>
1154
1154
  {connectedCount === 1 && (
1155
- <div className="flex items-center gap-2 text-xs text-[#666]">
1155
+ <div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)]">
1156
1156
  <span className="w-2 h-2 rounded-full bg-purple-500" />
1157
1157
  Composio
1158
1158
  <span className="text-green-400">Connected</span>
@@ -1163,7 +1163,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1163
1163
  {/* Connect Apps Tab */}
1164
1164
  {subTab === "connect" && (
1165
1165
  <div>
1166
- <p className="text-sm text-[#666] mb-4">
1166
+ <p className="text-sm text-[var(--color-text-muted)] mb-4">
1167
1167
  Connect your accounts to enable tools in MCP configs
1168
1168
  </p>
1169
1169
  <IntegrationsPanel
@@ -1181,14 +1181,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1181
1181
  {subTab === "configs" && (
1182
1182
  <div>
1183
1183
  <div className="flex items-center justify-between mb-3">
1184
- <p className="text-sm text-[#666]">
1184
+ <p className="text-sm text-[var(--color-text-muted)]">
1185
1185
  Your MCP configs from Composio
1186
1186
  </p>
1187
1187
  <div className="flex items-center gap-3">
1188
1188
  <button
1189
1189
  onClick={fetchComposioConfigs}
1190
1190
  disabled={loadingConfigs}
1191
- className="text-xs text-[#666] hover:text-[#888] transition"
1191
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
1192
1192
  >
1193
1193
  {loadingConfigs ? "Loading..." : "Refresh"}
1194
1194
  </button>
@@ -1196,7 +1196,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1196
1196
  href="https://app.composio.dev/mcp_configs"
1197
1197
  target="_blank"
1198
1198
  rel="noopener noreferrer"
1199
- className="text-xs text-[#666] hover:text-[#f97316] transition"
1199
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
1200
1200
  >
1201
1201
  Create Config →
1202
1202
  </a>
@@ -1204,18 +1204,18 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1204
1204
  </div>
1205
1205
 
1206
1206
  {loadingConfigs ? (
1207
- <div className="text-center py-6 text-[#666]">Loading configs...</div>
1207
+ <div className="text-center py-6 text-[var(--color-text-muted)]">Loading configs...</div>
1208
1208
  ) : composioConfigs.length === 0 ? (
1209
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-4 text-center">
1210
- <p className="text-sm text-[#666]">No MCP configs found</p>
1211
- <p className="text-xs text-[#555] mt-2">
1212
- First <button onClick={() => setSubTab("connect")} className="text-[#f97316] hover:text-[#fb923c]">connect some apps</button>, then create a config.
1209
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
1210
+ <p className="text-sm text-[var(--color-text-muted)]">No MCP configs found</p>
1211
+ <p className="text-xs text-[var(--color-text-faint)] mt-2">
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.
1213
1213
  </p>
1214
1214
  <a
1215
1215
  href="https://app.composio.dev/mcp_configs"
1216
1216
  target="_blank"
1217
1217
  rel="noopener noreferrer"
1218
- className="text-xs text-[#f97316] hover:text-[#fb923c] mt-2 inline-block"
1218
+ className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] mt-2 inline-block"
1219
1219
  >
1220
1220
  Create in Composio →
1221
1221
  </a>
@@ -1228,14 +1228,14 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1228
1228
  return (
1229
1229
  <div
1230
1230
  key={config.id}
1231
- className={`bg-[#111] border rounded-lg p-3 transition flex items-center justify-between ${
1232
- added ? "border-green-500/30" : "border-[#1a1a1a] hover:border-[#333]"
1231
+ className={`bg-[var(--color-surface)] border rounded-lg p-3 transition flex items-center justify-between ${
1232
+ added ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
1233
1233
  }`}
1234
1234
  >
1235
1235
  <div className="flex-1 min-w-0">
1236
1236
  <div className="flex items-center gap-2">
1237
1237
  <span className="font-medium text-sm">{config.name}</span>
1238
- <span className="text-xs text-[#555]">{config.toolsCount} tools</span>
1238
+ <span className="text-xs text-[var(--color-text-faint)]">{config.toolsCount} tools</span>
1239
1239
  {added && (
1240
1240
  <span className="text-xs text-green-400">Added</span>
1241
1241
  )}
@@ -1245,25 +1245,25 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1245
1245
  {config.toolkits.slice(0, 4).map((toolkit) => (
1246
1246
  <span
1247
1247
  key={toolkit}
1248
- className="text-xs bg-[#1a1a1a] text-[#666] px-1.5 py-0.5 rounded"
1248
+ className="text-xs bg-[var(--color-surface-raised)] text-[var(--color-text-muted)] px-1.5 py-0.5 rounded"
1249
1249
  >
1250
1250
  {toolkit}
1251
1251
  </span>
1252
1252
  ))}
1253
1253
  {config.toolkits.length > 4 && (
1254
- <span className="text-xs text-[#555]">+{config.toolkits.length - 4}</span>
1254
+ <span className="text-xs text-[var(--color-text-faint)]">+{config.toolkits.length - 4}</span>
1255
1255
  )}
1256
1256
  </div>
1257
1257
  )}
1258
1258
  </div>
1259
1259
  <div className="flex items-center gap-2 ml-3">
1260
1260
  {added ? (
1261
- <span className="text-xs text-[#555] px-2 py-1">In Servers</span>
1261
+ <span className="text-xs text-[var(--color-text-faint)] px-2 py-1">In Servers</span>
1262
1262
  ) : (
1263
1263
  <button
1264
1264
  onClick={() => addComposioConfig(config.id)}
1265
1265
  disabled={isAdding}
1266
- className="text-xs bg-[#f97316] hover:bg-[#fb923c] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
1266
+ className="text-xs bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
1267
1267
  >
1268
1268
  {isAdding ? "Adding..." : "Add"}
1269
1269
  </button>
@@ -1272,7 +1272,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1272
1272
  href={`https://app.composio.dev/mcp_configs/${config.id}`}
1273
1273
  target="_blank"
1274
1274
  rel="noopener noreferrer"
1275
- className="text-xs text-[#666] hover:text-[#888] transition"
1275
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
1276
1276
  >
1277
1277
  Edit
1278
1278
  </a>
@@ -1291,30 +1291,30 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1291
1291
  {smitheryConnected && (connectedCount === 1 || activeProvider === "smithery") && (
1292
1292
  <div>
1293
1293
  {connectedCount === 1 && (
1294
- <div className="flex items-center gap-2 text-xs text-[#666] mb-4">
1294
+ <div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)] mb-4">
1295
1295
  <span className="w-2 h-2 rounded-full bg-blue-500" />
1296
1296
  Smithery
1297
1297
  <span className="text-green-400">Connected</span>
1298
1298
  </div>
1299
1299
  )}
1300
1300
  <div className="flex items-center justify-between mb-3">
1301
- <p className="text-sm text-[#666]">
1301
+ <p className="text-sm text-[var(--color-text-muted)]">
1302
1302
  Add MCP servers from the Smithery registry
1303
1303
  </p>
1304
1304
  <a
1305
1305
  href="https://smithery.ai/servers"
1306
1306
  target="_blank"
1307
1307
  rel="noopener noreferrer"
1308
- className="text-xs text-[#666] hover:text-[#f97316] transition"
1308
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition"
1309
1309
  >
1310
1310
  Browse Smithery →
1311
1311
  </a>
1312
1312
  </div>
1313
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-4 text-center">
1314
- <p className="text-sm text-[#666]">
1313
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
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>
1317
- <p className="text-xs text-[#555] mt-2">
1317
+ <p className="text-xs text-[var(--color-text-faint)] mt-2">
1318
1318
  Your API key will be used automatically when adding Smithery servers.
1319
1319
  </p>
1320
1320
  </div>
@@ -1330,10 +1330,10 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
1330
1330
  />
1331
1331
  )}
1332
1332
 
1333
- <div className="p-3 bg-[#0a0a0a] border border-[#222] rounded text-xs text-[#666]">
1334
- <strong className="text-[#888]">Tip:</strong> Connect apps first, then add MCP configs to make tools available to your agents.
1333
+ <div className="p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded text-xs text-[var(--color-text-muted)]">
1334
+ <strong className="text-[var(--color-text-secondary)]">Tip:</strong> Connect apps first, then add MCP configs to make tools available to your agents.
1335
1335
  {" · "}
1336
- <a href="/settings" className="text-[#f97316] hover:text-[#fb923c]">Add more providers in Settings</a>
1336
+ <a href="/settings" className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">Add more providers in Settings</a>
1337
1337
  </div>
1338
1338
  </div>
1339
1339
  </>
@@ -1446,7 +1446,7 @@ function AgentDojoContent({
1446
1446
  {AlertDialog}
1447
1447
  <div>
1448
1448
  {showProviderBadge && (
1449
- <div className="flex items-center gap-2 text-xs text-[#666] mb-4">
1449
+ <div className="flex items-center gap-2 text-xs text-[var(--color-text-muted)] mb-4">
1450
1450
  <span className="w-2 h-2 rounded-full bg-green-500" />
1451
1451
  AgentDojo
1452
1452
  <span className="text-green-400">Connected</span>
@@ -1455,13 +1455,13 @@ function AgentDojoContent({
1455
1455
 
1456
1456
  {/* Sub-tabs */}
1457
1457
  <div className="flex items-center justify-between mb-4">
1458
- <div className="flex gap-1 bg-[#0a0a0a] border border-[#222] rounded-lg p-1">
1458
+ <div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg p-1">
1459
1459
  <button
1460
1460
  onClick={() => setSubTab("configs")}
1461
1461
  className={`px-4 py-2 rounded text-sm font-medium transition ${
1462
1462
  subTab === "configs"
1463
- ? "bg-[#1a1a1a] text-white"
1464
- : "text-[#666] hover:text-[#888]"
1463
+ ? "bg-[var(--color-surface-raised)] text-white"
1464
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1465
1465
  }`}
1466
1466
  >
1467
1467
  MCP Servers
@@ -1470,8 +1470,8 @@ function AgentDojoContent({
1470
1470
  onClick={() => setSubTab("toolkits")}
1471
1471
  className={`px-4 py-2 rounded text-sm font-medium transition ${
1472
1472
  subTab === "toolkits"
1473
- ? "bg-[#1a1a1a] text-white"
1474
- : "text-[#666] hover:text-[#888]"
1473
+ ? "bg-[var(--color-surface-raised)] text-white"
1474
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1475
1475
  }`}
1476
1476
  >
1477
1477
  Browse Toolkits
@@ -1483,25 +1483,25 @@ function AgentDojoContent({
1483
1483
  {subTab === "configs" && (
1484
1484
  <div>
1485
1485
  <div className="flex items-center justify-between mb-3">
1486
- <p className="text-sm text-[#666]">
1486
+ <p className="text-sm text-[var(--color-text-muted)]">
1487
1487
  Your MCP servers from AgentDojo
1488
1488
  </p>
1489
1489
  <button
1490
1490
  onClick={fetchConfigs}
1491
1491
  disabled={loadingConfigs}
1492
- className="text-xs text-[#666] hover:text-[#888] transition"
1492
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
1493
1493
  >
1494
1494
  {loadingConfigs ? "Loading..." : "Refresh"}
1495
1495
  </button>
1496
1496
  </div>
1497
1497
 
1498
1498
  {loadingConfigs ? (
1499
- <div className="text-center py-6 text-[#666]">Loading servers...</div>
1499
+ <div className="text-center py-6 text-[var(--color-text-muted)]">Loading servers...</div>
1500
1500
  ) : configs.length === 0 ? (
1501
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-4 text-center">
1502
- <p className="text-sm text-[#666]">No MCP servers found</p>
1503
- <p className="text-xs text-[#555] mt-2">
1504
- <button onClick={() => setSubTab("toolkits")} className="text-[#f97316] hover:text-[#fb923c]">
1501
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-4 text-center">
1502
+ <p className="text-sm text-[var(--color-text-muted)]">No MCP servers found</p>
1503
+ <p className="text-xs text-[var(--color-text-faint)] mt-2">
1504
+ <button onClick={() => setSubTab("toolkits")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">
1505
1505
  Browse toolkits
1506
1506
  </button>
1507
1507
  {" "}to create a new MCP server.
@@ -1515,37 +1515,37 @@ function AgentDojoContent({
1515
1515
  return (
1516
1516
  <div
1517
1517
  key={config.id}
1518
- className={`bg-[#111] border rounded-lg p-3 transition flex items-center justify-between ${
1519
- added ? "border-green-500/30" : "border-[#1a1a1a] hover:border-[#333]"
1518
+ className={`bg-[var(--color-surface)] border rounded-lg p-3 transition flex items-center justify-between ${
1519
+ added ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
1520
1520
  }`}
1521
1521
  >
1522
1522
  <div className="flex-1 min-w-0">
1523
1523
  <div className="flex items-center gap-2">
1524
1524
  <span className="font-medium text-sm">{config.name}</span>
1525
- <span className="text-xs text-[#555]">{config.toolsCount} tools</span>
1525
+ <span className="text-xs text-[var(--color-text-faint)]">{config.toolsCount} tools</span>
1526
1526
  {added && (
1527
1527
  <span className="text-xs text-green-400">Added</span>
1528
1528
  )}
1529
1529
  </div>
1530
1530
  {config.mcpUrl && (
1531
- <code className="text-xs text-[#555] mt-1 block truncate">
1531
+ <code className="text-xs text-[var(--color-text-faint)] mt-1 block truncate">
1532
1532
  {config.mcpUrl}
1533
1533
  </code>
1534
1534
  )}
1535
1535
  {!config.mcpUrl && config.slug && (
1536
- <code className="text-xs text-[#555] mt-1 block truncate">
1536
+ <code className="text-xs text-[var(--color-text-faint)] mt-1 block truncate">
1537
1537
  {config.slug}
1538
1538
  </code>
1539
1539
  )}
1540
1540
  </div>
1541
1541
  <div className="flex items-center gap-2 ml-3">
1542
1542
  {added ? (
1543
- <span className="text-xs text-[#555] px-2 py-1">In Servers</span>
1543
+ <span className="text-xs text-[var(--color-text-faint)] px-2 py-1">In Servers</span>
1544
1544
  ) : (
1545
1545
  <button
1546
1546
  onClick={() => addConfig(config.id)}
1547
1547
  disabled={isAdding}
1548
- className="text-xs bg-[#f97316] hover:bg-[#fb923c] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
1548
+ className="text-xs bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-3 py-1 rounded font-medium transition disabled:opacity-50"
1549
1549
  >
1550
1550
  {isAdding ? "Adding..." : "Add"}
1551
1551
  </button>
@@ -1562,7 +1562,7 @@ function AgentDojoContent({
1562
1562
  {/* Browse Toolkits Tab */}
1563
1563
  {subTab === "toolkits" && (
1564
1564
  <div>
1565
- <p className="text-sm text-[#666] mb-4">
1565
+ <p className="text-sm text-[var(--color-text-muted)] mb-4">
1566
1566
  Browse available toolkits and create MCP servers
1567
1567
  </p>
1568
1568
  <IntegrationsPanel
@@ -1845,10 +1845,10 @@ 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-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
1849
- <div className="p-4 border-b border-[#1a1a1a] flex items-center justify-between sticky top-0 bg-[#111]">
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">
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
- <button onClick={onClose} className="text-[#666] hover:text-[#888]">
1851
+ <button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
1852
1852
 
1853
1853
  </button>
1854
1854
  </div>
@@ -1856,7 +1856,7 @@ function AddServerModal({
1856
1856
  <div className="p-4 space-y-4">
1857
1857
  {/* Quick picks */}
1858
1858
  <div>
1859
- <p className="text-sm text-[#666] mb-2">Quick add:</p>
1859
+ <p className="text-sm text-[var(--color-text-muted)] mb-2">Quick add:</p>
1860
1860
  <div className="flex flex-wrap gap-2">
1861
1861
  {[
1862
1862
  { name: "filesystem", pkg: "@modelcontextprotocol/server-filesystem", type: "npm" as const },
@@ -1877,7 +1877,7 @@ function AddServerModal({
1877
1877
  setPipModule("");
1878
1878
  }
1879
1879
  }}
1880
- className="text-sm bg-[#1a1a1a] hover:bg-[#222] px-3 py-1 rounded transition"
1880
+ className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] px-3 py-1 rounded transition"
1881
1881
  >
1882
1882
  {s.name}
1883
1883
  </button>
@@ -1886,13 +1886,13 @@ function AddServerModal({
1886
1886
  </div>
1887
1887
 
1888
1888
  {/* Mode toggle */}
1889
- <div className="flex gap-1 bg-[#0a0a0a] border border-[#222] rounded p-1">
1889
+ <div className="flex gap-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-1">
1890
1890
  <button
1891
1891
  onClick={() => setMode("npm")}
1892
1892
  className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
1893
1893
  mode === "npm"
1894
- ? "bg-[#1a1a1a] text-white"
1895
- : "text-[#666] hover:text-[#888]"
1894
+ ? "bg-[var(--color-surface-raised)] text-white"
1895
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1896
1896
  }`}
1897
1897
  >
1898
1898
  npm
@@ -1901,8 +1901,8 @@ function AddServerModal({
1901
1901
  onClick={() => setMode("pip")}
1902
1902
  className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
1903
1903
  mode === "pip"
1904
- ? "bg-[#1a1a1a] text-white"
1905
- : "text-[#666] hover:text-[#888]"
1904
+ ? "bg-[var(--color-surface-raised)] text-white"
1905
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1906
1906
  }`}
1907
1907
  >
1908
1908
  pip
@@ -1911,8 +1911,8 @@ function AddServerModal({
1911
1911
  onClick={() => setMode("command")}
1912
1912
  className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
1913
1913
  mode === "command"
1914
- ? "bg-[#1a1a1a] text-white"
1915
- : "text-[#666] hover:text-[#888]"
1914
+ ? "bg-[var(--color-surface-raised)] text-white"
1915
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1916
1916
  }`}
1917
1917
  >
1918
1918
  Command
@@ -1921,8 +1921,8 @@ function AddServerModal({
1921
1921
  onClick={() => setMode("http")}
1922
1922
  className={`flex-1 px-2 py-1.5 rounded text-sm transition ${
1923
1923
  mode === "http"
1924
- ? "bg-[#1a1a1a] text-white"
1925
- : "text-[#666] hover:text-[#888]"
1924
+ ? "bg-[var(--color-surface-raised)] text-white"
1925
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
1926
1926
  }`}
1927
1927
  >
1928
1928
  HTTP
@@ -1931,20 +1931,20 @@ function AddServerModal({
1931
1931
 
1932
1932
  {/* Name */}
1933
1933
  <div>
1934
- <label className="block text-sm text-[#666] mb-1">Name</label>
1934
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Name</label>
1935
1935
  <input
1936
1936
  type="text"
1937
1937
  value={name}
1938
1938
  onChange={e => setName(e.target.value)}
1939
1939
  placeholder="e.g., pushover"
1940
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
1940
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
1941
1941
  />
1942
1942
  </div>
1943
1943
 
1944
1944
  {/* Project Scope - only show when projects exist */}
1945
1945
  {hasProjects && (
1946
1946
  <div>
1947
- <label className="block text-sm text-[#666] mb-1">Scope</label>
1947
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Scope</label>
1948
1948
  <Select
1949
1949
  value={projectId || ""}
1950
1950
  onChange={(value) => setProjectId(value || null)}
@@ -1954,7 +1954,7 @@ function AddServerModal({
1954
1954
  ]}
1955
1955
  placeholder="Select scope..."
1956
1956
  />
1957
- <p className="text-xs text-[#555] mt-1">
1957
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
1958
1958
  Global servers are available to all agents. Project-scoped servers are only available to agents in that project.
1959
1959
  </p>
1960
1960
  </div>
@@ -1963,15 +1963,15 @@ function AddServerModal({
1963
1963
  {/* npm Package */}
1964
1964
  {mode === "npm" && (
1965
1965
  <div>
1966
- <label className="block text-sm text-[#666] mb-1">npm Package</label>
1966
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">npm Package</label>
1967
1967
  <input
1968
1968
  type="text"
1969
1969
  value={pkg}
1970
1970
  onChange={e => handlePackageChange(e.target.value)}
1971
1971
  placeholder="e.g., @modelcontextprotocol/server-filesystem or paste full command"
1972
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
1972
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
1973
1973
  />
1974
- <p className="text-xs text-[#555] mt-1">
1974
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
1975
1975
  Package name or paste a full npx command with credentials
1976
1976
  </p>
1977
1977
  </div>
@@ -1981,7 +1981,7 @@ function AddServerModal({
1981
1981
  {mode === "pip" && (
1982
1982
  <div className="space-y-4">
1983
1983
  <div>
1984
- <label className="block text-sm text-[#666] mb-1">pip Package</label>
1984
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">pip Package</label>
1985
1985
  <input
1986
1986
  type="text"
1987
1987
  value={pkg}
@@ -1994,22 +1994,22 @@ function AddServerModal({
1994
1994
  }
1995
1995
  }}
1996
1996
  placeholder="e.g., late-sdk[mcp]"
1997
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
1997
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
1998
1998
  />
1999
- <p className="text-xs text-[#555] mt-1">
1999
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
2000
2000
  Python package with extras, e.g., late-sdk[mcp] or mcp-server-time
2001
2001
  </p>
2002
2002
  </div>
2003
2003
  <div>
2004
- <label className="block text-sm text-[#666] mb-1">Module (optional)</label>
2004
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Module (optional)</label>
2005
2005
  <input
2006
2006
  type="text"
2007
2007
  value={pipModule}
2008
2008
  onChange={e => setPipModule(e.target.value)}
2009
2009
  placeholder="e.g., late.mcp"
2010
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2010
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2011
2011
  />
2012
- <p className="text-xs text-[#555] mt-1">
2012
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
2013
2013
  Python module to run with -m. Auto-detected from package name if not specified.
2014
2014
  </p>
2015
2015
  </div>
@@ -2019,15 +2019,15 @@ function AddServerModal({
2019
2019
  {/* Custom Command */}
2020
2020
  {mode === "command" && (
2021
2021
  <div>
2022
- <label className="block text-sm text-[#666] mb-1">Command</label>
2022
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Command</label>
2023
2023
  <input
2024
2024
  type="text"
2025
2025
  value={command}
2026
2026
  onChange={e => handleCommandChange(e.target.value)}
2027
2027
  placeholder="e.g., npx -y pushover-mcp@latest start --token YOUR_TOKEN"
2028
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2028
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2029
2029
  />
2030
- <p className="text-xs text-[#555] mt-1">
2030
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
2031
2031
  Paste the full command - credentials like YOUR_TOKEN will be auto-extracted
2032
2032
  </p>
2033
2033
  </div>
@@ -2037,38 +2037,38 @@ function AddServerModal({
2037
2037
  {mode === "http" && (
2038
2038
  <div className="space-y-4">
2039
2039
  <div>
2040
- <label className="block text-sm text-[#666] mb-1">URL</label>
2040
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">URL</label>
2041
2041
  <input
2042
2042
  type="text"
2043
2043
  value={url}
2044
2044
  onChange={e => setUrl(e.target.value)}
2045
2045
  placeholder="e.g., https://example.com/wp-json/mcp/v1/messages"
2046
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2046
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2047
2047
  />
2048
2048
  </div>
2049
- <div className="p-3 bg-[#0a0a0a] border border-[#222] rounded">
2050
- <p className="text-xs text-[#666] mb-3">
2049
+ <div className="p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded">
2050
+ <p className="text-xs text-[var(--color-text-muted)] mb-3">
2051
2051
  Optional: Basic Auth credentials (will be encoded and stored securely)
2052
2052
  </p>
2053
2053
  <div className="grid grid-cols-2 gap-3">
2054
2054
  <div>
2055
- <label className="block text-xs text-[#555] mb-1">Username</label>
2055
+ <label className="block text-xs text-[var(--color-text-faint)] mb-1">Username</label>
2056
2056
  <input
2057
2057
  type="text"
2058
2058
  value={username}
2059
2059
  onChange={e => setUsername(e.target.value)}
2060
2060
  placeholder="username"
2061
- className="w-full bg-[#111] border border-[#333] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#f97316]"
2061
+ className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
2062
2062
  />
2063
2063
  </div>
2064
2064
  <div>
2065
- <label className="block text-xs text-[#555] mb-1">Password</label>
2065
+ <label className="block text-xs text-[var(--color-text-faint)] mb-1">Password</label>
2066
2066
  <input
2067
2067
  type="password"
2068
2068
  value={password}
2069
2069
  onChange={e => setPassword(e.target.value)}
2070
2070
  placeholder="password or app key"
2071
- className="w-full bg-[#111] border border-[#333] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#f97316]"
2071
+ className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
2072
2072
  />
2073
2073
  </div>
2074
2074
  </div>
@@ -2079,19 +2079,19 @@ function AddServerModal({
2079
2079
  {/* Environment Variables / Credentials */}
2080
2080
  <div>
2081
2081
  <div className="flex items-center justify-between mb-2">
2082
- <label className="text-sm text-[#666]">
2082
+ <label className="text-sm text-[var(--color-text-muted)]">
2083
2083
  Environment Variables / Credentials
2084
2084
  </label>
2085
2085
  <button
2086
2086
  onClick={addEnvVar}
2087
- className="text-xs text-[#f97316] hover:text-[#fb923c] transition"
2087
+ className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] transition"
2088
2088
  >
2089
2089
  + Add Variable
2090
2090
  </button>
2091
2091
  </div>
2092
2092
 
2093
2093
  {envVars.length === 0 && (
2094
- <p className="text-xs text-[#555] bg-[#0a0a0a] border border-[#222] rounded p-3">
2094
+ <p className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
2095
2095
  Add environment variables for API tokens and credentials.
2096
2096
  These are stored encrypted and passed to the server at startup.
2097
2097
  </p>
@@ -2106,18 +2106,18 @@ function AddServerModal({
2106
2106
  value={env.key}
2107
2107
  onChange={e => updateEnvVar(index, "key", e.target.value)}
2108
2108
  placeholder="KEY"
2109
- className="w-1/3 bg-[#0a0a0a] border border-[#333] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[#f97316]"
2109
+ className="w-1/3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
2110
2110
  />
2111
2111
  <input
2112
2112
  type="password"
2113
2113
  value={env.value}
2114
2114
  onChange={e => updateEnvVar(index, "value", e.target.value)}
2115
2115
  placeholder="value"
2116
- className="flex-1 bg-[#0a0a0a] border border-[#333] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[#f97316]"
2116
+ className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
2117
2117
  />
2118
2118
  <button
2119
2119
  onClick={() => removeEnvVar(index)}
2120
- className="text-[#666] hover:text-red-400 px-2 transition"
2120
+ className="text-[var(--color-text-muted)] hover:text-red-400 px-2 transition"
2121
2121
  >
2122
2122
 
2123
2123
  </button>
@@ -2130,17 +2130,17 @@ function AddServerModal({
2130
2130
  {error && <p className="text-red-400 text-sm">{error}</p>}
2131
2131
  </div>
2132
2132
 
2133
- <div className="p-4 border-t border-[#1a1a1a] flex justify-end gap-2 sticky bottom-0 bg-[#111]">
2133
+ <div className="p-4 border-t border-[var(--color-border)] flex justify-end gap-2 sticky bottom-0 bg-[var(--color-surface)]">
2134
2134
  <button
2135
2135
  onClick={onClose}
2136
- className="px-4 py-2 border border-[#333] hover:border-[#666] rounded transition"
2136
+ className="px-4 py-2 border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] rounded transition"
2137
2137
  >
2138
2138
  Cancel
2139
2139
  </button>
2140
2140
  <button
2141
2141
  onClick={handleAdd}
2142
2142
  disabled={saving || !name || (mode === "npm" ? !pkg : mode === "pip" ? !pkg : mode === "http" ? !url : !command)}
2143
- className="px-4 py-2 bg-[#f97316] hover:bg-[#fb923c] text-black rounded font-medium transition disabled:opacity-50"
2143
+ className="px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black rounded font-medium transition disabled:opacity-50"
2144
2144
  >
2145
2145
  {saving ? "Adding..." : "Add Server"}
2146
2146
  </button>
@@ -2303,37 +2303,37 @@ 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-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-lg max-h-[90vh] overflow-y-auto">
2307
- <div className="p-4 border-b border-[#1a1a1a] flex items-center justify-between sticky top-0 bg-[#111]">
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">
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
- <button onClick={onClose} className="text-[#666] hover:text-[#888]">
2309
+ <button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
2310
2310
 
2311
2311
  </button>
2312
2312
  </div>
2313
2313
 
2314
2314
  <div className="p-4 space-y-4">
2315
2315
  {/* Server Type Info */}
2316
- <div className="text-sm text-[#666] bg-[#0a0a0a] border border-[#222] rounded p-3">
2317
- Type: <span className="text-[#888]">{server.type}</span>
2318
- {server.package && <> • Package: <span className="text-[#888] font-mono">{server.package}</span></>}
2319
- {server.command && <> • Command: <span className="text-[#888] font-mono">{server.command}</span></>}
2316
+ <div className="text-sm text-[var(--color-text-muted)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
2317
+ Type: <span className="text-[var(--color-text-secondary)]">{server.type}</span>
2318
+ {server.package && <> • Package: <span className="text-[var(--color-text-secondary)] font-mono">{server.package}</span></>}
2319
+ {server.command && <> • Command: <span className="text-[var(--color-text-secondary)] font-mono">{server.command}</span></>}
2320
2320
  </div>
2321
2321
 
2322
2322
  {/* Name */}
2323
2323
  <div>
2324
- <label className="block text-sm text-[#666] mb-1">Name</label>
2324
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Name</label>
2325
2325
  <input
2326
2326
  type="text"
2327
2327
  value={name}
2328
2328
  onChange={e => setName(e.target.value)}
2329
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
2329
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
2330
2330
  />
2331
2331
  </div>
2332
2332
 
2333
2333
  {/* Project Scope */}
2334
2334
  {hasProjects && (
2335
2335
  <div>
2336
- <label className="block text-sm text-[#666] mb-1">Scope</label>
2336
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Scope</label>
2337
2337
  <Select
2338
2338
  value={projectId || ""}
2339
2339
  onChange={(value) => setProjectId(value || null)}
@@ -2349,12 +2349,12 @@ function EditServerModal({
2349
2349
  {/* Package (for npm type) */}
2350
2350
  {server.type === "npm" && (
2351
2351
  <div>
2352
- <label className="block text-sm text-[#666] mb-1">npm Package</label>
2352
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">npm Package</label>
2353
2353
  <input
2354
2354
  type="text"
2355
2355
  value={pkg}
2356
2356
  onChange={e => setPkg(e.target.value)}
2357
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2357
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2358
2358
  />
2359
2359
  </div>
2360
2360
  )}
@@ -2362,12 +2362,12 @@ function EditServerModal({
2362
2362
  {/* Package (for pip type) */}
2363
2363
  {server.type === "pip" && (
2364
2364
  <div>
2365
- <label className="block text-sm text-[#666] mb-1">pip Package</label>
2365
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">pip Package</label>
2366
2366
  <input
2367
2367
  type="text"
2368
2368
  value={pkg}
2369
2369
  onChange={e => setPkg(e.target.value)}
2370
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2370
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2371
2371
  />
2372
2372
  </div>
2373
2373
  )}
@@ -2376,34 +2376,34 @@ function EditServerModal({
2376
2376
  {isRemote && (
2377
2377
  <>
2378
2378
  <div>
2379
- <label className="block text-sm text-[#666] mb-1">Server URL</label>
2379
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Server URL</label>
2380
2380
  <input
2381
2381
  type="text"
2382
2382
  value={url}
2383
2383
  onChange={e => setUrl(e.target.value)}
2384
2384
  placeholder="https://example.com/mcp"
2385
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2385
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2386
2386
  />
2387
2387
  </div>
2388
2388
  <div>
2389
- <label className="block text-sm text-[#666] mb-1">Authentication (Basic Auth)</label>
2389
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Authentication (Basic Auth)</label>
2390
2390
  <div className="flex gap-2">
2391
2391
  <input
2392
2392
  type="text"
2393
2393
  value={username}
2394
2394
  onChange={e => setUsername(e.target.value)}
2395
2395
  placeholder="Username"
2396
- className="flex-1 bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#f97316]"
2396
+ className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
2397
2397
  />
2398
2398
  <input
2399
2399
  type="password"
2400
2400
  value={password}
2401
2401
  onChange={e => setPassword(e.target.value)}
2402
2402
  placeholder="Password / App Password"
2403
- className="flex-1 bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#f97316]"
2403
+ className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"
2404
2404
  />
2405
2405
  </div>
2406
- <p className="text-xs text-[#555] mt-1">
2406
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
2407
2407
  Leave empty if no authentication required
2408
2408
  </p>
2409
2409
  </div>
@@ -2414,22 +2414,22 @@ function EditServerModal({
2414
2414
  {server.type === "custom" && (
2415
2415
  <>
2416
2416
  <div>
2417
- <label className="block text-sm text-[#666] mb-1">Command</label>
2417
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Command</label>
2418
2418
  <input
2419
2419
  type="text"
2420
2420
  value={command}
2421
2421
  onChange={e => setCommand(e.target.value)}
2422
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2422
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2423
2423
  />
2424
2424
  </div>
2425
2425
  <div>
2426
- <label className="block text-sm text-[#666] mb-1">Arguments</label>
2426
+ <label className="block text-sm text-[var(--color-text-muted)] mb-1">Arguments</label>
2427
2427
  <input
2428
2428
  type="text"
2429
2429
  value={args}
2430
2430
  onChange={e => setArgs(e.target.value)}
2431
2431
  placeholder="e.g., --token $TOKEN --verbose"
2432
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[#f97316]"
2432
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 font-mono text-sm focus:outline-none focus:border-[var(--color-accent)]"
2433
2433
  />
2434
2434
  </div>
2435
2435
  </>
@@ -2439,19 +2439,19 @@ function EditServerModal({
2439
2439
  {!isRemote && (
2440
2440
  <div>
2441
2441
  <div className="flex items-center justify-between mb-2">
2442
- <label className="text-sm text-[#666]">
2442
+ <label className="text-sm text-[var(--color-text-muted)]">
2443
2443
  Environment Variables / Credentials
2444
2444
  </label>
2445
2445
  <button
2446
2446
  onClick={addEnvVar}
2447
- className="text-xs text-[#f97316] hover:text-[#fb923c] transition"
2447
+ className="text-xs text-[var(--color-accent)] hover:text-[var(--color-accent-hover)] transition"
2448
2448
  >
2449
2449
  + Add Variable
2450
2450
  </button>
2451
2451
  </div>
2452
2452
 
2453
2453
  {envVars.length === 0 && (
2454
- <p className="text-xs text-[#555] bg-[#0a0a0a] border border-[#222] rounded p-3">
2454
+ <p className="text-xs text-[var(--color-text-faint)] bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-3">
2455
2455
  No environment variables configured.
2456
2456
  </p>
2457
2457
  )}
@@ -2465,18 +2465,18 @@ function EditServerModal({
2465
2465
  value={env.key}
2466
2466
  onChange={e => updateEnvVar(index, "key", e.target.value)}
2467
2467
  placeholder="KEY"
2468
- className="w-1/3 bg-[#0a0a0a] border border-[#333] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[#f97316]"
2468
+ className="w-1/3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
2469
2469
  />
2470
2470
  <input
2471
2471
  type="password"
2472
2472
  value={env.value}
2473
2473
  onChange={e => updateEnvVar(index, "value", e.target.value)}
2474
2474
  placeholder="value"
2475
- className="flex-1 bg-[#0a0a0a] border border-[#333] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[#f97316]"
2475
+ className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)]"
2476
2476
  />
2477
2477
  <button
2478
2478
  onClick={() => removeEnvVar(index)}
2479
- className="text-[#666] hover:text-red-400 px-2 transition"
2479
+ className="text-[var(--color-text-muted)] hover:text-red-400 px-2 transition"
2480
2480
  >
2481
2481
 
2482
2482
  </button>
@@ -2485,7 +2485,7 @@ function EditServerModal({
2485
2485
  </div>
2486
2486
  )}
2487
2487
 
2488
- <p className="text-xs text-[#555] mt-2">
2488
+ <p className="text-xs text-[var(--color-text-faint)] mt-2">
2489
2489
  {server.status === "running" ? "Server will be automatically restarted to apply changes." : "Changes will take effect when the server is started."}
2490
2490
  </p>
2491
2491
  </div>
@@ -2494,17 +2494,17 @@ function EditServerModal({
2494
2494
  {error && <p className="text-red-400 text-sm">{error}</p>}
2495
2495
  </div>
2496
2496
 
2497
- <div className="p-4 border-t border-[#1a1a1a] flex justify-end gap-2 sticky bottom-0 bg-[#111]">
2497
+ <div className="p-4 border-t border-[var(--color-border)] flex justify-end gap-2 sticky bottom-0 bg-[var(--color-surface)]">
2498
2498
  <button
2499
2499
  onClick={onClose}
2500
- className="px-4 py-2 border border-[#333] hover:border-[#666] rounded transition"
2500
+ className="px-4 py-2 border border-[var(--color-border-light)] hover:border-[var(--color-text-muted)] rounded transition"
2501
2501
  >
2502
2502
  Cancel
2503
2503
  </button>
2504
2504
  <button
2505
2505
  onClick={handleSave}
2506
2506
  disabled={saving || !name.trim()}
2507
- className="px-4 py-2 bg-[#f97316] hover:bg-[#fb923c] text-black rounded font-medium transition disabled:opacity-50"
2507
+ className="px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black rounded font-medium transition disabled:opacity-50"
2508
2508
  >
2509
2509
  {saving ? "Saving..." : "Save Changes"}
2510
2510
  </button>