@inkeep/agents-manage-ui 0.6.6 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) 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 +68 -68
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +2 -2
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +15 -15
  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]/api-keys/page.js +3 -3
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js +2 -2
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js.nft.json +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js +2 -2
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js.nft.json +1 -1
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page.js +2 -2
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js +1 -1
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js.nft.json +1 -1
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js +2 -2
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js.nft.json +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page.js +2 -2
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +2 -2
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js.nft.json +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +3 -3
  75. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  77. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  80. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  83. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  84. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +2 -2
  85. package/.next/standalone/agents-manage-ui/.next/server/chunks/2124.js +13 -13
  86. package/.next/standalone/agents-manage-ui/.next/server/chunks/2184.js +1 -0
  87. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  88. package/.next/standalone/agents-manage-ui/.next/server/chunks/3645.js +1 -0
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/{3793.js → 4370.js} +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/6726.js +1 -0
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7067.js → 6992.js} +1 -1
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/8389.js +1 -0
  94. package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
  95. package/.next/standalone/agents-manage-ui/.next/server/chunks/{4108.js → 9772.js} +11 -11
  96. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  100. package/.next/standalone/agents-manage-ui/.next/static/chunks/{7232-63c17ffc2737968a.js → 1016-065c7c4004850849.js} +13 -13
  101. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-b90b21b559925fc6.js +1 -0
  102. package/.next/standalone/agents-manage-ui/.next/static/chunks/6705-978d47db41063bdb.js +1 -0
  103. package/.next/standalone/agents-manage-ui/.next/static/chunks/6709-d1f3493d1e80cb0e.js +1 -0
  104. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-8d05e2e8db9def49.js +1 -0
  105. package/.next/standalone/agents-manage-ui/.next/static/chunks/{4931-1291b39db1c5dedf.js → 8675-4c7d3c3828d84535.js} +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-79109cbb97bd2fe5.js +1 -0
  107. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/{page-ac2f8091f8a53342.js → page-c0ed5ffd69a57af5.js} +1 -1
  108. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/{page-ac2f8091f8a53342.js → page-c0ed5ffd69a57af5.js} +1 -1
  109. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/{page-e3e9163c148c1239.js → page-40d1360e37d37109.js} +1 -1
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-7d5dcfc0e775458a.js +1 -0
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-ad3217b28b09b5a5.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-0ef881f4f392086a.js +1 -0
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-876f0c019187591d.js → page-e7239c0637ac7efa.js} +1 -1
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page-736bec9f0541e08f.js +1 -0
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/page-736bec9f0541e08f.js +1 -0
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/{page-e289128665acffb1.js → page-21d8913c3297829c.js} +1 -1
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-b574c5e1d3df7e73.js → page-83f03615dc11014b.js} +1 -1
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-95c13c0305dfddfb.js → page-da8ddb54272917ab.js} +1 -1
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e89edd98413b78a4.js → page-8ace8753502148be.js} +1 -1
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-6ffb17fc6301b481.js → page-02feacd52d06239a.js} +1 -1
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-aa753859a6cd98f8.js +1 -0
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-539caba402ab546f.js → page-a393f3437852e5f9.js} +1 -1
  123. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-5c0b6a43b3000e09.js +1 -0
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-8731d2271ec07d33.js → page-8be4791ce624489e.js} +1 -1
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-555f353076460fa9.js +1 -0
  126. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-544544e7fd94b1de.js +1 -0
  127. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-48d40ad8a53bfc9b.js +1 -0
  128. package/.next/standalone/agents-manage-ui/.next/static/css/98c416ff19152db0.css +1 -0
  129. package/.next/standalone/agents-manage-ui/package.json +2 -2
  130. package/.next/standalone/packages/agents-core/package.json +1 -1
  131. package/package.json +5 -5
  132. package/src/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.tsx +12 -12
  133. package/src/components/credentials/credential-tools-list.tsx +0 -25
  134. package/src/components/graph/configuration/node-types.tsx +6 -2
  135. package/src/components/graph/graph.tsx +66 -8
  136. package/src/components/graph/nodes/mcp-node.tsx +6 -11
  137. package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +69 -68
  138. package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +44 -44
  139. package/src/components/graph/sidepane/sidepane.tsx +5 -0
  140. package/src/components/mcp-servers/form/mcp-server-form.tsx +47 -46
  141. package/src/components/mcp-servers/mcp-tool-item.tsx +3 -0
  142. package/src/components/mcp-servers/view-mcp-server-details.tsx +76 -37
  143. package/src/components/ui/copyable-multi-line-code.tsx +17 -0
  144. package/src/features/graph/domain/__tests__/serialize.test.ts +21 -51
  145. package/src/features/graph/domain/deserialize.ts +5 -26
  146. package/src/features/graph/domain/serialize.ts +56 -52
  147. package/src/lib/api/tools.ts +2 -92
  148. package/src/lib/utils/orphaned-tools-detector.ts +145 -0
  149. package/.next/standalone/agents-manage-ui/.next/server/chunks/241.js +0 -1
  150. package/.next/standalone/agents-manage-ui/.next/server/chunks/3995.js +0 -1
  151. package/.next/standalone/agents-manage-ui/.next/server/chunks/6300.js +0 -1
  152. package/.next/standalone/agents-manage-ui/.next/server/chunks/6838.js +0 -1
  153. package/.next/standalone/agents-manage-ui/.next/server/chunks/9435.js +0 -1
  154. package/.next/standalone/agents-manage-ui/.next/static/chunks/1984-b89ef6de05884930.js +0 -1
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-1503999d28bd793b.js +0 -1
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-0892927ad1317753.js +0 -1
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/9202-65ce376d47468b8c.js +0 -1
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-b12544e5422bb5f5.js +0 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-188cdc82aa6e4bc3.js +0 -1
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-a45222825f0acc29.js +0 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-1952e6ae0b259e5e.js +0 -1
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page-b945a6e458056f00.js +0 -1
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/page-b945a6e458056f00.js +0 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-190351c7f4b5d2f8.js +0 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-f819dadc0a6d3e17.js +0 -1
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-d48cbe5a8a533023.js +0 -1
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-39ca81e212d9fe4a.js +0 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-46ffc47ebd7010d6.js +0 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/css/70e9093ef73fbe1b.css +0 -1
  170. /package/.next/standalone/agents-manage-ui/.next/static/{rTyWV-dnM3YFFcXfKZYFu → vo7pWHFkBgZcQOQOKotiJ}/_buildManifest.js +0 -0
  171. /package/.next/standalone/agents-manage-ui/.next/static/{rTyWV-dnM3YFFcXfKZYFu → vo7pWHFkBgZcQOQOKotiJ}/_ssgManifest.js +0 -0
@@ -32,6 +32,8 @@ import type { FullGraphDefinition } from '@/lib/types/graph-full';
32
32
  import type { MCPTool } from '@/lib/types/tools';
33
33
  import { formatJsonField } from '@/lib/utils';
34
34
  import { getErrorSummaryMessage, parseGraphValidationErrors } from '@/lib/utils/graph-error-parser';
35
+ import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
36
+ import { detectOrphanedToolsAndGetWarning } from '@/lib/utils/orphaned-tools-detector';
35
37
  import { EdgeType, edgeTypes, initialEdges } from './configuration/edge-types';
36
38
  import type { ContextConfig } from './configuration/graph-types';
37
39
  import {
@@ -95,20 +97,59 @@ function Flow({
95
97
  []
96
98
  );
97
99
 
100
+ // Helper to enrich MCP nodes with tool data
101
+ const enrichNodes = useCallback(
102
+ (nodes: Node[]): Node[] => {
103
+ return nodes.map((node) => {
104
+ if (node.type === NodeType.MCP && node.data && 'toolId' in node.data) {
105
+ const tool = toolLookup[node.data.toolId as string];
106
+ if (tool) {
107
+ let provider = null;
108
+ provider = getToolTypeAndName(tool).type;
109
+
110
+ return {
111
+ ...node,
112
+ data: {
113
+ ...node.data,
114
+ name: tool.name,
115
+ imageUrl: tool.imageUrl,
116
+ provider,
117
+ },
118
+ };
119
+ }
120
+ }
121
+ return node;
122
+ });
123
+ },
124
+ [toolLookup]
125
+ );
126
+
98
127
  const { nodes: graphNodes, edges: graphEdges } = useMemo(() => {
99
- return graph
100
- ? deserializeGraphData(graph, toolLookup)
128
+ const result = graph
129
+ ? deserializeGraphData(graph)
101
130
  : { nodes: initialNodes, edges: initialEdges };
102
- }, [graph, toolLookup, initialNodes]);
131
+ return {
132
+ ...result,
133
+ nodes: enrichNodes(result.nodes),
134
+ };
135
+ }, [graph, enrichNodes, initialNodes]);
103
136
 
104
137
  // Create selectedTools lookup from graph data
105
138
  const selectedToolsLookup = useMemo((): Record<string, Record<string, string[]>> => {
106
139
  if (!graph?.agents) return {} as Record<string, Record<string, string[]>>;
107
140
 
108
141
  const lookup: Record<string, Record<string, string[]>> = {};
109
- Object.entries(graph.agents).forEach(([agentId, agent]) => {
110
- if ('selectedTools' in agent && agent.selectedTools) {
111
- lookup[agentId] = agent.selectedTools as Record<string, string[]>;
142
+ Object.entries(graph.agents).forEach(([agentId, agentData]) => {
143
+ if ('canUse' in agentData && agentData.canUse) {
144
+ const toolsMap: Record<string, string[]> = {};
145
+ agentData.canUse.forEach((tool) => {
146
+ if (tool.toolSelection) {
147
+ toolsMap[tool.toolId] = tool.toolSelection;
148
+ }
149
+ });
150
+ if (Object.keys(toolsMap).length > 0) {
151
+ lookup[agentId] = toolsMap;
152
+ }
112
153
  }
113
154
  });
114
155
  return lookup;
@@ -116,7 +157,7 @@ function Flow({
116
157
 
117
158
  const { screenToFlowPosition } = useReactFlow();
118
159
  const {
119
- nodes,
160
+ nodes: storeNodes,
120
161
  edges,
121
162
  setNodes,
122
163
  setEdges,
@@ -129,6 +170,9 @@ function Flow({
129
170
  clearSelection,
130
171
  markUnsaved,
131
172
  } = useGraphStore();
173
+
174
+ // Always use enriched nodes for ReactFlow
175
+ const nodes = useMemo(() => enrichNodes(storeNodes), [storeNodes, enrichNodes]);
132
176
  const { nodeId, edgeId, setQueryState, openGraphPane, isOpen } = useSidePane();
133
177
  const { errors, showErrors, setErrors, clearErrors, setShowErrors } = useGraphErrors();
134
178
 
@@ -444,12 +488,23 @@ function Flow({
444
488
  );
445
489
 
446
490
  const onSubmit = useCallback(async () => {
491
+ // Check for orphaned tools before saving
492
+ const warningMessage = detectOrphanedToolsAndGetWarning(nodes, selectedToolsLookup, toolLookup);
493
+
494
+ if (warningMessage) {
495
+ toast.warning(warningMessage, {
496
+ closeButton: true,
497
+ duration: 6000,
498
+ });
499
+ }
500
+
447
501
  const serializedData = serializeGraphData(
448
502
  nodes,
449
503
  edges,
450
504
  metadata,
451
505
  dataComponentLookup,
452
- artifactComponentLookup
506
+ artifactComponentLookup,
507
+ selectedToolsLookup
453
508
  );
454
509
 
455
510
  const res = await saveGraph(
@@ -499,6 +554,8 @@ function Flow({
499
554
  projectId,
500
555
  clearErrors,
501
556
  setErrors,
557
+ selectedToolsLookup,
558
+ toolLookup,
502
559
  ]);
503
560
 
504
561
  return (
@@ -565,6 +622,7 @@ function Flow({
565
622
  dataComponentLookup={dataComponentLookup}
566
623
  artifactComponentLookup={artifactComponentLookup}
567
624
  selectedToolsLookup={selectedToolsLookup}
625
+ toolLookup={toolLookup}
568
626
  />
569
627
  {showPlayground && graph?.id && (
570
628
  <Playground
@@ -1,21 +1,16 @@
1
1
  import { type NodeProps, Position } from '@xyflow/react';
2
2
  import { MCPToolImage } from '@/components/mcp-servers/mcp-tool-image';
3
- import type { MCPTool } from '@/lib/types/tools';
4
3
 
5
- import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
6
- import { mcpNodeHandleId } from '../configuration/node-types';
4
+ import { type MCPNodeData, mcpNodeHandleId } from '../configuration/node-types';
7
5
  import { BaseNode, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
8
6
  import { Handle } from './handle';
9
7
 
10
- export function MCPNode(props: NodeProps & { data: MCPTool }) {
8
+ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
11
9
  const { data, selected } = props;
12
- const { name, imageUrl } = data;
13
- let provider = null;
14
- try {
15
- provider = getToolTypeAndName(data).type;
16
- } catch (error) {
17
- console.error(error);
18
- }
10
+
11
+ const name = data.name || `Tool: ${data.toolId}`;
12
+ const imageUrl = data.imageUrl;
13
+ const provider = data.provider;
19
14
 
20
15
  return (
21
16
  <BaseNode
@@ -1,5 +1,5 @@
1
1
  import { type Node, useReactFlow } from '@xyflow/react';
2
- import { Check } from 'lucide-react';
2
+ import { Check, CircleAlert } from 'lucide-react';
3
3
  import { useParams } from 'next/navigation';
4
4
  import { getActiveTools } from '@/app/utils/active-tools';
5
5
  import { MCPToolImage } from '@/components/mcp-servers/mcp-tool-image';
@@ -9,17 +9,21 @@ import { Input } from '@/components/ui/input';
9
9
  import { Label } from '@/components/ui/label';
10
10
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
11
11
  import { useGraphStore } from '@/features/graph/state/use-graph-store';
12
+ import type { MCPTool } from '@/lib/types/tools';
12
13
  import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
14
+ import { getCurrentSelectedToolsForNode } from '@/lib/utils/orphaned-tools-detector';
13
15
  import type { MCPNodeData } from '../../configuration/node-types';
14
16
 
15
17
  interface MCPServerNodeEditorProps {
16
18
  selectedNode: Node<MCPNodeData>;
17
19
  selectedToolsLookup: Record<string, Record<string, string[]>>;
20
+ toolLookup: Record<string, MCPTool>;
18
21
  }
19
22
 
20
23
  export function MCPServerNodeEditor({
21
24
  selectedNode,
22
25
  selectedToolsLookup,
26
+ toolLookup,
23
27
  }: MCPServerNodeEditorProps) {
24
28
  const { updateNodeData } = useReactFlow();
25
29
  const { tenantId, projectId } = useParams<{
@@ -27,63 +31,37 @@ export function MCPServerNodeEditor({
27
31
  projectId: string;
28
32
  }>();
29
33
 
30
- const activeTools = getActiveTools({
31
- availableTools: selectedNode.data.availableTools,
32
- activeTools: selectedNode.data.config?.mcp?.activeTools,
33
- });
34
-
34
+ // All hooks must be called before any early returns
35
35
  const markUnsaved = useGraphStore((state) => state.markUnsaved);
36
36
 
37
- const getCurrentSelectedTools = (): string[] | null => {
38
- // First check if we have temporary selections stored on the node (from recent clicks)
39
- if ((selectedNode.data as any).tempSelectedTools !== undefined) {
40
- return (selectedNode.data as any).tempSelectedTools;
41
- }
42
-
43
- // Otherwise, get from the database/initial state
44
- const allSelectedTools = new Set<string>();
45
- let hasAnyData = false;
46
- let hasEmptyArray = false;
47
- let hasNullValue = false;
48
-
49
- Object.values(selectedToolsLookup).forEach((agentTools) => {
50
- const toolsForThisMCP = agentTools[selectedNode.data.id];
51
- if (toolsForThisMCP !== undefined) {
52
- hasAnyData = true;
53
- if (Array.isArray(toolsForThisMCP) && toolsForThisMCP.length === 0) {
54
- // Empty array = NONE selected
55
- hasEmptyArray = true;
56
- } else if (toolsForThisMCP === null) {
57
- // null = ALL selected
58
- hasNullValue = true;
59
- } else if (Array.isArray(toolsForThisMCP)) {
60
- // Specific tools selected
61
- toolsForThisMCP.forEach((tool) => {
62
- allSelectedTools.add(tool);
63
- });
64
- }
65
- }
66
- });
37
+ // Only use toolLookup - single source of truth
38
+ const toolData = toolLookup[selectedNode.data.toolId];
67
39
 
68
- // If we found a null value, return null (all selected)
69
- if (hasNullValue) {
70
- return null;
71
- }
40
+ const availableTools = toolData?.availableTools;
72
41
 
73
- // If we found an empty array, return empty array
74
- if (hasEmptyArray) {
75
- return [];
76
- }
42
+ const activeTools = getActiveTools({
43
+ availableTools: availableTools,
44
+ activeTools: toolData?.config?.mcp?.activeTools,
45
+ });
77
46
 
78
- // If no data exists (undefined), default to ALL selected (null)
79
- if (!hasAnyData) {
80
- return null;
81
- }
47
+ // Handle missing tool data
48
+ if (!toolData) {
49
+ return (
50
+ <div className="flex items-center justify-center p-4">
51
+ <div className="text-sm text-muted-foreground">
52
+ Tool data not found for {selectedNode.data.toolId}
53
+ </div>
54
+ </div>
55
+ );
56
+ }
82
57
 
83
- return Array.from(allSelectedTools);
84
- };
58
+ const selectedTools = getCurrentSelectedToolsForNode(selectedNode, selectedToolsLookup);
85
59
 
86
- const selectedTools = getCurrentSelectedTools();
60
+ // Find orphaned tools - tools that are selected but no longer available in activeTools
61
+ const orphanedTools =
62
+ selectedTools && Array.isArray(selectedTools)
63
+ ? selectedTools.filter((toolName) => !activeTools?.some((tool) => tool.name === toolName))
64
+ : [];
87
65
 
88
66
  const toggleToolSelection = (toolName: string) => {
89
67
  // Handle null case (all tools selected) - convert to array of all tool names
@@ -128,35 +106,35 @@ export function MCPServerNodeEditor({
128
106
 
129
107
  let provider = null;
130
108
  try {
131
- provider = getToolTypeAndName(selectedNode.data).type;
109
+ provider = toolData ? getToolTypeAndName(toolData).type : null;
132
110
  } catch (error) {
133
111
  console.error(error);
134
112
  }
135
113
 
136
114
  return (
137
115
  <div className="space-y-8">
138
- {selectedNode.data.imageUrl && (
116
+ {toolData?.imageUrl && (
139
117
  <div className="flex items-center gap-2">
140
118
  <MCPToolImage
141
- imageUrl={selectedNode.data.imageUrl}
142
- name={selectedNode.data.name}
119
+ imageUrl={toolData.imageUrl}
120
+ name={toolData.name}
143
121
  provider={provider || undefined}
144
122
  size={32}
145
123
  className="rounded-lg"
146
124
  />
147
- <span className="font-medium text-sm truncate">{selectedNode.data.name}</span>
125
+ <span className="font-medium text-sm truncate">{toolData.name}</span>
148
126
  </div>
149
127
  )}
150
128
  <div className="space-y-2">
151
129
  <Label htmlFor="node-id">Id</Label>
152
- <Input id="node-id" value={selectedNode.data.id} disabled />
130
+ <Input id="node-id" value={selectedNode.data.toolId} disabled />
153
131
  </div>
154
132
  <div className="space-y-2">
155
133
  <Label htmlFor="name">Name</Label>
156
134
  <Input
157
135
  id="name"
158
136
  name="name"
159
- value={selectedNode.data.name || ''}
137
+ value={toolData?.name || ''}
160
138
  onChange={handleInputChange}
161
139
  placeholder="MCP server"
162
140
  className="w-full"
@@ -168,20 +146,20 @@ export function MCPServerNodeEditor({
168
146
  <Input
169
147
  id="url"
170
148
  name="url"
171
- value={selectedNode.data.config?.mcp?.server?.url || ''}
149
+ value={toolData?.config?.mcp?.server?.url || ''}
172
150
  onChange={handleInputChange}
173
151
  placeholder="https://mcp.inkeep.com"
174
152
  disabled
175
153
  className="w-full"
176
154
  />
177
155
  </div>
178
- {selectedNode.data.imageUrl && (
156
+ {toolData?.imageUrl && (
179
157
  <div className="space-y-2">
180
158
  <Label htmlFor="imageUrl">Image URL</Label>
181
159
  <Input
182
160
  id="imageUrl"
183
161
  name="imageUrl"
184
- value={selectedNode.data.imageUrl || ''}
162
+ value={toolData.imageUrl || ''}
185
163
  onChange={handleInputChange}
186
164
  placeholder="https://example.com/icon.png"
187
165
  disabled
@@ -199,16 +177,15 @@ export function MCPServerNodeEditor({
199
177
  {
200
178
  selectedTools === null
201
179
  ? (activeTools?.length ?? 0) // All tools selected
202
- : selectedTools.filter((toolName) =>
203
- activeTools?.some((tool) => tool.name === toolName)
204
- ).length // Only count selected tools that are currently active
180
+ : selectedTools.length // Count all selected tools (including orphaned ones)
205
181
  }
206
182
  </Badge>
207
183
  </div>
208
184
  <p className="text-xs text-muted-foreground mb-1.5">Click to select/deselect</p>
209
- {activeTools && activeTools.length > 0 && (
185
+ {(activeTools && activeTools.length > 0) || orphanedTools.length > 0 ? (
210
186
  <div className="flex flex-wrap gap-2">
211
- {activeTools.map((tool) => {
187
+ {/* Active tools */}
188
+ {activeTools?.map((tool) => {
212
189
  const isSelected =
213
190
  selectedTools === null
214
191
  ? true // If null, all tools are selected
@@ -239,12 +216,36 @@ export function MCPServerNodeEditor({
239
216
  </Tooltip>
240
217
  );
241
218
  })}
219
+
220
+ {/* Orphaned tools (selected but no longer available) */}
221
+ {orphanedTools.map((toolName) => (
222
+ <Tooltip key={`orphaned-${toolName}`}>
223
+ <TooltipTrigger asChild>
224
+ <Badge
225
+ variant="warning"
226
+ className="flex items-center gap-1 cursor-pointer transition-colors hover:bg-primary/10 normal-case"
227
+ onClick={() => toggleToolSelection(toolName)}
228
+ >
229
+ {toolName}
230
+ <span className="text-xs">
231
+ <CircleAlert className="w-2.5 h-2.5" />
232
+ </span>
233
+ </Badge>
234
+ </TooltipTrigger>
235
+ <TooltipContent className="max-w-xs text-sm">
236
+ <div className="line-clamp-4">
237
+ This tool was selected but is not available in the MCP server. Click to remove
238
+ it from the selection.
239
+ </div>
240
+ </TooltipContent>
241
+ </Tooltip>
242
+ ))}
242
243
  </div>
243
- )}
244
+ ) : null}
244
245
  </div>
245
246
 
246
247
  <ExternalLink
247
- href={`/${tenantId}/projects/${projectId}/mcp-servers/${selectedNode.data.id}/edit`}
248
+ href={`/${tenantId}/projects/${projectId}/mcp-servers/${selectedNode.data.toolId}/edit`}
248
249
  >
249
250
  Edit MCP Server
250
251
  </ExternalLink>
@@ -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 "@/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'
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: { ...mcp },
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(() => {