apteva 0.4.41 → 0.4.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActivityPage.c48n83h2.js +3 -0
- package/dist/ApiDocsPage.yzcxx5ax.js +4 -0
- package/dist/App.09yb8t0b.js +1 -0
- package/dist/App.152mbs1r.js +4 -0
- package/dist/App.3a67nx9w.js +4 -0
- package/dist/App.9epx6785.js +4 -0
- package/dist/App.d8955awp.js +4 -0
- package/dist/App.drwb57jq.js +4 -0
- package/dist/App.gssbmajb.js +4 -0
- package/dist/App.qw70pc29.js +53 -0
- package/dist/{App.7fb3e7mp.js → App.qzbx5wtj.js} +1 -1
- package/dist/App.r5serxkt.js +8 -0
- package/dist/App.tpmp9020.js +20 -0
- package/dist/App.v2wb4d7d.js +61 -0
- package/dist/App.vxmaaj0m.js +13 -0
- package/dist/App.w4p2tda9.js +4 -0
- package/dist/App.wv2ng55q.js +221 -0
- package/dist/App.yncnrn0f.js +4 -0
- package/dist/ConnectionsPage.k6cspyqq.js +3 -0
- package/dist/McpPage.cdxm48xj.js +3 -0
- package/dist/SettingsPage.evpv7c2y.js +3 -0
- package/dist/SkillsPage.pvzp6c1a.js +3 -0
- package/dist/TasksPage.6jnvbpsy.js +3 -0
- package/dist/TelemetryPage.t7vk24zc.js +3 -0
- package/dist/TestsPage.5x6658aa.js +3 -0
- package/dist/ThreadsPage.3fvhtevh.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 +8 -8
- package/src/db.ts +19 -9
- package/src/integrations/agentdojo.ts +1 -0
- package/src/mcp-platform.ts +418 -63
- package/src/openapi.ts +96 -0
- package/src/providers.ts +50 -24
- package/src/routes/api/agent-utils.ts +0 -1
- package/src/routes/api/agents.ts +19 -1
- package/src/routes/api/meta-agent.ts +2 -0
- package/src/routes/api/system.ts +90 -1
- package/src/routes/api/telemetry.ts +19 -1
- package/src/routes/share.ts +85 -0
- package/src/server.ts +12 -0
- package/src/web/App.tsx +89 -11
- package/src/web/components/activity/ActivityPage.tsx +14 -14
- package/src/web/components/agents/AgentCard.tsx +14 -14
- package/src/web/components/agents/AgentPanel.tsx +358 -198
- package/src/web/components/agents/AgentsView.tsx +4 -4
- package/src/web/components/agents/CreateAgentModal.tsx +21 -79
- package/src/web/components/api/ApiDocsPage.tsx +66 -66
- package/src/web/components/auth/CreateAccountStep.tsx +16 -16
- package/src/web/components/auth/LoginPage.tsx +10 -10
- package/src/web/components/common/LoadingSpinner.tsx +2 -2
- package/src/web/components/common/Modal.tsx +8 -8
- package/src/web/components/common/Select.tsx +9 -9
- package/src/web/components/connections/ConnectionsPage.tsx +4 -4
- package/src/web/components/connections/IntegrationsTab.tsx +18 -18
- package/src/web/components/connections/OverviewTab.tsx +13 -13
- package/src/web/components/connections/TriggersTab.tsx +99 -99
- package/src/web/components/dashboard/Dashboard.tsx +32 -32
- package/src/web/components/layout/Header.tsx +50 -34
- package/src/web/components/layout/Sidebar.tsx +34 -15
- package/src/web/components/mcp/IntegrationsPanel.tsx +40 -40
- package/src/web/components/mcp/McpPage.tsx +208 -208
- package/src/web/components/meta-agent/MetaAgent.tsx +12 -10
- package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
- package/src/web/components/settings/SettingsPage.tsx +258 -175
- package/src/web/components/skills/SkillsPage.tsx +88 -88
- package/src/web/components/tasks/TasksPage.tsx +339 -54
- package/src/web/components/telemetry/TelemetryPage.tsx +135 -64
- package/src/web/components/tests/TestsPage.tsx +50 -50
- package/src/web/components/threads/ThreadsPage.tsx +23 -21
- package/src/web/context/ProjectContext.tsx +6 -1
- package/src/web/context/ThemeContext.tsx +69 -0
- package/src/web/context/index.ts +2 -0
- package/src/web/styles.css +5 -3
- package/src/web/themes.ts +99 -0
- package/src/web/types.ts +0 -4
- package/dist/ActivityPage.7907h64p.js +0 -3
- package/dist/ApiDocsPage.k3jjenpq.js +0 -4
- package/dist/App.01nq20st.js +0 -4
- package/dist/App.1maqvamf.js +0 -4
- package/dist/App.2yjrh32f.js +0 -4
- package/dist/App.3qw8nben.js +0 -20
- package/dist/App.7sy3wq8c.js +0 -4
- package/dist/App.apjrmctz.js +0 -57
- package/dist/App.av6t2yhe.js +0 -4
- package/dist/App.jqj5a094.js +0 -46
- package/dist/App.mc7xf85h.js +0 -4
- package/dist/App.myxqcj9x.js +0 -4
- package/dist/App.nm91r1mp.js +0 -13
- package/dist/App.p02f4ret.js +0 -1
- package/dist/App.qcknavjz.js +0 -221
- package/dist/App.vc7vfhg4.js +0 -4
- package/dist/App.z4s9zkw5.js +0 -4
- package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
- package/dist/McpPage.8vc97z0b.js +0 -3
- package/dist/SettingsPage.p61bz8kd.js +0 -3
- package/dist/SkillsPage.r9x43g3g.js +0 -3
- package/dist/TasksPage.1e0zkye4.js +0 -3
- package/dist/TelemetryPage.p9vbe4gf.js +0 -3
- package/dist/TestsPage.d4xy504e.js +0 -3
- package/dist/ThreadsPage.m016am3x.js +0 -3
package/src/web/App.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState, useEffect, useMemo, lazy, Suspense } from "react";
|
|
2
2
|
import { createRoot } from "react-dom/client";
|
|
3
|
+
import { Chat } from "@apteva/apteva-kit";
|
|
3
4
|
import "@apteva/apteva-kit/styles.css";
|
|
4
5
|
|
|
5
6
|
// Types
|
|
@@ -7,7 +8,7 @@ import type { Agent, Provider, Route, NewAgentForm } from "./types";
|
|
|
7
8
|
import { DEFAULT_FEATURES } from "./types";
|
|
8
9
|
|
|
9
10
|
// Context
|
|
10
|
-
import { TelemetryProvider, AuthProvider, ProjectProvider, useAuth, useProjects, useAgentStatusChange, useTaskChange } from "./context";
|
|
11
|
+
import { TelemetryProvider, AuthProvider, ProjectProvider, ThemeProvider, useTheme, useAuth, useProjects, useAgentStatusChange, useTaskChange } from "./context";
|
|
11
12
|
|
|
12
13
|
// Hooks
|
|
13
14
|
import { useAgents, useProviders, useOnboarding } from "./hooks";
|
|
@@ -240,7 +241,7 @@ function AppContent() {
|
|
|
240
241
|
}
|
|
241
242
|
|
|
242
243
|
return (
|
|
243
|
-
<div className="h-screen
|
|
244
|
+
<div className="h-screen font-mono flex flex-col overflow-hidden" style={{ backgroundColor: "var(--color-bg)", color: "var(--color-text)" }}>
|
|
244
245
|
<Header onMenuClick={() => setMobileMenuOpen(true)} agents={agents} />
|
|
245
246
|
|
|
246
247
|
{startError && (
|
|
@@ -342,18 +343,95 @@ function AppContent() {
|
|
|
342
343
|
);
|
|
343
344
|
}
|
|
344
345
|
|
|
346
|
+
// ==================== Share Page (public, no auth) ====================
|
|
347
|
+
function SharePage({ token }: { token: string }) {
|
|
348
|
+
const { theme } = useTheme();
|
|
349
|
+
const [status, setStatus] = useState<"checking" | "online" | "offline">("checking");
|
|
350
|
+
const [agentName, setAgentName] = useState("Agent");
|
|
351
|
+
|
|
352
|
+
useEffect(() => {
|
|
353
|
+
const check = async () => {
|
|
354
|
+
try {
|
|
355
|
+
const res = await fetch(`/share/${token}/info`);
|
|
356
|
+
if (res.ok) {
|
|
357
|
+
const data = await res.json();
|
|
358
|
+
setAgentName(data.name || "Agent");
|
|
359
|
+
setStatus(data.status === "running" ? "online" : "offline");
|
|
360
|
+
} else {
|
|
361
|
+
setStatus("offline");
|
|
362
|
+
}
|
|
363
|
+
} catch {
|
|
364
|
+
setStatus("offline");
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
check();
|
|
368
|
+
const interval = setInterval(check, 15000);
|
|
369
|
+
return () => clearInterval(interval);
|
|
370
|
+
}, [token]);
|
|
371
|
+
|
|
372
|
+
if (status === "checking") {
|
|
373
|
+
return (
|
|
374
|
+
<div className="min-h-[100dvh] flex items-center justify-center" style={{ backgroundColor: "var(--color-bg)" }}>
|
|
375
|
+
<div className="text-sm" style={{ color: "var(--color-text-muted)" }}>Connecting...</div>
|
|
376
|
+
</div>
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (status === "offline") {
|
|
381
|
+
return (
|
|
382
|
+
<div className="min-h-[100dvh] flex items-center justify-center" style={{ backgroundColor: "var(--color-bg)" }}>
|
|
383
|
+
<div className="text-center">
|
|
384
|
+
<div className="w-2.5 h-2.5 rounded-full mx-auto mb-3" style={{ backgroundColor: "var(--color-text-muted)" }} />
|
|
385
|
+
<div className="text-base font-semibold mb-1.5" style={{ color: "var(--color-text)" }}>{agentName}</div>
|
|
386
|
+
<div className="text-sm" style={{ color: "var(--color-text-muted)" }}>This agent is currently offline</div>
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return (
|
|
393
|
+
<div className="min-h-[100dvh] flex items-center justify-center p-0 md:p-4" style={{ backgroundColor: "var(--color-bg)" }}>
|
|
394
|
+
<div className="w-full max-w-[640px] h-[100dvh] md:h-[calc(100dvh-32px)] md:max-h-[800px] md:rounded-xl overflow-hidden md:border flex flex-col" style={{ backgroundColor: "var(--color-bg)", borderColor: "var(--color-border)" }}>
|
|
395
|
+
<Chat
|
|
396
|
+
agentId="default"
|
|
397
|
+
apiUrl={`/share/${token}`}
|
|
398
|
+
placeholder="Type a message..."
|
|
399
|
+
variant="terminal"
|
|
400
|
+
theme={theme.id as "light" | "dark"}
|
|
401
|
+
headerTitle={agentName}
|
|
402
|
+
enableMarkdown
|
|
403
|
+
enableWidgets
|
|
404
|
+
availableWidgets={["form", "kpi"]}
|
|
405
|
+
/>
|
|
406
|
+
</div>
|
|
407
|
+
</div>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
345
411
|
// Wrapper component that provides all contexts
|
|
346
412
|
function App() {
|
|
413
|
+
// Check if this is a /share/:token URL — render public share page without auth
|
|
414
|
+
const shareMatch = window.location.pathname.match(/^\/share\/([a-f0-9]{32})$/);
|
|
415
|
+
if (shareMatch) {
|
|
416
|
+
return (
|
|
417
|
+
<ThemeProvider>
|
|
418
|
+
<SharePage token={shareMatch[1]} />
|
|
419
|
+
</ThemeProvider>
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
347
423
|
return (
|
|
348
|
-
<
|
|
349
|
-
<
|
|
350
|
-
<
|
|
351
|
-
<
|
|
352
|
-
<
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
424
|
+
<ThemeProvider>
|
|
425
|
+
<AuthProvider>
|
|
426
|
+
<ProjectProvider>
|
|
427
|
+
<MetaAgentProvider>
|
|
428
|
+
<TelemetryProvider>
|
|
429
|
+
<AppContent />
|
|
430
|
+
</TelemetryProvider>
|
|
431
|
+
</MetaAgentProvider>
|
|
432
|
+
</ProjectProvider>
|
|
433
|
+
</AuthProvider>
|
|
434
|
+
</ThemeProvider>
|
|
357
435
|
);
|
|
358
436
|
}
|
|
359
437
|
|
|
@@ -199,7 +199,7 @@ export function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps)
|
|
|
199
199
|
}, [timeline]);
|
|
200
200
|
|
|
201
201
|
if (loading) {
|
|
202
|
-
return <div className="flex-1 flex items-center justify-center text-[
|
|
202
|
+
return <div className="flex-1 flex items-center justify-center text-[var(--color-text-muted)]">Loading...</div>;
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
const runningCount = filteredAgents.filter(a => a.status === "running").length;
|
|
@@ -211,7 +211,7 @@ export function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps)
|
|
|
211
211
|
<div className="flex items-center justify-between gap-4">
|
|
212
212
|
<div>
|
|
213
213
|
<h1 className="text-xl font-semibold">Activity</h1>
|
|
214
|
-
<p className="text-sm text-[
|
|
214
|
+
<p className="text-sm text-[var(--color-text-muted)] mt-0.5">
|
|
215
215
|
{runningCount} of {filteredAgents.length} agents running
|
|
216
216
|
</p>
|
|
217
217
|
</div>
|
|
@@ -232,7 +232,7 @@ export function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps)
|
|
|
232
232
|
{/* Timeline */}
|
|
233
233
|
<div className="flex-1 overflow-auto px-6 pb-6">
|
|
234
234
|
{timeline.length === 0 ? (
|
|
235
|
-
<div className="flex flex-col items-center justify-center py-20 text-[
|
|
235
|
+
<div className="flex flex-col items-center justify-center py-20 text-[var(--color-text-faint)]">
|
|
236
236
|
<p className="text-lg mb-2">No activity yet</p>
|
|
237
237
|
<p className="text-sm">Agent activity will appear here in real-time.</p>
|
|
238
238
|
</div>
|
|
@@ -241,26 +241,26 @@ export function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps)
|
|
|
241
241
|
{groupedTimeline.map(group => (
|
|
242
242
|
<div key={group.label}>
|
|
243
243
|
{/* Date header */}
|
|
244
|
-
<div className="sticky top-0 z-10 bg-[
|
|
245
|
-
<span className="text-xs font-semibold text-[
|
|
244
|
+
<div className="sticky top-0 z-10 bg-[var(--color-bg)] backdrop-blur-sm py-2 mb-1">
|
|
245
|
+
<span className="text-xs font-semibold text-[var(--color-text-muted)] uppercase tracking-wider">
|
|
246
246
|
{group.label}
|
|
247
247
|
</span>
|
|
248
248
|
</div>
|
|
249
249
|
|
|
250
250
|
{/* Events */}
|
|
251
|
-
<div className="relative ml-3 border-l border-[
|
|
251
|
+
<div className="relative ml-3 border-l border-[var(--color-border)]">
|
|
252
252
|
{group.events.map(evt => {
|
|
253
253
|
const isNew = !seenIds.has(evt.id);
|
|
254
254
|
if (isNew) seenIds.add(evt.id); // mark seen after first render
|
|
255
255
|
const agentName = agentNameMap.get(evt.agent_id) || evt.agent_id.slice(0, 8);
|
|
256
256
|
const dotColor = evt.level === "error"
|
|
257
257
|
? "bg-red-400"
|
|
258
|
-
: CATEGORY_COLORS[evt.category] || "bg-[
|
|
258
|
+
: CATEGORY_COLORS[evt.category] || "bg-[var(--color-text-faint)]";
|
|
259
259
|
|
|
260
260
|
return (
|
|
261
261
|
<div
|
|
262
262
|
key={evt.id}
|
|
263
|
-
className={`relative pl-6 pr-3 py-2.5 hover:bg-[
|
|
263
|
+
className={`relative pl-6 pr-3 py-2.5 hover:bg-[var(--color-surface-hover)] transition-colors ${
|
|
264
264
|
isNew ? "animate-slideIn" : ""
|
|
265
265
|
}`}
|
|
266
266
|
>
|
|
@@ -272,19 +272,19 @@ export function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps)
|
|
|
272
272
|
<p className={`text-sm ${evt.level === "error" ? "text-red-400" : ""}`}>
|
|
273
273
|
{describeEvent(evt, agentName)}
|
|
274
274
|
</p>
|
|
275
|
-
<div className="flex items-center gap-2 text-[11px] text-[
|
|
276
|
-
<span className="text-[
|
|
277
|
-
<span className="text-[
|
|
278
|
-
<span className="text-[
|
|
275
|
+
<div className="flex items-center gap-2 text-[11px] text-[var(--color-text-faint)] mt-0.5">
|
|
276
|
+
<span className="text-[var(--color-text-secondary)] font-medium">{agentName}</span>
|
|
277
|
+
<span className="text-[var(--color-border-light)]">·</span>
|
|
278
|
+
<span className="text-[var(--color-text-faint)]">{evt.category}</span>
|
|
279
279
|
{evt.duration_ms != null && evt.duration_ms > 0 && (
|
|
280
280
|
<>
|
|
281
|
-
<span className="text-[
|
|
281
|
+
<span className="text-[var(--color-border-light)]">·</span>
|
|
282
282
|
<span>{evt.duration_ms < 1000 ? `${evt.duration_ms}ms` : `${(evt.duration_ms / 1000).toFixed(1)}s`}</span>
|
|
283
283
|
</>
|
|
284
284
|
)}
|
|
285
285
|
</div>
|
|
286
286
|
</div>
|
|
287
|
-
<span className="text-[11px] text-[
|
|
287
|
+
<span className="text-[11px] text-[var(--color-text-faint)] shrink-0 pt-0.5">
|
|
288
288
|
{timeAgo(evt.timestamp)}
|
|
289
289
|
</span>
|
|
290
290
|
</div>
|
|
@@ -34,21 +34,21 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
34
34
|
return (
|
|
35
35
|
<div
|
|
36
36
|
onClick={onSelect}
|
|
37
|
-
className={`bg-[
|
|
37
|
+
className={`bg-[var(--color-surface)] rounded p-5 border transition cursor-pointer flex flex-col h-full ${
|
|
38
38
|
selected
|
|
39
|
-
? 'border-[
|
|
40
|
-
: 'border-[
|
|
39
|
+
? 'border-[var(--color-accent)]'
|
|
40
|
+
: 'border-[var(--color-border)] hover:border-[var(--color-border-light)]'
|
|
41
41
|
}`}
|
|
42
42
|
>
|
|
43
43
|
<div className="flex items-start justify-between mb-3">
|
|
44
44
|
<div>
|
|
45
45
|
<h3 className="font-semibold text-lg">{agent.name}</h3>
|
|
46
|
-
<p className="text-sm text-[
|
|
46
|
+
<p className="text-sm text-[var(--color-text-muted)]">
|
|
47
47
|
{agent.provider} / {agent.model}
|
|
48
|
-
{agent.port && <span className="text-[
|
|
48
|
+
{agent.port && <span className="text-[var(--color-text-faint)]"> · :{agent.port}</span>}
|
|
49
49
|
</p>
|
|
50
50
|
{showProject && project && (
|
|
51
|
-
<p className="text-sm text-[
|
|
51
|
+
<p className="text-sm text-[var(--color-text-muted)] flex items-center gap-1.5 mt-1">
|
|
52
52
|
<span className="w-2 h-2 rounded-full" style={{ backgroundColor: project.color }} />
|
|
53
53
|
{project.name}
|
|
54
54
|
</p>
|
|
@@ -62,7 +62,7 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
62
62
|
{enabledFeatures.map(({ key, icon: Icon, label }) => (
|
|
63
63
|
<span
|
|
64
64
|
key={key}
|
|
65
|
-
className="inline-flex items-center gap-1 px-2 py-0.5 rounded bg-[
|
|
65
|
+
className="inline-flex items-center gap-1 px-2 py-0.5 rounded bg-[var(--color-accent-10)] text-[var(--color-accent-70)] text-xs"
|
|
66
66
|
title={label}
|
|
67
67
|
>
|
|
68
68
|
<Icon className="w-3 h-3" />
|
|
@@ -84,7 +84,7 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
84
84
|
className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs ${
|
|
85
85
|
isAvailable
|
|
86
86
|
? "bg-green-500/10 text-green-400"
|
|
87
|
-
: "bg-[
|
|
87
|
+
: "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"
|
|
88
88
|
}`}
|
|
89
89
|
title={`MCP: ${server.name} (${isAvailable ? "available" : server.status})`}
|
|
90
90
|
>
|
|
@@ -105,7 +105,7 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
105
105
|
className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs ${
|
|
106
106
|
skill.enabled
|
|
107
107
|
? "bg-purple-500/10 text-purple-400"
|
|
108
|
-
: "bg-[
|
|
108
|
+
: "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"
|
|
109
109
|
}`}
|
|
110
110
|
title={`Skill: ${skill.name} v${skill.version}`}
|
|
111
111
|
>
|
|
@@ -125,7 +125,7 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
125
125
|
className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs ${
|
|
126
126
|
sub.enabled
|
|
127
127
|
? "bg-cyan-500/10 text-cyan-400"
|
|
128
|
-
: "bg-[
|
|
128
|
+
: "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"
|
|
129
129
|
}`}
|
|
130
130
|
title={`Trigger: ${sub.trigger_slug.replace(/_/g, " ")}`}
|
|
131
131
|
>
|
|
@@ -136,7 +136,7 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
136
136
|
</div>
|
|
137
137
|
)}
|
|
138
138
|
|
|
139
|
-
<p className="text-sm text-[
|
|
139
|
+
<p className="text-sm text-[var(--color-text-muted)] line-clamp-2 mb-4 flex-1">
|
|
140
140
|
{agent.systemPrompt}
|
|
141
141
|
</p>
|
|
142
142
|
|
|
@@ -145,9 +145,9 @@ export const AgentCard = React.memo(function AgentCard({ agent, selected, onSele
|
|
|
145
145
|
disabled={agent.status === "starting" || agent.status === "stopping"}
|
|
146
146
|
className={`w-full px-3 py-1.5 rounded text-sm font-medium transition mt-auto ${
|
|
147
147
|
agent.status === "starting" || agent.status === "stopping"
|
|
148
|
-
? "bg-[
|
|
148
|
+
? "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)] cursor-wait"
|
|
149
149
|
: agent.status === "running"
|
|
150
|
-
? "bg-
|
|
150
|
+
? "bg-red-500/15 text-red-500 hover:bg-red-500/25 border border-red-500/20"
|
|
151
151
|
: "bg-[#3b82f6]/20 text-[#3b82f6] hover:bg-[#3b82f6]/30"
|
|
152
152
|
}`}
|
|
153
153
|
>
|
|
@@ -175,7 +175,7 @@ function StatusBadge({ status, isActive, activityLabel }: { status: Agent["statu
|
|
|
175
175
|
? "bg-yellow-500/20 text-yellow-400 animate-pulse"
|
|
176
176
|
: status === "running"
|
|
177
177
|
? "bg-[#3b82f6]/20 text-[#3b82f6]"
|
|
178
|
-
: "bg-[
|
|
178
|
+
: "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"
|
|
179
179
|
}`}
|
|
180
180
|
>
|
|
181
181
|
{status}
|