apteva 0.4.41 → 0.4.48

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 (103) hide show
  1. package/dist/ActivityPage.sw9p594m.js +3 -0
  2. package/dist/ApiDocsPage.90e03bz7.js +4 -0
  3. package/dist/App.0ws87fpx.js +53 -0
  4. package/dist/App.3vnrera5.js +4 -0
  5. package/dist/App.94x6mh7f.js +20 -0
  6. package/dist/{App.7fb3e7mp.js → App.9sryp183.js} +1 -1
  7. package/dist/App.d9tny4t0.js +221 -0
  8. package/dist/App.jhb45d7r.js +8 -0
  9. package/dist/App.p7jjw1zf.js +4 -0
  10. package/dist/App.pfbdzrhh.js +4 -0
  11. package/dist/App.stgng5bx.js +13 -0
  12. package/dist/App.tm3k7h4b.js +4 -0
  13. package/dist/App.vkg121c6.js +4 -0
  14. package/dist/App.wghtdzsk.js +1 -0
  15. package/dist/App.xf7wsckg.js +4 -0
  16. package/dist/App.xva0tfzh.js +4 -0
  17. package/dist/App.ysxy7akk.js +61 -0
  18. package/dist/App.yzkh4gq2.js +4 -0
  19. package/dist/ConnectionsPage.q5f9fd37.js +3 -0
  20. package/dist/McpPage.f3ccrezb.js +3 -0
  21. package/dist/SettingsPage.3sqx6wm4.js +3 -0
  22. package/dist/SkillsPage.whxnez67.js +3 -0
  23. package/dist/TasksPage.zp4jfevw.js +3 -0
  24. package/dist/TelemetryPage.a9fmxq87.js +3 -0
  25. package/dist/TestsPage.18krj0d1.js +3 -0
  26. package/dist/ThreadsPage.nnphgy98.js +3 -0
  27. package/dist/apteva-kit.css +1 -1
  28. package/dist/index.html +1 -1
  29. package/dist/styles.css +1 -1
  30. package/package.json +11 -10
  31. package/src/db.ts +61 -13
  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 +55 -24
  36. package/src/routes/api/agent-utils.ts +25 -4
  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 +38 -2
  41. package/src/routes/share.ts +85 -0
  42. package/src/server.ts +64 -1
  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 +19 -17
  46. package/src/web/components/agents/AgentPanel.tsx +541 -220
  47. package/src/web/components/agents/AgentsView.tsx +4 -4
  48. package/src/web/components/agents/CreateAgentModal.tsx +24 -82
  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 +9 -9
  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 +35 -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 +291 -175
  67. package/src/web/components/skills/SkillsPage.tsx +88 -88
  68. package/src/web/components/tasks/TasksPage.tsx +539 -78
  69. package/src/web/components/telemetry/TelemetryPage.tsx +405 -65
  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 +90 -0
  74. package/src/web/context/index.ts +2 -0
  75. package/src/web/index.html +1 -6
  76. package/src/web/styles.css +52 -3
  77. package/src/web/themes.ts +162 -0
  78. package/src/web/types.ts +0 -4
  79. package/dist/ActivityPage.7907h64p.js +0 -3
  80. package/dist/ApiDocsPage.k3jjenpq.js +0 -4
  81. package/dist/App.01nq20st.js +0 -4
  82. package/dist/App.1maqvamf.js +0 -4
  83. package/dist/App.2yjrh32f.js +0 -4
  84. package/dist/App.3qw8nben.js +0 -20
  85. package/dist/App.7sy3wq8c.js +0 -4
  86. package/dist/App.apjrmctz.js +0 -57
  87. package/dist/App.av6t2yhe.js +0 -4
  88. package/dist/App.jqj5a094.js +0 -46
  89. package/dist/App.mc7xf85h.js +0 -4
  90. package/dist/App.myxqcj9x.js +0 -4
  91. package/dist/App.nm91r1mp.js +0 -13
  92. package/dist/App.p02f4ret.js +0 -1
  93. package/dist/App.qcknavjz.js +0 -221
  94. package/dist/App.vc7vfhg4.js +0 -4
  95. package/dist/App.z4s9zkw5.js +0 -4
  96. package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
  97. package/dist/McpPage.8vc97z0b.js +0 -3
  98. package/dist/SettingsPage.p61bz8kd.js +0 -3
  99. package/dist/SkillsPage.r9x43g3g.js +0 -3
  100. package/dist/TasksPage.1e0zkye4.js +0 -3
  101. package/dist/TelemetryPage.p9vbe4gf.js +0 -3
  102. package/dist/TestsPage.d4xy504e.js +0 -3
  103. package/dist/ThreadsPage.m016am3x.js +0 -3
@@ -75,13 +75,13 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
75
75
  return (
76
76
  <>
77
77
  <h2 className="text-2xl font-semibold mb-2">Create your account</h2>
78
- <p className="text-[#666] mb-6">
78
+ <p className="text-[var(--color-text-muted)] mb-6">
79
79
  Set up your admin account to get started with apteva.
80
80
  </p>
81
81
 
82
82
  <form onSubmit={handleSubmit} className="space-y-4">
83
83
  <div>
84
- <label htmlFor="username" className="block text-sm text-[#888] mb-1">
84
+ <label htmlFor="username" className="block text-sm text-[var(--color-text-secondary)] mb-1">
85
85
  Username
86
86
  </label>
87
87
  <input
@@ -92,13 +92,13 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
92
92
  placeholder="Choose a username"
93
93
  autoFocus
94
94
  required
95
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
95
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
96
96
  />
97
- <p className="text-xs text-[#666] mt-1">3-20 characters, letters, numbers, underscore</p>
97
+ <p className="text-xs text-[var(--color-text-muted)] mt-1">3-20 characters, letters, numbers, underscore</p>
98
98
  </div>
99
99
 
100
100
  <div>
101
- <label htmlFor="password" className="block text-sm text-[#888] mb-1">
101
+ <label htmlFor="password" className="block text-sm text-[var(--color-text-secondary)] mb-1">
102
102
  Password
103
103
  </label>
104
104
  <input
@@ -108,13 +108,13 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
108
108
  onChange={e => setPassword(e.target.value)}
109
109
  placeholder="Enter a password"
110
110
  required
111
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
111
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
112
112
  />
113
- <p className="text-xs text-[#666] mt-1">Min 8 characters, uppercase, lowercase, number</p>
113
+ <p className="text-xs text-[var(--color-text-muted)] mt-1">Min 8 characters, uppercase, lowercase, number</p>
114
114
  </div>
115
115
 
116
116
  <div>
117
- <label htmlFor="confirmPassword" className="block text-sm text-[#888] mb-1">
117
+ <label htmlFor="confirmPassword" className="block text-sm text-[var(--color-text-secondary)] mb-1">
118
118
  Confirm Password
119
119
  </label>
120
120
  <input
@@ -124,7 +124,7 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
124
124
  onChange={e => setConfirmPassword(e.target.value)}
125
125
  placeholder="Confirm your password"
126
126
  required
127
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
127
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
128
128
  />
129
129
  </div>
130
130
 
@@ -132,14 +132,14 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
132
132
  <button
133
133
  type="button"
134
134
  onClick={() => setShowEmail(true)}
135
- className="text-sm text-[#666] hover:text-[#888] transition"
135
+ className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
136
136
  >
137
137
  + Add email for password recovery (optional)
138
138
  </button>
139
139
  ) : (
140
140
  <div>
141
- <label htmlFor="email" className="block text-sm text-[#888] mb-1">
142
- Email <span className="text-[#666]">(optional)</span>
141
+ <label htmlFor="email" className="block text-sm text-[var(--color-text-secondary)] mb-1">
142
+ Email <span className="text-[var(--color-text-muted)]">(optional)</span>
143
143
  </label>
144
144
  <input
145
145
  id="email"
@@ -147,9 +147,9 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
147
147
  value={email}
148
148
  onChange={e => setEmail(e.target.value)}
149
149
  placeholder="For password recovery only"
150
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
150
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
151
151
  />
152
- <p className="text-xs text-[#666] mt-1">Only used for password recovery, never shared</p>
152
+ <p className="text-xs text-[var(--color-text-muted)] mt-1">Only used for password recovery, never shared</p>
153
153
  </div>
154
154
  )}
155
155
 
@@ -162,13 +162,13 @@ export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
162
162
  <button
163
163
  type="submit"
164
164
  disabled={loading || !username || !password || !confirmPassword}
165
- className="w-full bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 disabled:cursor-not-allowed text-black px-4 py-3 rounded font-medium transition"
165
+ className="w-full bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 disabled:cursor-not-allowed text-black px-4 py-3 rounded font-medium transition"
166
166
  >
167
167
  {loading ? "Creating account..." : "Create Account"}
168
168
  </button>
169
169
  </form>
170
170
 
171
- <p className="text-xs text-[#666] mt-4 text-center">
171
+ <p className="text-xs text-[var(--color-text-muted)] mt-4 text-center">
172
172
  This will be your admin account with full access to apteva.
173
173
  </p>
174
174
  </>
@@ -23,24 +23,24 @@ export function LoginPage() {
23
23
  };
24
24
 
25
25
  return (
26
- <div className="min-h-screen bg-[#0a0a0a] text-[#e0e0e0] font-mono flex items-center justify-center p-8">
26
+ <div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center p-8">
27
27
  <div className="w-full max-w-md">
28
28
  {/* Logo */}
29
29
  <div className="text-center mb-8">
30
30
  <div className="flex items-center justify-center gap-2 mb-2">
31
- <span className="text-[#f97316] text-3xl">&gt;_</span>
31
+ <span className="text-[var(--color-accent)] text-3xl">&gt;_</span>
32
32
  <span className="text-3xl tracking-wider">apteva</span>
33
33
  </div>
34
- <p className="text-[#666]">Run AI agents locally</p>
34
+ <p className="text-[var(--color-text-muted)]">Run AI agents locally</p>
35
35
  </div>
36
36
 
37
- <div className="bg-[#111] rounded-lg border border-[#1a1a1a] p-8">
37
+ <div className="bg-[var(--color-surface)] card p-8">
38
38
  <h2 className="text-2xl font-semibold mb-2">Welcome back</h2>
39
- <p className="text-[#666] mb-6">Sign in to continue to apteva</p>
39
+ <p className="text-[var(--color-text-muted)] mb-6">Sign in to continue to apteva</p>
40
40
 
41
41
  <form onSubmit={handleSubmit} className="space-y-4">
42
42
  <div>
43
- <label htmlFor="username" className="block text-sm text-[#888] mb-1">
43
+ <label htmlFor="username" className="block text-sm text-[var(--color-text-secondary)] mb-1">
44
44
  Username
45
45
  </label>
46
46
  <input
@@ -51,12 +51,12 @@ export function LoginPage() {
51
51
  placeholder="Enter your username"
52
52
  autoFocus
53
53
  required
54
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
54
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
55
55
  />
56
56
  </div>
57
57
 
58
58
  <div>
59
- <label htmlFor="password" className="block text-sm text-[#888] mb-1">
59
+ <label htmlFor="password" className="block text-sm text-[var(--color-text-secondary)] mb-1">
60
60
  Password
61
61
  </label>
62
62
  <input
@@ -66,7 +66,7 @@ export function LoginPage() {
66
66
  onChange={e => setPassword(e.target.value)}
67
67
  placeholder="Enter your password"
68
68
  required
69
- className="w-full bg-[#0a0a0a] border border-[#333] rounded px-4 py-3 focus:outline-none focus:border-[#f97316]"
69
+ className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
70
70
  />
71
71
  </div>
72
72
 
@@ -79,7 +79,7 @@ export function LoginPage() {
79
79
  <button
80
80
  type="submit"
81
81
  disabled={loading || !username || !password}
82
- className="w-full bg-[#f97316] hover:bg-[#fb923c] disabled:opacity-50 disabled:cursor-not-allowed text-black px-4 py-3 rounded font-medium transition"
82
+ className="w-full bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 disabled:cursor-not-allowed text-black px-4 py-3 rounded font-medium transition"
83
83
  >
84
84
  {loading ? "Signing in..." : "Sign In"}
85
85
  </button>
@@ -7,7 +7,7 @@ interface LoadingSpinnerProps {
7
7
 
8
8
  export function LoadingSpinner({ message = "Loading...", fullScreen = false }: LoadingSpinnerProps) {
9
9
  const content = (
10
- <div className="flex items-center gap-3 text-[#666]">
10
+ <div className="flex items-center gap-3 text-[var(--color-text-muted)]">
11
11
  <svg className="animate-spin h-5 w-5" viewBox="0 0 24 24">
12
12
  <circle
13
13
  className="opacity-25"
@@ -30,7 +30,7 @@ export function LoadingSpinner({ message = "Loading...", fullScreen = false }: L
30
30
 
31
31
  if (fullScreen) {
32
32
  return (
33
- <div className="min-h-screen bg-[#0a0a0a] text-[#e0e0e0] font-mono flex items-center justify-center">
33
+ <div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center">
34
34
  {content}
35
35
  </div>
36
36
  );
@@ -8,7 +8,7 @@ interface ModalProps {
8
8
  export function Modal({ children, onClose }: ModalProps) {
9
9
  return (
10
10
  <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
11
- <div className="bg-[#111] rounded p-6 w-full max-w-xl lg:max-w-2xl border border-[#1a1a1a] max-h-[90vh] overflow-y-auto">
11
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-xl lg:max-w-2xl max-h-[90vh] overflow-y-auto">
12
12
  {children}
13
13
  </div>
14
14
  </div>
@@ -37,22 +37,22 @@ export function ConfirmModal({
37
37
  }: ConfirmModalProps) {
38
38
  return (
39
39
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
40
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-sm">
40
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-sm">
41
41
  {title && <h3 className="font-medium mb-2">{title}</h3>}
42
- <p className="text-sm text-[#ccc] mb-4">{message}</p>
42
+ <p className="text-sm text-[var(--color-text)] mb-4">{message}</p>
43
43
  <div className="flex gap-2">
44
44
  <button
45
45
  onClick={onCancel}
46
- className="flex-1 text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] px-4 py-2 rounded transition"
46
+ className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] btn px-4 py-2 transition"
47
47
  >
48
48
  {cancelText}
49
49
  </button>
50
50
  <button
51
51
  onClick={onConfirm}
52
- className={`flex-1 text-sm text-white px-4 py-2 rounded transition ${
52
+ className={`flex-1 text-sm text-white px-4 py-2 btn transition ${
53
53
  confirmVariant === "danger"
54
54
  ? "bg-red-500 hover:bg-red-600"
55
- : "bg-[#f97316] hover:bg-[#ea580c]"
55
+ : "bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)]"
56
56
  }`}
57
57
  >
58
58
  {confirmText}
@@ -93,17 +93,17 @@ export function AlertModal({
93
93
 
94
94
  return (
95
95
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
96
- <div className="bg-[#111] border border-[#333] rounded-lg p-6 w-full max-w-sm text-center">
96
+ <div className="bg-[var(--color-surface)] card p-6 w-full max-w-sm text-center">
97
97
  <div
98
98
  className={`w-12 h-12 rounded-full flex items-center justify-center mx-auto mb-3 ${iconColors[variant]}`}
99
99
  >
100
100
  <span className="text-xl">{icons[variant]}</span>
101
101
  </div>
102
102
  {title && <h3 className="font-medium mb-2">{title}</h3>}
103
- <p className="text-sm text-[#ccc] mb-4">{message}</p>
103
+ <p className="text-sm text-[var(--color-text)] mb-4">{message}</p>
104
104
  <button
105
105
  onClick={onClose}
106
- className="w-full text-sm bg-[#1a1a1a] hover:bg-[#222] border border-[#333] px-4 py-2 rounded transition"
106
+ className="w-full text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 btn transition"
107
107
  >
108
108
  {buttonText}
109
109
  </button>
@@ -35,14 +35,14 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
35
35
  <button
36
36
  type="button"
37
37
  onClick={() => setIsOpen(!isOpen)}
38
- className={`w-full bg-[#0a0a0a] border border-[#222] rounded ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between focus:outline-none focus:border-[#f97316] text-[#e0e0e0] hover:border-[#333] transition`}
38
+ className={`w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] btn ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between focus:outline-none focus:border-[var(--color-accent)] text-[var(--color-text)] hover:border-[var(--color-border-light)] transition`}
39
39
  >
40
- <span className={selectedOption ? "text-[#e0e0e0]" : "text-[#666]"}>
40
+ <span className={selectedOption ? "text-[var(--color-text)]" : "text-[var(--color-text-muted)]"}>
41
41
  {selectedOption ? (
42
42
  <>
43
43
  {selectedOption.label}
44
44
  {selectedOption.recommended && (
45
- <span className="text-[#f97316] text-xs ml-2">(Recommended)</span>
45
+ <span className="text-[var(--color-accent)] text-xs ml-2">(Recommended)</span>
46
46
  )}
47
47
  </>
48
48
  ) : placeholder}
@@ -51,7 +51,7 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
51
51
  </button>
52
52
 
53
53
  {isOpen && (
54
- <div className="absolute z-50 w-full min-w-max mt-1 bg-[#111] border border-[#222] rounded shadow-lg max-h-60 overflow-y-auto scrollbar-hide">
54
+ <div className="absolute z-50 w-full min-w-max mt-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] shadow-lg max-h-60 overflow-y-auto scrollbar-hide" style={{ borderRadius: "var(--radius-button)" }}>
55
55
  {options.map((option) => (
56
56
  <button
57
57
  key={option.value}
@@ -60,18 +60,18 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
60
60
  onChange(option.value);
61
61
  setIsOpen(false);
62
62
  }}
63
- className={`w-full ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between hover:bg-[#1a1a1a] transition ${
64
- option.value === value ? "bg-[#1a1a1a] text-[#f97316]" : "text-[#e0e0e0]"
63
+ className={`w-full ${compact ? "px-2.5 py-1.5 text-sm" : "px-3 py-2"} text-left flex items-center justify-between hover:bg-[var(--color-surface-raised)] transition ${
64
+ option.value === value ? "bg-[var(--color-surface-raised)] text-[var(--color-accent)]" : "text-[var(--color-text)]"
65
65
  }`}
66
66
  >
67
67
  <span>
68
68
  {option.label}
69
69
  {option.recommended && (
70
- <span className="text-[#f97316] text-xs ml-2">(Recommended)</span>
70
+ <span className="text-[var(--color-accent)] text-xs ml-2">(Recommended)</span>
71
71
  )}
72
72
  </span>
73
73
  {option.value === value && (
74
- <svg className="w-4 h-4 text-[#f97316]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
74
+ <svg className="w-4 h-4 text-[var(--color-accent)]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
75
75
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
76
76
  </svg>
77
77
  )}
@@ -86,7 +86,7 @@ export function Select({ value, options, onChange, placeholder = "Select...", co
86
86
  function ChevronIcon({ isOpen }: { isOpen: boolean }) {
87
87
  return (
88
88
  <svg
89
- className={`w-4 h-4 text-[#666] transition-transform ${isOpen ? "rotate-180" : ""}`}
89
+ className={`w-4 h-4 text-[var(--color-text-muted)] transition-transform ${isOpen ? "rotate-180" : ""}`}
90
90
  fill="none"
91
91
  stroke="currentColor"
92
92
  viewBox="0 0 24 24"
@@ -21,22 +21,22 @@ export function ConnectionsPage() {
21
21
  <div className="flex items-center justify-between mb-6">
22
22
  <div>
23
23
  <h1 className="text-2xl font-semibold mb-1">Connections</h1>
24
- <p className="text-[#666]">
24
+ <p className="text-[var(--color-text-muted)]">
25
25
  Manage external app connections, triggers, and webhooks.
26
26
  </p>
27
27
  </div>
28
28
  </div>
29
29
 
30
30
  {/* Tabs */}
31
- <div className="flex gap-1 mb-6 bg-[#111] border border-[#1a1a1a] rounded-lg p-1 w-fit">
31
+ <div className="flex gap-1 mb-6 bg-[var(--color-surface)] card p-1 w-fit">
32
32
  {tabs.map(tab => (
33
33
  <button
34
34
  key={tab.id}
35
35
  onClick={() => setActiveTab(tab.id)}
36
36
  className={`px-4 py-2 rounded text-sm font-medium transition ${
37
37
  activeTab === tab.id
38
- ? "bg-[#1a1a1a] text-white"
39
- : "text-[#666] hover:text-[#888]"
38
+ ? "bg-[var(--color-surface-raised)] text-white"
39
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
40
40
  }`}
41
41
  >
42
42
  {tab.label}
@@ -66,23 +66,23 @@ export function IntegrationsTab() {
66
66
 
67
67
  return (
68
68
  <div>
69
- <p className="text-sm text-[#666] mb-4">
69
+ <p className="text-sm text-[var(--color-text-muted)] mb-4">
70
70
  Connect external apps via OAuth or API Key. Connected apps can be used for triggers and MCP integrations.
71
71
  </p>
72
72
 
73
73
  {/* Provider Selector — only show if multiple configured */}
74
74
  {providers.length > 1 && (
75
75
  <div className="flex items-center gap-2 mb-4">
76
- <span className="text-xs text-[#666]">Provider:</span>
77
- <div className="flex gap-1 bg-[#111] border border-[#1a1a1a] rounded-lg p-0.5">
76
+ <span className="text-xs text-[var(--color-text-muted)]">Provider:</span>
77
+ <div className="flex gap-1 bg-[var(--color-surface)] card p-0.5">
78
78
  {providers.map(p => (
79
79
  <button
80
80
  key={p.id}
81
81
  onClick={() => setSelectedProvider(p.id)}
82
82
  className={`px-3 py-1 rounded text-xs font-medium transition ${
83
83
  selectedProvider === p.id
84
- ? "bg-[#1a1a1a] text-white"
85
- : "text-[#666] hover:text-[#888]"
84
+ ? "bg-[var(--color-surface-raised)] text-white"
85
+ : "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
86
86
  }`}
87
87
  >
88
88
  {p.name}
@@ -93,9 +93,9 @@ export function IntegrationsTab() {
93
93
  )}
94
94
 
95
95
  {providers.length === 0 ? (
96
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-8 text-center">
97
- <p className="text-[#666]">No integration providers configured.</p>
98
- <p className="text-sm text-[#555] mt-1">Add API keys for Composio or AgentDojo in Settings.</p>
96
+ <div className="bg-[var(--color-surface)] card p-8 text-center">
97
+ <p className="text-[var(--color-text-muted)]">No integration providers configured.</p>
98
+ <p className="text-sm text-[var(--color-text-faint)] mt-1">Add API keys for Composio or AgentDojo in Settings.</p>
99
99
  </div>
100
100
  ) : (
101
101
  <IntegrationsPanel
@@ -109,15 +109,15 @@ export function IntegrationsTab() {
109
109
  {/* Trigger Types Panel */}
110
110
  {browsingToolkit && (
111
111
  <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
112
- <div className="bg-[#111] border border-[#333] rounded-lg w-full max-w-2xl mx-4 max-h-[80vh] flex flex-col">
113
- <div className="p-4 border-b border-[#1a1a1a] flex items-center justify-between">
112
+ <div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg w-full max-w-2xl mx-4 max-h-[80vh] flex flex-col">
113
+ <div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between">
114
114
  <div>
115
115
  <h3 className="font-medium">Trigger Types</h3>
116
- <p className="text-xs text-[#666]">{browsingToolkit}</p>
116
+ <p className="text-xs text-[var(--color-text-muted)]">{browsingToolkit}</p>
117
117
  </div>
118
118
  <button
119
119
  onClick={() => { setBrowsingToolkit(null); setTriggerTypes([]); }}
120
- className="text-[#666] hover:text-white transition text-lg px-2"
120
+ className="text-[var(--color-text-muted)] hover:text-white transition text-lg px-2"
121
121
  >
122
122
  x
123
123
  </button>
@@ -125,28 +125,28 @@ export function IntegrationsTab() {
125
125
 
126
126
  <div className="flex-1 overflow-auto p-4">
127
127
  {typesLoading ? (
128
- <div className="text-center py-8 text-[#666]">Loading trigger types...</div>
128
+ <div className="text-center py-8 text-[var(--color-text-muted)]">Loading trigger types...</div>
129
129
  ) : triggerTypes.length === 0 ? (
130
- <div className="text-center py-8 text-[#666]">
130
+ <div className="text-center py-8 text-[var(--color-text-muted)]">
131
131
  No trigger types available for this app.
132
132
  </div>
133
133
  ) : (
134
134
  <div className="space-y-2">
135
135
  {triggerTypes.map(tt => (
136
- <div key={tt.slug} className="bg-[#0a0a0a] border border-[#1a1a1a] rounded-lg p-3">
136
+ <div key={tt.slug} className="bg-[var(--color-bg)] card p-3">
137
137
  <div className="flex items-start gap-3">
138
138
  {tt.logo ? (
139
139
  <img src={tt.logo} alt={tt.toolkit_name} className="w-6 h-6 rounded object-contain flex-shrink-0 mt-0.5" />
140
140
  ) : (
141
- <div className="w-6 h-6 rounded bg-[#1a1a1a] flex items-center justify-center text-[10px] flex-shrink-0 mt-0.5">
141
+ <div className="w-6 h-6 rounded bg-[var(--color-surface-raised)] flex items-center justify-center text-[10px] flex-shrink-0 mt-0.5">
142
142
  {tt.toolkit_name?.[0]?.toUpperCase() || "?"}
143
143
  </div>
144
144
  )}
145
145
  <div className="flex-1 min-w-0">
146
146
  <div className="text-sm font-medium">{tt.name}</div>
147
- <div className="text-xs text-[#666] mt-0.5">{tt.description}</div>
147
+ <div className="text-xs text-[var(--color-text-muted)] mt-0.5">{tt.description}</div>
148
148
  <div className="flex items-center gap-2 mt-1.5">
149
- <span className="text-[10px] bg-[#1a1a1a] text-[#555] px-1.5 py-0.5 rounded font-mono">
149
+ <span className="text-[10px] bg-[var(--color-surface-raised)] text-[var(--color-text-faint)] px-1.5 py-0.5 rounded font-mono">
150
150
  {tt.slug}
151
151
  </span>
152
152
  <span className={`text-[10px] px-1.5 py-0.5 rounded ${
@@ -55,7 +55,7 @@ export function OverviewTab() {
55
55
  }, [authFetch, currentProjectId]);
56
56
 
57
57
  if (loading) {
58
- return <div className="text-center py-12 text-[#666]">Loading...</div>;
58
+ return <div className="text-center py-12 text-[var(--color-text-muted)]">Loading...</div>;
59
59
  }
60
60
 
61
61
  const enabledSubs = subscriptions.filter(s => s.enabled);
@@ -73,9 +73,9 @@ export function OverviewTab() {
73
73
 
74
74
  {/* Subscriptions */}
75
75
  <section>
76
- <h3 className="text-sm font-medium text-[#888] mb-3">Subscriptions ({subscriptions.length})</h3>
76
+ <h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">Subscriptions ({subscriptions.length})</h3>
77
77
  {subscriptions.length === 0 ? (
78
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-6 text-center text-[#666] text-sm">
78
+ <div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
79
79
  No subscriptions yet. Go to the Triggers tab to create one.
80
80
  </div>
81
81
  ) : (
@@ -83,27 +83,27 @@ export function OverviewTab() {
83
83
  {subscriptions.map(sub => {
84
84
  const agent = agentMap.get(sub.agent_id);
85
85
  return (
86
- <div key={sub.id} className="bg-[#111] border border-[#1a1a1a] rounded-lg p-3 flex items-center gap-3">
87
- <div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[#555]"}`} />
86
+ <div key={sub.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
87
+ <div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[var(--color-text-faint)]"}`} />
88
88
  <div className="flex-1 min-w-0">
89
89
  <div className="text-sm font-medium truncate">
90
90
  {sub.trigger_slug.replace(/_/g, " ").replace(/-/g, " ")}
91
91
  </div>
92
- <div className="text-xs text-[#666]">
92
+ <div className="text-xs text-[var(--color-text-muted)]">
93
93
  {sub.trigger_instance_id
94
94
  ? `ID: ${sub.trigger_instance_id.slice(0, 12)}...`
95
95
  : "All instances"
96
96
  }
97
97
  </div>
98
98
  </div>
99
- <div className="text-xs text-[#888] flex-shrink-0">
100
- <span className="text-[#555]">&rarr;</span>{" "}
101
- <span className="text-[#f97316]">{agent?.name || "Unknown Agent"}</span>
99
+ <div className="text-xs text-[var(--color-text-secondary)] flex-shrink-0">
100
+ <span className="text-[var(--color-text-faint)]">&rarr;</span>{" "}
101
+ <span className="text-[var(--color-accent)]">{agent?.name || "Unknown Agent"}</span>
102
102
  </div>
103
103
  <span className={`text-xs px-2 py-0.5 rounded flex-shrink-0 ${
104
104
  sub.enabled
105
105
  ? "bg-green-500/10 text-green-400"
106
- : "bg-[#1a1a1a] text-[#555]"
106
+ : "bg-[var(--color-surface-raised)] text-[var(--color-text-faint)]"
107
107
  }`}>
108
108
  {sub.enabled ? "active" : "disabled"}
109
109
  </span>
@@ -127,9 +127,9 @@ function StatCard({
127
127
  valueColor?: string;
128
128
  }) {
129
129
  return (
130
- <div className="bg-[#111] border border-[#1a1a1a] rounded-lg p-4">
131
- <div className="text-xs text-[#666] mb-1">{label}</div>
132
- <div className={`text-2xl font-bold ${valueColor || "text-[#e0e0e0]"}`}>
130
+ <div className="bg-[var(--color-surface)] card p-4">
131
+ <div className="text-xs text-[var(--color-text-muted)] mb-1">{label}</div>
132
+ <div className={`text-2xl font-bold ${valueColor || "text-[var(--color-text)]"}`}>
133
133
  {value}
134
134
  </div>
135
135
  </div>