@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
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client';
|
|
2
2
|
|
|
3
|
-
import { zodResolver } from '@hookform/resolvers/zod'
|
|
4
|
-
import { MCPTransportType } from '@inkeep/agents-core/client-exports'
|
|
5
|
-
import { nanoid } from 'nanoid'
|
|
6
|
-
import { useRouter } from 'next/navigation'
|
|
7
|
-
import { useForm } from 'react-hook-form'
|
|
8
|
-
import { toast } from 'sonner'
|
|
9
|
-
import { GenericInput } from '@/components/form/generic-input'
|
|
10
|
-
import { GenericSelect } from '@/components/form/generic-select'
|
|
11
|
-
import { Button } from '@/components/ui/button'
|
|
12
|
-
import { Form } from '@/components/ui/form'
|
|
13
|
-
import type { Credential } from '@/lib/api/credentials'
|
|
14
|
-
import { createMCPTool,
|
|
15
|
-
import type { MCPTool } from '@/lib/types/tools'
|
|
16
|
-
import { ActiveToolsSelector } from './active-tools-selector'
|
|
17
|
-
import { type MCPToolFormData, mcpToolSchema } from './validation'
|
|
3
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
4
|
+
import { MCPTransportType } from '@inkeep/agents-core/client-exports';
|
|
5
|
+
import { nanoid } from 'nanoid';
|
|
6
|
+
import { useRouter } from 'next/navigation';
|
|
7
|
+
import { useForm } from 'react-hook-form';
|
|
8
|
+
import { toast } from 'sonner';
|
|
9
|
+
import { GenericInput } from '@/components/form/generic-input';
|
|
10
|
+
import { GenericSelect } from '@/components/form/generic-select';
|
|
11
|
+
import { Button } from '@/components/ui/button';
|
|
12
|
+
import { Form } from '@/components/ui/form';
|
|
13
|
+
import type { Credential } from '@/lib/api/credentials';
|
|
14
|
+
import { createMCPTool, updateMCPTool } from '@/lib/api/tools';
|
|
15
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
16
|
+
import { ActiveToolsSelector } from './active-tools-selector';
|
|
17
|
+
import { type MCPToolFormData, mcpToolSchema } from './validation';
|
|
18
18
|
|
|
19
19
|
interface MCPServerFormProps {
|
|
20
|
-
initialData?: MCPToolFormData
|
|
21
|
-
mode?: 'create' | 'update'
|
|
22
|
-
tool?: MCPTool
|
|
23
|
-
credentials: Credential[]
|
|
24
|
-
tenantId: string
|
|
25
|
-
projectId: string
|
|
20
|
+
initialData?: MCPToolFormData;
|
|
21
|
+
mode?: 'create' | 'update';
|
|
22
|
+
tool?: MCPTool;
|
|
23
|
+
credentials: Credential[];
|
|
24
|
+
tenantId: string;
|
|
25
|
+
projectId: string;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const defaultValues: MCPToolFormData = {
|
|
@@ -41,7 +41,7 @@ const defaultValues: MCPToolFormData = {
|
|
|
41
41
|
},
|
|
42
42
|
imageUrl: '', // Initialize as empty string to avoid uncontrolled/controlled warning
|
|
43
43
|
credentialReferenceId: 'none',
|
|
44
|
-
}
|
|
44
|
+
};
|
|
45
45
|
|
|
46
46
|
export function MCPServerForm({
|
|
47
47
|
initialData,
|
|
@@ -51,7 +51,7 @@ export function MCPServerForm({
|
|
|
51
51
|
tenantId,
|
|
52
52
|
projectId,
|
|
53
53
|
}: MCPServerFormProps) {
|
|
54
|
-
const router = useRouter()
|
|
54
|
+
const router = useRouter();
|
|
55
55
|
|
|
56
56
|
const form = useForm({
|
|
57
57
|
resolver: zodResolver(mcpToolSchema),
|
|
@@ -59,9 +59,17 @@ export function MCPServerForm({
|
|
|
59
59
|
...defaultValues,
|
|
60
60
|
...initialData,
|
|
61
61
|
},
|
|
62
|
-
})
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const { isSubmitting } = form.formState;
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
// Helper function to filter active tools against available tools
|
|
67
|
+
const getActiveTools = (toolsConfig: MCPToolFormData['config']['mcp']['toolsConfig']) => {
|
|
68
|
+
if (toolsConfig.type === 'all') return undefined;
|
|
69
|
+
|
|
70
|
+
const availableToolNames = tool?.availableTools?.map((t) => t.name) || [];
|
|
71
|
+
return toolsConfig.tools.filter((toolName) => availableToolNames.includes(toolName));
|
|
72
|
+
};
|
|
65
73
|
|
|
66
74
|
const onSubmit = async (data: MCPToolFormData) => {
|
|
67
75
|
try {
|
|
@@ -73,36 +81,29 @@ export function MCPServerForm({
|
|
|
73
81
|
config: {
|
|
74
82
|
...data.config,
|
|
75
83
|
mcp: {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// Convert discriminated union to API format: type='all' → activeTools=undefined
|
|
79
|
-
activeTools:
|
|
80
|
-
data.config.mcp.toolsConfig.type === 'all'
|
|
81
|
-
? undefined
|
|
82
|
-
: data.config.mcp.toolsConfig.tools,
|
|
84
|
+
...data.config.mcp,
|
|
85
|
+
activeTools: getActiveTools(data.config.mcp.toolsConfig),
|
|
83
86
|
},
|
|
84
87
|
},
|
|
85
|
-
}
|
|
88
|
+
};
|
|
86
89
|
|
|
87
90
|
if (mode === 'update' && tool) {
|
|
88
|
-
await updateMCPTool(tenantId, projectId, tool.id, transformedData)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
router.push(`/${tenantId}/projects/${projectId}/mcp-servers/${tool.id}`)
|
|
91
|
+
await updateMCPTool(tenantId, projectId, tool.id, transformedData);
|
|
92
|
+
toast.success('MCP server updated successfully');
|
|
93
|
+
router.push(`/${tenantId}/projects/${projectId}/mcp-servers/${tool.id}`);
|
|
92
94
|
} else {
|
|
93
95
|
const newTool = await createMCPTool(tenantId, projectId, {
|
|
94
96
|
...transformedData,
|
|
95
97
|
id: nanoid(),
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
router.push(`/${tenantId}/projects/${projectId}/mcp-servers/${newTool.id}`)
|
|
98
|
+
});
|
|
99
|
+
toast.success('MCP server created successfully');
|
|
100
|
+
router.push(`/${tenantId}/projects/${projectId}/mcp-servers/${newTool.id}`);
|
|
100
101
|
}
|
|
101
102
|
} catch (error) {
|
|
102
|
-
console.error(`Failed to ${mode} MCP tool:`, error)
|
|
103
|
-
toast.error(`Failed to ${mode} MCP server. Please try again.`)
|
|
103
|
+
console.error(`Failed to ${mode} MCP tool:`, error);
|
|
104
|
+
toast.error(`Failed to ${mode} MCP server. Please try again.`);
|
|
104
105
|
}
|
|
105
|
-
}
|
|
106
|
+
};
|
|
106
107
|
|
|
107
108
|
return (
|
|
108
109
|
<Form {...form}>
|
|
@@ -171,5 +172,5 @@ export function MCPServerForm({
|
|
|
171
172
|
</Button>
|
|
172
173
|
</form>
|
|
173
174
|
</Form>
|
|
174
|
-
)
|
|
175
|
+
);
|
|
175
176
|
}
|
|
@@ -160,6 +160,9 @@ export function MCPToolItem({
|
|
|
160
160
|
|
|
161
161
|
{/* Key metrics in a structured layout */}
|
|
162
162
|
<div className="flex items-center gap-2 flex-wrap">
|
|
163
|
+
{(tool.status === 'unhealthy' || tool.status === 'unknown') && (
|
|
164
|
+
<Badge variant="error">{tool.status}</Badge>
|
|
165
|
+
)}
|
|
163
166
|
{tool.status === 'needs_auth' ? (
|
|
164
167
|
<div className="flex items-center gap-2">
|
|
165
168
|
<Badge variant="warning">Needs Login</Badge>
|
|
@@ -4,16 +4,46 @@ import { Lock, LockOpen, Pencil } from 'lucide-react';
|
|
|
4
4
|
import Link from 'next/link';
|
|
5
5
|
import { Badge } from '@/components/ui/badge';
|
|
6
6
|
import { ExternalLink } from '@/components/ui/external-link';
|
|
7
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
7
8
|
import { useRuntimeConfig } from '@/contexts/runtime-config-context';
|
|
8
|
-
import type { MCPTool } from
|
|
9
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
10
|
+
|
|
9
11
|
import { cn } from '@/lib/utils';
|
|
10
12
|
import { getOAuthLoginUrl } from '@/lib/utils/mcp-urls';
|
|
11
13
|
import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
|
|
12
14
|
import { Button } from '../ui/button';
|
|
15
|
+
import { CopyableMultiLineCode } from '../ui/copyable-multi-line-code';
|
|
13
16
|
import { CopyableSingleLineCode } from '../ui/copyable-single-line-code';
|
|
14
17
|
import { AvailableToolsCard } from './available-tools-card';
|
|
15
18
|
import { MCPToolImage } from './mcp-tool-image';
|
|
16
19
|
|
|
20
|
+
// Helper component to render active tool badges with availability status
|
|
21
|
+
function ActiveToolBadge({ toolName, isAvailable }: { toolName: string; isAvailable: boolean }) {
|
|
22
|
+
const badge = (
|
|
23
|
+
<Badge
|
|
24
|
+
variant={isAvailable ? 'primary' : 'warning'}
|
|
25
|
+
className={cn(
|
|
26
|
+
isAvailable ? '' : 'opacity-75 border-yellow-500 text-yellow-700 bg-yellow-50 normal-case'
|
|
27
|
+
)}
|
|
28
|
+
>
|
|
29
|
+
{toolName}
|
|
30
|
+
</Badge>
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (!isAvailable) {
|
|
34
|
+
return (
|
|
35
|
+
<Tooltip>
|
|
36
|
+
<TooltipTrigger asChild>{badge}</TooltipTrigger>
|
|
37
|
+
<TooltipContent>
|
|
38
|
+
<p>This tool is not available in the MCP server.</p>
|
|
39
|
+
</TooltipContent>
|
|
40
|
+
</Tooltip>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return badge;
|
|
45
|
+
}
|
|
46
|
+
|
|
17
47
|
export function ViewMCPServerDetails({
|
|
18
48
|
tool,
|
|
19
49
|
tenantId,
|
|
@@ -147,33 +177,7 @@ export function ViewMCPServerDetails({
|
|
|
147
177
|
|
|
148
178
|
{/* Basic Information */}
|
|
149
179
|
<div className="space-y-8">
|
|
150
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-4
|
|
151
|
-
<div className="space-y-2">
|
|
152
|
-
<ItemLabel>Name</ItemLabel>
|
|
153
|
-
<ItemValue>{tool.name}</ItemValue>
|
|
154
|
-
</div>
|
|
155
|
-
<div className="space-y-2">
|
|
156
|
-
<ItemLabel>Status</ItemLabel>
|
|
157
|
-
<ItemValue className="items-center">
|
|
158
|
-
{tool.status === 'needs_auth' ? (
|
|
159
|
-
<Badge
|
|
160
|
-
variant="outline"
|
|
161
|
-
className="text-xs bg-amber-50 dark:bg-amber-900/20 text-amber-700 dark:text-amber-400 border-amber-200 dark:border-amber-800 cursor-pointer hover:bg-amber-100 dark:hover:bg-amber-900/30 hover:border-amber-300 dark:hover:border-amber-700 transition-colors"
|
|
162
|
-
onClick={(e) => {
|
|
163
|
-
e.preventDefault();
|
|
164
|
-
e.stopPropagation();
|
|
165
|
-
handleOAuthLogin(tool.id);
|
|
166
|
-
}}
|
|
167
|
-
>
|
|
168
|
-
Click to Login
|
|
169
|
-
</Badge>
|
|
170
|
-
) : (
|
|
171
|
-
<Badge className="uppercase" variant={getStatusBadgeVariant(tool.status)}>
|
|
172
|
-
{tool.status}
|
|
173
|
-
</Badge>
|
|
174
|
-
)}
|
|
175
|
-
</ItemValue>
|
|
176
|
-
</div>
|
|
180
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
177
181
|
<div className="space-y-2">
|
|
178
182
|
<ItemLabel>Created At</ItemLabel>
|
|
179
183
|
<ItemValue>
|
|
@@ -200,6 +204,37 @@ export function ViewMCPServerDetails({
|
|
|
200
204
|
</div>
|
|
201
205
|
)}
|
|
202
206
|
|
|
207
|
+
<div className="space-y-2">
|
|
208
|
+
<ItemLabel>Status</ItemLabel>
|
|
209
|
+
<ItemValue className="items-center">
|
|
210
|
+
{tool.status === 'needs_auth' ? (
|
|
211
|
+
<Badge
|
|
212
|
+
variant="outline"
|
|
213
|
+
className="text-xs bg-amber-50 dark:bg-amber-900/20 text-amber-700 dark:text-amber-400 border-amber-200 dark:border-amber-800 cursor-pointer hover:bg-amber-100 dark:hover:bg-amber-900/30 hover:border-amber-300 dark:hover:border-amber-700 transition-colors"
|
|
214
|
+
onClick={(e) => {
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
e.stopPropagation();
|
|
217
|
+
handleOAuthLogin(tool.id);
|
|
218
|
+
}}
|
|
219
|
+
>
|
|
220
|
+
Click to Login
|
|
221
|
+
</Badge>
|
|
222
|
+
) : (
|
|
223
|
+
<Badge className="uppercase" variant={getStatusBadgeVariant(tool.status)}>
|
|
224
|
+
{tool.status}
|
|
225
|
+
</Badge>
|
|
226
|
+
)}
|
|
227
|
+
</ItemValue>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
{/* Last Error */}
|
|
231
|
+
{tool.lastError && (
|
|
232
|
+
<div className="space-y-2">
|
|
233
|
+
<ItemLabel>Last Error</ItemLabel>
|
|
234
|
+
<CopyableMultiLineCode code={tool.lastError} />
|
|
235
|
+
</div>
|
|
236
|
+
)}
|
|
237
|
+
|
|
203
238
|
{/* Server URL */}
|
|
204
239
|
<div className="space-y-2">
|
|
205
240
|
<ItemLabel>Server URL</ItemLabel>
|
|
@@ -258,22 +293,26 @@ export function ViewMCPServerDetails({
|
|
|
258
293
|
tool.availableTools && tool.availableTools.length > 0 ? (
|
|
259
294
|
<div className="flex flex-wrap gap-2">
|
|
260
295
|
{tool.availableTools.map((toolInfo) => (
|
|
261
|
-
<
|
|
262
|
-
{toolInfo.name}
|
|
263
|
-
|
|
296
|
+
<ActiveToolBadge
|
|
297
|
+
key={toolInfo.name}
|
|
298
|
+
toolName={toolInfo.name}
|
|
299
|
+
isAvailable={true} // All available tools are shown, so they're all available
|
|
300
|
+
/>
|
|
264
301
|
))}
|
|
265
302
|
</div>
|
|
266
303
|
) : (
|
|
267
304
|
<div className="text-sm text-muted-foreground">No tools available</div>
|
|
268
305
|
)
|
|
269
306
|
) : tool.config.mcp.activeTools && tool.config.mcp.activeTools.length > 0 ? (
|
|
270
|
-
// Specific tools are active
|
|
307
|
+
// Specific tools are active - check availability
|
|
271
308
|
<div className="flex flex-wrap gap-2">
|
|
272
|
-
{tool.config.mcp.activeTools.map((toolName) =>
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
309
|
+
{tool.config.mcp.activeTools.map((toolName) => {
|
|
310
|
+
const isAvailable =
|
|
311
|
+
tool.availableTools?.some((t) => t.name === toolName) ?? false;
|
|
312
|
+
return (
|
|
313
|
+
<ActiveToolBadge key={toolName} toolName={toolName} isAvailable={isAvailable} />
|
|
314
|
+
);
|
|
315
|
+
})}
|
|
277
316
|
</div>
|
|
278
317
|
) : (
|
|
279
318
|
// No tools are active (empty array)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CopyButton } from '@/components/ui/copy-button';
|
|
2
|
+
import { ScrollArea } from '@/components/ui/scroll-area';
|
|
3
|
+
|
|
4
|
+
export function CopyableMultiLineCode({ code }: { code: string }) {
|
|
5
|
+
return (
|
|
6
|
+
<div className="relative bg-muted/50 dark:bg-muted/30 rounded-md border overflow-hidden">
|
|
7
|
+
<ScrollArea className="h-20 w-full">
|
|
8
|
+
<div className="px-3 py-2 pr-8">
|
|
9
|
+
<pre className="text-sm text-foreground/90 font-mono whitespace-pre-wrap break-words leading-5">
|
|
10
|
+
{code}
|
|
11
|
+
</pre>
|
|
12
|
+
</div>
|
|
13
|
+
</ScrollArea>
|
|
14
|
+
<CopyButton className="absolute right-1 top-1 z-10" textToCopy={code} />
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -27,7 +27,7 @@ describe('serializeGraphData', () => {
|
|
|
27
27
|
];
|
|
28
28
|
const edges: Edge[] = [];
|
|
29
29
|
|
|
30
|
-
const result = serializeGraphData(nodes, edges);
|
|
30
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
31
31
|
|
|
32
32
|
expect((result.agents.agent1 as any).models).toBeUndefined();
|
|
33
33
|
});
|
|
@@ -52,7 +52,7 @@ describe('serializeGraphData', () => {
|
|
|
52
52
|
];
|
|
53
53
|
const edges: Edge[] = [];
|
|
54
54
|
|
|
55
|
-
const result = serializeGraphData(nodes, edges);
|
|
55
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
56
56
|
|
|
57
57
|
expect((result.agents.agent1 as any).models).toBeUndefined();
|
|
58
58
|
});
|
|
@@ -77,7 +77,7 @@ describe('serializeGraphData', () => {
|
|
|
77
77
|
];
|
|
78
78
|
const edges: Edge[] = [];
|
|
79
79
|
|
|
80
|
-
const result = serializeGraphData(nodes, edges);
|
|
80
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
81
81
|
|
|
82
82
|
expect((result.agents.agent1 as any).models).toEqual({
|
|
83
83
|
base: { model: 'gpt-4' },
|
|
@@ -106,7 +106,7 @@ describe('serializeGraphData', () => {
|
|
|
106
106
|
];
|
|
107
107
|
const edges: Edge[] = [];
|
|
108
108
|
|
|
109
|
-
const result = serializeGraphData(nodes, edges);
|
|
109
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
110
110
|
|
|
111
111
|
expect((result.agents.agent1 as any).models).toEqual({
|
|
112
112
|
base: undefined,
|
|
@@ -135,7 +135,7 @@ describe('serializeGraphData', () => {
|
|
|
135
135
|
];
|
|
136
136
|
const edges: Edge[] = [];
|
|
137
137
|
|
|
138
|
-
const result = serializeGraphData(nodes, edges);
|
|
138
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
139
139
|
|
|
140
140
|
expect((result.agents.agent1 as any).models).toEqual({
|
|
141
141
|
base: undefined,
|
|
@@ -164,7 +164,7 @@ describe('serializeGraphData', () => {
|
|
|
164
164
|
];
|
|
165
165
|
const edges: Edge[] = [];
|
|
166
166
|
|
|
167
|
-
const result = serializeGraphData(nodes, edges);
|
|
167
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
168
168
|
|
|
169
169
|
expect((result.agents.agent1 as any).models).toEqual({
|
|
170
170
|
base: { model: 'gpt-4' },
|
|
@@ -189,7 +189,7 @@ describe('serializeGraphData', () => {
|
|
|
189
189
|
];
|
|
190
190
|
const edges: Edge[] = [];
|
|
191
191
|
|
|
192
|
-
const result = serializeGraphData(nodes, edges);
|
|
192
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
193
193
|
|
|
194
194
|
expect((result.agents.agent1 as any).models).toBeUndefined();
|
|
195
195
|
});
|
|
@@ -213,15 +213,9 @@ describe('serializeGraphData', () => {
|
|
|
213
213
|
type: NodeType.MCP,
|
|
214
214
|
position: { x: 200, y: 0 },
|
|
215
215
|
data: {
|
|
216
|
-
|
|
216
|
+
toolId: 'mcp1',
|
|
217
217
|
name: 'Test MCP Server',
|
|
218
|
-
config: { type: 'mcp', mcp: { server: { url: 'test://server' } } },
|
|
219
218
|
tempSelectedTools: ['tool1', 'tool2'],
|
|
220
|
-
tenantId: 'test-tenant',
|
|
221
|
-
projectId: 'test-project',
|
|
222
|
-
status: 'unknown',
|
|
223
|
-
createdAt: new Date(),
|
|
224
|
-
updatedAt: new Date(),
|
|
225
219
|
} as MCPNodeData,
|
|
226
220
|
},
|
|
227
221
|
];
|
|
@@ -235,13 +229,13 @@ describe('serializeGraphData', () => {
|
|
|
235
229
|
},
|
|
236
230
|
];
|
|
237
231
|
|
|
238
|
-
const result = serializeGraphData(nodes, edges);
|
|
232
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
239
233
|
|
|
240
234
|
expect((result.agents.agent1 as any).canUse).toBeDefined();
|
|
241
235
|
expect((result.agents.agent1 as any).canUse).toHaveLength(1);
|
|
242
236
|
expect((result.agents.agent1 as any).canUse[0]).toEqual({
|
|
243
237
|
toolId: 'mcp1',
|
|
244
|
-
toolSelection: ['tool1', 'tool2']
|
|
238
|
+
toolSelection: ['tool1', 'tool2'],
|
|
245
239
|
});
|
|
246
240
|
});
|
|
247
241
|
|
|
@@ -263,15 +257,9 @@ describe('serializeGraphData', () => {
|
|
|
263
257
|
type: NodeType.MCP,
|
|
264
258
|
position: { x: 200, y: 0 },
|
|
265
259
|
data: {
|
|
266
|
-
|
|
260
|
+
toolId: 'mcp1',
|
|
267
261
|
name: 'Test MCP Server',
|
|
268
|
-
config: { type: 'mcp', mcp: { server: { url: 'test://server' } } },
|
|
269
262
|
tempSelectedTools: null, // null means all tools selected
|
|
270
|
-
tenantId: 'test-tenant',
|
|
271
|
-
projectId: 'test-project',
|
|
272
|
-
status: 'unknown',
|
|
273
|
-
createdAt: new Date(),
|
|
274
|
-
updatedAt: new Date(),
|
|
275
263
|
} as MCPNodeData,
|
|
276
264
|
},
|
|
277
265
|
];
|
|
@@ -285,14 +273,14 @@ describe('serializeGraphData', () => {
|
|
|
285
273
|
},
|
|
286
274
|
];
|
|
287
275
|
|
|
288
|
-
const result = serializeGraphData(nodes, edges);
|
|
276
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
289
277
|
|
|
290
278
|
// When tempSelectedTools is null, all tools should be selected (toolSelection: null)
|
|
291
279
|
expect((result.agents.agent1 as any).canUse).toBeDefined();
|
|
292
280
|
expect((result.agents.agent1 as any).canUse).toHaveLength(1);
|
|
293
281
|
expect((result.agents.agent1 as any).canUse[0]).toEqual({
|
|
294
282
|
toolId: 'mcp1',
|
|
295
|
-
toolSelection: null
|
|
283
|
+
toolSelection: null,
|
|
296
284
|
});
|
|
297
285
|
});
|
|
298
286
|
|
|
@@ -313,15 +301,9 @@ describe('serializeGraphData', () => {
|
|
|
313
301
|
type: NodeType.MCP,
|
|
314
302
|
position: { x: 200, y: 0 },
|
|
315
303
|
data: {
|
|
316
|
-
|
|
304
|
+
toolId: 'mcp1',
|
|
317
305
|
name: 'Test MCP Server',
|
|
318
|
-
config: { type: 'mcp', mcp: { server: { url: 'test://server' } } },
|
|
319
306
|
tempSelectedTools: [], // empty array means no tools selected
|
|
320
|
-
tenantId: 'test-tenant',
|
|
321
|
-
projectId: 'test-project',
|
|
322
|
-
status: 'unknown',
|
|
323
|
-
createdAt: new Date(),
|
|
324
|
-
updatedAt: new Date(),
|
|
325
307
|
} as MCPNodeData,
|
|
326
308
|
},
|
|
327
309
|
];
|
|
@@ -335,13 +317,13 @@ describe('serializeGraphData', () => {
|
|
|
335
317
|
},
|
|
336
318
|
];
|
|
337
319
|
|
|
338
|
-
const result = serializeGraphData(nodes, edges);
|
|
320
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
339
321
|
|
|
340
322
|
expect((result.agents.agent1 as any).canUse).toBeDefined();
|
|
341
323
|
expect((result.agents.agent1 as any).canUse).toHaveLength(1);
|
|
342
324
|
expect((result.agents.agent1 as any).canUse[0]).toEqual({
|
|
343
325
|
toolId: 'mcp1',
|
|
344
|
-
toolSelection: []
|
|
326
|
+
toolSelection: [],
|
|
345
327
|
});
|
|
346
328
|
});
|
|
347
329
|
|
|
@@ -362,15 +344,9 @@ describe('serializeGraphData', () => {
|
|
|
362
344
|
type: NodeType.MCP,
|
|
363
345
|
position: { x: 200, y: 0 },
|
|
364
346
|
data: {
|
|
365
|
-
|
|
347
|
+
toolId: 'mcp1',
|
|
366
348
|
name: 'Test MCP Server',
|
|
367
|
-
config: { type: 'mcp', mcp: { server: { url: 'test://server' } } },
|
|
368
349
|
// no tempSelectedTools property
|
|
369
|
-
tenantId: 'test-tenant',
|
|
370
|
-
projectId: 'test-project',
|
|
371
|
-
status: 'unknown',
|
|
372
|
-
createdAt: new Date(),
|
|
373
|
-
updatedAt: new Date(),
|
|
374
350
|
} as MCPNodeData,
|
|
375
351
|
},
|
|
376
352
|
];
|
|
@@ -384,7 +360,7 @@ describe('serializeGraphData', () => {
|
|
|
384
360
|
},
|
|
385
361
|
];
|
|
386
362
|
|
|
387
|
-
const result = serializeGraphData(nodes, edges);
|
|
363
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
388
364
|
|
|
389
365
|
// selectedTools should not be created if tempSelectedTools is undefined
|
|
390
366
|
expect((result.agents.agent1 as any).selectedTools).toBeUndefined();
|
|
@@ -409,15 +385,9 @@ describe('serializeGraphData', () => {
|
|
|
409
385
|
type: NodeType.MCP,
|
|
410
386
|
position: { x: 200, y: 0 },
|
|
411
387
|
data: {
|
|
412
|
-
|
|
388
|
+
toolId: 'mcp1',
|
|
413
389
|
name: 'Test MCP Server',
|
|
414
|
-
config: { type: 'mcp', mcp: { server: { url: 'test://server' } } },
|
|
415
390
|
// tempSelectedTools is undefined (user didn't interact with UI)
|
|
416
|
-
tenantId: 'test-tenant',
|
|
417
|
-
projectId: 'test-project',
|
|
418
|
-
status: 'unknown',
|
|
419
|
-
createdAt: new Date(),
|
|
420
|
-
updatedAt: new Date(),
|
|
421
391
|
} as MCPNodeData,
|
|
422
392
|
},
|
|
423
393
|
];
|
|
@@ -431,7 +401,7 @@ describe('serializeGraphData', () => {
|
|
|
431
401
|
},
|
|
432
402
|
];
|
|
433
403
|
|
|
434
|
-
const result = serializeGraphData(nodes, edges);
|
|
404
|
+
const result = serializeGraphData(nodes, edges, undefined, {}, {}, {});
|
|
435
405
|
|
|
436
406
|
// When tempSelectedTools is undefined and there's an edge to MCP tool,
|
|
437
407
|
// the toolSelection will be null (all tools selected by default)
|
|
@@ -439,7 +409,7 @@ describe('serializeGraphData', () => {
|
|
|
439
409
|
expect((result.agents.agent1 as any).canUse).toHaveLength(1);
|
|
440
410
|
expect((result.agents.agent1 as any).canUse[0]).toEqual({
|
|
441
411
|
toolId: 'mcp1',
|
|
442
|
-
toolSelection: null
|
|
412
|
+
toolSelection: null, // null means all tools are selected
|
|
443
413
|
});
|
|
444
414
|
});
|
|
445
415
|
});
|
|
@@ -14,7 +14,7 @@ import type {
|
|
|
14
14
|
FullGraphDefinition,
|
|
15
15
|
InternalAgentDefinition,
|
|
16
16
|
} from '@/lib/types/graph-full';
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
import { formatJsonField } from '@/lib/utils';
|
|
19
19
|
|
|
20
20
|
interface TransformResult {
|
|
@@ -101,10 +101,7 @@ function applyDagreLayout(nodes: Node[], edges: Edge[]): Node[] {
|
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
export function deserializeGraphData(
|
|
105
|
-
data: FullGraphDefinition,
|
|
106
|
-
toolLookup?: Record<string, MCPTool>
|
|
107
|
-
): TransformResult {
|
|
104
|
+
export function deserializeGraphData(data: FullGraphDefinition): TransformResult {
|
|
108
105
|
const nodes: Node[] = [];
|
|
109
106
|
const edges: Edge[] = [];
|
|
110
107
|
|
|
@@ -213,7 +210,7 @@ export function deserializeGraphData(
|
|
|
213
210
|
id: toolNodeId,
|
|
214
211
|
type: NodeType.MCP,
|
|
215
212
|
position: { x: 0, y: 0 },
|
|
216
|
-
data: {
|
|
213
|
+
data: { toolId: tool.id },
|
|
217
214
|
};
|
|
218
215
|
nodes.push(toolNode);
|
|
219
216
|
|
|
@@ -228,33 +225,15 @@ export function deserializeGraphData(
|
|
|
228
225
|
edges.push(agentToToolEdge);
|
|
229
226
|
}
|
|
230
227
|
} else {
|
|
231
|
-
// Tools are project-scoped
|
|
228
|
+
// Tools are project-scoped - just store the tool ID
|
|
232
229
|
for (const canUseItem of agent.canUse) {
|
|
233
230
|
const toolId = canUseItem.toolId;
|
|
234
|
-
const tool = toolLookup?.[toolId];
|
|
235
231
|
const toolNodeId = nanoid();
|
|
236
232
|
const toolNode: Node = {
|
|
237
233
|
id: toolNodeId,
|
|
238
234
|
type: NodeType.MCP,
|
|
239
235
|
position: { x: 0, y: 0 },
|
|
240
|
-
data:
|
|
241
|
-
? {
|
|
242
|
-
id: tool.id,
|
|
243
|
-
name: tool.name,
|
|
244
|
-
description: '', // MCPTool doesn't have a description field at top level
|
|
245
|
-
type: 'mcp',
|
|
246
|
-
config: tool.config || {},
|
|
247
|
-
status: tool.status,
|
|
248
|
-
availableTools: tool.availableTools,
|
|
249
|
-
selectedTools: canUseItem.toolSelection, // Use toolSelection from canUseItem
|
|
250
|
-
}
|
|
251
|
-
: {
|
|
252
|
-
id: toolId,
|
|
253
|
-
name: toolId,
|
|
254
|
-
description: 'Project-scoped tool',
|
|
255
|
-
type: 'project-scoped',
|
|
256
|
-
config: {},
|
|
257
|
-
},
|
|
236
|
+
data: { toolId },
|
|
258
237
|
};
|
|
259
238
|
nodes.push(toolNode);
|
|
260
239
|
|