@inkeep/agents-manage-ui 0.12.1 → 0.14.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 (221) 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 +207 -211
  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 +5 -5
  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 +2 -2
  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 +2 -2
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +3 -3
  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_client-reference-manifest.js +1 -1
  94. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  96. package/.next/standalone/agents-manage-ui/.next/server/app/page.js.nft.json +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +6 -6
  99. package/.next/standalone/agents-manage-ui/.next/server/chunks/1167.js +1 -0
  100. package/.next/standalone/agents-manage-ui/.next/server/chunks/2415.js +1 -0
  101. package/.next/standalone/agents-manage-ui/.next/server/chunks/{292.js → 245.js} +11 -11
  102. package/.next/standalone/agents-manage-ui/.next/server/chunks/2539.js +13 -13
  103. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  104. package/.next/standalone/agents-manage-ui/.next/server/chunks/4843.js +1 -0
  105. package/.next/standalone/agents-manage-ui/.next/server/chunks/5495.js +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/server/chunks/6212.js +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/server/chunks/6229.js +1 -0
  108. package/.next/standalone/agents-manage-ui/.next/server/chunks/{8096.js → 6398.js} +1 -1
  109. package/.next/standalone/agents-manage-ui/.next/server/chunks/6525.js +4087 -0
  110. package/.next/standalone/agents-manage-ui/.next/server/chunks/6747.js +4 -4
  111. package/.next/standalone/agents-manage-ui/.next/server/chunks/7090.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/server/chunks/7346.js +1 -0
  113. package/.next/standalone/agents-manage-ui/.next/server/chunks/7863.js +1 -0
  114. package/.next/standalone/agents-manage-ui/.next/server/chunks/8100.js +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/server/chunks/8610.js +25 -1
  116. package/.next/standalone/agents-manage-ui/.next/server/chunks/9340.js +1 -0
  117. package/.next/standalone/agents-manage-ui/.next/server/chunks/{5546.js → 9516.js} +1 -1
  118. package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
  119. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  120. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  121. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  122. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  123. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/{1064-f747155da2f9bf6e.js → 1064-3586ea45cf5c5379.js} +1 -1
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/1275-a8d88b014d15f391.js +1 -0
  126. package/.next/standalone/agents-manage-ui/.next/static/chunks/1558-20a9339c3529c948.js +1 -0
  127. package/.next/standalone/agents-manage-ui/.next/static/chunks/2063-5b4fb2ded7adef46.js +1 -0
  128. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-2a72e838c6240f76.js +1 -0
  129. package/.next/standalone/agents-manage-ui/.next/static/chunks/6501-2c90923d1b2f0f3e.js +1 -0
  130. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-157d248cc421c09a.js +1 -0
  131. package/.next/standalone/agents-manage-ui/.next/static/chunks/7305-4bde6b1356d61f7a.js +1 -0
  132. package/.next/standalone/agents-manage-ui/.next/static/chunks/{7352.9b2a8a672084bdf6.js → 7352.47444c26a143a75f.js} +1 -1
  133. package/.next/standalone/agents-manage-ui/.next/static/chunks/8130-c153c48b1fab6cb4.js +1 -0
  134. package/.next/standalone/agents-manage-ui/.next/static/chunks/{6443-dd27c846ef650d0a.js → 8486-01fbe9371d862c28.js} +6 -6
  135. package/.next/standalone/agents-manage-ui/.next/static/chunks/8831-e31bd19e515f8efd.js +1 -0
  136. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-1de478ef776542f5.js +1 -0
  137. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/{page-61379a8d1c1a9ca1.js → page-005fb6baca480791.js} +1 -1
  138. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/{page-61379a8d1c1a9ca1.js → page-005fb6baca480791.js} +1 -1
  139. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{page-a6cfdce0698bfa2c.js → page-32fcf925e22bffde.js} +1 -1
  140. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/{page-b16426d953306ee7.js → page-3c5b276b763f1361.js} +1 -1
  141. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/{page-b16426d953306ee7.js → page-3c5b276b763f1361.js} +1 -1
  142. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-681b96a28f27bfad.js +1 -0
  143. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/{page-7cfa34591d1a6acd.js → page-afa97403afe44ea3.js} +1 -1
  144. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-8e28892ce18b7605.js +1 -0
  145. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-b06c77bd874024bb.js +1 -0
  146. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-08fc17f254e5278e.js → page-b1977dfdbd7eaeb3.js} +1 -1
  147. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page-21f1392ae65ea31a.js +1 -0
  148. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/page-b7ee3944e6a5c03d.js +1 -0
  149. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-941f95225d71f8b5.js +1 -0
  150. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-8ce40458e68f1441.js → page-4498950740edb744.js} +1 -1
  151. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/page-f34ada0e40bb0f1a.js +1 -0
  152. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-7f6d40ae3f2fd925.js +1 -0
  153. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/not-found-f95764dcfe0e1e9d.js +1 -0
  154. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-5a7b693a09f13234.js → page-373cff59531c6b45.js} +1 -1
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-506bd20e106e26e3.js +1 -0
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-7989cf35493dd2a2.js +1 -0
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-db7d3541e54a712c.js +1 -0
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-b20dc8e12f728891.js → webpack-eada866d0a3f0f14.js} +1 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/css/ff74e9dcb72fa41b.css +1 -0
  160. package/.next/standalone/agents-manage-ui/package.json +4 -1
  161. package/.next/standalone/package.json +1 -0
  162. package/.next/standalone/packages/agents-core/package.json +1 -1
  163. package/package.json +7 -4
  164. package/src/components/form/expandable-field.tsx +17 -11
  165. package/src/components/form/generic-input.tsx +2 -2
  166. package/src/components/form/prompt-editor.tsx +245 -0
  167. package/src/components/graph/graph.tsx +7 -5
  168. package/src/components/graph/nodes/agent-node.tsx +4 -2
  169. package/src/components/graph/nodes/mcp-node.tsx +5 -3
  170. package/src/components/graph/sidepane/edges/edge-editor.tsx +2 -2
  171. package/src/components/graph/sidepane/metadata/metadata-editor.tsx +3 -4
  172. package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +2 -4
  173. package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +54 -14
  174. package/src/components/graph/sidepane/nodes/mcp-node-editor.tsx +6 -4
  175. package/src/components/graph/toolbar/toolbar.tsx +19 -0
  176. package/src/components/projects/form/form-configuration.ts +1 -1
  177. package/src/components/projects/form/project-form.tsx +14 -8
  178. package/src/components/projects/form/project-models-section.tsx +26 -2
  179. package/src/components/projects/form/project-stopwhen-section.tsx +18 -2
  180. package/src/components/projects/form/validation.ts +13 -4
  181. package/src/components/projects/project-item.tsx +2 -1
  182. package/src/components/traces/timeline/timeline-wrapper.tsx +2 -2
  183. package/src/features/graph/commands/commands.ts +24 -24
  184. package/src/features/graph/state/use-graph-store.ts +199 -172
  185. package/src/features/graph/ui/use-graph-shortcuts.ts +2 -2
  186. package/src/hooks/use-graph-errors.ts +7 -9
  187. package/src/hooks/use-node-editor.ts +4 -4
  188. package/src/lib/__tests__/context-suggestions.test.ts +205 -0
  189. package/src/lib/context-suggestions.ts +102 -0
  190. package/src/lib/utils.ts +4 -0
  191. package/.next/standalone/agents-manage-ui/.next/server/chunks/1156.js +0 -1
  192. package/.next/standalone/agents-manage-ui/.next/server/chunks/3859.js +0 -25
  193. package/.next/standalone/agents-manage-ui/.next/server/chunks/5232.js +0 -1
  194. package/.next/standalone/agents-manage-ui/.next/server/chunks/6114.js +0 -4087
  195. package/.next/standalone/agents-manage-ui/.next/server/chunks/6997.js +0 -1
  196. package/.next/standalone/agents-manage-ui/.next/server/chunks/8298.js +0 -1
  197. package/.next/standalone/agents-manage-ui/.next/server/chunks/9812.js +0 -1
  198. package/.next/standalone/agents-manage-ui/.next/static/chunks/1558-cf7aef893a85469e.js +0 -1
  199. package/.next/standalone/agents-manage-ui/.next/static/chunks/2063-00dd6285929e419a.js +0 -1
  200. package/.next/standalone/agents-manage-ui/.next/static/chunks/2616-afea50e929636181.js +0 -1
  201. package/.next/standalone/agents-manage-ui/.next/static/chunks/5635-a3e053f2a2633b0f.js +0 -1
  202. package/.next/standalone/agents-manage-ui/.next/static/chunks/6497-5a3efd5d17896e0b.js +0 -1
  203. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-d00c25860bc43555.js +0 -1
  204. package/.next/standalone/agents-manage-ui/.next/static/chunks/7305-80fb496a6a7b01cf.js +0 -1
  205. package/.next/standalone/agents-manage-ui/.next/static/chunks/8831-9d23a1d8c9fb3858.js +0 -1
  206. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-3e911bcedbdcc8b0.js +0 -1
  207. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-53ad78b81054c5f6.js +0 -1
  208. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-46c8e4772748bf3c.js +0 -1
  209. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-db65b50c3319a62c.js +0 -1
  210. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page-00765523b4cc6114.js +0 -1
  211. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/page-4791623af5ab27ea.js +0 -1
  212. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-b645d7373e4b7a62.js +0 -1
  213. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/page-2543a9b4438b0b03.js +0 -1
  214. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-15fba6cf333f2f2a.js +0 -1
  215. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/not-found-abb1f829baf33e89.js +0 -1
  216. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-c5a019309939d912.js +0 -1
  217. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-750a94d65d9266d6.js +0 -1
  218. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-c42ea39210c86d1d.js +0 -1
  219. package/.next/standalone/agents-manage-ui/.next/static/css/02016a706b2fdd40.css +0 -1
  220. /package/.next/standalone/agents-manage-ui/.next/static/{5LuVpO2ZOs-I6neEc3jpn → iLBcTp7vHsMdZImZWajUt}/_buildManifest.js +0 -0
  221. /package/.next/standalone/agents-manage-ui/.next/static/{5LuVpO2ZOs-I6neEc3jpn → iLBcTp7vHsMdZImZWajUt}/_ssgManifest.js +0 -0
@@ -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"
@@ -1,19 +1,28 @@
1
- import { StopWhenSchema } from '@inkeep/agents-core/client-exports';
2
1
  import { z } from 'zod';
3
2
 
4
3
  const modelSettingsSchema = z.object({
5
4
  model: z.string().optional(), // Allow empty model - system will fall back to defaults
6
- providerOptions: z.record(z.string(), z.any()).optional(),
5
+ providerOptions: z.record(z.string(), z.any()).optional().nullable(),
6
+ });
7
+
8
+ const baseModelSettingsSchema = z.object({
9
+ model: z.string().min(1, 'Base model is required'),
10
+ providerOptions: z.record(z.string(), z.any()).optional().nullable(),
7
11
  });
8
12
 
9
13
  const projectModelsSchema = z.object({
10
- base: modelSettingsSchema,
14
+ base: baseModelSettingsSchema,
11
15
  structuredOutput: modelSettingsSchema.optional(),
12
16
  summarizer: modelSettingsSchema.optional(),
13
17
  });
14
18
 
15
19
  // Use the shared StopWhen schema with optional and nullable modifiers
16
- const projectStopWhenSchema = StopWhenSchema.optional().nullable();
20
+ const projectStopWhenSchema = z
21
+ .object({
22
+ transferCountIs: z.number().min(1).max(100).optional().nullable(),
23
+ stepCountIs: z.number().min(1).max(1000).optional().nullable(),
24
+ })
25
+ .optional();
17
26
 
18
27
  export const projectSchema = z.object({
19
28
  id: z
@@ -11,6 +11,7 @@ import {
11
11
  ItemCardTitle,
12
12
  } from '@/components/ui/item-card';
13
13
  import type { Project } from '@/lib/types/project';
14
+ import type { ProjectFormData } from './form/validation';
14
15
  import { ProjectItemMenu } from './project-item-menu';
15
16
 
16
17
  export interface ProjectItemProps extends Project {
@@ -38,7 +39,7 @@ export function ProjectItem({
38
39
  </ItemCardLink>
39
40
  <ProjectItemMenu
40
41
  projectName={name}
41
- projectData={{ id: projectId, name, description, models, stopWhen }}
42
+ projectData={{ id: projectId, name, description, models, stopWhen } as ProjectFormData}
42
43
  tenantId={tenantId}
43
44
  />
44
45
  </ItemCardHeader>
@@ -101,9 +101,9 @@ function EmptyTimeline({
101
101
  <ExternalLink
102
102
  className="text-amber-700 dark:text-amber-300 dark:hover:text-amber-200 ml-0 mt-1"
103
103
  iconClassName="text-amber-700 dark:text-amber-300 dark:group-hover/link:text-amber-200"
104
- href={`${DOCS_BASE_URL}/quick-start/observability`}
104
+ href={`${DOCS_BASE_URL}/quick-start/traces`}
105
105
  >
106
- View observability setup guide
106
+ View traces setup guide
107
107
  </ExternalLink>
108
108
  </div>
109
109
  )}
@@ -2,7 +2,7 @@ import type { Connection, Edge, Node } from '@xyflow/react';
2
2
  import { addEdge } from '@xyflow/react';
3
3
  import { EdgeType } from '@/components/graph/configuration/edge-types';
4
4
  import type { GraphMetadata } from '@/components/graph/configuration/graph-types';
5
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
5
+ import { graphStore } from '@/features/graph/state/use-graph-store';
6
6
  import { eventBus } from '@/lib/events';
7
7
  import type { Command } from './command-manager';
8
8
 
@@ -13,25 +13,25 @@ export class AddNodeCommand implements Command {
13
13
  this.node = node;
14
14
  }
15
15
  execute() {
16
- const { setNodes } = useGraphStore.getState();
17
- setNodes((prev) => prev.concat(this.node));
16
+ const { actions } = graphStore.getState();
17
+ actions.setNodes((prev) => prev.concat(this.node));
18
18
  }
19
19
  undo() {
20
- const { setNodes } = useGraphStore.getState();
21
- setNodes((prev) => prev.filter((n) => n.id !== this.node.id));
20
+ const { actions } = graphStore.getState();
21
+ actions.setNodes((prev) => prev.filter((n) => n.id !== this.node.id));
22
22
  }
23
23
  }
24
24
 
25
25
  export class DeleteSelectionCommand implements Command {
26
26
  readonly name = 'DeleteSelection';
27
27
  execute() {
28
- const { deleteSelected } = useGraphStore.getState();
29
- deleteSelected();
28
+ const { actions } = graphStore.getState();
29
+ actions.deleteSelected();
30
30
  }
31
31
  undo() {
32
32
  // relies on store history; in a richer system we'd capture diffs
33
- const { undo } = useGraphStore.getState();
34
- undo();
33
+ const { actions } = graphStore.getState();
34
+ actions.undo();
35
35
  }
36
36
  }
37
37
 
@@ -43,8 +43,8 @@ export class ConnectEdgeCommand implements Command {
43
43
  this.connection = connection;
44
44
  }
45
45
  execute() {
46
- const { setEdges } = useGraphStore.getState();
47
- setEdges((eds) => {
46
+ const { actions } = graphStore.getState();
47
+ actions.setEdges((eds) => {
48
48
  const newEdges = addEdge(this.connection as any, eds);
49
49
  const last = newEdges[newEdges.length - 1];
50
50
  this.createdEdgeId = last?.id ?? null;
@@ -53,9 +53,9 @@ export class ConnectEdgeCommand implements Command {
53
53
  }
54
54
  undo() {
55
55
  if (!this.createdEdgeId) return;
56
- const { setEdges } = useGraphStore.getState();
56
+ const { actions } = graphStore.getState();
57
57
  const id = this.createdEdgeId;
58
- setEdges((eds) => eds.filter((e) => e.id !== id));
58
+ actions.setEdges((eds) => eds.filter((e) => e.id !== id));
59
59
  }
60
60
  }
61
61
 
@@ -69,21 +69,21 @@ export class UpdateMetadataCommand implements Command {
69
69
  this.value = value;
70
70
  }
71
71
  execute() {
72
- const { metadata, setMetadata } = useGraphStore.getState();
72
+ const { metadata, actions } = graphStore.getState();
73
73
  this.prev = metadata[this.field];
74
- setMetadata(this.field, this.value);
74
+ actions.setMetadata(this.field, this.value);
75
75
  }
76
76
  undo() {
77
- const { setMetadata } = useGraphStore.getState();
78
- setMetadata(this.field, this.prev as any);
77
+ const { actions } = graphStore.getState();
78
+ actions.setMetadata(this.field, this.prev as any);
79
79
  }
80
80
  }
81
81
 
82
82
  export class ClearSelectionCommand implements Command {
83
83
  readonly name = 'ClearSelection';
84
84
  execute() {
85
- const { clearSelection } = useGraphStore.getState();
86
- clearSelection();
85
+ const { actions } = graphStore.getState();
86
+ actions.clearSelection();
87
87
  }
88
88
  undo() {
89
89
  // no-op for now
@@ -99,12 +99,12 @@ export class AddPreparedEdgeCommand implements Command {
99
99
  this.deselectOtherEdgesIfA2A = Boolean(options?.deselectOtherEdgesIfA2A);
100
100
  }
101
101
  execute() {
102
- const { setEdges, setNodes } = useGraphStore.getState();
102
+ const { actions } = graphStore.getState();
103
103
  if (this.edge.type === EdgeType.A2A) {
104
104
  // deselect nodes when creating an A2A edge
105
- setNodes((nds) => nds.map((n) => ({ ...n, selected: false })));
105
+ actions.setNodes((nds) => nds.map((n) => ({ ...n, selected: false })));
106
106
  }
107
- setEdges((eds) => {
107
+ actions.setEdges((eds) => {
108
108
  if (eds.some((e) => e.id === this.edge.id)) return eds;
109
109
  const base =
110
110
  this.deselectOtherEdgesIfA2A && this.edge.type === EdgeType.A2A
@@ -116,8 +116,8 @@ export class AddPreparedEdgeCommand implements Command {
116
116
  });
117
117
  }
118
118
  undo() {
119
- const { setEdges } = useGraphStore.getState();
119
+ const { actions } = graphStore.getState();
120
120
  const id = this.edge.id;
121
- setEdges((eds) => eds.filter((e) => e.id !== id));
121
+ actions.setEdges((eds) => eds.filter((e) => e.id !== id));
122
122
  }
123
123
  }
@@ -9,6 +9,7 @@ import type { ArtifactComponent } from '@/lib/api/artifact-components';
9
9
  import type { DataComponent } from '@/lib/api/data-components';
10
10
  import type { MCPTool } from '@/lib/types/tools';
11
11
  import type { GraphErrorSummary } from '@/lib/utils/graph-error-parser';
12
+ import { useShallow } from 'zustand/react/shallow';
12
13
 
13
14
  type HistoryEntry = { nodes: Node[]; edges: Edge[] };
14
15
 
@@ -27,7 +28,7 @@ type GraphStateData = {
27
28
  showErrors: boolean;
28
29
  };
29
30
 
30
- type GraphState = GraphStateData & {
31
+ type GraphActions = {
31
32
  setInitial(
32
33
  nodes: Node[],
33
34
  edges: Edge[],
@@ -62,7 +63,11 @@ type GraphState = GraphStateData & {
62
63
  getEdgeErrors(edgeId: string): GraphErrorSummary['allErrors'];
63
64
  };
64
65
 
65
- export const useGraphStore = create<GraphState>()(
66
+ type GraphState = GraphStateData & {
67
+ actions: GraphActions;
68
+ };
69
+
70
+ export const graphStore = create<GraphState>()(
66
71
  devtools((set, get) => ({
67
72
  nodes: [],
68
73
  edges: [],
@@ -90,186 +95,208 @@ export const useGraphStore = create<GraphState>()(
90
95
  future: [],
91
96
  errors: null,
92
97
  showErrors: false,
93
- setInitial(
94
- nodes,
95
- edges,
96
- metadata,
97
- dataComponentLookup = {},
98
- artifactComponentLookup = {},
99
- toolLookup = {},
100
- agentToolConfigLookup = {}
101
- ) {
102
- set({
98
+ // Separate "namespace" for actions
99
+ actions: {
100
+ setInitial(
103
101
  nodes,
104
102
  edges,
105
103
  metadata,
106
- dataComponentLookup,
107
- artifactComponentLookup,
108
- toolLookup,
109
- agentToolConfigLookup,
110
- dirty: false,
111
- history: [],
112
- future: [],
113
- errors: null,
114
- showErrors: false,
115
- });
116
- },
117
- setDataComponentLookup(dataComponentLookup) {
118
- set({ dataComponentLookup });
119
- },
120
- setArtifactComponentLookup(artifactComponentLookup) {
121
- set({ artifactComponentLookup });
122
- },
123
- setToolLookup(toolLookup) {
124
- set({ toolLookup });
125
- },
126
- setAgentToolConfigLookup(agentToolConfigLookup) {
127
- set({ agentToolConfigLookup });
128
- },
129
- setNodes(updater) {
130
- set((state) => ({ nodes: updater(state.nodes) }));
131
- },
132
- setEdges(updater) {
133
- set((state) => ({ edges: updater(state.edges) }));
134
- },
135
- push(nodes, edges) {
136
- set((state) => ({
137
- history: [...state.history, { nodes, edges }],
138
- future: [],
139
- }));
140
- },
141
- onNodesChange(changes) {
142
- // Check if any change type would modify the graph (not just selection changes)
143
- const hasModifyingChange = changes.some(
144
- (change) =>
145
- change.type === 'remove' ||
146
- change.type === 'add' ||
147
- change.type === 'replace' ||
148
- change.type === 'position'
149
- );
104
+ dataComponentLookup = {},
105
+ artifactComponentLookup = {},
106
+ toolLookup = {},
107
+ agentToolConfigLookup = {}
108
+ ) {
109
+ set({
110
+ nodes,
111
+ edges,
112
+ metadata,
113
+ dataComponentLookup,
114
+ artifactComponentLookup,
115
+ toolLookup,
116
+ agentToolConfigLookup,
117
+ dirty: false,
118
+ history: [],
119
+ future: [],
120
+ errors: null,
121
+ showErrors: false,
122
+ });
123
+ },
124
+ setDataComponentLookup(dataComponentLookup) {
125
+ set({ dataComponentLookup });
126
+ },
127
+ setArtifactComponentLookup(artifactComponentLookup) {
128
+ set({ artifactComponentLookup });
129
+ },
130
+ setToolLookup(toolLookup) {
131
+ set({ toolLookup });
132
+ },
133
+ setAgentToolConfigLookup(agentToolConfigLookup) {
134
+ set({ agentToolConfigLookup });
135
+ },
136
+ setNodes(updater) {
137
+ set((state) => ({ nodes: updater(state.nodes) }));
138
+ },
139
+ setEdges(updater) {
140
+ set((state) => ({ edges: updater(state.edges) }));
141
+ },
142
+ push(nodes, edges) {
143
+ set((state) => ({
144
+ history: [...state.history, { nodes, edges }],
145
+ future: [],
146
+ }));
147
+ },
148
+ onNodesChange(changes) {
149
+ // Check if any change type would modify the graph (not just selection changes)
150
+ const hasModifyingChange = changes.some(
151
+ (change) =>
152
+ change.type === 'remove' ||
153
+ change.type === 'add' ||
154
+ change.type === 'replace' ||
155
+ change.type === 'position'
156
+ );
150
157
 
151
- set((state) => ({
152
- history: [...state.history, { nodes: state.nodes, edges: state.edges }],
153
- nodes: applyNodeChanges(changes, state.nodes),
154
- dirty: hasModifyingChange ? true : state.dirty,
155
- }));
156
- },
157
- onEdgesChange(changes) {
158
- // Check if any change type would modify the graph (not just selection changes)
159
- const hasModifyingChange = changes.some(
160
- (change) => change.type === 'remove' || change.type === 'add' || change.type === 'replace'
161
- );
158
+ set((state) => ({
159
+ history: [...state.history, { nodes: state.nodes, edges: state.edges }],
160
+ nodes: applyNodeChanges(changes, state.nodes),
161
+ dirty: hasModifyingChange ? true : state.dirty,
162
+ }));
163
+ },
164
+ onEdgesChange(changes) {
165
+ // Check if any change type would modify the graph (not just selection changes)
166
+ const hasModifyingChange = changes.some(
167
+ (change) => change.type === 'remove' || change.type === 'add' || change.type === 'replace'
168
+ );
162
169
 
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;
170
+ set((state) => {
171
+ // Check for edge removals that disconnect agent from MCP node
172
+ const removeChanges = changes.filter((change) => change.type === 'remove');
173
+ let updatedNodes = state.nodes;
167
174
 
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
- );
175
+ for (const removeChange of removeChanges) {
176
+ const edgeToRemove = state.edges.find((e) => e.id === removeChange.id);
177
+ if (edgeToRemove && edgeToRemove.targetHandle === mcpNodeHandleId) {
178
+ // Find the target MCP node and clear its agentId
179
+ const mcpNode = state.nodes.find((n) => n.id === edgeToRemove.target);
180
+ if (mcpNode && mcpNode.type === NodeType.MCP) {
181
+ updatedNodes = updatedNodes.map((n) =>
182
+ n.id === mcpNode.id
183
+ ? { ...n, data: { ...n.data, agentId: null, relationshipId: null } }
184
+ : n
185
+ );
186
+ }
179
187
  }
180
188
  }
181
- }
182
189
 
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
- });
190
- },
191
- onConnect(connection) {
192
- set((state) => ({ edges: addEdge(connection as any, state.edges) }));
193
- },
194
- setMetadata(field, value) {
195
- set((state) => ({ metadata: { ...state.metadata, [field]: value } }));
196
- },
197
- undo() {
198
- const { history } = get();
199
- if (history.length === 0) return;
200
- const prev = history[history.length - 1];
201
- set((state) => ({
202
- nodes: prev.nodes,
203
- edges: prev.edges,
204
- history: state.history.slice(0, -1),
205
- future: [{ nodes: state.nodes, edges: state.edges }, ...state.future],
206
- dirty: state.dirty,
207
- }));
208
- },
209
- redo() {
210
- const { future } = get();
211
- if (future.length === 0) return;
212
- const next = future[0];
213
- set((state) => ({
214
- nodes: next.nodes,
215
- edges: next.edges,
216
- future: state.future.slice(1),
217
- history: [...state.history, { nodes: state.nodes, edges: state.edges }],
218
- dirty: state.dirty,
219
- }));
220
- },
221
- markSaved() {
222
- set({ dirty: false });
223
- },
224
- markUnsaved() {
225
- set({ dirty: true });
226
- },
227
- clearSelection() {
228
- set((state) => ({
229
- nodes: state.nodes.map((n) => ({ ...n, selected: false })),
230
- edges: state.edges.map((e) => ({ ...e, selected: false })),
231
- dirty: state.dirty,
232
- }));
233
- },
234
- deleteSelected() {
235
- set((state) => {
236
- const nodesToDelete = new Set(
237
- state.nodes.filter((n) => n.selected && (n.deletable ?? true)).map((n) => n.id)
238
- );
239
- const edgesRemaining = state.edges.filter(
240
- (e) => !e.selected && !nodesToDelete.has(e.source) && !nodesToDelete.has(e.target)
241
- );
242
- const nodesRemaining = state.nodes.filter((n) => !nodesToDelete.has(n.id));
243
- return {
190
+ return {
191
+ history: [...state.history, { nodes: state.nodes, edges: state.edges }],
192
+ nodes: updatedNodes,
193
+ edges: applyEdgeChanges(changes, state.edges),
194
+ dirty: hasModifyingChange ? true : state.dirty,
195
+ };
196
+ });
197
+ },
198
+ onConnect(connection) {
199
+ set((state) => ({ edges: addEdge(connection as any, state.edges) }));
200
+ },
201
+ setMetadata(field, value) {
202
+ set((state) => ({ metadata: { ...state.metadata, [field]: value } }));
203
+ },
204
+ undo() {
205
+ const { history } = get();
206
+ if (history.length === 0) return;
207
+ const prev = history[history.length - 1];
208
+ set((state) => ({
209
+ nodes: prev.nodes,
210
+ edges: prev.edges,
211
+ history: state.history.slice(0, -1),
212
+ future: [{ nodes: state.nodes, edges: state.edges }, ...state.future],
213
+ dirty: state.dirty,
214
+ }));
215
+ },
216
+ redo() {
217
+ const { future } = get();
218
+ if (future.length === 0) return;
219
+ const next = future[0];
220
+ set((state) => ({
221
+ nodes: next.nodes,
222
+ edges: next.edges,
223
+ future: state.future.slice(1),
244
224
  history: [...state.history, { nodes: state.nodes, edges: state.edges }],
245
- nodes: nodesRemaining,
246
- edges: edgesRemaining,
247
- dirty: true,
248
- };
249
- });
250
- },
251
- setErrors(errors) {
252
- set({ errors, showErrors: errors !== null });
253
- },
254
- clearErrors() {
255
- set({ errors: null, showErrors: false });
256
- },
257
- setShowErrors(show) {
258
- set({ showErrors: show });
259
- },
260
- hasErrors() {
261
- const { errors } = get();
262
- return errors !== null && errors.totalErrors > 0;
263
- },
264
- getNodeErrors(nodeId) {
265
- const { errors } = get();
266
- if (!errors || !errors.nodeErrors[nodeId]) return [];
267
- return errors.nodeErrors[nodeId];
268
- },
269
- getEdgeErrors(edgeId) {
270
- const { errors } = get();
271
- if (!errors || !errors.edgeErrors[edgeId]) return [];
272
- return errors.edgeErrors[edgeId];
225
+ dirty: state.dirty,
226
+ }));
227
+ },
228
+ markSaved() {
229
+ set({ dirty: false });
230
+ },
231
+ markUnsaved() {
232
+ set({ dirty: true });
233
+ },
234
+ clearSelection() {
235
+ set((state) => ({
236
+ nodes: state.nodes.map((n) => ({ ...n, selected: false })),
237
+ edges: state.edges.map((e) => ({ ...e, selected: false })),
238
+ dirty: state.dirty,
239
+ }));
240
+ },
241
+ deleteSelected() {
242
+ set((state) => {
243
+ const nodesToDelete = new Set(
244
+ state.nodes.filter((n) => n.selected && (n.deletable ?? true)).map((n) => n.id)
245
+ );
246
+ const edgesRemaining = state.edges.filter(
247
+ (e) => !e.selected && !nodesToDelete.has(e.source) && !nodesToDelete.has(e.target)
248
+ );
249
+ const nodesRemaining = state.nodes.filter((n) => !nodesToDelete.has(n.id));
250
+ return {
251
+ history: [...state.history, { nodes: state.nodes, edges: state.edges }],
252
+ nodes: nodesRemaining,
253
+ edges: edgesRemaining,
254
+ dirty: true,
255
+ };
256
+ });
257
+ },
258
+ setErrors(errors) {
259
+ set({ errors, showErrors: errors !== null });
260
+ },
261
+ clearErrors() {
262
+ set({ errors: null, showErrors: false });
263
+ },
264
+ setShowErrors(show) {
265
+ set({ showErrors: show });
266
+ },
267
+ hasErrors() {
268
+ const { errors } = get();
269
+ return errors !== null && errors.totalErrors > 0;
270
+ },
271
+ getNodeErrors(nodeId) {
272
+ const { errors } = get();
273
+ if (!errors || !errors.nodeErrors[nodeId]) return [];
274
+ return errors.nodeErrors[nodeId];
275
+ },
276
+ getEdgeErrors(edgeId) {
277
+ const { errors } = get();
278
+ if (!errors || !errors.edgeErrors[edgeId]) return [];
279
+ return errors.edgeErrors[edgeId];
280
+ },
273
281
  },
274
282
  }))
275
283
  );
284
+
285
+ /**
286
+ * Actions are functions that update values in your store.
287
+ * These are static and do not change between renders.
288
+ *
289
+ * @see https://tkdodo.eu/blog/working-with-zustand#separate-actions-from-state
290
+ */
291
+ export const useGraphActions = () => graphStore((state) => state.actions);
292
+
293
+ /**
294
+ * Select values from the graph store (excluding actions).
295
+ *
296
+ * We explicitly use `GraphStateData` instead of `GraphState`,
297
+ * which includes actions, to encourage using `useGraphActions`
298
+ * when accessing or calling actions.
299
+ */
300
+ export function useGraphStore<T>(selector: (state: GraphStateData) => T): T {
301
+ return graphStore(useShallow(selector));
302
+ }
@@ -1,8 +1,8 @@
1
1
  import { useCallback, useEffect } from 'react';
2
- import { useGraphStore } from '@/features/graph/state/use-graph-store';
2
+ import { useGraphActions } from '@/features/graph/state/use-graph-store';
3
3
 
4
4
  export function useGraphShortcuts() {
5
- const { undo, redo, deleteSelected } = useGraphStore();
5
+ const { undo, redo, deleteSelected } = useGraphActions();
6
6
 
7
7
  const onKeyDown = useCallback(
8
8
  (e: KeyboardEvent) => {