@burdenoff/microfe-botmanor 2026.813.1
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 +12 -0
- package/dist/botlit/BotlitRoutes.js +357 -0
- package/dist/botlit/BotlitRoutes.js.map +1 -0
- package/dist/botlit/BotmanorRoot.js +12 -0
- package/dist/botlit/BotmanorRoot.js.map +1 -0
- package/dist/botlit/BotmanorRootInner.js +101 -0
- package/dist/botlit/BotmanorRootInner.js.map +1 -0
- package/dist/botlit/components/Badge.js +39 -0
- package/dist/botlit/components/Badge.js.map +1 -0
- package/dist/botlit/components/Button.js +46 -0
- package/dist/botlit/components/Button.js.map +1 -0
- package/dist/botlit/components/Card.js +31 -0
- package/dist/botlit/components/Card.js.map +1 -0
- package/dist/botlit/components/ChannelSelectorSheet.js +130 -0
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -0
- package/dist/botlit/components/EmptyState.js +35 -0
- package/dist/botlit/components/EmptyState.js.map +1 -0
- package/dist/botlit/components/ErrorState.js +33 -0
- package/dist/botlit/components/ErrorState.js.map +1 -0
- package/dist/botlit/components/Input.js +59 -0
- package/dist/botlit/components/Input.js.map +1 -0
- package/dist/botlit/components/PageLayout.js +34 -0
- package/dist/botlit/components/PageLayout.js.map +1 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js +20 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -0
- package/dist/botlit/components/RouteLoader.js +52 -0
- package/dist/botlit/components/RouteLoader.js.map +1 -0
- package/dist/botlit/components/VersionHistoryPanel.js +144 -0
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -0
- package/dist/botlit/components/WorkspaceRequired.js +70 -0
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -0
- package/dist/botlit/hooks/index.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js +16 -0
- package/dist/botlit/hooks/internal/mutationInput.js.map +1 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +99 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -0
- package/dist/botlit/hooks/useA2A.js +184 -0
- package/dist/botlit/hooks/useA2A.js.map +1 -0
- package/dist/botlit/hooks/useAgents.js +469 -0
- package/dist/botlit/hooks/useAgents.js.map +1 -0
- package/dist/botlit/hooks/useBots.js +306 -0
- package/dist/botlit/hooks/useBots.js.map +1 -0
- package/dist/botlit/hooks/useBuckets.js +119 -0
- package/dist/botlit/hooks/useBuckets.js.map +1 -0
- package/dist/botlit/hooks/useChannels.js +213 -0
- package/dist/botlit/hooks/useChannels.js.map +1 -0
- package/dist/botlit/hooks/useConversations.js +64 -0
- package/dist/botlit/hooks/useConversations.js.map +1 -0
- package/dist/botlit/hooks/useExecutions.js +86 -0
- package/dist/botlit/hooks/useExecutions.js.map +1 -0
- package/dist/botlit/hooks/useKnowledgeBases.js +113 -0
- package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -0
- package/dist/botlit/hooks/useLLMProviders.js +83 -0
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -0
- package/dist/botlit/hooks/useMCPServers.js +134 -0
- package/dist/botlit/hooks/useMCPServers.js.map +1 -0
- package/dist/botlit/hooks/usePolicies.js +120 -0
- package/dist/botlit/hooks/usePolicies.js.map +1 -0
- package/dist/botlit/hooks/usePromptTemplates.js +161 -0
- package/dist/botlit/hooks/usePromptTemplates.js.map +1 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js +146 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -0
- package/dist/botlit/hooks/useSkills.js +132 -0
- package/dist/botlit/hooks/useSkills.js.map +1 -0
- package/dist/botlit/hooks/useStore.js +167 -0
- package/dist/botlit/hooks/useStore.js.map +1 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js +172 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -0
- package/dist/botlit/index.js +11 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +589 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/A2ARegistryPage.js +240 -0
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -0
- package/dist/botlit/pages/AgentBuilderPage.js +486 -0
- package/dist/botlit/pages/AgentBuilderPage.js.map +1 -0
- package/dist/botlit/pages/AgentDetailPage.js +517 -0
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -0
- package/dist/botlit/pages/AgentsListPage.js +294 -0
- package/dist/botlit/pages/AgentsListPage.js.map +1 -0
- package/dist/botlit/pages/BotChannelsTab.js +530 -0
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -0
- package/dist/botlit/pages/BotDetailPage.js +872 -0
- package/dist/botlit/pages/BotDetailPage.js.map +1 -0
- package/dist/botlit/pages/BotWorkflowTab.js +229 -0
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -0
- package/dist/botlit/pages/BotsListPage.js +313 -0
- package/dist/botlit/pages/BotsListPage.js.map +1 -0
- package/dist/botlit/pages/BucketsPage.js +604 -0
- package/dist/botlit/pages/BucketsPage.js.map +1 -0
- package/dist/botlit/pages/ChannelDetailPage.js +955 -0
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -0
- package/dist/botlit/pages/ChannelRoutesPage.js +218 -0
- package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -0
- package/dist/botlit/pages/ChannelsPage.js +304 -0
- package/dist/botlit/pages/ChannelsPage.js.map +1 -0
- package/dist/botlit/pages/ChatPage.js +247 -0
- package/dist/botlit/pages/ChatPage.js.map +1 -0
- package/dist/botlit/pages/DashboardPage.js +318 -0
- package/dist/botlit/pages/DashboardPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionDetailPage.js +313 -0
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -0
- package/dist/botlit/pages/ExecutionsPage.js +294 -0
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -0
- package/dist/botlit/pages/InstalledPackagesPage.js +619 -0
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +473 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js +150 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -0
- package/dist/botlit/pages/MCPServerDetailPage.js +550 -0
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -0
- package/dist/botlit/pages/MCPServersPage.js +321 -0
- package/dist/botlit/pages/MCPServersPage.js.map +1 -0
- package/dist/botlit/pages/PoliciesPage.js +224 -0
- package/dist/botlit/pages/PoliciesPage.js.map +1 -0
- package/dist/botlit/pages/PolicyDetailPage.js +861 -0
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptStudioPage.js +236 -0
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js +812 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -0
- package/dist/botlit/pages/PromptTemplatesPage.js +269 -0
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +559 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js +219 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -0
- package/dist/botlit/pages/SettingsPage.js +655 -0
- package/dist/botlit/pages/SettingsPage.js.map +1 -0
- package/dist/botlit/pages/SkillDetailPage.js +778 -0
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -0
- package/dist/botlit/pages/SkillsPage.js +206 -0
- package/dist/botlit/pages/SkillsPage.js.map +1 -0
- package/dist/botlit/pages/StorePackageDetailPage.js +462 -0
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -0
- package/dist/botlit/pages/StorePage.js +315 -0
- package/dist/botlit/pages/StorePage.js.map +1 -0
- package/dist/botlit/providers/BotlitProvider.js +93 -0
- package/dist/botlit/providers/BotlitProvider.js.map +1 -0
- package/dist/botlit/store/botlitStore.js +101 -0
- package/dist/botlit/store/botlitStore.js.map +1 -0
- package/dist/botlit/utils/cn.js +10 -0
- package/dist/botlit/utils/cn.js.map +1 -0
- package/dist/botlit/utils/formatters.js +37 -0
- package/dist/botlit/utils/formatters.js.map +1 -0
- package/dist/botlit/utils/navigation.js +9 -0
- package/dist/botlit/utils/navigation.js.map +1 -0
- package/dist/botlit/utils/unions.js +14 -0
- package/dist/botlit/utils/unions.js.map +1 -0
- package/dist/generated/global-operations.js +66 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.js +8 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.js +1591 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.js +12 -0
- package/dist/generated/wspace-types.js.map +1 -0
- package/dist/index.js +13 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +133 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
+
import { useBots as t } from "../hooks/useBots.js";
|
|
3
|
+
import { useAgent as n, useCreateAgent as r, useUpdateAgent as i } from "../hooks/useAgents.js";
|
|
4
|
+
import { useLLMModels as a, useLLMProviders as o } from "../hooks/useLLMProviders.js";
|
|
5
|
+
import { cn as s } from "../utils/cn.js";
|
|
6
|
+
import { PageLayout as c } from "../components/PageLayout.js";
|
|
7
|
+
import { Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p } from "../components/Card.js";
|
|
8
|
+
import { Button as m } from "../components/Button.js";
|
|
9
|
+
import { FormField as h, Input as g, Textarea as _ } from "../components/Input.js";
|
|
10
|
+
import { toUnion as v } from "../utils/unions.js";
|
|
11
|
+
import { useEffect as y, useState as b } from "react";
|
|
12
|
+
import { PagePurpose as x } from "@burdenoff/fe-libs/ui";
|
|
13
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
14
|
+
import { useParams as w } from "react-router";
|
|
15
|
+
import { ArrowLeft as T, Brain as E, Save as D, Settings as O, Sparkles as k, Wrench as A } from "lucide-react";
|
|
16
|
+
import { toast as j } from "sonner";
|
|
17
|
+
//#region src/botlit/pages/AgentBuilderPage.tsx
|
|
18
|
+
var M = [
|
|
19
|
+
"MCP_TOOLS",
|
|
20
|
+
"RAG",
|
|
21
|
+
"REASONING",
|
|
22
|
+
"MULTIMODAL",
|
|
23
|
+
"MEMORY",
|
|
24
|
+
"CODE_EXECUTION",
|
|
25
|
+
"A2A",
|
|
26
|
+
"WEB_BROWSING"
|
|
27
|
+
], N = [
|
|
28
|
+
"ASSISTANT",
|
|
29
|
+
"ANALYST",
|
|
30
|
+
"AUTOMATION",
|
|
31
|
+
"SPECIALIST"
|
|
32
|
+
];
|
|
33
|
+
function P(e) {
|
|
34
|
+
return e.flatMap((e) => {
|
|
35
|
+
let t = M.find((t) => t === e);
|
|
36
|
+
return t ? [t] : [];
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function F(e) {
|
|
40
|
+
return v(e, N, "ASSISTANT");
|
|
41
|
+
}
|
|
42
|
+
var I = () => {
|
|
43
|
+
let { agentId: v } = w(), { navigateTo: M, workspaceId: N } = e(), { data: I } = n(v), { data: L } = t(), { data: R } = o(), { data: z } = a(), [B, V] = r(), [H, U] = i(), W = !!v, [G, K] = b(0), [q, J] = b({
|
|
44
|
+
name: "",
|
|
45
|
+
slug: "",
|
|
46
|
+
description: "",
|
|
47
|
+
avatar: "🤖",
|
|
48
|
+
tags: [],
|
|
49
|
+
systemPrompt: "You are a helpful AI assistant. Be concise, accurate, and friendly.",
|
|
50
|
+
temperature: "0.7",
|
|
51
|
+
maxTokens: "2048",
|
|
52
|
+
type: "ASSISTANT",
|
|
53
|
+
status: "DRAFT",
|
|
54
|
+
capabilities: ["MCP_TOOLS", "REASONING"],
|
|
55
|
+
llmModelId: ""
|
|
56
|
+
});
|
|
57
|
+
y(() => {
|
|
58
|
+
if (I) {
|
|
59
|
+
let e = I;
|
|
60
|
+
J({
|
|
61
|
+
name: e.name,
|
|
62
|
+
slug: e.slug,
|
|
63
|
+
description: e.description || "",
|
|
64
|
+
avatar: "🤖",
|
|
65
|
+
tags: e.tagIds || [],
|
|
66
|
+
systemPrompt: e.systemPrompt || "",
|
|
67
|
+
temperature: String(e.temperature ?? .7),
|
|
68
|
+
maxTokens: String(e.maxTokens ?? 2048),
|
|
69
|
+
type: e.type || "ASSISTANT",
|
|
70
|
+
status: e.status || "DRAFT",
|
|
71
|
+
capabilities: e.capabilities || [],
|
|
72
|
+
llmModelId: e.llmModelId || ""
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}, [I]);
|
|
76
|
+
let Y = [
|
|
77
|
+
{
|
|
78
|
+
id: 0,
|
|
79
|
+
label: "Basic Info",
|
|
80
|
+
icon: /* @__PURE__ */ S(k, { size: 18 })
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 1,
|
|
84
|
+
label: "Prompt",
|
|
85
|
+
icon: /* @__PURE__ */ S(E, { size: 18 })
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 2,
|
|
89
|
+
label: "LLM Model",
|
|
90
|
+
icon: /* @__PURE__ */ S(O, { size: 18 })
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: 3,
|
|
94
|
+
label: "Tools & Knowledge",
|
|
95
|
+
icon: /* @__PURE__ */ S(A, { size: 18 })
|
|
96
|
+
}
|
|
97
|
+
], X = [
|
|
98
|
+
"🤖",
|
|
99
|
+
"🧠",
|
|
100
|
+
"💡",
|
|
101
|
+
"🎯",
|
|
102
|
+
"🔧",
|
|
103
|
+
"📊",
|
|
104
|
+
"🎧",
|
|
105
|
+
"💼",
|
|
106
|
+
"🔍",
|
|
107
|
+
"⚡",
|
|
108
|
+
"🌟",
|
|
109
|
+
"🚀"
|
|
110
|
+
], ee = [
|
|
111
|
+
{
|
|
112
|
+
key: "MCP_TOOLS",
|
|
113
|
+
label: "MCP Tools",
|
|
114
|
+
description: "Can use MCP tool servers"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
key: "RAG",
|
|
118
|
+
label: "RAG",
|
|
119
|
+
description: "Retrieval-augmented generation"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
key: "REASONING",
|
|
123
|
+
label: "Reasoning",
|
|
124
|
+
description: "Advanced reasoning"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
key: "MULTIMODAL",
|
|
128
|
+
label: "Multimodal",
|
|
129
|
+
description: "Process images & media"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
key: "MEMORY",
|
|
133
|
+
label: "Memory",
|
|
134
|
+
description: "Conversation memory"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: "CODE_EXECUTION",
|
|
138
|
+
label: "Code Execution",
|
|
139
|
+
description: "Execute code"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: "A2A",
|
|
143
|
+
label: "A2A",
|
|
144
|
+
description: "Agent-to-agent protocol"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
key: "WEB_BROWSING",
|
|
148
|
+
label: "Web Browsing",
|
|
149
|
+
description: "Browse the web"
|
|
150
|
+
}
|
|
151
|
+
], te = (e) => {
|
|
152
|
+
J((t) => ({
|
|
153
|
+
...t,
|
|
154
|
+
capabilities: t.capabilities.includes(e) ? t.capabilities.filter((t) => t !== e) : [...t.capabilities, e]
|
|
155
|
+
}));
|
|
156
|
+
}, Z = async () => {
|
|
157
|
+
let e = q.slug || q.name.toLowerCase().replace(/\s+/g, "-");
|
|
158
|
+
try {
|
|
159
|
+
if (W && v) await H({
|
|
160
|
+
agentId: v,
|
|
161
|
+
input: {
|
|
162
|
+
name: q.name,
|
|
163
|
+
slug: e,
|
|
164
|
+
description: q.description || void 0,
|
|
165
|
+
systemPrompt: q.systemPrompt,
|
|
166
|
+
temperature: parseFloat(q.temperature) || .7,
|
|
167
|
+
maxTokens: parseInt(q.maxTokens) || 2048,
|
|
168
|
+
capabilities: P(q.capabilities),
|
|
169
|
+
llmModelId: q.llmModelId || void 0,
|
|
170
|
+
type: F(q.type)
|
|
171
|
+
}
|
|
172
|
+
}), j.success(`Agent "${q.name}" updated successfully`), M(`agents/${v}`);
|
|
173
|
+
else {
|
|
174
|
+
if (!N) return;
|
|
175
|
+
let t = await B({
|
|
176
|
+
workspaceId: N,
|
|
177
|
+
name: q.name,
|
|
178
|
+
slug: e,
|
|
179
|
+
type: F(q.type),
|
|
180
|
+
systemPrompt: q.systemPrompt,
|
|
181
|
+
temperature: parseFloat(q.temperature) || .7,
|
|
182
|
+
maxTokens: parseInt(q.maxTokens) || 2048,
|
|
183
|
+
capabilities: P(q.capabilities),
|
|
184
|
+
llmModelId: q.llmModelId || void 0,
|
|
185
|
+
description: q.description || void 0
|
|
186
|
+
});
|
|
187
|
+
j.success(`Agent "${q.name}" created successfully`), t?.id && M(`agents/${t.id}`);
|
|
188
|
+
}
|
|
189
|
+
} catch (e) {
|
|
190
|
+
let t = e instanceof Error ? e.message : "Failed to save agent";
|
|
191
|
+
j.error(t);
|
|
192
|
+
}
|
|
193
|
+
}, Q = V.loading, $ = U.loading;
|
|
194
|
+
return /* @__PURE__ */ C(c, {
|
|
195
|
+
title: /* @__PURE__ */ C("div", {
|
|
196
|
+
className: "flex items-center gap-3",
|
|
197
|
+
children: [/* @__PURE__ */ S(m, {
|
|
198
|
+
variant: "ghost",
|
|
199
|
+
size: "icon",
|
|
200
|
+
onClick: () => M(v ? `agents/${v}` : "agents"),
|
|
201
|
+
children: /* @__PURE__ */ S(T, { size: 20 })
|
|
202
|
+
}), /* @__PURE__ */ S("span", { children: W ? "Edit Agent" : "Create New Agent" })]
|
|
203
|
+
}),
|
|
204
|
+
actions: /* @__PURE__ */ C("div", {
|
|
205
|
+
className: "flex gap-2",
|
|
206
|
+
children: [/* @__PURE__ */ S(m, {
|
|
207
|
+
variant: "outline",
|
|
208
|
+
onClick: () => M(v ? `agents/${v}` : "agents"),
|
|
209
|
+
children: "Cancel"
|
|
210
|
+
}), /* @__PURE__ */ S(m, {
|
|
211
|
+
leftIcon: /* @__PURE__ */ S(D, { size: 16 }),
|
|
212
|
+
onClick: Z,
|
|
213
|
+
isLoading: Q || $,
|
|
214
|
+
disabled: !q.name || !q.systemPrompt,
|
|
215
|
+
children: W ? "Save Changes" : "Create Agent"
|
|
216
|
+
})]
|
|
217
|
+
}),
|
|
218
|
+
children: [/* @__PURE__ */ C("div", {
|
|
219
|
+
className: "max-w-4xl mx-auto",
|
|
220
|
+
children: [
|
|
221
|
+
/* @__PURE__ */ S(x, {
|
|
222
|
+
className: "mb-6",
|
|
223
|
+
icon: /* @__PURE__ */ S(k, { size: 18 }),
|
|
224
|
+
children: "This guided builder walks you through everything an agent needs — its identity and system prompt, the model and parameters it runs on, and the tools and knowledge it can reach. Work through the steps, then create the agent and test it in chat. You can come back and edit any step later."
|
|
225
|
+
}),
|
|
226
|
+
/* @__PURE__ */ S("div", {
|
|
227
|
+
className: "flex items-center justify-between mb-8",
|
|
228
|
+
children: Y.map((e) => /* @__PURE__ */ C("button", {
|
|
229
|
+
onClick: () => K(e.id),
|
|
230
|
+
className: s("flex items-center gap-2 px-4 py-2 rounded-lg transition-colors", G === e.id ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:bg-accent"),
|
|
231
|
+
children: [e.icon, /* @__PURE__ */ S("span", {
|
|
232
|
+
className: "font-medium",
|
|
233
|
+
children: e.label
|
|
234
|
+
})]
|
|
235
|
+
}, e.id))
|
|
236
|
+
}),
|
|
237
|
+
/* @__PURE__ */ C("div", {
|
|
238
|
+
className: "space-y-6",
|
|
239
|
+
children: [
|
|
240
|
+
G === 0 && /* @__PURE__ */ C(l, {
|
|
241
|
+
treatment: "glass",
|
|
242
|
+
glow: !0,
|
|
243
|
+
children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ S(p, { children: "Basic Information" }), /* @__PURE__ */ S(d, { children: "Set up the agent's identity and purpose" })] }), /* @__PURE__ */ C(u, {
|
|
244
|
+
className: "space-y-6",
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("label", {
|
|
247
|
+
className: "text-sm font-medium",
|
|
248
|
+
children: "Avatar"
|
|
249
|
+
}), /* @__PURE__ */ S("div", {
|
|
250
|
+
className: "flex gap-2 mt-2 flex-wrap",
|
|
251
|
+
children: X.map((e) => /* @__PURE__ */ S("button", {
|
|
252
|
+
onClick: () => J({
|
|
253
|
+
...q,
|
|
254
|
+
avatar: e
|
|
255
|
+
}),
|
|
256
|
+
className: s("text-3xl p-2 rounded-lg border-2 transition-colors", q.avatar === e ? "border-primary bg-action-primary-bg/10" : "border-border-subtle hover:border-primary/50"),
|
|
257
|
+
children: e
|
|
258
|
+
}, e))
|
|
259
|
+
})] }),
|
|
260
|
+
/* @__PURE__ */ S(h, {
|
|
261
|
+
label: "Agent Name",
|
|
262
|
+
required: !0,
|
|
263
|
+
children: /* @__PURE__ */ S(g, {
|
|
264
|
+
placeholder: "e.g., Customer Support Agent",
|
|
265
|
+
value: q.name,
|
|
266
|
+
onChange: (e) => J({
|
|
267
|
+
...q,
|
|
268
|
+
name: e.target.value
|
|
269
|
+
})
|
|
270
|
+
})
|
|
271
|
+
}),
|
|
272
|
+
/* @__PURE__ */ S(h, {
|
|
273
|
+
label: "Slug",
|
|
274
|
+
description: "URL-friendly identifier",
|
|
275
|
+
children: /* @__PURE__ */ S(g, {
|
|
276
|
+
placeholder: "customer-support-agent",
|
|
277
|
+
value: q.slug,
|
|
278
|
+
onChange: (e) => J({
|
|
279
|
+
...q,
|
|
280
|
+
slug: e.target.value
|
|
281
|
+
})
|
|
282
|
+
})
|
|
283
|
+
}),
|
|
284
|
+
/* @__PURE__ */ S(h, {
|
|
285
|
+
label: "Description",
|
|
286
|
+
children: /* @__PURE__ */ S(_, {
|
|
287
|
+
placeholder: "Describe what this agent does...",
|
|
288
|
+
value: q.description,
|
|
289
|
+
onChange: (e) => J({
|
|
290
|
+
...q,
|
|
291
|
+
description: e.target.value
|
|
292
|
+
}),
|
|
293
|
+
rows: 3
|
|
294
|
+
})
|
|
295
|
+
}),
|
|
296
|
+
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("label", {
|
|
297
|
+
className: "text-sm font-medium mb-2 block",
|
|
298
|
+
children: "Capabilities"
|
|
299
|
+
}), /* @__PURE__ */ S("div", {
|
|
300
|
+
className: "grid grid-cols-2 md:grid-cols-3 gap-3",
|
|
301
|
+
children: ee.map((e) => /* @__PURE__ */ C("label", {
|
|
302
|
+
className: "flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent",
|
|
303
|
+
children: [/* @__PURE__ */ S("input", {
|
|
304
|
+
type: "checkbox",
|
|
305
|
+
className: "h-4 w-4 rounded border-border-default mt-0.5",
|
|
306
|
+
checked: q.capabilities.includes(e.key),
|
|
307
|
+
onChange: () => te(e.key)
|
|
308
|
+
}), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("p", {
|
|
309
|
+
className: "font-medium text-sm",
|
|
310
|
+
children: e.label
|
|
311
|
+
}), /* @__PURE__ */ S("p", {
|
|
312
|
+
className: "text-xs text-text-secondary",
|
|
313
|
+
children: e.description
|
|
314
|
+
})] })]
|
|
315
|
+
}, e.key))
|
|
316
|
+
})] })
|
|
317
|
+
]
|
|
318
|
+
})]
|
|
319
|
+
}),
|
|
320
|
+
G === 1 && /* @__PURE__ */ C(l, {
|
|
321
|
+
treatment: "glass",
|
|
322
|
+
glow: !0,
|
|
323
|
+
children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ S(p, { children: "Prompt Configuration" }), /* @__PURE__ */ S(d, { children: "Define how the agent communicates and behaves" })] }), /* @__PURE__ */ C(u, {
|
|
324
|
+
className: "space-y-6",
|
|
325
|
+
children: [/* @__PURE__ */ S(h, {
|
|
326
|
+
label: "System Prompt",
|
|
327
|
+
required: !0,
|
|
328
|
+
description: "The core instructions that define the agent's behavior",
|
|
329
|
+
children: /* @__PURE__ */ S(_, {
|
|
330
|
+
placeholder: "You are a helpful assistant...",
|
|
331
|
+
value: q.systemPrompt,
|
|
332
|
+
onChange: (e) => J({
|
|
333
|
+
...q,
|
|
334
|
+
systemPrompt: e.target.value
|
|
335
|
+
}),
|
|
336
|
+
rows: 8,
|
|
337
|
+
className: "font-mono text-sm"
|
|
338
|
+
})
|
|
339
|
+
}), /* @__PURE__ */ C("div", {
|
|
340
|
+
className: "grid grid-cols-2 gap-4",
|
|
341
|
+
children: [/* @__PURE__ */ S(h, {
|
|
342
|
+
label: "Temperature",
|
|
343
|
+
description: "Controls randomness (0-2)",
|
|
344
|
+
children: /* @__PURE__ */ S(g, {
|
|
345
|
+
type: "number",
|
|
346
|
+
step: "0.1",
|
|
347
|
+
min: "0",
|
|
348
|
+
max: "2",
|
|
349
|
+
value: q.temperature,
|
|
350
|
+
onChange: (e) => J({
|
|
351
|
+
...q,
|
|
352
|
+
temperature: e.target.value
|
|
353
|
+
})
|
|
354
|
+
})
|
|
355
|
+
}), /* @__PURE__ */ S(h, {
|
|
356
|
+
label: "Max Tokens",
|
|
357
|
+
description: "Maximum response length",
|
|
358
|
+
children: /* @__PURE__ */ S(g, {
|
|
359
|
+
type: "number",
|
|
360
|
+
step: "256",
|
|
361
|
+
min: "1",
|
|
362
|
+
value: q.maxTokens,
|
|
363
|
+
onChange: (e) => J({
|
|
364
|
+
...q,
|
|
365
|
+
maxTokens: e.target.value
|
|
366
|
+
})
|
|
367
|
+
})
|
|
368
|
+
})]
|
|
369
|
+
})]
|
|
370
|
+
})]
|
|
371
|
+
}),
|
|
372
|
+
G === 2 && /* @__PURE__ */ C(l, {
|
|
373
|
+
treatment: "glass",
|
|
374
|
+
glow: !0,
|
|
375
|
+
children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ S(p, { children: "LLM Configuration" }), /* @__PURE__ */ S(d, { children: "Select the LLM model for this agent" })] }), /* @__PURE__ */ C(u, {
|
|
376
|
+
className: "space-y-6",
|
|
377
|
+
children: [
|
|
378
|
+
/* @__PURE__ */ S(h, {
|
|
379
|
+
label: "LLM Model",
|
|
380
|
+
description: "Select a model for this agent",
|
|
381
|
+
children: /* @__PURE__ */ C("select", {
|
|
382
|
+
className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
|
|
383
|
+
value: q.llmModelId,
|
|
384
|
+
onChange: (e) => J({
|
|
385
|
+
...q,
|
|
386
|
+
llmModelId: e.target.value
|
|
387
|
+
}),
|
|
388
|
+
children: [/* @__PURE__ */ S("option", {
|
|
389
|
+
value: "",
|
|
390
|
+
children: "Select a model..."
|
|
391
|
+
}), z?.map((e) => /* @__PURE__ */ C("option", {
|
|
392
|
+
value: e.id,
|
|
393
|
+
children: [
|
|
394
|
+
e.name,
|
|
395
|
+
" (",
|
|
396
|
+
e.modelId,
|
|
397
|
+
")"
|
|
398
|
+
]
|
|
399
|
+
}, e.id))]
|
|
400
|
+
})
|
|
401
|
+
}),
|
|
402
|
+
/* @__PURE__ */ C("div", {
|
|
403
|
+
className: "p-4 bg-bg-sunken rounded-lg",
|
|
404
|
+
children: [/* @__PURE__ */ S("h4", {
|
|
405
|
+
className: "text-sm font-medium mb-2",
|
|
406
|
+
children: "Available Providers"
|
|
407
|
+
}), /* @__PURE__ */ C("div", {
|
|
408
|
+
className: "grid grid-cols-2 gap-2",
|
|
409
|
+
children: [R?.map((e) => /* @__PURE__ */ C("div", {
|
|
410
|
+
className: "text-sm",
|
|
411
|
+
children: [/* @__PURE__ */ S("span", {
|
|
412
|
+
className: "font-medium",
|
|
413
|
+
children: e.name
|
|
414
|
+
}), /* @__PURE__ */ C("span", {
|
|
415
|
+
className: "text-text-secondary ml-2",
|
|
416
|
+
children: [
|
|
417
|
+
"(",
|
|
418
|
+
e.type,
|
|
419
|
+
")"
|
|
420
|
+
]
|
|
421
|
+
})]
|
|
422
|
+
}, e.id)), !R?.length && /* @__PURE__ */ S("p", {
|
|
423
|
+
className: "text-sm text-text-secondary",
|
|
424
|
+
children: "No providers configured"
|
|
425
|
+
})]
|
|
426
|
+
})]
|
|
427
|
+
}),
|
|
428
|
+
!z?.length && /* @__PURE__ */ S("p", {
|
|
429
|
+
className: "text-sm text-text-secondary",
|
|
430
|
+
children: "No models available. Configure a provider and add models in Settings."
|
|
431
|
+
})
|
|
432
|
+
]
|
|
433
|
+
})]
|
|
434
|
+
}),
|
|
435
|
+
G === 3 && /* @__PURE__ */ S("div", {
|
|
436
|
+
className: "space-y-6",
|
|
437
|
+
children: /* @__PURE__ */ C(l, {
|
|
438
|
+
treatment: "glass",
|
|
439
|
+
glow: !0,
|
|
440
|
+
children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ C(p, {
|
|
441
|
+
className: "flex items-center gap-2",
|
|
442
|
+
children: [/* @__PURE__ */ S(A, { size: 18 }), "Tools & Knowledge"]
|
|
443
|
+
}), /* @__PURE__ */ S(d, { children: "Configure tools and knowledge bases for this agent" })] }), /* @__PURE__ */ S(u, { children: /* @__PURE__ */ C("div", {
|
|
444
|
+
className: "text-center py-12 text-text-secondary",
|
|
445
|
+
children: [
|
|
446
|
+
/* @__PURE__ */ S(A, { className: "h-10 w-10 mx-auto mb-3 opacity-50" }),
|
|
447
|
+
/* @__PURE__ */ S("p", {
|
|
448
|
+
className: "font-medium",
|
|
449
|
+
children: "Tools & Knowledge coming soon"
|
|
450
|
+
}),
|
|
451
|
+
/* @__PURE__ */ S("p", {
|
|
452
|
+
className: "text-sm mt-2",
|
|
453
|
+
children: "MCP tool connections and knowledge base bindings will be configurable here in a future update."
|
|
454
|
+
})
|
|
455
|
+
]
|
|
456
|
+
}) })]
|
|
457
|
+
})
|
|
458
|
+
}),
|
|
459
|
+
/* @__PURE__ */ C("div", {
|
|
460
|
+
className: "flex justify-between pt-6",
|
|
461
|
+
children: [/* @__PURE__ */ S(m, {
|
|
462
|
+
variant: "outline",
|
|
463
|
+
onClick: () => K(Math.max(0, G - 1)),
|
|
464
|
+
disabled: G === 0,
|
|
465
|
+
children: "Previous"
|
|
466
|
+
}), G < Y.length - 1 ? /* @__PURE__ */ S(m, {
|
|
467
|
+
onClick: () => K(G + 1),
|
|
468
|
+
children: "Next"
|
|
469
|
+
}) : /* @__PURE__ */ S(m, {
|
|
470
|
+
leftIcon: /* @__PURE__ */ S(D, { size: 16 }),
|
|
471
|
+
onClick: Z,
|
|
472
|
+
isLoading: Q || $,
|
|
473
|
+
disabled: !q.name || !q.systemPrompt,
|
|
474
|
+
children: W ? "Save Changes" : "Create Agent"
|
|
475
|
+
})]
|
|
476
|
+
})
|
|
477
|
+
]
|
|
478
|
+
})
|
|
479
|
+
]
|
|
480
|
+
}), L && L.length > 0 && null]
|
|
481
|
+
});
|
|
482
|
+
};
|
|
483
|
+
//#endregion
|
|
484
|
+
export { I as AgentBuilderPage };
|
|
485
|
+
|
|
486
|
+
//# sourceMappingURL=AgentBuilderPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentBuilderPage.js","names":[],"sources":["../../../src/botlit/pages/AgentBuilderPage.tsx"],"sourcesContent":["/**\n * Agent Builder Page\n * @module botlit/pages\n *\n * Creates/edits agents with real GraphQL BotlitAgent type:\n * - systemPrompt (string), temperature, maxTokens\n * - capabilities (enum array: MCP_TOOLS, RAG, REASONING, etc.)\n * - llmModelId (reference to LLM model)\n * - type (ASSISTANT, ANALYST, AUTOMATION, SPECIALIST)\n */\n\nimport type { FC } from 'react';\nimport { useState, useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { ArrowLeft, Save, Brain, Wrench, Settings, Sparkles } from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { useAgent, useCreateAgent, useUpdateAgent } from '../hooks/useAgents';\nimport { useBots } from '../hooks/useBots';\nimport { useLLMProviders, useLLMModels } from '../hooks/useLLMProviders';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\n\n/** `BotlitAgentCapability` values the builder offers. */\nconst AGENT_CAPABILITIES = [\n 'MCP_TOOLS',\n 'RAG',\n 'REASONING',\n 'MULTIMODAL',\n 'MEMORY',\n 'CODE_EXECUTION',\n 'A2A',\n 'WEB_BROWSING',\n] as const;\ntype AgentCapability = (typeof AGENT_CAPABILITIES)[number];\n\n/** `BotlitAgentType` values the builder offers. */\nconst AGENT_TYPES = ['ASSISTANT', 'ANALYST', 'AUTOMATION', 'SPECIALIST'] as const;\n\n/** Drops any capability the schema does not declare rather than guessing one. */\nfunction toCapabilities(values: string[]): AgentCapability[] {\n return values.flatMap((value) => {\n const match = AGENT_CAPABILITIES.find((capability) => capability === value);\n return match ? [match] : [];\n });\n}\n\nfunction toAgentType(value: string): (typeof AGENT_TYPES)[number] {\n return toUnion(value, AGENT_TYPES, 'ASSISTANT');\n}\n\ninterface FormDataType {\n name: string;\n slug: string;\n description: string;\n avatar: string;\n tags: string[];\n // Flat fields matching real GraphQL API\n systemPrompt: string;\n temperature: string;\n maxTokens: string;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId: string;\n}\n\nexport const AgentBuilderPage: FC = () => {\n const { agentId } = useParams();\n const { navigateTo, workspaceId } = useBotlit();\n const { data: existingAgent } = useAgent(agentId);\n const { data: bots } = useBots();\n const { data: providers } = useLLMProviders();\n const { data: llmModels } = useLLMModels();\n const [createAgent, createAgentResult] = useCreateAgent();\n const [updateAgent, updateAgentResult] = useUpdateAgent();\n\n const isEditing = !!agentId;\n const [activeStep, setActiveStep] = useState(0);\n\n const [formData, setFormData] = useState<FormDataType>({\n name: '',\n slug: '',\n description: '',\n avatar: '🤖',\n tags: [],\n systemPrompt: 'You are a helpful AI assistant. Be concise, accurate, and friendly.',\n temperature: '0.7',\n maxTokens: '2048',\n type: 'ASSISTANT',\n status: 'DRAFT',\n capabilities: ['MCP_TOOLS', 'REASONING'],\n llmModelId: '',\n });\n\n // Update form when existing agent loads\n useEffect(() => {\n if (existingAgent) {\n const agent = existingAgent as {\n name: string;\n slug: string;\n description?: string;\n systemPrompt: string;\n temperature?: number;\n maxTokens?: number;\n type: string;\n status: string;\n capabilities: string[];\n llmModelId?: string;\n tagIds?: string[];\n };\n setFormData({\n name: agent.name,\n slug: agent.slug,\n description: agent.description || '',\n avatar: '🤖',\n tags: agent.tagIds || [],\n systemPrompt: agent.systemPrompt || '',\n temperature: String(agent.temperature ?? 0.7),\n maxTokens: String(agent.maxTokens ?? 2048),\n type: agent.type || 'ASSISTANT',\n status: agent.status || 'DRAFT',\n capabilities: agent.capabilities || [],\n llmModelId: agent.llmModelId || '',\n });\n }\n }, [existingAgent]);\n\n const steps = [\n { id: 0, label: 'Basic Info', icon: <Sparkles size={18} /> },\n { id: 1, label: 'Prompt', icon: <Brain size={18} /> },\n { id: 2, label: 'LLM Model', icon: <Settings size={18} /> },\n { id: 3, label: 'Tools & Knowledge', icon: <Wrench size={18} /> },\n ];\n\n const avatars = ['🤖', '🧠', '💡', '🎯', '🔧', '📊', '🎧', '💼', '🔍', '⚡', '🌟', '🚀'];\n\n const allCapabilities: { key: AgentCapability; label: string; description: string }[] = [\n { key: 'MCP_TOOLS', label: 'MCP Tools', description: 'Can use MCP tool servers' },\n { key: 'RAG', label: 'RAG', description: 'Retrieval-augmented generation' },\n { key: 'REASONING', label: 'Reasoning', description: 'Advanced reasoning' },\n { key: 'MULTIMODAL', label: 'Multimodal', description: 'Process images & media' },\n { key: 'MEMORY', label: 'Memory', description: 'Conversation memory' },\n { key: 'CODE_EXECUTION', label: 'Code Execution', description: 'Execute code' },\n { key: 'A2A', label: 'A2A', description: 'Agent-to-agent protocol' },\n { key: 'WEB_BROWSING', label: 'Web Browsing', description: 'Browse the web' },\n ];\n\n const toggleCapability = (cap: string) => {\n setFormData((prev) => ({\n ...prev,\n capabilities: prev.capabilities.includes(cap)\n ? prev.capabilities.filter((c) => c !== cap)\n : [...prev.capabilities, cap],\n }));\n };\n\n const handleSave = async () => {\n const slug = formData.slug || formData.name.toLowerCase().replace(/\\s+/g, '-');\n\n try {\n if (isEditing && agentId) {\n await updateAgent({\n agentId,\n input: {\n name: formData.name,\n slug,\n description: formData.description || undefined,\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n type: toAgentType(formData.type),\n },\n });\n toast.success(`Agent \"${formData.name}\" updated successfully`);\n navigateTo(`agents/${agentId}`);\n } else {\n if (!workspaceId) return;\n const agent = await createAgent({\n workspaceId,\n name: formData.name,\n slug,\n type: toAgentType(formData.type),\n systemPrompt: formData.systemPrompt,\n temperature: parseFloat(formData.temperature) || 0.7,\n maxTokens: parseInt(formData.maxTokens) || 2048,\n capabilities: toCapabilities(formData.capabilities),\n llmModelId: formData.llmModelId || undefined,\n description: formData.description || undefined,\n });\n toast.success(`Agent \"${formData.name}\" created successfully`);\n if (agent?.id) navigateTo(`agents/${agent.id}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to save agent';\n toast.error(message);\n }\n };\n\n const isCreating = createAgentResult.loading;\n const isUpdating = updateAgentResult.loading;\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n <ArrowLeft size={20} />\n </Button>\n <span>{isEditing ? 'Edit Agent' : 'Create New Agent'}</span>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => navigateTo(agentId ? `agents/${agentId}` : 'agents')}\n >\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n </div>\n }\n >\n <div className=\"max-w-4xl mx-auto\">\n <PagePurpose className=\"mb-6\" icon={<Sparkles size={18} />}>\n This guided builder walks you through everything an agent needs — its identity and system\n prompt, the model and parameters it runs on, and the tools and knowledge it can reach.\n Work through the steps, then create the agent and test it in chat. You can come back and\n edit any step later.\n </PagePurpose>\n\n {/* Steps */}\n <div className=\"flex items-center justify-between mb-8\">\n {steps.map((step) => (\n <button\n key={step.id}\n onClick={() => setActiveStep(step.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 rounded-lg transition-colors',\n activeStep === step.id\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent'\n )}\n >\n {step.icon}\n <span className=\"font-medium\">{step.label}</span>\n </button>\n ))}\n </div>\n\n {/* Step Content */}\n <div className=\"space-y-6\">\n {activeStep === 0 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n <CardDescription>Set up the agent's identity and purpose</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Avatar Selection */}\n <div>\n <label className=\"text-sm font-medium\">Avatar</label>\n <div className=\"flex gap-2 mt-2 flex-wrap\">\n {avatars.map((avatar) => (\n <button\n key={avatar}\n onClick={() => setFormData({ ...formData, avatar })}\n className={cn(\n 'text-3xl p-2 rounded-lg border-2 transition-colors',\n formData.avatar === avatar\n ? 'border-primary bg-action-primary-bg/10'\n : 'border-border-subtle hover:border-primary/50'\n )}\n >\n {avatar}\n </button>\n ))}\n </div>\n </div>\n\n <FormField label=\"Agent Name\" required>\n <Input\n placeholder=\"e.g., Customer Support Agent\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Slug\" description=\"URL-friendly identifier\">\n <Input\n placeholder=\"customer-support-agent\"\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"Describe what this agent does...\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n {/* Capabilities */}\n <div>\n <label className=\"text-sm font-medium mb-2 block\">Capabilities</label>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {allCapabilities.map((cap) => (\n <label\n key={cap.key}\n className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-border-default mt-0.5\"\n checked={formData.capabilities.includes(cap.key)}\n onChange={() => toggleCapability(cap.key)}\n />\n <div>\n <p className=\"font-medium text-sm\">{cap.label}</p>\n <p className=\"text-xs text-text-secondary\">{cap.description}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 1 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>Prompt Configuration</CardTitle>\n <CardDescription>Define how the agent communicates and behaves</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField\n label=\"System Prompt\"\n required\n description=\"The core instructions that define the agent's behavior\"\n >\n <Textarea\n placeholder=\"You are a helpful assistant...\"\n value={formData.systemPrompt}\n onChange={(e) => setFormData({ ...formData, systemPrompt: e.target.value })}\n rows={8}\n className=\"font-mono text-sm\"\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Temperature\" description=\"Controls randomness (0-2)\">\n <Input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"2\"\n value={formData.temperature}\n onChange={(e) => setFormData({ ...formData, temperature: e.target.value })}\n />\n </FormField>\n <FormField label=\"Max Tokens\" description=\"Maximum response length\">\n <Input\n type=\"number\"\n step=\"256\"\n min=\"1\"\n value={formData.maxTokens}\n onChange={(e) => setFormData({ ...formData, maxTokens: e.target.value })}\n />\n </FormField>\n </div>\n </CardContent>\n </Card>\n )}\n\n {activeStep === 2 && (\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle>LLM Configuration</CardTitle>\n <CardDescription>Select the LLM model for this agent</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <FormField label=\"LLM Model\" description=\"Select a model for this agent\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.llmModelId}\n onChange={(e) => setFormData({ ...formData, llmModelId: e.target.value })}\n >\n <option value=\"\">Select a model...</option>\n {llmModels?.map((model: { id: string; name: string; modelId: string }) => (\n <option key={model.id} value={model.id}>\n {model.name} ({model.modelId})\n </option>\n ))}\n </select>\n </FormField>\n\n <div className=\"p-4 bg-bg-sunken rounded-lg\">\n <h4 className=\"text-sm font-medium mb-2\">Available Providers</h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {providers?.map((provider: { id: string; name: string; type: string }) => (\n <div key={provider.id} className=\"text-sm\">\n <span className=\"font-medium\">{provider.name}</span>\n <span className=\"text-text-secondary ml-2\">({provider.type})</span>\n </div>\n ))}\n {!providers?.length && (\n <p className=\"text-sm text-text-secondary\">No providers configured</p>\n )}\n </div>\n </div>\n\n {!llmModels?.length && (\n <p className=\"text-sm text-text-secondary\">\n No models available. Configure a provider and add models in Settings.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {activeStep === 3 && (\n <div className=\"space-y-6\">\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools & Knowledge\n </CardTitle>\n <CardDescription>\n Configure tools and knowledge bases for this agent\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-12 text-text-secondary\">\n <Wrench className=\"h-10 w-10 mx-auto mb-3 opacity-50\" />\n <p className=\"font-medium\">Tools & Knowledge coming soon</p>\n <p className=\"text-sm mt-2\">\n MCP tool connections and knowledge base bindings will be configurable here in\n a future update.\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between pt-6\">\n <Button\n variant=\"outline\"\n onClick={() => setActiveStep(Math.max(0, activeStep - 1))}\n disabled={activeStep === 0}\n >\n Previous\n </Button>\n {activeStep < steps.length - 1 ? (\n <Button onClick={() => setActiveStep(activeStep + 1)}>Next</Button>\n ) : (\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleSave}\n isLoading={isCreating || isUpdating}\n disabled={!formData.name || !formData.systemPrompt}\n >\n {isEditing ? 'Save Changes' : 'Create Agent'}\n </Button>\n )}\n </div>\n </div>\n </div>\n\n {/* Show bots dropdown if needed */}\n {bots && bots.length > 0 && null}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|