@inkeep/agents-manage-ui 0.12.0 → 0.13.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 (336) 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 +344 -348
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +6 -6
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +13 -13
  6. package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +1 -1
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +2 -2
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js.nft.json +1 -1
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js.nft.json +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +1 -1
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js.nft.json +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js.nft.json +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +2 -2
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js.nft.json +1 -1
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js.nft.json +1 -1
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js.nft.json +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  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.js.nft.json +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +2 -2
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js.nft.json +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js.nft.json +1 -1
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js.nft.json +1 -1
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js.nft.json +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  77. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +3 -3
  80. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js.nft.json +1 -1
  81. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  83. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  84. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  85. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +2 -2
  86. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js.nft.json +1 -1
  87. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +2 -2
  89. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  92. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  93. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js +2 -2
  94. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js.nft.json +1 -1
  95. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route.js +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route.js.nft.json +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  100. package/.next/standalone/agents-manage-ui/.next/server/app/page.js.nft.json +1 -1
  101. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +6 -6
  103. package/.next/standalone/agents-manage-ui/.next/server/chunks/1670.js +1 -1
  104. package/.next/standalone/agents-manage-ui/.next/server/chunks/195.js +21 -0
  105. package/.next/standalone/agents-manage-ui/.next/server/chunks/2190.js +1 -0
  106. package/.next/standalone/agents-manage-ui/.next/server/chunks/2415.js +1 -0
  107. package/.next/standalone/agents-manage-ui/.next/server/chunks/245.js +55 -0
  108. package/.next/standalone/agents-manage-ui/.next/server/chunks/2496.js +1 -0
  109. package/.next/standalone/agents-manage-ui/.next/server/chunks/2539.js +13 -13
  110. package/.next/standalone/agents-manage-ui/.next/server/chunks/2606.js +1 -0
  111. package/.next/standalone/agents-manage-ui/.next/server/chunks/2916.js +1 -1
  112. package/.next/standalone/agents-manage-ui/.next/server/chunks/320.js +1 -1
  113. package/.next/standalone/agents-manage-ui/.next/server/chunks/3485.js +1 -0
  114. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/server/chunks/{1933.js → 3672.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7503.js → 3884.js} +1 -1
  117. package/.next/standalone/agents-manage-ui/.next/server/chunks/3948.js +1 -1
  118. package/.next/standalone/agents-manage-ui/.next/server/chunks/4843.js +1 -0
  119. package/.next/standalone/agents-manage-ui/.next/server/chunks/5517.js +1 -1
  120. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7001.js → 5716.js} +2 -2
  121. package/.next/standalone/agents-manage-ui/.next/server/chunks/5797.js +2 -2
  122. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7020.js → 6007.js} +1 -1
  123. package/.next/standalone/agents-manage-ui/.next/server/chunks/6212.js +1 -1
  124. package/.next/standalone/agents-manage-ui/.next/server/chunks/6229.js +1 -0
  125. package/.next/standalone/agents-manage-ui/.next/server/chunks/6351.js +1 -1
  126. package/.next/standalone/agents-manage-ui/.next/server/chunks/6525.js +4087 -0
  127. package/.next/standalone/agents-manage-ui/.next/server/chunks/6721.js +1 -1
  128. package/.next/standalone/agents-manage-ui/.next/server/chunks/6747.js +10 -1
  129. package/.next/standalone/agents-manage-ui/.next/server/chunks/694.js +1 -1
  130. package/.next/standalone/agents-manage-ui/.next/server/chunks/7346.js +1 -0
  131. package/.next/standalone/agents-manage-ui/.next/server/chunks/7511.js +1 -1
  132. package/.next/standalone/agents-manage-ui/.next/server/chunks/7538.js +1 -0
  133. package/.next/standalone/agents-manage-ui/.next/server/chunks/8048.js +1 -1
  134. package/.next/standalone/agents-manage-ui/.next/server/chunks/8100.js +211 -0
  135. package/.next/standalone/agents-manage-ui/.next/server/chunks/8321.js +1 -1
  136. package/.next/standalone/agents-manage-ui/.next/server/chunks/8610.js +25 -1
  137. package/.next/standalone/agents-manage-ui/.next/server/chunks/8615.js +1 -0
  138. package/.next/standalone/agents-manage-ui/.next/server/chunks/9128.js +1 -0
  139. package/.next/standalone/agents-manage-ui/.next/server/chunks/9340.js +1 -0
  140. package/.next/standalone/agents-manage-ui/.next/server/chunks/9490.js +1 -0
  141. package/.next/standalone/agents-manage-ui/.next/server/chunks/9754.js +1 -55
  142. package/.next/standalone/agents-manage-ui/.next/server/chunks/9892.js +1 -1
  143. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  144. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  145. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  146. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  147. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  148. package/.next/standalone/agents-manage-ui/.next/static/chunks/{1577-0df32275eaf5d398.js → 102-7512914c45c3b1c7.js} +1 -1
  149. package/.next/standalone/agents-manage-ui/.next/static/chunks/{2706-4fe94ba08fad72de.js → 1064-f747155da2f9bf6e.js} +61 -61
  150. package/.next/standalone/agents-manage-ui/.next/static/chunks/1191-22286038e3cf98ee.js +1 -0
  151. package/.next/standalone/agents-manage-ui/.next/static/chunks/1482-9b4bf21cc7c344fc.js +1 -0
  152. package/.next/standalone/agents-manage-ui/.next/static/chunks/1558-8cb46768b5585f53.js +1 -0
  153. package/.next/standalone/agents-manage-ui/.next/static/chunks/1771-5ceaf6a0f3601ad4.js +1 -0
  154. package/.next/standalone/agents-manage-ui/.next/static/chunks/1907-4a95aef238167de5.js +1 -0
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/{2063-3f9e00e568b9fbd9.js → 2063-00dd6285929e419a.js} +1 -1
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/225-12afe2ed1ce8f747.js +1 -0
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/2334-9c0d908003b40bcd.js +1 -0
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/{8b56a9fc-190bd97ffda2165f.js → 24a2b255-903019441fb58706.js} +1 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/{2501-235de6a1719d22be.js → 2501-85880c1e62f3270a.js} +1 -1
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/{3862-15cadd19b256aa73.js → 2597-b309d80128db51fe.js} +1 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/2811-5cbe9d781cd0bafb.js +1 -0
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/3737-2a02432078b2f2f0.js +1 -0
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/397-611c044fe87d89cd.js +1 -0
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/{1d27a36c-d2d09454474eca1a.js → 4a1e02d9-c537fee21142b0db.js} +1 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/6118-2a02432078b2f2f0.js +1 -0
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/6410-f93d663c6ef0d128.js +2 -0
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/{3803-1ffa84f6122f67f8.js → 6419-cc97e3d16c7907dd.js} +1 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/645-18422068b91714c4.js +1 -0
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-2a72e838c6240f76.js +1 -0
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/6501-2c90923d1b2f0f3e.js +1 -0
  171. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-8e3d7b9e316f636b.js +1 -0
  172. package/.next/standalone/agents-manage-ui/.next/static/chunks/7273-2a07799b9220335f.js +1 -0
  173. package/.next/standalone/agents-manage-ui/.next/static/chunks/7305-4bde6b1356d61f7a.js +1 -0
  174. package/.next/standalone/agents-manage-ui/.next/static/chunks/776-1b93689bfa34311b.js +1 -0
  175. package/.next/standalone/agents-manage-ui/.next/static/chunks/{7775-ec1fa275bc3e6717.js → 7775-846c2c087ca8b724.js} +1 -1
  176. package/.next/standalone/agents-manage-ui/.next/static/chunks/7829-0a56074397c08ece.js +1 -0
  177. package/.next/standalone/agents-manage-ui/.next/static/chunks/7904-825c751bfba62e0d.js +1 -0
  178. package/.next/standalone/agents-manage-ui/.next/static/chunks/8057-4851dad2e4c79710.js +2 -0
  179. package/.next/standalone/agents-manage-ui/.next/static/chunks/8130-c153c48b1fab6cb4.js +1 -0
  180. package/.next/standalone/agents-manage-ui/.next/static/chunks/{8197-a41c5aa502a71e0c.js → 8197-93dc03bb0bdcd89b.js} +1 -1
  181. package/.next/standalone/agents-manage-ui/.next/static/chunks/8467-977d32f1b1634139.js +1 -0
  182. package/.next/standalone/agents-manage-ui/.next/static/chunks/8486-01fbe9371d862c28.js +25 -0
  183. package/.next/standalone/agents-manage-ui/.next/static/chunks/8499-2a02432078b2f2f0.js +1 -0
  184. package/.next/standalone/agents-manage-ui/.next/static/chunks/880-2a02432078b2f2f0.js +1 -0
  185. package/.next/standalone/agents-manage-ui/.next/static/chunks/8831-9d23a1d8c9fb3858.js +1 -0
  186. package/.next/standalone/agents-manage-ui/.next/static/chunks/926-2d2311c975e35a35.js +1 -0
  187. package/.next/standalone/agents-manage-ui/.next/static/chunks/9425-43d6833e2edd012c.js +1 -0
  188. package/.next/standalone/agents-manage-ui/.next/static/chunks/9846-e037fda0c364e432.js +1 -0
  189. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/{error-9b1788d15a572652.js → error-98ca4c8d51368705.js} +1 -1
  190. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-c241f711010e7e13.js +1 -0
  191. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/{error-f4e04a252a003510.js → error-ef3511a0253a1330.js} +1 -1
  192. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-c3c91cd61be884a4.js +1 -0
  193. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{error-8e7ee0b452e16bf3.js → error-0672656e9e678998.js} +1 -1
  194. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/loading-0afec83059c372f2.js +1 -0
  195. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-c3c91cd61be884a4.js +1 -0
  196. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-ebf80aff5a2957f1.js +1 -0
  197. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/{error-0d5c117cb7d999c9.js → error-be8b5708f23d2e43.js} +1 -1
  198. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-6e9e120e0f0235de.js +1 -0
  199. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/{error-9499695753aa33ec.js → error-3b86172a5fe22d1c.js} +1 -1
  200. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/loading-0afec83059c372f2.js +1 -0
  201. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-6e9e120e0f0235de.js +1 -0
  202. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-930b7126b9182e8d.js +1 -0
  203. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-72c57c0fb9389280.js +1 -0
  204. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{error-409d41bd0525f22f.js → error-30b8013604e83604.js} +1 -1
  205. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-9deb7adcdeed1a80.js +1 -0
  206. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/page-0afec83059c372f2.js +1 -0
  207. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-ea02a056bccd6124.js +1 -0
  208. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/page-9e9e45f4ed4671bd.js +1 -0
  209. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-a842eee6a4322d45.js +1 -0
  210. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{error-8da8330295a84328.js → error-e6e8d53b544b7a3a.js} +1 -1
  211. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/loading-cb0a860db0fa369e.js +1 -0
  212. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page-21f1392ae65ea31a.js +1 -0
  213. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{error-9cf04dc4aab414a2.js → error-80ac013e2e0d39ec.js} +1 -1
  214. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/loading-0afec83059c372f2.js +1 -0
  215. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/page-b7ee3944e6a5c03d.js +1 -0
  216. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e16634fbbf6ba350.js → page-eb9c74bbc66bae57.js} +1 -1
  217. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-c1587a84a6de6faa.js → page-4498950740edb744.js} +1 -1
  218. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/{page-653ca9c1d193612c.js → page-3b5ec607247c0070.js} +1 -1
  219. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout-cb0a860db0fa369e.js +1 -0
  220. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/page-05827d40bb0aaf12.js +1 -0
  221. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-ababf7c5aa5e0bc0.js +1 -0
  222. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/{not-found-7f8ddb0d42ccf26c.js → not-found-abb1f829baf33e89.js} +1 -1
  223. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{error-9be350c37252135d.js → error-eca20c06c32063db.js} +1 -1
  224. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-1ad1329e9cb6ef07.js → page-d5fe05a40d56d36d.js} +1 -1
  225. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/ai-calls/page-e1fbd32969de96cb.js +1 -0
  226. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/{page-b9deaa2fcd232705.js → page-59d660fb7778e22d.js} +1 -1
  227. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-663da25347087a0f.js +1 -0
  228. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/{error-d0668aab86c9a04e.js → error-f217058bf7db150a.js} +1 -1
  229. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/loading-0afec83059c372f2.js +1 -0
  230. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-1c25a0513febf08b.js +1 -0
  231. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-462211bdc5e56272.js +1 -0
  232. package/.next/standalone/agents-manage-ui/.next/static/css/ff74e9dcb72fa41b.css +1 -0
  233. package/.next/standalone/agents-manage-ui/package.json +5 -2
  234. package/.next/standalone/package.json +8 -1
  235. package/.next/standalone/packages/agents-core/package.json +2 -2
  236. package/package.json +8 -5
  237. package/src/components/credentials/views/generic-auth-form.tsx +1 -1
  238. package/src/components/form/expandable-field.tsx +17 -11
  239. package/src/components/form/generic-input.tsx +2 -2
  240. package/src/components/form/prompt-editor.tsx +245 -0
  241. package/src/components/graph/graph.tsx +7 -5
  242. package/src/components/graph/nodes/agent-node.tsx +4 -2
  243. package/src/components/graph/nodes/mcp-node.tsx +5 -3
  244. package/src/components/graph/sidepane/edges/edge-editor.tsx +2 -2
  245. package/src/components/graph/sidepane/metadata/metadata-editor.tsx +3 -4
  246. package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +2 -4
  247. package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +54 -14
  248. package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +6 -4
  249. package/src/components/projects/form/form-configuration.ts +1 -1
  250. package/src/components/projects/form/project-form.tsx +14 -8
  251. package/src/components/projects/form/project-models-section.tsx +26 -2
  252. package/src/components/projects/form/project-stopwhen-section.tsx +18 -2
  253. package/src/components/projects/form/validation.ts +13 -4
  254. package/src/components/projects/project-item.tsx +2 -1
  255. package/src/features/graph/commands/commands.ts +24 -24
  256. package/src/features/graph/state/use-graph-store.ts +199 -172
  257. package/src/features/graph/ui/use-graph-shortcuts.ts +2 -2
  258. package/src/hooks/use-graph-errors.ts +7 -9
  259. package/src/hooks/use-node-editor.ts +4 -4
  260. package/src/lib/__tests__/context-suggestions.test.ts +205 -0
  261. package/src/lib/context-suggestions.ts +102 -0
  262. package/.next/standalone/agents-manage-ui/.next/server/chunks/189.js +0 -1
  263. package/.next/standalone/agents-manage-ui/.next/server/chunks/2212.js +0 -1
  264. package/.next/standalone/agents-manage-ui/.next/server/chunks/2745.js +0 -1
  265. package/.next/standalone/agents-manage-ui/.next/server/chunks/2749.js +0 -1
  266. package/.next/standalone/agents-manage-ui/.next/server/chunks/3082.js +0 -1
  267. package/.next/standalone/agents-manage-ui/.next/server/chunks/3468.js +0 -1
  268. package/.next/standalone/agents-manage-ui/.next/server/chunks/3508.js +0 -98
  269. package/.next/standalone/agents-manage-ui/.next/server/chunks/3859.js +0 -25
  270. package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +0 -1
  271. package/.next/standalone/agents-manage-ui/.next/server/chunks/6749.js +0 -1
  272. package/.next/standalone/agents-manage-ui/.next/server/chunks/6997.js +0 -1
  273. package/.next/standalone/agents-manage-ui/.next/server/chunks/7373.js +0 -1
  274. package/.next/standalone/agents-manage-ui/.next/server/chunks/7577.js +0 -211
  275. package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +0 -10
  276. package/.next/standalone/agents-manage-ui/.next/server/chunks/9459.js +0 -4087
  277. package/.next/standalone/agents-manage-ui/.next/static/chunks/1122-8db1ba2ae3171a66.js +0 -1
  278. package/.next/standalone/agents-manage-ui/.next/static/chunks/1278-51b8dfa15b83a027.js +0 -1
  279. package/.next/standalone/agents-manage-ui/.next/static/chunks/1558-436164db937a531a.js +0 -1
  280. package/.next/standalone/agents-manage-ui/.next/static/chunks/1907-0b40d23e09c01b49.js +0 -1
  281. package/.next/standalone/agents-manage-ui/.next/static/chunks/2254-cc7102683251739e.js +0 -1
  282. package/.next/standalone/agents-manage-ui/.next/static/chunks/2860-23cac986bdbc6f0d.js +0 -1
  283. package/.next/standalone/agents-manage-ui/.next/static/chunks/2960-b37d998249a08bdd.js +0 -1
  284. package/.next/standalone/agents-manage-ui/.next/static/chunks/3241-a114b4dae45882c2.js +0 -1
  285. package/.next/standalone/agents-manage-ui/.next/static/chunks/384-a114b4dae45882c2.js +0 -1
  286. package/.next/standalone/agents-manage-ui/.next/static/chunks/4258-6c416bb91f9962d0.js +0 -1
  287. package/.next/standalone/agents-manage-ui/.next/static/chunks/4420-1006bcd3841d18ce.js +0 -1
  288. package/.next/standalone/agents-manage-ui/.next/static/chunks/4690-df4b1a152d4a32fa.js +0 -1
  289. package/.next/standalone/agents-manage-ui/.next/static/chunks/4773-c967811882d19608.js +0 -1
  290. package/.next/standalone/agents-manage-ui/.next/static/chunks/5016-5212df5572c00450.js +0 -1
  291. package/.next/standalone/agents-manage-ui/.next/static/chunks/5200-a92c33fc465d2ed6.js +0 -1
  292. package/.next/standalone/agents-manage-ui/.next/static/chunks/5397-82d7c4a0c636b60e.js +0 -1
  293. package/.next/standalone/agents-manage-ui/.next/static/chunks/5622-a114b4dae45882c2.js +0 -1
  294. package/.next/standalone/agents-manage-ui/.next/static/chunks/6329-2f2d0a0417a77117.js +0 -2
  295. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-a7da874c33afd560.js +0 -1
  296. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-84a6a1036d4ad8b9.js +0 -1
  297. package/.next/standalone/agents-manage-ui/.next/static/chunks/7210-ed4b9b414a7bf114.js +0 -1
  298. package/.next/standalone/agents-manage-ui/.next/static/chunks/7305-aac20b5da6ee7f39.js +0 -1
  299. package/.next/standalone/agents-manage-ui/.next/static/chunks/7394-b444a34c3232ffe7.js +0 -1
  300. package/.next/standalone/agents-manage-ui/.next/static/chunks/7674-b1c4e03f250a7863.js +0 -1
  301. package/.next/standalone/agents-manage-ui/.next/static/chunks/7994-95135bda825a0b62.js +0 -1
  302. package/.next/standalone/agents-manage-ui/.next/static/chunks/8003-a114b4dae45882c2.js +0 -1
  303. package/.next/standalone/agents-manage-ui/.next/static/chunks/8246-7cc0530a582c679b.js +0 -1
  304. package/.next/standalone/agents-manage-ui/.next/static/chunks/8831-3568b9a5c520254b.js +0 -1
  305. package/.next/standalone/agents-manage-ui/.next/static/chunks/9098-b626908a872b75eb.js +0 -2
  306. package/.next/standalone/agents-manage-ui/.next/static/chunks/9773-05b506b28d6e39a2.js +0 -25
  307. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-a77bea18c2ec4ddf.js +0 -1
  308. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-bd3483f62fc4cfa6.js +0 -1
  309. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/loading-f16e83f5a76314a9.js +0 -1
  310. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-bd3483f62fc4cfa6.js +0 -1
  311. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-ab237a58ec5484e3.js +0 -1
  312. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-43fa3e7cf1f000d9.js +0 -1
  313. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/loading-f16e83f5a76314a9.js +0 -1
  314. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-43fa3e7cf1f000d9.js +0 -1
  315. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-2f2f306471f494fb.js +0 -1
  316. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-c8a3cd07bfba729e.js +0 -1
  317. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-7917e532e48d68bc.js +0 -1
  318. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/page-f16e83f5a76314a9.js +0 -1
  319. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-bf4c5ee1fcd0a1f8.js +0 -1
  320. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/page-38d3932163173796.js +0 -1
  321. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-f6d7e7f8ecab1e3c.js +0 -1
  322. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/loading-2868de136b155d0e.js +0 -1
  323. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page-d6f01d6d7fe69cea.js +0 -1
  324. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/loading-f16e83f5a76314a9.js +0 -1
  325. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/page-0d87ce40bb16c1de.js +0 -1
  326. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout-2868de136b155d0e.js +0 -1
  327. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/page-e7510fbf0b60102e.js +0 -1
  328. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-d6e247dbe00dedc9.js +0 -1
  329. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/ai-calls/page-597f4ccaf9557e60.js +0 -1
  330. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-64699c02792faa9e.js +0 -1
  331. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/loading-f16e83f5a76314a9.js +0 -1
  332. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-f8a28b248b84c95c.js +0 -1
  333. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-113eab9fed572fa2.js +0 -1
  334. package/.next/standalone/agents-manage-ui/.next/static/css/e970895dc785a75c.css +0 -1
  335. /package/.next/standalone/agents-manage-ui/.next/static/{5x4YI62SrSI7BFnjIZTQf → YQiRd4Be9CAfAPdCkur2K}/_buildManifest.js +0 -0
  336. /package/.next/standalone/agents-manage-ui/.next/static/{5x4YI62SrSI7BFnjIZTQf → YQiRd4Be9CAfAPdCkur2K}/_ssgManifest.js +0 -0
@@ -0,0 +1,245 @@
1
+ import { type FC, type RefObject, useEffect, useImperativeHandle, useMemo, useRef } from 'react';
2
+ import { autocompletion, type CompletionSource, startCompletion } from '@codemirror/autocomplete';
3
+ import { Decoration, ViewPlugin, EditorView, type DecorationSet } from '@codemirror/view';
4
+ import { linter, type Diagnostic } from '@codemirror/lint';
5
+ import { duotoneDark, duotoneLight } from '@uiw/codemirror-theme-duotone';
6
+ import CodeMirror, {
7
+ type ReactCodeMirrorProps,
8
+ type Range,
9
+ type ReactCodeMirrorRef,
10
+ } from '@uiw/react-codemirror';
11
+ import { useTheme } from 'next-themes';
12
+ import { cn } from '@/lib/utils';
13
+ import { getContextSuggestions } from '@/lib/context-suggestions';
14
+ import { useGraphStore } from '@/features/graph/state/use-graph-store';
15
+
16
+ // Decoration for template variables
17
+ const templateVariableDecoration = Decoration.mark({
18
+ class: 'cm-template-variable',
19
+ });
20
+
21
+ // Plugin to highlight template variables
22
+ const templateVariablePlugin = ViewPlugin.fromClass(
23
+ class {
24
+ decorations: DecorationSet;
25
+
26
+ constructor(view: EditorView) {
27
+ this.decorations = this.buildDecorations(view);
28
+ }
29
+
30
+ update(update: any) {
31
+ if (update.docChanged) {
32
+ this.decorations = this.buildDecorations(update.view);
33
+ }
34
+ }
35
+
36
+ buildDecorations(view: EditorView): DecorationSet {
37
+ const decorations: Range<Decoration>[] = [];
38
+ const regex = /\{\{([^}]+)}}/g;
39
+
40
+ for (let i = 0; i < view.state.doc.lines; i++) {
41
+ const line = view.state.doc.line(i + 1);
42
+ let match: RegExpExecArray | null;
43
+
44
+ while ((match = regex.exec(line.text)) !== null) {
45
+ const from = line.from + match.index;
46
+ const to = line.from + match.index + match[0].length;
47
+ decorations.push(templateVariableDecoration.range(from, to));
48
+ }
49
+ }
50
+
51
+ return Decoration.set(decorations);
52
+ }
53
+ },
54
+ {
55
+ decorations: (v) => v.decorations,
56
+ }
57
+ );
58
+
59
+ // Theme for template variables
60
+ const templateVariableTheme = EditorView.theme({
61
+ '& .cm-template-variable': {
62
+ color: '#e67e22', // Orange color for variables
63
+ fontWeight: 'bold',
64
+ },
65
+ '&.cm-dark .cm-template-variable': {
66
+ color: '#f39c12', // Lighter orange for dark theme
67
+ },
68
+ });
69
+
70
+ const RESERVED_KEYS = new Set(['$time', '$date', '$timestamp', '$now']);
71
+
72
+ function isJMESPathExpressions(key: string): boolean {
73
+ if (key.startsWith('length(')) {
74
+ return true;
75
+ }
76
+ return key.includes('[?') || key.includes('[*]');
77
+ }
78
+
79
+ // Create linter for template variable validation
80
+ function createTemplateVariableLinter(suggestions: string[]) {
81
+ return linter((view) => {
82
+ const diagnostics: Diagnostic[] = [];
83
+ const validVariables = new Set(suggestions);
84
+ const regex = /\{\{([^}]+)}}/g;
85
+
86
+ for (let i = 0; i < view.state.doc.lines; i++) {
87
+ const line = view.state.doc.line(i + 1);
88
+ let match: RegExpExecArray | null;
89
+
90
+ while ((match = regex.exec(line.text)) !== null) {
91
+ const from = line.from + match.index;
92
+ const to = line.from + match.index + match[0].length;
93
+ const variableName = match[1];
94
+
95
+ // Check if variable is valid (in suggestions) or reserved
96
+ const isValid =
97
+ validVariables.has(variableName) ||
98
+ RESERVED_KEYS.has(variableName) ||
99
+ variableName.startsWith('$env.') ||
100
+ // Exclude arrays from linting, as they are indicated with [*] in the suggestions
101
+ variableName.includes('[') ||
102
+ isJMESPathExpressions(variableName);
103
+
104
+ if (!isValid) {
105
+ diagnostics.push({
106
+ from,
107
+ to,
108
+ severity: 'error',
109
+ message: `Unknown variable: ${variableName}`,
110
+ });
111
+ }
112
+ }
113
+ }
114
+
115
+ return diagnostics;
116
+ });
117
+ }
118
+
119
+ // Create autocomplete source for context variables
120
+ function createContextAutocompleteSource(suggestions: string[]): CompletionSource {
121
+ return (context) => {
122
+ const { state, pos } = context;
123
+ const line = state.doc.lineAt(pos);
124
+ const to = pos - line.from;
125
+ const textBefore = line.text.slice(0, to);
126
+ // Check if we're after a { character
127
+ const match = textBefore.match(/\{([^}]*)$/);
128
+ if (!match) return null;
129
+
130
+ const query = match[1].toLowerCase();
131
+ const filteredSuggestions = suggestions.filter((s) => s.toLowerCase().includes(query));
132
+ const nextChar = line.text[to];
133
+ return {
134
+ from: pos - match[1].length,
135
+ to: pos,
136
+ options: ['$env.', ...RESERVED_KEYS, ...filteredSuggestions].map((suggestion) => ({
137
+ label: suggestion,
138
+ apply: `{${suggestion}${nextChar === '}' ? '}' : '}}'}`, // insert `}}` at the end if next character is not `}`
139
+ })),
140
+ };
141
+ };
142
+ }
143
+
144
+ export interface TextareaWithSuggestionsProps extends Omit<ReactCodeMirrorProps, 'onChange'> {
145
+ onChange: (value: string) => void;
146
+ placeholder?: string;
147
+ disabled?: boolean;
148
+ readOnly?: boolean;
149
+ ref?: RefObject<{ insertTemplateVariable: () => void }>;
150
+ }
151
+
152
+ function tryJsonParse(json: string): object {
153
+ if (!json.trim()) {
154
+ return {};
155
+ }
156
+ try {
157
+ return JSON.parse(json);
158
+ } catch {}
159
+ return {};
160
+ }
161
+
162
+ export const PromptEditor: FC<TextareaWithSuggestionsProps> = ({
163
+ className,
164
+ value,
165
+ onChange,
166
+ placeholder,
167
+ disabled,
168
+ readOnly,
169
+ ref,
170
+ ...rest
171
+ }) => {
172
+ const editorRef = useRef<ReactCodeMirrorRef | null>(null);
173
+ const { resolvedTheme } = useTheme();
174
+ const isDark = resolvedTheme === 'dark';
175
+ useEffect(() => {
176
+ editorRef.current = new EditorView();
177
+ }, []);
178
+
179
+ useImperativeHandle(ref, () => ({
180
+ insertTemplateVariable() {
181
+ const view = editorRef.current?.view;
182
+ if (!view) {
183
+ return;
184
+ }
185
+ const { doc, selection } = view.state;
186
+ // If there's a caret, insert at caret; otherwise, fall back to end of the current line.
187
+ const insertPos = selection.main.empty ? selection.main.head : doc.line(doc.lines).to;
188
+ // Insert "{}" and put the cursor between
189
+ view.dispatch({
190
+ changes: { from: insertPos, to: insertPos, insert: '{}' },
191
+ selection: { anchor: insertPos + 1 },
192
+ scrollIntoView: true,
193
+ });
194
+ startCompletion(view);
195
+ },
196
+ }));
197
+
198
+ const contextConfig = useGraphStore((state) => state.metadata.contextConfig);
199
+
200
+ const extensions = useMemo(() => {
201
+ const contextVariables = tryJsonParse(contextConfig.contextVariables);
202
+ const requestContextSchema = tryJsonParse(contextConfig.requestContextSchema);
203
+ const suggestions = getContextSuggestions({
204
+ requestContextSchema,
205
+ // @ts-expect-error -- todo: improve type
206
+ contextVariables,
207
+ });
208
+ return [
209
+ autocompletion({
210
+ override: [createContextAutocompleteSource(suggestions)],
211
+ compareCompletions(_a, _b) {
212
+ // Disable default localCompare sorting
213
+ return -1;
214
+ },
215
+ }),
216
+ templateVariablePlugin,
217
+ templateVariableTheme,
218
+ createTemplateVariableLinter(suggestions),
219
+ ];
220
+ }, [contextConfig]);
221
+
222
+ return (
223
+ <CodeMirror
224
+ ref={editorRef}
225
+ {...rest}
226
+ value={value || ''}
227
+ onChange={onChange}
228
+ extensions={extensions}
229
+ theme={isDark ? duotoneDark : duotoneLight}
230
+ placeholder={placeholder}
231
+ editable={!disabled && !readOnly}
232
+ basicSetup={{
233
+ lineNumbers: false,
234
+ foldGutter: false,
235
+ highlightActiveLine: false,
236
+ }}
237
+ data-disabled={disabled ? '' : undefined}
238
+ data-read-only={readOnly ? '' : undefined}
239
+ className={cn(
240
+ 'h-full [&>.cm-editor]:max-h-[inherit] [&>.cm-editor]:!bg-transparent dark:[&>.cm-editor]:!bg-input/30 [&>.cm-editor]:!outline-none [&>.cm-editor]:rounded-[7px] [&>.cm-editor]:px-3 [&>.cm-editor]:py-2 leading-2 text-xs font-mono rounded-md border border-input shadow-xs transition-[color,box-shadow] data-disabled:cursor-not-allowed data-disabled:opacity-50 data-disabled:bg-muted data-invalid:border-destructive has-[.cm-focused]:border-ring has-[.cm-focused]:ring-ring/50 has-[.cm-focused]:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
241
+ className
242
+ )}
243
+ />
244
+ );
245
+ };
@@ -26,7 +26,7 @@ import {
26
26
  extractGraphMetadata,
27
27
  serializeGraphData,
28
28
  } from '@/features/graph/domain';
29
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
29
+ import { useGraphActions, useGraphStore } from '@/features/graph/state/use-graph-store';
30
30
  import { useGraphShortcuts } from '@/features/graph/ui/use-graph-shortcuts';
31
31
  import { useGraphErrors } from '@/hooks/use-graph-errors';
32
32
  import { useSidePane } from '@/hooks/use-side-pane';
@@ -180,20 +180,22 @@ function Flow({
180
180
  }, [graph?.agents]);
181
181
 
182
182
  const { screenToFlowPosition, updateNodeData, fitView } = useReactFlow();
183
+ const { storeNodes, edges, metadata } = useGraphStore((state) => ({
184
+ storeNodes: state.nodes,
185
+ edges: state.edges,
186
+ metadata: state.metadata,
187
+ }));
183
188
  const {
184
- nodes: storeNodes,
185
- edges,
186
189
  setNodes,
187
190
  setEdges,
188
191
  onNodesChange,
189
192
  onEdgesChange,
190
- metadata,
191
193
  setMetadata,
192
194
  setInitial,
193
195
  markSaved,
194
196
  clearSelection,
195
197
  markUnsaved,
196
- } = useGraphStore();
198
+ } = useGraphActions();
197
199
 
198
200
  // Always use enriched nodes for ReactFlow
199
201
  const nodes = useMemo(() => enrichNodes(storeNodes), [storeNodes, enrichNodes]);
@@ -46,8 +46,10 @@ export function AgentNode(props: NodeProps & { data: AgentNodeData }) {
46
46
  const { name, isDefault, description, models } = data;
47
47
  const modelName = models?.base?.model;
48
48
 
49
- const dataComponentLookup = useGraphStore((state) => state.dataComponentLookup);
50
- const artifactComponentLookup = useGraphStore((state) => state.artifactComponentLookup);
49
+ const { dataComponentLookup, artifactComponentLookup } = useGraphStore((state) => ({
50
+ dataComponentLookup: state.dataComponentLookup,
51
+ artifactComponentLookup: state.artifactComponentLookup,
52
+ }));
51
53
  const { getNodeErrors, hasNodeErrors } = useGraphErrors();
52
54
 
53
55
  // Use the agent ID from node data if available, otherwise fall back to React Flow node ID
@@ -12,9 +12,11 @@ const TOOLS_SHOWN_LIMIT = 4;
12
12
 
13
13
  export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
14
14
  const { data, selected } = props;
15
- const toolLookup = useGraphStore((state) => state.toolLookup);
16
- const agentToolConfigLookup = useGraphStore((state) => state.agentToolConfigLookup);
17
- const edges = useGraphStore((state) => state.edges);
15
+ const { toolLookup, agentToolConfigLookup, edges } = useGraphStore((state) => ({
16
+ toolLookup: state.toolLookup,
17
+ agentToolConfigLookup: state.agentToolConfigLookup,
18
+ edges: state.edges,
19
+ }));
18
20
 
19
21
  const name = data.name || `Tool: ${data.toolId}`;
20
22
  const imageUrl = data.imageUrl;
@@ -3,7 +3,7 @@ import { Spline } from 'lucide-react';
3
3
  import { DashedSplineIcon } from '@/components/icons/dashed-spline';
4
4
  import { Checkbox } from '@/components/ui/checkbox';
5
5
  import { Label } from '@/components/ui/label';
6
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
6
+ import { useGraphActions } from '@/features/graph/state/use-graph-store';
7
7
  import type { A2AEdgeData } from '../../configuration/edge-types';
8
8
 
9
9
  type RelationshipOptionProps = {
@@ -75,7 +75,7 @@ function EdgeEditor({ selectedEdge }: EdgeEditorProps) {
75
75
  const { updateEdgeData, setEdges } = useReactFlow();
76
76
  const sourceNode = useNodesData(selectedEdge.source);
77
77
  const targetNode = useNodesData(selectedEdge.target);
78
- const markUnsaved = useGraphStore((state) => state.markUnsaved);
78
+ const { markUnsaved } = useGraphActions();
79
79
 
80
80
  // Check if this is a self-loop (source and target are the same)
81
81
  const isSelfLoop = selectedEdge.source === selectedEdge.target;
@@ -19,7 +19,7 @@ import { Separator } from '@/components/ui/separator';
19
19
  import { Textarea } from '@/components/ui/textarea';
20
20
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
21
21
  import { useRuntimeConfig } from '@/contexts/runtime-config-context';
22
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
22
+ import { useGraphActions, useGraphStore } from '@/features/graph/state/use-graph-store';
23
23
  import { useAutoPrefillIdZustand } from '@/hooks/use-auto-prefill-id-zustand';
24
24
  import { useProjectData } from '@/hooks/use-project-data';
25
25
  import { CollapsibleSettings } from '../collapsible-settings';
@@ -64,7 +64,7 @@ function MetadataEditor() {
64
64
  // Fetch project data for inheritance indicators
65
65
  const { project } = useProjectData();
66
66
 
67
- const { markUnsaved, setMetadata } = useGraphStore();
67
+ const { markUnsaved, setMetadata } = useGraphActions();
68
68
 
69
69
  const updateMetadata: typeof setMetadata = useCallback(
70
70
  (...attrs) => {
@@ -148,10 +148,9 @@ function MetadataEditor() {
148
148
  <div className="space-y-2">
149
149
  <ExpandableTextArea
150
150
  id="graph-prompt"
151
- name="graph-prompt"
152
151
  label="Graph prompt"
153
152
  value={graphPrompt || ''}
154
- onChange={(e) => updateMetadata('graphPrompt', e.target.value)}
153
+ onChange={(value) => updateMetadata('graphPrompt', value)}
155
154
  placeholder="System-level instructions for this graph..."
156
155
  className="max-h-96"
157
156
  />
@@ -135,11 +135,9 @@ export function AgentNodeEditor({
135
135
 
136
136
  <div className="space-y-2">
137
137
  <ExpandableTextArea
138
- ref={(el) => setFieldRef('prompt', el)}
139
138
  id="prompt"
140
- name="prompt"
141
139
  value={selectedNode.data.prompt || ''}
142
- onChange={(e) => updatePath('prompt', e.target.value)}
140
+ onChange={(value) => updatePath('prompt', value)}
143
141
  placeholder="You are a helpful assistant..."
144
142
  data-invalid={errorHelpers?.hasFieldError('prompt') ? '' : undefined}
145
143
  className="w-full max-h-96 data-invalid:border-red-300 data-invalid:focus-visible:border-red-300 data-invalid:focus-visible:ring-red-300"
@@ -159,7 +157,7 @@ export function AgentNodeEditor({
159
157
  />
160
158
  <Separator />
161
159
  {/* Agent Execution Limits */}
162
- <div className="space-y-8 ">
160
+ <div className="space-y-8">
163
161
  <SectionHeader
164
162
  title="Execution limits"
165
163
  description="Configure agent-level execution limits for steps within this agent."
@@ -1,32 +1,72 @@
1
+ import { type FC, type RefObject, useRef, type ComponentProps } from 'react';
1
2
  import { ExpandableField } from '@/components/form/expandable-field';
2
- import { Textarea } from '@/components/ui/textarea';
3
- import { useCursorToEnd } from '@/hooks/use-cursor-to-end';
3
+ import { Button } from '@/components/ui/button';
4
+ import { Braces } from 'lucide-react';
5
+ import { TooltipTrigger, Tooltip, TooltipContent } from '@/components/ui/tooltip';
6
+ import { PromptEditor } from '@/components/form/prompt-editor';
7
+ import { cn } from '@/lib/utils';
4
8
 
5
- function ExpandedTextArea({ ...props }) {
6
- const textareaRef = useCursorToEnd<HTMLTextAreaElement>();
9
+ // Extract inner type from RefObject<T>
10
+ type RefValue<T> = T extends RefObject<infer R> ? R : never;
7
11
 
12
+ const PromptEditorWithAddVariables: FC<
13
+ ComponentProps<typeof PromptEditor> & {
14
+ tooltipClassName: string;
15
+ }
16
+ > = ({ tooltipClassName, ...props }) => {
17
+ const codemirrorRef = useRef<RefValue<typeof props.ref>>(null!);
18
+ const variablesText = 'Add variables';
8
19
  return (
9
- <Textarea
10
- {...props}
11
- ref={textareaRef}
12
- className="w-full max-h-full resize-none h-full"
13
- autoFocus
14
- />
20
+ <div className="h-full relative">
21
+ <PromptEditor ref={codemirrorRef} {...props} />
22
+ <Tooltip>
23
+ <TooltipTrigger asChild>
24
+ <Button
25
+ variant="ghost"
26
+ size="icon"
27
+ className={cn(
28
+ 'absolute bottom-2.5 h-6 w-6 hover:text-foreground transition-all backdrop-blur-sm bg-white/90 hover:bg-white/95 dark:bg-card dark:hover:bg-accent border border-border shadow-md dark:shadow-lg',
29
+ tooltipClassName
30
+ )}
31
+ type="button"
32
+ onClick={() => {
33
+ codemirrorRef.current.insertTemplateVariable();
34
+ }}
35
+ >
36
+ <Braces className="h-4 w-4 text-muted-foreground" />
37
+ <span className="sr-only">{variablesText}</span>
38
+ </Button>
39
+ </TooltipTrigger>
40
+ <TooltipContent>
41
+ {variablesText}
42
+ </TooltipContent>
43
+ </Tooltip>
44
+ </div>
15
45
  );
16
- }
46
+ };
17
47
 
18
48
  export function ExpandableTextArea({
19
49
  label,
20
50
  isRequired = false,
21
51
  ...props
22
- }: { label: string; isRequired?: boolean } & React.ComponentProps<typeof Textarea>) {
52
+ }: {
53
+ label: string;
54
+ isRequired?: boolean;
55
+ } & React.ComponentProps<typeof PromptEditor>) {
23
56
  return (
24
57
  <ExpandableField
25
58
  name={props.id || 'expandable-textarea'}
26
59
  label={label}
27
60
  isRequired={isRequired}
28
- compactView={<Textarea {...props} />}
29
- expandedView={<ExpandedTextArea {...props} />}
61
+ compactView={<PromptEditorWithAddVariables {...props} tooltipClassName="right-10" />}
62
+ expandedView={
63
+ <PromptEditorWithAddVariables
64
+ {...props}
65
+ autoFocus
66
+ className="[&>.cm-editor]:h-full"
67
+ tooltipClassName="right-2.5"
68
+ />
69
+ }
30
70
  />
31
71
  );
32
72
  }
@@ -10,7 +10,7 @@ import { ExternalLink } from '@/components/ui/external-link';
10
10
  import { Input } from '@/components/ui/input';
11
11
  import { Label } from '@/components/ui/label';
12
12
  import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
13
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
13
+ import { useGraphActions, useGraphStore } from '@/features/graph/state/use-graph-store';
14
14
  import { getToolTypeAndName } from '@/lib/utils/mcp-utils';
15
15
  import {
16
16
  getCurrentHeadersForNode,
@@ -33,11 +33,13 @@ export function MCPServerNodeEditor({
33
33
  tenantId: string;
34
34
  projectId: string;
35
35
  }>();
36
- const markUnsaved = useGraphStore((state) => state.markUnsaved);
36
+ const { markUnsaved } = useGraphActions();
37
37
 
38
38
  // Only use toolLookup - single source of truth
39
- const toolLookup = useGraphStore((state) => state.toolLookup);
40
- const edges = useGraphStore((state) => state.edges);
39
+ const { toolLookup, edges } = useGraphStore((state) => ({
40
+ toolLookup: state.toolLookup,
41
+ edges: state.edges,
42
+ }));
41
43
 
42
44
  const getCurrentHeaders = useCallback((): Record<string, string> => {
43
45
  return getCurrentHeadersForNode(selectedNode, agentToolConfigLookup, edges);
@@ -12,7 +12,7 @@ export const defaultValues: ProjectFormData = {
12
12
  models: {
13
13
  base: {
14
14
  model: DEFAULT_ANTHROPIC_BASE_MODEL,
15
- providerOptions: {},
15
+ providerOptions: undefined,
16
16
  },
17
17
  structuredOutput: {
18
18
  model: DEFAULT_ANTHROPIC_STRUCTURED_OUTPUT_MODEL,
@@ -34,9 +34,9 @@ const serializeData = (data: ProjectFormData) => {
34
34
  };
35
35
 
36
36
  const cleanStopWhen = (stopWhen: any) => {
37
- // If stopWhen is null, undefined, or empty object, return undefined
37
+ // If stopWhen is null, undefined, or empty object, return empty object (undefined will not update the field)
38
38
  if (!stopWhen || (typeof stopWhen === 'object' && Object.keys(stopWhen).length === 0)) {
39
- return undefined;
39
+ return {};
40
40
  }
41
41
 
42
42
  // Clean the individual properties - remove null/undefined values
@@ -48,9 +48,9 @@ const serializeData = (data: ProjectFormData) => {
48
48
  cleaned.stepCountIs = stopWhen.stepCountIs;
49
49
  }
50
50
 
51
- // If no valid properties, return undefined
51
+ // If no valid properties, return empty object (undefined will not update the field)
52
52
  if (Object.keys(cleaned).length === 0) {
53
- return undefined;
53
+ return {};
54
54
  }
55
55
 
56
56
  return cleaned;
@@ -81,6 +81,15 @@ const serializeData = (data: ProjectFormData) => {
81
81
  };
82
82
  };
83
83
 
84
+ const createDefaultValues = (initialData?: ProjectFormData) => {
85
+ return {
86
+ ...initialData,
87
+ // Handle null values from database - if an object field is null, validation will fail so we need to set it to an empty object
88
+ stopWhen: initialData?.stopWhen || {},
89
+ models: initialData?.models || { base: { model: '', providerOptions: null } },
90
+ };
91
+ };
92
+
84
93
  export function ProjectForm({
85
94
  tenantId,
86
95
  projectId,
@@ -90,10 +99,7 @@ export function ProjectForm({
90
99
  }: ProjectFormProps) {
91
100
  const form = useForm<ProjectFormData>({
92
101
  resolver: zodResolver(projectSchema),
93
- defaultValues: {
94
- ...defaultValues,
95
- ...initialData,
96
- },
102
+ defaultValues: initialData ? createDefaultValues(initialData) : { ...defaultValues },
97
103
  });
98
104
 
99
105
  const { isSubmitting } = form.formState;
@@ -1,7 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { ChevronRight, Info } from 'lucide-react';
4
- import { type Control, useController, useWatch } from 'react-hook-form';
4
+ import { useEffect, useState } from 'react';
5
+ import { type Control, useController, useFormState, useWatch } from 'react-hook-form';
5
6
  import { ExpandableJsonEditor } from '@/components/form/expandable-json-editor';
6
7
  import { FormFieldWrapper } from '@/components/form/form-field-wrapper';
7
8
  import { ModelSelector } from '@/components/graph/sidepane/nodes/model-selector';
@@ -179,6 +180,25 @@ function SummarizerModelSection({ control }: { control: Control<ProjectFormData>
179
180
  }
180
181
 
181
182
  export function ProjectModelsSection({ control }: ProjectModelsSectionProps) {
183
+ const [isOpen, setIsOpen] = useState(false);
184
+ const { errors } = useFormState({ control });
185
+
186
+ const hasModelsErrors = !!(
187
+ errors.models?.base?.model ||
188
+ errors.models?.base?.providerOptions ||
189
+ errors.models?.structuredOutput?.model ||
190
+ errors.models?.structuredOutput?.providerOptions ||
191
+ errors.models?.summarizer?.model ||
192
+ errors.models?.summarizer?.providerOptions
193
+ );
194
+
195
+ // Auto-open the collapsible when there are errors in the models section
196
+ useEffect(() => {
197
+ if (hasModelsErrors) {
198
+ setIsOpen(true);
199
+ }
200
+ }, [hasModelsErrors]);
201
+
182
202
  return (
183
203
  <div className="space-y-4">
184
204
  <div>
@@ -188,7 +208,11 @@ export function ProjectModelsSection({ control }: ProjectModelsSectionProps) {
188
208
  </p>
189
209
  </div>
190
210
 
191
- <Collapsible defaultOpen={false} className="border rounded-md bg-background">
211
+ <Collapsible
212
+ open={isOpen}
213
+ onOpenChange={setIsOpen}
214
+ className="border rounded-md bg-background"
215
+ >
192
216
  <CollapsibleTrigger asChild>
193
217
  <Button
194
218
  type="button"
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { ChevronRight, Info } from 'lucide-react';
4
+ import { useEffect, useState } from 'react';
4
5
  import type { Control } from 'react-hook-form';
5
- import { useWatch } from 'react-hook-form';
6
+ import { useFormState, useWatch } from 'react-hook-form';
6
7
  import { GenericInput } from '@/components/form/generic-input';
7
8
  import { Button } from '@/components/ui/button';
8
9
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';
@@ -18,6 +19,17 @@ export function ProjectStopWhenSection({ control }: ProjectStopWhenSectionProps)
18
19
  // Check if any stopWhen values are configured to determine default open state
19
20
  const stopWhen = useWatch({ control, name: 'stopWhen' });
20
21
  const hasConfiguredStopWhen = !!(stopWhen?.transferCountIs || stopWhen?.stepCountIs);
22
+ const [isOpen, setIsOpen] = useState(hasConfiguredStopWhen);
23
+
24
+ const { errors } = useFormState({ control });
25
+ const hasStopWhenErrors = !!(errors.stopWhen?.transferCountIs || errors.stopWhen?.stepCountIs);
26
+
27
+ // Auto-open the collapsible when there are errors in the stopWhen section
28
+ useEffect(() => {
29
+ if (hasStopWhenErrors) {
30
+ setIsOpen(true);
31
+ }
32
+ }, [hasStopWhenErrors]);
21
33
 
22
34
  return (
23
35
  <div className="space-y-4">
@@ -28,7 +40,11 @@ export function ProjectStopWhenSection({ control }: ProjectStopWhenSectionProps)
28
40
  </p>
29
41
  </div>
30
42
 
31
- <Collapsible defaultOpen={hasConfiguredStopWhen} className="border rounded-md bg-background">
43
+ <Collapsible
44
+ open={isOpen}
45
+ onOpenChange={setIsOpen}
46
+ className="border rounded-md bg-background"
47
+ >
32
48
  <CollapsibleTrigger asChild>
33
49
  <Button
34
50
  type="button"