@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,550 @@
|
|
|
1
|
+
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
+
import { isMCPServerHealthy as t, mcpServerDescription as n, mcpServerEndpoint as r, useCreateMCPServer as i, useDeleteMCPServer as ee, useMCPResources as te, useMCPServer as a, useMCPTools as o, useTestMCPConnection as s, useUpdateMCPServer as c } from "../hooks/useMCPServers.js";
|
|
3
|
+
import { formatRelativeTime as l } from "../utils/formatters.js";
|
|
4
|
+
import { PageLayout as u } from "../components/PageLayout.js";
|
|
5
|
+
import { Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h } from "../components/Card.js";
|
|
6
|
+
import { Button as g } from "../components/Button.js";
|
|
7
|
+
import { Badge as _, StatusBadge as ne } from "../components/Badge.js";
|
|
8
|
+
import { isNative as v, nativeImpact as y, nativeNotify as b } from "../../utils/nativeBridge.js";
|
|
9
|
+
import { EmptyState as x } from "../components/EmptyState.js";
|
|
10
|
+
import { FormField as S, Input as C, Textarea as w } from "../components/Input.js";
|
|
11
|
+
import "../hooks/index.js";
|
|
12
|
+
import { useMemo as T, useState as E } from "react";
|
|
13
|
+
import { GlassCard as re, PagePurpose as ie } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
15
|
+
import { useParams as ae } from "react-router";
|
|
16
|
+
import { AlertTriangle as oe, ArrowLeft as se, CheckCircle as ce, Clock as le, Edit as ue, ExternalLink as de, Plug as A, PlugZap as j, RefreshCw as M, Save as N, Server as P, Settings as F, Trash2 as I, Wrench as L, XCircle as R } from "lucide-react";
|
|
17
|
+
import { toast as z } from "sonner";
|
|
18
|
+
//#region src/botlit/pages/MCPServerDetailPage.tsx
|
|
19
|
+
function B(e, t) {
|
|
20
|
+
let n = e?.[t];
|
|
21
|
+
return typeof n == "string" && n !== "" ? n : void 0;
|
|
22
|
+
}
|
|
23
|
+
var V = ({ isNew: V }) => {
|
|
24
|
+
let { serverId: H } = ae(), { navigateTo: U } = e(), { data: W, loading: fe, refetch: G } = a(V ? void 0 : H), { data: K } = o(V ? void 0 : H), { data: q } = te(V ? void 0 : H), [pe, me] = i(), [he, ge] = c(), [_e, ve] = ee(), [ye, be] = s(), [xe, J] = E(!1), [Se, Y] = E(!1), [X, Z] = E({
|
|
25
|
+
name: "",
|
|
26
|
+
description: "",
|
|
27
|
+
transport: "HTTP_JSON",
|
|
28
|
+
baseUrl: "",
|
|
29
|
+
authMethod: "NONE",
|
|
30
|
+
secretRefId: ""
|
|
31
|
+
}), [Q, Ce] = E(null), $ = T(() => K.find((e) => e.name === Q) ?? null, [K, Q]), we = async () => {
|
|
32
|
+
if (!(!X.name || !X.baseUrl)) try {
|
|
33
|
+
let e = await pe({
|
|
34
|
+
name: X.name,
|
|
35
|
+
type: X.transport,
|
|
36
|
+
config: {
|
|
37
|
+
url: X.baseUrl,
|
|
38
|
+
description: X.description,
|
|
39
|
+
authMethod: X.authMethod,
|
|
40
|
+
secretRefId: X.secretRefId || void 0
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
z.success(`Connected "${e.name}"`), U(`mcp/${e.id}`);
|
|
44
|
+
} catch (e) {
|
|
45
|
+
z.error(e instanceof Error ? e.message : "Failed to connect MCP server");
|
|
46
|
+
}
|
|
47
|
+
}, Te = async () => {
|
|
48
|
+
if (H) try {
|
|
49
|
+
await ye(H) ? z.success("MCP server is reachable") : z.error("MCP server did not respond"), G();
|
|
50
|
+
} catch (e) {
|
|
51
|
+
z.error(e instanceof Error ? e.message : "Failed to test MCP connection");
|
|
52
|
+
}
|
|
53
|
+
}, Ee = async () => {
|
|
54
|
+
if (!(!H || !X.name)) try {
|
|
55
|
+
await he({
|
|
56
|
+
serverId: H,
|
|
57
|
+
input: {
|
|
58
|
+
name: X.name,
|
|
59
|
+
config: {
|
|
60
|
+
url: X.baseUrl,
|
|
61
|
+
description: X.description,
|
|
62
|
+
authMethod: X.authMethod,
|
|
63
|
+
secretRefId: X.secretRefId || void 0
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}), z.success("MCP server updated"), G(), J(!1);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
z.error(e instanceof Error ? e.message : "Failed to update MCP server");
|
|
69
|
+
}
|
|
70
|
+
}, De = async () => {
|
|
71
|
+
if (H) try {
|
|
72
|
+
await _e(H), v() && b("success"), z.success("MCP server disconnected"), U("mcp");
|
|
73
|
+
} catch (e) {
|
|
74
|
+
v() && b("error"), z.error(e instanceof Error ? e.message : "Failed to disconnect MCP server");
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
return V ? /* @__PURE__ */ O(u, {
|
|
78
|
+
title: "Add MCP Server",
|
|
79
|
+
description: "Connect a new Model Context Protocol server",
|
|
80
|
+
actions: /* @__PURE__ */ k("div", {
|
|
81
|
+
className: "flex gap-2",
|
|
82
|
+
children: [/* @__PURE__ */ O(g, {
|
|
83
|
+
variant: "outline",
|
|
84
|
+
onClick: () => U("mcp"),
|
|
85
|
+
children: "Cancel"
|
|
86
|
+
}), /* @__PURE__ */ O(g, {
|
|
87
|
+
leftIcon: /* @__PURE__ */ O(N, { size: 16 }),
|
|
88
|
+
onClick: we,
|
|
89
|
+
isLoading: me.loading,
|
|
90
|
+
disabled: !X.name || !X.baseUrl,
|
|
91
|
+
children: "Connect"
|
|
92
|
+
})]
|
|
93
|
+
}),
|
|
94
|
+
children: /* @__PURE__ */ O("div", {
|
|
95
|
+
className: "max-w-2xl space-y-6",
|
|
96
|
+
children: /* @__PURE__ */ k(d, { children: [/* @__PURE__ */ O(m, { children: /* @__PURE__ */ O(h, { children: "Server Configuration" }) }), /* @__PURE__ */ k(f, {
|
|
97
|
+
className: "space-y-4",
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ O(S, {
|
|
100
|
+
label: "Server Name",
|
|
101
|
+
required: !0,
|
|
102
|
+
children: /* @__PURE__ */ O(C, {
|
|
103
|
+
placeholder: "e.g., GitHub MCP Server",
|
|
104
|
+
value: X.name,
|
|
105
|
+
onChange: (e) => Z({
|
|
106
|
+
...X,
|
|
107
|
+
name: e.target.value
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ O(S, {
|
|
112
|
+
label: "Description",
|
|
113
|
+
children: /* @__PURE__ */ O(w, {
|
|
114
|
+
placeholder: "What capabilities does this server provide?",
|
|
115
|
+
value: X.description,
|
|
116
|
+
onChange: (e) => Z({
|
|
117
|
+
...X,
|
|
118
|
+
description: e.target.value
|
|
119
|
+
}),
|
|
120
|
+
rows: 3
|
|
121
|
+
})
|
|
122
|
+
}),
|
|
123
|
+
/* @__PURE__ */ k("div", {
|
|
124
|
+
className: "grid grid-cols-2 gap-4",
|
|
125
|
+
children: [/* @__PURE__ */ O(S, {
|
|
126
|
+
label: "Transport",
|
|
127
|
+
required: !0,
|
|
128
|
+
children: /* @__PURE__ */ k("select", {
|
|
129
|
+
className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
|
|
130
|
+
value: X.transport,
|
|
131
|
+
onChange: (e) => Z({
|
|
132
|
+
...X,
|
|
133
|
+
transport: e.target.value
|
|
134
|
+
}),
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ O("option", {
|
|
137
|
+
value: "HTTP_JSON",
|
|
138
|
+
children: "HTTP JSON"
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ O("option", {
|
|
141
|
+
value: "JSON_RPC",
|
|
142
|
+
children: "JSON RPC"
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ O("option", {
|
|
145
|
+
value: "SSE",
|
|
146
|
+
children: "Server-Sent Events"
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ O("option", {
|
|
149
|
+
value: "CUSTOM",
|
|
150
|
+
children: "Custom"
|
|
151
|
+
})
|
|
152
|
+
]
|
|
153
|
+
})
|
|
154
|
+
}), /* @__PURE__ */ O(S, {
|
|
155
|
+
label: "Auth Method",
|
|
156
|
+
children: /* @__PURE__ */ k("select", {
|
|
157
|
+
className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
|
|
158
|
+
value: X.authMethod,
|
|
159
|
+
onChange: (e) => Z({
|
|
160
|
+
...X,
|
|
161
|
+
authMethod: e.target.value
|
|
162
|
+
}),
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ O("option", {
|
|
165
|
+
value: "NONE",
|
|
166
|
+
children: "None"
|
|
167
|
+
}),
|
|
168
|
+
/* @__PURE__ */ O("option", {
|
|
169
|
+
value: "API_KEY",
|
|
170
|
+
children: "API Key"
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ O("option", {
|
|
173
|
+
value: "OAUTH",
|
|
174
|
+
children: "OAuth"
|
|
175
|
+
}),
|
|
176
|
+
/* @__PURE__ */ O("option", {
|
|
177
|
+
value: "CUSTOM_HEADER",
|
|
178
|
+
children: "Custom Header"
|
|
179
|
+
})
|
|
180
|
+
]
|
|
181
|
+
})
|
|
182
|
+
})]
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ O(S, {
|
|
185
|
+
label: "Base URL",
|
|
186
|
+
required: !0,
|
|
187
|
+
children: /* @__PURE__ */ O(C, {
|
|
188
|
+
placeholder: "e.g., https://mcp.example.com",
|
|
189
|
+
value: X.baseUrl,
|
|
190
|
+
onChange: (e) => Z({
|
|
191
|
+
...X,
|
|
192
|
+
baseUrl: e.target.value
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
}),
|
|
196
|
+
X.authMethod !== "NONE" && /* @__PURE__ */ O(S, {
|
|
197
|
+
label: "Secret Reference ID",
|
|
198
|
+
children: /* @__PURE__ */ O(C, {
|
|
199
|
+
placeholder: "e.g., secret-mcp-github",
|
|
200
|
+
value: X.secretRefId,
|
|
201
|
+
onChange: (e) => Z({
|
|
202
|
+
...X,
|
|
203
|
+
secretRefId: e.target.value
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
})
|
|
207
|
+
]
|
|
208
|
+
})] })
|
|
209
|
+
})
|
|
210
|
+
}) : fe ? /* @__PURE__ */ O(u, {
|
|
211
|
+
title: "Loading...",
|
|
212
|
+
children: /* @__PURE__ */ O("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
|
|
213
|
+
}) : W ? /* @__PURE__ */ O(u, {
|
|
214
|
+
title: /* @__PURE__ */ k("div", {
|
|
215
|
+
className: "flex items-center gap-3",
|
|
216
|
+
children: [
|
|
217
|
+
/* @__PURE__ */ O(g, {
|
|
218
|
+
variant: "ghost",
|
|
219
|
+
size: "icon",
|
|
220
|
+
onClick: () => U("mcp"),
|
|
221
|
+
children: /* @__PURE__ */ O(se, { size: 20 })
|
|
222
|
+
}),
|
|
223
|
+
/* @__PURE__ */ O("div", {
|
|
224
|
+
className: "p-2 rounded-lg bg-action-primary-bg/10",
|
|
225
|
+
children: t(W.status) ? /* @__PURE__ */ O(j, { className: "h-6 w-6 text-status-success-text" }) : /* @__PURE__ */ O(A, { className: "h-6 w-6 text-text-secondary" })
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("div", {
|
|
228
|
+
className: "flex items-center gap-2",
|
|
229
|
+
children: [/* @__PURE__ */ O("span", { children: W.name }), /* @__PURE__ */ O(ne, { status: W.status })]
|
|
230
|
+
}), /* @__PURE__ */ O("p", {
|
|
231
|
+
className: "text-sm font-normal text-text-secondary",
|
|
232
|
+
children: n(W)
|
|
233
|
+
})] })
|
|
234
|
+
]
|
|
235
|
+
}),
|
|
236
|
+
actions: /* @__PURE__ */ k("div", {
|
|
237
|
+
className: "flex gap-2",
|
|
238
|
+
children: [/* @__PURE__ */ O(g, {
|
|
239
|
+
variant: "outline",
|
|
240
|
+
leftIcon: /* @__PURE__ */ O(M, { size: 16 }),
|
|
241
|
+
onClick: Te,
|
|
242
|
+
isLoading: be.loading,
|
|
243
|
+
children: "Test"
|
|
244
|
+
}), xe ? /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O(g, {
|
|
245
|
+
variant: "outline",
|
|
246
|
+
onClick: () => J(!1),
|
|
247
|
+
children: "Cancel"
|
|
248
|
+
}), /* @__PURE__ */ O(g, {
|
|
249
|
+
leftIcon: /* @__PURE__ */ O(N, { size: 16 }),
|
|
250
|
+
onClick: Ee,
|
|
251
|
+
isLoading: ge.loading,
|
|
252
|
+
children: "Save"
|
|
253
|
+
})] }) : /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O(g, {
|
|
254
|
+
variant: "outline",
|
|
255
|
+
leftIcon: /* @__PURE__ */ O(ue, { size: 16 }),
|
|
256
|
+
onClick: () => {
|
|
257
|
+
W && (Z({
|
|
258
|
+
name: W.name,
|
|
259
|
+
description: n(W) ?? "",
|
|
260
|
+
transport: W.type,
|
|
261
|
+
baseUrl: r(W) ?? "",
|
|
262
|
+
authMethod: B(W.config, "authMethod") ?? "NONE",
|
|
263
|
+
secretRefId: B(W.config, "secretRefId") ?? ""
|
|
264
|
+
}), J(!0));
|
|
265
|
+
},
|
|
266
|
+
children: "Edit"
|
|
267
|
+
}), Se ? /* @__PURE__ */ k("div", {
|
|
268
|
+
className: "flex gap-2",
|
|
269
|
+
children: [/* @__PURE__ */ O(g, {
|
|
270
|
+
variant: "outline",
|
|
271
|
+
size: "sm",
|
|
272
|
+
onClick: () => Y(!1),
|
|
273
|
+
children: "Cancel"
|
|
274
|
+
}), /* @__PURE__ */ O(g, {
|
|
275
|
+
variant: "destructive",
|
|
276
|
+
size: "sm",
|
|
277
|
+
onClick: () => {
|
|
278
|
+
y("medium"), De();
|
|
279
|
+
},
|
|
280
|
+
isLoading: ve.loading,
|
|
281
|
+
children: "Confirm"
|
|
282
|
+
})]
|
|
283
|
+
}) : /* @__PURE__ */ O(g, {
|
|
284
|
+
variant: "destructive",
|
|
285
|
+
leftIcon: /* @__PURE__ */ O(I, { size: 16 }),
|
|
286
|
+
onClick: () => Y(!0),
|
|
287
|
+
children: "Delete"
|
|
288
|
+
})] })]
|
|
289
|
+
}),
|
|
290
|
+
children: /* @__PURE__ */ k("div", {
|
|
291
|
+
className: "space-y-6",
|
|
292
|
+
children: [
|
|
293
|
+
/* @__PURE__ */ O(ie, {
|
|
294
|
+
icon: /* @__PURE__ */ O(P, { size: 18 }),
|
|
295
|
+
children: "This is one connected MCP server and everything it exposes to your agents — its health, the tools and resources it provides, and its connection settings. Check that it is healthy and that the right tools are available, then your agents can call them (subject to your tool policies) to take real actions."
|
|
296
|
+
}),
|
|
297
|
+
/* @__PURE__ */ k("div", {
|
|
298
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
299
|
+
children: [
|
|
300
|
+
/* @__PURE__ */ k(re, {
|
|
301
|
+
treatment: "glass",
|
|
302
|
+
glow: !0,
|
|
303
|
+
className: "p-6 text-center",
|
|
304
|
+
children: [
|
|
305
|
+
/* @__PURE__ */ O("div", {
|
|
306
|
+
className: "p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2",
|
|
307
|
+
children: ((e) => {
|
|
308
|
+
switch (e) {
|
|
309
|
+
case "CONNECTED": return /* @__PURE__ */ O(ce, { className: "h-5 w-5 text-status-success-text" });
|
|
310
|
+
case "CONNECTING": return /* @__PURE__ */ O(oe, { className: "h-5 w-5 text-status-warning-text" });
|
|
311
|
+
case "ERROR":
|
|
312
|
+
case "DISCONNECTED": return /* @__PURE__ */ O(R, { className: "h-5 w-5 text-status-error-text" });
|
|
313
|
+
default: return /* @__PURE__ */ O(le, { className: "h-5 w-5 text-text-secondary" });
|
|
314
|
+
}
|
|
315
|
+
})(W.status)
|
|
316
|
+
}),
|
|
317
|
+
/* @__PURE__ */ O("p", {
|
|
318
|
+
className: "text-lg font-bold capitalize text-text-primary",
|
|
319
|
+
children: W.status.toLowerCase()
|
|
320
|
+
}),
|
|
321
|
+
/* @__PURE__ */ O("p", {
|
|
322
|
+
className: "text-sm text-text-secondary",
|
|
323
|
+
children: "Health Status"
|
|
324
|
+
})
|
|
325
|
+
]
|
|
326
|
+
}),
|
|
327
|
+
/* @__PURE__ */ O(d, { children: /* @__PURE__ */ k(f, {
|
|
328
|
+
className: "pt-6 text-center",
|
|
329
|
+
children: [/* @__PURE__ */ O("p", {
|
|
330
|
+
className: "text-3xl font-bold text-text-primary",
|
|
331
|
+
children: K.length
|
|
332
|
+
}), /* @__PURE__ */ O("p", {
|
|
333
|
+
className: "text-sm text-text-secondary",
|
|
334
|
+
children: "Tools Available"
|
|
335
|
+
})]
|
|
336
|
+
}) }),
|
|
337
|
+
/* @__PURE__ */ O(d, { children: /* @__PURE__ */ k(f, {
|
|
338
|
+
className: "pt-6 text-center",
|
|
339
|
+
children: [/* @__PURE__ */ O("p", {
|
|
340
|
+
className: "text-3xl font-bold text-text-primary",
|
|
341
|
+
children: q.length
|
|
342
|
+
}), /* @__PURE__ */ O("p", {
|
|
343
|
+
className: "text-sm text-text-secondary",
|
|
344
|
+
children: "Resources"
|
|
345
|
+
})]
|
|
346
|
+
}) }),
|
|
347
|
+
/* @__PURE__ */ O(d, { children: /* @__PURE__ */ k(f, {
|
|
348
|
+
className: "pt-6 text-center",
|
|
349
|
+
children: [/* @__PURE__ */ O("p", {
|
|
350
|
+
className: "text-3xl font-bold text-text-primary",
|
|
351
|
+
children: W.lastConnectedAt ? l(W.lastConnectedAt) : "Never"
|
|
352
|
+
}), /* @__PURE__ */ O("p", {
|
|
353
|
+
className: "text-sm text-text-secondary",
|
|
354
|
+
children: "Last Connected"
|
|
355
|
+
})]
|
|
356
|
+
}) })
|
|
357
|
+
]
|
|
358
|
+
}),
|
|
359
|
+
/* @__PURE__ */ k(d, { children: [/* @__PURE__ */ O(m, { children: /* @__PURE__ */ k(h, {
|
|
360
|
+
className: "flex items-center gap-2",
|
|
361
|
+
children: [/* @__PURE__ */ O(P, { size: 18 }), "Connection Details"]
|
|
362
|
+
}) }), /* @__PURE__ */ k(f, { children: [/* @__PURE__ */ k("div", {
|
|
363
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-6",
|
|
364
|
+
children: [
|
|
365
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
366
|
+
className: "text-sm text-text-secondary",
|
|
367
|
+
children: "Transport"
|
|
368
|
+
}), /* @__PURE__ */ O(_, {
|
|
369
|
+
variant: "outline",
|
|
370
|
+
className: "capitalize mt-1",
|
|
371
|
+
children: W.type.toLowerCase().replace("_", " ")
|
|
372
|
+
})] }),
|
|
373
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
374
|
+
className: "text-sm text-text-secondary",
|
|
375
|
+
children: "Base URL"
|
|
376
|
+
}), /* @__PURE__ */ O("p", {
|
|
377
|
+
className: "font-medium text-sm truncate",
|
|
378
|
+
children: r(W) ?? "—"
|
|
379
|
+
})] }),
|
|
380
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
381
|
+
className: "text-sm text-text-secondary",
|
|
382
|
+
children: "Auth Method"
|
|
383
|
+
}), /* @__PURE__ */ O(_, {
|
|
384
|
+
variant: "outline",
|
|
385
|
+
className: "capitalize mt-1",
|
|
386
|
+
children: (B(W.config, "authMethod") ?? "NONE").toLowerCase().replace("_", " ")
|
|
387
|
+
})] }),
|
|
388
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
389
|
+
className: "text-sm text-text-secondary",
|
|
390
|
+
children: "Last Tested"
|
|
391
|
+
}), /* @__PURE__ */ O("p", {
|
|
392
|
+
className: "font-medium",
|
|
393
|
+
children: W.lastErrorAt ? l(W.lastErrorAt) : "Never"
|
|
394
|
+
})] })
|
|
395
|
+
]
|
|
396
|
+
}), W.errorMessage && /* @__PURE__ */ k("div", {
|
|
397
|
+
className: "mt-4 p-3 bg-status-error-bg-subtle rounded-lg text-sm text-status-error-text",
|
|
398
|
+
children: [
|
|
399
|
+
/* @__PURE__ */ O("strong", { children: "Error:" }),
|
|
400
|
+
" ",
|
|
401
|
+
W.errorMessage
|
|
402
|
+
]
|
|
403
|
+
})] })] }),
|
|
404
|
+
/* @__PURE__ */ k("div", {
|
|
405
|
+
className: "grid grid-cols-12 gap-6",
|
|
406
|
+
children: [/* @__PURE__ */ O("div", {
|
|
407
|
+
className: "col-span-5",
|
|
408
|
+
children: /* @__PURE__ */ k(d, {
|
|
409
|
+
className: "h-full",
|
|
410
|
+
children: [/* @__PURE__ */ k(m, { children: [/* @__PURE__ */ k(h, {
|
|
411
|
+
className: "flex items-center gap-2",
|
|
412
|
+
children: [
|
|
413
|
+
/* @__PURE__ */ O(L, { size: 18 }),
|
|
414
|
+
"Tools (",
|
|
415
|
+
K.length,
|
|
416
|
+
")"
|
|
417
|
+
]
|
|
418
|
+
}), /* @__PURE__ */ O(p, { children: "Available tools from this MCP server" })] }), /* @__PURE__ */ O(f, {
|
|
419
|
+
className: "p-0",
|
|
420
|
+
children: K.length > 0 ? /* @__PURE__ */ O("div", {
|
|
421
|
+
className: "divide-y divide-border-subtle max-h-96 overflow-auto",
|
|
422
|
+
children: K.map((e) => /* @__PURE__ */ k("button", {
|
|
423
|
+
type: "button",
|
|
424
|
+
className: `w-full text-left p-4 hover:bg-accent transition-colors ${$?.name === e.name ? "bg-accent" : ""}`,
|
|
425
|
+
onClick: () => Ce(e.name),
|
|
426
|
+
children: [/* @__PURE__ */ O("p", {
|
|
427
|
+
className: "font-medium",
|
|
428
|
+
children: e.name
|
|
429
|
+
}), /* @__PURE__ */ O("p", {
|
|
430
|
+
className: "text-sm text-text-secondary line-clamp-1",
|
|
431
|
+
children: e.description
|
|
432
|
+
})]
|
|
433
|
+
}, e.name))
|
|
434
|
+
}) : /* @__PURE__ */ k("div", {
|
|
435
|
+
className: "p-8 text-center text-text-secondary",
|
|
436
|
+
children: [/* @__PURE__ */ O(L, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }), /* @__PURE__ */ O("p", { children: "No tools available" })]
|
|
437
|
+
})
|
|
438
|
+
})]
|
|
439
|
+
})
|
|
440
|
+
}), /* @__PURE__ */ O("div", {
|
|
441
|
+
className: "col-span-7",
|
|
442
|
+
children: $ ? /* @__PURE__ */ k(d, {
|
|
443
|
+
className: "h-full",
|
|
444
|
+
children: [/* @__PURE__ */ k(m, { children: [/* @__PURE__ */ O(h, { children: $.name }), /* @__PURE__ */ O(p, { children: $.description })] }), /* @__PURE__ */ O(f, {
|
|
445
|
+
className: "space-y-4",
|
|
446
|
+
children: /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
447
|
+
className: "text-sm font-medium mb-2",
|
|
448
|
+
children: "Input Schema"
|
|
449
|
+
}), /* @__PURE__ */ O("div", {
|
|
450
|
+
className: "p-3 bg-bg-sunken rounded-lg font-mono text-xs overflow-auto max-h-96",
|
|
451
|
+
children: /* @__PURE__ */ O("pre", { children: JSON.stringify($.inputSchema, null, 2) })
|
|
452
|
+
})] })
|
|
453
|
+
})]
|
|
454
|
+
}) : /* @__PURE__ */ O(d, {
|
|
455
|
+
className: "h-full",
|
|
456
|
+
children: /* @__PURE__ */ O(f, {
|
|
457
|
+
className: "h-full flex items-center justify-center",
|
|
458
|
+
children: /* @__PURE__ */ O(x, {
|
|
459
|
+
illustration: "onboarding",
|
|
460
|
+
title: "Select a tool",
|
|
461
|
+
description: "Choose a tool from the list to view its details"
|
|
462
|
+
})
|
|
463
|
+
})
|
|
464
|
+
})
|
|
465
|
+
})]
|
|
466
|
+
}),
|
|
467
|
+
q.length > 0 && /* @__PURE__ */ k(d, { children: [/* @__PURE__ */ k(m, { children: [/* @__PURE__ */ O(h, { children: "Resources" }), /* @__PURE__ */ O(p, { children: "Available resources exposed by this server" })] }), /* @__PURE__ */ O(f, { children: /* @__PURE__ */ O("div", {
|
|
468
|
+
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
469
|
+
children: q.map((e) => /* @__PURE__ */ k("div", {
|
|
470
|
+
className: "p-4 border border-border-subtle rounded-lg hover:bg-accent/50 transition-colors",
|
|
471
|
+
children: [/* @__PURE__ */ k("div", {
|
|
472
|
+
className: "flex items-start justify-between",
|
|
473
|
+
children: [/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
474
|
+
className: "font-medium",
|
|
475
|
+
children: e.name
|
|
476
|
+
}), /* @__PURE__ */ O("p", {
|
|
477
|
+
className: "text-sm text-text-secondary",
|
|
478
|
+
children: e.description
|
|
479
|
+
})] }), /* @__PURE__ */ O(de, {
|
|
480
|
+
size: 14,
|
|
481
|
+
className: "text-text-secondary"
|
|
482
|
+
})]
|
|
483
|
+
}), /* @__PURE__ */ k("div", {
|
|
484
|
+
className: "mt-2 flex items-center gap-2",
|
|
485
|
+
children: [/* @__PURE__ */ O(_, {
|
|
486
|
+
variant: "outline",
|
|
487
|
+
className: "text-xs font-mono",
|
|
488
|
+
children: e.mimeType || "unknown"
|
|
489
|
+
}), /* @__PURE__ */ O("span", {
|
|
490
|
+
className: "text-xs text-text-secondary truncate",
|
|
491
|
+
children: e.uri
|
|
492
|
+
})]
|
|
493
|
+
})]
|
|
494
|
+
}, e.uri))
|
|
495
|
+
}) })] }),
|
|
496
|
+
/* @__PURE__ */ k(d, { children: [/* @__PURE__ */ O(m, { children: /* @__PURE__ */ k(h, {
|
|
497
|
+
className: "flex items-center gap-2",
|
|
498
|
+
children: [/* @__PURE__ */ O(F, { size: 18 }), "Metadata"]
|
|
499
|
+
}) }), /* @__PURE__ */ O(f, { children: /* @__PURE__ */ k("div", {
|
|
500
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-6 text-sm",
|
|
501
|
+
children: [
|
|
502
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
503
|
+
className: "text-text-secondary",
|
|
504
|
+
children: "Created"
|
|
505
|
+
}), /* @__PURE__ */ O("p", {
|
|
506
|
+
className: "font-medium",
|
|
507
|
+
children: l(W.createdAt)
|
|
508
|
+
})] }),
|
|
509
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
510
|
+
className: "text-text-secondary",
|
|
511
|
+
children: "Updated"
|
|
512
|
+
}), /* @__PURE__ */ O("p", {
|
|
513
|
+
className: "font-medium",
|
|
514
|
+
children: l(W.updatedAt)
|
|
515
|
+
})] }),
|
|
516
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
517
|
+
className: "text-text-secondary",
|
|
518
|
+
children: "Last Connected"
|
|
519
|
+
}), /* @__PURE__ */ O("p", {
|
|
520
|
+
className: "font-medium",
|
|
521
|
+
children: W.lastConnectedAt ? l(W.lastConnectedAt) : "Never"
|
|
522
|
+
})] }),
|
|
523
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
524
|
+
className: "text-text-secondary",
|
|
525
|
+
children: "Credentials"
|
|
526
|
+
}), /* @__PURE__ */ O(_, {
|
|
527
|
+
variant: W.credentialsHash ? "success" : "secondary",
|
|
528
|
+
children: W.credentialsHash ? "Configured" : "None"
|
|
529
|
+
})] })
|
|
530
|
+
]
|
|
531
|
+
}) })] })
|
|
532
|
+
]
|
|
533
|
+
})
|
|
534
|
+
}) : /* @__PURE__ */ O(u, {
|
|
535
|
+
title: "Server Not Found",
|
|
536
|
+
children: /* @__PURE__ */ O(x, {
|
|
537
|
+
illustration: "empty-generic",
|
|
538
|
+
title: "Server Not Found",
|
|
539
|
+
description: "This MCP server doesn't exist.",
|
|
540
|
+
action: /* @__PURE__ */ O(g, {
|
|
541
|
+
onClick: () => U("mcp"),
|
|
542
|
+
children: "Back to MCP Servers"
|
|
543
|
+
})
|
|
544
|
+
})
|
|
545
|
+
});
|
|
546
|
+
};
|
|
547
|
+
//#endregion
|
|
548
|
+
export { V as MCPServerDetailPage };
|
|
549
|
+
|
|
550
|
+
//# sourceMappingURL=MCPServerDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MCPServerDetailPage.js","names":[],"sources":["../../../src/botlit/pages/MCPServerDetailPage.tsx"],"sourcesContent":["/**\n * MCP Server Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Server,\n Plug,\n PlugZap,\n Wrench,\n Settings,\n Save,\n RefreshCw,\n AlertTriangle,\n CheckCircle,\n XCircle,\n Clock,\n ExternalLink,\n Edit,\n Trash2,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } 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 { StatusBadge, Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { toast } from 'sonner';\nimport {\n useMCPServer,\n useMCPTools,\n useMCPResources,\n useCreateMCPServer,\n useUpdateMCPServer,\n useDeleteMCPServer,\n useTestMCPConnection,\n isMCPServerHealthy,\n mcpServerDescription,\n mcpServerEndpoint,\n type MCPToolRecord,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { MCPTransport, MCPAuthMethod } from '../types';\n\ninterface MCPServerDetailPageProps {\n isNew?: boolean;\n}\n\n/** Reads a string the UI stored on the connection's free-form config. */\nfunction configString(\n config: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const value = config?.[key];\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport const MCPServerDetailPage: FC<MCPServerDetailPageProps> = ({ isNew }) => {\n const { serverId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: server, loading, refetch } = useMCPServer(isNew ? undefined : serverId);\n const { data: tools } = useMCPTools(isNew ? undefined : serverId);\n const { data: resources } = useMCPResources(isNew ? undefined : serverId);\n const [connectServer, connectResult] = useCreateMCPServer();\n const [updateServer, updateResult] = useUpdateMCPServer();\n const [deleteServer, deleteResult] = useDeleteMCPServer();\n const [testConnection, testResult] = useTestMCPConnection();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n transport: 'HTTP_JSON' as MCPTransport,\n baseUrl: '',\n authMethod: 'NONE' as MCPAuthMethod,\n secretRefId: '',\n });\n\n const [selectedToolName, setSelectedToolName] = useState<string | null>(null);\n const selectedTool = useMemo(\n () => tools.find((tool) => tool.name === selectedToolName) ?? null,\n [tools, selectedToolName]\n );\n\n const handleCreate = async () => {\n if (!formData.name || !formData.baseUrl) return;\n try {\n const created = await connectServer({\n name: formData.name,\n type: formData.transport,\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n });\n toast.success(`Connected \"${created.name}\"`);\n navigateTo(`mcp/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to connect MCP server');\n }\n };\n\n const handleTestConnection = async () => {\n if (!serverId) return;\n try {\n const ok = await testConnection(serverId);\n if (ok) {\n toast.success('MCP server is reachable');\n } else {\n toast.error('MCP server did not respond');\n }\n void refetch();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to test MCP connection');\n }\n };\n\n const handleUpdate = async () => {\n if (!serverId || !formData.name) return;\n try {\n await updateServer({\n serverId,\n input: {\n name: formData.name,\n // `config` is replaced wholesale by the service — resend every field\n // the form owns so an edit never drops the endpoint or auth settings.\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n },\n });\n toast.success('MCP server updated');\n void refetch();\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update MCP server');\n }\n };\n\n const handleDelete = async () => {\n if (!serverId) return;\n try {\n await deleteServer(serverId);\n if (isNative()) void nativeNotify('success');\n toast.success('MCP server disconnected');\n navigateTo('mcp');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to disconnect MCP server');\n }\n };\n\n const startEditing = () => {\n if (!server) return;\n setFormData({\n name: server.name,\n description: mcpServerDescription(server) ?? '',\n transport: server.type as MCPTransport,\n baseUrl: mcpServerEndpoint(server) ?? '',\n authMethod: (configString(server.config, 'authMethod') ?? 'NONE') as MCPAuthMethod,\n secretRefId: configString(server.config, 'secretRefId') ?? '',\n });\n setIsEditing(true);\n };\n\n const getHealthIcon = (status?: string) => {\n switch (status) {\n case 'CONNECTED':\n return <CheckCircle className=\"h-5 w-5 text-status-success-text\" />;\n case 'CONNECTING':\n return <AlertTriangle className=\"h-5 w-5 text-status-warning-text\" />;\n case 'ERROR':\n case 'DISCONNECTED':\n return <XCircle className=\"h-5 w-5 text-status-error-text\" />;\n default:\n return <Clock className=\"h-5 w-5 text-text-secondary\" />;\n }\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Add MCP Server\"\n description=\"Connect a new Model Context Protocol server\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('mcp')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={connectResult.loading}\n disabled={!formData.name || !formData.baseUrl}\n >\n Connect\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Server Configuration</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Server Name\" required>\n <Input\n placeholder=\"e.g., GitHub MCP Server\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What capabilities does this server provide?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Transport\" required>\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.transport}\n onChange={(e) =>\n setFormData({ ...formData, transport: e.target.value as MCPTransport })\n }\n >\n <option value=\"HTTP_JSON\">HTTP JSON</option>\n <option value=\"JSON_RPC\">JSON RPC</option>\n <option value=\"SSE\">Server-Sent Events</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n\n <FormField label=\"Auth Method\">\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.authMethod}\n onChange={(e) =>\n setFormData({ ...formData, authMethod: e.target.value as MCPAuthMethod })\n }\n >\n <option value=\"NONE\">None</option>\n <option value=\"API_KEY\">API Key</option>\n <option value=\"OAUTH\">OAuth</option>\n <option value=\"CUSTOM_HEADER\">Custom Header</option>\n </select>\n </FormField>\n </div>\n\n <FormField label=\"Base URL\" required>\n <Input\n placeholder=\"e.g., https://mcp.example.com\"\n value={formData.baseUrl}\n onChange={(e) => setFormData({ ...formData, baseUrl: e.target.value })}\n />\n </FormField>\n\n {formData.authMethod !== 'NONE' && (\n <FormField label=\"Secret Reference ID\">\n <Input\n placeholder=\"e.g., secret-mcp-github\"\n value={formData.secretRefId}\n onChange={(e) => setFormData({ ...formData, secretRefId: e.target.value })}\n />\n </FormField>\n )}\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!server) {\n return (\n <PageLayout title=\"Server Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Server Not Found\"\n description=\"This MCP server doesn't exist.\"\n action={<Button onClick={() => navigateTo('mcp')}>Back to MCP Servers</Button>}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('mcp')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {isMCPServerHealthy(server.status) ? (\n <PlugZap className=\"h-6 w-6 text-status-success-text\" />\n ) : (\n <Plug className=\"h-6 w-6 text-text-secondary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{server.name}</span>\n <StatusBadge status={server.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">\n {mcpServerDescription(server)}\n </p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<RefreshCw size={16} />}\n onClick={handleTestConnection}\n isLoading={testResult.loading}\n >\n Test\n </Button>\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Server size={18} />}>\n This is one connected MCP server and everything it exposes to your agents — its health,\n the tools and resources it provides, and its connection settings. Check that it is healthy\n and that the right tools are available, then your agents can call them (subject to your\n tool policies) to take real actions.\n </PagePurpose>\n\n {/* Health Status */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n {getHealthIcon(server.status)}\n </div>\n <p className=\"text-lg font-bold capitalize text-text-primary\">\n {server.status.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Health Status</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{tools.length}</p>\n <p className=\"text-sm text-text-secondary\">Tools Available</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{resources.length}</p>\n <p className=\"text-sm text-text-secondary\">Resources</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n <p className=\"text-sm text-text-secondary\">Last Connected</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Connection Details */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Server size={18} />\n Connection Details\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Transport</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {server.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Base URL</p>\n <p className=\"font-medium text-sm truncate\">\n {mcpServerEndpoint(server) ?? MISSING_VALUE}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Auth Method</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {(configString(server.config, 'authMethod') ?? 'NONE')\n .toLowerCase()\n .replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Last Tested</p>\n <p className=\"font-medium\">\n {server.lastErrorAt ? formatRelativeTime(server.lastErrorAt) : 'Never'}\n </p>\n </div>\n </div>\n {server.errorMessage && (\n <div className=\"mt-4 p-3 bg-status-error-bg-subtle rounded-lg text-sm text-status-error-text\">\n <strong>Error:</strong> {server.errorMessage}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Tools Catalog */}\n <div className=\"grid grid-cols-12 gap-6\">\n <div className=\"col-span-5\">\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools ({tools.length})\n </CardTitle>\n <CardDescription>Available tools from this MCP server</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {tools.length > 0 ? (\n <div className=\"divide-y divide-border-subtle max-h-96 overflow-auto\">\n {tools.map((tool: MCPToolRecord) => (\n <button\n key={tool.name}\n type=\"button\"\n className={`w-full text-left p-4 hover:bg-accent transition-colors ${\n selectedTool?.name === tool.name ? 'bg-accent' : ''\n }`}\n onClick={() => setSelectedToolName(tool.name)}\n >\n <p className=\"font-medium\">{tool.name}</p>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {tool.description}\n </p>\n </button>\n ))}\n </div>\n ) : (\n <div className=\"p-8 text-center text-text-secondary\">\n <Wrench className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No tools available</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"col-span-7\">\n {selectedTool ? (\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle>{selectedTool.name}</CardTitle>\n <CardDescription>{selectedTool.description}</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {/* Input Schema */}\n <div>\n <p className=\"text-sm font-medium mb-2\">Input Schema</p>\n <div className=\"p-3 bg-bg-sunken rounded-lg font-mono text-xs overflow-auto max-h-96\">\n <pre>{JSON.stringify(selectedTool.inputSchema, null, 2)}</pre>\n </div>\n </div>\n </CardContent>\n </Card>\n ) : (\n <Card className=\"h-full\">\n <CardContent className=\"h-full flex items-center justify-center\">\n <EmptyState\n illustration=\"onboarding\"\n title=\"Select a tool\"\n description=\"Choose a tool from the list to view its details\"\n />\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n\n {/* Resources */}\n {resources.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Resources</CardTitle>\n <CardDescription>Available resources exposed by this server</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {resources.map(\n (resource: {\n uri: string;\n name: string;\n description?: string | null;\n mimeType?: string | null;\n }) => (\n <div\n key={resource.uri}\n className=\"p-4 border border-border-subtle rounded-lg hover:bg-accent/50 transition-colors\"\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-medium\">{resource.name}</p>\n <p className=\"text-sm text-text-secondary\">{resource.description}</p>\n </div>\n <ExternalLink size={14} className=\"text-text-secondary\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs font-mono\">\n {resource.mimeType || 'unknown'}\n </Badge>\n <span className=\"text-xs text-text-secondary truncate\">{resource.uri}</span>\n </div>\n </div>\n )\n )}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(server.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(server.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last Connected</p>\n <p className=\"font-medium\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Credentials</p>\n <Badge variant={server.credentialsHash ? 'success' : 'secondary'}>\n {server.credentialsHash ? 'Configured' : 'None'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|