@inkeep/agents-manage-ui 0.23.5 → 0.24.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 +42 -42
- package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +1 -1
- 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]/agents/[agentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/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]/artifacts/[artifactComponentId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
- 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_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]/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 +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 +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 +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 +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 +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/data-components/[dataComponentId]/generate-preview/route.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-preview/route_client-reference-manifest.js +1 -1
- 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 +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/1524.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2584.js +14 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/526.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5478.js +4080 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5732.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{2557.js → 7733.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7848.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7988.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8038.js +196 -0
- package/.next/standalone/agents-manage-ui/.next/server/middleware-manifest.json +5 -5
- 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/20837-f8b0d86a8303f4c3.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/24994-975eb584d5b2438a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/47259-95ea98b229d39774.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/48949-692c5f8265558813.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/74206-85aa3065dce9dc8a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/76125-82ebb14b304cfe0b.js +25 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/page-fdbebdb8c3371c73.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-bc76e9554c5d2341.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/page-4c5fb257a6233694.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-5158b01426eb0f32.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/{page-c66ccba640d47f0f.js → page-75c72891b2f2923c.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-4cae1de757715499.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{page-c9f433a59ec91812.js → page-528fffe4fc232ff4.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/{page-b3c543ab1c4bd6b4.js → page-2551beb91f3aa6e6.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/{page-7f0e3b8c1e661827.js → page-05a78b9d37131b1a.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-d238c502f632f4e0.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/{page-52ae0fa0a16c7979.js → page-3655f333086c211d.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-20579bf7a4fb87d3.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-f109a80577d83568.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-9eafe11017316482.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-5b25bf3f3967c268.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-0abb5f43d02da2b4.js → page-d970759f74621cfe.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-57be5eb54ad97e11.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-156d1009662ee964.js → page-11cfe0365b56c6b2.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-bb2b8d64b23cf563.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-cf6f4f3394d4813d.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/{layout-b8d6461cf022b06c.js → layout-d83e519e9bcc6269.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/86b7c14b860f21e3.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/api/data-components/[dataComponentId]/generate-preview/route.ts +17 -2
- package/src/app/globals.css +21 -0
- package/src/components/agent/agent.tsx +173 -2
- package/src/components/agent/configuration/edge-types.tsx +7 -1
- package/src/components/agent/configuration/node-types.tsx +7 -0
- package/src/components/agent/edges/agent-to-agent-edge.tsx +11 -5
- package/src/components/agent/edges/default-edge.tsx +54 -11
- package/src/components/agent/node-library/node-item.tsx +1 -1
- package/src/components/agent/nodes/base-node.tsx +15 -20
- package/src/components/agent/nodes/external-agent-node.tsx +9 -4
- package/src/components/agent/nodes/function-tool-node.tsx +7 -2
- package/src/components/agent/nodes/mcp-node.tsx +29 -26
- package/src/components/agent/nodes/node-tab.tsx +7 -6
- package/src/components/agent/nodes/sub-agent-node.tsx +8 -3
- package/src/components/agent/toolbar/toolbar.tsx +18 -7
- package/src/features/agent/domain/serialize.ts +2 -2
- package/src/lib/actions/data-components.ts +2 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2215.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/4883.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5112.js +0 -196
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5416.js +0 -14
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7283.js +0 -4080
- package/.next/standalone/agents-manage-ui/.next/static/chunks/13578-0ecceb958c0ce63f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/20837-4b00b831f3de1892.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/27208-36636f32d254d800.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/56461-61f28c6fa4039d33.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/61330-f978ea4653e10ca7.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/85014-410be6cfd6c0b753.js +0 -25
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/page-cc373d319cdfb74f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-2ceba25d996bf510.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/page-f473cdc852dcea1b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-08978f8575693f81.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-0e7fd82b8c436b6f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-9193e456fc869fb3.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-bf5914023071d49d.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-3d78f1d4b32c2ef0.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-be427c6132d3dd87.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-6a61a970c0545164.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-6e316e6b84440446.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-0cc06bd02445112e.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-1404ec909a47ed0c.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/5dfa86d258326297.css +0 -1
- /package/.next/standalone/agents-manage-ui/.next/static/{2ceZLQWaXoj5yCGjkjRcx → TwV2TGtXdOiFkslre7D-k}/_buildManifest.js +0 -0
- /package/.next/standalone/agents-manage-ui/.next/static/{2ceZLQWaXoj5yCGjkjRcx → TwV2TGtXdOiFkslre7D-k}/_ssgManifest.js +0 -0
|
@@ -16,13 +16,21 @@ export async function POST(request: NextRequest, context: RouteContext) {
|
|
|
16
16
|
return new Response('Missing tenantId or projectId', { status: 400 });
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const
|
|
20
|
-
|
|
19
|
+
const runApiUrl =
|
|
20
|
+
process.env.PUBLIC_INKEEP_AGENTS_RUN_API_URL ||
|
|
21
|
+
'http://localhost:3003';
|
|
22
|
+
const url = `${runApiUrl}/v1/${tenantId}/projects/${projectId}/data-components/${dataComponentId}/generate-preview`;
|
|
21
23
|
|
|
22
24
|
const response = await fetch(url, {
|
|
23
25
|
method: 'POST',
|
|
24
26
|
headers: {
|
|
25
27
|
'Content-Type': 'application/json',
|
|
28
|
+
...(process.env.PUBLIC_INKEEP_AGENTS_RUN_API_BYPASS_SECRET && {
|
|
29
|
+
Authorization: `Bearer ${process.env.PUBLIC_INKEEP_AGENTS_RUN_API_BYPASS_SECRET}`,
|
|
30
|
+
'x-inkeep-tenant-id': tenantId,
|
|
31
|
+
'x-inkeep-project-id': projectId,
|
|
32
|
+
'x-inkeep-agent-id': 'preview-generator',
|
|
33
|
+
}),
|
|
26
34
|
},
|
|
27
35
|
body: JSON.stringify({
|
|
28
36
|
instructions: instructions || undefined,
|
|
@@ -31,6 +39,13 @@ export async function POST(request: NextRequest, context: RouteContext) {
|
|
|
31
39
|
});
|
|
32
40
|
|
|
33
41
|
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text().catch(() => 'Unable to read error');
|
|
43
|
+
console.error('Run API returned error:', {
|
|
44
|
+
status: response.status,
|
|
45
|
+
statusText: response.statusText,
|
|
46
|
+
body: errorText,
|
|
47
|
+
url,
|
|
48
|
+
});
|
|
34
49
|
return new Response('Failed to generate preview', { status: response.status });
|
|
35
50
|
}
|
|
36
51
|
|
package/src/app/globals.css
CHANGED
|
@@ -271,3 +271,24 @@
|
|
|
271
271
|
li[data-sonner-toast][data-type="error"] {
|
|
272
272
|
@apply text-red-700 dark:text-red-400 border-red-200 dark:border-red-800 bg-red-50/50 dark:bg-red-950/30 backdrop-blur-sm shadow-xl;
|
|
273
273
|
}
|
|
274
|
+
|
|
275
|
+
/* Node execution pulse animation */
|
|
276
|
+
@keyframes node-pulse {
|
|
277
|
+
0% {
|
|
278
|
+
transform: scale(1);
|
|
279
|
+
box-shadow: 0 0 0 0 rgba(105, 163, 255, 0.7);
|
|
280
|
+
}
|
|
281
|
+
50% {
|
|
282
|
+
transform: scale(1.05);
|
|
283
|
+
box-shadow: 0 0 0 15px transparent;
|
|
284
|
+
}
|
|
285
|
+
100% {
|
|
286
|
+
transform: scale(1);
|
|
287
|
+
box-shadow: 0 0 0 0 transparent;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.node-executing {
|
|
292
|
+
animation: node-pulse 1.5s ease-in-out infinite;
|
|
293
|
+
@apply border-primary border-2;
|
|
294
|
+
}
|
|
@@ -693,6 +693,171 @@ function Flow({
|
|
|
693
693
|
toolLookup,
|
|
694
694
|
]);
|
|
695
695
|
|
|
696
|
+
useEffect(() => {
|
|
697
|
+
const onDataOperation: EventListenerOrEventListenerObject = (event) => {
|
|
698
|
+
// @ts-expect-error -- improve types
|
|
699
|
+
const data = event.detail;
|
|
700
|
+
|
|
701
|
+
switch (data.type) {
|
|
702
|
+
case 'agent_initializing': {
|
|
703
|
+
// TODO
|
|
704
|
+
break;
|
|
705
|
+
}
|
|
706
|
+
case 'delegation_sent':
|
|
707
|
+
case 'transfer': {
|
|
708
|
+
const { fromSubAgent, targetSubAgent } = data.details.data;
|
|
709
|
+
setEdges((prevEdges) =>
|
|
710
|
+
prevEdges.map((edge) => ({
|
|
711
|
+
...edge,
|
|
712
|
+
data: {
|
|
713
|
+
...edge.data,
|
|
714
|
+
delegating: edge.source === fromSubAgent && edge.target === targetSubAgent,
|
|
715
|
+
},
|
|
716
|
+
}))
|
|
717
|
+
);
|
|
718
|
+
setNodes((prevNodes) =>
|
|
719
|
+
prevNodes.map((node) => ({
|
|
720
|
+
...node,
|
|
721
|
+
data: {
|
|
722
|
+
...node.data,
|
|
723
|
+
isDelegating: node.id === fromSubAgent || node.id === targetSubAgent,
|
|
724
|
+
},
|
|
725
|
+
}))
|
|
726
|
+
);
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
case 'delegation_returned': {
|
|
730
|
+
const { targetSubAgent } = data.details.data;
|
|
731
|
+
setEdges((prevEdges) =>
|
|
732
|
+
prevEdges.map((edge) => ({
|
|
733
|
+
...edge,
|
|
734
|
+
data: { ...edge.data, delegating: false },
|
|
735
|
+
}))
|
|
736
|
+
);
|
|
737
|
+
setNodes((prevNodes) =>
|
|
738
|
+
prevNodes.map((node) => ({
|
|
739
|
+
...node,
|
|
740
|
+
data: { ...node.data, isExecuting: node.id === targetSubAgent, isDelegating: false },
|
|
741
|
+
}))
|
|
742
|
+
);
|
|
743
|
+
break;
|
|
744
|
+
}
|
|
745
|
+
case 'tool_call': {
|
|
746
|
+
const { toolName } = data.details.data;
|
|
747
|
+
const { subAgentId } = data.details;
|
|
748
|
+
setNodes((prevNodes) => {
|
|
749
|
+
setEdges((prevEdges) =>
|
|
750
|
+
prevEdges.map((edge) => {
|
|
751
|
+
const node = prevNodes.find((node) => node.id === edge.target);
|
|
752
|
+
const toolId = node?.data.toolId as string;
|
|
753
|
+
const toolData = toolLookup[toolId];
|
|
754
|
+
const hasTool = toolData?.availableTools?.some((tool) => tool.name === toolName);
|
|
755
|
+
const hasDots = edge.source === subAgentId && hasTool;
|
|
756
|
+
return {
|
|
757
|
+
...edge,
|
|
758
|
+
data: { ...edge.data, delegating: hasDots },
|
|
759
|
+
};
|
|
760
|
+
})
|
|
761
|
+
);
|
|
762
|
+
return prevNodes.map((node) => {
|
|
763
|
+
const toolId = node.data.toolId as string;
|
|
764
|
+
const toolData = toolLookup[toolId];
|
|
765
|
+
|
|
766
|
+
return {
|
|
767
|
+
...node,
|
|
768
|
+
data: {
|
|
769
|
+
...node.data,
|
|
770
|
+
isExecuting: false,
|
|
771
|
+
isDelegating:
|
|
772
|
+
node.data.id === subAgentId ||
|
|
773
|
+
toolData?.availableTools?.some((tool) => tool.name === toolName),
|
|
774
|
+
},
|
|
775
|
+
};
|
|
776
|
+
});
|
|
777
|
+
});
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
case 'tool_result': {
|
|
781
|
+
const { toolName } = data.details.data;
|
|
782
|
+
const { subAgentId } = data.details;
|
|
783
|
+
setNodes((prevNodes) => {
|
|
784
|
+
setEdges((prevEdges) =>
|
|
785
|
+
prevEdges.map((edge) => {
|
|
786
|
+
const node = prevNodes.find((node) => node.id === edge.target);
|
|
787
|
+
const toolId = node?.data.toolId as string;
|
|
788
|
+
const toolData = toolLookup[toolId];
|
|
789
|
+
const hasTool = toolData?.availableTools?.some((tool) => tool.name === toolName);
|
|
790
|
+
|
|
791
|
+
return {
|
|
792
|
+
...edge,
|
|
793
|
+
data: {
|
|
794
|
+
...edge.data,
|
|
795
|
+
delegating: subAgentId === edge.source && hasTool ? 'inverted' : false,
|
|
796
|
+
},
|
|
797
|
+
};
|
|
798
|
+
})
|
|
799
|
+
);
|
|
800
|
+
return prevNodes.map((node) => {
|
|
801
|
+
const toolId = node.data.toolId as string;
|
|
802
|
+
const toolData = toolLookup[toolId];
|
|
803
|
+
return {
|
|
804
|
+
...node,
|
|
805
|
+
data: {
|
|
806
|
+
...node.data,
|
|
807
|
+
isDelegating: node.id === subAgentId,
|
|
808
|
+
isExecuting: toolData?.availableTools?.some((tool) => tool.name === toolName),
|
|
809
|
+
},
|
|
810
|
+
};
|
|
811
|
+
});
|
|
812
|
+
});
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
case 'completion': {
|
|
816
|
+
onCompletion();
|
|
817
|
+
break;
|
|
818
|
+
}
|
|
819
|
+
case 'agent_generate': {
|
|
820
|
+
const { subAgentId } = data.details;
|
|
821
|
+
setEdges((prevEdges) =>
|
|
822
|
+
prevEdges.map((node) => ({
|
|
823
|
+
...node,
|
|
824
|
+
data: { ...node.data, delegating: false },
|
|
825
|
+
}))
|
|
826
|
+
);
|
|
827
|
+
setNodes((prevNodes) =>
|
|
828
|
+
prevNodes.map((node) => ({
|
|
829
|
+
...node,
|
|
830
|
+
data: { ...node.data, isExecuting: node.id === subAgentId, isDelegating: false },
|
|
831
|
+
}))
|
|
832
|
+
);
|
|
833
|
+
break;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
};
|
|
837
|
+
|
|
838
|
+
const onCompletion = () => {
|
|
839
|
+
setEdges((prevEdges) =>
|
|
840
|
+
prevEdges.map((edge) => ({
|
|
841
|
+
...edge,
|
|
842
|
+
data: { ...edge.data, delegating: false },
|
|
843
|
+
}))
|
|
844
|
+
);
|
|
845
|
+
setNodes((prevNodes) =>
|
|
846
|
+
prevNodes.map((node) => ({
|
|
847
|
+
...node,
|
|
848
|
+
data: { ...node.data, isExecuting: false, isDelegating: false },
|
|
849
|
+
}))
|
|
850
|
+
);
|
|
851
|
+
};
|
|
852
|
+
|
|
853
|
+
document.addEventListener('ikp-data-operation', onDataOperation);
|
|
854
|
+
document.addEventListener('ikp-aborted', onCompletion);
|
|
855
|
+
return () => {
|
|
856
|
+
document.removeEventListener('ikp-data-operation', onDataOperation);
|
|
857
|
+
document.removeEventListener('ikp-aborted', onCompletion);
|
|
858
|
+
};
|
|
859
|
+
}, [setEdges, toolLookup, setNodes]);
|
|
860
|
+
|
|
696
861
|
return (
|
|
697
862
|
<div className="w-full h-full relative bg-muted/20 dark:bg-background flex rounded-b-[14px] overflow-hidden">
|
|
698
863
|
<div className={`flex-1 h-full relative transition-all duration-300 ease-in-out`}>
|
|
@@ -700,7 +865,9 @@ function Flow({
|
|
|
700
865
|
<SelectedMarker />
|
|
701
866
|
<ReactFlow
|
|
702
867
|
defaultEdgeOptions={{
|
|
703
|
-
|
|
868
|
+
// Built-in 'default' edges ignore the `data` prop.
|
|
869
|
+
// Use a custom edge type instead to access `data` in rendering.
|
|
870
|
+
type: 'custom',
|
|
704
871
|
}}
|
|
705
872
|
nodeTypes={nodeTypes}
|
|
706
873
|
edgeTypes={edgeTypes}
|
|
@@ -725,7 +892,11 @@ function Flow({
|
|
|
725
892
|
<Panel position="top-left">
|
|
726
893
|
<NodeLibrary />
|
|
727
894
|
</Panel>
|
|
728
|
-
<Panel
|
|
895
|
+
<Panel
|
|
896
|
+
position="top-right"
|
|
897
|
+
// width of NodeLibrary
|
|
898
|
+
className="left-52"
|
|
899
|
+
>
|
|
729
900
|
<Toolbar
|
|
730
901
|
onSubmit={onSubmit}
|
|
731
902
|
inPreviewDisabled={!agent?.id}
|
|
@@ -12,7 +12,9 @@ export enum A2AEdgeType {
|
|
|
12
12
|
export enum EdgeType {
|
|
13
13
|
A2A = 'a2a',
|
|
14
14
|
A2AExternal = 'a2a-external',
|
|
15
|
-
|
|
15
|
+
// Built-in 'default' edges ignore the `data` prop.
|
|
16
|
+
// Use a custom edge type instead to access `data` in rendering.
|
|
17
|
+
Default = 'custom',
|
|
16
18
|
SelfLoop = 'self-loop',
|
|
17
19
|
}
|
|
18
20
|
|
|
@@ -23,6 +25,10 @@ export type A2AEdgeData = {
|
|
|
23
25
|
delegateTargetToSource: boolean;
|
|
24
26
|
delegateSourceToTarget: boolean;
|
|
25
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Indicates whether this node delegates its task to another node.
|
|
30
|
+
*/
|
|
31
|
+
delegating: boolean | 'inverted';
|
|
26
32
|
};
|
|
27
33
|
|
|
28
34
|
export const edgeTypes = {
|
|
@@ -22,6 +22,8 @@ export interface MCPNodeData extends Record<string, unknown> {
|
|
|
22
22
|
name?: string;
|
|
23
23
|
imageUrl?: string;
|
|
24
24
|
provider?: string;
|
|
25
|
+
isExecuting?: boolean;
|
|
26
|
+
isDelegating?: boolean;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
// Re-export the shared type for consistency
|
|
@@ -36,6 +38,9 @@ export interface AgentNodeData extends Record<string, unknown> {
|
|
|
36
38
|
artifactComponents?: string[];
|
|
37
39
|
models?: AgentModels; // Use same structure as agent
|
|
38
40
|
stopWhen?: SubAgentStopWhen;
|
|
41
|
+
isDefault?: boolean;
|
|
42
|
+
isExecuting?: boolean;
|
|
43
|
+
isDelegating?: boolean;
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
export interface ExternalAgentNodeData extends Record<string, unknown> {
|
|
@@ -57,6 +62,8 @@ export interface FunctionToolNodeData extends Record<string, unknown> {
|
|
|
57
62
|
code?: string;
|
|
58
63
|
inputSchema?: Record<string, unknown>;
|
|
59
64
|
dependencies?: Record<string, unknown>;
|
|
65
|
+
isExecuting?: boolean;
|
|
66
|
+
isDelegating?: boolean;
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
export enum NodeType {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseEdge, EdgeLabelRenderer, type EdgeProps, getBezierPath } from '@xyflow/react';
|
|
2
2
|
import { ArrowRight, ArrowRightLeft } from 'lucide-react';
|
|
3
|
+
import { AnimatedCircle } from '@/components/agent/edges/default-edge';
|
|
3
4
|
import type { A2AEdgeData } from '../configuration/edge-types';
|
|
4
5
|
|
|
5
6
|
interface AgentToAgentEdgeProps extends EdgeProps {
|
|
@@ -22,6 +23,7 @@ export function AgentToAgentEdge({
|
|
|
22
23
|
delegateTargetToSource: false,
|
|
23
24
|
delegateSourceToTarget: false,
|
|
24
25
|
};
|
|
26
|
+
const delegating = data?.delegating;
|
|
25
27
|
|
|
26
28
|
const hasDelegate = relationships.delegateTargetToSource || relationships.delegateSourceToTarget;
|
|
27
29
|
const hasTransfer = relationships.transferTargetToSource || relationships.transferSourceToTarget;
|
|
@@ -86,16 +88,20 @@ export function AgentToAgentEdge({
|
|
|
86
88
|
const delegateMarkerEnd =
|
|
87
89
|
hasDelegate && relationships.delegateSourceToTarget ? getMarker(!!selected) : undefined;
|
|
88
90
|
|
|
91
|
+
const className =
|
|
92
|
+
selected || delegating ? '!stroke-primary' : '!stroke-border dark:!stroke-muted-foreground';
|
|
93
|
+
|
|
89
94
|
return (
|
|
90
95
|
<>
|
|
96
|
+
{/* Animated circles based on delegating direction */}
|
|
97
|
+
{delegating && <AnimatedCircle edgePath={edgePath} inverted={delegating === 'inverted'} />}
|
|
98
|
+
|
|
91
99
|
{/* Render transfer path (solid line) */}
|
|
92
100
|
{hasTransfer && (
|
|
93
101
|
<BaseEdge
|
|
94
|
-
className={
|
|
102
|
+
className={className}
|
|
95
103
|
path={hasDelegate ? calculateOffsetPath(-3)[0] : edgePath}
|
|
96
|
-
style={{
|
|
97
|
-
strokeWidth: 2,
|
|
98
|
-
}}
|
|
104
|
+
style={{ strokeWidth: 2 }}
|
|
99
105
|
markerEnd={transferMarkerEnd}
|
|
100
106
|
markerStart={transferMarkerStart}
|
|
101
107
|
/>
|
|
@@ -104,7 +110,7 @@ export function AgentToAgentEdge({
|
|
|
104
110
|
{/* Render delegate path (dashed line) */}
|
|
105
111
|
{hasDelegate && (
|
|
106
112
|
<BaseEdge
|
|
107
|
-
className={
|
|
113
|
+
className={className}
|
|
108
114
|
path={hasTransfer ? calculateOffsetPath(3)[0] : edgePath}
|
|
109
115
|
style={{
|
|
110
116
|
strokeDasharray: '5,5',
|
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
import { BaseEdge, type EdgeProps, getBezierPath } from '@xyflow/react';
|
|
2
|
+
import { type FC, useRef, useEffect } from 'react';
|
|
2
3
|
|
|
3
|
-
type DefaultEdgeProps = EdgeProps
|
|
4
|
+
type DefaultEdgeProps = EdgeProps & {
|
|
5
|
+
data?: {
|
|
6
|
+
delegating: boolean | 'inverted';
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const AnimatedCircle: FC<{ edgePath: string; inverted: boolean }> = ({
|
|
11
|
+
edgePath,
|
|
12
|
+
inverted,
|
|
13
|
+
}) => {
|
|
14
|
+
const ref = useRef<SVGAnimateElement>(null);
|
|
15
|
+
|
|
16
|
+
// Without this useEffect, the animation won't start when this component is rendered dynamically.
|
|
17
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: We need restart animation when invert is changed
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
ref.current?.beginElement();
|
|
20
|
+
}, [inverted]);
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<circle fill="var(--primary)" r="6">
|
|
24
|
+
<animateMotion
|
|
25
|
+
ref={ref}
|
|
26
|
+
dur="2s"
|
|
27
|
+
path={edgePath}
|
|
28
|
+
{...(inverted && {
|
|
29
|
+
pathLength: '1',
|
|
30
|
+
keyPoints: '1;0',
|
|
31
|
+
keyTimes: '0;1',
|
|
32
|
+
})}
|
|
33
|
+
/>
|
|
34
|
+
</circle>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
4
37
|
|
|
5
38
|
export function DefaultEdge({
|
|
6
39
|
id,
|
|
@@ -13,6 +46,7 @@ export function DefaultEdge({
|
|
|
13
46
|
label,
|
|
14
47
|
selected,
|
|
15
48
|
markerEnd,
|
|
49
|
+
data,
|
|
16
50
|
}: DefaultEdgeProps) {
|
|
17
51
|
const [edgePath] = getBezierPath({
|
|
18
52
|
sourceX,
|
|
@@ -23,16 +57,25 @@ export function DefaultEdge({
|
|
|
23
57
|
targetPosition,
|
|
24
58
|
});
|
|
25
59
|
|
|
60
|
+
const className =
|
|
61
|
+
selected || data?.delegating
|
|
62
|
+
? '!stroke-primary'
|
|
63
|
+
: '!stroke-border dark:!stroke-muted-foreground';
|
|
64
|
+
|
|
26
65
|
return (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
<>
|
|
67
|
+
{/* Animated circles based on delegating direction */}
|
|
68
|
+
{data?.delegating && (
|
|
69
|
+
<AnimatedCircle edgePath={edgePath} inverted={data.delegating === 'inverted'} />
|
|
70
|
+
)}
|
|
71
|
+
<BaseEdge
|
|
72
|
+
id={id}
|
|
73
|
+
path={edgePath}
|
|
74
|
+
label={label}
|
|
75
|
+
markerEnd={markerEnd}
|
|
76
|
+
style={{ strokeWidth: 2 }}
|
|
77
|
+
className={className}
|
|
78
|
+
/>
|
|
79
|
+
</>
|
|
37
80
|
);
|
|
38
81
|
}
|
|
@@ -23,7 +23,7 @@ export function NodeItem({ node }: NodeItemProps) {
|
|
|
23
23
|
role="button"
|
|
24
24
|
tabIndex={disabled ? -1 : 0}
|
|
25
25
|
aria-label={`Drag ${name} node`}
|
|
26
|
-
className="border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 flex font-medium items-center text-sm rounded-md p-2 justify-between gap-2 text-left h-auto w-full group group-hover:bg-muted/50 transition-all ease-in-out duration-200 cursor-grab active:cursor-grabbing"
|
|
26
|
+
className="backdrop-blur-3xl border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 flex font-medium items-center text-sm rounded-md p-2 justify-between gap-2 text-left h-auto w-full group group-hover:bg-muted/50 transition-all ease-in-out duration-200 cursor-grab active:cursor-grabbing"
|
|
27
27
|
draggable={!disabled}
|
|
28
28
|
onDragStart={(e) => onDragStart(e, node)}
|
|
29
29
|
>
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import { forwardRef, type HTMLAttributes } from 'react';
|
|
1
|
+
import { type FC, forwardRef, type HTMLAttributes } from 'react';
|
|
2
2
|
import { cn } from '@/lib/utils';
|
|
3
3
|
|
|
4
4
|
interface BaseNodeProps extends HTMLAttributes<HTMLDivElement> {
|
|
5
5
|
isSelected?: boolean;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export const BaseNode =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// tabIndex={0}
|
|
23
|
-
{...props}
|
|
24
|
-
/>
|
|
25
|
-
)
|
|
8
|
+
export const BaseNode: FC<BaseNodeProps> = ({ className, isSelected, ...props }) => (
|
|
9
|
+
<div
|
|
10
|
+
className={cn(
|
|
11
|
+
'relative rounded-lg border bg-card text-card-foreground',
|
|
12
|
+
// React Flow displays node elements inside of a `NodeWrapper` component,
|
|
13
|
+
// which compiles down to a div with a the class `react-flow__node`.
|
|
14
|
+
// When a node is selected, the class `selected` is added to the
|
|
15
|
+
// `react-flow__node` element. This allows us to style the node when it
|
|
16
|
+
isSelected ? 'ring-2 ring-primary' : 'hover:ring-2 hover:ring-gray-700/5',
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
// tabIndex={0}
|
|
20
|
+
{...props}
|
|
21
|
+
/>
|
|
26
22
|
);
|
|
27
|
-
BaseNode.displayName = 'BaseNode';
|
|
28
23
|
|
|
29
24
|
/**
|
|
30
25
|
* A container for a consistent header layout intended to be used inside the
|
|
@@ -9,10 +9,11 @@ import { ErrorIndicator } from '../error-display/error-indicator';
|
|
|
9
9
|
import { BaseNode, BaseNodeContent, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
|
|
10
10
|
import { Handle } from './handle';
|
|
11
11
|
import { NodeTab } from './node-tab';
|
|
12
|
+
import { cn } from '@/lib/utils';
|
|
12
13
|
|
|
13
14
|
export function ExternalAgentNode(props: NodeProps & { data: AgentNodeData }) {
|
|
14
15
|
const { data, selected, id } = props;
|
|
15
|
-
const { name, description } = data;
|
|
16
|
+
const { name, description, isExecuting } = data;
|
|
16
17
|
const { getNodeErrors, hasNodeErrors } = useAgentErrors();
|
|
17
18
|
|
|
18
19
|
// Use the agent ID from node data if available, otherwise fall back to React Flow node ID
|
|
@@ -22,10 +23,14 @@ export function ExternalAgentNode(props: NodeProps & { data: AgentNodeData }) {
|
|
|
22
23
|
|
|
23
24
|
return (
|
|
24
25
|
<div className="relative">
|
|
25
|
-
<NodeTab
|
|
26
|
+
<NodeTab isSelected={selected}>External</NodeTab>
|
|
26
27
|
<BaseNode
|
|
27
|
-
isSelected={selected}
|
|
28
|
-
className={
|
|
28
|
+
isSelected={selected || data.isDelegating}
|
|
29
|
+
className={cn(
|
|
30
|
+
'rounded-tl-none',
|
|
31
|
+
hasErrors && 'ring-2 ring-red-300 border-red-300',
|
|
32
|
+
isExecuting && 'node-executing'
|
|
33
|
+
)}
|
|
29
34
|
style={{ width: NODE_WIDTH }}
|
|
30
35
|
>
|
|
31
36
|
<BaseNodeHeader className="flex items-center justify-between gap-2">
|
|
@@ -5,6 +5,7 @@ import { type FunctionToolNodeData, functionToolNodeHandleId } from '../configur
|
|
|
5
5
|
import { ErrorIndicator } from '../error-display/error-indicator';
|
|
6
6
|
import { BaseNode, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
|
|
7
7
|
import { Handle } from './handle';
|
|
8
|
+
import { cn } from '@/lib/utils';
|
|
8
9
|
|
|
9
10
|
export function FunctionToolNode(props: NodeProps & { data: FunctionToolNodeData }) {
|
|
10
11
|
const { data, selected, id } = props;
|
|
@@ -21,8 +22,12 @@ export function FunctionToolNode(props: NodeProps & { data: FunctionToolNodeData
|
|
|
21
22
|
return (
|
|
22
23
|
<div className="relative">
|
|
23
24
|
<BaseNode
|
|
24
|
-
isSelected={selected}
|
|
25
|
-
className={
|
|
25
|
+
isSelected={selected || data.isDelegating}
|
|
26
|
+
className={cn(
|
|
27
|
+
'rounded-4xl min-w-40 max-w-xs',
|
|
28
|
+
hasErrors && 'ring-2 ring-red-300 border-red-300',
|
|
29
|
+
data.isExecuting && 'node-executing'
|
|
30
|
+
)}
|
|
26
31
|
>
|
|
27
32
|
<BaseNodeHeader className="mb-0 py-3">
|
|
28
33
|
<div className="flex flex-col gap-1.5">
|
|
@@ -5,8 +5,9 @@ import { Badge } from '@/components/ui/badge';
|
|
|
5
5
|
import { useAgentStore } from '@/features/agent/state/use-agent-store';
|
|
6
6
|
import { getCurrentSelectedToolsForNode } from '@/lib/utils/orphaned-tools-detector';
|
|
7
7
|
import { type MCPNodeData, mcpNodeHandleId } from '../configuration/node-types';
|
|
8
|
-
import { BaseNode, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
|
|
8
|
+
import { BaseNode, BaseNodeContent, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
|
|
9
9
|
import { Handle } from './handle';
|
|
10
|
+
import { cn } from '@/lib/utils';
|
|
10
11
|
|
|
11
12
|
const TOOLS_SHOWN_LIMIT = 4;
|
|
12
13
|
|
|
@@ -78,32 +79,34 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
|
|
|
78
79
|
const toolBadges = getToolDisplay();
|
|
79
80
|
|
|
80
81
|
return (
|
|
81
|
-
<BaseNode
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
key={index}
|
|
98
|
-
variant="code"
|
|
99
|
-
className="px-2 text-2xs text-gray-700 dark:text-gray-300 flex-shrink-0"
|
|
100
|
-
>
|
|
101
|
-
{label}
|
|
102
|
-
</Badge>
|
|
103
|
-
))}
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
82
|
+
<BaseNode
|
|
83
|
+
isSelected={selected || data.isDelegating}
|
|
84
|
+
className={cn(
|
|
85
|
+
'rounded-4xl min-w-40 min-h-13 max-w-3xs',
|
|
86
|
+
data.isExecuting && 'node-executing'
|
|
87
|
+
)}
|
|
88
|
+
>
|
|
89
|
+
<BaseNodeHeader className="flex items-center justify-between gap-2">
|
|
90
|
+
<MCPToolImage
|
|
91
|
+
imageUrl={imageUrl}
|
|
92
|
+
name={name}
|
|
93
|
+
provider={provider || undefined}
|
|
94
|
+
size={24}
|
|
95
|
+
className="flex-shrink-0"
|
|
96
|
+
/>
|
|
97
|
+
<BaseNodeHeaderTitle>{name}</BaseNodeHeaderTitle>
|
|
106
98
|
</BaseNodeHeader>
|
|
99
|
+
<BaseNodeContent>
|
|
100
|
+
{toolBadges.map((label, index) => (
|
|
101
|
+
<Badge
|
|
102
|
+
key={index}
|
|
103
|
+
variant="code"
|
|
104
|
+
className="px-2 text-2xs text-gray-700 dark:text-gray-300 flex-shrink-0"
|
|
105
|
+
>
|
|
106
|
+
{label}
|
|
107
|
+
</Badge>
|
|
108
|
+
))}
|
|
109
|
+
</BaseNodeContent>
|
|
107
110
|
<Handle id={mcpNodeHandleId} type="target" position={Position.Top} isConnectable />
|
|
108
111
|
</BaseNode>
|
|
109
112
|
);
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import type { FC, ReactNode } from 'react';
|
|
1
2
|
import { cn } from '@/lib/utils';
|
|
2
3
|
|
|
3
4
|
interface NodeTabProps {
|
|
4
|
-
|
|
5
|
-
children:
|
|
5
|
+
isSelected?: boolean;
|
|
6
|
+
children: ReactNode;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
export
|
|
9
|
+
export const NodeTab: FC<NodeTabProps> = ({ isSelected, children }) => {
|
|
9
10
|
return (
|
|
10
11
|
<div
|
|
11
12
|
className={cn(
|
|
12
|
-
'
|
|
13
|
-
|
|
13
|
+
'px-2 py-0.5 rounded-t-md flex items-center gap-2 w-fit border border-b-0 font-medium font-mono text-xs uppercase',
|
|
14
|
+
isSelected
|
|
14
15
|
? 'bg-primary border-primary text-white ring-2 ring-primary'
|
|
15
16
|
: 'bg-muted text-muted-foreground border-border'
|
|
16
17
|
)}
|
|
@@ -18,4 +19,4 @@ export function NodeTab({ selected, children }: NodeTabProps) {
|
|
|
18
19
|
{children}
|
|
19
20
|
</div>
|
|
20
21
|
);
|
|
21
|
-
}
|
|
22
|
+
};
|