@inkeep/agents-manage-ui 0.8.7 → 0.9.0
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 +161 -161
- package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +7 -7
- package/.next/standalone/agents-manage-ui/.next/build-manifest.json +5 -5
- package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +15 -15
- package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +19 -19
- 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 +1 -1
- 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 +2 -2
- 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 +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +7 -7
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2539.js +8 -8
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2563.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/{5956.js → 3679.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/425.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/{7929.js → 5286.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5294.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6116.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6675.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/679.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6957.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/720.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/726.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{3404.js → 7652.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9093.js +4079 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9235.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9831.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/{1016-065c7c4004850849.js → 1231-4cd082da6edbfe60.js} +2 -2
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{4090-041bb034eaa7be6c.js → 1413-48a35bb8b2d9a310.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/2082-891b4e1bcad00d88.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/4095-96d343710caf26be.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{4132.0629ebed95bad681.js → 4132.e82c1ad08339ac0f.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{4229.a3af860481552dea.js → 4229.8460547691a15bed.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{6497-d25dae53e4f0b68a.js → 6497-95887fafcaf35d31.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-11a12434690e1440.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{8531.15d8d4ac923abbfd.js → 8531.1dafd6b1ecb8f349.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{9964-02d4a76792a0abc8.js → 9964-e16d35b53a509ad4.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-10994c4134a5b1f6.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-ac21ae31668741aa.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-ac21ae31668741aa.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-2bb568b6c23a881e.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-3d397c420bb8143b.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-f7c50d8bbfd65b0d.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-e11b688b8c64e54e.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-d98ce43ab8686e03.js → page-9845708b28d20181.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/{page-2a339c25cf52f458.js → page-4bee752045ef90e0.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/{page-2a339c25cf52f458.js → page-4bee752045ef90e0.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-0b8a51e424924a54.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-83f03615dc11014b.js → page-09211eb5d072f78c.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-da8ddb54272917ab.js → page-dedc24c2a11b92e3.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e43da749deafb4dd.js → page-85b42eb6434f29e0.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-c65e011074a1fcce.js → page-546eada72bc05113.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-b1024549b5350223.js → page-dd6ae70ea7fabd25.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-cdc9588a55a0d92c.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-d9b96584b3200c5d.js → page-a0922720c62feda3.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-2a12f980f96c7c38.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-7e81c1c4a1f31187.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-3d8dfc51ee03d859.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-4a10374a948c9803.js → webpack-2d4148ddf995243a.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/d6cfe4d39e9ec828.css +1 -0
- package/.next/standalone/agents-manage-ui/package.json +1 -1
- package/.next/standalone/packages/agents-core/package.json +1 -1
- package/package.json +4 -4
- package/src/components/graph/configuration/node-types.tsx +6 -0
- package/src/components/graph/graph.tsx +87 -38
- package/src/components/graph/nodes/mcp-node.tsx +3 -2
- package/src/components/graph/playground/custom-headers-dialog.tsx +1 -1
- package/src/components/graph/playground/playground.tsx +48 -17
- package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +14 -22
- package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +1 -1
- package/src/features/graph/domain/deserialize.ts +22 -53
- package/src/features/graph/domain/serialize.ts +15 -6
- package/src/features/graph/state/use-graph-store.ts +37 -13
- package/src/lib/utils/orphaned-tools-detector.ts +76 -50
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3086.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/581.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6314.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9772.js +0 -4079
- package/.next/standalone/agents-manage-ui/.next/static/chunks/1038-54d48d86de704a66.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-62fb01db4bf7c93f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/9015-a88871b0493fa6a4.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-d4772fb2fe52d502.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-49ed1a294d705e2b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-49ed1a294d705e2b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-620d86f21e1681e4.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-1adc6c6811c5224b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-3a6d23feb7e81c60.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-943ca6e800bfb42e.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-2b56d1bb8facba92.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-15d74bf9095a3a5f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-989cf7b49617d609.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-3610d41580ae65f5.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-62da969ed126dce3.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/98c416ff19152db0.css +0 -1
- /package/.next/standalone/agents-manage-ui/.next/static/{2w7Mtrd1QqrH5dFKfhc0T → P565yMuBD-0DpQccwOL1W}/_buildManifest.js +0 -0
- /package/.next/standalone/agents-manage-ui/.next/static/{2w7Mtrd1QqrH5dFKfhc0T → P565yMuBD-0DpQccwOL1W}/_ssgManifest.js +0 -0
|
@@ -11,7 +11,8 @@ import { Handle } from './handle';
|
|
|
11
11
|
export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
|
|
12
12
|
const { data, selected } = props;
|
|
13
13
|
const toolLookup = useGraphStore((state) => state.toolLookup);
|
|
14
|
-
const
|
|
14
|
+
const agentToolConfigLookup = useGraphStore((state) => state.agentToolConfigLookup);
|
|
15
|
+
const edges = useGraphStore((state) => state.edges);
|
|
15
16
|
|
|
16
17
|
const name = data.name || `Tool: ${data.toolId}`;
|
|
17
18
|
const imageUrl = data.imageUrl;
|
|
@@ -25,7 +26,7 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
|
|
|
25
26
|
activeTools: toolData?.config?.mcp?.activeTools,
|
|
26
27
|
});
|
|
27
28
|
|
|
28
|
-
const selectedTools = getCurrentSelectedToolsForNode(props,
|
|
29
|
+
const selectedTools = getCurrentSelectedToolsForNode(props, agentToolConfigLookup, edges);
|
|
29
30
|
|
|
30
31
|
// Format the tool display
|
|
31
32
|
const getToolDisplay = () => {
|
|
@@ -85,7 +85,7 @@ function CustomHeadersDialog({ customHeaders, setCustomHeaders }: CustomHeadersD
|
|
|
85
85
|
return (
|
|
86
86
|
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
87
87
|
<DialogTrigger asChild>
|
|
88
|
-
<Button variant="
|
|
88
|
+
<Button variant="ghost" size="sm" className="h-6">
|
|
89
89
|
{numHeaders > 0 ? <Pencil className="w-4 h-4" /> : <Plus className="w-4 h-4" />}
|
|
90
90
|
Custom Headers
|
|
91
91
|
{numHeaders > 0 && <Badge variant="code">{numHeaders}</Badge>}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Bug, X } from 'lucide-react';
|
|
2
2
|
import { nanoid } from 'nanoid';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { TimelineWrapper } from '@/components/traces/timeline/timeline-wrapper';
|
|
@@ -13,16 +13,19 @@ interface PlaygroundProps {
|
|
|
13
13
|
projectId: string;
|
|
14
14
|
tenantId: string;
|
|
15
15
|
setShowPlayground: (show: boolean) => void;
|
|
16
|
+
closeSidePane: () => void;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export const Playground = ({
|
|
19
20
|
graphId,
|
|
20
21
|
projectId,
|
|
21
22
|
tenantId,
|
|
23
|
+
closeSidePane,
|
|
22
24
|
setShowPlayground,
|
|
23
25
|
}: PlaygroundProps) => {
|
|
24
26
|
const [conversationId, setConversationId] = useState<string>(nanoid());
|
|
25
27
|
const [customHeaders, setCustomHeaders] = useState<Record<string, string>>({});
|
|
28
|
+
const [showTraces, setShowTraces] = useState<boolean>(false);
|
|
26
29
|
const {
|
|
27
30
|
chatActivities,
|
|
28
31
|
isPolling,
|
|
@@ -36,13 +39,36 @@ export const Playground = ({
|
|
|
36
39
|
});
|
|
37
40
|
|
|
38
41
|
return (
|
|
39
|
-
<div
|
|
42
|
+
<div
|
|
43
|
+
className={`bg-background z-10 flex flex-col border-l ${showTraces ? 'w-full' : 'w-1/3 min-w-96'}`}
|
|
44
|
+
>
|
|
40
45
|
<div className="flex min-h-0 items-center justify-between py-2 px-4 border-b flex-shrink-0">
|
|
41
|
-
<Button variant="ghost" size="sm" className="h-6" onClick={() => setShowPlayground(false)}>
|
|
42
|
-
<ArrowLeft className="h-4 w-4" />
|
|
43
|
-
<span>Back to graph</span>
|
|
44
|
-
</Button>
|
|
45
46
|
<CustomHeadersDialog customHeaders={customHeaders} setCustomHeaders={setCustomHeaders} />
|
|
47
|
+
<div className="flex items-center gap-2">
|
|
48
|
+
<Button
|
|
49
|
+
variant="ghost"
|
|
50
|
+
size="sm"
|
|
51
|
+
className="h-6"
|
|
52
|
+
onClick={() => {
|
|
53
|
+
setShowTraces(!showTraces);
|
|
54
|
+
if (!showTraces) {
|
|
55
|
+
closeSidePane();
|
|
56
|
+
}
|
|
57
|
+
}}
|
|
58
|
+
>
|
|
59
|
+
<Bug className="h-4 w-4" />
|
|
60
|
+
{showTraces ? 'Hide debug' : 'Debug'}
|
|
61
|
+
</Button>
|
|
62
|
+
|
|
63
|
+
<Button
|
|
64
|
+
variant="ghost"
|
|
65
|
+
size="sm"
|
|
66
|
+
className="h-6"
|
|
67
|
+
onClick={() => setShowPlayground(false)}
|
|
68
|
+
>
|
|
69
|
+
<X className="h-4 w-4" />
|
|
70
|
+
</Button>
|
|
71
|
+
</div>
|
|
46
72
|
</div>
|
|
47
73
|
<div className="flex-1 min-h-0 w-full">
|
|
48
74
|
<ResizablePanelGroup direction="horizontal">
|
|
@@ -59,17 +85,22 @@ export const Playground = ({
|
|
|
59
85
|
key={JSON.stringify(customHeaders)}
|
|
60
86
|
/>
|
|
61
87
|
</ResizablePanel>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
88
|
+
|
|
89
|
+
{showTraces && (
|
|
90
|
+
<>
|
|
91
|
+
<ResizableHandle />
|
|
92
|
+
<TimelineWrapper
|
|
93
|
+
isPolling={isPolling}
|
|
94
|
+
conversation={chatActivities}
|
|
95
|
+
enableAutoScroll={true}
|
|
96
|
+
error={error}
|
|
97
|
+
retryConnection={retryConnection}
|
|
98
|
+
refreshOnce={refreshOnce}
|
|
99
|
+
showConversationTracesLink={true}
|
|
100
|
+
conversationId={conversationId}
|
|
101
|
+
/>
|
|
102
|
+
</>
|
|
103
|
+
)}
|
|
73
104
|
</ResizablePanelGroup>
|
|
74
105
|
</div>
|
|
75
106
|
</div>
|
|
@@ -12,7 +12,10 @@ import { Label } from '@/components/ui/label';
|
|
|
12
12
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
13
13
|
import { useGraphStore } from '@/features/graph/state/use-graph-store';
|
|
14
14
|
import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
getCurrentHeadersForNode,
|
|
17
|
+
getCurrentSelectedToolsForNode,
|
|
18
|
+
} from '@/lib/utils/orphaned-tools-detector';
|
|
16
19
|
import type { MCPNodeData } from '../../configuration/node-types';
|
|
17
20
|
import type { AgentToolConfigLookup } from '../../graph';
|
|
18
21
|
|
|
@@ -32,35 +35,24 @@ export function MCPServerNodeEditor({
|
|
|
32
35
|
}>();
|
|
33
36
|
const markUnsaved = useGraphStore((state) => state.markUnsaved);
|
|
34
37
|
|
|
35
|
-
//
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
if ((selectedNode.data as any).tempHeaders !== undefined) {
|
|
39
|
-
return (selectedNode.data as any).tempHeaders;
|
|
40
|
-
}
|
|
38
|
+
// Only use toolLookup - single source of truth
|
|
39
|
+
const toolLookup = useGraphStore((state) => state.toolLookup);
|
|
40
|
+
const edges = useGraphStore((state) => state.edges);
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (toolConfig?.headers) {
|
|
46
|
-
return toolConfig.headers;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return {};
|
|
50
|
-
}, [agentToolConfigLookup, selectedNode.data]);
|
|
42
|
+
const getCurrentHeaders = useCallback((): Record<string, string> => {
|
|
43
|
+
return getCurrentHeadersForNode(selectedNode, agentToolConfigLookup, edges);
|
|
44
|
+
}, [selectedNode, agentToolConfigLookup, edges]);
|
|
51
45
|
|
|
52
46
|
// Local state for headers input (allows invalid JSON while typing)
|
|
53
47
|
const [headersInputValue, setHeadersInputValue] = useState('{}');
|
|
54
48
|
|
|
55
|
-
// Sync input value when
|
|
49
|
+
// Sync input value when node changes (but not on every data change)
|
|
50
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: intentionally omit getCurrentHeaders to prevent reset loops
|
|
56
51
|
useEffect(() => {
|
|
57
52
|
const newHeaders = getCurrentHeaders();
|
|
58
53
|
setHeadersInputValue(JSON.stringify(newHeaders, null, 2));
|
|
59
|
-
}, [
|
|
54
|
+
}, [selectedNode.id]);
|
|
60
55
|
|
|
61
|
-
// Only use toolLookup - single source of truth
|
|
62
|
-
const toolLookup = useGraphStore((state) => state.toolLookup);
|
|
63
|
-
const selectedToolsLookup = useGraphStore((state) => state.selectedToolsLookup);
|
|
64
56
|
const toolData = toolLookup[selectedNode.data.toolId];
|
|
65
57
|
|
|
66
58
|
const availableTools = toolData?.availableTools;
|
|
@@ -80,7 +72,7 @@ export function MCPServerNodeEditor({
|
|
|
80
72
|
</div>
|
|
81
73
|
);
|
|
82
74
|
}
|
|
83
|
-
const selectedTools = getCurrentSelectedToolsForNode(selectedNode,
|
|
75
|
+
const selectedTools = getCurrentSelectedToolsForNode(selectedNode, agentToolConfigLookup, edges);
|
|
84
76
|
|
|
85
77
|
// Find orphaned tools - tools that are selected but no longer available in activeTools
|
|
86
78
|
const orphanedTools =
|
|
@@ -57,7 +57,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
57
57
|
const handleSelect = (mcp: MCPTool) => {
|
|
58
58
|
updateNode(selectedNode.id, {
|
|
59
59
|
type: NodeType.MCP,
|
|
60
|
-
data: { toolId: mcp.id },
|
|
60
|
+
data: { toolId: mcp.id, agentId: null, relationshipId: null },
|
|
61
61
|
});
|
|
62
62
|
};
|
|
63
63
|
|
|
@@ -206,59 +206,28 @@ export function deserializeGraphData(data: FullGraphDefinition): TransformResult
|
|
|
206
206
|
const agent = data.agents[agentId];
|
|
207
207
|
// Check if agent has canUse property (internal agents)
|
|
208
208
|
if ('canUse' in agent && agent.canUse && agent.canUse.length > 0) {
|
|
209
|
-
//
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
type: EdgeType.Default,
|
|
232
|
-
source: agentId,
|
|
233
|
-
sourceHandle: agentNodeSourceHandleId,
|
|
234
|
-
target: toolNodeId,
|
|
235
|
-
targetHandle: mcpNodeHandleId,
|
|
236
|
-
};
|
|
237
|
-
edges.push(agentToToolEdge);
|
|
238
|
-
}
|
|
239
|
-
} else {
|
|
240
|
-
// Tools are project-scoped - just store the tool ID
|
|
241
|
-
for (const canUseItem of agent.canUse) {
|
|
242
|
-
const toolId = canUseItem.toolId;
|
|
243
|
-
const toolNodeId = nanoid();
|
|
244
|
-
const toolNode: Node = {
|
|
245
|
-
id: toolNodeId,
|
|
246
|
-
type: NodeType.MCP,
|
|
247
|
-
position: { x: 0, y: 0 },
|
|
248
|
-
data: { toolId },
|
|
249
|
-
};
|
|
250
|
-
nodes.push(toolNode);
|
|
251
|
-
|
|
252
|
-
const agentToToolEdge: Edge = {
|
|
253
|
-
id: `edge-${toolNodeId}-${agentId}`,
|
|
254
|
-
type: EdgeType.Default,
|
|
255
|
-
source: agentId,
|
|
256
|
-
sourceHandle: agentNodeSourceHandleId,
|
|
257
|
-
target: toolNodeId,
|
|
258
|
-
targetHandle: mcpNodeHandleId,
|
|
259
|
-
};
|
|
260
|
-
edges.push(agentToToolEdge);
|
|
261
|
-
}
|
|
209
|
+
// Tools are project-scoped - create nodes from canUse items
|
|
210
|
+
for (const canUseItem of agent.canUse) {
|
|
211
|
+
const toolId = canUseItem.toolId;
|
|
212
|
+
const toolNodeId = nanoid();
|
|
213
|
+
const relationshipId = canUseItem.agentToolRelationId;
|
|
214
|
+
const toolNode: Node = {
|
|
215
|
+
id: toolNodeId,
|
|
216
|
+
type: NodeType.MCP,
|
|
217
|
+
position: { x: 0, y: 0 },
|
|
218
|
+
data: { toolId, agentId, relationshipId },
|
|
219
|
+
};
|
|
220
|
+
nodes.push(toolNode);
|
|
221
|
+
|
|
222
|
+
const agentToToolEdge: Edge = {
|
|
223
|
+
id: `edge-${toolNodeId}-${agentId}`,
|
|
224
|
+
type: EdgeType.Default,
|
|
225
|
+
source: agentId,
|
|
226
|
+
sourceHandle: agentNodeSourceHandleId,
|
|
227
|
+
target: toolNodeId,
|
|
228
|
+
targetHandle: mcpNodeHandleId,
|
|
229
|
+
};
|
|
230
|
+
edges.push(agentToToolEdge);
|
|
262
231
|
}
|
|
263
232
|
}
|
|
264
233
|
}
|
|
@@ -120,6 +120,7 @@ export function serializeGraphData(
|
|
|
120
120
|
toolId: string;
|
|
121
121
|
toolSelection?: string[] | null;
|
|
122
122
|
headers?: Record<string, string>;
|
|
123
|
+
agentToolRelationId?: string;
|
|
123
124
|
}> = [];
|
|
124
125
|
|
|
125
126
|
// Find edges from this agent to MCP nodes
|
|
@@ -140,6 +141,9 @@ export function serializeGraphData(
|
|
|
140
141
|
const tempSelectedTools = (mcpNode.data as any).tempSelectedTools;
|
|
141
142
|
let toolSelection: string[] | null = null;
|
|
142
143
|
|
|
144
|
+
// Get the relationshipId from the MCP node first
|
|
145
|
+
const relationshipId = (mcpNode.data as any).relationshipId;
|
|
146
|
+
|
|
143
147
|
if (tempSelectedTools !== undefined) {
|
|
144
148
|
// User has made changes to tool selection in the UI
|
|
145
149
|
if (Array.isArray(tempSelectedTools)) {
|
|
@@ -149,9 +153,11 @@ export function serializeGraphData(
|
|
|
149
153
|
}
|
|
150
154
|
} else {
|
|
151
155
|
// No changes made to tool selection - preserve existing selection
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
const existingConfig = relationshipId
|
|
157
|
+
? agentToolConfigLookup?.[agentId]?.[relationshipId]
|
|
158
|
+
: null;
|
|
159
|
+
if (existingConfig?.toolSelection) {
|
|
160
|
+
toolSelection = existingConfig.toolSelection;
|
|
155
161
|
} else {
|
|
156
162
|
// Default to all tools selected when no existing data found
|
|
157
163
|
toolSelection = null;
|
|
@@ -171,9 +177,11 @@ export function serializeGraphData(
|
|
|
171
177
|
}
|
|
172
178
|
} else {
|
|
173
179
|
// No changes made to headers - preserve existing headers
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
180
|
+
const existingConfig = relationshipId
|
|
181
|
+
? agentToolConfigLookup?.[agentId]?.[relationshipId]
|
|
182
|
+
: null;
|
|
183
|
+
if (existingConfig?.headers) {
|
|
184
|
+
toolHeaders = existingConfig.headers;
|
|
177
185
|
}
|
|
178
186
|
}
|
|
179
187
|
|
|
@@ -181,6 +189,7 @@ export function serializeGraphData(
|
|
|
181
189
|
toolId,
|
|
182
190
|
toolSelection,
|
|
183
191
|
headers: toolHeaders,
|
|
192
|
+
...(relationshipId && { agentToolRelationId: relationshipId }),
|
|
184
193
|
});
|
|
185
194
|
}
|
|
186
195
|
}
|
|
@@ -3,6 +3,8 @@ import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
|
|
|
3
3
|
import { create } from 'zustand';
|
|
4
4
|
import { devtools } from 'zustand/middleware';
|
|
5
5
|
import type { GraphMetadata } from '@/components/graph/configuration/graph-types';
|
|
6
|
+
import { mcpNodeHandleId, NodeType } from '@/components/graph/configuration/node-types';
|
|
7
|
+
import type { AgentToolConfigLookup } from '@/components/graph/graph';
|
|
6
8
|
import type { ArtifactComponent } from '@/lib/api/artifact-components';
|
|
7
9
|
import type { DataComponent } from '@/lib/api/data-components';
|
|
8
10
|
import type { MCPTool } from '@/lib/types/tools';
|
|
@@ -17,7 +19,7 @@ type GraphStateData = {
|
|
|
17
19
|
dataComponentLookup: Record<string, DataComponent>;
|
|
18
20
|
artifactComponentLookup: Record<string, ArtifactComponent>;
|
|
19
21
|
toolLookup: Record<string, MCPTool>;
|
|
20
|
-
|
|
22
|
+
agentToolConfigLookup: AgentToolConfigLookup;
|
|
21
23
|
dirty: boolean;
|
|
22
24
|
history: HistoryEntry[];
|
|
23
25
|
future: HistoryEntry[];
|
|
@@ -33,12 +35,12 @@ type GraphState = GraphStateData & {
|
|
|
33
35
|
dataComponentLookup?: Record<string, DataComponent>,
|
|
34
36
|
artifactComponentLookup?: Record<string, ArtifactComponent>,
|
|
35
37
|
toolLookup?: Record<string, MCPTool>,
|
|
36
|
-
|
|
38
|
+
agentToolConfigLookup?: AgentToolConfigLookup
|
|
37
39
|
): void;
|
|
38
40
|
setDataComponentLookup(dataComponentLookup: Record<string, DataComponent>): void;
|
|
39
41
|
setArtifactComponentLookup(artifactComponentLookup: Record<string, ArtifactComponent>): void;
|
|
40
42
|
setToolLookup(toolLookup: Record<string, MCPTool>): void;
|
|
41
|
-
|
|
43
|
+
setAgentToolConfigLookup(agentToolConfigLookup: AgentToolConfigLookup): void;
|
|
42
44
|
setNodes(updater: (prev: Node[]) => Node[]): void;
|
|
43
45
|
setEdges(updater: (prev: Edge[]) => Edge[]): void;
|
|
44
46
|
onNodesChange(changes: NodeChange[]): void;
|
|
@@ -82,7 +84,7 @@ export const useGraphStore = create<GraphState>()(
|
|
|
82
84
|
dataComponentLookup: {},
|
|
83
85
|
artifactComponentLookup: {},
|
|
84
86
|
toolLookup: {},
|
|
85
|
-
|
|
87
|
+
agentToolConfigLookup: {},
|
|
86
88
|
dirty: false,
|
|
87
89
|
history: [],
|
|
88
90
|
future: [],
|
|
@@ -95,7 +97,7 @@ export const useGraphStore = create<GraphState>()(
|
|
|
95
97
|
dataComponentLookup = {},
|
|
96
98
|
artifactComponentLookup = {},
|
|
97
99
|
toolLookup = {},
|
|
98
|
-
|
|
100
|
+
agentToolConfigLookup = {}
|
|
99
101
|
) {
|
|
100
102
|
set({
|
|
101
103
|
nodes,
|
|
@@ -104,7 +106,7 @@ export const useGraphStore = create<GraphState>()(
|
|
|
104
106
|
dataComponentLookup,
|
|
105
107
|
artifactComponentLookup,
|
|
106
108
|
toolLookup,
|
|
107
|
-
|
|
109
|
+
agentToolConfigLookup,
|
|
108
110
|
dirty: false,
|
|
109
111
|
history: [],
|
|
110
112
|
future: [],
|
|
@@ -121,8 +123,8 @@ export const useGraphStore = create<GraphState>()(
|
|
|
121
123
|
setToolLookup(toolLookup) {
|
|
122
124
|
set({ toolLookup });
|
|
123
125
|
},
|
|
124
|
-
|
|
125
|
-
set({
|
|
126
|
+
setAgentToolConfigLookup(agentToolConfigLookup) {
|
|
127
|
+
set({ agentToolConfigLookup });
|
|
126
128
|
},
|
|
127
129
|
setNodes(updater) {
|
|
128
130
|
set((state) => ({ nodes: updater(state.nodes) }));
|
|
@@ -158,11 +160,33 @@ export const useGraphStore = create<GraphState>()(
|
|
|
158
160
|
(change) => change.type === 'remove' || change.type === 'add' || change.type === 'replace'
|
|
159
161
|
);
|
|
160
162
|
|
|
161
|
-
set((state) =>
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
set((state) => {
|
|
164
|
+
// Check for edge removals that disconnect agent from MCP node
|
|
165
|
+
const removeChanges = changes.filter((change) => change.type === 'remove');
|
|
166
|
+
let updatedNodes = state.nodes;
|
|
167
|
+
|
|
168
|
+
for (const removeChange of removeChanges) {
|
|
169
|
+
const edgeToRemove = state.edges.find((e) => e.id === removeChange.id);
|
|
170
|
+
if (edgeToRemove && edgeToRemove.targetHandle === mcpNodeHandleId) {
|
|
171
|
+
// Find the target MCP node and clear its agentId
|
|
172
|
+
const mcpNode = state.nodes.find((n) => n.id === edgeToRemove.target);
|
|
173
|
+
if (mcpNode && mcpNode.type === NodeType.MCP) {
|
|
174
|
+
updatedNodes = updatedNodes.map((n) =>
|
|
175
|
+
n.id === mcpNode.id
|
|
176
|
+
? { ...n, data: { ...n.data, agentId: null, relationshipId: null } }
|
|
177
|
+
: n
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
history: [...state.history, { nodes: state.nodes, edges: state.edges }],
|
|
185
|
+
nodes: updatedNodes,
|
|
186
|
+
edges: applyEdgeChanges(changes, state.edges),
|
|
187
|
+
dirty: hasModifyingChange ? true : state.dirty,
|
|
188
|
+
};
|
|
189
|
+
});
|
|
166
190
|
},
|
|
167
191
|
onConnect(connection) {
|
|
168
192
|
set((state) => ({ edges: addEdge(connection as any, state.edges) }));
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { Node } from '@xyflow/react';
|
|
1
|
+
import type { Edge, Node } from '@xyflow/react';
|
|
2
2
|
import { getActiveTools } from '@/app/utils/active-tools';
|
|
3
3
|
import type { MCPNodeData } from '@/components/graph/configuration/node-types';
|
|
4
4
|
import { NodeType } from '@/components/graph/configuration/node-types';
|
|
5
5
|
import type { MCPTool } from '@/lib/types/tools';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
interface OrphanedToolsInfo {
|
|
8
8
|
nodeId: string;
|
|
9
9
|
nodeName: string;
|
|
10
10
|
orphanedTools: string[];
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
interface OrphanedToolsDetectionResult {
|
|
14
14
|
hasOrphanedTools: boolean;
|
|
15
15
|
orphanedToolsByNode: OrphanedToolsInfo[];
|
|
16
16
|
totalOrphanedCount: number;
|
|
@@ -22,62 +22,26 @@ export interface OrphanedToolsDetectionResult {
|
|
|
22
22
|
*/
|
|
23
23
|
export function detectOrphanedToolsAndGetWarning(
|
|
24
24
|
nodes: Node[],
|
|
25
|
-
|
|
25
|
+
agentToolConfigLookup: Record<
|
|
26
|
+
string,
|
|
27
|
+
Record<string, { toolId: string; toolSelection?: string[] }>
|
|
28
|
+
>,
|
|
26
29
|
toolLookup: Record<string, MCPTool>
|
|
27
30
|
): string | null {
|
|
28
|
-
const result = detectOrphanedToolsInGraph(nodes,
|
|
31
|
+
const result = detectOrphanedToolsInGraph(nodes, agentToolConfigLookup, toolLookup);
|
|
29
32
|
return result.hasOrphanedTools ? createOrphanedToolsWarningMessage(result) : null;
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
/**
|
|
33
|
-
* Extract shared logic for getting selected tools for a node
|
|
34
|
-
* This replaces the duplicated logic between detector and MCP node editor
|
|
35
|
-
*/
|
|
36
|
-
export function getCurrentSelectedToolsForNode(
|
|
37
|
-
node: { data: MCPNodeData },
|
|
38
|
-
selectedToolsLookup: Record<string, Record<string, string[]>>
|
|
39
|
-
): string[] | null {
|
|
40
|
-
// First check if we have temporary selections stored on the node (from recent clicks)
|
|
41
|
-
if ((node.data as any).tempSelectedTools !== undefined) {
|
|
42
|
-
return (node.data as any).tempSelectedTools;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Otherwise, get from the database/initial state
|
|
46
|
-
const allSelectedTools = new Set<string>();
|
|
47
|
-
let hasAnyData = false;
|
|
48
|
-
let hasEmptyArray = false;
|
|
49
|
-
let hasNullValue = false;
|
|
50
|
-
|
|
51
|
-
Object.values(selectedToolsLookup).forEach((agentTools) => {
|
|
52
|
-
const toolsForThisMCP = agentTools[node.data.toolId];
|
|
53
|
-
if (toolsForThisMCP !== undefined) {
|
|
54
|
-
hasAnyData = true;
|
|
55
|
-
if (Array.isArray(toolsForThisMCP) && toolsForThisMCP.length === 0) {
|
|
56
|
-
hasEmptyArray = true;
|
|
57
|
-
} else if (toolsForThisMCP === null) {
|
|
58
|
-
hasNullValue = true;
|
|
59
|
-
} else if (Array.isArray(toolsForThisMCP)) {
|
|
60
|
-
toolsForThisMCP.forEach((tool) => {
|
|
61
|
-
allSelectedTools.add(tool);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
if (hasNullValue) return null;
|
|
68
|
-
if (hasEmptyArray) return [];
|
|
69
|
-
if (!hasAnyData) return null;
|
|
70
|
-
|
|
71
|
-
return Array.from(allSelectedTools);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
35
|
/**
|
|
75
36
|
* Detects orphaned tools across all MCP nodes in the graph
|
|
76
37
|
* Orphaned tools are tools that were selected but are no longer available in the MCP server
|
|
77
38
|
*/
|
|
78
|
-
|
|
39
|
+
function detectOrphanedToolsInGraph(
|
|
79
40
|
nodes: Node[],
|
|
80
|
-
|
|
41
|
+
agentToolConfigLookup: Record<
|
|
42
|
+
string,
|
|
43
|
+
Record<string, { toolId: string; toolSelection?: string[] }>
|
|
44
|
+
>,
|
|
81
45
|
toolLookup: Record<string, MCPTool>
|
|
82
46
|
): OrphanedToolsDetectionResult {
|
|
83
47
|
const orphanedToolsByNode: OrphanedToolsInfo[] = [];
|
|
@@ -94,7 +58,7 @@ export function detectOrphanedToolsInGraph(
|
|
|
94
58
|
activeTools: toolData.config?.mcp?.activeTools,
|
|
95
59
|
});
|
|
96
60
|
|
|
97
|
-
const selectedTools = getCurrentSelectedToolsForNode(node,
|
|
61
|
+
const selectedTools = getCurrentSelectedToolsForNode(node, agentToolConfigLookup, []);
|
|
98
62
|
|
|
99
63
|
// Find orphaned tools for this node
|
|
100
64
|
const orphanedTools =
|
|
@@ -143,3 +107,65 @@ export function createOrphanedToolsWarningMessage(result: OrphanedToolsDetection
|
|
|
143
107
|
|
|
144
108
|
return `${nodeCount} MCP servers have a total of ${toolCount} selected tools that are no longer available. These orphaned tools will not be available at runtime. Please update your tool selections.`;
|
|
145
109
|
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Enhanced lookup for selected tools - uses relationshipId for true isolation
|
|
113
|
+
*/
|
|
114
|
+
export function getCurrentSelectedToolsForNode(
|
|
115
|
+
node: { data: MCPNodeData; id: string },
|
|
116
|
+
agentToolConfigLookup: Record<
|
|
117
|
+
string,
|
|
118
|
+
Record<string, { toolId: string; toolSelection?: string[] | null }>
|
|
119
|
+
>,
|
|
120
|
+
_edges: Edge[]
|
|
121
|
+
): string[] | null {
|
|
122
|
+
// First check if we have temporary selections stored on the node (from recent clicks)
|
|
123
|
+
if ((node.data as any).tempSelectedTools !== undefined) {
|
|
124
|
+
return (node.data as any).tempSelectedTools;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// If node has relationshipId, find config by relationshipId
|
|
128
|
+
const relationshipId = (node.data as any).relationshipId;
|
|
129
|
+
if (relationshipId) {
|
|
130
|
+
for (const toolsMap of Object.values(agentToolConfigLookup)) {
|
|
131
|
+
const config = toolsMap[relationshipId];
|
|
132
|
+
if (config) {
|
|
133
|
+
return config.toolSelection || null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// No relationshipId found, return null (show all tools selected)
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Enhanced lookup for headers - uses relationshipId
|
|
144
|
+
*/
|
|
145
|
+
export function getCurrentHeadersForNode(
|
|
146
|
+
node: { data: MCPNodeData; id: string },
|
|
147
|
+
agentToolConfigLookup: Record<
|
|
148
|
+
string,
|
|
149
|
+
Record<string, { toolId: string; headers?: Record<string, string> }>
|
|
150
|
+
>,
|
|
151
|
+
_edges: Edge[]
|
|
152
|
+
): Record<string, string> {
|
|
153
|
+
// First check if we have temporary headers stored on the node (from recent edits)
|
|
154
|
+
if ((node.data as any).tempHeaders !== undefined) {
|
|
155
|
+
return (node.data as any).tempHeaders;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// If node has relationshipId, find config by relationshipId
|
|
159
|
+
const relationshipId = (node.data as any).relationshipId;
|
|
160
|
+
if (relationshipId) {
|
|
161
|
+
for (const toolsMap of Object.values(agentToolConfigLookup)) {
|
|
162
|
+
const config = toolsMap[relationshipId];
|
|
163
|
+
if (config) {
|
|
164
|
+
return config.headers || {};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// No relationshipId found, return empty headers
|
|
170
|
+
return {};
|
|
171
|
+
}
|