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
@@ -385,7 +385,7 @@ export function IntegrationsPanel({
385
385
  const availableApps = filteredApps.filter((app) => !isConnected(app));
386
386
 
387
387
  if (loading) {
388
- return <div className="text-center py-8 text-[#666]">Loading apps...</div>;
388
+ return <div className="text-center py-8 text-[var(--color-text-muted)]">Loading apps...</div>;
389
389
  }
390
390
 
391
391
  return (
@@ -393,7 +393,7 @@ export function IntegrationsPanel({
393
393
  {/* Auth Method Choice Modal */}
394
394
  {authMethodModal && (
395
395
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
396
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-md mx-4">
396
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
397
397
  <div className="flex items-center gap-3 mb-4">
398
398
  {authMethodModal.app.logo && (
399
399
  <img
@@ -404,7 +404,7 @@ export function IntegrationsPanel({
404
404
  )}
405
405
  <div>
406
406
  <h3 className="font-medium">Connect {authMethodModal.app.name}</h3>
407
- <p className="text-xs text-[#666]">Choose how to authenticate</p>
407
+ <p className="text-xs text-[var(--color-text-muted)]">Choose how to authenticate</p>
408
408
  </div>
409
409
  </div>
410
410
  <div className="space-y-3">
@@ -415,10 +415,10 @@ export function IntegrationsPanel({
415
415
  setApiKeyInput("");
416
416
  setCredentialInputs({});
417
417
  }}
418
- className="w-full text-left p-3 bg-[#0a0a0a] hover:bg-[#1a1a1a] border border-[#333] hover:border-[#f97316] rounded-lg transition"
418
+ 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-accent)] rounded-lg transition"
419
419
  >
420
420
  <div className="font-medium text-sm">API Key</div>
421
- <div className="text-xs text-[#666] mt-0.5">
421
+ <div className="text-xs text-[var(--color-text-muted)] mt-0.5">
422
422
  Enter your {authMethodModal.app.name} API key directly
423
423
  </div>
424
424
  </button>
@@ -427,17 +427,17 @@ export function IntegrationsPanel({
427
427
  setAuthMethodModal(null);
428
428
  connectApp(authMethodModal.app, undefined, true);
429
429
  }}
430
- className="w-full text-left p-3 bg-[#0a0a0a] hover:bg-[#1a1a1a] border border-[#333] hover:border-[#f97316] rounded-lg transition"
430
+ 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-accent)] rounded-lg transition"
431
431
  >
432
432
  <div className="font-medium text-sm">OAuth</div>
433
- <div className="text-xs text-[#666] mt-0.5">
433
+ <div className="text-xs text-[var(--color-text-muted)] mt-0.5">
434
434
  Sign in with your {authMethodModal.app.name} account
435
435
  </div>
436
436
  </button>
437
437
  </div>
438
438
  <button
439
439
  onClick={() => setAuthMethodModal(null)}
440
- className="w-full text-sm text-[#666] hover:text-white mt-4 py-2 transition"
440
+ className="w-full text-sm text-[var(--color-text-muted)] hover:text-white mt-4 py-2 transition"
441
441
  >
442
442
  Cancel
443
443
  </button>
@@ -448,7 +448,7 @@ export function IntegrationsPanel({
448
448
  {/* API Key / Credentials Modal */}
449
449
  {apiKeyModal && (
450
450
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
451
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-md mx-4">
451
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
452
452
  <div className="flex items-center gap-3 mb-4">
453
453
  {apiKeyModal.app.logo && (
454
454
  <img
@@ -459,7 +459,7 @@ export function IntegrationsPanel({
459
459
  )}
460
460
  <div>
461
461
  <h3 className="font-medium">Connect {apiKeyModal.app.name}</h3>
462
- <p className="text-xs text-[#666]">
462
+ <p className="text-xs text-[var(--color-text-muted)]">
463
463
  {apiKeyModal.app.credentialFields?.length
464
464
  ? "Enter your credentials to connect"
465
465
  : "Enter your API key to connect"}
@@ -471,19 +471,19 @@ export function IntegrationsPanel({
471
471
  <div className="space-y-3 mb-4">
472
472
  {apiKeyModal.app.credentialFields.map((field, idx) => (
473
473
  <div key={field.name}>
474
- <label className="block text-xs text-[#888] mb-1">
474
+ <label className="block text-xs text-[var(--color-text-secondary)] mb-1">
475
475
  {field.name.replace(/([A-Z])/g, " $1").replace(/[-_]/g, " ").replace(/\b\w/g, c => c.toUpperCase()).trim()}
476
476
  {field.required !== false && <span className="text-red-400 ml-0.5">*</span>}
477
477
  </label>
478
478
  {field.description && (
479
- <p className="text-[10px] text-[#555] mb-1">{field.description}</p>
479
+ <p className="text-[10px] text-[var(--color-text-faint)] mb-1">{field.description}</p>
480
480
  )}
481
481
  <input
482
482
  type="password"
483
483
  value={credentialInputs[field.name] || ""}
484
484
  onChange={(e) => setCredentialInputs(prev => ({ ...prev, [field.name]: e.target.value }))}
485
485
  placeholder={`Enter ${field.name}...`}
486
- className="w-full bg-[#0a0a0a] border border-[#333] rounded-lg px-4 py-2 focus:outline-none focus:border-[#f97316]"
486
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
487
487
  autoFocus={idx === 0}
488
488
  />
489
489
  </div>
@@ -495,7 +495,7 @@ export function IntegrationsPanel({
495
495
  value={apiKeyInput}
496
496
  onChange={(e) => setApiKeyInput(e.target.value)}
497
497
  placeholder="Enter API Key..."
498
- className="w-full bg-[#0a0a0a] border border-[#333] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[#f97316]"
498
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[var(--color-accent)]"
499
499
  autoFocus
500
500
  />
501
501
  )}
@@ -503,7 +503,7 @@ export function IntegrationsPanel({
503
503
  <button
504
504
  type="button"
505
505
  onClick={() => setApiKeyModal(null)}
506
- className="flex-1 text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] px-4 py-2 rounded transition"
506
+ 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"
507
507
  >
508
508
  Cancel
509
509
  </button>
@@ -515,7 +515,7 @@ export function IntegrationsPanel({
515
515
  ? !apiKeyModal.app.credentialFields.filter(f => f.required !== false).every(f => credentialInputs[f.name]?.trim())
516
516
  : !apiKeyInput.trim())
517
517
  }
518
- className="flex-1 text-sm bg-[#f97316] hover:bg-[#ea580c] text-white px-4 py-2 rounded transition disabled:opacity-50"
518
+ className="flex-1 text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition disabled:opacity-50"
519
519
  >
520
520
  {connecting === apiKeyModal.app.slug ? "Connecting..." : "Connect"}
521
521
  </button>
@@ -528,7 +528,7 @@ export function IntegrationsPanel({
528
528
  {/* MCP Config Creation Modal */}
529
529
  {mcpConfigModal && (
530
530
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
531
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-md mx-4">
531
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
532
532
  {mcpConfigSuccess ? (
533
533
  <>
534
534
  <div className="text-center mb-4">
@@ -536,7 +536,7 @@ export function IntegrationsPanel({
536
536
  <span className="text-green-400 text-2xl">✓</span>
537
537
  </div>
538
538
  <h3 className="font-medium text-lg">MCP Config Created!</h3>
539
- <p className="text-sm text-[#888] mt-2">
539
+ <p className="text-sm text-[var(--color-text-secondary)] mt-2">
540
540
  "{mcpConfigSuccess}" has been created and added to your servers.
541
541
  </p>
542
542
  </div>
@@ -545,7 +545,7 @@ export function IntegrationsPanel({
545
545
  setMcpConfigModal(null);
546
546
  setMcpConfigSuccess(null);
547
547
  }}
548
- className="w-full text-sm bg-[#f97316] hover:bg-[#ea580c] text-white px-4 py-2 rounded transition"
548
+ className="w-full text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition"
549
549
  >
550
550
  Done
551
551
  </button>
@@ -562,19 +562,19 @@ export function IntegrationsPanel({
562
562
  )}
563
563
  <div>
564
564
  <h3 className="font-medium">Create MCP Config</h3>
565
- <p className="text-xs text-[#666]">
565
+ <p className="text-xs text-[var(--color-text-muted)]">
566
566
  Create an MCP config for {mcpConfigModal.app.name}
567
567
  </p>
568
568
  </div>
569
569
  </div>
570
570
  <form onSubmit={(e) => { e.preventDefault(); createMcpConfig(); }}>
571
- <label className="block text-xs text-[#888] mb-1">Config Name</label>
571
+ <label className="block text-xs text-[var(--color-text-secondary)] mb-1">Config Name</label>
572
572
  <input
573
573
  type="text"
574
574
  value={mcpConfigName}
575
575
  onChange={(e) => setMcpConfigName(e.target.value)}
576
576
  placeholder="Enter config name..."
577
- className="w-full bg-[#0a0a0a] border border-[#333] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[#f97316]"
577
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[var(--color-accent)]"
578
578
  autoFocus
579
579
  maxLength={30}
580
580
  />
@@ -582,14 +582,14 @@ export function IntegrationsPanel({
582
582
  <button
583
583
  type="button"
584
584
  onClick={() => setMcpConfigModal(null)}
585
- className="flex-1 text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] px-4 py-2 rounded transition"
585
+ 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"
586
586
  >
587
587
  Cancel
588
588
  </button>
589
589
  <button
590
590
  type="submit"
591
591
  disabled={!mcpConfigName.trim() || mcpConfigCreating}
592
- className="flex-1 text-sm bg-[#f97316] hover:bg-[#ea580c] text-white px-4 py-2 rounded transition disabled:opacity-50"
592
+ className="flex-1 text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition disabled:opacity-50"
593
593
  >
594
594
  {mcpConfigCreating ? "Creating..." : "Create Config"}
595
595
  </button>
@@ -604,12 +604,12 @@ export function IntegrationsPanel({
604
604
  {/* Confirmation Modal */}
605
605
  {confirmModal && (
606
606
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
607
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-sm mx-4">
607
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-sm mx-4">
608
608
  <p className="text-center mb-4">{confirmModal.message}</p>
609
609
  <div className="flex gap-2">
610
610
  <button
611
611
  onClick={() => setConfirmModal(null)}
612
- className="flex-1 text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] px-4 py-2 rounded transition"
612
+ 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"
613
613
  >
614
614
  Cancel
615
615
  </button>
@@ -649,14 +649,14 @@ export function IntegrationsPanel({
649
649
  value={search}
650
650
  onChange={(e) => setSearch(e.target.value)}
651
651
  placeholder="Search apps..."
652
- className="w-full bg-[#111] border border-[#333] rounded-lg px-4 py-2 focus:outline-none focus:border-[#f97316]"
652
+ className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
653
653
  />
654
654
  </div>
655
655
 
656
656
  {/* Connected Apps */}
657
657
  {connectedApps.length > 0 && (
658
658
  <div>
659
- <h3 className="text-sm font-medium text-[#888] mb-3">
659
+ <h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">
660
660
  Connected ({connectedApps.length})
661
661
  </h3>
662
662
  <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
@@ -686,11 +686,11 @@ export function IntegrationsPanel({
686
686
 
687
687
  {/* Available Apps */}
688
688
  <div>
689
- <h3 className="text-sm font-medium text-[#888] mb-3">
689
+ <h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">
690
690
  Available Apps ({availableApps.length})
691
691
  </h3>
692
692
  {availableApps.length === 0 ? (
693
- <p className="text-[#666] text-sm">
693
+ <p className="text-[var(--color-text-muted)] text-sm">
694
694
  {search ? "No apps match your search" : "No apps available"}
695
695
  </p>
696
696
  ) : (
@@ -706,7 +706,7 @@ export function IntegrationsPanel({
706
706
  </div>
707
707
  )}
708
708
  {availableApps.length > 50 && (
709
- <p className="text-xs text-[#555] mt-3 text-center">
709
+ <p className="text-xs text-[var(--color-text-faint)] mt-3 text-center">
710
710
  Showing first 50 of {availableApps.length} apps. Use search to find more.
711
711
  </p>
712
712
  )}
@@ -742,13 +742,13 @@ function AppCard({
742
742
 
743
743
  return (
744
744
  <div
745
- className={`bg-[#111] border rounded-lg p-3 transition ${
746
- isConnected ? "border-green-500/30" : "border-[#1a1a1a] hover:border-[#333]"
745
+ className={`bg-[var(--color-surface)] border rounded-lg p-3 transition ${
746
+ isConnected ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
747
747
  }`}
748
748
  >
749
749
  <div className="flex items-start gap-3">
750
750
  {/* Logo */}
751
- <div className="w-10 h-10 rounded bg-[#1a1a1a] flex items-center justify-center flex-shrink-0 overflow-hidden">
751
+ <div className="w-10 h-10 rounded bg-[var(--color-surface-raised)] flex items-center justify-center flex-shrink-0 overflow-hidden">
752
752
  {app.logo ? (
753
753
  <img
754
754
  src={app.logo}
@@ -771,7 +771,7 @@ function AppCard({
771
771
  <span className="text-xs text-green-400">✓</span>
772
772
  )}
773
773
  {!isConnected && hasApiKey && !hasOAuth && (
774
- <span className="text-[10px] bg-[#222] text-[#888] px-1.5 py-0.5 rounded" title="Requires API Key">
774
+ <span className="text-[10px] bg-[var(--color-surface-raised)] text-[var(--color-text-secondary)] px-1.5 py-0.5 rounded" title="Requires API Key">
775
775
  API Key
776
776
  </span>
777
777
  )}
@@ -782,7 +782,7 @@ function AppCard({
782
782
  )}
783
783
  </div>
784
784
  {app.description && (
785
- <p className="text-xs text-[#666] line-clamp-2 mt-0.5">
785
+ <p className="text-xs text-[var(--color-text-muted)] line-clamp-2 mt-0.5">
786
786
  {app.description}
787
787
  </p>
788
788
  )}
@@ -791,7 +791,7 @@ function AppCard({
791
791
  {app.categories.slice(0, 2).map((cat) => (
792
792
  <span
793
793
  key={cat}
794
- className="text-[10px] bg-[#1a1a1a] text-[#555] px-1.5 py-0.5 rounded"
794
+ className="text-[10px] bg-[var(--color-surface-raised)] text-[var(--color-text-faint)] px-1.5 py-0.5 rounded"
795
795
  >
796
796
  {cat}
797
797
  </span>
@@ -824,7 +824,7 @@ function AppCard({
824
824
  {onUpdateKey && (
825
825
  <button
826
826
  onClick={onUpdateKey}
827
- className="text-xs text-[#666] hover:text-[#f97316] transition px-2"
827
+ className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition px-2"
828
828
  title="Update API Key"
829
829
  >
830
830
  Key
@@ -833,7 +833,7 @@ function AppCard({
833
833
  {onDisconnect && (
834
834
  <button
835
835
  onClick={onDisconnect}
836
- className="text-xs text-[#666] hover:text-red-400 transition px-2"
836
+ className="text-xs text-[var(--color-text-muted)] hover:text-red-400 transition px-2"
837
837
  title="Disconnect"
838
838
  >
839
839
  ×
@@ -844,7 +844,7 @@ function AppCard({
844
844
  <button
845
845
  onClick={onConnect}
846
846
  disabled={connecting}
847
- className="w-full text-xs bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition disabled:opacity-50"
847
+ className="w-full text-xs 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"
848
848
  >
849
849
  {connecting ? "Connecting..." : (hasApiKey && !hasOAuth) ? "Enter API Key" : "Connect"}
850
850
  </button>