apteva 0.4.56 → 0.7.0
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/README.md +216 -54
- package/cli.js +35 -0
- package/install.js +92 -0
- package/package.json +12 -79
- package/LICENSE +0 -63
- package/bin/apteva.js +0 -196
- package/dist/ActivityPage.kxzzb4yc.js +0 -3
- package/dist/ApiDocsPage.zq998hbm.js +0 -4
- package/dist/App.55rea8mn.js +0 -61
- package/dist/App.5ywb23z4.js +0 -53
- package/dist/App.6thds120.js +0 -4
- package/dist/App.9tctxzqm.js +0 -8
- package/dist/App.a8r8ttaz.js +0 -4
- package/dist/App.agsv5bje.js +0 -4
- package/dist/App.cepapqmx.js +0 -4
- package/dist/App.dp041gb3.js +0 -221
- package/dist/App.fds72zb5.js +0 -4
- package/dist/App.fg9qj2dq.js +0 -4
- package/dist/App.ndfejbm9.js +0 -4
- package/dist/App.nxmfmq1h.js +0 -13
- package/dist/App.qdfyt8ba.js +0 -4
- package/dist/App.x2d0ygt6.js +0 -4
- package/dist/App.yt9p4nr3.js +0 -20
- package/dist/App.zn4mw16t.js +0 -1
- package/dist/ConnectionsPage.8r96ryw7.js +0 -3
- package/dist/McpPage.3cwh0gnd.js +0 -3
- package/dist/SettingsPage.ykgdh5ev.js +0 -3
- package/dist/SkillsPage.4np1s65b.js +0 -3
- package/dist/TasksPage.4g08t7p6.js +0 -3
- package/dist/TelemetryPage.72w9pwcp.js +0 -3
- package/dist/TestsPage.z4fk3r7r.js +0 -3
- package/dist/ThreadsPage.63tcajeh.js +0 -3
- package/dist/apteva-kit.css +0 -1
- package/dist/icon.png +0 -0
- package/dist/index.html +0 -16
- package/dist/styles.css +0 -1
- package/scripts/postinstall.mjs +0 -102
- package/src/auth/index.ts +0 -394
- package/src/auth/middleware.ts +0 -213
- package/src/binary.ts +0 -536
- package/src/channels/index.ts +0 -40
- package/src/channels/telegram.ts +0 -311
- package/src/crypto.ts +0 -301
- package/src/db-tests.ts +0 -174
- package/src/db.ts +0 -3133
- package/src/integrations/agentdojo.ts +0 -559
- package/src/integrations/composio.ts +0 -437
- package/src/integrations/index.ts +0 -87
- package/src/integrations/skillsmp.ts +0 -318
- package/src/mcp-client.ts +0 -605
- package/src/mcp-handler.ts +0 -394
- package/src/mcp-platform.ts +0 -2370
- package/src/openapi.ts +0 -2410
- package/src/providers.ts +0 -597
- package/src/routes/api/agent-utils.ts +0 -890
- package/src/routes/api/agents.ts +0 -916
- package/src/routes/api/api-keys.ts +0 -95
- package/src/routes/api/channels.ts +0 -182
- package/src/routes/api/helpers.ts +0 -12
- package/src/routes/api/integrations.ts +0 -639
- package/src/routes/api/mcp.ts +0 -574
- package/src/routes/api/meta-agent.ts +0 -195
- package/src/routes/api/projects.ts +0 -112
- package/src/routes/api/providers.ts +0 -424
- package/src/routes/api/skills.ts +0 -537
- package/src/routes/api/system.ts +0 -333
- package/src/routes/api/telemetry.ts +0 -203
- package/src/routes/api/tests.ts +0 -148
- package/src/routes/api/triggers.ts +0 -518
- package/src/routes/api/users.ts +0 -148
- package/src/routes/api/webhooks.ts +0 -171
- package/src/routes/api.ts +0 -53
- package/src/routes/auth.ts +0 -251
- package/src/routes/share.ts +0 -86
- package/src/routes/static.ts +0 -131
- package/src/server.ts +0 -642
- package/src/test-runner.ts +0 -598
- package/src/triggers/agentdojo.ts +0 -253
- package/src/triggers/composio.ts +0 -264
- package/src/triggers/index.ts +0 -71
- package/src/tui/AgentList.tsx +0 -145
- package/src/tui/App.tsx +0 -102
- package/src/tui/Login.tsx +0 -104
- package/src/tui/api.ts +0 -72
- package/src/tui/index.tsx +0 -7
- package/src/web/App.tsx +0 -455
- package/src/web/components/activity/ActivityPage.tsx +0 -314
- package/src/web/components/activity/index.ts +0 -1
- package/src/web/components/agents/AgentCard.tsx +0 -189
- package/src/web/components/agents/AgentPanel.tsx +0 -2244
- package/src/web/components/agents/AgentsView.tsx +0 -180
- package/src/web/components/agents/CreateAgentModal.tsx +0 -475
- package/src/web/components/agents/index.ts +0 -4
- package/src/web/components/api/ApiDocsPage.tsx +0 -842
- package/src/web/components/auth/CreateAccountStep.tsx +0 -176
- package/src/web/components/auth/LoginPage.tsx +0 -91
- package/src/web/components/auth/index.ts +0 -2
- package/src/web/components/common/Icons.tsx +0 -250
- package/src/web/components/common/LoadingSpinner.tsx +0 -44
- package/src/web/components/common/Modal.tsx +0 -199
- package/src/web/components/common/Select.tsx +0 -97
- package/src/web/components/common/index.ts +0 -20
- package/src/web/components/connections/ConnectionsPage.tsx +0 -54
- package/src/web/components/connections/IntegrationsTab.tsx +0 -170
- package/src/web/components/connections/OverviewTab.tsx +0 -137
- package/src/web/components/connections/TriggersTab.tsx +0 -1346
- package/src/web/components/dashboard/Dashboard.tsx +0 -572
- package/src/web/components/dashboard/index.ts +0 -1
- package/src/web/components/index.ts +0 -21
- package/src/web/components/layout/ErrorBanner.tsx +0 -18
- package/src/web/components/layout/Header.tsx +0 -332
- package/src/web/components/layout/Sidebar.tsx +0 -231
- package/src/web/components/layout/index.ts +0 -3
- package/src/web/components/mcp/IntegrationsPanel.tsx +0 -857
- package/src/web/components/mcp/McpPage.tsx +0 -2515
- package/src/web/components/mcp/index.ts +0 -1
- package/src/web/components/meta-agent/MetaAgent.tsx +0 -245
- package/src/web/components/onboarding/OnboardingWizard.tsx +0 -404
- package/src/web/components/onboarding/index.ts +0 -1
- package/src/web/components/settings/SettingsPage.tsx +0 -2776
- package/src/web/components/settings/index.ts +0 -1
- package/src/web/components/skills/SkillsPage.tsx +0 -1200
- package/src/web/components/tasks/TasksPage.tsx +0 -1116
- package/src/web/components/tasks/index.ts +0 -1
- package/src/web/components/telemetry/TelemetryPage.tsx +0 -1129
- package/src/web/components/tests/TestsPage.tsx +0 -594
- package/src/web/components/threads/ThreadsPage.tsx +0 -315
- package/src/web/context/AuthContext.tsx +0 -242
- package/src/web/context/ProjectContext.tsx +0 -214
- package/src/web/context/TelemetryContext.tsx +0 -299
- package/src/web/context/ThemeContext.tsx +0 -90
- package/src/web/context/UIModeContext.tsx +0 -49
- package/src/web/context/index.ts +0 -12
- package/src/web/hooks/index.ts +0 -3
- package/src/web/hooks/useAgents.ts +0 -115
- package/src/web/hooks/useOnboarding.ts +0 -20
- package/src/web/hooks/useProviders.ts +0 -75
- package/src/web/icon.png +0 -0
- package/src/web/index.html +0 -16
- package/src/web/styles.css +0 -118
- package/src/web/themes.ts +0 -162
- package/src/web/types.ts +0 -298
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
2
|
-
|
|
3
|
-
interface CreateAccountStepProps {
|
|
4
|
-
onComplete: (user: { username: string }) => void;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function CreateAccountStep({ onComplete }: CreateAccountStepProps) {
|
|
8
|
-
const [username, setUsername] = useState("");
|
|
9
|
-
const [password, setPassword] = useState("");
|
|
10
|
-
const [confirmPassword, setConfirmPassword] = useState("");
|
|
11
|
-
const [email, setEmail] = useState("");
|
|
12
|
-
const [showEmail, setShowEmail] = useState(false);
|
|
13
|
-
const [error, setError] = useState<string | null>(null);
|
|
14
|
-
const [loading, setLoading] = useState(false);
|
|
15
|
-
|
|
16
|
-
const handleSubmit = async (e: React.FormEvent) => {
|
|
17
|
-
e.preventDefault();
|
|
18
|
-
setError(null);
|
|
19
|
-
|
|
20
|
-
// Validate passwords match
|
|
21
|
-
if (password !== confirmPassword) {
|
|
22
|
-
setError("Passwords do not match");
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
setLoading(true);
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const res = await fetch("/api/onboarding/user", {
|
|
30
|
-
method: "POST",
|
|
31
|
-
headers: { "Content-Type": "application/json" },
|
|
32
|
-
body: JSON.stringify({
|
|
33
|
-
username,
|
|
34
|
-
password,
|
|
35
|
-
...(email && { email }), // Only include if provided
|
|
36
|
-
}),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const data = await res.json();
|
|
40
|
-
|
|
41
|
-
if (!res.ok) {
|
|
42
|
-
setError(data.error || "Failed to create account");
|
|
43
|
-
setLoading(false);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Auto-login after account creation
|
|
48
|
-
const loginRes = await fetch("/api/auth/login", {
|
|
49
|
-
method: "POST",
|
|
50
|
-
headers: { "Content-Type": "application/json" },
|
|
51
|
-
credentials: "include",
|
|
52
|
-
body: JSON.stringify({ username, password }),
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
if (!loginRes.ok) {
|
|
56
|
-
setError("Account created but login failed. Please try logging in.");
|
|
57
|
-
setLoading(false);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const loginData = await loginRes.json();
|
|
62
|
-
|
|
63
|
-
// Store token for subsequent requests
|
|
64
|
-
if (loginData.accessToken) {
|
|
65
|
-
sessionStorage.setItem("accessToken", loginData.accessToken);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
onComplete({ username });
|
|
69
|
-
} catch (e) {
|
|
70
|
-
setError("Failed to create account");
|
|
71
|
-
setLoading(false);
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
return (
|
|
76
|
-
<>
|
|
77
|
-
<h2 className="text-2xl font-semibold mb-2">Create your account</h2>
|
|
78
|
-
<p className="text-[var(--color-text-muted)] mb-6">
|
|
79
|
-
Set up your admin account to get started with apteva.
|
|
80
|
-
</p>
|
|
81
|
-
|
|
82
|
-
<form onSubmit={handleSubmit} className="space-y-4">
|
|
83
|
-
<div>
|
|
84
|
-
<label htmlFor="username" className="block text-sm text-[var(--color-text-secondary)] mb-1">
|
|
85
|
-
Username
|
|
86
|
-
</label>
|
|
87
|
-
<input
|
|
88
|
-
id="username"
|
|
89
|
-
type="text"
|
|
90
|
-
value={username}
|
|
91
|
-
onChange={e => setUsername(e.target.value)}
|
|
92
|
-
placeholder="Choose a username"
|
|
93
|
-
autoFocus
|
|
94
|
-
required
|
|
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
|
-
/>
|
|
97
|
-
<p className="text-xs text-[var(--color-text-muted)] mt-1">3-20 characters, letters, numbers, underscore</p>
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
<div>
|
|
101
|
-
<label htmlFor="password" className="block text-sm text-[var(--color-text-secondary)] mb-1">
|
|
102
|
-
Password
|
|
103
|
-
</label>
|
|
104
|
-
<input
|
|
105
|
-
id="password"
|
|
106
|
-
type="password"
|
|
107
|
-
value={password}
|
|
108
|
-
onChange={e => setPassword(e.target.value)}
|
|
109
|
-
placeholder="Enter a password"
|
|
110
|
-
required
|
|
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
|
-
/>
|
|
113
|
-
<p className="text-xs text-[var(--color-text-muted)] mt-1">Min 8 characters, uppercase, lowercase, number</p>
|
|
114
|
-
</div>
|
|
115
|
-
|
|
116
|
-
<div>
|
|
117
|
-
<label htmlFor="confirmPassword" className="block text-sm text-[var(--color-text-secondary)] mb-1">
|
|
118
|
-
Confirm Password
|
|
119
|
-
</label>
|
|
120
|
-
<input
|
|
121
|
-
id="confirmPassword"
|
|
122
|
-
type="password"
|
|
123
|
-
value={confirmPassword}
|
|
124
|
-
onChange={e => setConfirmPassword(e.target.value)}
|
|
125
|
-
placeholder="Confirm your password"
|
|
126
|
-
required
|
|
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
|
-
/>
|
|
129
|
-
</div>
|
|
130
|
-
|
|
131
|
-
{!showEmail ? (
|
|
132
|
-
<button
|
|
133
|
-
type="button"
|
|
134
|
-
onClick={() => setShowEmail(true)}
|
|
135
|
-
className="text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition"
|
|
136
|
-
>
|
|
137
|
-
+ Add email for password recovery (optional)
|
|
138
|
-
</button>
|
|
139
|
-
) : (
|
|
140
|
-
<div>
|
|
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
|
-
</label>
|
|
144
|
-
<input
|
|
145
|
-
id="email"
|
|
146
|
-
type="email"
|
|
147
|
-
value={email}
|
|
148
|
-
onChange={e => setEmail(e.target.value)}
|
|
149
|
-
placeholder="For password recovery only"
|
|
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
|
-
/>
|
|
152
|
-
<p className="text-xs text-[var(--color-text-muted)] mt-1">Only used for password recovery, never shared</p>
|
|
153
|
-
</div>
|
|
154
|
-
)}
|
|
155
|
-
|
|
156
|
-
{error && (
|
|
157
|
-
<div className="p-3 bg-red-500/10 border border-red-500/30 rounded text-red-400 text-sm">
|
|
158
|
-
{error}
|
|
159
|
-
</div>
|
|
160
|
-
)}
|
|
161
|
-
|
|
162
|
-
<button
|
|
163
|
-
type="submit"
|
|
164
|
-
disabled={loading || !username || !password || !confirmPassword}
|
|
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
|
-
>
|
|
167
|
-
{loading ? "Creating account..." : "Create Account"}
|
|
168
|
-
</button>
|
|
169
|
-
</form>
|
|
170
|
-
|
|
171
|
-
<p className="text-xs text-[var(--color-text-muted)] mt-4 text-center">
|
|
172
|
-
This will be your admin account with full access to apteva.
|
|
173
|
-
</p>
|
|
174
|
-
</>
|
|
175
|
-
);
|
|
176
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
2
|
-
import { useAuth } from "../../context/AuthContext";
|
|
3
|
-
|
|
4
|
-
export function LoginPage() {
|
|
5
|
-
const { login } = useAuth();
|
|
6
|
-
const [username, setUsername] = useState("");
|
|
7
|
-
const [password, setPassword] = useState("");
|
|
8
|
-
const [error, setError] = useState<string | null>(null);
|
|
9
|
-
const [loading, setLoading] = useState(false);
|
|
10
|
-
|
|
11
|
-
const handleSubmit = async (e: React.FormEvent) => {
|
|
12
|
-
e.preventDefault();
|
|
13
|
-
setError(null);
|
|
14
|
-
setLoading(true);
|
|
15
|
-
|
|
16
|
-
const result = await login(username, password);
|
|
17
|
-
|
|
18
|
-
if (!result.success) {
|
|
19
|
-
setError(result.error || "Login failed");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
setLoading(false);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center p-8">
|
|
27
|
-
<div className="w-full max-w-md">
|
|
28
|
-
{/* Logo */}
|
|
29
|
-
<div className="text-center mb-8">
|
|
30
|
-
<div className="flex items-center justify-center gap-2 mb-2">
|
|
31
|
-
<span className="text-[var(--color-accent)] text-3xl">>_</span>
|
|
32
|
-
<span className="text-3xl tracking-wider">apteva</span>
|
|
33
|
-
</div>
|
|
34
|
-
<p className="text-[var(--color-text-muted)]">Run AI agents locally</p>
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<div className="bg-[var(--color-surface)] card p-8">
|
|
38
|
-
<h2 className="text-2xl font-semibold mb-2">Welcome back</h2>
|
|
39
|
-
<p className="text-[var(--color-text-muted)] mb-6">Sign in to continue to apteva</p>
|
|
40
|
-
|
|
41
|
-
<form onSubmit={handleSubmit} className="space-y-4">
|
|
42
|
-
<div>
|
|
43
|
-
<label htmlFor="username" className="block text-sm text-[var(--color-text-secondary)] mb-1">
|
|
44
|
-
Username
|
|
45
|
-
</label>
|
|
46
|
-
<input
|
|
47
|
-
id="username"
|
|
48
|
-
type="text"
|
|
49
|
-
value={username}
|
|
50
|
-
onChange={e => setUsername(e.target.value)}
|
|
51
|
-
placeholder="Enter your username"
|
|
52
|
-
autoFocus
|
|
53
|
-
required
|
|
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
|
-
/>
|
|
56
|
-
</div>
|
|
57
|
-
|
|
58
|
-
<div>
|
|
59
|
-
<label htmlFor="password" className="block text-sm text-[var(--color-text-secondary)] mb-1">
|
|
60
|
-
Password
|
|
61
|
-
</label>
|
|
62
|
-
<input
|
|
63
|
-
id="password"
|
|
64
|
-
type="password"
|
|
65
|
-
value={password}
|
|
66
|
-
onChange={e => setPassword(e.target.value)}
|
|
67
|
-
placeholder="Enter your password"
|
|
68
|
-
required
|
|
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
|
-
/>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
{error && (
|
|
74
|
-
<div className="p-3 bg-red-500/10 border border-red-500/30 rounded text-red-400 text-sm">
|
|
75
|
-
{error}
|
|
76
|
-
</div>
|
|
77
|
-
)}
|
|
78
|
-
|
|
79
|
-
<button
|
|
80
|
-
type="submit"
|
|
81
|
-
disabled={loading || !username || !password}
|
|
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
|
-
>
|
|
84
|
-
{loading ? "Signing in..." : "Sign In"}
|
|
85
|
-
</button>
|
|
86
|
-
</form>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
interface IconProps {
|
|
4
|
-
className?: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function CheckIcon({ className = "w-4 h-4" }: IconProps) {
|
|
8
|
-
return (
|
|
9
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
10
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
11
|
-
</svg>
|
|
12
|
-
);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function CloseIcon({ className = "w-5 h-5" }: IconProps) {
|
|
16
|
-
return (
|
|
17
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
18
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
19
|
-
</svg>
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function DashboardIcon({ className = "w-5 h-5" }: IconProps) {
|
|
24
|
-
return (
|
|
25
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
26
|
-
<path
|
|
27
|
-
strokeLinecap="round"
|
|
28
|
-
strokeLinejoin="round"
|
|
29
|
-
strokeWidth={2}
|
|
30
|
-
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
|
|
31
|
-
/>
|
|
32
|
-
</svg>
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function AgentsIcon({ className = "w-5 h-5" }: IconProps) {
|
|
37
|
-
return (
|
|
38
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
39
|
-
<path
|
|
40
|
-
strokeLinecap="round"
|
|
41
|
-
strokeLinejoin="round"
|
|
42
|
-
strokeWidth={2}
|
|
43
|
-
d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
|
|
44
|
-
/>
|
|
45
|
-
</svg>
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function SettingsIcon({ className = "w-5 h-5" }: IconProps) {
|
|
50
|
-
return (
|
|
51
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
52
|
-
<path
|
|
53
|
-
strokeLinecap="round"
|
|
54
|
-
strokeLinejoin="round"
|
|
55
|
-
strokeWidth={2}
|
|
56
|
-
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
|
|
57
|
-
/>
|
|
58
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
59
|
-
</svg>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Feature Icons
|
|
64
|
-
export function MemoryIcon({ className = "w-4 h-4" }: IconProps) {
|
|
65
|
-
return (
|
|
66
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
67
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" />
|
|
68
|
-
</svg>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function TasksIcon({ className = "w-4 h-4" }: IconProps) {
|
|
73
|
-
return (
|
|
74
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
75
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" />
|
|
76
|
-
</svg>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function VisionIcon({ className = "w-4 h-4" }: IconProps) {
|
|
81
|
-
return (
|
|
82
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
83
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
84
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
|
|
85
|
-
</svg>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function OperatorIcon({ className = "w-4 h-4" }: IconProps) {
|
|
90
|
-
return (
|
|
91
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
92
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
93
|
-
</svg>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function McpIcon({ className = "w-4 h-4" }: IconProps) {
|
|
98
|
-
return (
|
|
99
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
100
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
|
|
101
|
-
</svg>
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function SkillsIcon({ className = "w-4 h-4" }: IconProps) {
|
|
106
|
-
return (
|
|
107
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
108
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" />
|
|
109
|
-
</svg>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export function RealtimeIcon({ className = "w-4 h-4" }: IconProps) {
|
|
114
|
-
return (
|
|
115
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
116
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z" />
|
|
117
|
-
</svg>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export function TelemetryIcon({ className = "w-4 h-4" }: IconProps) {
|
|
122
|
-
return (
|
|
123
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
124
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
|
|
125
|
-
</svg>
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function ApiIcon({ className = "w-4 h-4" }: IconProps) {
|
|
130
|
-
return (
|
|
131
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
132
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
|
|
133
|
-
</svg>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function FilesIcon({ className = "w-4 h-4" }: IconProps) {
|
|
138
|
-
return (
|
|
139
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
140
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
|
|
141
|
-
</svg>
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export function MultiAgentIcon({ className = "w-4 h-4" }: IconProps) {
|
|
146
|
-
return (
|
|
147
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
148
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
|
149
|
-
</svg>
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function MenuIcon({ className = "w-5 h-5" }: IconProps) {
|
|
154
|
-
return (
|
|
155
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
156
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
|
|
157
|
-
</svg>
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export function ChevronDownIcon({ className = "w-4 h-4" }: IconProps) {
|
|
162
|
-
return (
|
|
163
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
164
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
|
165
|
-
</svg>
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export function FolderIcon({ className = "w-4 h-4" }: IconProps) {
|
|
170
|
-
return (
|
|
171
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
172
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
|
|
173
|
-
</svg>
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export function TestsIcon({ className = "w-4 h-4" }: IconProps) {
|
|
178
|
-
return (
|
|
179
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
180
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4" />
|
|
181
|
-
</svg>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function ConnectionsIcon({ className = "w-5 h-5" }: IconProps) {
|
|
186
|
-
return (
|
|
187
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
188
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4" />
|
|
189
|
-
</svg>
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export function ActivityIcon({ className = "w-5 h-5" }: IconProps) {
|
|
194
|
-
return (
|
|
195
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
196
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
197
|
-
</svg>
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export function PlusIcon({ className = "w-4 h-4" }: IconProps) {
|
|
202
|
-
return (
|
|
203
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
204
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
|
|
205
|
-
</svg>
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export function RecurringIcon({ className = "w-4 h-4" }: IconProps) {
|
|
210
|
-
return (
|
|
211
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
212
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 4v5h5M20 20v-5h-5" />
|
|
213
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20.49 9A9 9 0 005.64 5.64L4 4m16 16l-1.64-1.64A9 9 0 013.51 15" />
|
|
214
|
-
</svg>
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export function ScheduledIcon({ className = "w-4 h-4" }: IconProps) {
|
|
219
|
-
return (
|
|
220
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
221
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3" />
|
|
222
|
-
<circle cx="12" cy="12" r="9" strokeWidth={2} />
|
|
223
|
-
</svg>
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export function TaskOnceIcon({ className = "w-4 h-4" }: IconProps) {
|
|
228
|
-
return (
|
|
229
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
230
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
|
|
231
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 14l2 2 4-4" />
|
|
232
|
-
</svg>
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export function ThreadsIcon({ className = "w-5 h-5" }: IconProps) {
|
|
237
|
-
return (
|
|
238
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
239
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
|
|
240
|
-
</svg>
|
|
241
|
-
);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export function BellIcon({ className = "w-5 h-5" }: IconProps) {
|
|
245
|
-
return (
|
|
246
|
-
<svg className={className} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
247
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
|
|
248
|
-
</svg>
|
|
249
|
-
);
|
|
250
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
interface LoadingSpinnerProps {
|
|
4
|
-
message?: string;
|
|
5
|
-
fullScreen?: boolean;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function LoadingSpinner({ message = "Loading...", fullScreen = false }: LoadingSpinnerProps) {
|
|
9
|
-
const content = (
|
|
10
|
-
<div className="flex items-center gap-3 text-[var(--color-text-muted)]">
|
|
11
|
-
<svg className="animate-spin h-5 w-5" viewBox="0 0 24 24">
|
|
12
|
-
<circle
|
|
13
|
-
className="opacity-25"
|
|
14
|
-
cx="12"
|
|
15
|
-
cy="12"
|
|
16
|
-
r="10"
|
|
17
|
-
stroke="currentColor"
|
|
18
|
-
strokeWidth="4"
|
|
19
|
-
fill="none"
|
|
20
|
-
/>
|
|
21
|
-
<path
|
|
22
|
-
className="opacity-75"
|
|
23
|
-
fill="currentColor"
|
|
24
|
-
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
25
|
-
/>
|
|
26
|
-
</svg>
|
|
27
|
-
<span>{message}</span>
|
|
28
|
-
</div>
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
if (fullScreen) {
|
|
32
|
-
return (
|
|
33
|
-
<div className="min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] flex items-center justify-center">
|
|
34
|
-
{content}
|
|
35
|
-
</div>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<div className="flex items-center justify-center py-20">
|
|
41
|
-
{content}
|
|
42
|
-
</div>
|
|
43
|
-
);
|
|
44
|
-
}
|