@burdenoff/microfe-botmanor 2026.819.1 → 2026.925.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/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.js +4 -4
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/ErrorState.js +33 -29
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/RouteLoader.js +52 -48
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.js +74 -77
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.js +31 -30
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
- package/dist/botlit/hooks/useMCPServers.js +60 -49
- package/dist/botlit/hooks/useMCPServers.js.map +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js +1 -1
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.js +116 -124
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.js +169 -172
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.js +96 -90
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.js +228 -231
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.js +84 -87
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.js +144 -147
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.js +3 -3
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js +1 -1
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.js +156 -149
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.js +126 -129
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/DashboardPage.js +111 -114
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.js +163 -159
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.js +3 -3
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.js +84 -78
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.js +295 -238
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.js +159 -154
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.js +119 -114
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.js +102 -109
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.js +144 -159
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.js +122 -105
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.js +176 -175
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.js +1 -1
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/generated/wspace-operations.js +45 -29
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +33 -9
|
@@ -1,134 +1,145 @@
|
|
|
1
1
|
import { buildMutationInput as e, fieldsOf as t } from "./internal/mutationInput.js";
|
|
2
|
-
import { CreateMcpConnectionDocument as n, DeleteMcpConnectionDocument as r, GetMcpConnectionDocument as i, ListMcpConnectionsDocument as a, ListMcpResourcesDocument as o, ListMcpToolsDocument as s, TestMcpConnectionDocument as c, UpdateMcpConnectionDocument as l } from "../../generated/wspace-operations.js";
|
|
3
|
-
import { useWorkspaceId as
|
|
4
|
-
import { useCallback as
|
|
2
|
+
import { CreateMcpConnectionDocument as n, DeleteMcpConnectionDocument as r, GetMcpConnectionDocument as i, ListMcpConnectionsDocument as a, ListMcpResourcesDocument as o, ListMcpToolsDocument as s, TestMcpConnectionDocument as c, UpdateMcpConnectionDocument as l, UpdateMcpToolDocument as u } from "../../generated/wspace-operations.js";
|
|
3
|
+
import { useWorkspaceId as d, useWorkspaceMutation as f, useWorkspaceQuery as p } from "./internal/workspaceGateway.js";
|
|
4
|
+
import { useCallback as m, useMemo as h } from "react";
|
|
5
5
|
//#region src/botlit/hooks/useMCPServers.ts
|
|
6
|
-
var
|
|
6
|
+
var g = 100, _ = t({
|
|
7
7
|
config: !0,
|
|
8
8
|
credentials: !0,
|
|
9
9
|
metadata: !0,
|
|
10
10
|
name: !0,
|
|
11
11
|
type: !0,
|
|
12
12
|
workspaceId: !0
|
|
13
|
-
}),
|
|
13
|
+
}), v = t({
|
|
14
14
|
config: !0,
|
|
15
15
|
credentials: !0,
|
|
16
16
|
metadata: !0,
|
|
17
17
|
name: !0
|
|
18
|
-
}),
|
|
19
|
-
function
|
|
18
|
+
}), y = [], b = [], x = [];
|
|
19
|
+
function S(e) {
|
|
20
20
|
return e === "CONNECTED";
|
|
21
21
|
}
|
|
22
|
-
function
|
|
22
|
+
function C(e) {
|
|
23
23
|
let t = e.config?.url;
|
|
24
24
|
return typeof t == "string" ? t : void 0;
|
|
25
25
|
}
|
|
26
|
-
function
|
|
26
|
+
function w(e) {
|
|
27
27
|
let t = e.config?.description;
|
|
28
28
|
return typeof t == "string" ? t : void 0;
|
|
29
29
|
}
|
|
30
|
-
function w(e) {
|
|
31
|
-
return e?.listMCPConnections ?? v;
|
|
32
|
-
}
|
|
33
30
|
function T(e) {
|
|
34
|
-
return e?.
|
|
31
|
+
return e?.listMCPConnections ?? y;
|
|
35
32
|
}
|
|
36
33
|
function E(e) {
|
|
37
|
-
return e?.
|
|
34
|
+
return e?.getMCPConnection ?? null;
|
|
38
35
|
}
|
|
39
36
|
function D(e) {
|
|
40
|
-
return e?.
|
|
37
|
+
return e?.listMCPTools ?? b;
|
|
41
38
|
}
|
|
42
39
|
function O(e) {
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
return e?.listMCPResources ?? x;
|
|
41
|
+
}
|
|
42
|
+
function k(e) {
|
|
43
|
+
let t = d(), n = e?.search?.trim().toLowerCase() ?? "";
|
|
44
|
+
return p({
|
|
45
45
|
document: a,
|
|
46
|
-
variables:
|
|
46
|
+
variables: h(() => ({
|
|
47
47
|
filters: { workspaceId: t },
|
|
48
48
|
pagination: {
|
|
49
|
-
limit:
|
|
49
|
+
limit: g,
|
|
50
50
|
offset: 0
|
|
51
51
|
}
|
|
52
52
|
}), [t]),
|
|
53
|
-
select:
|
|
54
|
-
let t =
|
|
53
|
+
select: m((e) => {
|
|
54
|
+
let t = T(e);
|
|
55
55
|
return n ? t.filter((e) => e.name.toLowerCase().includes(n)) : t;
|
|
56
56
|
}, [n]),
|
|
57
|
-
fallback:
|
|
57
|
+
fallback: y,
|
|
58
58
|
enabled: !!t,
|
|
59
59
|
errorMessage: "Failed to load MCP servers"
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
function
|
|
63
|
-
return
|
|
62
|
+
function A(e) {
|
|
63
|
+
return p({
|
|
64
64
|
document: i,
|
|
65
|
-
variables:
|
|
66
|
-
select:
|
|
65
|
+
variables: h(() => ({ id: e ?? "" }), [e]),
|
|
66
|
+
select: E,
|
|
67
67
|
fallback: null,
|
|
68
68
|
enabled: !!e,
|
|
69
69
|
errorMessage: "Failed to load MCP server"
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
|
-
function
|
|
73
|
-
return
|
|
72
|
+
function j(e) {
|
|
73
|
+
return p({
|
|
74
74
|
document: s,
|
|
75
|
-
variables:
|
|
76
|
-
select:
|
|
77
|
-
fallback:
|
|
75
|
+
variables: h(() => ({ connectionId: e ?? "" }), [e]),
|
|
76
|
+
select: D,
|
|
77
|
+
fallback: b,
|
|
78
78
|
enabled: !!e,
|
|
79
79
|
errorMessage: "Failed to load MCP tools"
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
|
-
function
|
|
83
|
-
return
|
|
82
|
+
function M(e) {
|
|
83
|
+
return p({
|
|
84
84
|
document: o,
|
|
85
|
-
variables:
|
|
86
|
-
select:
|
|
87
|
-
fallback:
|
|
85
|
+
variables: h(() => ({ connectionId: e ?? "" }), [e]),
|
|
86
|
+
select: O,
|
|
87
|
+
fallback: x,
|
|
88
88
|
enabled: !!e,
|
|
89
89
|
errorMessage: "Failed to load MCP resources"
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
function
|
|
93
|
-
let t =
|
|
94
|
-
return
|
|
92
|
+
function N() {
|
|
93
|
+
let t = d();
|
|
94
|
+
return f({
|
|
95
95
|
document: n,
|
|
96
|
-
variables:
|
|
96
|
+
variables: m((n) => ({ input: e({
|
|
97
97
|
...n,
|
|
98
98
|
workspaceId: t
|
|
99
|
-
},
|
|
99
|
+
}, _) }), [t]),
|
|
100
100
|
select: (e) => e?.createMCPConnection,
|
|
101
101
|
errorMessage: "Failed to connect MCP server"
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
|
-
function
|
|
105
|
-
return
|
|
104
|
+
function P() {
|
|
105
|
+
return f({
|
|
106
106
|
document: l,
|
|
107
107
|
variables: ({ serverId: t, input: n }) => ({
|
|
108
108
|
id: t,
|
|
109
|
-
input: e(n,
|
|
109
|
+
input: e(n, v)
|
|
110
110
|
}),
|
|
111
111
|
select: (e) => e?.updateMCPConnection,
|
|
112
112
|
errorMessage: "Failed to update MCP server"
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
|
-
function
|
|
116
|
-
return
|
|
115
|
+
function F() {
|
|
116
|
+
return f({
|
|
117
117
|
document: r,
|
|
118
118
|
variables: (e) => ({ id: e }),
|
|
119
119
|
select: (e) => e?.deleteMCPConnection,
|
|
120
120
|
errorMessage: "Failed to disconnect MCP server"
|
|
121
121
|
});
|
|
122
122
|
}
|
|
123
|
-
function
|
|
124
|
-
return
|
|
123
|
+
function I() {
|
|
124
|
+
return f({
|
|
125
125
|
document: c,
|
|
126
126
|
variables: (e) => ({ id: e }),
|
|
127
127
|
select: (e) => e?.testMCPConnection,
|
|
128
128
|
errorMessage: "Failed to test MCP connection"
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
|
+
function L() {
|
|
132
|
+
return f({
|
|
133
|
+
document: u,
|
|
134
|
+
variables: ({ toolId: e, input: t }) => ({
|
|
135
|
+
id: e,
|
|
136
|
+
input: t
|
|
137
|
+
}),
|
|
138
|
+
select: (e) => e?.updateMCPTool,
|
|
139
|
+
errorMessage: "Failed to update MCP tool risk level"
|
|
140
|
+
});
|
|
141
|
+
}
|
|
131
142
|
//#endregion
|
|
132
|
-
export {
|
|
143
|
+
export { S as isMCPServerHealthy, w as mcpServerDescription, C as mcpServerEndpoint, N as useCreateMCPServer, F as useDeleteMCPServer, M as useMCPResources, A as useMCPServer, k as useMCPServers, j as useMCPTools, I as useTestMCPConnection, P as useUpdateMCPServer, L as useUpdateMCPTool };
|
|
133
144
|
|
|
134
145
|
//# sourceMappingURL=useMCPServers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMCPServers.js","names":[],"sources":["../../../src/botlit/hooks/useMCPServers.ts"],"sourcesContent":["/**\n * MCP Servers Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listMCPConnections` / `getMCPConnection` / `listMCPTools`\n * / `listMCPResources` operations and the create/update/delete/test mutations on\n * wspace-botlit-svc.\n *\n * The service models an MCP server as an `MCPConnection`: `type` is the\n * transport, `config` holds the endpoint, and `status` reports health.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateMcpConnectionDocument,\n DeleteMcpConnectionDocument,\n GetMcpConnectionDocument,\n ListMcpConnectionsDocument,\n ListMcpResourcesDocument,\n ListMcpToolsDocument,\n TestMcpConnectionDocument,\n UpdateMcpConnectionDocument,\n type CreateMcpConnectionMutation,\n type DeleteMcpConnectionMutation,\n type GetMcpConnectionQuery,\n type ListMcpConnectionsQuery,\n type ListMcpResourcesQuery,\n type ListMcpToolsQuery,\n type TestMcpConnectionMutation,\n type UpdateMcpConnectionMutation,\n} from '../../generated/wspace-operations';\nimport type {\n CreateMcpConnectionInput,\n UpdateMcpConnectionInput,\n} from '../../generated/wspace-types';\nimport type { BaseFilter } from '../types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspaceQuery,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface MCPServerRecord {\n id: string;\n name: string;\n /** Transport / server kind, e.g. `HTTP_JSON`. */\n type: string;\n status: string;\n config: Record<string, unknown>;\n credentialsHash?: string | null;\n errorMessage?: string | null;\n lastConnectedAt?: string | null;\n lastErrorAt?: string | null;\n deletedAt?: string | null;\n metadata?: Record<string, unknown> | null;\n createdAt: string;\n updatedAt: string;\n createdById: string;\n updatedById: string;\n workspaceId: string;\n}\n\nexport interface MCPToolRecord {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPResourceRecord {\n name: string;\n uri: string;\n description?: string | null;\n mimeType?: string | null;\n}\n\n/** `CreateMCPConnectionInput` minus the `workspaceId` the hook supplies. */\nexport type CreateMCPServerVariables = Omit<GraphQLInput<CreateMcpConnectionInput>, 'workspaceId'>;\n\nexport interface UpdateMCPServerVariables {\n serverId: string;\n input: GraphQLInput<UpdateMcpConnectionInput>;\n}\n\nconst CREATE_CONNECTION_FIELDS = fieldsOf<CreateMcpConnectionInput>({\n config: true,\n credentials: true,\n metadata: true,\n name: true,\n type: true,\n workspaceId: true,\n});\n\nconst UPDATE_CONNECTION_FIELDS = fieldsOf<UpdateMcpConnectionInput>({\n config: true,\n credentials: true,\n metadata: true,\n name: true,\n});\n\nconst NO_SERVERS: MCPServerRecord[] = [];\nconst NO_TOOLS: MCPToolRecord[] = [];\nconst NO_RESOURCES: MCPResourceRecord[] = [];\n\n/** `CONNECTED` is the only status that means the server is usable right now. */\nexport function isMCPServerHealthy(status: string | null | undefined): boolean {\n return status === 'CONNECTED';\n}\n\nexport function isMCPServerUnhealthy(status: string | null | undefined): boolean {\n return status === 'ERROR' || status === 'DISCONNECTED';\n}\n\n/** Endpoint the connection points at — the service stores it on the free-form config. */\nexport function mcpServerEndpoint(server: Pick<MCPServerRecord, 'config'>): string | undefined {\n const url = server.config?.url;\n return typeof url === 'string' ? url : undefined;\n}\n\n/** Optional human description the UI stores alongside the endpoint. */\nexport function mcpServerDescription(server: Pick<MCPServerRecord, 'config'>): string | undefined {\n const description = server.config?.description;\n return typeof description === 'string' ? description : undefined;\n}\n\nfunction selectServers(data: ListMcpConnectionsQuery | undefined): MCPServerRecord[] {\n return data?.listMCPConnections ?? NO_SERVERS;\n}\n\nfunction selectServer(data: GetMcpConnectionQuery | undefined): MCPServerRecord | null {\n return data?.getMCPConnection ?? null;\n}\n\nfunction selectTools(data: ListMcpToolsQuery | undefined): MCPToolRecord[] {\n return data?.listMCPTools ?? NO_TOOLS;\n}\n\nfunction selectResources(data: ListMcpResourcesQuery | undefined): MCPResourceRecord[] {\n return data?.listMCPResources ?? NO_RESOURCES;\n}\n\nexport const mcpServerKeys = {\n all: ['mcpServers'] as const,\n lists: () => [...mcpServerKeys.all, 'list'] as const,\n list: (filter?: BaseFilter) => [...mcpServerKeys.lists(), filter] as const,\n details: () => [...mcpServerKeys.all, 'detail'] as const,\n detail: (id: string) => [...mcpServerKeys.details(), id] as const,\n resources: (serverId?: string) => [...mcpServerKeys.all, 'resources', serverId] as const,\n tools: (serverId?: string) => [...mcpServerKeys.all, 'tools', serverId] as const,\n};\n\nexport function useMCPServers(filter?: BaseFilter): QueryResult<MCPServerRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search?.trim().toLowerCase() ?? '';\n\n const variables = useMemo(\n () => ({\n // MCPConnectionFilterInput has no free-text field — search is narrowed on the client.\n filters: { workspaceId },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback(\n (data: ListMcpConnectionsQuery | undefined): MCPServerRecord[] => {\n const rows = selectServers(data);\n if (!search) return rows;\n return rows.filter((row) => row.name.toLowerCase().includes(search));\n },\n [search]\n );\n\n return useWorkspaceQuery<ListMcpConnectionsQuery, MCPServerRecord[]>({\n document: ListMcpConnectionsDocument,\n variables,\n select,\n fallback: NO_SERVERS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load MCP servers',\n });\n}\n\nexport function useMCPServer(serverId: string | undefined): QueryResult<MCPServerRecord | null> {\n const variables = useMemo(() => ({ id: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<GetMcpConnectionQuery, MCPServerRecord | null>({\n document: GetMcpConnectionDocument,\n variables,\n select: selectServer,\n fallback: null,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP server',\n });\n}\n\nexport function useMCPTools(serverId: string | undefined): QueryResult<MCPToolRecord[]> {\n const variables = useMemo(() => ({ connectionId: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<ListMcpToolsQuery, MCPToolRecord[]>({\n document: ListMcpToolsDocument,\n variables,\n select: selectTools,\n fallback: NO_TOOLS,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP tools',\n });\n}\n\nexport function useMCPResources(serverId: string | undefined): QueryResult<MCPResourceRecord[]> {\n const variables = useMemo(() => ({ connectionId: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<ListMcpResourcesQuery, MCPResourceRecord[]>({\n document: ListMcpResourcesDocument,\n variables,\n select: selectResources,\n fallback: NO_RESOURCES,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP resources',\n });\n}\n\nexport function useCreateMCPServer() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: CreateMCPServerVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, CREATE_CONNECTION_FIELDS),\n }),\n [workspaceId]\n );\n\n return useWorkspaceMutation<\n CreateMcpConnectionMutation,\n CreateMCPServerVariables,\n MCPServerRecord\n >({\n document: CreateMcpConnectionDocument,\n variables,\n select: (data) => data?.createMCPConnection,\n errorMessage: 'Failed to connect MCP server',\n });\n}\n\nexport function useUpdateMCPServer() {\n return useWorkspaceMutation<\n UpdateMcpConnectionMutation,\n UpdateMCPServerVariables,\n MCPServerRecord\n >({\n document: UpdateMcpConnectionDocument,\n variables: ({ serverId, input }) => ({\n id: serverId,\n input: buildMutationInput(input, UPDATE_CONNECTION_FIELDS),\n }),\n select: (data) => data?.updateMCPConnection,\n errorMessage: 'Failed to update MCP server',\n });\n}\n\nexport function useDeleteMCPServer() {\n return useWorkspaceMutation<DeleteMcpConnectionMutation, string, boolean>({\n document: DeleteMcpConnectionDocument,\n variables: (serverId) => ({ id: serverId }),\n select: (data) => data?.deleteMCPConnection,\n errorMessage: 'Failed to disconnect MCP server',\n });\n}\n\nexport function useTestMCPConnection() {\n return useWorkspaceMutation<TestMcpConnectionMutation, string, boolean>({\n document: TestMcpConnectionDocument,\n variables: (serverId) => ({ id: serverId }),\n select: (data) => data?.testMCPConnection,\n errorMessage: 'Failed to test MCP connection',\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMCPServers.js","names":[],"sources":["../../../src/botlit/hooks/useMCPServers.ts"],"sourcesContent":["/**\n * MCP Servers Hooks\n * @module botlit/hooks\n *\n * Backed by the live `listMCPConnections` / `getMCPConnection` / `listMCPTools`\n * / `listMCPResources` operations and the create/update/delete/test mutations on\n * wspace-botlit-svc.\n *\n * The service models an MCP server as an `MCPConnection`: `type` is the\n * transport, `config` holds the endpoint, and `status` reports health.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n CreateMcpConnectionDocument,\n DeleteMcpConnectionDocument,\n GetMcpConnectionDocument,\n ListMcpConnectionsDocument,\n ListMcpResourcesDocument,\n ListMcpToolsDocument,\n TestMcpConnectionDocument,\n UpdateMcpConnectionDocument,\n UpdateMcpToolDocument,\n type CreateMcpConnectionMutation,\n type DeleteMcpConnectionMutation,\n type GetMcpConnectionQuery,\n type ListMcpConnectionsQuery,\n type ListMcpResourcesQuery,\n type ListMcpToolsQuery,\n type TestMcpConnectionMutation,\n type UpdateMcpConnectionMutation,\n type UpdateMcpToolMutation,\n} from '../../generated/wspace-operations';\nimport type {\n CreateMcpConnectionInput,\n McpToolRiskLevel,\n UpdateMcpConnectionInput,\n UpdateMcpToolInput,\n} from '../../generated/wspace-types';\nimport type { BaseFilter } from '../types';\nimport { buildMutationInput, fieldsOf, type GraphQLInput } from './internal/mutationInput';\nimport {\n useWorkspaceId,\n useWorkspaceMutation,\n useWorkspaceQuery,\n type QueryResult,\n} from './internal/workspaceGateway';\n\nconst LIST_LIMIT = 100;\n\nexport interface MCPServerRecord {\n id: string;\n name: string;\n /** Transport / server kind, e.g. `HTTP_JSON`. */\n type: string;\n status: string;\n config: Record<string, unknown>;\n credentialsHash?: string | null;\n errorMessage?: string | null;\n lastConnectedAt?: string | null;\n lastErrorAt?: string | null;\n deletedAt?: string | null;\n metadata?: Record<string, unknown> | null;\n createdAt: string;\n updatedAt: string;\n createdById: string;\n updatedById: string;\n workspaceId: string;\n}\n\nexport interface MCPToolRecord {\n id: string;\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n riskLevel: McpToolRiskLevel;\n}\n\nexport interface MCPResourceRecord {\n name: string;\n uri: string;\n description?: string | null;\n mimeType?: string | null;\n}\n\n/** `CreateMCPConnectionInput` minus the `workspaceId` the hook supplies. */\nexport type CreateMCPServerVariables = Omit<GraphQLInput<CreateMcpConnectionInput>, 'workspaceId'>;\n\nexport interface UpdateMCPServerVariables {\n serverId: string;\n input: GraphQLInput<UpdateMcpConnectionInput>;\n}\n\nexport interface UpdateMCPToolVariables {\n toolId: string;\n input: GraphQLInput<UpdateMcpToolInput>;\n}\n\nconst CREATE_CONNECTION_FIELDS = fieldsOf<CreateMcpConnectionInput>({\n config: true,\n credentials: true,\n metadata: true,\n name: true,\n type: true,\n workspaceId: true,\n});\n\nconst UPDATE_CONNECTION_FIELDS = fieldsOf<UpdateMcpConnectionInput>({\n config: true,\n credentials: true,\n metadata: true,\n name: true,\n});\n\nconst NO_SERVERS: MCPServerRecord[] = [];\nconst NO_TOOLS: MCPToolRecord[] = [];\nconst NO_RESOURCES: MCPResourceRecord[] = [];\n\n/** `CONNECTED` is the only status that means the server is usable right now. */\nexport function isMCPServerHealthy(status: string | null | undefined): boolean {\n return status === 'CONNECTED';\n}\n\nexport function isMCPServerUnhealthy(status: string | null | undefined): boolean {\n return status === 'ERROR' || status === 'DISCONNECTED';\n}\n\n/** Endpoint the connection points at — the service stores it on the free-form config. */\nexport function mcpServerEndpoint(server: Pick<MCPServerRecord, 'config'>): string | undefined {\n const url = server.config?.url;\n return typeof url === 'string' ? url : undefined;\n}\n\n/** Optional human description the UI stores alongside the endpoint. */\nexport function mcpServerDescription(server: Pick<MCPServerRecord, 'config'>): string | undefined {\n const description = server.config?.description;\n return typeof description === 'string' ? description : undefined;\n}\n\nfunction selectServers(data: ListMcpConnectionsQuery | undefined): MCPServerRecord[] {\n return data?.listMCPConnections ?? NO_SERVERS;\n}\n\nfunction selectServer(data: GetMcpConnectionQuery | undefined): MCPServerRecord | null {\n return data?.getMCPConnection ?? null;\n}\n\nfunction selectTools(data: ListMcpToolsQuery | undefined): MCPToolRecord[] {\n return data?.listMCPTools ?? NO_TOOLS;\n}\n\nfunction selectResources(data: ListMcpResourcesQuery | undefined): MCPResourceRecord[] {\n return data?.listMCPResources ?? NO_RESOURCES;\n}\n\nexport const mcpServerKeys = {\n all: ['mcpServers'] as const,\n lists: () => [...mcpServerKeys.all, 'list'] as const,\n list: (filter?: BaseFilter) => [...mcpServerKeys.lists(), filter] as const,\n details: () => [...mcpServerKeys.all, 'detail'] as const,\n detail: (id: string) => [...mcpServerKeys.details(), id] as const,\n resources: (serverId?: string) => [...mcpServerKeys.all, 'resources', serverId] as const,\n tools: (serverId?: string) => [...mcpServerKeys.all, 'tools', serverId] as const,\n};\n\nexport function useMCPServers(filter?: BaseFilter): QueryResult<MCPServerRecord[]> {\n const workspaceId = useWorkspaceId();\n const search = filter?.search?.trim().toLowerCase() ?? '';\n\n const variables = useMemo(\n () => ({\n // MCPConnectionFilterInput has no free-text field — search is narrowed on the client.\n filters: { workspaceId },\n pagination: { limit: LIST_LIMIT, offset: 0 },\n }),\n [workspaceId]\n );\n\n const select = useCallback(\n (data: ListMcpConnectionsQuery | undefined): MCPServerRecord[] => {\n const rows = selectServers(data);\n if (!search) return rows;\n return rows.filter((row) => row.name.toLowerCase().includes(search));\n },\n [search]\n );\n\n return useWorkspaceQuery<ListMcpConnectionsQuery, MCPServerRecord[]>({\n document: ListMcpConnectionsDocument,\n variables,\n select,\n fallback: NO_SERVERS,\n enabled: Boolean(workspaceId),\n errorMessage: 'Failed to load MCP servers',\n });\n}\n\nexport function useMCPServer(serverId: string | undefined): QueryResult<MCPServerRecord | null> {\n const variables = useMemo(() => ({ id: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<GetMcpConnectionQuery, MCPServerRecord | null>({\n document: GetMcpConnectionDocument,\n variables,\n select: selectServer,\n fallback: null,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP server',\n });\n}\n\nexport function useMCPTools(serverId: string | undefined): QueryResult<MCPToolRecord[]> {\n const variables = useMemo(() => ({ connectionId: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<ListMcpToolsQuery, MCPToolRecord[]>({\n document: ListMcpToolsDocument,\n variables,\n select: selectTools,\n fallback: NO_TOOLS,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP tools',\n });\n}\n\nexport function useMCPResources(serverId: string | undefined): QueryResult<MCPResourceRecord[]> {\n const variables = useMemo(() => ({ connectionId: serverId ?? '' }), [serverId]);\n\n return useWorkspaceQuery<ListMcpResourcesQuery, MCPResourceRecord[]>({\n document: ListMcpResourcesDocument,\n variables,\n select: selectResources,\n fallback: NO_RESOURCES,\n enabled: Boolean(serverId),\n errorMessage: 'Failed to load MCP resources',\n });\n}\n\nexport function useCreateMCPServer() {\n const workspaceId = useWorkspaceId();\n\n const variables = useCallback(\n (input: CreateMCPServerVariables) => ({\n input: buildMutationInput({ ...input, workspaceId }, CREATE_CONNECTION_FIELDS),\n }),\n [workspaceId]\n );\n\n return useWorkspaceMutation<\n CreateMcpConnectionMutation,\n CreateMCPServerVariables,\n MCPServerRecord\n >({\n document: CreateMcpConnectionDocument,\n variables,\n select: (data) => data?.createMCPConnection,\n errorMessage: 'Failed to connect MCP server',\n });\n}\n\nexport function useUpdateMCPServer() {\n return useWorkspaceMutation<\n UpdateMcpConnectionMutation,\n UpdateMCPServerVariables,\n MCPServerRecord\n >({\n document: UpdateMcpConnectionDocument,\n variables: ({ serverId, input }) => ({\n id: serverId,\n input: buildMutationInput(input, UPDATE_CONNECTION_FIELDS),\n }),\n select: (data) => data?.updateMCPConnection,\n errorMessage: 'Failed to update MCP server',\n });\n}\n\nexport function useDeleteMCPServer() {\n return useWorkspaceMutation<DeleteMcpConnectionMutation, string, boolean>({\n document: DeleteMcpConnectionDocument,\n variables: (serverId) => ({ id: serverId }),\n select: (data) => data?.deleteMCPConnection,\n errorMessage: 'Failed to disconnect MCP server',\n });\n}\n\nexport function useTestMCPConnection() {\n return useWorkspaceMutation<TestMcpConnectionMutation, string, boolean>({\n document: TestMcpConnectionDocument,\n variables: (serverId) => ({ id: serverId }),\n select: (data) => data?.testMCPConnection,\n errorMessage: 'Failed to test MCP connection',\n });\n}\n\nexport function useUpdateMCPTool() {\n return useWorkspaceMutation<UpdateMcpToolMutation, UpdateMCPToolVariables, MCPToolRecord>({\n document: UpdateMcpToolDocument,\n variables: ({ toolId, input }) => ({ id: toolId, input }),\n select: (data) => data?.updateMCPTool,\n errorMessage: 'Failed to update MCP tool risk level',\n });\n}\n"],"mappings":";;;;;AAgDA,IAAM,IAAa,KAkDb,IAA2B,EAAmC;CAClE,QAAQ;CACR,aAAa;CACb,UAAU;CACV,MAAM;CACN,MAAM;CACN,aAAa;CACd,CAAC,EAEI,IAA2B,EAAmC;CAClE,QAAQ;CACR,aAAa;CACb,UAAU;CACV,MAAM;CACP,CAAC,EAEI,IAAgC,EAAE,EAClC,IAA4B,EAAE,EAC9B,IAAoC,EAAE;AAG5C,SAAgB,EAAmB,GAA4C;AAC7E,QAAO,MAAW;;AAQpB,SAAgB,EAAkB,GAA6D;CAC7F,IAAM,IAAM,EAAO,QAAQ;AAC3B,QAAO,OAAO,KAAQ,WAAW,IAAM,KAAA;;AAIzC,SAAgB,EAAqB,GAA6D;CAChG,IAAM,IAAc,EAAO,QAAQ;AACnC,QAAO,OAAO,KAAgB,WAAW,IAAc,KAAA;;AAGzD,SAAS,EAAc,GAA8D;AACnF,QAAO,GAAM,sBAAsB;;AAGrC,SAAS,EAAa,GAAiE;AACrF,QAAO,GAAM,oBAAoB;;AAGnC,SAAS,EAAY,GAAsD;AACzE,QAAO,GAAM,gBAAgB;;AAG/B,SAAS,EAAgB,GAA8D;AACrF,QAAO,GAAM,oBAAoB;;AAanC,SAAgB,EAAc,GAAqD;CACjF,IAAM,IAAc,GAAgB,EAC9B,IAAS,GAAQ,QAAQ,MAAM,CAAC,aAAa,IAAI;AAoBvD,QAAO,EAA8D;EACnE,UAAU;EACV,WApBgB,SACT;GAEL,SAAS,EAAE,gBAAa;GACxB,YAAY;IAAE,OAAO;IAAY,QAAQ;IAAG;GAC7C,GACD,CAAC,EAAY,CACd;EAcC,QAZa,GACZ,MAAiE;GAChE,IAAM,IAAO,EAAc,EAAK;AAEhC,UADK,IACE,EAAK,QAAQ,MAAQ,EAAI,KAAK,aAAa,CAAC,SAAS,EAAO,CAAC,GADhD;KAGtB,CAAC,EAAO,CACT;EAMC,UAAU;EACV,SAAS,EAAQ;EACjB,cAAc;EACf,CAAC;;AAGJ,SAAgB,EAAa,GAAmE;AAG9F,QAAO,EAAiE;EACtE,UAAU;EACV,WAJgB,SAAe,EAAE,IAAI,KAAY,IAAI,GAAG,CAAC,EAAS,CAAC;EAKnE,QAAQ;EACR,UAAU;EACV,SAAS,EAAQ;EACjB,cAAc;EACf,CAAC;;AAGJ,SAAgB,EAAY,GAA4D;AAGtF,QAAO,EAAsD;EAC3D,UAAU;EACV,WAJgB,SAAe,EAAE,cAAc,KAAY,IAAI,GAAG,CAAC,EAAS,CAAC;EAK7E,QAAQ;EACR,UAAU;EACV,SAAS,EAAQ;EACjB,cAAc;EACf,CAAC;;AAGJ,SAAgB,EAAgB,GAAgE;AAG9F,QAAO,EAA8D;EACnE,UAAU;EACV,WAJgB,SAAe,EAAE,cAAc,KAAY,IAAI,GAAG,CAAC,EAAS,CAAC;EAK7E,QAAQ;EACR,UAAU;EACV,SAAS,EAAQ;EACjB,cAAc;EACf,CAAC;;AAGJ,SAAgB,IAAqB;CACnC,IAAM,IAAc,GAAgB;AASpC,QAAO,EAIL;EACA,UAAU;EACV,WAbgB,GACf,OAAqC,EACpC,OAAO,EAAmB;GAAE,GAAG;GAAO;GAAa,EAAE,EAAyB,EAC/E,GACD,CAAC,EAAY,CACd;EASC,SAAS,MAAS,GAAM;EACxB,cAAc;EACf,CAAC;;AAGJ,SAAgB,IAAqB;AACnC,QAAO,EAIL;EACA,UAAU;EACV,YAAY,EAAE,aAAU,gBAAa;GACnC,IAAI;GACJ,OAAO,EAAmB,GAAO,EAAyB;GAC3D;EACD,SAAS,MAAS,GAAM;EACxB,cAAc;EACf,CAAC;;AAGJ,SAAgB,IAAqB;AACnC,QAAO,EAAmE;EACxE,UAAU;EACV,YAAY,OAAc,EAAE,IAAI,GAAU;EAC1C,SAAS,MAAS,GAAM;EACxB,cAAc;EACf,CAAC;;AAGJ,SAAgB,IAAuB;AACrC,QAAO,EAAiE;EACtE,UAAU;EACV,YAAY,OAAc,EAAE,IAAI,GAAU;EAC1C,SAAS,MAAS,GAAM;EACxB,cAAc;EACf,CAAC;;AAGJ,SAAgB,IAAmB;AACjC,QAAO,EAAmF;EACxF,UAAU;EACV,YAAY,EAAE,WAAQ,gBAAa;GAAE,IAAI;GAAQ;GAAO;EACxD,SAAS,MAAS,GAAM;EACxB,cAAc;EACf,CAAC"}
|
|
@@ -218,7 +218,7 @@ var B = ({ isNew: F = !1 }) => {
|
|
|
218
218
|
children: [
|
|
219
219
|
/* @__PURE__ */ D(T, {
|
|
220
220
|
icon: /* @__PURE__ */ D(A, { size: 18 }),
|
|
221
|
-
children: "This is one external agent registered in your A2A network. Inspect its public agent card — the skills it advertises, its provider and trust level — and decide how your own agents may delegate work to it. Keeping this entry accurate is what lets
|
|
221
|
+
children: "This is one external agent registered in your A2A network. Inspect its public agent card — the skills it advertises, its provider and trust level — and decide how your own agents may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off tasks to agents outside your workspace."
|
|
222
222
|
}),
|
|
223
223
|
K && /* @__PURE__ */ O(r, { children: [/* @__PURE__ */ D(o, { children: /* @__PURE__ */ D(s, { children: "Basic Information" }) }), /* @__PURE__ */ O(i, {
|
|
224
224
|
className: "space-y-4",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AAgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\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 (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\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('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\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={deleteA2AAgentResult.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 Remove\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets Botlit safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\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.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-green-500 bg-green-500/10' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"A2AAgentDetailPage.js","names":[],"sources":["../../../src/botlit/pages/A2AAgentDetailPage.tsx"],"sourcesContent":["/**\n * A2A Agent Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Edit,\n Trash2,\n Share2,\n Shield,\n Globe,\n Key,\n Zap,\n ExternalLink,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport {\n useA2AAgent,\n useRegisterA2AAgent,\n useUpdateA2AAgent,\n useDeleteA2AAgent,\n readAgentCard,\n readEntitlements,\n validateAgentCard,\n type A2AAgentRecord,\n} from '../hooks/useA2A';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { TrustLevel } from '../types';\n\ninterface A2AAgentDetailPageProps {\n isNew?: boolean;\n}\n\n/** Editable subset of an A2A registry entry. */\ninterface A2AAgentForm {\n name: string;\n description: string;\n wellKnownUrl: string;\n trustLevel: TrustLevel;\n /** The `/.well-known/agent.json` document, edited as raw JSON. */\n agentCardJson: string;\n}\n\nconst TRUST_LEVELS: TrustLevel[] = ['UNVERIFIED', 'VERIFIED_PUBLISHER', 'INTERNAL'];\n\nconst EMPTY_AGENT_CARD_JSON = JSON.stringify(\n {\n name: '',\n description: '',\n url: '',\n version: '1.0.0',\n capabilities: { streaming: false, pushNotifications: false, stateTransitionHistory: false },\n authentication: { schemes: ['bearer'] },\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n skills: [],\n },\n null,\n 2\n);\n\nconst DEFAULT_FORM: A2AAgentForm = {\n name: '',\n description: '',\n wellKnownUrl: '',\n trustLevel: 'UNVERIFIED',\n agentCardJson: EMPTY_AGENT_CARD_JSON,\n};\n\nfunction toTrustLevel(value: string): TrustLevel {\n return TRUST_LEVELS.includes(value as TrustLevel) ? (value as TrustLevel) : 'UNVERIFIED';\n}\n\nfunction toForm(agent: A2AAgentRecord): A2AAgentForm {\n return {\n name: agent.name,\n description: agent.description ?? '',\n wellKnownUrl: agent.wellKnownUrl ?? '',\n trustLevel: toTrustLevel(agent.trustLevel),\n agentCardJson: JSON.stringify(agent.agentCard ?? {}, null, 2),\n };\n}\n\n/** Parses the edited agent card; returns undefined when the JSON is malformed. */\nfunction parseAgentCard(json: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(json);\n return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const A2AAgentDetailPage: FC<A2AAgentDetailPageProps> = ({ isNew = false }) => {\n const { agentId } = useParams();\n const { navigateTo } = useBotlit();\n const { data: a2aAgent, loading } = useA2AAgent(isNew ? undefined : agentId);\n const [createA2AAgent, createA2AAgentResult] = useRegisterA2AAgent();\n const [updateA2AAgent, updateA2AAgentResult] = useUpdateA2AAgent();\n const [deleteA2AAgent, deleteA2AAgentResult] = useDeleteA2AAgent();\n\n const [isEditing, setIsEditing] = useState(isNew);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [formData, setFormData] = useState<A2AAgentForm>(DEFAULT_FORM);\n\n // Seed the form once the entry arrives so \"Edit\" opens on current values.\n useEffect(() => {\n if (a2aAgent && !isNew) {\n setFormData(toForm(a2aAgent));\n }\n }, [a2aAgent, isNew]);\n\n // While editing, preview the card being typed; otherwise the stored one.\n const agentCard = useMemo(\n () =>\n readAgentCard(\n isEditing ? parseAgentCard(formData.agentCardJson) : (a2aAgent?.agentCard ?? undefined)\n ),\n [isEditing, formData.agentCardJson, a2aAgent]\n );\n\n const entitlements = useMemo(\n () => readEntitlements(a2aAgent?.entitlements),\n [a2aAgent?.entitlements]\n );\n\n if (loading && !isNew) {\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 (!a2aAgent && !isNew) {\n return (\n <PageLayout title=\"A2A Agent Not Found\">\n <EmptyState\n illustration=\"empty-people\"\n title=\"A2A Agent Not Found\"\n description=\"The A2A agent doesn't exist.\"\n action={<Button onClick={() => navigateTo('a2a')}>Back to A2A Registry</Button>}\n />\n </PageLayout>\n );\n }\n\n const getTrustBadgeVariant = (level: TrustLevel) => {\n switch (level) {\n case 'INTERNAL':\n return 'success';\n case 'VERIFIED_PUBLISHER':\n return 'default';\n default:\n return 'secondary';\n }\n };\n\n const handleSave = async () => {\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n\n // `agentCard` is `JSON!` on the service — a registration without a usable\n // card is rejected, so the document is parsed and checked before sending.\n const agentCard = parseAgentCard(formData.agentCardJson);\n if (!agentCard) {\n toast.error('Agent card must be a valid JSON object');\n return;\n }\n const validation = validateAgentCard(agentCard);\n if (!validation.valid) {\n toast.error(validation.errors[0]);\n return;\n }\n\n if (isNew) {\n try {\n const created = await createA2AAgent({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n });\n toast.success(`Registered \"${created.name}\"`);\n navigateTo(`a2a/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to register A2A agent');\n }\n return;\n }\n\n if (!agentId) return;\n try {\n await updateA2AAgent({\n agentId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n wellKnownUrl: formData.wellKnownUrl.trim() || null,\n trustLevel: formData.trustLevel,\n agentCard,\n },\n });\n toast.success('A2A agent updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update A2A agent');\n }\n };\n\n const handleDelete = async () => {\n if (!agentId) return;\n try {\n await deleteA2AAgent(agentId);\n if (isNative()) void nativeNotify('success');\n toast.success('A2A agent removed');\n navigateTo('a2a');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to remove A2A agent');\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('a2a')}>\n <ArrowLeft size={20} />\n </Button>\n <Share2 size={24} className=\"text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{isNew ? 'Register A2A Agent' : a2aAgent?.name}</span>\n {!isNew && a2aAgent && <StatusBadge status={a2aAgent.status} />}\n {!isNew && a2aAgent && (\n <Badge variant={getTrustBadgeVariant(toTrustLevel(a2aAgent.trustLevel))}>\n {a2aAgent.trustLevel.replace('_', ' ')}\n </Badge>\n )}\n </div>\n {!isNew && a2aAgent?.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{a2aAgent.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => (isNew ? navigateTo('a2a') : setIsEditing(false))}\n >\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n isLoading={createA2AAgentResult.loading || updateA2AAgentResult.loading}\n >\n {isNew ? 'Register Agent' : 'Save Changes'}\n </Button>\n </>\n ) : (\n <>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => {\n if (a2aAgent) setFormData(toForm(a2aAgent));\n setIsEditing(true);\n }}\n >\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={deleteA2AAgentResult.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 Remove\n </Button>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Globe size={18} />}>\n This is one external agent registered in your A2A network. Inspect its public agent card —\n the skills it advertises, its provider and trust level — and decide how your own agents\n may delegate work to it. Keeping this entry accurate is what lets BotManor safely hand off\n tasks to agents outside your workspace.\n </PagePurpose>\n\n {/* Basic Info */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"e.g., External Weather Agent\"\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Describe what this A2A agent does...\"\n rows={3}\n />\n </FormField>\n <FormField label=\"Well-Known URL\" description=\"URL to fetch agent.json\">\n <Input\n value={formData.wellKnownUrl}\n onChange={(e) => setFormData({ ...formData, wellKnownUrl: e.target.value })}\n placeholder=\"https://example.com/.well-known/agent.json\"\n />\n </FormField>\n <FormField label=\"Trust Level\">\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.trustLevel}\n onChange={(e) =>\n setFormData({ ...formData, trustLevel: toTrustLevel(e.target.value) })\n }\n >\n <option value=\"UNVERIFIED\">Unverified</option>\n <option value=\"VERIFIED_PUBLISHER\">Verified Publisher</option>\n <option value=\"INTERNAL\">Internal</option>\n </select>\n </FormField>\n <FormField\n label=\"Agent Card (JSON)\"\n required\n description=\"Paste the agent's /.well-known/agent.json document\"\n >\n <Textarea\n value={formData.agentCardJson}\n onChange={(e) => setFormData({ ...formData, agentCardJson: e.target.value })}\n rows={12}\n className=\"font-mono text-xs\"\n />\n </FormField>\n {!parseAgentCard(formData.agentCardJson) && (\n <p className=\"text-sm text-status-error-text\">\n Agent card must be a valid JSON object.\n </p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Agent Card */}\n <Card treatment=\"glass\" glow>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Globe size={18} />\n Agent Card\n </CardTitle>\n <CardDescription>Public agent metadata per A2A spec</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {!isNew && a2aAgent?.wellKnownUrl && (\n <div className=\"flex items-center gap-2 p-3 bg-bg-sunken rounded-lg\">\n <Globe size={16} className=\"text-text-secondary\" />\n <a\n href={a2aAgent.wellKnownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {a2aAgent.wellKnownUrl}\n <ExternalLink size={12} />\n </a>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Agent URL</p>\n <p className=\"font-medium font-mono text-sm\">{agentCard.url || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Version</p>\n <Badge variant=\"outline\">{agentCard.version || MISSING_VALUE}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Provider</p>\n <p className=\"font-medium\">{agentCard.providerOrganization || MISSING_VALUE}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documentation</p>\n {agentCard.documentationUrl ? (\n <a\n href={agentCard.documentationUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline flex items-center gap-1\"\n >\n View Docs <ExternalLink size={12} />\n </a>\n ) : (\n <p className=\"text-text-secondary\">{MISSING_VALUE}</p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Capabilities */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Capabilities\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n {[\n {\n key: 'streaming',\n label: 'Streaming',\n value: agentCard.capabilities.streaming,\n },\n {\n key: 'pushNotifications',\n label: 'Push Notifications',\n value: agentCard.capabilities.pushNotifications,\n },\n {\n key: 'stateTransitionHistory',\n label: 'State History',\n value: agentCard.capabilities.stateTransitionHistory,\n },\n ].map((cap) => (\n <div\n key={cap.key}\n className={`p-3 rounded-lg border ${cap.value ? 'border-green-500 bg-green-500/10' : 'border-border-subtle bg-bg-sunken'}`}\n >\n <p className=\"font-medium\">{cap.label}</p>\n <Badge variant={cap.value ? 'success' : 'secondary'}>\n {cap.value ? 'Supported' : 'Not Supported'}\n </Badge>\n </div>\n ))}\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Input Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultInputModes.length > 0 ? (\n agentCard.defaultInputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Output Modes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.defaultOutputModes.length > 0 ? (\n agentCard.defaultOutputModes.map((mode) => (\n <Badge key={mode} variant=\"outline\">\n {mode}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Authentication */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Key size={18} />\n Authentication\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <p className=\"text-sm text-text-secondary\">Supported Schemes</p>\n <div className=\"flex flex-wrap gap-2\">\n {agentCard.authenticationSchemes.length > 0 ? (\n agentCard.authenticationSchemes.map((scheme) => (\n <Badge key={scheme} variant=\"outline\">\n {scheme}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None specified</span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Skills */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap size={18} />\n Skills\n </CardTitle>\n <CardDescription>Capabilities exposed by this agent</CardDescription>\n </CardHeader>\n <CardContent>\n {agentCard.skills.length > 0 ? (\n <div className=\"space-y-3\">\n {agentCard.skills.map((skill) => (\n <div key={skill.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h4 className=\"font-medium\">{skill.name}</h4>\n <p className=\"text-sm text-text-secondary\">{skill.description}</p>\n </div>\n <Badge variant=\"outline\">{skill.id}</Badge>\n </div>\n {skill.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {skill.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n {skill.examples.length > 0 && (\n <div className=\"mt-2\">\n <p className=\"text-xs text-text-secondary\">Examples:</p>\n <ul className=\"text-sm text-text-secondary list-disc list-inside\">\n {skill.examples.map((ex, i) => (\n <li key={i}>{ex}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No skills defined</p>\n )}\n </CardContent>\n </Card>\n\n {/* Entitlements */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Entitlements\n </CardTitle>\n <CardDescription>Which apps/agents can invoke this A2A agent</CardDescription>\n </CardHeader>\n <CardContent>\n {entitlements.length > 0 ? (\n <div className=\"space-y-3\">\n {entitlements.map((entitlement) => (\n <div key={entitlement.id} className=\"p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entitlement.sourceType}\n </Badge>\n <span className=\"font-mono text-sm\">{entitlement.sourceId}</span>\n </div>\n {entitlement.maxHops && (\n <span className=\"text-sm text-text-secondary\">\n Max Hops: {entitlement.maxHops}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Allowed Skills</p>\n {entitlement.allowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.allowedSkills.map((s) => (\n <Badge key={s} variant=\"success\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">All</span>\n )}\n </div>\n <div>\n <p className=\"text-text-secondary\">Disallowed Skills</p>\n {entitlement.disallowedSkills.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {entitlement.disallowedSkills.map((s) => (\n <Badge key={s} variant=\"destructive\" className=\"text-xs\">\n {s}\n </Badge>\n ))}\n </div>\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-text-secondary\">No entitlements configured</p>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n {!isNew && a2aAgent && (\n <Card>\n <CardHeader>\n <CardTitle>Metadata</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(a2aAgent.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Revision</p>\n <p className=\"font-medium\">{a2aAgent.revision}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{a2aAgent.visibility}</Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|