@inkeep/agents-manage-ui 0.6.6 → 0.7.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/.next/standalone/agents-manage-ui/.next/BUILD_ID +1 -1
- package/.next/standalone/agents-manage-ui/.next/app-build-manifest.json +68 -68
- package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +2 -2
- package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
- package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +15 -15
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
- package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2124.js +13 -13
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2184.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3645.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{3793.js → 4370.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6726.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{7067.js → 6992.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8389.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{4108.js → 9772.js} +11 -11
- package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{7232-63c17ffc2737968a.js → 1016-065c7c4004850849.js} +13 -13
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-b90b21b559925fc6.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6705-978d47db41063bdb.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6709-d1f3493d1e80cb0e.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-8d05e2e8db9def49.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{4931-1291b39db1c5dedf.js → 8675-4c7d3c3828d84535.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-79109cbb97bd2fe5.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/{page-ac2f8091f8a53342.js → page-c0ed5ffd69a57af5.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/{page-ac2f8091f8a53342.js → page-c0ed5ffd69a57af5.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/{page-e3e9163c148c1239.js → page-40d1360e37d37109.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-7d5dcfc0e775458a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-ad3217b28b09b5a5.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-0ef881f4f392086a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-876f0c019187591d.js → page-e7239c0637ac7efa.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page-736bec9f0541e08f.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/page-736bec9f0541e08f.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/{page-e289128665acffb1.js → page-21d8913c3297829c.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-b574c5e1d3df7e73.js → page-83f03615dc11014b.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-95c13c0305dfddfb.js → page-da8ddb54272917ab.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e89edd98413b78a4.js → page-8ace8753502148be.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-6ffb17fc6301b481.js → page-02feacd52d06239a.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-aa753859a6cd98f8.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-539caba402ab546f.js → page-a393f3437852e5f9.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-5c0b6a43b3000e09.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-8731d2271ec07d33.js → page-8be4791ce624489e.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-555f353076460fa9.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-544544e7fd94b1de.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-48d40ad8a53bfc9b.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/css/98c416ff19152db0.css +1 -0
- package/.next/standalone/agents-manage-ui/package.json +2 -2
- package/.next/standalone/packages/agents-core/package.json +1 -1
- package/package.json +5 -5
- package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.tsx +12 -12
- package/src/components/credentials/credential-tools-list.tsx +0 -25
- package/src/components/graph/configuration/node-types.tsx +6 -2
- package/src/components/graph/graph.tsx +66 -8
- package/src/components/graph/nodes/mcp-node.tsx +6 -11
- package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +69 -68
- package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +44 -44
- package/src/components/graph/sidepane/sidepane.tsx +5 -0
- package/src/components/mcp-servers/form/mcp-server-form.tsx +47 -46
- package/src/components/mcp-servers/mcp-tool-item.tsx +3 -0
- package/src/components/mcp-servers/view-mcp-server-details.tsx +76 -37
- package/src/components/ui/copyable-multi-line-code.tsx +17 -0
- package/src/features/graph/domain/__tests__/serialize.test.ts +21 -51
- package/src/features/graph/domain/deserialize.ts +5 -26
- package/src/features/graph/domain/serialize.ts +56 -52
- package/src/lib/api/tools.ts +2 -92
- package/src/lib/utils/orphaned-tools-detector.ts +145 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/241.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3995.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6300.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6838.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9435.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/1984-b89ef6de05884930.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-1503999d28bd793b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-0892927ad1317753.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/9202-65ce376d47468b8c.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-b12544e5422bb5f5.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-188cdc82aa6e4bc3.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-a45222825f0acc29.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-1952e6ae0b259e5e.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page-b945a6e458056f00.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/page-b945a6e458056f00.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-190351c7f4b5d2f8.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-f819dadc0a6d3e17.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-d48cbe5a8a533023.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-39ca81e212d9fe4a.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-46ffc47ebd7010d6.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/70e9093ef73fbe1b.css +0 -1
- /package/.next/standalone/agents-manage-ui/.next/static/{rTyWV-dnM3YFFcXfKZYFu → vo7pWHFkBgZcQOQOKotiJ}/_buildManifest.js +0 -0
- /package/.next/standalone/agents-manage-ui/.next/static/{rTyWV-dnM3YFFcXfKZYFu → vo7pWHFkBgZcQOQOKotiJ}/_ssgManifest.js +0 -0
|
@@ -32,6 +32,8 @@ import type { FullGraphDefinition } from '@/lib/types/graph-full';
|
|
|
32
32
|
import type { MCPTool } from '@/lib/types/tools';
|
|
33
33
|
import { formatJsonField } from '@/lib/utils';
|
|
34
34
|
import { getErrorSummaryMessage, parseGraphValidationErrors } from '@/lib/utils/graph-error-parser';
|
|
35
|
+
import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
|
|
36
|
+
import { detectOrphanedToolsAndGetWarning } from '@/lib/utils/orphaned-tools-detector';
|
|
35
37
|
import { EdgeType, edgeTypes, initialEdges } from './configuration/edge-types';
|
|
36
38
|
import type { ContextConfig } from './configuration/graph-types';
|
|
37
39
|
import {
|
|
@@ -95,20 +97,59 @@ function Flow({
|
|
|
95
97
|
[]
|
|
96
98
|
);
|
|
97
99
|
|
|
100
|
+
// Helper to enrich MCP nodes with tool data
|
|
101
|
+
const enrichNodes = useCallback(
|
|
102
|
+
(nodes: Node[]): Node[] => {
|
|
103
|
+
return nodes.map((node) => {
|
|
104
|
+
if (node.type === NodeType.MCP && node.data && 'toolId' in node.data) {
|
|
105
|
+
const tool = toolLookup[node.data.toolId as string];
|
|
106
|
+
if (tool) {
|
|
107
|
+
let provider = null;
|
|
108
|
+
provider = getToolTypeAndName(tool).type;
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
...node,
|
|
112
|
+
data: {
|
|
113
|
+
...node.data,
|
|
114
|
+
name: tool.name,
|
|
115
|
+
imageUrl: tool.imageUrl,
|
|
116
|
+
provider,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return node;
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
[toolLookup]
|
|
125
|
+
);
|
|
126
|
+
|
|
98
127
|
const { nodes: graphNodes, edges: graphEdges } = useMemo(() => {
|
|
99
|
-
|
|
100
|
-
? deserializeGraphData(graph
|
|
128
|
+
const result = graph
|
|
129
|
+
? deserializeGraphData(graph)
|
|
101
130
|
: { nodes: initialNodes, edges: initialEdges };
|
|
102
|
-
|
|
131
|
+
return {
|
|
132
|
+
...result,
|
|
133
|
+
nodes: enrichNodes(result.nodes),
|
|
134
|
+
};
|
|
135
|
+
}, [graph, enrichNodes, initialNodes]);
|
|
103
136
|
|
|
104
137
|
// Create selectedTools lookup from graph data
|
|
105
138
|
const selectedToolsLookup = useMemo((): Record<string, Record<string, string[]>> => {
|
|
106
139
|
if (!graph?.agents) return {} as Record<string, Record<string, string[]>>;
|
|
107
140
|
|
|
108
141
|
const lookup: Record<string, Record<string, string[]>> = {};
|
|
109
|
-
Object.entries(graph.agents).forEach(([agentId,
|
|
110
|
-
if ('
|
|
111
|
-
|
|
142
|
+
Object.entries(graph.agents).forEach(([agentId, agentData]) => {
|
|
143
|
+
if ('canUse' in agentData && agentData.canUse) {
|
|
144
|
+
const toolsMap: Record<string, string[]> = {};
|
|
145
|
+
agentData.canUse.forEach((tool) => {
|
|
146
|
+
if (tool.toolSelection) {
|
|
147
|
+
toolsMap[tool.toolId] = tool.toolSelection;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (Object.keys(toolsMap).length > 0) {
|
|
151
|
+
lookup[agentId] = toolsMap;
|
|
152
|
+
}
|
|
112
153
|
}
|
|
113
154
|
});
|
|
114
155
|
return lookup;
|
|
@@ -116,7 +157,7 @@ function Flow({
|
|
|
116
157
|
|
|
117
158
|
const { screenToFlowPosition } = useReactFlow();
|
|
118
159
|
const {
|
|
119
|
-
nodes,
|
|
160
|
+
nodes: storeNodes,
|
|
120
161
|
edges,
|
|
121
162
|
setNodes,
|
|
122
163
|
setEdges,
|
|
@@ -129,6 +170,9 @@ function Flow({
|
|
|
129
170
|
clearSelection,
|
|
130
171
|
markUnsaved,
|
|
131
172
|
} = useGraphStore();
|
|
173
|
+
|
|
174
|
+
// Always use enriched nodes for ReactFlow
|
|
175
|
+
const nodes = useMemo(() => enrichNodes(storeNodes), [storeNodes, enrichNodes]);
|
|
132
176
|
const { nodeId, edgeId, setQueryState, openGraphPane, isOpen } = useSidePane();
|
|
133
177
|
const { errors, showErrors, setErrors, clearErrors, setShowErrors } = useGraphErrors();
|
|
134
178
|
|
|
@@ -444,12 +488,23 @@ function Flow({
|
|
|
444
488
|
);
|
|
445
489
|
|
|
446
490
|
const onSubmit = useCallback(async () => {
|
|
491
|
+
// Check for orphaned tools before saving
|
|
492
|
+
const warningMessage = detectOrphanedToolsAndGetWarning(nodes, selectedToolsLookup, toolLookup);
|
|
493
|
+
|
|
494
|
+
if (warningMessage) {
|
|
495
|
+
toast.warning(warningMessage, {
|
|
496
|
+
closeButton: true,
|
|
497
|
+
duration: 6000,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
447
501
|
const serializedData = serializeGraphData(
|
|
448
502
|
nodes,
|
|
449
503
|
edges,
|
|
450
504
|
metadata,
|
|
451
505
|
dataComponentLookup,
|
|
452
|
-
artifactComponentLookup
|
|
506
|
+
artifactComponentLookup,
|
|
507
|
+
selectedToolsLookup
|
|
453
508
|
);
|
|
454
509
|
|
|
455
510
|
const res = await saveGraph(
|
|
@@ -499,6 +554,8 @@ function Flow({
|
|
|
499
554
|
projectId,
|
|
500
555
|
clearErrors,
|
|
501
556
|
setErrors,
|
|
557
|
+
selectedToolsLookup,
|
|
558
|
+
toolLookup,
|
|
502
559
|
]);
|
|
503
560
|
|
|
504
561
|
return (
|
|
@@ -565,6 +622,7 @@ function Flow({
|
|
|
565
622
|
dataComponentLookup={dataComponentLookup}
|
|
566
623
|
artifactComponentLookup={artifactComponentLookup}
|
|
567
624
|
selectedToolsLookup={selectedToolsLookup}
|
|
625
|
+
toolLookup={toolLookup}
|
|
568
626
|
/>
|
|
569
627
|
{showPlayground && graph?.id && (
|
|
570
628
|
<Playground
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
import { type NodeProps, Position } from '@xyflow/react';
|
|
2
2
|
import { MCPToolImage } from '@/components/mcp-servers/mcp-tool-image';
|
|
3
|
-
import type { MCPTool } from '@/lib/types/tools';
|
|
4
3
|
|
|
5
|
-
import {
|
|
6
|
-
import { mcpNodeHandleId } from '../configuration/node-types';
|
|
4
|
+
import { type MCPNodeData, mcpNodeHandleId } from '../configuration/node-types';
|
|
7
5
|
import { BaseNode, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
|
|
8
6
|
import { Handle } from './handle';
|
|
9
7
|
|
|
10
|
-
export function MCPNode(props: NodeProps & { data:
|
|
8
|
+
export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
|
|
11
9
|
const { data, selected } = props;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
} catch (error) {
|
|
17
|
-
console.error(error);
|
|
18
|
-
}
|
|
10
|
+
|
|
11
|
+
const name = data.name || `Tool: ${data.toolId}`;
|
|
12
|
+
const imageUrl = data.imageUrl;
|
|
13
|
+
const provider = data.provider;
|
|
19
14
|
|
|
20
15
|
return (
|
|
21
16
|
<BaseNode
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Node, useReactFlow } from '@xyflow/react';
|
|
2
|
-
import { Check } from 'lucide-react';
|
|
2
|
+
import { Check, CircleAlert } from 'lucide-react';
|
|
3
3
|
import { useParams } from 'next/navigation';
|
|
4
4
|
import { getActiveTools } from '@/app/utils/active-tools';
|
|
5
5
|
import { MCPToolImage } from '@/components/mcp-servers/mcp-tool-image';
|
|
@@ -9,17 +9,21 @@ import { Input } from '@/components/ui/input';
|
|
|
9
9
|
import { Label } from '@/components/ui/label';
|
|
10
10
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
11
11
|
import { useGraphStore } from '@/features/graph/state/use-graph-store';
|
|
12
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
12
13
|
import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
|
|
14
|
+
import { getCurrentSelectedToolsForNode } from '@/lib/utils/orphaned-tools-detector';
|
|
13
15
|
import type { MCPNodeData } from '../../configuration/node-types';
|
|
14
16
|
|
|
15
17
|
interface MCPServerNodeEditorProps {
|
|
16
18
|
selectedNode: Node<MCPNodeData>;
|
|
17
19
|
selectedToolsLookup: Record<string, Record<string, string[]>>;
|
|
20
|
+
toolLookup: Record<string, MCPTool>;
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
export function MCPServerNodeEditor({
|
|
21
24
|
selectedNode,
|
|
22
25
|
selectedToolsLookup,
|
|
26
|
+
toolLookup,
|
|
23
27
|
}: MCPServerNodeEditorProps) {
|
|
24
28
|
const { updateNodeData } = useReactFlow();
|
|
25
29
|
const { tenantId, projectId } = useParams<{
|
|
@@ -27,63 +31,37 @@ export function MCPServerNodeEditor({
|
|
|
27
31
|
projectId: string;
|
|
28
32
|
}>();
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
availableTools: selectedNode.data.availableTools,
|
|
32
|
-
activeTools: selectedNode.data.config?.mcp?.activeTools,
|
|
33
|
-
});
|
|
34
|
-
|
|
34
|
+
// All hooks must be called before any early returns
|
|
35
35
|
const markUnsaved = useGraphStore((state) => state.markUnsaved);
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if ((selectedNode.data as any).tempSelectedTools !== undefined) {
|
|
40
|
-
return (selectedNode.data as any).tempSelectedTools;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Otherwise, get from the database/initial state
|
|
44
|
-
const allSelectedTools = new Set<string>();
|
|
45
|
-
let hasAnyData = false;
|
|
46
|
-
let hasEmptyArray = false;
|
|
47
|
-
let hasNullValue = false;
|
|
48
|
-
|
|
49
|
-
Object.values(selectedToolsLookup).forEach((agentTools) => {
|
|
50
|
-
const toolsForThisMCP = agentTools[selectedNode.data.id];
|
|
51
|
-
if (toolsForThisMCP !== undefined) {
|
|
52
|
-
hasAnyData = true;
|
|
53
|
-
if (Array.isArray(toolsForThisMCP) && toolsForThisMCP.length === 0) {
|
|
54
|
-
// Empty array = NONE selected
|
|
55
|
-
hasEmptyArray = true;
|
|
56
|
-
} else if (toolsForThisMCP === null) {
|
|
57
|
-
// null = ALL selected
|
|
58
|
-
hasNullValue = true;
|
|
59
|
-
} else if (Array.isArray(toolsForThisMCP)) {
|
|
60
|
-
// Specific tools selected
|
|
61
|
-
toolsForThisMCP.forEach((tool) => {
|
|
62
|
-
allSelectedTools.add(tool);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
});
|
|
37
|
+
// Only use toolLookup - single source of truth
|
|
38
|
+
const toolData = toolLookup[selectedNode.data.toolId];
|
|
67
39
|
|
|
68
|
-
|
|
69
|
-
if (hasNullValue) {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
40
|
+
const availableTools = toolData?.availableTools;
|
|
72
41
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
42
|
+
const activeTools = getActiveTools({
|
|
43
|
+
availableTools: availableTools,
|
|
44
|
+
activeTools: toolData?.config?.mcp?.activeTools,
|
|
45
|
+
});
|
|
77
46
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
47
|
+
// Handle missing tool data
|
|
48
|
+
if (!toolData) {
|
|
49
|
+
return (
|
|
50
|
+
<div className="flex items-center justify-center p-4">
|
|
51
|
+
<div className="text-sm text-muted-foreground">
|
|
52
|
+
Tool data not found for {selectedNode.data.toolId}
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
82
57
|
|
|
83
|
-
|
|
84
|
-
};
|
|
58
|
+
const selectedTools = getCurrentSelectedToolsForNode(selectedNode, selectedToolsLookup);
|
|
85
59
|
|
|
86
|
-
|
|
60
|
+
// Find orphaned tools - tools that are selected but no longer available in activeTools
|
|
61
|
+
const orphanedTools =
|
|
62
|
+
selectedTools && Array.isArray(selectedTools)
|
|
63
|
+
? selectedTools.filter((toolName) => !activeTools?.some((tool) => tool.name === toolName))
|
|
64
|
+
: [];
|
|
87
65
|
|
|
88
66
|
const toggleToolSelection = (toolName: string) => {
|
|
89
67
|
// Handle null case (all tools selected) - convert to array of all tool names
|
|
@@ -128,35 +106,35 @@ export function MCPServerNodeEditor({
|
|
|
128
106
|
|
|
129
107
|
let provider = null;
|
|
130
108
|
try {
|
|
131
|
-
provider = getToolTypeAndName(
|
|
109
|
+
provider = toolData ? getToolTypeAndName(toolData).type : null;
|
|
132
110
|
} catch (error) {
|
|
133
111
|
console.error(error);
|
|
134
112
|
}
|
|
135
113
|
|
|
136
114
|
return (
|
|
137
115
|
<div className="space-y-8">
|
|
138
|
-
{
|
|
116
|
+
{toolData?.imageUrl && (
|
|
139
117
|
<div className="flex items-center gap-2">
|
|
140
118
|
<MCPToolImage
|
|
141
|
-
imageUrl={
|
|
142
|
-
name={
|
|
119
|
+
imageUrl={toolData.imageUrl}
|
|
120
|
+
name={toolData.name}
|
|
143
121
|
provider={provider || undefined}
|
|
144
122
|
size={32}
|
|
145
123
|
className="rounded-lg"
|
|
146
124
|
/>
|
|
147
|
-
<span className="font-medium text-sm truncate">{
|
|
125
|
+
<span className="font-medium text-sm truncate">{toolData.name}</span>
|
|
148
126
|
</div>
|
|
149
127
|
)}
|
|
150
128
|
<div className="space-y-2">
|
|
151
129
|
<Label htmlFor="node-id">Id</Label>
|
|
152
|
-
<Input id="node-id" value={selectedNode.data.
|
|
130
|
+
<Input id="node-id" value={selectedNode.data.toolId} disabled />
|
|
153
131
|
</div>
|
|
154
132
|
<div className="space-y-2">
|
|
155
133
|
<Label htmlFor="name">Name</Label>
|
|
156
134
|
<Input
|
|
157
135
|
id="name"
|
|
158
136
|
name="name"
|
|
159
|
-
value={
|
|
137
|
+
value={toolData?.name || ''}
|
|
160
138
|
onChange={handleInputChange}
|
|
161
139
|
placeholder="MCP server"
|
|
162
140
|
className="w-full"
|
|
@@ -168,20 +146,20 @@ export function MCPServerNodeEditor({
|
|
|
168
146
|
<Input
|
|
169
147
|
id="url"
|
|
170
148
|
name="url"
|
|
171
|
-
value={
|
|
149
|
+
value={toolData?.config?.mcp?.server?.url || ''}
|
|
172
150
|
onChange={handleInputChange}
|
|
173
151
|
placeholder="https://mcp.inkeep.com"
|
|
174
152
|
disabled
|
|
175
153
|
className="w-full"
|
|
176
154
|
/>
|
|
177
155
|
</div>
|
|
178
|
-
{
|
|
156
|
+
{toolData?.imageUrl && (
|
|
179
157
|
<div className="space-y-2">
|
|
180
158
|
<Label htmlFor="imageUrl">Image URL</Label>
|
|
181
159
|
<Input
|
|
182
160
|
id="imageUrl"
|
|
183
161
|
name="imageUrl"
|
|
184
|
-
value={
|
|
162
|
+
value={toolData.imageUrl || ''}
|
|
185
163
|
onChange={handleInputChange}
|
|
186
164
|
placeholder="https://example.com/icon.png"
|
|
187
165
|
disabled
|
|
@@ -199,16 +177,15 @@ export function MCPServerNodeEditor({
|
|
|
199
177
|
{
|
|
200
178
|
selectedTools === null
|
|
201
179
|
? (activeTools?.length ?? 0) // All tools selected
|
|
202
|
-
: selectedTools.
|
|
203
|
-
activeTools?.some((tool) => tool.name === toolName)
|
|
204
|
-
).length // Only count selected tools that are currently active
|
|
180
|
+
: selectedTools.length // Count all selected tools (including orphaned ones)
|
|
205
181
|
}
|
|
206
182
|
</Badge>
|
|
207
183
|
</div>
|
|
208
184
|
<p className="text-xs text-muted-foreground mb-1.5">Click to select/deselect</p>
|
|
209
|
-
{activeTools && activeTools.length > 0
|
|
185
|
+
{(activeTools && activeTools.length > 0) || orphanedTools.length > 0 ? (
|
|
210
186
|
<div className="flex flex-wrap gap-2">
|
|
211
|
-
{
|
|
187
|
+
{/* Active tools */}
|
|
188
|
+
{activeTools?.map((tool) => {
|
|
212
189
|
const isSelected =
|
|
213
190
|
selectedTools === null
|
|
214
191
|
? true // If null, all tools are selected
|
|
@@ -239,12 +216,36 @@ export function MCPServerNodeEditor({
|
|
|
239
216
|
</Tooltip>
|
|
240
217
|
);
|
|
241
218
|
})}
|
|
219
|
+
|
|
220
|
+
{/* Orphaned tools (selected but no longer available) */}
|
|
221
|
+
{orphanedTools.map((toolName) => (
|
|
222
|
+
<Tooltip key={`orphaned-${toolName}`}>
|
|
223
|
+
<TooltipTrigger asChild>
|
|
224
|
+
<Badge
|
|
225
|
+
variant="warning"
|
|
226
|
+
className="flex items-center gap-1 cursor-pointer transition-colors hover:bg-primary/10 normal-case"
|
|
227
|
+
onClick={() => toggleToolSelection(toolName)}
|
|
228
|
+
>
|
|
229
|
+
{toolName}
|
|
230
|
+
<span className="text-xs">
|
|
231
|
+
<CircleAlert className="w-2.5 h-2.5" />
|
|
232
|
+
</span>
|
|
233
|
+
</Badge>
|
|
234
|
+
</TooltipTrigger>
|
|
235
|
+
<TooltipContent className="max-w-xs text-sm">
|
|
236
|
+
<div className="line-clamp-4">
|
|
237
|
+
This tool was selected but is not available in the MCP server. Click to remove
|
|
238
|
+
it from the selection.
|
|
239
|
+
</div>
|
|
240
|
+
</TooltipContent>
|
|
241
|
+
</Tooltip>
|
|
242
|
+
))}
|
|
242
243
|
</div>
|
|
243
|
-
)}
|
|
244
|
+
) : null}
|
|
244
245
|
</div>
|
|
245
246
|
|
|
246
247
|
<ExternalLink
|
|
247
|
-
href={`/${tenantId}/projects/${projectId}/mcp-servers/${selectedNode.data.
|
|
248
|
+
href={`/${tenantId}/projects/${projectId}/mcp-servers/${selectedNode.data.toolId}/edit`}
|
|
248
249
|
>
|
|
249
250
|
Edit MCP Server
|
|
250
251
|
</ExternalLink>
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { type Node, useReactFlow } from '@xyflow/react'
|
|
2
|
-
import { useParams } from 'next/navigation'
|
|
3
|
-
import { useEffect, useState } from 'react'
|
|
4
|
-
import { toast } from 'sonner'
|
|
5
|
-
import { fetchMCPTools } from
|
|
6
|
-
import type { MCPTool } from
|
|
7
|
-
import { NodeType } from '../../../configuration/node-types'
|
|
8
|
-
import { EmptyState } from '../empty-state'
|
|
9
|
-
import { MCPSelectorLoading } from './loading'
|
|
10
|
-
import { MCPServerItem } from './mcp-server-item'
|
|
1
|
+
import { type Node, useReactFlow } from '@xyflow/react';
|
|
2
|
+
import { useParams } from 'next/navigation';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { toast } from 'sonner';
|
|
5
|
+
import { fetchMCPTools } from '@/lib/api/tools';
|
|
6
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
7
|
+
import { NodeType } from '../../../configuration/node-types';
|
|
8
|
+
import { EmptyState } from '../empty-state';
|
|
9
|
+
import { MCPSelectorLoading } from './loading';
|
|
10
|
+
import { MCPServerItem } from './mcp-server-item';
|
|
11
11
|
|
|
12
12
|
interface MCPSelectorState {
|
|
13
|
-
tools: MCPTool[]
|
|
14
|
-
isLoading: boolean
|
|
15
|
-
error: string | null
|
|
13
|
+
tools: MCPTool[];
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
error: string | null;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const useFetchAvailableMCPs = (): MCPSelectorState => {
|
|
19
|
-
const [tools, setTools] = useState<MCPTool[]>([])
|
|
20
|
-
const [isLoading, setIsLoading] = useState(true)
|
|
21
|
-
const [error, setError] = useState<string | null>(null)
|
|
19
|
+
const [tools, setTools] = useState<MCPTool[]>([]);
|
|
20
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
21
|
+
const [error, setError] = useState<string | null>(null);
|
|
22
22
|
const { tenantId, projectId } = useParams<{
|
|
23
|
-
tenantId: string
|
|
24
|
-
projectId: string
|
|
25
|
-
}>()
|
|
23
|
+
tenantId: string;
|
|
24
|
+
projectId: string;
|
|
25
|
+
}>();
|
|
26
26
|
|
|
27
27
|
useEffect(() => {
|
|
28
28
|
const loadTools = async () => {
|
|
29
29
|
try {
|
|
30
|
-
setIsLoading(true)
|
|
31
|
-
setError(null)
|
|
32
|
-
const mcpTools = await fetchMCPTools(tenantId, projectId)
|
|
33
|
-
setTools(mcpTools)
|
|
30
|
+
setIsLoading(true);
|
|
31
|
+
setError(null);
|
|
32
|
+
const mcpTools = await fetchMCPTools(tenantId, projectId);
|
|
33
|
+
setTools(mcpTools);
|
|
34
34
|
} catch (err) {
|
|
35
|
-
const errorMessage = err instanceof Error ? err.message : 'Failed to load MCP tools'
|
|
36
|
-
setError(errorMessage)
|
|
37
|
-
toast.error(errorMessage)
|
|
35
|
+
const errorMessage = err instanceof Error ? err.message : 'Failed to load MCP tools';
|
|
36
|
+
setError(errorMessage);
|
|
37
|
+
toast.error(errorMessage);
|
|
38
38
|
} finally {
|
|
39
|
-
setIsLoading(false)
|
|
39
|
+
setIsLoading(false);
|
|
40
40
|
}
|
|
41
|
-
}
|
|
41
|
+
};
|
|
42
42
|
|
|
43
|
-
loadTools()
|
|
44
|
-
}, [tenantId, projectId])
|
|
43
|
+
loadTools();
|
|
44
|
+
}, [tenantId, projectId]);
|
|
45
45
|
|
|
46
|
-
return { tools, isLoading, error }
|
|
47
|
-
}
|
|
46
|
+
return { tools, isLoading, error };
|
|
47
|
+
};
|
|
48
48
|
|
|
49
49
|
export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
50
|
-
const { updateNode } = useReactFlow()
|
|
50
|
+
const { updateNode } = useReactFlow();
|
|
51
51
|
const { tenantId, projectId } = useParams<{
|
|
52
|
-
tenantId: string
|
|
53
|
-
projectId: string
|
|
54
|
-
}>()
|
|
55
|
-
const { tools, isLoading, error } = useFetchAvailableMCPs()
|
|
52
|
+
tenantId: string;
|
|
53
|
+
projectId: string;
|
|
54
|
+
}>();
|
|
55
|
+
const { tools, isLoading, error } = useFetchAvailableMCPs();
|
|
56
56
|
|
|
57
57
|
const handleSelect = (mcp: MCPTool) => {
|
|
58
58
|
updateNode(selectedNode.id, {
|
|
59
59
|
type: NodeType.MCP,
|
|
60
|
-
data: {
|
|
61
|
-
})
|
|
62
|
-
}
|
|
60
|
+
data: { toolId: mcp.id },
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
63
|
|
|
64
64
|
if (isLoading) {
|
|
65
|
-
return <MCPSelectorLoading title="Select MCP server"
|
|
65
|
+
return <MCPSelectorLoading title="Select MCP server" />;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
if (error) {
|
|
@@ -72,7 +72,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
72
72
|
actionText="Create MCP server"
|
|
73
73
|
actionHref={`/${tenantId}/projects/${projectId}/mcp-servers/new`}
|
|
74
74
|
/>
|
|
75
|
-
)
|
|
75
|
+
);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
if (!tools?.length) {
|
|
@@ -82,7 +82,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
82
82
|
actionText="Create MCP server"
|
|
83
83
|
actionHref={`/${tenantId}/projects/${projectId}/mcp-servers/new`}
|
|
84
84
|
/>
|
|
85
|
-
)
|
|
85
|
+
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
return (
|
|
@@ -96,5 +96,5 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
96
96
|
</div>
|
|
97
97
|
</div>
|
|
98
98
|
</div>
|
|
99
|
-
)
|
|
99
|
+
);
|
|
100
100
|
}
|
|
@@ -5,6 +5,7 @@ import { useMemo } from 'react';
|
|
|
5
5
|
import { useGraphErrors } from '@/hooks/use-graph-errors';
|
|
6
6
|
import type { ArtifactComponent } from '@/lib/api/artifact-components';
|
|
7
7
|
import type { DataComponent } from '@/lib/api/data-components';
|
|
8
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
8
9
|
import { SidePane as SidePaneLayout } from '../../layout/sidepane';
|
|
9
10
|
import { edgeTypeMap } from '../configuration/edge-types';
|
|
10
11
|
import {
|
|
@@ -31,6 +32,7 @@ interface SidePaneProps {
|
|
|
31
32
|
dataComponentLookup: Record<string, DataComponent>;
|
|
32
33
|
artifactComponentLookup: Record<string, ArtifactComponent>;
|
|
33
34
|
selectedToolsLookup: Record<string, Record<string, string[]>>;
|
|
35
|
+
toolLookup: Record<string, MCPTool>;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export function SidePane({
|
|
@@ -42,6 +44,7 @@ export function SidePane({
|
|
|
42
44
|
dataComponentLookup,
|
|
43
45
|
artifactComponentLookup,
|
|
44
46
|
selectedToolsLookup,
|
|
47
|
+
toolLookup,
|
|
45
48
|
}: SidePaneProps) {
|
|
46
49
|
const selectedNode = useNodesData(selectedNodeId || '');
|
|
47
50
|
const edges = useEdges();
|
|
@@ -111,6 +114,7 @@ export function SidePane({
|
|
|
111
114
|
<MCPServerNodeEditor
|
|
112
115
|
selectedNode={selectedNode as Node<MCPNodeData>}
|
|
113
116
|
selectedToolsLookup={selectedToolsLookup}
|
|
117
|
+
toolLookup={toolLookup}
|
|
114
118
|
/>
|
|
115
119
|
);
|
|
116
120
|
}
|
|
@@ -131,6 +135,7 @@ export function SidePane({
|
|
|
131
135
|
getFieldErrorMessage,
|
|
132
136
|
getFirstErrorField,
|
|
133
137
|
selectedToolsLookup,
|
|
138
|
+
toolLookup,
|
|
134
139
|
]);
|
|
135
140
|
|
|
136
141
|
const showBackButton = useMemo(() => {
|