@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.
Files changed (173) hide show
  1. package/.next/standalone/agents-manage-ui/.next/BUILD_ID +1 -1
  2. package/.next/standalone/agents-manage-ui/.next/app-build-manifest.json +42 -42
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js +2 -2
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js.nft.json +1 -1
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js +2 -2
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js.nft.json +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js +2 -2
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js.nft.json +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +2 -2
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js.nft.json +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +1 -1
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +2 -2
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +2 -2
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  74. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  77. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-preview/route.js +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-preview/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  82. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +1 -1
  84. package/.next/standalone/agents-manage-ui/.next/server/chunks/1524.js +1 -0
  85. package/.next/standalone/agents-manage-ui/.next/server/chunks/2584.js +14 -0
  86. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  87. package/.next/standalone/agents-manage-ui/.next/server/chunks/526.js +1 -0
  88. package/.next/standalone/agents-manage-ui/.next/server/chunks/5478.js +4080 -0
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/5732.js +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/{2557.js → 7733.js} +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/7848.js +1 -1
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/7988.js +2 -2
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/8038.js +196 -0
  94. package/.next/standalone/agents-manage-ui/.next/server/middleware-manifest.json +5 -5
  95. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  96. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/static/chunks/20837-f8b0d86a8303f4c3.js +1 -0
  100. package/.next/standalone/agents-manage-ui/.next/static/chunks/24994-975eb584d5b2438a.js +1 -0
  101. package/.next/standalone/agents-manage-ui/.next/static/chunks/47259-95ea98b229d39774.js +1 -0
  102. package/.next/standalone/agents-manage-ui/.next/static/chunks/48949-692c5f8265558813.js +1 -0
  103. package/.next/standalone/agents-manage-ui/.next/static/chunks/74206-85aa3065dce9dc8a.js +1 -0
  104. package/.next/standalone/agents-manage-ui/.next/static/chunks/76125-82ebb14b304cfe0b.js +25 -0
  105. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/page-fdbebdb8c3371c73.js +1 -0
  106. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-bc76e9554c5d2341.js +1 -0
  107. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/page-4c5fb257a6233694.js +1 -0
  108. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-5158b01426eb0f32.js +1 -0
  109. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/{page-c66ccba640d47f0f.js → page-75c72891b2f2923c.js} +1 -1
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-4cae1de757715499.js +1 -0
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{page-c9f433a59ec91812.js → page-528fffe4fc232ff4.js} +1 -1
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/{page-b3c543ab1c4bd6b4.js → page-2551beb91f3aa6e6.js} +1 -1
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/{page-7f0e3b8c1e661827.js → page-05a78b9d37131b1a.js} +1 -1
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-d238c502f632f4e0.js +1 -0
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/{page-52ae0fa0a16c7979.js → page-3655f333086c211d.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-20579bf7a4fb87d3.js +1 -0
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-f109a80577d83568.js +1 -0
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-9eafe11017316482.js +1 -0
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-5b25bf3f3967c268.js +1 -0
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-0abb5f43d02da2b4.js → page-d970759f74621cfe.js} +1 -1
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-57be5eb54ad97e11.js +1 -0
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-156d1009662ee964.js → page-11cfe0365b56c6b2.js} +1 -1
  123. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-bb2b8d64b23cf563.js +1 -0
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-cf6f4f3394d4813d.js +1 -0
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/{layout-b8d6461cf022b06c.js → layout-d83e519e9bcc6269.js} +1 -1
  126. package/.next/standalone/agents-manage-ui/.next/static/css/86b7c14b860f21e3.css +1 -0
  127. package/.next/standalone/agents-manage-ui/package.json +2 -2
  128. package/.next/standalone/packages/agents-core/package.json +1 -1
  129. package/package.json +5 -5
  130. package/src/app/api/data-components/[dataComponentId]/generate-preview/route.ts +17 -2
  131. package/src/app/globals.css +21 -0
  132. package/src/components/agent/agent.tsx +173 -2
  133. package/src/components/agent/configuration/edge-types.tsx +7 -1
  134. package/src/components/agent/configuration/node-types.tsx +7 -0
  135. package/src/components/agent/edges/agent-to-agent-edge.tsx +11 -5
  136. package/src/components/agent/edges/default-edge.tsx +54 -11
  137. package/src/components/agent/node-library/node-item.tsx +1 -1
  138. package/src/components/agent/nodes/base-node.tsx +15 -20
  139. package/src/components/agent/nodes/external-agent-node.tsx +9 -4
  140. package/src/components/agent/nodes/function-tool-node.tsx +7 -2
  141. package/src/components/agent/nodes/mcp-node.tsx +29 -26
  142. package/src/components/agent/nodes/node-tab.tsx +7 -6
  143. package/src/components/agent/nodes/sub-agent-node.tsx +8 -3
  144. package/src/components/agent/toolbar/toolbar.tsx +18 -7
  145. package/src/features/agent/domain/serialize.ts +2 -2
  146. package/src/lib/actions/data-components.ts +2 -1
  147. package/.next/standalone/agents-manage-ui/.next/server/chunks/2215.js +0 -1
  148. package/.next/standalone/agents-manage-ui/.next/server/chunks/4883.js +0 -1
  149. package/.next/standalone/agents-manage-ui/.next/server/chunks/5112.js +0 -196
  150. package/.next/standalone/agents-manage-ui/.next/server/chunks/5416.js +0 -14
  151. package/.next/standalone/agents-manage-ui/.next/server/chunks/7283.js +0 -4080
  152. package/.next/standalone/agents-manage-ui/.next/static/chunks/13578-0ecceb958c0ce63f.js +0 -1
  153. package/.next/standalone/agents-manage-ui/.next/static/chunks/20837-4b00b831f3de1892.js +0 -1
  154. package/.next/standalone/agents-manage-ui/.next/static/chunks/27208-36636f32d254d800.js +0 -1
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/56461-61f28c6fa4039d33.js +0 -1
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/61330-f978ea4653e10ca7.js +0 -1
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/85014-410be6cfd6c0b753.js +0 -25
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/page-cc373d319cdfb74f.js +0 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-2ceba25d996bf510.js +0 -1
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/page-f473cdc852dcea1b.js +0 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-08978f8575693f81.js +0 -1
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-0e7fd82b8c436b6f.js +0 -1
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-9193e456fc869fb3.js +0 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-bf5914023071d49d.js +0 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-3d78f1d4b32c2ef0.js +0 -1
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-be427c6132d3dd87.js +0 -1
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-6a61a970c0545164.js +0 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-6e316e6b84440446.js +0 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-0cc06bd02445112e.js +0 -1
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-1404ec909a47ed0c.js +0 -1
  171. package/.next/standalone/agents-manage-ui/.next/static/css/5dfa86d258326297.css +0 -1
  172. /package/.next/standalone/agents-manage-ui/.next/static/{2ceZLQWaXoj5yCGjkjRcx → TwV2TGtXdOiFkslre7D-k}/_buildManifest.js +0 -0
  173. /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 baseUrl = process.env.NEXT_PUBLIC_AGENTS_MANAGE_API_URL || 'http://localhost:3002';
20
- const url = `${baseUrl}/tenants/${tenantId}/projects/${projectId}/data-components/${dataComponentId}/generate-preview`;
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
 
@@ -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
- type: 'default',
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 position="top-right">
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
- Default = 'default',
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={`${selected ? '!stroke-primary' : '!stroke-border dark:!stroke-muted-foreground'}`}
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={`${selected ? '!stroke-primary' : '!stroke-border dark:!stroke-muted-foreground'}`}
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
- <BaseEdge
28
- id={id}
29
- path={edgePath}
30
- label={label}
31
- markerEnd={markerEnd}
32
- style={{
33
- strokeWidth: 2,
34
- }}
35
- className={`${selected ? '!stroke-primary' : '!stroke-border dark:!stroke-muted-foreground'}`}
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 = forwardRef<HTMLDivElement, BaseNodeProps>(
9
- ({ className, isSelected, ...props }, ref) => (
10
- <div
11
- ref={ref}
12
- className={cn(
13
- 'relative rounded-lg border bg-card text-card-foreground',
14
- 'hover:ring-2 hover:ring-gray-700/5',
15
- // React Flow displays node elements inside of a `NodeWrapper` component,
16
- // which compiles down to a div with a the class `react-flow__node`.
17
- // When a node is selected, the class `selected` is added to the
18
- // `react-flow__node` element. This allows us to style the node when it
19
- isSelected && 'ring-2 ring-primary hover:ring-primary',
20
- className
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 selected={selected}>External</NodeTab>
26
+ <NodeTab isSelected={selected}>External</NodeTab>
26
27
  <BaseNode
27
- isSelected={selected}
28
- className={`rounded-tl-none ${hasErrors ? 'ring-2 ring-red-300 border-red-300' : ''}`}
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={`rounded-4xl min-w-40 max-w-xs ${hasErrors ? 'ring-2 ring-red-300 border-red-300' : ''}`}
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 isSelected={selected} className="rounded-4xl min-w-40 min-h-13 max-w-3xs">
82
- <BaseNodeHeader className="mb-0 py-3">
83
- <div className="flex items-center flex-wrap gap-1">
84
- <div className="flex items-center gap-2 flex-shrink-0 mr-4">
85
- <MCPToolImage
86
- imageUrl={imageUrl}
87
- name={name}
88
- provider={provider || undefined}
89
- size={24}
90
- className="mt-[1px] flex-shrink-0"
91
- />
92
- <BaseNodeHeaderTitle className="flex-shrink-0">{name}</BaseNodeHeaderTitle>
93
- </div>
94
- <div className="flex items-center flex-wrap gap-1">
95
- {toolBadges.map((label, index) => (
96
- <Badge
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
- selected: boolean;
5
- children: React.ReactNode;
5
+ isSelected?: boolean;
6
+ children: ReactNode;
6
7
  }
7
8
 
8
- export function NodeTab({ selected, children }: NodeTabProps) {
9
+ export const NodeTab: FC<NodeTabProps> = ({ isSelected, children }) => {
9
10
  return (
10
11
  <div
11
12
  className={cn(
12
- ' 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',
13
- selected
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
+ };