@inkeep/agents-manage-ui 0.8.7 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) 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 +161 -161
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +7 -7
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +5 -5
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +15 -15
  6. package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +19 -19
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js +2 -2
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js.nft.json +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js +2 -2
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js.nft.json +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page.js +2 -2
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +1 -1
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js +2 -2
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js.nft.json +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js +2 -2
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js.nft.json +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page.js +2 -2
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +1 -1
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  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 +2 -2
  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_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +2 -2
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  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 +7 -7
  84. package/.next/standalone/agents-manage-ui/.next/server/chunks/2539.js +8 -8
  85. package/.next/standalone/agents-manage-ui/.next/server/chunks/2563.js +1 -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/{5956.js → 3679.js} +1 -1
  88. package/.next/standalone/agents-manage-ui/.next/server/chunks/425.js +1 -1
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7929.js → 5286.js} +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/5294.js +1 -1
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/6116.js +1 -1
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/6675.js +1 -0
  94. package/.next/standalone/agents-manage-ui/.next/server/chunks/679.js +1 -1
  95. package/.next/standalone/agents-manage-ui/.next/server/chunks/6957.js +2 -2
  96. package/.next/standalone/agents-manage-ui/.next/server/chunks/720.js +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/chunks/726.js +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/chunks/{3404.js → 7652.js} +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
  100. package/.next/standalone/agents-manage-ui/.next/server/chunks/9093.js +4079 -0
  101. package/.next/standalone/agents-manage-ui/.next/server/chunks/9235.js +1 -1
  102. package/.next/standalone/agents-manage-ui/.next/server/chunks/9831.js +1 -0
  103. package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
  104. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  105. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  108. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  109. package/.next/standalone/agents-manage-ui/.next/static/chunks/{1016-065c7c4004850849.js → 1231-4cd082da6edbfe60.js} +2 -2
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/{4090-041bb034eaa7be6c.js → 1413-48a35bb8b2d9a310.js} +1 -1
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/2082-891b4e1bcad00d88.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/4095-96d343710caf26be.js +1 -0
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/{4132.0629ebed95bad681.js → 4132.e82c1ad08339ac0f.js} +1 -1
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/{4229.a3af860481552dea.js → 4229.8460547691a15bed.js} +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/{6497-d25dae53e4f0b68a.js → 6497-95887fafcaf35d31.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-11a12434690e1440.js +1 -0
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/{8531.15d8d4ac923abbfd.js → 8531.1dafd6b1ecb8f349.js} +1 -1
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/{9964-02d4a76792a0abc8.js → 9964-e16d35b53a509ad4.js} +1 -1
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-10994c4134a5b1f6.js +1 -0
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-ac21ae31668741aa.js +1 -0
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-ac21ae31668741aa.js +1 -0
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-2bb568b6c23a881e.js +1 -0
  123. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-3d397c420bb8143b.js +1 -0
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-f7c50d8bbfd65b0d.js +1 -0
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-e11b688b8c64e54e.js +1 -0
  126. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-d98ce43ab8686e03.js → page-9845708b28d20181.js} +1 -1
  127. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/{page-2a339c25cf52f458.js → page-4bee752045ef90e0.js} +1 -1
  128. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/{page-2a339c25cf52f458.js → page-4bee752045ef90e0.js} +1 -1
  129. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-0b8a51e424924a54.js +1 -0
  130. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-83f03615dc11014b.js → page-09211eb5d072f78c.js} +1 -1
  131. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-da8ddb54272917ab.js → page-dedc24c2a11b92e3.js} +1 -1
  132. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e43da749deafb4dd.js → page-85b42eb6434f29e0.js} +1 -1
  133. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-c65e011074a1fcce.js → page-546eada72bc05113.js} +1 -1
  134. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-b1024549b5350223.js → page-dd6ae70ea7fabd25.js} +1 -1
  135. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-cdc9588a55a0d92c.js +1 -0
  136. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-d9b96584b3200c5d.js → page-a0922720c62feda3.js} +1 -1
  137. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-2a12f980f96c7c38.js +1 -0
  138. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-7e81c1c4a1f31187.js +1 -0
  139. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-3d8dfc51ee03d859.js +1 -0
  140. package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-4a10374a948c9803.js → webpack-2d4148ddf995243a.js} +1 -1
  141. package/.next/standalone/agents-manage-ui/.next/static/css/d6cfe4d39e9ec828.css +1 -0
  142. package/.next/standalone/agents-manage-ui/package.json +1 -1
  143. package/.next/standalone/packages/agents-core/package.json +1 -1
  144. package/package.json +4 -4
  145. package/src/components/graph/configuration/node-types.tsx +6 -0
  146. package/src/components/graph/graph.tsx +87 -38
  147. package/src/components/graph/nodes/mcp-node.tsx +3 -2
  148. package/src/components/graph/playground/custom-headers-dialog.tsx +1 -1
  149. package/src/components/graph/playground/playground.tsx +48 -17
  150. package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +14 -22
  151. package/src/components/graph/sidepane/nodes/mcp-selector/mcp-selector.tsx +1 -1
  152. package/src/features/graph/domain/deserialize.ts +22 -53
  153. package/src/features/graph/domain/serialize.ts +15 -6
  154. package/src/features/graph/state/use-graph-store.ts +37 -13
  155. package/src/lib/utils/orphaned-tools-detector.ts +76 -50
  156. package/.next/standalone/agents-manage-ui/.next/server/chunks/3086.js +0 -1
  157. package/.next/standalone/agents-manage-ui/.next/server/chunks/581.js +0 -1
  158. package/.next/standalone/agents-manage-ui/.next/server/chunks/6314.js +0 -1
  159. package/.next/standalone/agents-manage-ui/.next/server/chunks/9772.js +0 -4079
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/1038-54d48d86de704a66.js +0 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-62fb01db4bf7c93f.js +0 -1
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/9015-a88871b0493fa6a4.js +0 -1
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-d4772fb2fe52d502.js +0 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page-49ed1a294d705e2b.js +0 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/page-49ed1a294d705e2b.js +0 -1
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-620d86f21e1681e4.js +0 -1
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-1adc6c6811c5224b.js +0 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-3a6d23feb7e81c60.js +0 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-943ca6e800bfb42e.js +0 -1
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/page-2b56d1bb8facba92.js +0 -1
  171. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-15d74bf9095a3a5f.js +0 -1
  172. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-989cf7b49617d609.js +0 -1
  173. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-3610d41580ae65f5.js +0 -1
  174. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-62da969ed126dce3.js +0 -1
  175. package/.next/standalone/agents-manage-ui/.next/static/css/98c416ff19152db0.css +0 -1
  176. /package/.next/standalone/agents-manage-ui/.next/static/{2w7Mtrd1QqrH5dFKfhc0T → P565yMuBD-0DpQccwOL1W}/_buildManifest.js +0 -0
  177. /package/.next/standalone/agents-manage-ui/.next/static/{2w7Mtrd1QqrH5dFKfhc0T → P565yMuBD-0DpQccwOL1W}/_ssgManifest.js +0 -0
@@ -11,7 +11,8 @@ import { Handle } from './handle';
11
11
  export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
12
12
  const { data, selected } = props;
13
13
  const toolLookup = useGraphStore((state) => state.toolLookup);
14
- const selectedToolsLookup = useGraphStore((state) => state.selectedToolsLookup);
14
+ const agentToolConfigLookup = useGraphStore((state) => state.agentToolConfigLookup);
15
+ const edges = useGraphStore((state) => state.edges);
15
16
 
16
17
  const name = data.name || `Tool: ${data.toolId}`;
17
18
  const imageUrl = data.imageUrl;
@@ -25,7 +26,7 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
25
26
  activeTools: toolData?.config?.mcp?.activeTools,
26
27
  });
27
28
 
28
- const selectedTools = getCurrentSelectedToolsForNode(props, selectedToolsLookup);
29
+ const selectedTools = getCurrentSelectedToolsForNode(props, agentToolConfigLookup, edges);
29
30
 
30
31
  // Format the tool display
31
32
  const getToolDisplay = () => {
@@ -85,7 +85,7 @@ function CustomHeadersDialog({ customHeaders, setCustomHeaders }: CustomHeadersD
85
85
  return (
86
86
  <Dialog open={isOpen} onOpenChange={setIsOpen}>
87
87
  <DialogTrigger asChild>
88
- <Button variant="outline">
88
+ <Button variant="ghost" size="sm" className="h-6">
89
89
  {numHeaders > 0 ? <Pencil className="w-4 h-4" /> : <Plus className="w-4 h-4" />}
90
90
  Custom Headers
91
91
  {numHeaders > 0 && <Badge variant="code">{numHeaders}</Badge>}
@@ -1,4 +1,4 @@
1
- import { ArrowLeft } from 'lucide-react';
1
+ import { Bug, X } from 'lucide-react';
2
2
  import { nanoid } from 'nanoid';
3
3
  import { useState } from 'react';
4
4
  import { TimelineWrapper } from '@/components/traces/timeline/timeline-wrapper';
@@ -13,16 +13,19 @@ interface PlaygroundProps {
13
13
  projectId: string;
14
14
  tenantId: string;
15
15
  setShowPlayground: (show: boolean) => void;
16
+ closeSidePane: () => void;
16
17
  }
17
18
 
18
19
  export const Playground = ({
19
20
  graphId,
20
21
  projectId,
21
22
  tenantId,
23
+ closeSidePane,
22
24
  setShowPlayground,
23
25
  }: PlaygroundProps) => {
24
26
  const [conversationId, setConversationId] = useState<string>(nanoid());
25
27
  const [customHeaders, setCustomHeaders] = useState<Record<string, string>>({});
28
+ const [showTraces, setShowTraces] = useState<boolean>(false);
26
29
  const {
27
30
  chatActivities,
28
31
  isPolling,
@@ -36,13 +39,36 @@ export const Playground = ({
36
39
  });
37
40
 
38
41
  return (
39
- <div className="bg-background h-full w-full z-10 flex flex-col">
42
+ <div
43
+ className={`bg-background z-10 flex flex-col border-l ${showTraces ? 'w-full' : 'w-1/3 min-w-96'}`}
44
+ >
40
45
  <div className="flex min-h-0 items-center justify-between py-2 px-4 border-b flex-shrink-0">
41
- <Button variant="ghost" size="sm" className="h-6" onClick={() => setShowPlayground(false)}>
42
- <ArrowLeft className="h-4 w-4" />
43
- <span>Back to graph</span>
44
- </Button>
45
46
  <CustomHeadersDialog customHeaders={customHeaders} setCustomHeaders={setCustomHeaders} />
47
+ <div className="flex items-center gap-2">
48
+ <Button
49
+ variant="ghost"
50
+ size="sm"
51
+ className="h-6"
52
+ onClick={() => {
53
+ setShowTraces(!showTraces);
54
+ if (!showTraces) {
55
+ closeSidePane();
56
+ }
57
+ }}
58
+ >
59
+ <Bug className="h-4 w-4" />
60
+ {showTraces ? 'Hide debug' : 'Debug'}
61
+ </Button>
62
+
63
+ <Button
64
+ variant="ghost"
65
+ size="sm"
66
+ className="h-6"
67
+ onClick={() => setShowPlayground(false)}
68
+ >
69
+ <X className="h-4 w-4" />
70
+ </Button>
71
+ </div>
46
72
  </div>
47
73
  <div className="flex-1 min-h-0 w-full">
48
74
  <ResizablePanelGroup direction="horizontal">
@@ -59,17 +85,22 @@ export const Playground = ({
59
85
  key={JSON.stringify(customHeaders)}
60
86
  />
61
87
  </ResizablePanel>
62
- <ResizableHandle />
63
- <TimelineWrapper
64
- isPolling={isPolling}
65
- conversation={chatActivities}
66
- enableAutoScroll={true}
67
- error={error}
68
- retryConnection={retryConnection}
69
- refreshOnce={refreshOnce}
70
- showConversationTracesLink={true}
71
- conversationId={conversationId}
72
- />
88
+
89
+ {showTraces && (
90
+ <>
91
+ <ResizableHandle />
92
+ <TimelineWrapper
93
+ isPolling={isPolling}
94
+ conversation={chatActivities}
95
+ enableAutoScroll={true}
96
+ error={error}
97
+ retryConnection={retryConnection}
98
+ refreshOnce={refreshOnce}
99
+ showConversationTracesLink={true}
100
+ conversationId={conversationId}
101
+ />
102
+ </>
103
+ )}
73
104
  </ResizablePanelGroup>
74
105
  </div>
75
106
  </div>
@@ -12,7 +12,10 @@ import { Label } from '@/components/ui/label';
12
12
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
13
13
  import { useGraphStore } from '@/features/graph/state/use-graph-store';
14
14
  import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
15
- import { getCurrentSelectedToolsForNode } from '@/lib/utils/orphaned-tools-detector';
15
+ import {
16
+ getCurrentHeadersForNode,
17
+ getCurrentSelectedToolsForNode,
18
+ } from '@/lib/utils/orphaned-tools-detector';
16
19
  import type { MCPNodeData } from '../../configuration/node-types';
17
20
  import type { AgentToolConfigLookup } from '../../graph';
18
21
 
@@ -32,35 +35,24 @@ export function MCPServerNodeEditor({
32
35
  }>();
33
36
  const markUnsaved = useGraphStore((state) => state.markUnsaved);
34
37
 
35
- // Get current headers for this tool from all agents
36
- const getCurrentHeaders = useCallback((): Record<string, string> => {
37
- // First check if we have temporary headers stored on the node
38
- if ((selectedNode.data as any).tempHeaders !== undefined) {
39
- return (selectedNode.data as any).tempHeaders;
40
- }
38
+ // Only use toolLookup - single source of truth
39
+ const toolLookup = useGraphStore((state) => state.toolLookup);
40
+ const edges = useGraphStore((state) => state.edges);
41
41
 
42
- // Otherwise, get from the database/initial state - find any agent that has headers for this tool
43
- for (const agentId in agentToolConfigLookup) {
44
- const toolConfig = agentToolConfigLookup[agentId]?.[selectedNode.data.toolId];
45
- if (toolConfig?.headers) {
46
- return toolConfig.headers;
47
- }
48
- }
49
- return {};
50
- }, [agentToolConfigLookup, selectedNode.data]);
42
+ const getCurrentHeaders = useCallback((): Record<string, string> => {
43
+ return getCurrentHeadersForNode(selectedNode, agentToolConfigLookup, edges);
44
+ }, [selectedNode, agentToolConfigLookup, edges]);
51
45
 
52
46
  // Local state for headers input (allows invalid JSON while typing)
53
47
  const [headersInputValue, setHeadersInputValue] = useState('{}');
54
48
 
55
- // Sync input value when external headers change
49
+ // Sync input value when node changes (but not on every data change)
50
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentionally omit getCurrentHeaders to prevent reset loops
56
51
  useEffect(() => {
57
52
  const newHeaders = getCurrentHeaders();
58
53
  setHeadersInputValue(JSON.stringify(newHeaders, null, 2));
59
- }, [getCurrentHeaders]);
54
+ }, [selectedNode.id]);
60
55
 
61
- // Only use toolLookup - single source of truth
62
- const toolLookup = useGraphStore((state) => state.toolLookup);
63
- const selectedToolsLookup = useGraphStore((state) => state.selectedToolsLookup);
64
56
  const toolData = toolLookup[selectedNode.data.toolId];
65
57
 
66
58
  const availableTools = toolData?.availableTools;
@@ -80,7 +72,7 @@ export function MCPServerNodeEditor({
80
72
  </div>
81
73
  );
82
74
  }
83
- const selectedTools = getCurrentSelectedToolsForNode(selectedNode, selectedToolsLookup);
75
+ const selectedTools = getCurrentSelectedToolsForNode(selectedNode, agentToolConfigLookup, edges);
84
76
 
85
77
  // Find orphaned tools - tools that are selected but no longer available in activeTools
86
78
  const orphanedTools =
@@ -57,7 +57,7 @@ export function MCPSelector({ selectedNode }: { selectedNode: Node }) {
57
57
  const handleSelect = (mcp: MCPTool) => {
58
58
  updateNode(selectedNode.id, {
59
59
  type: NodeType.MCP,
60
- data: { toolId: mcp.id },
60
+ data: { toolId: mcp.id, agentId: null, relationshipId: null },
61
61
  });
62
62
  };
63
63
 
@@ -206,59 +206,28 @@ export function deserializeGraphData(data: FullGraphDefinition): TransformResult
206
206
  const agent = data.agents[agentId];
207
207
  // Check if agent has canUse property (internal agents)
208
208
  if ('canUse' in agent && agent.canUse && agent.canUse.length > 0) {
209
- // Only create tool nodes if tools data is available in graph (backward compatibility)
210
- const toolsData = (data as any).tools;
211
- if (toolsData) {
212
- for (const canUseItem of agent.canUse) {
213
- const toolId = canUseItem.toolId;
214
- const tool = toolsData[toolId];
215
- if (!tool) {
216
- // eslint-disable-next-line no-console
217
- console.warn(`Tool with ID ${toolId} not found in tools object`);
218
- continue;
219
- }
220
- const toolNodeId = nanoid();
221
- const toolNode: Node = {
222
- id: toolNodeId,
223
- type: NodeType.MCP,
224
- position: { x: 0, y: 0 },
225
- data: { toolId: tool.id },
226
- };
227
- nodes.push(toolNode);
228
-
229
- const agentToToolEdge: Edge = {
230
- id: `edge-${toolNodeId}-${agentId}`,
231
- type: EdgeType.Default,
232
- source: agentId,
233
- sourceHandle: agentNodeSourceHandleId,
234
- target: toolNodeId,
235
- targetHandle: mcpNodeHandleId,
236
- };
237
- edges.push(agentToToolEdge);
238
- }
239
- } else {
240
- // Tools are project-scoped - just store the tool ID
241
- for (const canUseItem of agent.canUse) {
242
- const toolId = canUseItem.toolId;
243
- const toolNodeId = nanoid();
244
- const toolNode: Node = {
245
- id: toolNodeId,
246
- type: NodeType.MCP,
247
- position: { x: 0, y: 0 },
248
- data: { toolId },
249
- };
250
- nodes.push(toolNode);
251
-
252
- const agentToToolEdge: Edge = {
253
- id: `edge-${toolNodeId}-${agentId}`,
254
- type: EdgeType.Default,
255
- source: agentId,
256
- sourceHandle: agentNodeSourceHandleId,
257
- target: toolNodeId,
258
- targetHandle: mcpNodeHandleId,
259
- };
260
- edges.push(agentToToolEdge);
261
- }
209
+ // Tools are project-scoped - create nodes from canUse items
210
+ for (const canUseItem of agent.canUse) {
211
+ const toolId = canUseItem.toolId;
212
+ const toolNodeId = nanoid();
213
+ const relationshipId = canUseItem.agentToolRelationId;
214
+ const toolNode: Node = {
215
+ id: toolNodeId,
216
+ type: NodeType.MCP,
217
+ position: { x: 0, y: 0 },
218
+ data: { toolId, agentId, relationshipId },
219
+ };
220
+ nodes.push(toolNode);
221
+
222
+ const agentToToolEdge: Edge = {
223
+ id: `edge-${toolNodeId}-${agentId}`,
224
+ type: EdgeType.Default,
225
+ source: agentId,
226
+ sourceHandle: agentNodeSourceHandleId,
227
+ target: toolNodeId,
228
+ targetHandle: mcpNodeHandleId,
229
+ };
230
+ edges.push(agentToToolEdge);
262
231
  }
263
232
  }
264
233
  }
@@ -120,6 +120,7 @@ export function serializeGraphData(
120
120
  toolId: string;
121
121
  toolSelection?: string[] | null;
122
122
  headers?: Record<string, string>;
123
+ agentToolRelationId?: string;
123
124
  }> = [];
124
125
 
125
126
  // Find edges from this agent to MCP nodes
@@ -140,6 +141,9 @@ export function serializeGraphData(
140
141
  const tempSelectedTools = (mcpNode.data as any).tempSelectedTools;
141
142
  let toolSelection: string[] | null = null;
142
143
 
144
+ // Get the relationshipId from the MCP node first
145
+ const relationshipId = (mcpNode.data as any).relationshipId;
146
+
143
147
  if (tempSelectedTools !== undefined) {
144
148
  // User has made changes to tool selection in the UI
145
149
  if (Array.isArray(tempSelectedTools)) {
@@ -149,9 +153,11 @@ export function serializeGraphData(
149
153
  }
150
154
  } else {
151
155
  // No changes made to tool selection - preserve existing selection
152
- if (agentToolConfigLookup?.[agentId]?.[toolId]?.toolSelection) {
153
- // Get existing selection from saved data
154
- toolSelection = agentToolConfigLookup[agentId][toolId].toolSelection;
156
+ const existingConfig = relationshipId
157
+ ? agentToolConfigLookup?.[agentId]?.[relationshipId]
158
+ : null;
159
+ if (existingConfig?.toolSelection) {
160
+ toolSelection = existingConfig.toolSelection;
155
161
  } else {
156
162
  // Default to all tools selected when no existing data found
157
163
  toolSelection = null;
@@ -171,9 +177,11 @@ export function serializeGraphData(
171
177
  }
172
178
  } else {
173
179
  // No changes made to headers - preserve existing headers
174
- if (agentToolConfigLookup?.[agentId]?.[toolId]?.headers) {
175
- // Get existing headers from saved data
176
- toolHeaders = agentToolConfigLookup[agentId][toolId].headers;
180
+ const existingConfig = relationshipId
181
+ ? agentToolConfigLookup?.[agentId]?.[relationshipId]
182
+ : null;
183
+ if (existingConfig?.headers) {
184
+ toolHeaders = existingConfig.headers;
177
185
  }
178
186
  }
179
187
 
@@ -181,6 +189,7 @@ export function serializeGraphData(
181
189
  toolId,
182
190
  toolSelection,
183
191
  headers: toolHeaders,
192
+ ...(relationshipId && { agentToolRelationId: relationshipId }),
184
193
  });
185
194
  }
186
195
  }
@@ -3,6 +3,8 @@ import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
3
3
  import { create } from 'zustand';
4
4
  import { devtools } from 'zustand/middleware';
5
5
  import type { GraphMetadata } from '@/components/graph/configuration/graph-types';
6
+ import { mcpNodeHandleId, NodeType } from '@/components/graph/configuration/node-types';
7
+ import type { AgentToolConfigLookup } from '@/components/graph/graph';
6
8
  import type { ArtifactComponent } from '@/lib/api/artifact-components';
7
9
  import type { DataComponent } from '@/lib/api/data-components';
8
10
  import type { MCPTool } from '@/lib/types/tools';
@@ -17,7 +19,7 @@ type GraphStateData = {
17
19
  dataComponentLookup: Record<string, DataComponent>;
18
20
  artifactComponentLookup: Record<string, ArtifactComponent>;
19
21
  toolLookup: Record<string, MCPTool>;
20
- selectedToolsLookup: Record<string, Record<string, string[]>>;
22
+ agentToolConfigLookup: AgentToolConfigLookup;
21
23
  dirty: boolean;
22
24
  history: HistoryEntry[];
23
25
  future: HistoryEntry[];
@@ -33,12 +35,12 @@ type GraphState = GraphStateData & {
33
35
  dataComponentLookup?: Record<string, DataComponent>,
34
36
  artifactComponentLookup?: Record<string, ArtifactComponent>,
35
37
  toolLookup?: Record<string, MCPTool>,
36
- selectedToolsLookup?: Record<string, Record<string, string[]>>
38
+ agentToolConfigLookup?: AgentToolConfigLookup
37
39
  ): void;
38
40
  setDataComponentLookup(dataComponentLookup: Record<string, DataComponent>): void;
39
41
  setArtifactComponentLookup(artifactComponentLookup: Record<string, ArtifactComponent>): void;
40
42
  setToolLookup(toolLookup: Record<string, MCPTool>): void;
41
- setSelectedToolsLookup(selectedToolsLookup: Record<string, Record<string, string[]>>): void;
43
+ setAgentToolConfigLookup(agentToolConfigLookup: AgentToolConfigLookup): void;
42
44
  setNodes(updater: (prev: Node[]) => Node[]): void;
43
45
  setEdges(updater: (prev: Edge[]) => Edge[]): void;
44
46
  onNodesChange(changes: NodeChange[]): void;
@@ -82,7 +84,7 @@ export const useGraphStore = create<GraphState>()(
82
84
  dataComponentLookup: {},
83
85
  artifactComponentLookup: {},
84
86
  toolLookup: {},
85
- selectedToolsLookup: {},
87
+ agentToolConfigLookup: {},
86
88
  dirty: false,
87
89
  history: [],
88
90
  future: [],
@@ -95,7 +97,7 @@ export const useGraphStore = create<GraphState>()(
95
97
  dataComponentLookup = {},
96
98
  artifactComponentLookup = {},
97
99
  toolLookup = {},
98
- selectedToolsLookup = {}
100
+ agentToolConfigLookup = {}
99
101
  ) {
100
102
  set({
101
103
  nodes,
@@ -104,7 +106,7 @@ export const useGraphStore = create<GraphState>()(
104
106
  dataComponentLookup,
105
107
  artifactComponentLookup,
106
108
  toolLookup,
107
- selectedToolsLookup,
109
+ agentToolConfigLookup,
108
110
  dirty: false,
109
111
  history: [],
110
112
  future: [],
@@ -121,8 +123,8 @@ export const useGraphStore = create<GraphState>()(
121
123
  setToolLookup(toolLookup) {
122
124
  set({ toolLookup });
123
125
  },
124
- setSelectedToolsLookup(selectedToolsLookup) {
125
- set({ selectedToolsLookup });
126
+ setAgentToolConfigLookup(agentToolConfigLookup) {
127
+ set({ agentToolConfigLookup });
126
128
  },
127
129
  setNodes(updater) {
128
130
  set((state) => ({ nodes: updater(state.nodes) }));
@@ -158,11 +160,33 @@ export const useGraphStore = create<GraphState>()(
158
160
  (change) => change.type === 'remove' || change.type === 'add' || change.type === 'replace'
159
161
  );
160
162
 
161
- set((state) => ({
162
- history: [...state.history, { nodes: state.nodes, edges: state.edges }],
163
- edges: applyEdgeChanges(changes, state.edges),
164
- dirty: hasModifyingChange ? true : state.dirty,
165
- }));
163
+ set((state) => {
164
+ // Check for edge removals that disconnect agent from MCP node
165
+ const removeChanges = changes.filter((change) => change.type === 'remove');
166
+ let updatedNodes = state.nodes;
167
+
168
+ for (const removeChange of removeChanges) {
169
+ const edgeToRemove = state.edges.find((e) => e.id === removeChange.id);
170
+ if (edgeToRemove && edgeToRemove.targetHandle === mcpNodeHandleId) {
171
+ // Find the target MCP node and clear its agentId
172
+ const mcpNode = state.nodes.find((n) => n.id === edgeToRemove.target);
173
+ if (mcpNode && mcpNode.type === NodeType.MCP) {
174
+ updatedNodes = updatedNodes.map((n) =>
175
+ n.id === mcpNode.id
176
+ ? { ...n, data: { ...n.data, agentId: null, relationshipId: null } }
177
+ : n
178
+ );
179
+ }
180
+ }
181
+ }
182
+
183
+ return {
184
+ history: [...state.history, { nodes: state.nodes, edges: state.edges }],
185
+ nodes: updatedNodes,
186
+ edges: applyEdgeChanges(changes, state.edges),
187
+ dirty: hasModifyingChange ? true : state.dirty,
188
+ };
189
+ });
166
190
  },
167
191
  onConnect(connection) {
168
192
  set((state) => ({ edges: addEdge(connection as any, state.edges) }));
@@ -1,16 +1,16 @@
1
- import type { Node } from '@xyflow/react';
1
+ import type { Edge, Node } from '@xyflow/react';
2
2
  import { getActiveTools } from '@/app/utils/active-tools';
3
3
  import type { MCPNodeData } from '@/components/graph/configuration/node-types';
4
4
  import { NodeType } from '@/components/graph/configuration/node-types';
5
5
  import type { MCPTool } from '@/lib/types/tools';
6
6
 
7
- export interface OrphanedToolsInfo {
7
+ interface OrphanedToolsInfo {
8
8
  nodeId: string;
9
9
  nodeName: string;
10
10
  orphanedTools: string[];
11
11
  }
12
12
 
13
- export interface OrphanedToolsDetectionResult {
13
+ interface OrphanedToolsDetectionResult {
14
14
  hasOrphanedTools: boolean;
15
15
  orphanedToolsByNode: OrphanedToolsInfo[];
16
16
  totalOrphanedCount: number;
@@ -22,62 +22,26 @@ export interface OrphanedToolsDetectionResult {
22
22
  */
23
23
  export function detectOrphanedToolsAndGetWarning(
24
24
  nodes: Node[],
25
- selectedToolsLookup: Record<string, Record<string, string[]>>,
25
+ agentToolConfigLookup: Record<
26
+ string,
27
+ Record<string, { toolId: string; toolSelection?: string[] }>
28
+ >,
26
29
  toolLookup: Record<string, MCPTool>
27
30
  ): string | null {
28
- const result = detectOrphanedToolsInGraph(nodes, selectedToolsLookup, toolLookup);
31
+ const result = detectOrphanedToolsInGraph(nodes, agentToolConfigLookup, toolLookup);
29
32
  return result.hasOrphanedTools ? createOrphanedToolsWarningMessage(result) : null;
30
33
  }
31
34
 
32
- /**
33
- * Extract shared logic for getting selected tools for a node
34
- * This replaces the duplicated logic between detector and MCP node editor
35
- */
36
- export function getCurrentSelectedToolsForNode(
37
- node: { data: MCPNodeData },
38
- selectedToolsLookup: Record<string, Record<string, string[]>>
39
- ): string[] | null {
40
- // First check if we have temporary selections stored on the node (from recent clicks)
41
- if ((node.data as any).tempSelectedTools !== undefined) {
42
- return (node.data as any).tempSelectedTools;
43
- }
44
-
45
- // Otherwise, get from the database/initial state
46
- const allSelectedTools = new Set<string>();
47
- let hasAnyData = false;
48
- let hasEmptyArray = false;
49
- let hasNullValue = false;
50
-
51
- Object.values(selectedToolsLookup).forEach((agentTools) => {
52
- const toolsForThisMCP = agentTools[node.data.toolId];
53
- if (toolsForThisMCP !== undefined) {
54
- hasAnyData = true;
55
- if (Array.isArray(toolsForThisMCP) && toolsForThisMCP.length === 0) {
56
- hasEmptyArray = true;
57
- } else if (toolsForThisMCP === null) {
58
- hasNullValue = true;
59
- } else if (Array.isArray(toolsForThisMCP)) {
60
- toolsForThisMCP.forEach((tool) => {
61
- allSelectedTools.add(tool);
62
- });
63
- }
64
- }
65
- });
66
-
67
- if (hasNullValue) return null;
68
- if (hasEmptyArray) return [];
69
- if (!hasAnyData) return null;
70
-
71
- return Array.from(allSelectedTools);
72
- }
73
-
74
35
  /**
75
36
  * Detects orphaned tools across all MCP nodes in the graph
76
37
  * Orphaned tools are tools that were selected but are no longer available in the MCP server
77
38
  */
78
- export function detectOrphanedToolsInGraph(
39
+ function detectOrphanedToolsInGraph(
79
40
  nodes: Node[],
80
- selectedToolsLookup: Record<string, Record<string, string[]>>,
41
+ agentToolConfigLookup: Record<
42
+ string,
43
+ Record<string, { toolId: string; toolSelection?: string[] }>
44
+ >,
81
45
  toolLookup: Record<string, MCPTool>
82
46
  ): OrphanedToolsDetectionResult {
83
47
  const orphanedToolsByNode: OrphanedToolsInfo[] = [];
@@ -94,7 +58,7 @@ export function detectOrphanedToolsInGraph(
94
58
  activeTools: toolData.config?.mcp?.activeTools,
95
59
  });
96
60
 
97
- const selectedTools = getCurrentSelectedToolsForNode(node, selectedToolsLookup);
61
+ const selectedTools = getCurrentSelectedToolsForNode(node, agentToolConfigLookup, []);
98
62
 
99
63
  // Find orphaned tools for this node
100
64
  const orphanedTools =
@@ -143,3 +107,65 @@ export function createOrphanedToolsWarningMessage(result: OrphanedToolsDetection
143
107
 
144
108
  return `${nodeCount} MCP servers have a total of ${toolCount} selected tools that are no longer available. These orphaned tools will not be available at runtime. Please update your tool selections.`;
145
109
  }
110
+
111
+ /**
112
+ * Enhanced lookup for selected tools - uses relationshipId for true isolation
113
+ */
114
+ export function getCurrentSelectedToolsForNode(
115
+ node: { data: MCPNodeData; id: string },
116
+ agentToolConfigLookup: Record<
117
+ string,
118
+ Record<string, { toolId: string; toolSelection?: string[] | null }>
119
+ >,
120
+ _edges: Edge[]
121
+ ): string[] | null {
122
+ // First check if we have temporary selections stored on the node (from recent clicks)
123
+ if ((node.data as any).tempSelectedTools !== undefined) {
124
+ return (node.data as any).tempSelectedTools;
125
+ }
126
+
127
+ // If node has relationshipId, find config by relationshipId
128
+ const relationshipId = (node.data as any).relationshipId;
129
+ if (relationshipId) {
130
+ for (const toolsMap of Object.values(agentToolConfigLookup)) {
131
+ const config = toolsMap[relationshipId];
132
+ if (config) {
133
+ return config.toolSelection || null;
134
+ }
135
+ }
136
+ }
137
+
138
+ // No relationshipId found, return null (show all tools selected)
139
+ return null;
140
+ }
141
+
142
+ /**
143
+ * Enhanced lookup for headers - uses relationshipId
144
+ */
145
+ export function getCurrentHeadersForNode(
146
+ node: { data: MCPNodeData; id: string },
147
+ agentToolConfigLookup: Record<
148
+ string,
149
+ Record<string, { toolId: string; headers?: Record<string, string> }>
150
+ >,
151
+ _edges: Edge[]
152
+ ): Record<string, string> {
153
+ // First check if we have temporary headers stored on the node (from recent edits)
154
+ if ((node.data as any).tempHeaders !== undefined) {
155
+ return (node.data as any).tempHeaders;
156
+ }
157
+
158
+ // If node has relationshipId, find config by relationshipId
159
+ const relationshipId = (node.data as any).relationshipId;
160
+ if (relationshipId) {
161
+ for (const toolsMap of Object.values(agentToolConfigLookup)) {
162
+ const config = toolsMap[relationshipId];
163
+ if (config) {
164
+ return config.headers || {};
165
+ }
166
+ }
167
+ }
168
+
169
+ // No relationshipId found, return empty headers
170
+ return {};
171
+ }