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