apteva 0.4.44 → 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.
- package/dist/{ActivityPage.c48n83h2.js → ActivityPage.sw9p594m.js} +1 -1
- package/dist/{ApiDocsPage.yzcxx5ax.js → ApiDocsPage.90e03bz7.js} +1 -1
- package/dist/App.0ws87fpx.js +53 -0
- package/dist/App.3vnrera5.js +4 -0
- package/dist/App.94x6mh7f.js +20 -0
- package/dist/{App.qzbx5wtj.js → App.9sryp183.js} +1 -1
- package/dist/App.d9tny4t0.js +221 -0
- package/dist/{App.r5serxkt.js → App.jhb45d7r.js} +1 -1
- package/dist/App.p7jjw1zf.js +4 -0
- package/dist/App.pfbdzrhh.js +4 -0
- package/dist/App.stgng5bx.js +13 -0
- package/dist/{App.152mbs1r.js → App.tm3k7h4b.js} +1 -1
- package/dist/App.vkg121c6.js +4 -0
- package/dist/App.wghtdzsk.js +1 -0
- package/dist/App.xf7wsckg.js +4 -0
- package/dist/App.xva0tfzh.js +4 -0
- package/dist/App.ysxy7akk.js +61 -0
- package/dist/App.yzkh4gq2.js +4 -0
- package/dist/ConnectionsPage.q5f9fd37.js +3 -0
- package/dist/McpPage.f3ccrezb.js +3 -0
- package/dist/SettingsPage.3sqx6wm4.js +3 -0
- package/dist/SkillsPage.whxnez67.js +3 -0
- package/dist/TasksPage.zp4jfevw.js +3 -0
- package/dist/TelemetryPage.a9fmxq87.js +3 -0
- package/dist/TestsPage.18krj0d1.js +3 -0
- package/dist/ThreadsPage.nnphgy98.js +3 -0
- package/dist/apteva-kit.css +1 -1
- package/dist/index.html +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -4
- package/src/db.ts +42 -4
- package/src/providers.ts +14 -9
- package/src/routes/api/agent-utils.ts +25 -3
- package/src/routes/api/telemetry.ts +20 -2
- package/src/server.ts +52 -1
- package/src/web/App.tsx +1 -1
- package/src/web/components/agents/AgentCard.tsx +9 -7
- package/src/web/components/agents/AgentPanel.tsx +205 -44
- package/src/web/components/agents/CreateAgentModal.tsx +5 -5
- package/src/web/components/auth/LoginPage.tsx +2 -2
- package/src/web/components/common/LoadingSpinner.tsx +1 -1
- package/src/web/components/common/Modal.tsx +6 -6
- package/src/web/components/common/Select.tsx +2 -2
- package/src/web/components/connections/ConnectionsPage.tsx +1 -1
- package/src/web/components/connections/IntegrationsTab.tsx +3 -3
- package/src/web/components/connections/OverviewTab.tsx +3 -3
- package/src/web/components/connections/TriggersTab.tsx +8 -8
- package/src/web/components/dashboard/Dashboard.tsx +2 -2
- package/src/web/components/layout/Header.tsx +3 -3
- package/src/web/components/layout/Sidebar.tsx +3 -2
- package/src/web/components/mcp/McpPage.tsx +13 -13
- package/src/web/components/onboarding/OnboardingWizard.tsx +2 -2
- package/src/web/components/settings/SettingsPage.tsx +55 -22
- package/src/web/components/skills/SkillsPage.tsx +7 -7
- package/src/web/components/tasks/TasksPage.tsx +212 -36
- package/src/web/components/telemetry/TelemetryPage.tsx +278 -9
- package/src/web/components/tests/TestsPage.tsx +2 -2
- package/src/web/components/threads/ThreadsPage.tsx +2 -2
- package/src/web/context/ThemeContext.tsx +31 -10
- package/src/web/index.html +1 -6
- package/src/web/styles.css +47 -0
- package/src/web/themes.ts +68 -5
- package/dist/App.09yb8t0b.js +0 -1
- package/dist/App.3a67nx9w.js +0 -4
- package/dist/App.9epx6785.js +0 -4
- package/dist/App.d8955awp.js +0 -4
- package/dist/App.drwb57jq.js +0 -4
- package/dist/App.gssbmajb.js +0 -4
- package/dist/App.qw70pc29.js +0 -53
- package/dist/App.tpmp9020.js +0 -20
- package/dist/App.v2wb4d7d.js +0 -61
- package/dist/App.vxmaaj0m.js +0 -13
- package/dist/App.w4p2tda9.js +0 -4
- package/dist/App.wv2ng55q.js +0 -221
- package/dist/App.yncnrn0f.js +0 -4
- package/dist/ConnectionsPage.k6cspyqq.js +0 -3
- package/dist/McpPage.cdxm48xj.js +0 -3
- package/dist/SettingsPage.evpv7c2y.js +0 -3
- package/dist/SkillsPage.pvzp6c1a.js +0 -3
- package/dist/TasksPage.6jnvbpsy.js +0 -3
- package/dist/TelemetryPage.t7vk24zc.js +0 -3
- package/dist/TestsPage.5x6658aa.js +0 -3
- package/dist/ThreadsPage.3fvhtevh.js +0 -3
|
@@ -74,7 +74,7 @@ export function IntegrationsTab() {
|
|
|
74
74
|
{providers.length > 1 && (
|
|
75
75
|
<div className="flex items-center gap-2 mb-4">
|
|
76
76
|
<span className="text-xs text-[var(--color-text-muted)]">Provider:</span>
|
|
77
|
-
<div className="flex gap-1 bg-[var(--color-surface)]
|
|
77
|
+
<div className="flex gap-1 bg-[var(--color-surface)] card p-0.5">
|
|
78
78
|
{providers.map(p => (
|
|
79
79
|
<button
|
|
80
80
|
key={p.id}
|
|
@@ -93,7 +93,7 @@ export function IntegrationsTab() {
|
|
|
93
93
|
)}
|
|
94
94
|
|
|
95
95
|
{providers.length === 0 ? (
|
|
96
|
-
<div className="bg-[var(--color-surface)]
|
|
96
|
+
<div className="bg-[var(--color-surface)] card p-8 text-center">
|
|
97
97
|
<p className="text-[var(--color-text-muted)]">No integration providers configured.</p>
|
|
98
98
|
<p className="text-sm text-[var(--color-text-faint)] mt-1">Add API keys for Composio or AgentDojo in Settings.</p>
|
|
99
99
|
</div>
|
|
@@ -133,7 +133,7 @@ export function IntegrationsTab() {
|
|
|
133
133
|
) : (
|
|
134
134
|
<div className="space-y-2">
|
|
135
135
|
{triggerTypes.map(tt => (
|
|
136
|
-
<div key={tt.slug} className="bg-[var(--color-bg)]
|
|
136
|
+
<div key={tt.slug} className="bg-[var(--color-bg)] card p-3">
|
|
137
137
|
<div className="flex items-start gap-3">
|
|
138
138
|
{tt.logo ? (
|
|
139
139
|
<img src={tt.logo} alt={tt.toolkit_name} className="w-6 h-6 rounded object-contain flex-shrink-0 mt-0.5" />
|
|
@@ -75,7 +75,7 @@ export function OverviewTab() {
|
|
|
75
75
|
<section>
|
|
76
76
|
<h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">Subscriptions ({subscriptions.length})</h3>
|
|
77
77
|
{subscriptions.length === 0 ? (
|
|
78
|
-
<div className="bg-[var(--color-surface)]
|
|
78
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
|
|
79
79
|
No subscriptions yet. Go to the Triggers tab to create one.
|
|
80
80
|
</div>
|
|
81
81
|
) : (
|
|
@@ -83,7 +83,7 @@ export function OverviewTab() {
|
|
|
83
83
|
{subscriptions.map(sub => {
|
|
84
84
|
const agent = agentMap.get(sub.agent_id);
|
|
85
85
|
return (
|
|
86
|
-
<div key={sub.id} className="bg-[var(--color-surface)]
|
|
86
|
+
<div key={sub.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
|
|
87
87
|
<div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[var(--color-text-faint)]"}`} />
|
|
88
88
|
<div className="flex-1 min-w-0">
|
|
89
89
|
<div className="text-sm font-medium truncate">
|
|
@@ -127,7 +127,7 @@ function StatCard({
|
|
|
127
127
|
valueColor?: string;
|
|
128
128
|
}) {
|
|
129
129
|
return (
|
|
130
|
-
<div className="bg-[var(--color-surface)]
|
|
130
|
+
<div className="bg-[var(--color-surface)] card p-4">
|
|
131
131
|
<div className="text-xs text-[var(--color-text-muted)] mb-1">{label}</div>
|
|
132
132
|
<div className={`text-2xl font-bold ${valueColor || "text-[var(--color-text)]"}`}>
|
|
133
133
|
{value}
|
|
@@ -594,7 +594,7 @@ export function TriggersTab() {
|
|
|
594
594
|
|
|
595
595
|
if (providers.length === 0 && !triggersLoading) {
|
|
596
596
|
return (
|
|
597
|
-
<div className="bg-[var(--color-surface)]
|
|
597
|
+
<div className="bg-[var(--color-surface)] card p-8 text-center">
|
|
598
598
|
<p className="text-[var(--color-text-muted)]">No trigger providers configured.</p>
|
|
599
599
|
<p className="text-sm text-[var(--color-text-faint)] mt-1">Add API keys for Composio or AgentDojo in Settings to enable triggers.</p>
|
|
600
600
|
</div>
|
|
@@ -615,7 +615,7 @@ export function TriggersTab() {
|
|
|
615
615
|
{providers.length > 1 && (
|
|
616
616
|
<div className="flex items-center gap-2">
|
|
617
617
|
<span className="text-xs text-[var(--color-text-muted)]">Provider:</span>
|
|
618
|
-
<div className="flex gap-1 bg-[var(--color-surface)]
|
|
618
|
+
<div className="flex gap-1 bg-[var(--color-surface)] card p-0.5">
|
|
619
619
|
{providers.map(p => (
|
|
620
620
|
<button
|
|
621
621
|
key={p.id}
|
|
@@ -654,7 +654,7 @@ export function TriggersTab() {
|
|
|
654
654
|
</div>
|
|
655
655
|
|
|
656
656
|
{subscriptions.length === 0 ? (
|
|
657
|
-
<div className="bg-[var(--color-surface)]
|
|
657
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
|
|
658
658
|
No subscriptions yet. Add one to route trigger events to an agent.
|
|
659
659
|
</div>
|
|
660
660
|
) : (
|
|
@@ -662,7 +662,7 @@ export function TriggersTab() {
|
|
|
662
662
|
{subscriptions.map(sub => {
|
|
663
663
|
const agent = agentMap.get(sub.agent_id);
|
|
664
664
|
return (
|
|
665
|
-
<div key={sub.id} className="bg-[var(--color-surface)]
|
|
665
|
+
<div key={sub.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
|
|
666
666
|
<div className={`w-2 h-2 rounded-full flex-shrink-0 ${sub.enabled ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
|
|
667
667
|
<div className="flex-1 min-w-0">
|
|
668
668
|
<div className="text-sm font-medium truncate">
|
|
@@ -712,13 +712,13 @@ export function TriggersTab() {
|
|
|
712
712
|
{triggersLoading ? (
|
|
713
713
|
<div className="text-center py-6 text-[var(--color-text-muted)] text-sm">Loading triggers...</div>
|
|
714
714
|
) : triggers.length === 0 ? (
|
|
715
|
-
<div className="bg-[var(--color-surface)]
|
|
715
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
|
|
716
716
|
No trigger instances. Browse trigger types below to create one.
|
|
717
717
|
</div>
|
|
718
718
|
) : (
|
|
719
719
|
<div className="space-y-2">
|
|
720
720
|
{triggers.map(trigger => (
|
|
721
|
-
<div key={trigger.id} className="bg-[var(--color-surface)]
|
|
721
|
+
<div key={trigger.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
|
|
722
722
|
<div className={`w-2 h-2 rounded-full flex-shrink-0 ${trigger.status === "active" ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
|
|
723
723
|
<div className="flex-1 min-w-0">
|
|
724
724
|
<div className="text-sm font-medium truncate">
|
|
@@ -770,7 +770,7 @@ export function TriggersTab() {
|
|
|
770
770
|
{triggersLoading ? (
|
|
771
771
|
<div className="text-center py-6 text-[var(--color-text-muted)] text-sm">Loading subscriptions...</div>
|
|
772
772
|
) : triggers.length === 0 ? (
|
|
773
|
-
<div className="bg-[var(--color-surface)]
|
|
773
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center text-[var(--color-text-muted)] text-sm">
|
|
774
774
|
No active subscriptions. Browse trigger types below to create one.
|
|
775
775
|
</div>
|
|
776
776
|
) : (
|
|
@@ -779,7 +779,7 @@ export function TriggersTab() {
|
|
|
779
779
|
const localSub = subscriptions.find(s => s.trigger_instance_id === trigger.id);
|
|
780
780
|
const agent = localSub ? agentMap.get(localSub.agent_id) : null;
|
|
781
781
|
return (
|
|
782
|
-
<div key={trigger.id} className="bg-[var(--color-surface)]
|
|
782
|
+
<div key={trigger.id} className="bg-[var(--color-surface)] card p-3 flex items-center gap-3">
|
|
783
783
|
<div className={`w-2 h-2 rounded-full flex-shrink-0 ${trigger.status === "active" ? "bg-green-400" : "bg-[var(--color-text-muted)]"}`} />
|
|
784
784
|
<div className="flex-1 min-w-0">
|
|
785
785
|
<div className="text-sm font-medium truncate">
|
|
@@ -454,12 +454,12 @@ function QuickMessageModal({ agent, onClose }: { agent: Agent; onClose: () => vo
|
|
|
454
454
|
onKeyDown={e => e.key === "Enter" && handleSend()}
|
|
455
455
|
placeholder={`Message ${agent.name}...`}
|
|
456
456
|
disabled={sending}
|
|
457
|
-
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)]
|
|
457
|
+
className="flex-1 bg-[var(--color-bg)] border border-[var(--color-border-light)] btn px-3 py-2.5 text-sm focus:outline-none focus:border-[var(--color-accent)] placeholder-[#444] disabled:opacity-50"
|
|
458
458
|
/>
|
|
459
459
|
<button
|
|
460
460
|
onClick={handleSend}
|
|
461
461
|
disabled={sending || !message.trim()}
|
|
462
|
-
className="px-4 py-2.5 bg-[var(--color-accent)] text-black
|
|
462
|
+
className="px-4 py-2.5 bg-[var(--color-accent)] text-black btn text-sm font-medium hover:bg-[var(--color-accent-hover)] transition disabled:opacity-30"
|
|
463
463
|
>
|
|
464
464
|
{sending ? "..." : "Send"}
|
|
465
465
|
</button>
|
|
@@ -161,7 +161,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
|
|
|
161
161
|
<div className="relative ml-2 md:ml-4">
|
|
162
162
|
<button
|
|
163
163
|
onClick={() => setShowProjectMenu(!showProjectMenu)}
|
|
164
|
-
className="flex items-center gap-2 px-3 py-1.5
|
|
164
|
+
className="flex items-center gap-2 px-3 py-1.5 btn transition text-sm"
|
|
165
165
|
style={{ border: "1px solid var(--color-border-light)", backgroundColor: "var(--color-surface)" }}
|
|
166
166
|
>
|
|
167
167
|
<span
|
|
@@ -174,7 +174,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
|
|
|
174
174
|
<ChevronDownIcon />
|
|
175
175
|
</button>
|
|
176
176
|
{showProjectMenu && (
|
|
177
|
-
<div className="absolute left-0 top-full mt-1 w-56
|
|
177
|
+
<div className="absolute left-0 top-full mt-1 w-56 card shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)" }}>
|
|
178
178
|
<div className="py-1 max-h-64 overflow-y-auto">
|
|
179
179
|
<button
|
|
180
180
|
onClick={() => handleProjectSelect(null)}
|
|
@@ -262,7 +262,7 @@ export function Header({ onMenuClick, agents = [] }: HeaderProps) {
|
|
|
262
262
|
{showNotifications && (
|
|
263
263
|
<>
|
|
264
264
|
<div className="fixed inset-0 z-40" onClick={() => setShowNotifications(false)} />
|
|
265
|
-
<div className="absolute right-0 top-full mt-1 w-80
|
|
265
|
+
<div className="absolute right-0 top-full mt-1 w-80 card shadow-xl z-50 max-h-96 overflow-y-auto" style={{ backgroundColor: "var(--color-surface)" }}>
|
|
266
266
|
<div className="px-4 py-3 flex items-center justify-between" style={{ borderBottom: "1px solid var(--color-border-light)" }}>
|
|
267
267
|
<span className="text-sm font-medium">Notifications</span>
|
|
268
268
|
{notifications.length > 0 && (
|
|
@@ -158,7 +158,7 @@ export function Sidebar({ route, agentCount, taskCount, onNavigate, isOpen, onCl
|
|
|
158
158
|
{showUserMenu && (
|
|
159
159
|
<>
|
|
160
160
|
<div className="fixed inset-0 z-40" onClick={() => setShowUserMenu(false)} />
|
|
161
|
-
<div className="absolute left-3 bottom-full mb-1 w-48
|
|
161
|
+
<div className="absolute left-3 bottom-full mb-1 w-48 card shadow-xl z-50" style={{ backgroundColor: "var(--color-surface)" }}>
|
|
162
162
|
<button
|
|
163
163
|
onClick={handleLogout}
|
|
164
164
|
className="w-full px-4 py-2.5 text-left text-sm text-red-400 transition rounded-lg"
|
|
@@ -189,8 +189,9 @@ function NavButton({ icon, label, active, onClick, badge }: NavButtonProps) {
|
|
|
189
189
|
return (
|
|
190
190
|
<button
|
|
191
191
|
onClick={onClick}
|
|
192
|
-
className="w-full flex items-center gap-3 px-3 py-2
|
|
192
|
+
className="w-full flex items-center gap-3 px-3 py-2 font-medium transition"
|
|
193
193
|
style={{
|
|
194
|
+
borderRadius: "var(--radius-button)",
|
|
194
195
|
backgroundColor: active ? "var(--color-surface)" : "transparent",
|
|
195
196
|
color: active ? "var(--color-text)" : "var(--color-text-muted)",
|
|
196
197
|
}}
|
|
@@ -156,7 +156,7 @@ export function McpPage() {
|
|
|
156
156
|
</div>
|
|
157
157
|
|
|
158
158
|
{/* Tabs */}
|
|
159
|
-
<div className="flex gap-1 mb-6 bg-[var(--color-surface)]
|
|
159
|
+
<div className="flex gap-1 mb-6 bg-[var(--color-surface)] card p-1 w-fit">
|
|
160
160
|
<button
|
|
161
161
|
onClick={() => setActiveTab("servers")}
|
|
162
162
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
@@ -199,7 +199,7 @@ export function McpPage() {
|
|
|
199
199
|
|
|
200
200
|
{/* Empty State */}
|
|
201
201
|
{!loading && filteredServers.length === 0 && servers.length === 0 && (
|
|
202
|
-
<div className="bg-[var(--color-surface)]
|
|
202
|
+
<div className="bg-[var(--color-surface)] card p-8 text-center">
|
|
203
203
|
<McpIcon className="w-12 h-12 text-[var(--color-border-light)] mx-auto mb-4" />
|
|
204
204
|
<h3 className="text-lg font-medium mb-2">No MCP servers configured</h3>
|
|
205
205
|
<p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
|
|
@@ -225,7 +225,7 @@ export function McpPage() {
|
|
|
225
225
|
|
|
226
226
|
{/* Empty filter state */}
|
|
227
227
|
{!loading && filteredServers.length === 0 && servers.length > 0 && (
|
|
228
|
-
<div className="bg-[var(--color-surface)]
|
|
228
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center">
|
|
229
229
|
<p className="text-[var(--color-text-muted)]">No servers match this filter.</p>
|
|
230
230
|
</div>
|
|
231
231
|
)}
|
|
@@ -298,7 +298,7 @@ export function McpPage() {
|
|
|
298
298
|
|
|
299
299
|
{/* Info - only show on servers tab */}
|
|
300
300
|
{activeTab === "servers" && (
|
|
301
|
-
<div className="mt-8 p-4 bg-[var(--color-surface)]
|
|
301
|
+
<div className="mt-8 p-4 bg-[var(--color-surface)] card">
|
|
302
302
|
<h3 className="font-medium mb-2">Quick Start</h3>
|
|
303
303
|
<p className="text-sm text-[var(--color-text-muted)] mb-3">
|
|
304
304
|
Add an MCP server by providing its npm package name. For example:
|
|
@@ -523,7 +523,7 @@ function ToolsPanel({
|
|
|
523
523
|
}, [server.id, authFetch]);
|
|
524
524
|
|
|
525
525
|
return (
|
|
526
|
-
<div className="bg-[var(--color-surface)]
|
|
526
|
+
<div className="bg-[var(--color-surface)] card overflow-hidden">
|
|
527
527
|
{/* Header */}
|
|
528
528
|
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between">
|
|
529
529
|
<div>
|
|
@@ -859,7 +859,7 @@ function RegistryBrowser({
|
|
|
859
859
|
{servers.map((server) => (
|
|
860
860
|
<div
|
|
861
861
|
key={server.id}
|
|
862
|
-
className="bg-[var(--color-surface)]
|
|
862
|
+
className="bg-[var(--color-surface)] card p-4 hover:border-[var(--color-border-light)] transition"
|
|
863
863
|
>
|
|
864
864
|
<div className="flex items-start justify-between gap-3">
|
|
865
865
|
<div className="flex-1 min-w-0">
|
|
@@ -913,7 +913,7 @@ function RegistryBrowser({
|
|
|
913
913
|
)}
|
|
914
914
|
|
|
915
915
|
{/* Registry info */}
|
|
916
|
-
<div className="p-4 bg-[var(--color-surface)]
|
|
916
|
+
<div className="p-4 bg-[var(--color-surface)] card text-sm text-[var(--color-text-muted)]">
|
|
917
917
|
<p>
|
|
918
918
|
Servers are sourced from the{" "}
|
|
919
919
|
<a
|
|
@@ -1060,7 +1060,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1060
1060
|
|
|
1061
1061
|
if (!hasAnyConnection) {
|
|
1062
1062
|
return (
|
|
1063
|
-
<div className="bg-[var(--color-surface)]
|
|
1063
|
+
<div className="bg-[var(--color-surface)] card p-8 text-center">
|
|
1064
1064
|
<p className="text-[var(--color-text-secondary)] mb-2">No hosted MCP services connected</p>
|
|
1065
1065
|
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
1066
1066
|
Connect Composio, Smithery, or AgentDojo in Settings to access cloud-based MCP servers.
|
|
@@ -1206,7 +1206,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1206
1206
|
{loadingConfigs ? (
|
|
1207
1207
|
<div className="text-center py-6 text-[var(--color-text-muted)]">Loading configs...</div>
|
|
1208
1208
|
) : composioConfigs.length === 0 ? (
|
|
1209
|
-
<div className="bg-[var(--color-surface)]
|
|
1209
|
+
<div className="bg-[var(--color-surface)] card p-4 text-center">
|
|
1210
1210
|
<p className="text-sm text-[var(--color-text-muted)]">No MCP configs found</p>
|
|
1211
1211
|
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
1212
1212
|
First <button onClick={() => setSubTab("connect")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">connect some apps</button>, then create a config.
|
|
@@ -1310,7 +1310,7 @@ function HostedServices({ onServerAdded, projectId }: { onServerAdded?: () => vo
|
|
|
1310
1310
|
Browse Smithery →
|
|
1311
1311
|
</a>
|
|
1312
1312
|
</div>
|
|
1313
|
-
<div className="bg-[var(--color-surface)]
|
|
1313
|
+
<div className="bg-[var(--color-surface)] card p-4 text-center">
|
|
1314
1314
|
<p className="text-sm text-[var(--color-text-muted)]">
|
|
1315
1315
|
Smithery servers can be added from the <strong>Browse Registry</strong> tab.
|
|
1316
1316
|
</p>
|
|
@@ -1498,7 +1498,7 @@ function AgentDojoContent({
|
|
|
1498
1498
|
{loadingConfigs ? (
|
|
1499
1499
|
<div className="text-center py-6 text-[var(--color-text-muted)]">Loading servers...</div>
|
|
1500
1500
|
) : configs.length === 0 ? (
|
|
1501
|
-
<div className="bg-[var(--color-surface)]
|
|
1501
|
+
<div className="bg-[var(--color-surface)] card p-4 text-center">
|
|
1502
1502
|
<p className="text-sm text-[var(--color-text-muted)]">No MCP servers found</p>
|
|
1503
1503
|
<p className="text-xs text-[var(--color-text-faint)] mt-2">
|
|
1504
1504
|
<button onClick={() => setSubTab("toolkits")} className="text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]">
|
|
@@ -1845,7 +1845,7 @@ function AddServerModal({
|
|
|
1845
1845
|
|
|
1846
1846
|
return (
|
|
1847
1847
|
<div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
|
|
1848
|
-
<div className="bg-[var(--color-surface)]
|
|
1848
|
+
<div className="bg-[var(--color-surface)] card w-full max-w-lg max-h-[90vh] overflow-y-auto">
|
|
1849
1849
|
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
|
|
1850
1850
|
<h2 className="text-lg font-semibold">Add MCP Server</h2>
|
|
1851
1851
|
<button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
|
|
@@ -2303,7 +2303,7 @@ function EditServerModal({
|
|
|
2303
2303
|
|
|
2304
2304
|
return (
|
|
2305
2305
|
<div className="fixed inset-0 bg-black/50 backdrop-blur-[2px] z-50 flex items-center justify-center p-4">
|
|
2306
|
-
<div className="bg-[var(--color-surface)]
|
|
2306
|
+
<div className="bg-[var(--color-surface)] card w-full max-w-lg max-h-[90vh] overflow-y-auto">
|
|
2307
2307
|
<div className="p-4 border-b border-[var(--color-border)] flex items-center justify-between sticky top-0 bg-[var(--color-surface)]">
|
|
2308
2308
|
<h2 className="text-lg font-semibold">Edit MCP Server</h2>
|
|
2309
2309
|
<button onClick={onClose} className="text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]">
|
|
@@ -125,7 +125,7 @@ export function OnboardingWizard({ onComplete, needsAccount = false }: Onboardin
|
|
|
125
125
|
const currentStep = needsAccount ? step : step - 1;
|
|
126
126
|
|
|
127
127
|
return (
|
|
128
|
-
<div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)]
|
|
128
|
+
<div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center p-8">
|
|
129
129
|
<div className="w-full max-w-2xl">
|
|
130
130
|
{/* Logo */}
|
|
131
131
|
<div className="text-center mb-8">
|
|
@@ -149,7 +149,7 @@ export function OnboardingWizard({ onComplete, needsAccount = false }: Onboardin
|
|
|
149
149
|
<div className={`w-3 h-3 rounded-full ${step >= 2 ? 'bg-[var(--color-accent)]' : 'bg-[var(--color-surface-raised)]'}`} />
|
|
150
150
|
</div>
|
|
151
151
|
|
|
152
|
-
<div className="bg-[var(--color-surface)]
|
|
152
|
+
<div className="bg-[var(--color-surface)] card p-8">
|
|
153
153
|
{step === 0 && needsAccount && (
|
|
154
154
|
<CreateAccountStep onComplete={handleAccountCreated} />
|
|
155
155
|
)}
|
|
@@ -3,7 +3,7 @@ import { CheckIcon, CloseIcon, PlusIcon } from "../common/Icons";
|
|
|
3
3
|
import { Modal, useConfirm } from "../common/Modal";
|
|
4
4
|
import { Select } from "../common/Select";
|
|
5
5
|
import { useProjects, useAuth, useTheme, type Project } from "../../context";
|
|
6
|
-
import type { ThemeMode } from "../../themes";
|
|
6
|
+
import type { ThemeMode, ThemeStyle } from "../../themes";
|
|
7
7
|
import type { Provider } from "../../types";
|
|
8
8
|
|
|
9
9
|
type SettingsTab = "general" | "providers" | "projects" | "channels" | "api-keys" | "account" | "updates" | "data" | "assistant";
|
|
@@ -101,7 +101,7 @@ function SettingsNavItem({
|
|
|
101
101
|
|
|
102
102
|
function GeneralSettings() {
|
|
103
103
|
const { authFetch } = useAuth();
|
|
104
|
-
const { mode, setMode } = useTheme();
|
|
104
|
+
const { mode, style, setMode, setStyle } = useTheme();
|
|
105
105
|
const [instanceUrl, setInstanceUrl] = useState("");
|
|
106
106
|
const [loading, setLoading] = useState(true);
|
|
107
107
|
const [saving, setSaving] = useState(false);
|
|
@@ -149,6 +149,11 @@ function GeneralSettings() {
|
|
|
149
149
|
{ value: "light", label: "Light", description: "Light background" },
|
|
150
150
|
];
|
|
151
151
|
|
|
152
|
+
const styleOptions: { value: ThemeStyle; label: string; description: string }[] = [
|
|
153
|
+
{ value: "classic", label: "Classic", description: "Terminal-inspired, sharp" },
|
|
154
|
+
{ value: "professional", label: "Professional", description: "Polished, enterprise" },
|
|
155
|
+
];
|
|
156
|
+
|
|
152
157
|
return (
|
|
153
158
|
<div className="max-w-4xl w-full">
|
|
154
159
|
<div className="mb-6">
|
|
@@ -156,22 +161,23 @@ function GeneralSettings() {
|
|
|
156
161
|
<p className="text-[var(--color-text-muted)]">Instance configuration and appearance.</p>
|
|
157
162
|
</div>
|
|
158
163
|
|
|
159
|
-
{/*
|
|
160
|
-
<div className="bg-[var(--color-surface)]
|
|
161
|
-
<h3 className="font-medium mb-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
</p>
|
|
165
|
-
<div className="flex gap-3">
|
|
164
|
+
{/* Appearance */}
|
|
165
|
+
<div className="bg-[var(--color-surface)] card p-4 mb-4">
|
|
166
|
+
<h3 className="font-medium mb-4">Appearance</h3>
|
|
167
|
+
|
|
168
|
+
{/* Color scheme */}
|
|
169
|
+
<p className="text-sm text-[var(--color-text-secondary)] mb-2">Color scheme</p>
|
|
170
|
+
<div className="flex gap-3 mb-5">
|
|
166
171
|
{themeOptions.map(opt => (
|
|
167
172
|
<button
|
|
168
173
|
key={opt.value}
|
|
169
174
|
onClick={() => setMode(opt.value)}
|
|
170
|
-
className={`flex-1 max-w-[160px] px-4 py-3
|
|
175
|
+
className={`flex-1 max-w-[160px] px-4 py-3 border text-left transition ${
|
|
171
176
|
mode === opt.value
|
|
172
177
|
? "border-[var(--color-accent)] bg-[var(--color-accent-10)]"
|
|
173
178
|
: "border-[var(--color-border-light)] bg-[var(--color-bg)] hover:border-[var(--color-scrollbar)]"
|
|
174
179
|
}`}
|
|
180
|
+
style={{ borderRadius: "var(--radius-card)" }}
|
|
175
181
|
>
|
|
176
182
|
<div className="flex items-center gap-2 mb-1">
|
|
177
183
|
<div className={`w-4 h-4 rounded-full border-2 flex items-center justify-center ${
|
|
@@ -185,9 +191,36 @@ function GeneralSettings() {
|
|
|
185
191
|
</button>
|
|
186
192
|
))}
|
|
187
193
|
</div>
|
|
194
|
+
|
|
195
|
+
{/* Style */}
|
|
196
|
+
<p className="text-sm text-[var(--color-text-secondary)] mb-2">Style</p>
|
|
197
|
+
<div className="flex gap-3">
|
|
198
|
+
{styleOptions.map(opt => (
|
|
199
|
+
<button
|
|
200
|
+
key={opt.value}
|
|
201
|
+
onClick={() => setStyle(opt.value)}
|
|
202
|
+
className={`flex-1 max-w-[200px] px-4 py-3 border text-left transition ${
|
|
203
|
+
style === opt.value
|
|
204
|
+
? "border-[var(--color-accent)] bg-[var(--color-accent-10)]"
|
|
205
|
+
: "border-[var(--color-border-light)] bg-[var(--color-bg)] hover:border-[var(--color-scrollbar)]"
|
|
206
|
+
}`}
|
|
207
|
+
style={{ borderRadius: "var(--radius-card)" }}
|
|
208
|
+
>
|
|
209
|
+
<div className="flex items-center gap-2 mb-1">
|
|
210
|
+
<div className={`w-4 h-4 rounded-full border-2 flex items-center justify-center ${
|
|
211
|
+
style === opt.value ? "border-[var(--color-accent)]" : "border-[var(--color-scrollbar)]"
|
|
212
|
+
}`}>
|
|
213
|
+
{style === opt.value && <div className="w-2 h-2 rounded-full bg-[var(--color-accent)]" />}
|
|
214
|
+
</div>
|
|
215
|
+
<span className="text-sm font-medium">{opt.label}</span>
|
|
216
|
+
</div>
|
|
217
|
+
<p className="text-xs text-[var(--color-text-muted)] ml-6">{opt.description}</p>
|
|
218
|
+
</button>
|
|
219
|
+
))}
|
|
220
|
+
</div>
|
|
188
221
|
</div>
|
|
189
222
|
|
|
190
|
-
<div className="bg-[var(--color-surface)]
|
|
223
|
+
<div className="bg-[var(--color-surface)] card p-4">
|
|
191
224
|
<h3 className="font-medium mb-2">Instance URL</h3>
|
|
192
225
|
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
193
226
|
The public HTTPS URL for this instance. Used for webhook callbacks from external services like Composio.
|
|
@@ -548,7 +581,7 @@ function ProjectsSettings() {
|
|
|
548
581
|
{projects.map(project => (
|
|
549
582
|
<div
|
|
550
583
|
key={project.id}
|
|
551
|
-
className="bg-[var(--color-surface)]
|
|
584
|
+
className="bg-[var(--color-surface)] card p-4 flex items-center gap-4"
|
|
552
585
|
>
|
|
553
586
|
<div
|
|
554
587
|
className="w-4 h-4 rounded-full flex-shrink-0"
|
|
@@ -818,7 +851,7 @@ function UpdatesSettings() {
|
|
|
818
851
|
</div>
|
|
819
852
|
|
|
820
853
|
{/* Current Version */}
|
|
821
|
-
<div className="bg-[var(--color-surface)]
|
|
854
|
+
<div className="bg-[var(--color-surface)] card p-5">
|
|
822
855
|
<div className="flex items-center justify-between mb-4">
|
|
823
856
|
<div>
|
|
824
857
|
<h3 className="font-medium text-lg">Current Version</h3>
|
|
@@ -881,7 +914,7 @@ function UpdatesSettings() {
|
|
|
881
914
|
)}
|
|
882
915
|
|
|
883
916
|
{/* Apteva App Version */}
|
|
884
|
-
<div className="bg-[var(--color-surface)]
|
|
917
|
+
<div className="bg-[var(--color-surface)] card p-5">
|
|
885
918
|
<div className="flex items-center justify-between mb-4">
|
|
886
919
|
<div>
|
|
887
920
|
<h3 className="font-medium text-lg">apteva</h3>
|
|
@@ -921,7 +954,7 @@ function UpdatesSettings() {
|
|
|
921
954
|
</div>
|
|
922
955
|
|
|
923
956
|
{/* Agent Binary Version */}
|
|
924
|
-
<div className="bg-[var(--color-surface)]
|
|
957
|
+
<div className="bg-[var(--color-surface)] card p-5">
|
|
925
958
|
<div className="flex items-center justify-between mb-4">
|
|
926
959
|
<div>
|
|
927
960
|
<h3 className="font-medium text-lg">Agent Binary</h3>
|
|
@@ -1783,7 +1816,7 @@ function ApiKeysSettings() {
|
|
|
1783
1816
|
|
|
1784
1817
|
{/* Create Form */}
|
|
1785
1818
|
{showCreate && !newKey && (
|
|
1786
|
-
<div className="bg-[var(--color-surface)]
|
|
1819
|
+
<div className="bg-[var(--color-surface)] card p-4 mb-6">
|
|
1787
1820
|
<h3 className="font-medium mb-4">Create new API key</h3>
|
|
1788
1821
|
<div className="space-y-4 max-w-md">
|
|
1789
1822
|
<div>
|
|
@@ -1880,7 +1913,7 @@ function ApiKeysSettings() {
|
|
|
1880
1913
|
|
|
1881
1914
|
{/* Usage Info */}
|
|
1882
1915
|
{keys.length > 0 && (
|
|
1883
|
-
<div className="mt-6 bg-[var(--color-surface)]
|
|
1916
|
+
<div className="mt-6 bg-[var(--color-surface)] card p-4">
|
|
1884
1917
|
<h3 className="font-medium mb-2 text-sm">Usage</h3>
|
|
1885
1918
|
<code className="block bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-xs text-[var(--color-text-secondary)]">
|
|
1886
1919
|
curl -H "X-API-Key: apt_..." http://localhost:4280/api/agents
|
|
@@ -1953,7 +1986,7 @@ function AccountSettings() {
|
|
|
1953
1986
|
|
|
1954
1987
|
{/* User Info */}
|
|
1955
1988
|
{user && (
|
|
1956
|
-
<div className="bg-[var(--color-surface)]
|
|
1989
|
+
<div className="bg-[var(--color-surface)] card p-4 mb-6">
|
|
1957
1990
|
<h3 className="font-medium mb-3">Profile</h3>
|
|
1958
1991
|
<div className="space-y-2 text-sm">
|
|
1959
1992
|
<div className="flex justify-between">
|
|
@@ -1975,7 +2008,7 @@ function AccountSettings() {
|
|
|
1975
2008
|
)}
|
|
1976
2009
|
|
|
1977
2010
|
{/* Change Password */}
|
|
1978
|
-
<div className="bg-[var(--color-surface)]
|
|
2011
|
+
<div className="bg-[var(--color-surface)] card p-4">
|
|
1979
2012
|
<h3 className="font-medium mb-4">Change Password</h3>
|
|
1980
2013
|
|
|
1981
2014
|
<div className="space-y-4 max-w-md">
|
|
@@ -2086,7 +2119,7 @@ function DataSettings() {
|
|
|
2086
2119
|
<p className="text-[var(--color-text-muted)]">Manage stored data and telemetry.</p>
|
|
2087
2120
|
</div>
|
|
2088
2121
|
|
|
2089
|
-
<div className="bg-[var(--color-surface)]
|
|
2122
|
+
<div className="bg-[var(--color-surface)] card p-4">
|
|
2090
2123
|
<h3 className="font-medium mb-2">Telemetry Data</h3>
|
|
2091
2124
|
<p className="text-sm text-[var(--color-text-muted)] mb-4">
|
|
2092
2125
|
{eventCount !== null
|
|
@@ -2272,7 +2305,7 @@ function ChannelsSettings() {
|
|
|
2272
2305
|
|
|
2273
2306
|
{/* Create form */}
|
|
2274
2307
|
{showForm && (
|
|
2275
|
-
<div className="mb-6 bg-[var(--color-surface)]
|
|
2308
|
+
<div className="mb-6 bg-[var(--color-surface)] card p-4 space-y-3">
|
|
2276
2309
|
<h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-2">New Telegram Channel</h3>
|
|
2277
2310
|
|
|
2278
2311
|
<div>
|
|
@@ -2339,7 +2372,7 @@ function ChannelsSettings() {
|
|
|
2339
2372
|
) : (
|
|
2340
2373
|
<div className="space-y-3">
|
|
2341
2374
|
{channels.map(channel => (
|
|
2342
|
-
<div key={channel.id} className="bg-[var(--color-surface)]
|
|
2375
|
+
<div key={channel.id} className="bg-[var(--color-surface)] card p-4">
|
|
2343
2376
|
<div className="flex items-start justify-between">
|
|
2344
2377
|
<div className="flex-1 min-w-0">
|
|
2345
2378
|
<div className="flex items-center gap-2 mb-1">
|
|
@@ -316,7 +316,7 @@ export function SkillsPage() {
|
|
|
316
316
|
</div>
|
|
317
317
|
|
|
318
318
|
{/* Tabs */}
|
|
319
|
-
<div className="flex gap-1 mb-6 bg-[var(--color-surface)]
|
|
319
|
+
<div className="flex gap-1 mb-6 bg-[var(--color-surface)] card 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 ${
|
|
@@ -366,7 +366,7 @@ export function SkillsPage() {
|
|
|
366
366
|
</button>
|
|
367
367
|
</div>
|
|
368
368
|
) : filteredSkills.length === 0 ? (
|
|
369
|
-
<div className="bg-[var(--color-surface)]
|
|
369
|
+
<div className="bg-[var(--color-surface)] card p-6 text-center">
|
|
370
370
|
<p className="text-[var(--color-text-muted)]">No skills match this filter.</p>
|
|
371
371
|
</div>
|
|
372
372
|
) : (
|
|
@@ -478,7 +478,7 @@ export function SkillsPage() {
|
|
|
478
478
|
|
|
479
479
|
{/* Empty State */}
|
|
480
480
|
{!githubLoading && !githubRepoInfo && !githubError && (
|
|
481
|
-
<div className="bg-[var(--color-surface)]
|
|
481
|
+
<div className="bg-[var(--color-surface)] card 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
484
|
<p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
|
|
@@ -563,7 +563,7 @@ export function SkillsPage() {
|
|
|
563
563
|
)}
|
|
564
564
|
|
|
565
565
|
{/* Info */}
|
|
566
|
-
<div className="p-4 bg-[var(--color-surface)]
|
|
566
|
+
<div className="p-4 bg-[var(--color-surface)] card 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
569
|
<code className="text-[var(--color-text-secondary)] bg-[var(--color-bg)] px-1 rounded">SKILL.md</code> file containing instructions.
|
|
@@ -895,7 +895,7 @@ 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-[var(--color-surface)]
|
|
898
|
+
className="bg-[var(--color-surface)] card w-full max-w-2xl max-h-[90vh] overflow-auto"
|
|
899
899
|
onClick={(e) => e.stopPropagation()}
|
|
900
900
|
>
|
|
901
901
|
<div className="p-6 border-b border-[var(--color-border)]">
|
|
@@ -1029,7 +1029,7 @@ 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-[var(--color-surface)]
|
|
1032
|
+
className="bg-[var(--color-surface)] card w-full max-w-2xl max-h-[90vh] overflow-auto"
|
|
1033
1033
|
onClick={(e) => e.stopPropagation()}
|
|
1034
1034
|
>
|
|
1035
1035
|
<div className="p-6 border-b border-[var(--color-border)]">
|
|
@@ -1129,7 +1129,7 @@ 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-[var(--color-surface)]
|
|
1132
|
+
className="bg-[var(--color-surface)] card w-full max-w-3xl max-h-[90vh] overflow-auto"
|
|
1133
1133
|
onClick={(e) => e.stopPropagation()}
|
|
1134
1134
|
>
|
|
1135
1135
|
<div className="p-6 border-b border-[var(--color-border)] flex items-center justify-between">
|