@inkeep/agents-manage-ui 0.6.5 → 0.7.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 +124 -124
- package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +6 -6
- package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
- package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +3 -3
- 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 +1 -1
- 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 +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 +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 +2 -2
- 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 +1 -1
- 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 +6 -6
- package/.next/standalone/agents-manage-ui/.next/server/chunks/1267.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/1828.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2124.js +23 -13
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3144.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3460.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/{7211.js → 4108.js} +12 -12
- package/.next/standalone/agents-manage-ui/.next/server/chunks/499.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6831.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
- 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/2915-f48fe90984ae5d8b.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-b90b21b559925fc6.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6763-5c2401becfe1a959.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-efbb83dcb2b4c5ce.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/7232-63c17ffc2737968a.js +25 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{6952-3f2a84c5ba03fb2b.js → 8825-c4a769ea3a8e81d1.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-c92a1f042f5ea538.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-d8c96c8cefdfd4bd.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-d8c96c8cefdfd4bd.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/{page-3f9ff93fab72705b.js → page-9723ca38f4d36dda.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-a1be97e0e467835a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-dcc6276bc353efb2.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-b4038baed88b93f9.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-72ecfe1df8e379a5.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/{page-e02707f69e0015e0.js → page-ee89187f61e8d315.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/{page-e02707f69e0015e0.js → page-ee89187f61e8d315.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-e8b99c1272c1540c.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-149dc9cf7b8332ab.js → page-b574c5e1d3df7e73.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-c15be44435dd5f2d.js → page-95c13c0305dfddfb.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-78554443bb163ae9.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-33053057910de3eb.js → page-6a1affa547b51cd8.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-1a6683f262056080.js → page-6222398da9ee2271.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-cdf6cf1143f6a553.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-78887bbecb44fd26.js → page-77f0a0e0e4372681.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-b2e49d12c1c10e47.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-fc18e3ba5c2fc6a5.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-35c8d055f3f8d91c.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/playground/chat-widget.tsx +10 -0
- 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/1631.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2298.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/329.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/4754.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5773.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6577.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8798.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/2229-e980fad7ac777384.js +0 -25
- package/.next/standalone/agents-manage-ui/.next/static/chunks/3200-6d80f96a4d5ea423.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6187-75bda81ee4117ed2.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-506ca8b1a906ac2a.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-81788595a817e711.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-8ec4191752587977.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-8ec4191752587977.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-a637ecda071e042c.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-fd2c318c31373f80.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-f55b6e769c4b1db8.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-db25060b2d52ebb8.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-b494291f7a5cebf6.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-5edc45db8e78342a.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-36c9163f810b36a0.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-bb7eb8042fbce7b4.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-af5372b8e0a563b0.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-71456c0293edc200.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/70e9093ef73fbe1b.css +0 -1
- /package/.next/standalone/agents-manage-ui/.next/static/{X9iq1SzdbJH24pPiGko3K → 0c8HYV9Bsdgx06_BNb0kR}/_buildManifest.js +0 -0
- /package/.next/standalone/agents-manage-ui/.next/static/{X9iq1SzdbJH24pPiGko3K → 0c8HYV9Bsdgx06_BNb0kR}/_ssgManifest.js +0 -0
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { type Node, useReactFlow } from '@xyflow/react'
|
|
2
|
-
import { useParams } from 'next/navigation'
|
|
3
|
-
import { useEffect, useState } from 'react'
|
|
4
|
-
import { toast } from 'sonner'
|
|
5
|
-
import { fetchMCPTools } from
|
|
6
|
-
import type { MCPTool } from
|
|
7
|
-
import { NodeType } from '../../../configuration/node-types'
|
|
8
|
-
import { EmptyState } from '../empty-state'
|
|
9
|
-
import { MCPSelectorLoading } from './loading'
|
|
10
|
-
import { MCPServerItem } from './mcp-server-item'
|
|
1
|
+
import { type Node, useReactFlow } from '@xyflow/react';
|
|
2
|
+
import { useParams } from 'next/navigation';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { toast } from 'sonner';
|
|
5
|
+
import { fetchMCPTools } from '@/lib/api/tools';
|
|
6
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
7
|
+
import { NodeType } from '../../../configuration/node-types';
|
|
8
|
+
import { EmptyState } from '../empty-state';
|
|
9
|
+
import { MCPSelectorLoading } from './loading';
|
|
10
|
+
import { MCPServerItem } from './mcp-server-item';
|
|
11
11
|
|
|
12
12
|
interface MCPSelectorState {
|
|
13
|
-
tools: MCPTool[]
|
|
14
|
-
isLoading: boolean
|
|
15
|
-
error: string | null
|
|
13
|
+
tools: MCPTool[];
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
error: string | null;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const useFetchAvailableMCPs = (): MCPSelectorState => {
|
|
19
|
-
const [tools, setTools] = useState<MCPTool[]>([])
|
|
20
|
-
const [isLoading, setIsLoading] = useState(true)
|
|
21
|
-
const [error, setError] = useState<string | null>(null)
|
|
19
|
+
const [tools, setTools] = useState<MCPTool[]>([]);
|
|
20
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
21
|
+
const [error, setError] = useState<string | null>(null);
|
|
22
22
|
const { tenantId, projectId } = useParams<{
|
|
23
|
-
tenantId: string
|
|
24
|
-
projectId: string
|
|
25
|
-
}>()
|
|
23
|
+
tenantId: string;
|
|
24
|
+
projectId: string;
|
|
25
|
+
}>();
|
|
26
26
|
|
|
27
27
|
useEffect(() => {
|
|
28
28
|
const loadTools = async () => {
|
|
29
29
|
try {
|
|
30
|
-
setIsLoading(true)
|
|
31
|
-
setError(null)
|
|
32
|
-
const mcpTools = await fetchMCPTools(tenantId, projectId)
|
|
33
|
-
setTools(mcpTools)
|
|
30
|
+
setIsLoading(true);
|
|
31
|
+
setError(null);
|
|
32
|
+
const mcpTools = await fetchMCPTools(tenantId, projectId);
|
|
33
|
+
setTools(mcpTools);
|
|
34
34
|
} catch (err) {
|
|
35
|
-
const errorMessage = err instanceof Error ? err.message : 'Failed to load MCP tools'
|
|
36
|
-
setError(errorMessage)
|
|
37
|
-
toast.error(errorMessage)
|
|
35
|
+
const errorMessage = err instanceof Error ? err.message : 'Failed to load MCP tools';
|
|
36
|
+
setError(errorMessage);
|
|
37
|
+
toast.error(errorMessage);
|
|
38
38
|
} finally {
|
|
39
|
-
setIsLoading(false)
|
|
39
|
+
setIsLoading(false);
|
|
40
40
|
}
|
|
41
|
-
}
|
|
41
|
+
};
|
|
42
42
|
|
|
43
|
-
loadTools()
|
|
44
|
-
}, [tenantId, projectId])
|
|
43
|
+
loadTools();
|
|
44
|
+
}, [tenantId, projectId]);
|
|
45
45
|
|
|
46
|
-
return { tools, isLoading, error }
|
|
47
|
-
}
|
|
46
|
+
return { tools, isLoading, error };
|
|
47
|
+
};
|
|
48
48
|
|
|
49
49
|
export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
50
|
-
const { updateNode } = useReactFlow()
|
|
50
|
+
const { updateNode } = useReactFlow();
|
|
51
51
|
const { tenantId, projectId } = useParams<{
|
|
52
|
-
tenantId: string
|
|
53
|
-
projectId: string
|
|
54
|
-
}>()
|
|
55
|
-
const { tools, isLoading, error } = useFetchAvailableMCPs()
|
|
52
|
+
tenantId: string;
|
|
53
|
+
projectId: string;
|
|
54
|
+
}>();
|
|
55
|
+
const { tools, isLoading, error } = useFetchAvailableMCPs();
|
|
56
56
|
|
|
57
57
|
const handleSelect = (mcp: MCPTool) => {
|
|
58
58
|
updateNode(selectedNode.id, {
|
|
59
59
|
type: NodeType.MCP,
|
|
60
|
-
data: {
|
|
61
|
-
})
|
|
62
|
-
}
|
|
60
|
+
data: { toolId: mcp.id },
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
63
|
|
|
64
64
|
if (isLoading) {
|
|
65
|
-
return <MCPSelectorLoading title="Select MCP server"
|
|
65
|
+
return <MCPSelectorLoading title="Select MCP server" />;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
if (error) {
|
|
@@ -72,7 +72,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
72
72
|
actionText="Create MCP server"
|
|
73
73
|
actionHref={`/${tenantId}/projects/${projectId}/mcp-servers/new`}
|
|
74
74
|
/>
|
|
75
|
-
)
|
|
75
|
+
);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
if (!tools?.length) {
|
|
@@ -82,7 +82,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
82
82
|
actionText="Create MCP server"
|
|
83
83
|
actionHref={`/${tenantId}/projects/${projectId}/mcp-servers/new`}
|
|
84
84
|
/>
|
|
85
|
-
)
|
|
85
|
+
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
return (
|
|
@@ -96,5 +96,5 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
|
|
|
96
96
|
</div>
|
|
97
97
|
</div>
|
|
98
98
|
</div>
|
|
99
|
-
)
|
|
99
|
+
);
|
|
100
100
|
}
|
|
@@ -5,6 +5,7 @@ import { useMemo } from 'react';
|
|
|
5
5
|
import { useGraphErrors } from '@/hooks/use-graph-errors';
|
|
6
6
|
import type { ArtifactComponent } from '@/lib/api/artifact-components';
|
|
7
7
|
import type { DataComponent } from '@/lib/api/data-components';
|
|
8
|
+
import type { MCPTool } from '@/lib/types/tools';
|
|
8
9
|
import { SidePane as SidePaneLayout } from '../../layout/sidepane';
|
|
9
10
|
import { edgeTypeMap } from '../configuration/edge-types';
|
|
10
11
|
import {
|
|
@@ -31,6 +32,7 @@ interface SidePaneProps {
|
|
|
31
32
|
dataComponentLookup: Record<string, DataComponent>;
|
|
32
33
|
artifactComponentLookup: Record<string, ArtifactComponent>;
|
|
33
34
|
selectedToolsLookup: Record<string, Record<string, string[]>>;
|
|
35
|
+
toolLookup: Record<string, MCPTool>;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
export function SidePane({
|
|
@@ -42,6 +44,7 @@ export function SidePane({
|
|
|
42
44
|
dataComponentLookup,
|
|
43
45
|
artifactComponentLookup,
|
|
44
46
|
selectedToolsLookup,
|
|
47
|
+
toolLookup,
|
|
45
48
|
}: SidePaneProps) {
|
|
46
49
|
const selectedNode = useNodesData(selectedNodeId || '');
|
|
47
50
|
const edges = useEdges();
|
|
@@ -111,6 +114,7 @@ export function SidePane({
|
|
|
111
114
|
<MCPServerNodeEditor
|
|
112
115
|
selectedNode={selectedNode as Node<MCPNodeData>}
|
|
113
116
|
selectedToolsLookup={selectedToolsLookup}
|
|
117
|
+
toolLookup={toolLookup}
|
|
114
118
|
/>
|
|
115
119
|
);
|
|
116
120
|
}
|
|
@@ -131,6 +135,7 @@ export function SidePane({
|
|
|
131
135
|
getFieldErrorMessage,
|
|
132
136
|
getFirstErrorField,
|
|
133
137
|
selectedToolsLookup,
|
|
138
|
+
toolLookup,
|
|
134
139
|
]);
|
|
135
140
|
|
|
136
141
|
const showBackButton = useMemo(() => {
|
|
@@ -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
|
+
}
|