apteva 0.4.41 → 0.4.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/ActivityPage.c48n83h2.js +3 -0
  2. package/dist/ApiDocsPage.yzcxx5ax.js +4 -0
  3. package/dist/App.09yb8t0b.js +1 -0
  4. package/dist/App.152mbs1r.js +4 -0
  5. package/dist/App.3a67nx9w.js +4 -0
  6. package/dist/App.9epx6785.js +4 -0
  7. package/dist/App.d8955awp.js +4 -0
  8. package/dist/App.drwb57jq.js +4 -0
  9. package/dist/App.gssbmajb.js +4 -0
  10. package/dist/App.qw70pc29.js +53 -0
  11. package/dist/{App.7fb3e7mp.js → App.qzbx5wtj.js} +1 -1
  12. package/dist/App.r5serxkt.js +8 -0
  13. package/dist/App.tpmp9020.js +20 -0
  14. package/dist/App.v2wb4d7d.js +61 -0
  15. package/dist/App.vxmaaj0m.js +13 -0
  16. package/dist/App.w4p2tda9.js +4 -0
  17. package/dist/App.wv2ng55q.js +221 -0
  18. package/dist/App.yncnrn0f.js +4 -0
  19. package/dist/ConnectionsPage.k6cspyqq.js +3 -0
  20. package/dist/McpPage.cdxm48xj.js +3 -0
  21. package/dist/SettingsPage.evpv7c2y.js +3 -0
  22. package/dist/SkillsPage.pvzp6c1a.js +3 -0
  23. package/dist/TasksPage.6jnvbpsy.js +3 -0
  24. package/dist/TelemetryPage.t7vk24zc.js +3 -0
  25. package/dist/TestsPage.5x6658aa.js +3 -0
  26. package/dist/ThreadsPage.3fvhtevh.js +3 -0
  27. package/dist/apteva-kit.css +1 -1
  28. package/dist/index.html +1 -1
  29. package/dist/styles.css +1 -1
  30. package/package.json +8 -8
  31. package/src/db.ts +19 -9
  32. package/src/integrations/agentdojo.ts +1 -0
  33. package/src/mcp-platform.ts +418 -63
  34. package/src/openapi.ts +96 -0
  35. package/src/providers.ts +50 -24
  36. package/src/routes/api/agent-utils.ts +0 -1
  37. package/src/routes/api/agents.ts +19 -1
  38. package/src/routes/api/meta-agent.ts +2 -0
  39. package/src/routes/api/system.ts +90 -1
  40. package/src/routes/api/telemetry.ts +19 -1
  41. package/src/routes/share.ts +85 -0
  42. package/src/server.ts +12 -0
  43. package/src/web/App.tsx +89 -11
  44. package/src/web/components/activity/ActivityPage.tsx +14 -14
  45. package/src/web/components/agents/AgentCard.tsx +14 -14
  46. package/src/web/components/agents/AgentPanel.tsx +358 -198
  47. package/src/web/components/agents/AgentsView.tsx +4 -4
  48. package/src/web/components/agents/CreateAgentModal.tsx +21 -79
  49. package/src/web/components/api/ApiDocsPage.tsx +66 -66
  50. package/src/web/components/auth/CreateAccountStep.tsx +16 -16
  51. package/src/web/components/auth/LoginPage.tsx +10 -10
  52. package/src/web/components/common/LoadingSpinner.tsx +2 -2
  53. package/src/web/components/common/Modal.tsx +8 -8
  54. package/src/web/components/common/Select.tsx +9 -9
  55. package/src/web/components/connections/ConnectionsPage.tsx +4 -4
  56. package/src/web/components/connections/IntegrationsTab.tsx +18 -18
  57. package/src/web/components/connections/OverviewTab.tsx +13 -13
  58. package/src/web/components/connections/TriggersTab.tsx +99 -99
  59. package/src/web/components/dashboard/Dashboard.tsx +32 -32
  60. package/src/web/components/layout/Header.tsx +50 -34
  61. package/src/web/components/layout/Sidebar.tsx +34 -15
  62. package/src/web/components/mcp/IntegrationsPanel.tsx +40 -40
  63. package/src/web/components/mcp/McpPage.tsx +208 -208
  64. package/src/web/components/meta-agent/MetaAgent.tsx +12 -10
  65. package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
  66. package/src/web/components/settings/SettingsPage.tsx +258 -175
  67. package/src/web/components/skills/SkillsPage.tsx +88 -88
  68. package/src/web/components/tasks/TasksPage.tsx +339 -54
  69. package/src/web/components/telemetry/TelemetryPage.tsx +135 -64
  70. package/src/web/components/tests/TestsPage.tsx +50 -50
  71. package/src/web/components/threads/ThreadsPage.tsx +23 -21
  72. package/src/web/context/ProjectContext.tsx +6 -1
  73. package/src/web/context/ThemeContext.tsx +69 -0
  74. package/src/web/context/index.ts +2 -0
  75. package/src/web/styles.css +5 -3
  76. package/src/web/themes.ts +99 -0
  77. package/src/web/types.ts +0 -4
  78. package/dist/ActivityPage.7907h64p.js +0 -3
  79. package/dist/ApiDocsPage.k3jjenpq.js +0 -4
  80. package/dist/App.01nq20st.js +0 -4
  81. package/dist/App.1maqvamf.js +0 -4
  82. package/dist/App.2yjrh32f.js +0 -4
  83. package/dist/App.3qw8nben.js +0 -20
  84. package/dist/App.7sy3wq8c.js +0 -4
  85. package/dist/App.apjrmctz.js +0 -57
  86. package/dist/App.av6t2yhe.js +0 -4
  87. package/dist/App.jqj5a094.js +0 -46
  88. package/dist/App.mc7xf85h.js +0 -4
  89. package/dist/App.myxqcj9x.js +0 -4
  90. package/dist/App.nm91r1mp.js +0 -13
  91. package/dist/App.p02f4ret.js +0 -1
  92. package/dist/App.qcknavjz.js +0 -221
  93. package/dist/App.vc7vfhg4.js +0 -4
  94. package/dist/App.z4s9zkw5.js +0 -4
  95. package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
  96. package/dist/McpPage.8vc97z0b.js +0 -3
  97. package/dist/SettingsPage.p61bz8kd.js +0 -3
  98. package/dist/SkillsPage.r9x43g3g.js +0 -3
  99. package/dist/TasksPage.1e0zkye4.js +0 -3
  100. package/dist/TelemetryPage.p9vbe4gf.js +0 -3
  101. package/dist/TestsPage.d4xy504e.js +0 -3
  102. package/dist/ThreadsPage.m016am3x.js +0 -3
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 bg-[#0a0a0a] text-[#e0e0e0] font-mono flex flex-col overflow-hidden">
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
- <AuthProvider>
349
- <ProjectProvider>
350
- <MetaAgentProvider>
351
- <TelemetryProvider>
352
- <AppContent />
353
- </TelemetryProvider>
354
- </MetaAgentProvider>
355
- </ProjectProvider>
356
- </AuthProvider>
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-[#666]">Loading...</div>;
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-[#666] mt-0.5">
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-[#555]">
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-[#0a0a0a]/95 backdrop-blur-sm py-2 mb-1">
245
- <span className="text-xs font-semibold text-[#666] uppercase tracking-wider">
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-[#1a1a1a]">
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-[#555]";
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-[#111]/50 transition-colors ${
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-[#555] mt-0.5">
276
- <span className="text-[#888] font-medium">{agentName}</span>
277
- <span className="text-[#333]">&middot;</span>
278
- <span className="text-[#555]">{evt.category}</span>
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)]">&middot;</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-[#333]">&middot;</span>
281
+ <span className="text-[var(--color-border-light)]">&middot;</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-[#555] shrink-0 pt-0.5">
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-[#111] rounded p-5 border transition cursor-pointer flex flex-col h-full ${
37
+ className={`bg-[var(--color-surface)] rounded p-5 border transition cursor-pointer flex flex-col h-full ${
38
38
  selected
39
- ? 'border-[#f97316]'
40
- : 'border-[#1a1a1a] hover:border-[#333]'
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-[#666]">
46
+ <p className="text-sm text-[var(--color-text-muted)]">
47
47
  {agent.provider} / {agent.model}
48
- {agent.port && <span className="text-[#444]"> · :{agent.port}</span>}
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-[#666] flex items-center gap-1.5 mt-1">
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-[#f97316]/10 text-[#f97316]/70 text-xs"
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-[#222] text-[#666]"
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-[#222] text-[#666]"
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-[#222] text-[#666]"
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-[#666] line-clamp-2 mb-4 flex-1">
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-[#333] text-[#666] cursor-wait"
148
+ ? "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)] cursor-wait"
149
149
  : agent.status === "running"
150
- ? "bg-[#f97316]/20 text-[#f97316] hover:bg-[#f97316]/30"
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-[#333] text-[#666]"
178
+ : "bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"
179
179
  }`}
180
180
  >
181
181
  {status}