apteva 0.4.32 → 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 (113) 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.qzbx5wtj.js +4 -0
  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 +10 -9
  31. package/src/crypto.ts +4 -3
  32. package/src/db.ts +171 -36
  33. package/src/integrations/agentdojo.ts +95 -12
  34. package/src/integrations/index.ts +7 -0
  35. package/src/mcp-platform.ts +870 -142
  36. package/src/openapi.ts +96 -0
  37. package/src/providers.ts +60 -34
  38. package/src/routes/api/agent-utils.ts +59 -47
  39. package/src/routes/api/agents.ts +71 -2
  40. package/src/routes/api/integrations.ts +11 -5
  41. package/src/routes/api/mcp.ts +5 -4
  42. package/src/routes/api/meta-agent.ts +37 -1
  43. package/src/routes/api/projects.ts +3 -3
  44. package/src/routes/api/providers.ts +121 -30
  45. package/src/routes/api/skills.ts +2 -3
  46. package/src/routes/api/system.ts +98 -14
  47. package/src/routes/api/telemetry.ts +19 -1
  48. package/src/routes/share.ts +85 -0
  49. package/src/server.ts +43 -32
  50. package/src/triggers/agentdojo.ts +2 -2
  51. package/src/web/App.tsx +107 -21
  52. package/src/web/components/activity/ActivityPage.tsx +242 -389
  53. package/src/web/components/agents/AgentCard.tsx +19 -27
  54. package/src/web/components/agents/AgentPanel.tsx +358 -198
  55. package/src/web/components/agents/AgentsView.tsx +4 -4
  56. package/src/web/components/agents/CreateAgentModal.tsx +21 -79
  57. package/src/web/components/api/ApiDocsPage.tsx +66 -66
  58. package/src/web/components/auth/CreateAccountStep.tsx +16 -16
  59. package/src/web/components/auth/LoginPage.tsx +10 -10
  60. package/src/web/components/common/Icons.tsx +8 -0
  61. package/src/web/components/common/LoadingSpinner.tsx +2 -2
  62. package/src/web/components/common/Modal.tsx +8 -8
  63. package/src/web/components/common/Select.tsx +11 -10
  64. package/src/web/components/connections/ConnectionsPage.tsx +4 -4
  65. package/src/web/components/connections/IntegrationsTab.tsx +18 -18
  66. package/src/web/components/connections/OverviewTab.tsx +13 -13
  67. package/src/web/components/connections/TriggersTab.tsx +99 -99
  68. package/src/web/components/dashboard/Dashboard.tsx +177 -52
  69. package/src/web/components/index.ts +1 -1
  70. package/src/web/components/layout/Header.tsx +50 -34
  71. package/src/web/components/layout/Sidebar.tsx +41 -16
  72. package/src/web/components/mcp/IntegrationsPanel.tsx +160 -69
  73. package/src/web/components/mcp/McpPage.tsx +218 -209
  74. package/src/web/components/meta-agent/MetaAgent.tsx +15 -11
  75. package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
  76. package/src/web/components/settings/SettingsPage.tsx +389 -221
  77. package/src/web/components/skills/SkillsPage.tsx +88 -88
  78. package/src/web/components/tasks/TasksPage.tsx +385 -68
  79. package/src/web/components/telemetry/TelemetryPage.tsx +294 -39
  80. package/src/web/components/tests/TestsPage.tsx +50 -50
  81. package/src/web/components/threads/ThreadsPage.tsx +315 -0
  82. package/src/web/context/AuthContext.tsx +3 -3
  83. package/src/web/context/ProjectContext.tsx +8 -3
  84. package/src/web/context/TelemetryContext.tsx +24 -6
  85. package/src/web/context/ThemeContext.tsx +69 -0
  86. package/src/web/context/index.ts +3 -1
  87. package/src/web/styles.css +25 -7
  88. package/src/web/themes.ts +99 -0
  89. package/src/web/types.ts +4 -7
  90. package/dist/ActivityPage.41nbye4r.js +0 -3
  91. package/dist/ApiDocsPage.4smnt8m3.js +0 -4
  92. package/dist/App.0sbax9et.js +0 -4
  93. package/dist/App.0ws427h8.js +0 -4
  94. package/dist/App.6q6bar8b.js +0 -4
  95. package/dist/App.80301vdb.js +0 -4
  96. package/dist/App.af2wg84v.js +0 -267
  97. package/dist/App.ca1rz1ph.js +0 -4
  98. package/dist/App.ensa6z0r.js +0 -4
  99. package/dist/App.f8g7tych.js +0 -13
  100. package/dist/App.mvtqv6qc.js +0 -20
  101. package/dist/App.ncgc9cxy.js +0 -4
  102. package/dist/App.p02f4ret.js +0 -1
  103. package/dist/App.p0fb1pds.js +0 -4
  104. package/dist/App.pmaq48sj.js +0 -4
  105. package/dist/App.yv87t9m5.js +0 -4
  106. package/dist/App.zjmfm8p6.js +0 -4
  107. package/dist/ConnectionsPage.anb3rv9a.js +0 -3
  108. package/dist/McpPage.y396h6fy.js +0 -3
  109. package/dist/SettingsPage.p1hc60gk.js +0 -3
  110. package/dist/SkillsPage.yj3xdsay.js +0 -3
  111. package/dist/TasksPage.sjv0khtv.js +0 -3
  112. package/dist/TelemetryPage.2qm4w16r.js +0 -3
  113. package/dist/TestsPage.zzs4qfj8.js +0 -3
@@ -293,7 +293,7 @@ export function SkillsPage() {
293
293
  <div className="flex items-center justify-between mb-6">
294
294
  <div>
295
295
  <h1 className="text-2xl font-semibold mb-1">Skills</h1>
296
- <p className="text-[#666]">
296
+ <p className="text-[var(--color-text-muted)]">
297
297
  Manage agent skills - instructions that teach agents how to perform tasks.
298
298
  </p>
299
299
  </div>
@@ -301,13 +301,13 @@ export function SkillsPage() {
301
301
  <div className="flex gap-2">
302
302
  <button
303
303
  onClick={() => setShowImport(true)}
304
- className="bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]"
304
+ className="bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] text-white px-4 py-2 rounded font-medium transition border border-[var(--color-border-light)]"
305
305
  >
306
306
  Import
307
307
  </button>
308
308
  <button
309
309
  onClick={() => setShowCreate(true)}
310
- className="bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition"
310
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
311
311
  >
312
312
  + Create Skill
313
313
  </button>
@@ -316,13 +316,13 @@ export function SkillsPage() {
316
316
  </div>
317
317
 
318
318
  {/* Tabs */}
319
- <div className="flex gap-1 mb-6 bg-[#111] border border-[#1a1a1a] rounded-lg p-1 w-fit">
319
+ <div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-1 w-fit">
320
320
  <button
321
321
  onClick={() => setActiveTab("installed")}
322
322
  className={`px-4 py-2 rounded text-sm font-medium transition ${
323
323
  activeTab === "installed"
324
- ? "bg-[#1a1a1a] text-white"
325
- : "text-[#666] hover:text-[#888]"
324
+ ? "bg-[var(--color-surface-raised)] text-white"
325
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
326
326
  }`}
327
327
  >
328
328
  Installed ({filteredSkills.length})
@@ -331,8 +331,8 @@ export function SkillsPage() {
331
331
  onClick={() => setActiveTab("github")}
332
332
  className={`px-4 py-2 rounded text-sm font-medium transition ${
333
333
  activeTab === "github"
334
- ? "bg-[#1a1a1a] text-white"
335
- : "text-[#666] hover:text-[#888]"
334
+ ? "bg-[var(--color-surface-raised)] text-white"
335
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
336
336
  }`}
337
337
  >
338
338
  Browse GitHub
@@ -341,8 +341,8 @@ export function SkillsPage() {
341
341
  onClick={() => setActiveTab("marketplace")}
342
342
  className={`px-4 py-2 rounded text-sm font-medium transition ${
343
343
  activeTab === "marketplace"
344
- ? "bg-[#1a1a1a] text-white"
345
- : "text-[#666] hover:text-[#888]"
344
+ ? "bg-[var(--color-surface-raised)] text-white"
345
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
346
346
  }`}
347
347
  >
348
348
  Marketplace
@@ -353,21 +353,21 @@ export function SkillsPage() {
353
353
  {activeTab === "installed" && (
354
354
  <>
355
355
  {loading ? (
356
- <div className="text-[#666]">Loading skills...</div>
356
+ <div className="text-[var(--color-text-muted)]">Loading skills...</div>
357
357
  ) : skills.length === 0 ? (
358
- <div className="text-center py-20 text-[#666]">
358
+ <div className="text-center py-20 text-[var(--color-text-muted)]">
359
359
  <p className="text-lg">No skills installed</p>
360
360
  <p className="text-sm mt-1">Create a skill or browse the marketplace</p>
361
361
  <button
362
362
  onClick={() => setActiveTab("marketplace")}
363
- className="mt-4 bg-[#f97316] hover:bg-[#fb923c] text-black px-4 py-2 rounded font-medium transition"
363
+ className="mt-4 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
364
364
  >
365
365
  Browse Marketplace
366
366
  </button>
367
367
  </div>
368
368
  ) : filteredSkills.length === 0 ? (
369
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-6 text-center">
370
- <p className="text-[#666]">No skills match this filter.</p>
369
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center">
370
+ <p className="text-[var(--color-text-muted)]">No skills match this filter.</p>
371
371
  </div>
372
372
  ) : (
373
373
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
@@ -407,12 +407,12 @@ export function SkillsPage() {
407
407
  value={githubRepo}
408
408
  onChange={(e) => setGithubRepo(e.target.value)}
409
409
  placeholder="Enter GitHub repo (e.g., WordPress/agent-skills)"
410
- className="flex-1 bg-[#111] border border-[#333] rounded-lg px-4 py-3 focus:outline-none focus:border-[#f97316]"
410
+ 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)]"
411
411
  />
412
412
  <button
413
413
  type="submit"
414
414
  disabled={githubLoading}
415
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition"
415
+ 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"
416
416
  >
417
417
  {githubLoading ? "..." : "Browse"}
418
418
  </button>
@@ -420,8 +420,8 @@ export function SkillsPage() {
420
420
 
421
421
  {/* Project Scope Selector */}
422
422
  {hasProjects && githubSkills.length > 0 && (
423
- <div className="flex items-center gap-3 p-3 bg-[#0a0a0a] border border-[#222] rounded-lg">
424
- <span className="text-sm text-[#666]">Install to:</span>
423
+ <div className="flex items-center gap-3 p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg">
424
+ <span className="text-sm text-[var(--color-text-muted)]">Install to:</span>
425
425
  <Select
426
426
  value={githubProjectId || ""}
427
427
  onChange={(value) => setGithubProjectId(value || null)}
@@ -449,11 +449,11 @@ export function SkillsPage() {
449
449
  href={githubRepoInfo.url}
450
450
  target="_blank"
451
451
  rel="noopener noreferrer"
452
- className="text-[#f97316] hover:underline font-medium"
452
+ className="text-[var(--color-accent)] hover:underline font-medium"
453
453
  >
454
454
  {githubRepoInfo.owner}/{githubRepoInfo.repo}
455
455
  </a>
456
- <span className="text-sm text-[#666]">
456
+ <span className="text-sm text-[var(--color-text-muted)]">
457
457
  {githubSkills.length} skill{githubSkills.length !== 1 ? "s" : ""} found
458
458
  </span>
459
459
  </div>
@@ -461,7 +461,7 @@ export function SkillsPage() {
461
461
  <button
462
462
  onClick={installAllFromGitHub}
463
463
  disabled={!!installingGithub}
464
- className="text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-4 py-2 rounded transition disabled:opacity-50"
464
+ 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-4 py-2 rounded transition disabled:opacity-50"
465
465
  >
466
466
  Install All
467
467
  </button>
@@ -471,17 +471,17 @@ export function SkillsPage() {
471
471
 
472
472
  {/* Loading */}
473
473
  {githubLoading && (
474
- <div className="text-center py-8 text-[#666]">
474
+ <div className="text-center py-8 text-[var(--color-text-muted)]">
475
475
  Fetching skills from repository...
476
476
  </div>
477
477
  )}
478
478
 
479
479
  {/* Empty State */}
480
480
  {!githubLoading && !githubRepoInfo && !githubError && (
481
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center">
481
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
482
482
  <div className="text-4xl mb-4">📦</div>
483
483
  <h3 className="text-lg font-medium mb-2">Browse Skills from GitHub</h3>
484
- <p className="text-[#666] mb-6 max-w-md mx-auto">
484
+ <p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
485
485
  Enter a GitHub repository to browse and install skills. Skills are markdown files with instructions that teach agents how to perform specific tasks.
486
486
  </p>
487
487
  <div className="flex flex-wrap gap-2 justify-center">
@@ -494,7 +494,7 @@ export function SkillsPage() {
494
494
  setGithubRepo(repo);
495
495
  browseGitHubRepo(repo);
496
496
  }}
497
- className="text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition"
497
+ 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"
498
498
  >
499
499
  {label}
500
500
  </button>
@@ -505,7 +505,7 @@ export function SkillsPage() {
505
505
 
506
506
  {/* No Skills Found */}
507
507
  {!githubLoading && githubRepoInfo && githubSkills.length === 0 && (
508
- <div className="text-center py-8 text-[#666]">
508
+ <div className="text-center py-8 text-[var(--color-text-muted)]">
509
509
  No skills found in this repository. Skills should be in subdirectories with a SKILL.md file.
510
510
  </div>
511
511
  )}
@@ -520,8 +520,8 @@ export function SkillsPage() {
520
520
  return (
521
521
  <div
522
522
  key={skill.name}
523
- className={`bg-[#111] border rounded-lg p-4 transition ${
524
- installed ? "border-green-500/30" : "border-[#1a1a1a] hover:border-[#333]"
523
+ className={`bg-[var(--color-surface)] border rounded-lg p-4 transition ${
524
+ installed ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
525
525
  }`}
526
526
  >
527
527
  <div className="flex items-start justify-between gap-3">
@@ -532,10 +532,10 @@ export function SkillsPage() {
532
532
  <span className="text-xs text-green-400">✓ Installed</span>
533
533
  )}
534
534
  </div>
535
- <p className="text-sm text-[#666] mt-1 line-clamp-2">
535
+ <p className="text-sm text-[var(--color-text-muted)] mt-1 line-clamp-2">
536
536
  {skill.description || "No description"}
537
537
  </p>
538
- <div className="flex items-center gap-2 mt-2 text-xs text-[#555]">
538
+ <div className="flex items-center gap-2 mt-2 text-xs text-[var(--color-text-faint)]">
539
539
  <span>{(skill.size / 1024).toFixed(1)}KB</span>
540
540
  <span className="px-1.5 py-0.5 rounded bg-blue-500/10 text-blue-400">
541
541
  GitHub
@@ -544,12 +544,12 @@ export function SkillsPage() {
544
544
  </div>
545
545
  <div className="flex-shrink-0">
546
546
  {installed ? (
547
- <span className="text-xs text-[#555] px-3 py-1.5">Added</span>
547
+ <span className="text-xs text-[var(--color-text-faint)] px-3 py-1.5">Added</span>
548
548
  ) : (
549
549
  <button
550
550
  onClick={() => installFromGitHub(skill)}
551
551
  disabled={isInstalling}
552
- className="text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] hover:border-[#f97316] px-3 py-1.5 rounded transition disabled:opacity-50"
552
+ 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"
553
553
  >
554
554
  {isInstalling ? "Installing..." : "Install"}
555
555
  </button>
@@ -563,10 +563,10 @@ export function SkillsPage() {
563
563
  )}
564
564
 
565
565
  {/* Info */}
566
- <div className="p-4 bg-[#111] border border-[#1a1a1a] rounded-lg text-sm text-[#666]">
566
+ <div className="p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg text-sm text-[var(--color-text-muted)]">
567
567
  <p>
568
568
  Skills are sourced from GitHub repositories. Each skill should be in its own directory with a{" "}
569
- <code className="text-[#888] bg-[#0a0a0a] px-1 rounded">SKILL.md</code> file containing instructions.
569
+ <code className="text-[var(--color-text-secondary)] bg-[var(--color-bg)] px-1 rounded">SKILL.md</code> file containing instructions.
570
570
  </p>
571
571
  </div>
572
572
  </div>
@@ -584,12 +584,12 @@ export function SkillsPage() {
584
584
  onChange={(e) => setSearchQuery(e.target.value)}
585
585
  onKeyDown={(e) => e.key === "Enter" && searchMarketplace()}
586
586
  placeholder="Search skills..."
587
- className="flex-1 bg-[#111] border border-[#1a1a1a] rounded px-4 py-2 focus:outline-none focus:border-[#f97316]"
587
+ className="flex-1 bg-[var(--color-surface)] border border-[var(--color-border)] rounded px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
588
588
  />
589
589
  <button
590
590
  onClick={() => searchMarketplace()}
591
591
  disabled={marketplaceLoading}
592
- className="bg-[#1a1a1a] hover:bg-[#222] text-white px-4 py-2 rounded font-medium transition border border-[#333]"
592
+ className="bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] text-white px-4 py-2 rounded font-medium transition border border-[var(--color-border-light)]"
593
593
  >
594
594
  {marketplaceLoading ? "..." : "Search"}
595
595
  </button>
@@ -597,9 +597,9 @@ export function SkillsPage() {
597
597
  </div>
598
598
 
599
599
  {marketplaceLoading ? (
600
- <div className="text-[#666]">Loading...</div>
600
+ <div className="text-[var(--color-text-muted)]">Loading...</div>
601
601
  ) : marketplaceSkills.length === 0 ? (
602
- <div className="text-center py-20 text-[#666]">
602
+ <div className="text-center py-20 text-[var(--color-text-muted)]">
603
603
  <p className="text-lg">No skills found</p>
604
604
  <p className="text-sm mt-1">Try a different search term</p>
605
605
  </div>
@@ -697,7 +697,7 @@ function SkillCard({
697
697
  }
698
698
  if (skill.project_id === null) {
699
699
  return (
700
- <span className="text-xs text-[#666] bg-[#1a1a1a] px-1.5 py-0.5 rounded">
700
+ <span className="text-xs text-[var(--color-text-muted)] bg-[var(--color-surface-raised)] px-1.5 py-0.5 rounded">
701
701
  Global
702
702
  </span>
703
703
  );
@@ -707,9 +707,9 @@ function SkillCard({
707
707
 
708
708
  return (
709
709
  <div
710
- className={`bg-[#111] rounded-lg p-5 border transition cursor-pointer ${
711
- skill.enabled ? "border-[#1a1a1a]" : "border-[#1a1a1a] opacity-60"
712
- } hover:border-[#333]`}
710
+ className={`bg-[var(--color-surface)] rounded-lg p-5 border transition cursor-pointer ${
711
+ skill.enabled ? "border-[var(--color-border)]" : "border-[var(--color-border)] opacity-60"
712
+ } hover:border-[var(--color-border-light)]`}
713
713
  onClick={onView}
714
714
  >
715
715
  <div className="flex items-start justify-between mb-3">
@@ -718,11 +718,11 @@ function SkillCard({
718
718
  <h3 className="font-semibold text-lg truncate">{skill.name}</h3>
719
719
  {getScopeBadge()}
720
720
  </div>
721
- <p className="text-xs text-[#666] flex items-center gap-2 mt-0.5">
721
+ <p className="text-xs text-[var(--color-text-muted)] flex items-center gap-2 mt-0.5">
722
722
  <span className={`px-1.5 py-0.5 rounded text-[10px] ${
723
723
  skill.source === "skillsmp" ? "bg-purple-500/20 text-purple-400" :
724
724
  skill.source === "github" ? "bg-blue-500/20 text-blue-400" :
725
- "bg-[#222] text-[#888]"
725
+ "bg-[var(--color-surface-raised)] text-[var(--color-text-secondary)]"
726
726
  }`}>
727
727
  {sourceLabel}
728
728
  </span>
@@ -735,7 +735,7 @@ function SkillCard({
735
735
  onToggle();
736
736
  }}
737
737
  className={`w-10 h-5 rounded-full transition-colors relative ${
738
- skill.enabled ? "bg-[#f97316]" : "bg-[#333]"
738
+ skill.enabled ? "bg-[var(--color-accent)]" : "bg-[var(--color-surface-raised)]"
739
739
  }`}
740
740
  >
741
741
  <span
@@ -746,17 +746,17 @@ function SkillCard({
746
746
  </button>
747
747
  </div>
748
748
 
749
- <p className="text-sm text-[#888] line-clamp-2 mb-4">{skill.description}</p>
749
+ <p className="text-sm text-[var(--color-text-secondary)] line-clamp-2 mb-4">{skill.description}</p>
750
750
 
751
751
  <div className="flex items-center justify-between">
752
752
  <div className="flex gap-1 flex-wrap">
753
753
  {skill.allowed_tools.slice(0, 2).map((tool) => (
754
- <span key={tool} className="text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]">
754
+ <span key={tool} className="text-xs bg-[var(--color-surface-raised)] px-2 py-0.5 rounded text-[var(--color-text-muted)]">
755
755
  {tool}
756
756
  </span>
757
757
  ))}
758
758
  {skill.allowed_tools.length > 2 && (
759
- <span className="text-xs text-[#666]">+{skill.allowed_tools.length - 2}</span>
759
+ <span className="text-xs text-[var(--color-text-muted)]">+{skill.allowed_tools.length - 2}</span>
760
760
  )}
761
761
  </div>
762
762
  <button
@@ -785,11 +785,11 @@ function MarketplaceSkillCard({
785
785
  onInstall: () => void;
786
786
  }) {
787
787
  return (
788
- <div className="bg-[#111] rounded-lg p-5 border border-[#1a1a1a] hover:border-[#333] transition">
788
+ <div className="bg-[var(--color-surface)] rounded-lg p-5 border border-[var(--color-border)] hover:border-[var(--color-border-light)] transition">
789
789
  <div className="flex items-start justify-between mb-3">
790
790
  <div className="flex-1 min-w-0">
791
791
  <h3 className="font-semibold text-lg truncate">{skill.name}</h3>
792
- <p className="text-xs text-[#666] mt-0.5">
792
+ <p className="text-xs text-[var(--color-text-muted)] mt-0.5">
793
793
  by {skill.author} · v{skill.version}
794
794
  </p>
795
795
  </div>
@@ -798,12 +798,12 @@ function MarketplaceSkillCard({
798
798
  </div>
799
799
  </div>
800
800
 
801
- <p className="text-sm text-[#888] line-clamp-2 mb-4">{skill.description}</p>
801
+ <p className="text-sm text-[var(--color-text-secondary)] line-clamp-2 mb-4">{skill.description}</p>
802
802
 
803
803
  <div className="flex items-center justify-between">
804
804
  <div className="flex gap-1 flex-wrap">
805
805
  {skill.tags.slice(0, 3).map((tag) => (
806
- <span key={tag} className="text-xs bg-[#222] px-2 py-0.5 rounded text-[#666]">
806
+ <span key={tag} className="text-xs bg-[var(--color-surface-raised)] px-2 py-0.5 rounded text-[var(--color-text-muted)]">
807
807
  {tag}
808
808
  </span>
809
809
  ))}
@@ -814,14 +814,14 @@ function MarketplaceSkillCard({
814
814
  <button
815
815
  onClick={onInstall}
816
816
  disabled={installing}
817
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-3 py-1 rounded text-sm font-medium transition"
817
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-3 py-1 rounded text-sm font-medium transition"
818
818
  >
819
819
  {installing ? "Installing..." : "Install"}
820
820
  </button>
821
821
  )}
822
822
  </div>
823
823
 
824
- <div className="mt-3 text-xs text-[#555]">
824
+ <div className="mt-3 text-xs text-[var(--color-text-faint)]">
825
825
  {skill.downloads.toLocaleString()} downloads
826
826
  </div>
827
827
  </div>
@@ -895,10 +895,10 @@ function CreateSkillModal({
895
895
  return (
896
896
  <div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
897
897
  <div
898
- className="bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
898
+ className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
899
899
  onClick={(e) => e.stopPropagation()}
900
900
  >
901
- <div className="p-6 border-b border-[#1a1a1a]">
901
+ <div className="p-6 border-b border-[var(--color-border)]">
902
902
  <h2 className="text-xl font-semibold">Create Skill</h2>
903
903
  </div>
904
904
 
@@ -910,32 +910,32 @@ function CreateSkillModal({
910
910
  )}
911
911
 
912
912
  <div>
913
- <label className="block text-sm text-[#888] mb-1">Name</label>
913
+ <label className="block text-sm text-[var(--color-text-secondary)] mb-1">Name</label>
914
914
  <input
915
915
  type="text"
916
916
  value={name}
917
917
  onChange={(e) => setName(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, "-"))}
918
918
  placeholder="my-skill-name"
919
- className="w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
919
+ 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)]"
920
920
  />
921
- <p className="text-xs text-[#555] mt-1">Lowercase letters, numbers, and hyphens only</p>
921
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">Lowercase letters, numbers, and hyphens only</p>
922
922
  </div>
923
923
 
924
924
  <div>
925
- <label className="block text-sm text-[#888] mb-1">Description</label>
925
+ <label className="block text-sm text-[var(--color-text-secondary)] mb-1">Description</label>
926
926
  <input
927
927
  type="text"
928
928
  value={description}
929
929
  onChange={(e) => setDescription(e.target.value)}
930
930
  placeholder="What this skill does and when to use it..."
931
- className="w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316]"
931
+ 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)]"
932
932
  />
933
933
  </div>
934
934
 
935
935
  {/* Project Scope - only show when projects exist */}
936
936
  {hasProjects && (
937
937
  <div>
938
- <label className="block text-sm text-[#888] mb-1">Scope</label>
938
+ <label className="block text-sm text-[var(--color-text-secondary)] mb-1">Scope</label>
939
939
  <Select
940
940
  value={projectId || ""}
941
941
  onChange={(value) => setProjectId(value || null)}
@@ -945,35 +945,35 @@ function CreateSkillModal({
945
945
  ]}
946
946
  placeholder="Select scope..."
947
947
  />
948
- <p className="text-xs text-[#555] mt-1">
948
+ <p className="text-xs text-[var(--color-text-faint)] mt-1">
949
949
  Global skills are available to all agents. Project-scoped skills are only available to agents in that project.
950
950
  </p>
951
951
  </div>
952
952
  )}
953
953
 
954
954
  <div>
955
- <label className="block text-sm text-[#888] mb-1">Instructions (Markdown)</label>
955
+ <label className="block text-sm text-[var(--color-text-secondary)] mb-1">Instructions (Markdown)</label>
956
956
  <textarea
957
957
  value={content}
958
958
  onChange={(e) => setContent(e.target.value)}
959
959
  placeholder="# Skill Instructions&#10;&#10;Write detailed instructions here..."
960
960
  rows={12}
961
- className="w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"
961
+ 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)] font-mono text-sm"
962
962
  />
963
963
  </div>
964
964
  </div>
965
965
 
966
- <div className="p-6 border-t border-[#1a1a1a] flex justify-end gap-3">
966
+ <div className="p-6 border-t border-[var(--color-border)] flex justify-end gap-3">
967
967
  <button
968
968
  onClick={onClose}
969
- className="px-4 py-2 text-[#888] hover:text-white transition"
969
+ className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
970
970
  >
971
971
  Cancel
972
972
  </button>
973
973
  <button
974
974
  onClick={handleSave}
975
975
  disabled={saving}
976
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
976
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
977
977
  >
978
978
  {saving ? "Creating..." : "Create Skill"}
979
979
  </button>
@@ -1029,12 +1029,12 @@ function ImportSkillModal({
1029
1029
  return (
1030
1030
  <div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
1031
1031
  <div
1032
- className="bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
1032
+ className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
1033
1033
  onClick={(e) => e.stopPropagation()}
1034
1034
  >
1035
- <div className="p-6 border-b border-[#1a1a1a]">
1035
+ <div className="p-6 border-b border-[var(--color-border)]">
1036
1036
  <h2 className="text-xl font-semibold">Import Skill</h2>
1037
- <p className="text-sm text-[#666] mt-1">Paste the contents of a SKILL.md file</p>
1037
+ <p className="text-sm text-[var(--color-text-muted)] mt-1">Paste the contents of a SKILL.md file</p>
1038
1038
  </div>
1039
1039
 
1040
1040
  <div className="p-6 space-y-4">
@@ -1056,21 +1056,21 @@ description: What this skill does...
1056
1056
 
1057
1057
  Your skill instructions here...`}
1058
1058
  rows={16}
1059
- className="w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"
1059
+ 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)] font-mono text-sm"
1060
1060
  />
1061
1061
  </div>
1062
1062
 
1063
- <div className="p-6 border-t border-[#1a1a1a] flex justify-end gap-3">
1063
+ <div className="p-6 border-t border-[var(--color-border)] flex justify-end gap-3">
1064
1064
  <button
1065
1065
  onClick={onClose}
1066
- className="px-4 py-2 text-[#888] hover:text-white transition"
1066
+ className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
1067
1067
  >
1068
1068
  Cancel
1069
1069
  </button>
1070
1070
  <button
1071
1071
  onClick={handleImport}
1072
1072
  disabled={importing}
1073
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
1073
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
1074
1074
  >
1075
1075
  {importing ? "Importing..." : "Import Skill"}
1076
1076
  </button>
@@ -1129,24 +1129,24 @@ function ViewSkillModal({
1129
1129
  return (
1130
1130
  <div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
1131
1131
  <div
1132
- className="bg-[#111] border border-[#1a1a1a] rounded-lg w-full max-w-3xl max-h-[90vh] overflow-auto"
1132
+ className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-3xl max-h-[90vh] overflow-auto"
1133
1133
  onClick={(e) => e.stopPropagation()}
1134
1134
  >
1135
- <div className="p-6 border-b border-[#1a1a1a] flex items-center justify-between">
1135
+ <div className="p-6 border-b border-[var(--color-border)] flex items-center justify-between">
1136
1136
  <div>
1137
1137
  <h2 className="text-xl font-semibold">{skill.name}</h2>
1138
- <p className="text-sm text-[#666] mt-0.5">{skill.description}</p>
1138
+ <p className="text-sm text-[var(--color-text-muted)] mt-0.5">{skill.description}</p>
1139
1139
  </div>
1140
1140
  <div className="flex gap-2">
1141
1141
  <button
1142
1142
  onClick={handleExport}
1143
- className="text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]"
1143
+ className="text-sm text-[var(--color-text-secondary)] hover:text-white transition px-3 py-1 rounded border border-[var(--color-border-light)]"
1144
1144
  >
1145
1145
  Export
1146
1146
  </button>
1147
1147
  <button
1148
1148
  onClick={() => setEditing(!editing)}
1149
- className="text-sm text-[#888] hover:text-white transition px-3 py-1 rounded border border-[#333]"
1149
+ className="text-sm text-[var(--color-text-secondary)] hover:text-white transition px-3 py-1 rounded border border-[var(--color-border-light)]"
1150
1150
  >
1151
1151
  {editing ? "View" : "Edit"}
1152
1152
  </button>
@@ -1159,19 +1159,19 @@ function ViewSkillModal({
1159
1159
  value={content}
1160
1160
  onChange={(e) => setContent(e.target.value)}
1161
1161
  rows={20}
1162
- className="w-full bg-[#0a0a0a] border border-[#222] rounded px-3 py-2 focus:outline-none focus:border-[#f97316] font-mono text-sm"
1162
+ 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)] font-mono text-sm"
1163
1163
  />
1164
1164
  ) : (
1165
- <pre className="bg-[#0a0a0a] border border-[#222] rounded p-4 font-mono text-sm overflow-auto max-h-[60vh] whitespace-pre-wrap">
1165
+ <pre className="bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-4 font-mono text-sm overflow-auto max-h-[60vh] whitespace-pre-wrap">
1166
1166
  {skill.content}
1167
1167
  </pre>
1168
1168
  )}
1169
1169
  </div>
1170
1170
 
1171
- <div className="p-6 border-t border-[#1a1a1a] flex justify-between">
1172
- <div className="text-xs text-[#555]">
1171
+ <div className="p-6 border-t border-[var(--color-border)] flex justify-between">
1172
+ <div className="text-xs text-[var(--color-text-faint)]">
1173
1173
  {skill.source !== "local" && skill.source_url && (
1174
- <a href={skill.source_url} target="_blank" rel="noopener noreferrer" className="text-[#f97316] hover:underline">
1174
+ <a href={skill.source_url} target="_blank" rel="noopener noreferrer" className="text-[var(--color-accent)] hover:underline">
1175
1175
  View source →
1176
1176
  </a>
1177
1177
  )}
@@ -1179,7 +1179,7 @@ function ViewSkillModal({
1179
1179
  <div className="flex gap-3">
1180
1180
  <button
1181
1181
  onClick={onClose}
1182
- className="px-4 py-2 text-[#888] hover:text-white transition"
1182
+ className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
1183
1183
  >
1184
1184
  Close
1185
1185
  </button>
@@ -1187,7 +1187,7 @@ function ViewSkillModal({
1187
1187
  <button
1188
1188
  onClick={handleSave}
1189
1189
  disabled={saving}
1190
- className="bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
1190
+ className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
1191
1191
  >
1192
1192
  {saving ? "Saving..." : "Save Changes"}
1193
1193
  </button>