flujo-ai 3.16.0 → 3.18.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 (426) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +202 -187
  3. package/.next/app-path-routes-manifest.json +9 -7
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +6 -6
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_not-found.html +1 -1
  9. package/.next/server/app/_not-found.rsc +1 -1
  10. package/.next/server/app/api/backup/route.js +1 -1
  11. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  12. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/encryption/secure/route.js +1 -1
  16. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  17. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/flow/[id]/route.js +1 -1
  20. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  21. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/flow/compile/route.js +1 -1
  23. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  24. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/flow/generate/route.js +1 -17
  26. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  27. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/improve/route.js +1 -0
  29. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -0
  30. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -0
  31. package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
  32. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/quick-chat/route.js +1 -0
  35. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/route.js +1 -1
  38. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/init/route.js +1 -1
  42. package/.next/server/app/api/init/route.js.nft.json +1 -1
  43. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  48. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  49. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  51. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  54. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  55. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/mcp/servers/route.js +1 -1
  75. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  78. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  79. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  81. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  82. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  85. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/model/[id]/route.js +1 -1
  88. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/model/provider/route.js +1 -1
  91. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  92. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/model/route.js +1 -1
  94. package/.next/server/app/api/model/route.js.nft.json +1 -1
  95. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/model/test/route.js +1 -1
  97. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  98. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/oauth/reset/route.js +1 -1
  102. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  103. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  105. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  107. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  109. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/planned-executions/route.js +1 -1
  112. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  113. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/restore/route.js +1 -1
  115. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  116. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  120. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/chat/page.js +9 -9
  123. package/.next/server/app/chat/page.js.nft.json +1 -1
  124. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  125. package/.next/server/app/chat.html +1 -1
  126. package/.next/server/app/chat.rsc +2 -2
  127. package/.next/server/app/docs/page.js +7 -3
  128. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  129. package/.next/server/app/docs.html +1 -1
  130. package/.next/server/app/docs.rsc +2 -2
  131. package/.next/server/app/executions/page.js +2 -2
  132. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  133. package/.next/server/app/executions.html +1 -1
  134. package/.next/server/app/executions.rsc +2 -2
  135. package/.next/server/app/flows/page.js +3 -39
  136. package/.next/server/app/flows/page.js.nft.json +1 -1
  137. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  138. package/.next/server/app/flows.html +1 -1
  139. package/.next/server/app/flows.rsc +2 -2
  140. package/.next/server/app/index.html +1 -1
  141. package/.next/server/app/index.rsc +2 -2
  142. package/.next/server/app/mcp/page.js +23 -27
  143. package/.next/server/app/mcp/page.js.nft.json +1 -1
  144. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  145. package/.next/server/app/mcp-flows/route.js +3 -3
  146. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  147. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  149. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  150. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/mcp.html +1 -1
  152. package/.next/server/app/mcp.rsc +2 -2
  153. package/.next/server/app/models/page.js +3 -3
  154. package/.next/server/app/models/page.js.nft.json +1 -1
  155. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/settings/page.js +2 -2
  158. package/.next/server/app/settings/page.js.nft.json +1 -1
  159. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/settings.html +1 -1
  161. package/.next/server/app/settings.rsc +2 -2
  162. package/.next/server/app/v1/chat/completions/route.js +1 -2
  163. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  164. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -1
  166. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  167. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  169. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  170. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  172. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  173. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  175. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  176. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -1
  178. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  179. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +2 -2
  181. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  182. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  184. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  185. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  187. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  188. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/v1/chat/conversations/route.js +2 -2
  190. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  191. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/v1/models/route.js +1 -1
  193. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  194. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app-paths-manifest.json +9 -7
  196. package/.next/server/chunks/1403.js +4 -2
  197. package/.next/server/chunks/1912.js +38 -0
  198. package/.next/server/chunks/2350.js +1 -0
  199. package/.next/server/chunks/{7531.js → 2439.js} +2 -2
  200. package/.next/server/chunks/{5504.js → 264.js} +2 -2
  201. package/.next/server/chunks/2859.js +5 -5
  202. package/.next/server/chunks/3304.js +1 -1
  203. package/.next/server/chunks/3310.js +35 -0
  204. package/.next/server/chunks/453.js +1 -0
  205. package/.next/server/chunks/4681.js +1 -1
  206. package/.next/server/chunks/5311.js +1 -0
  207. package/.next/server/chunks/6037.js +41 -0
  208. package/.next/server/chunks/6069.js +6 -0
  209. package/.next/server/chunks/6201.js +5 -0
  210. package/.next/server/chunks/6826.js +1 -0
  211. package/.next/server/chunks/6936.js +9 -7
  212. package/.next/server/chunks/701.js +1 -1
  213. package/.next/server/chunks/7186.js +2 -0
  214. package/.next/server/chunks/7214.js +2 -2
  215. package/.next/server/chunks/724.js +1 -1
  216. package/.next/server/chunks/7362.js +8 -8
  217. package/.next/server/chunks/7506.js +1 -1
  218. package/.next/server/chunks/7635.js +2 -2
  219. package/.next/server/chunks/7821.js +1 -0
  220. package/.next/server/chunks/7982.js +1 -0
  221. package/.next/server/chunks/8227.js +2 -0
  222. package/.next/server/chunks/8342.js +1 -0
  223. package/.next/server/chunks/8739.js +1 -1
  224. package/.next/server/chunks/906.js +35 -0
  225. package/.next/server/chunks/{5888.js → 9314.js} +3 -3
  226. package/.next/server/chunks/9687.js +1 -0
  227. package/.next/server/chunks/9880.js +1 -0
  228. package/.next/server/chunks/9938.js +1 -1
  229. package/.next/server/instrumentation.js.nft.json +1 -1
  230. package/.next/server/middleware-build-manifest.js +1 -1
  231. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  232. package/.next/server/pages/404.html +1 -1
  233. package/.next/server/pages/500.html +1 -1
  234. package/.next/server/pages-manifest.json +1 -1
  235. package/.next/server/server-reference-manifest.js +1 -1
  236. package/.next/server/server-reference-manifest.json +1 -1
  237. package/.next/static/Fdh7zqKv38txmpLAxepeR/_buildManifest.js +1 -0
  238. package/.next/static/chunks/1374-e084b3c40554288a.js +1 -0
  239. package/.next/static/chunks/1892-359187893bbc7f3a.js +1 -0
  240. package/.next/static/chunks/{7126-2bafddf1b09cacac.js → 2084-2463e1d781bad2a6.js} +1 -1
  241. package/.next/static/chunks/4105-8fddb00196bf3c6d.js +1 -0
  242. package/.next/static/chunks/4244-6f399c7ff9980207.js +1 -0
  243. package/.next/static/chunks/4809-423a2a4a90d02f2c.js +1 -0
  244. package/.next/static/chunks/6084-68908a197e957e5f.js +1 -0
  245. package/.next/static/chunks/6509-3380826fd7c82b4e.js +1 -0
  246. package/.next/static/chunks/7290-fd5bb2c94fd7f605.js +1 -0
  247. package/.next/static/chunks/{7583.8a518353bd072db9.js → 7583.b6c2f8874b6b89cd.js} +1 -1
  248. package/.next/static/chunks/8098-297bf477152a565b.js +1 -0
  249. package/.next/static/chunks/{8187.5d6523f30e705998.js → 8187.15bf331f5318c00f.js} +1 -1
  250. package/.next/static/chunks/{9164-36fedeb944fa71e9.js → 9164-a56181e5e93cc47e.js} +1 -1
  251. package/.next/static/chunks/924-64f908860caf1a35.js +1 -0
  252. package/.next/static/chunks/9286-6ea909e5bf70a97e.js +1 -0
  253. package/.next/static/chunks/9747-ffb8be5e59700c27.js +8 -0
  254. package/.next/static/chunks/app/api/backup/route-1691635994fcddb5.js +1 -0
  255. package/.next/static/chunks/app/api/browse/route-1691635994fcddb5.js +1 -0
  256. package/.next/static/chunks/app/api/cwd/route-1691635994fcddb5.js +1 -0
  257. package/.next/static/chunks/app/api/encryption/secure/route-1691635994fcddb5.js +1 -0
  258. package/.next/static/chunks/app/api/env/route-1691635994fcddb5.js +1 -0
  259. package/.next/static/chunks/app/api/flow/[id]/route-1691635994fcddb5.js +1 -0
  260. package/.next/static/chunks/app/api/flow/compile/route-1691635994fcddb5.js +1 -0
  261. package/.next/static/chunks/app/api/flow/generate/route-1691635994fcddb5.js +1 -0
  262. package/.next/static/chunks/app/api/flow/improve/route-1691635994fcddb5.js +1 -0
  263. package/.next/static/chunks/app/api/flow/prompt-renderer/route-1691635994fcddb5.js +1 -0
  264. package/.next/static/chunks/app/api/flow/quick-chat/route-1691635994fcddb5.js +1 -0
  265. package/.next/static/chunks/app/api/flow/route-1691635994fcddb5.js +1 -0
  266. package/.next/static/chunks/app/api/git/route-1691635994fcddb5.js +1 -0
  267. package/.next/static/chunks/app/api/init/route-1691635994fcddb5.js +1 -0
  268. package/.next/static/chunks/app/api/local-models/capability/route-1691635994fcddb5.js +1 -0
  269. package/.next/static/chunks/app/api/local-models/pull/route-1691635994fcddb5.js +1 -0
  270. package/.next/static/chunks/app/api/local-models/suggest/route-1691635994fcddb5.js +1 -0
  271. package/.next/static/chunks/app/api/mcp/cancel/route-1691635994fcddb5.js +1 -0
  272. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-1691635994fcddb5.js +1 -0
  273. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-1691635994fcddb5.js +1 -0
  274. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-1691635994fcddb5.js +1 -0
  275. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-1691635994fcddb5.js +1 -0
  276. package/.next/static/chunks/app/api/mcp/servers/[name]/route-1691635994fcddb5.js +1 -0
  277. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-1691635994fcddb5.js +1 -0
  278. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-1691635994fcddb5.js +1 -0
  279. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-1691635994fcddb5.js +1 -0
  280. package/.next/static/chunks/app/api/mcp/servers/route-1691635994fcddb5.js +1 -0
  281. package/.next/static/chunks/app/api/mcp/test-connection/route-1691635994fcddb5.js +1 -0
  282. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-1691635994fcddb5.js +1 -0
  283. package/.next/static/chunks/app/api/mcp-registry/route-1691635994fcddb5.js +1 -0
  284. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-1691635994fcddb5.js +1 -0
  285. package/.next/static/chunks/app/api/model/[id]/route-1691635994fcddb5.js +1 -0
  286. package/.next/static/chunks/app/api/model/provider/route-1691635994fcddb5.js +1 -0
  287. package/.next/static/chunks/app/api/model/route-1691635994fcddb5.js +1 -0
  288. package/.next/static/chunks/app/api/model/test/route-1691635994fcddb5.js +1 -0
  289. package/.next/static/chunks/app/api/oauth/callback/route-1691635994fcddb5.js +1 -0
  290. package/.next/static/chunks/app/api/oauth/initiate/route-1691635994fcddb5.js +1 -0
  291. package/.next/static/chunks/app/api/oauth/reset/route-1691635994fcddb5.js +1 -0
  292. package/.next/static/chunks/app/api/planned-executions/[id]/route-1691635994fcddb5.js +1 -0
  293. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-1691635994fcddb5.js +1 -0
  294. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-1691635994fcddb5.js +1 -0
  295. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-1691635994fcddb5.js +1 -0
  296. package/.next/static/chunks/app/api/planned-executions/route-1691635994fcddb5.js +1 -0
  297. package/.next/static/chunks/app/api/restore/route-1691635994fcddb5.js +1 -0
  298. package/.next/static/chunks/app/api/storage/route-1691635994fcddb5.js +1 -0
  299. package/.next/static/chunks/app/api/update/route-1691635994fcddb5.js +1 -0
  300. package/.next/static/chunks/app/api/webhooks/[id]/route-1691635994fcddb5.js +1 -0
  301. package/.next/static/chunks/app/chat/page-6486974f4a6c7b57.js +1 -0
  302. package/.next/static/chunks/app/docs/page-5da72cc6db51f238.js +1 -0
  303. package/.next/static/chunks/app/executions/page-fe19f6a1bd3fe05c.js +1 -0
  304. package/.next/static/chunks/app/flows/page-3b84093cdf2aee84.js +1 -0
  305. package/.next/static/chunks/app/mcp/page-355386ec2a542e42.js +1 -0
  306. package/.next/static/chunks/app/mcp-flows/route-1691635994fcddb5.js +1 -0
  307. package/.next/static/chunks/app/mcp-proxy/[server]/route-1691635994fcddb5.js +1 -0
  308. package/.next/static/chunks/app/models/page-20c80d398bf83fc5.js +1 -0
  309. package/.next/static/chunks/app/settings/page-9430dfdaff87d70c.js +1 -0
  310. package/.next/static/chunks/app/v1/chat/completions/route-1691635994fcddb5.js +1 -0
  311. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-1691635994fcddb5.js +1 -0
  312. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-1691635994fcddb5.js +1 -0
  313. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-1691635994fcddb5.js +1 -0
  314. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-1691635994fcddb5.js +1 -0
  315. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-1691635994fcddb5.js +1 -0
  316. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-1691635994fcddb5.js +1 -0
  317. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-1691635994fcddb5.js +1 -0
  318. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-1691635994fcddb5.js +1 -0
  319. package/.next/static/chunks/app/v1/chat/conversations/route-1691635994fcddb5.js +1 -0
  320. package/.next/static/chunks/app/v1/models/route-1691635994fcddb5.js +1 -0
  321. package/.next/static/chunks/{webpack-4015bd6f241940a1.js → webpack-4880945dd240d429.js} +1 -1
  322. package/.next/trace +7 -7
  323. package/.next/types/app/api/flow/improve/route.ts +347 -0
  324. package/.next/types/app/api/flow/quick-chat/route.ts +347 -0
  325. package/.next/types/routes.d.ts +3 -1
  326. package/.next/types/validator.ts +18 -0
  327. package/README.md +1 -1
  328. package/package.json +1 -1
  329. package/.next/server/chunks/117.js +0 -1
  330. package/.next/server/chunks/1877.js +0 -31
  331. package/.next/server/chunks/1905.js +0 -2
  332. package/.next/server/chunks/3243.js +0 -1
  333. package/.next/server/chunks/5558.js +0 -1
  334. package/.next/server/chunks/5587.js +0 -1
  335. package/.next/server/chunks/5838.js +0 -1
  336. package/.next/server/chunks/5935.js +0 -2
  337. package/.next/server/chunks/6195.js +0 -37
  338. package/.next/server/chunks/6283.js +0 -2
  339. package/.next/server/chunks/6523.js +0 -1
  340. package/.next/server/chunks/7328.js +0 -1
  341. package/.next/server/chunks/8126.js +0 -1
  342. package/.next/server/chunks/8312.js +0 -5
  343. package/.next/server/chunks/8434.js +0 -1
  344. package/.next/server/chunks/9188.js +0 -1
  345. package/.next/server/chunks/9688.js +0 -2
  346. package/.next/server/chunks/9989.js +0 -1
  347. package/.next/static/chunks/1226-af62e7a89fa9032e.js +0 -1
  348. package/.next/static/chunks/1979-e2d922370ecef69f.js +0 -1
  349. package/.next/static/chunks/2158-0d6bb5a428ed0688.js +0 -1
  350. package/.next/static/chunks/510-e39ad4e1fae6dd1f.js +0 -1
  351. package/.next/static/chunks/539-8ddf886986877cfc.js +0 -1
  352. package/.next/static/chunks/5781-4328d17aad13f908.js +0 -8
  353. package/.next/static/chunks/5961-828f4f7efc3e1381.js +0 -1
  354. package/.next/static/chunks/687-98ba5f5043866f48.js +0 -1
  355. package/.next/static/chunks/6902-cba4e59c4295b4a0.js +0 -1
  356. package/.next/static/chunks/8862-1170dad1d6f3cd39.js +0 -1
  357. package/.next/static/chunks/8867-3f7163974605427b.js +0 -1
  358. package/.next/static/chunks/8989-401559d9f3bc80a0.js +0 -1
  359. package/.next/static/chunks/9414-3cd5c3976cba66b2.js +0 -1
  360. package/.next/static/chunks/app/api/backup/route-7248529e02c31012.js +0 -1
  361. package/.next/static/chunks/app/api/browse/route-7248529e02c31012.js +0 -1
  362. package/.next/static/chunks/app/api/cwd/route-7248529e02c31012.js +0 -1
  363. package/.next/static/chunks/app/api/encryption/secure/route-7248529e02c31012.js +0 -1
  364. package/.next/static/chunks/app/api/env/route-7248529e02c31012.js +0 -1
  365. package/.next/static/chunks/app/api/flow/[id]/route-7248529e02c31012.js +0 -1
  366. package/.next/static/chunks/app/api/flow/compile/route-7248529e02c31012.js +0 -1
  367. package/.next/static/chunks/app/api/flow/generate/route-7248529e02c31012.js +0 -1
  368. package/.next/static/chunks/app/api/flow/prompt-renderer/route-7248529e02c31012.js +0 -1
  369. package/.next/static/chunks/app/api/flow/route-7248529e02c31012.js +0 -1
  370. package/.next/static/chunks/app/api/git/route-7248529e02c31012.js +0 -1
  371. package/.next/static/chunks/app/api/init/route-7248529e02c31012.js +0 -1
  372. package/.next/static/chunks/app/api/local-models/capability/route-7248529e02c31012.js +0 -1
  373. package/.next/static/chunks/app/api/local-models/pull/route-7248529e02c31012.js +0 -1
  374. package/.next/static/chunks/app/api/local-models/suggest/route-7248529e02c31012.js +0 -1
  375. package/.next/static/chunks/app/api/mcp/cancel/route-7248529e02c31012.js +0 -1
  376. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7248529e02c31012.js +0 -1
  377. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7248529e02c31012.js +0 -1
  378. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7248529e02c31012.js +0 -1
  379. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7248529e02c31012.js +0 -1
  380. package/.next/static/chunks/app/api/mcp/servers/[name]/route-7248529e02c31012.js +0 -1
  381. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7248529e02c31012.js +0 -1
  382. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7248529e02c31012.js +0 -1
  383. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7248529e02c31012.js +0 -1
  384. package/.next/static/chunks/app/api/mcp/servers/route-7248529e02c31012.js +0 -1
  385. package/.next/static/chunks/app/api/mcp/test-connection/route-7248529e02c31012.js +0 -1
  386. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7248529e02c31012.js +0 -1
  387. package/.next/static/chunks/app/api/mcp-registry/route-7248529e02c31012.js +0 -1
  388. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7248529e02c31012.js +0 -1
  389. package/.next/static/chunks/app/api/model/[id]/route-7248529e02c31012.js +0 -1
  390. package/.next/static/chunks/app/api/model/provider/route-7248529e02c31012.js +0 -1
  391. package/.next/static/chunks/app/api/model/route-7248529e02c31012.js +0 -1
  392. package/.next/static/chunks/app/api/model/test/route-7248529e02c31012.js +0 -1
  393. package/.next/static/chunks/app/api/oauth/callback/route-7248529e02c31012.js +0 -1
  394. package/.next/static/chunks/app/api/oauth/initiate/route-7248529e02c31012.js +0 -1
  395. package/.next/static/chunks/app/api/oauth/reset/route-7248529e02c31012.js +0 -1
  396. package/.next/static/chunks/app/api/planned-executions/[id]/route-7248529e02c31012.js +0 -1
  397. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7248529e02c31012.js +0 -1
  398. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7248529e02c31012.js +0 -1
  399. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7248529e02c31012.js +0 -1
  400. package/.next/static/chunks/app/api/planned-executions/route-7248529e02c31012.js +0 -1
  401. package/.next/static/chunks/app/api/restore/route-7248529e02c31012.js +0 -1
  402. package/.next/static/chunks/app/api/storage/route-7248529e02c31012.js +0 -1
  403. package/.next/static/chunks/app/api/update/route-7248529e02c31012.js +0 -1
  404. package/.next/static/chunks/app/api/webhooks/[id]/route-7248529e02c31012.js +0 -1
  405. package/.next/static/chunks/app/chat/page-c759cf382bcabd77.js +0 -1
  406. package/.next/static/chunks/app/docs/page-1d349e2d82f7b104.js +0 -1
  407. package/.next/static/chunks/app/executions/page-4155f9f682ee6f84.js +0 -1
  408. package/.next/static/chunks/app/flows/page-375150edff9134a3.js +0 -1
  409. package/.next/static/chunks/app/mcp/page-5234695929980171.js +0 -1
  410. package/.next/static/chunks/app/mcp-flows/route-7248529e02c31012.js +0 -1
  411. package/.next/static/chunks/app/mcp-proxy/[server]/route-7248529e02c31012.js +0 -1
  412. package/.next/static/chunks/app/models/page-4fc4d100a8b1d4b4.js +0 -1
  413. package/.next/static/chunks/app/settings/page-9a2bfb8d5bdba29e.js +0 -1
  414. package/.next/static/chunks/app/v1/chat/completions/route-7248529e02c31012.js +0 -1
  415. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7248529e02c31012.js +0 -1
  416. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7248529e02c31012.js +0 -1
  417. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7248529e02c31012.js +0 -1
  418. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7248529e02c31012.js +0 -1
  419. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7248529e02c31012.js +0 -1
  420. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7248529e02c31012.js +0 -1
  421. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7248529e02c31012.js +0 -1
  422. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7248529e02c31012.js +0 -1
  423. package/.next/static/chunks/app/v1/chat/conversations/route-7248529e02c31012.js +0 -1
  424. package/.next/static/chunks/app/v1/models/route-7248529e02c31012.js +0 -1
  425. package/.next/static/z7fsG7kblb_yxkUhOxn-G/_buildManifest.js +0 -1
  426. /package/.next/static/{z7fsG7kblb_yxkUhOxn-G → Fdh7zqKv38txmpLAxepeR}/_ssgManifest.js +0 -0
@@ -0,0 +1,41 @@
1
+ "use strict";exports.id=6037,exports.ids=[6037],exports.modules={66037:(a,b,c)=>{c.d(b,{internalCallTool:()=>aB,internalToolDefinitions:()=>ag});var d=c(33873),e=c.n(d),f=c(29021),g=c(79646),h=c(18230),i=c(11659),j=c(12763),k=c(71188),l=c(67463),m=c(89850),n=c(8336);function o(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let p={type:"arrowclosed",width:20,height:20,color:"#1976d2"},q={stroke:"#1976d2",strokeWidth:2},r=new Set(["full-history","latest-message","isolated"]),s=new Set(["steps","final-only"]),t=new Set(["full-conversation","latest-message"]);function u(a){let b=(0,n.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}var v=c(54898),w=c(99924);let x=(0,h.h)("backend/services/flow/generationContext");function y(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function z(){let a=await j.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:y(a.description,100)}:{}})),c=[],d={};try{let a=await w.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await w.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){x.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await w.mcpService.listServerTools(b.name),f=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:y(a.description,100)}:{}}));d[b.name]=f.map(a=>a.name),c.push({name:b.name,connected:!0,tools:f})}}catch(a){x.warn("Could not load MCP servers for the authoring context",a)}let e=[];try{e=await i.flowService.loadFlows()}catch(a){x.warn("Could not load flows for the authoring context",a)}let f={models:b,servers:c,flows:e.map(a=>({id:a.id,name:a.name,...a.description?{description:y(a.description,300)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:f,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:e.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(f),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}let A=(0,h.h)("backend/services/flow/compileFlow");async function B(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await z(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let e=function(a,b={},c={}){let d=[],e=(a,b,c)=>d.push({severity:"error",code:a,message:b,nodeKey:c}),f=(a,b,c)=>d.push({severity:"warning",code:a,message:b,nodeKey:c}),g=b.models??[],h=new Set((b.servers??[]).map(a=>a.name)),i=b.serverTools??{},j=o(c.maxDepth,0,3,3),k=o(c.maxFlows,1,8,8),l=[],n=[...(b.flows??[]).map(a=>a.name)],v=[],w=0;var x=function a(d,o,x){let y=Array.isArray(d?.nodes)?d.nodes:[],z=Array.isArray(d?.edges)?d.edges:[],A=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(d?.name,n);n.push(A),w++;let B=(0,m.A)(),C=[...x,A],D=new Map,E=[],F=[];for(let c of y){let d=c?.key;if(!d||"string"!=typeof d){e("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(D.has(d)){e("node-duplicate-key",`Duplicate node key "${d}" — keys must be unique; the later node was dropped.`,d);continue}let l=c.type;if("mcp"===l){e("mcp-node-not-allowed",`Node "${d}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,d);continue}if("start"!==l&&"process"!==l&&"finish"!==l&&"subflow"!==l){e("unknown-node-type",`Node "${d}" has unknown type "${String(l)}".`,d);continue}let n={},p="string"==typeof c.prompt?c.prompt:void 0;if("start"===l){let{text:a,stripped:b}=u(p??"");b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),n.promptTemplate=a}else if("process"===l){let{text:a,stripped:b}=u(p??"");if(b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),n.promptTemplate=a,c.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(c.model,g);a?n.boundModel=a:(n.boundModel=c.model,f("model-unresolved",`Node "${d}": model "${c.model}" does not match any configured model (by id, display name, or name).`,d))}void 0!==c.inputMode&&(r.has(c.inputMode)?(n.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(n.isolatedPrompt=c.isolatedPrompt)):f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(t.has(c.outputMode)?n.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,d))}else if("subflow"===l){if(function(c,d,g,h,i){if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&f("subflow-multiple-sources",`Node "${d}": a subflow node should have only one of "flow", "subflowSpec", or "generateSubflow"; applying precedence flow > subflowSpec > generateSubflow.`,d),c.flow){if(h.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return e("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}(c.flow,[...b.flows??[],...v]);return a?i.subflowId=a:e("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(g+1>j)return e("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${j} level(s); this inline subflow was not compiled.`,d);if(w>=k)return e("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${k} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,g+1,h);return b?i.subflowId=b.id:e("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return e("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d);e("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), or "generateSubflow".`,d)}(c,d,o,C,n),void 0!==c.inputMode&&(r.has(c.inputMode)?n.inputMode=c.inputMode:f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(s.has(c.outputMode)?n.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,d)),void 0!==p){let{text:a,stripped:b}=u(p);b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),n.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(n.allowCallerPrompt=c.allowCallerPrompt)}let q={id:(0,m.A)(),type:l,position:{x:0,y:0},data:{label:c.label||`${l.charAt(0).toUpperCase()}${l.slice(1)} Node`,type:l,...c.description?{description:c.description}:{},properties:n}};if(D.set(d,q),E.push(q),"process"===l&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,e=b?.name;if(!e||"string"!=typeof e){f("server-missing-name",`Node "${d}": a server reference is missing its "name"; skipped.`,d);continue}if(a.has(e))continue;a.add(e),h.has(e)||f("server-unknown",`Node "${d}": MCP server "${e}" is not configured in FLUJO.`,d);let g=i[e];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&f("tool-unknown",`Node "${d}": server "${e}" does not report tool(s): ${a.join(", ")}.`,d)}}else c=g?[...g]:[];let j={id:(0,m.A)(),type:"mcp",position:{x:0,y:0},data:{label:e,type:"mcp",properties:{boundServer:e,enabledTools:c}}};E.push(j),F.push({processKey:d,mcpNode:j})}}else"process"!==l&&Array.isArray(c.servers)&&c.servers.length>0&&f("servers-on-non-process",`Node "${d}": only process nodes can have "servers"; ignored.`,d)}if(0===D.size)return e("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let G=[],H=new Set;for(let a of z){let b=a?.from,c=a?.to,d=b?D.get(b):void 0,g=c?D.get(c):void 0;if(!d||!g){e("edge-unknown-node",`Edge "${String(b)}" -> "${String(c)}" references a node key that does not exist (or was dropped).`);continue}if(d===g){e("edge-self-loop",`Edge "${b}" -> "${c}": a node cannot connect to itself.`);continue}if("start"===g.type){e("edge-into-start",`Edge "${b}" -> "${c}": nothing may connect INTO a start node.`);continue}if("finish"===d.type){e("edge-out-of-finish",`Edge "${b}" -> "${c}": nothing may connect OUT OF a finish node.`);continue}let h=`${b}->${c}`;if(H.has(h)){f("edge-duplicate",`Edge "${b}" -> "${c}" appears more than once; kept the first.`);continue}H.add(h);let i=!0===a.bidirectional;i&&("start"===d.type||"finish"===g.type)&&(f("bidirectional-illegal",`Edge "${b}" -> "${c}" cannot be bidirectional; downgraded to one-way.`),i=!1),G.push(function(a,b,c){let d=`${a.type}-bottom`,e=`${b.type}-top`;return{id:`${a.id}:${d}->${b.id}:${e}`,source:a.id,sourceHandle:d,target:b.id,targetHandle:e,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{}},animated:!0}}(d,g,i))}for(let{processKey:a,mcpNode:b}of F){let c=D.get(a);G.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...p},markerStart:{...p},style:{...q}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c)a.data?.edgeType!=="mcp"&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target));let g=[...b.values()],h=g.filter(a=>"start"===a.type),i=h.length>0?h:g.slice(0,1),j=new Map,k=i.map(a=>({id:a.id,depth:0}));for(let a of k)j.set(a.id,0);for(;k.length;){let{id:a,depth:b}=k.shift();for(let c of f.get(a)??[])j.has(c)||(j.set(c,b+1),k.push({id:c,depth:b+1}))}let l=0;for(let a of j.values())l=Math.max(l,a);for(let a of g)j.has(a.id)||j.set(a.id,l+1);let m=new Map;for(let[a,c]of b)m.set(c.id,a);let n=new Map;for(let a of g){let b=m.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=j.get(a.id),f=n.get(d)??0;n.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let o=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=o.get(a)??0;o.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}}(0,D,G,F,0===o?c.positions:void 0);let I={id:B,name:A,...d?.description?{description:d.description}:{},nodes:E,edges:G};return l.push(I),v.push({id:I.id,name:I.name}),I}(a,0,[]),y=l,z=d;let A=z.filter(a=>"error"===a.severity).length;return{flow:x,flows:y,issues:z,errorCount:A,warningCount:z.length-A}}(a,d);if(!e.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:e.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(e.flow.id=b.updateFlowId);let f=e.flows.flatMap(a=>(0,v.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),g=function(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}(e.issues,{issues:f,errorCount:0,warningCount:0,isRunnable:!0}),h=!1;if(b.save&&0===g.errorCount){for(let a of e.flows)await i.flowService.saveFlow(a);h=!0,A.info(`Compiled and saved ${e.flows.length} flow(s); root "${e.flow.name}" (${e.flow.id})`)}else b.save&&A.info(`Compiled flow "${e.flow.name}" has ${g.errorCount} error(s); NOT saved`);return{success:!0,flow:e.flow,flows:e.flows,validation:g,saved:h}}var C=c(96936),D=c(79111),E=c(34115);let F=(0,h.h)("backend/execution/flow/loadConversationState");async function G(a){if(C.FlowExecutor.conversationStates.has(a))return F.debug("Loaded state from memory",{conversationId:a}),C.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,D.YM)(b,void 0);if(c)return F.debug("Loaded state from storage",{conversationId:a}),await (0,E.jM)(c),C.FlowExecutor.conversationStates.set(a,c),c}catch(b){F.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}var H=c(96249),I=c(63129);let J=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
2
+ {
3
+ "name": "short_flow_name", // letters/digits/_/- only
4
+ "description": "what the flow does",
5
+ "nodes": [ ... ],
6
+ "edges": [ ... ]
7
+ }
8
+
9
+ NODE TYPES:
10
+ - { "key": "unique_key", "type": "start", "label": "...", "prompt": "system-level instructions for the whole flow" }
11
+ - { "key": "...", "type": "process", "label": "...", "description": "what this step does",
12
+ "model": "<model id or name from the catalog>",
13
+ "prompt": "instructions for this step",
14
+ "servers": [ { "name": "<server name>", "tools": ["tool_a"] } ], // optional; omit "tools" to enable all
15
+ "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history
16
+ "isolatedPrompt": "...", // only with inputMode "isolated"
17
+ "outputMode": "full-conversation" | "latest-message" } // optional, default full-conversation; latest-message hides this step's tool calls/results from later steps (they see only its final response)
18
+ - { "key": "...", "type": "subflow", "label": "...",
19
+ "flow": "<existing flow name or id>", // reference an EXISTING flow, OR:
20
+ "subflowSpec": { ...a nested FlowSpec... }, // define a brand-new child flow INLINE (compiled into its own flow and wired automatically)
21
+ "inputMode": "full-history" | "latest-message" | "isolated",
22
+ "allowCallerPrompt": true | false, // optional, only with inputMode "isolated"; when true a routing step may pass a "prompt" via its handoff tool that overrides the subflow's "prompt" (default)
23
+ "outputMode": "steps" | "final-only" }
24
+ - { "key": "...", "type": "finish", "label": "..." }
25
+
26
+ EDGES: { "from": "<node key>", "to": "<node key>", "bidirectional": true|false }
27
+
28
+ RULES:
29
+ 1. Exactly ONE start node; at least one finish node reachable from it.
30
+ 2. Every process node MUST reference a configured model (by id, display name, or name).
31
+ 3. A process step uses MCP tools ONLY via its "servers" list — never emit nodes of type "mcp".
32
+ 4. Do not embed \${tool:...} or \${resource:...} references in prompts — tools are wired through "servers".
33
+ 5. Branching: give a process node multiple outgoing edges; its model decides where to hand off at runtime. "bidirectional": true lets the target hand back to the source (agent <-> agent).
34
+ 6. A subflow node may have only ONE outgoing edge. Give it EITHER a "flow" (naming an existing flow) OR a "subflowSpec" (an inline nested FlowSpec that becomes its own child flow) — not both. A "subflowSpec" may itself contain subflow nodes with their own "subflowSpec" (bounded nesting), so you can author whole multi-level flows in one object.
35
+ 7. Keep flows minimal — only the steps the task needs. Write clear, specific prompts and labels; fill "description" on process nodes.`;var K=c(12700),L=c(79861);let M=(0,h.h)("backend/services/mcp/registryInstall"),N="/v0.1/servers";async function O(a,b=8){let c=new URL(K.jD+N);c.searchParams.set("version","latest"),c.searchParams.set("limit",String(Math.min(Math.max(b,1),30))),a&&c.searchParams.set("search",a);let d=await (0,K.Ws)(c,15e3);return(Array.isArray(d?.servers)?d.servers:[]).map(a=>(function(a){let b=(0,L.AH)(a),c=b[0];return{name:a.name,...a.title?{title:a.title}:{},...a.description?{description:a.description}:{},installable:b.length>0,requiredEnv:c?(0,L.jg)(c):[]}})(a.server))}async function P(a){let b=new URL(K.jD+N);b.searchParams.set("version","latest"),b.searchParams.set("limit","10"),b.searchParams.set("search",a);let c=await (0,K.Ws)(b,15e3),d=Array.isArray(c?.servers)?c.servers:[];return d.find(b=>b.server?.name===a)??d[0]??null}async function Q(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A registry server name is required"};try{d=await P(a)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=d?.server??null;if(!e)return{installed:!1,error:`No registry entry found for "${a}"`};let f=(0,L.AH)(e)[0];if(!f)return{installed:!1,error:`"${e.name}" has no install method FLUJO supports (stdio package or HTTP remote)`};let g=(0,L.vf)(d),h=(0,L.O$)(a,e,f,g);if(c?.resolveOnly)return{installed:!1,serverName:h.serverName,plan:h};let i=(0,L.jg)(f,b);if(i.length>0)return{installed:!1,needsEnv:i,plan:h,error:`"${e.name}" requires values for: ${i.join(", ")}`};let j=(0,L.cy)((0,L.Yr)(e,f),b),k=j.name,l=await w.mcpService.loadServerConfigs();if(Array.isArray(l)&&l.some(a=>a.name===k)){M.info(`installRegistryServer: "${k}" already configured; reusing`);let{tools:a,error:b}=await w.mcpService.listServerTools(k);return{installed:!0,alreadyExisted:!0,serverName:k,plan:h,tools:(a??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...b?{error:b}:{}}}M.info(`installRegistryServer: installing "${e.name}" as "${k}" (${f.kind})`);let m=await w.mcpService.updateServerConfig(k,j);if(!Array.isArray(m)&&m&&"success"in m&&!1===m.success)return{installed:!1,error:`Saving the server failed: ${m.error??"unknown error"}`};let{tools:n,error:o}=await w.mcpService.listServerTools(k);return{installed:!0,serverName:k,plan:h,tools:(n??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...o?{error:o}:{}}}var R=c(89392);let S={requireConsent:!0,namespaceAllowlist:[],trustBrainStem:!0};function T(a,b,c,d,e){return{at:new Date().toISOString(),caller:b,registryName:a.registryName,resolvedName:a.resolvedName,serverName:a.serverName,transport:a.transport,...a.command?{command:a.command}:{},...a.args?{args:a.args}:{},...a.serverUrl?{serverUrl:a.serverUrl}:{},requiredEnvNames:a.requiredEnvNames,verificationStatus:a.verificationStatus,consent:{allowed:c.allowed,reason:c.reason},installed:d,...e?{error:e}:{}}}let U=(0,h.h)("backend/services/mcp/autoInstall");async function V(){try{let a=await (0,D.YM)(R.Z.MCP_AUTO_INSTALL_SETTINGS,S)??{};return{requireConsent:"boolean"==typeof a.requireConsent?a.requireConsent:S.requireConsent,namespaceAllowlist:Array.isArray(a.namespaceAllowlist)?a.namespaceAllowlist.filter(a=>"string"==typeof a&&a.length>0):[],trustBrainStem:"boolean"==typeof a.trustBrainStem?a.trustBrainStem:S.trustBrainStem}}catch(a){return U.warn("Failed to load mcpAutoInstall settings; using safe defaults",a),{...S}}}let W="mcp-install-audit",X=Promise.resolve();async function Y(){try{return await (0,D.YM)(W,[])}catch(a){return U.error("Failed to load MCP install audit log",a),[]}}async function Z(a){let b=X.catch(()=>{}).then(async()=>{let b=await Y();b.push(a);let c=b.slice(-300);await (0,D.VH)(W,c)}).catch(a=>{U.error("Failed to append MCP install audit entry",a)});X=b,await b}let $=(0,h.h)("backend/services/mcp/flowAuthoringTools"),_=["list_flow_building_blocks","validate_flow_spec","create_flow","search_mcp_marketplace","install_mcp_server"];function aa(){return{type:"object",properties:{spec:{type:"object",description:"The FlowSpec object (see the tool description for the format)."}},required:["spec"]}}function ab(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function ac(a,b){try{if("list_flow_building_blocks"===a){let a=await z();return ab(a.blocks)}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await O(a);return ab(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await Q(a,c,{resolveOnly:!0});if(!d.plan)return ab(d,!0);let e=await V(),f=function(a){let{caller:b,settings:c,registryName:d,allowInstall:e}=a;if("generator"===b)return!0===e?{allowed:!0,reason:"generator-allowinstall",message:"Approved by the per-generation allowInstall opt-in."}:{allowed:!1,reason:"generator-not-allowed",message:"Installing is not allowed in this generation (allowInstall is off)."};if("authoring-tool"===b&&c.trustBrainStem)return{allowed:!0,reason:"brainstem-trusted",message:"Approved: the /mcp-flows authoring tool is trusted (mcpAutoInstall.trustBrainStem)."};if(!c.requireConsent)return{allowed:!0,reason:"consent-disabled",message:"Approved: consent is not required (mcpAutoInstall.requireConsent is off)."};let f=function(a){if("string"!=typeof a)return"";let b=a.indexOf("/");return b>0?a.slice(0,b):""}(d);return""!==f&&c.namespaceAllowlist.includes(f)?{allowed:!0,reason:"namespace-allowlisted",message:`Approved: namespace "${f}" is allowlisted.`}:{allowed:!1,reason:"consent-required",message:"Consent required: review the exact command and arguments, then approve this install (SEP-1024)."}}({caller:"authoring-tool",settings:e,registryName:a}),g=(0,L.nO)(d.plan.verificationStatus)?void 0:`Unverified / self-asserted registry entry (status: ${d.plan.verificationStatus}). Registry entries are publisher-asserted — review the command before approving.`;if(await Z(T(d.plan,"authoring-tool",f,!1)),!f.allowed)return ab({installed:!1,consentRequired:!0,message:f.message,plan:d.plan,...g?{verificationWarning:g}:{}});let h=await Q(a,c);return await Z(T(h.plan??d.plan,"authoring-tool",f,h.installed,h.error)),ab({...h,...g?{verificationWarning:g}:{}},!h.installed)}if("validate_flow_spec"===a||"create_flow"===a){let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(b);if(!c)return ab({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await B(c,{save:"create_flow"===a});if(!d.success)return ab({error:d.error,issues:d.issues??[]},!0);let e=d.flows.length,f=e>1?` (plus ${e-1} nested subflow flow(s))`:"",g={flowId:d.flow.id,flowName:d.flow.name,nodeCount:d.flow.nodes.length,edgeCount:d.flow.edges.length,...e>1?{flows:d.flows.map(a=>({id:a.id,name:a.name}))}:{},validation:d.validation,..."create_flow"===a?{saved:d.saved,...d.saved?{note:`Flow "${d.flow.name}"${f} was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${d.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return ab(g,"create_flow"===a&&!d.saved)}return ab({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return $.error("authoringCallTool failed",{toolName:a,err:b}),ab({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}var ad=c(92018);let ae=(0,h.h)("backend/services/mcp/internalTools");function af(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function ag(){return[{name:"list_flow_building_blocks",description:'List everything a FlowSpec may reference in this FLUJO instance: configured models (bind to process steps), MCP servers and their tools (attach via "servers"), and existing flows (usable as subflow targets). Call this before authoring a spec.',inputSchema:{type:"object",properties:{}}},{name:"validate_flow_spec",description:`Compile and validate a FlowSpec WITHOUT saving. Returns the compiled flow's validation result (errors block saving; warnings are advisory) so you can iterate until clean, then call create_flow.
36
+
37
+ ${J}`,inputSchema:aa()},{name:"create_flow",description:`Create a new FLUJO flow from a FlowSpec. The spec is compiled deterministically (layout, ids, and wiring are generated for you) and saved ONLY when validation finds zero errors — otherwise the issues are returned to fix. Use list_flow_building_blocks first to see the models, MCP servers/tools, and existing flows you may reference.
38
+
39
+ ${J}`,inputSchema:aa()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Installs are gated by consent (SEP-1024): unless this trusted authoring tool is allowed via the mcpAutoInstall settings (trustBrainStem / requireConsent / namespaceAllowlist), the tool returns the exact resolved command + arguments with consentRequired=true INSTEAD of installing, and the caller must obtain explicit approval. Every attempt is written to an audit log (command, args, env NAMES, verification status — never secret values) before any spawn. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument), or the resolved plan when consent is required. First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}},{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"terminal",description:'Run a shell command on the FLUJO host and return its combined stdout/stderr plus exit code. Runs through a shell, so pipes and chained commands (e.g. "npm install && npm run build") work. Use it to install dependencies, build a cloned MCP server, inspect the filesystem, or run diagnostics. Working directory defaults to the FLUJO data directory (where cloned servers live under mcp-servers/); pass "cwd" to run elsewhere. The command is killed if it exceeds the timeout, and very large output is truncated.',inputSchema:{type:"object",properties:{command:{type:"string",description:'The shell command line to execute, e.g. "npm install && npm run build".'},cwd:{type:"string",description:"Optional working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory."},timeout:{type:"number",description:"Optional timeout in seconds (default 60, max 600). The command is killed if it runs longer."}},required:["command"]}}]}async function ah(a){let b=await i.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function ai(a){let b=String(a?.flow??"").trim();if(!b)return af({error:'Provide "flow": a flow name or id.'},!0);let c=await ah(b);if(!c)return af({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return af({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return af({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return af({error:b.error?.message??"Unknown error during flow execution."},!0);return af(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function aj(a){let b=String(a?.flow??"").trim();if(!b)return af({error:'Provide "flow": a flow name or id.'},!0);let c=await ah(b);if(!c)return af({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.deleteFlow(c.id);return d.success?af({deleted:!0,flowId:c.id,flowName:c.name}):af({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function ak(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function al(a){let b=String(a?.flow??"").trim();if(!b)return af({error:'Provide "flow": a flow name or id.'},!0);let c=await ah(b);return c?af({...ak(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):af({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function am(a){let b=String(a?.flow??"").trim();if(!b)return af({error:'Provide "flow": a flow name or id.'},!0);let c=await ah(b);if(!c)return af({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.listFlowVersions(c.id);return af({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function an(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return af({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await ah(b);if(!d)return af({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.getFlowVersion(d.id,c);return e?af({versionId:e.versionId,savedAt:e.savedAt,...ak(e.flow)}):af({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function ao(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return af({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await ah(b);if(!d)return af({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.revertFlow(d.id,c);return e.success?af({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):af({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function ap(a){let b=String(a?.flow??"").trim();if(!b)return af({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return af({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await ah(b);if(!d)return af({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await B(c,{save:!0,updateFlowId:d.id});return e.success?af({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):af({error:e.error,issues:e.issues??[]},!0)}async function aq(a){let b=await a.loadServerConfigs();return Array.isArray(b)?af(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){ae.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):af({error:b.error??"Failed to load server configs."},!0)}async function ar(a,b){let c=String(b?.server??"").trim();if(!c)return af({error:'Provide "server": a FLUJO server name.'},!0);if(c===ad._)return af(ag().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:d,error:e}=await a.listServerTools(c);return e?af({error:e},!0):af(d.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function as(a,b){let c=String(b?.server??"").trim(),d=String(b?.tool??"").trim();if(!c||!d)return af({error:'Provide "server" and "tool".'},!0);if(c===ad._)return af({error:`"${ad._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let e=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},f="number"==typeof b?.timeout?b.timeout:void 0,g=await a.callTool(c,d,e,f);if(!g.success)return af({error:g.error??`Tool call failed on ${c}.`},!0);let h=g.data;return h&&Array.isArray(h.content)?h:af(h??{ok:!0})}async function at(a,b){let c=String(b?.server??"").trim();if(!c)return af({error:'Provide "server": a FLUJO server name.'},!0);if(c===ad._)return af({ok:!0,note:`"${ad._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return af({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return af({restarted:!0,server:c,status:e.status})}async function au(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return af({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===ad._)return af({error:`The built-in "${ad._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?af({error:e.error},!0):af({server:c,enabled:d})}async function av(){return af((await j.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function aw(){return af((await (0,k.z)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function ax(a){let b=String(a?.id??"").trim();if(!b)return af({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,k.z)().runNow(b);return d||!c?af({error:d??"Run failed."},!0):af({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function ay(a){let b,c=e().join((0,I.ok)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return af([]);return af({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===H.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return ae.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return af(g?d.slice(0,g):d)}async function az(a){let b=String(a?.conversation??"").trim();if(!b)return af({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,E.u8)(b);let c=await G(b);if(!c)return af({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,E.Os)(b),e=d?(0,E.cc)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),af({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}async function aA(a){let b=String(a?.command??"").trim();if(!b)return af({error:'Provide "command": a shell command line to run.'},!0);let c=(0,I.ok)(),d="string"==typeof a?.cwd?a.cwd.trim():"",f=d?e().isAbsolute(d)?d:e().join(c,d):c,h=Math.min(1e3*("number"==typeof a?.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let c,d="",e=!1,i=!1,j=!1,k=a=>{!e&&(d+=a).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0)};try{c=(0,g.spawn)(b,{cwd:f,shell:!0,env:process.env})}catch(b){a(af({error:`Failed to start command: ${b instanceof Error?b.message:String(b)}`,cwd:f},!0));return}let l=setTimeout(()=>{j=!0;try{c.kill()}catch{}},h),m=b=>{i||(i=!0,clearTimeout(l),a(b))};c.stdout?.on("data",a=>k(a.toString())),c.stderr?.on("data",a=>k(a.toString())),c.on("error",a=>{k(`
40
+ ${a.message}`),m(af({error:`Command failed to start: ${a.message}`,cwd:f,output:d},!0))}),c.on("close",a=>{if(j)return void m(af({timedOut:!0,cwd:f,exitCode:a,output:`${d}
41
+ [killed after ${h/1e3}s timeout]`},!0));m(af({exitCode:a,cwd:f,output:d},0!==a))})})}async function aB(a,b,c){try{if(_.includes(b))return await ac(b,c);switch(b){case"execute_flow":return await ai(c);case"read_flow":return await al(c);case"update_flow":return await ap(c);case"list_flow_versions":return await am(c);case"read_flow_version":return await an(c);case"revert_flow":return await ao(c);case"delete_flow":return await aj(c);case"list_mcp_servers":return await aq(a);case"list_mcp_server_tools":return await ar(a,c);case"call_mcp_tool":return await as(a,c);case"restart_mcp_server":return await at(a,c);case"set_mcp_server_enabled":return await au(a,c);case"list_models":return await av();case"list_planned_executions":return await aw();case"run_planned_execution":return await ax(c);case"list_conversations":return await ay(c);case"read_conversation":return await az(c);case"terminal":return await aA(c);default:return af({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return ae.error("internalCallTool failed",{toolName:b,err:a}),af({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
@@ -0,0 +1,6 @@
1
+ exports.id=6069,exports.ids=[6069,7821,7982],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},48312:(a,b,c)=>{"use strict";c.d(b,{cA:()=>p});var d=c(10641),e=c(50846),f=c(91403),g=c(38291),h=c(99978),i=c(57214),j=c(14214),k=c(20433);let l=(0,e.h)("app/v1/chat/completions/chatCompletionService");function m(a){return Math.ceil((a||"").length/4)}let n=g.n;async function o(a,b,c,e,f,g=!1,j=!1){let k=Date.now();l.info("Processing chat completion request",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,flujo:b,requireApproval:c,flujodebug:e,conversationId:f});let n=await (0,i.runFlow)({modelName:a.model,messages:a.messages,processNodeId:a.processNodeId,mode:"conversation",conversationId:f,flujo:b,requireApproval:c,debug:e,continueDebug:g,userTurn:j});if(n.flowNotFound)return d.NextResponse.json({error:{message:`Flow not found: ${n.flowNotFound.name}`,type:"invalid_request_error",code:"flow_not_found"}},{status:400});if("paused_debug"===n.status)return l.info(`Returning paused debug state for conv ${n.conversationId}`),d.NextResponse.json({status:"paused_debug",conversation_id:n.conversationId,debugState:n.sharedState});if("error"===n.status){let a=n.error?.message??"Unknown error during execution",b=n.error?.details??{message:a},c=n.error?.statusCode??500;return l.error(`Returning error response for conv ${n.conversationId}`,{errorMessage:a,errorDetails:b,statusCode:c}),d.NextResponse.json({error:{message:a,type:b.type||"api_error",code:b.code||"internal_error",param:b.param,details:b}},{status:c})}let p={role:"assistant",content:n.outputText,tool_calls:n.toolCalls},q="stop";"awaiting_tool_approval"===n.sharedState.status?q="stop":n.finalAction===h.Jp&&p.tool_calls&&p.tool_calls.length>0?q="tool_calls":n.finalAction===h.E5&&(q="length");let r=m(n.messages.map(a=>a.content||"").join("\n")),s=m(n.outputText),t={id:`chatcmpl-${Date.now()}`,object:"chat.completion",created:Math.floor(k/1e3),model:a.model,choices:[{index:0,message:p,finish_reason:q}],usage:{prompt_tokens:r,completion_tokens:s,total_tokens:r+s},messages:n.messages,conversation_id:n.conversationId,status:n.sharedState.status||(n.finalAction===h.g4?"completed":"running"),pendingToolCalls:n.sharedState.pendingToolCalls};return l.info(`Returning success response for conv ${n.conversationId}`,{action:n.finalAction,status:t.status,flujo:b,requireApproval:c,flujodebug:e,finish_reason:q}),l.verbose(`Final response data for conv ${n.conversationId}`,t),d.NextResponse.json(t)}async function p(a,b,c,d,e,g=!1,h=!1){if("string"==typeof a.model&&a.model.startsWith("model-"))return(b||c||d||e)&&l.debug("Ignoring flow-only flags on a direct model completion",{flujo:b,requireApproval:c,flujodebug:d,conversationId:e}),q(a);if(!0!==a.stream)return o(a,b,c,d,e,g,h);{let i=e||crypto.randomUUID();return l.info(`Streaming requested for conversation ${i}. Starting async processing.`),o(a,b,c,d,i,g,h).catch(a=>{l.error(`Error in background processing for conversation ${i}:`,a);let b=f.FlowExecutor.conversationStates.get(i);b&&(b.status="error",b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a)},f.FlowExecutor.conversationStates.set(i,b),n(`conversations/${i}`,b).catch(a=>{l.error(`Failed to save error state for conversation ${i}:`,a)})),j.$.emitterFor(i)({type:"run:done",status:"error"})}),function(a,b){let c=new TextEncoder,d=`chatcmpl-${Date.now()}`,e=Math.floor(Date.now()/1e3);return l.debug("create streaming response (event-bus driven)",{conversationId:b}),new Response(new ReadableStream({start(g){let h=!1,i=null,k=-1,l=a=>{g.enqueue(c.encode(`data: ${JSON.stringify(a)}
2
+
3
+ `))},m=(b,c)=>({id:d,object:"chat.completion.chunk",created:e,model:a,choices:[{index:0,delta:b,finish_reason:c}]}),n=a=>{if(h)return;h=!0;let d="error"===a?"error":"stop";l(m({content:"",conversation:f.FlowExecutor.conversationStates.get(b)},d)),l(m({},d)),g.enqueue(c.encode("data: [DONE]\n\n")),i&&i();try{g.close()}catch{}},o=a=>{if(!h&&!(a.seq<=k))if(k=a.seq,"message"===a.type){let b=a.message;b&&"assistant"===b.role&&"string"==typeof b.content&&b.content.length>0&&l(m({content:b.content},null))}else"run:done"===a.type?n("error"===a.status?"error":"completed"):("run:awaiting_approval"===a.type||"run:paused"===a.type)&&n("stop")};for(let a of(l(m({role:"assistant",content:""},null)),i=j.$.subscribe(b,o),j.$.getBufferedSince(b,0)))o(a);if(!h){let a=f.FlowExecutor.conversationStates.get(b);a&&("completed"===a.status||"error"===a.status)&&n("error"===a.status?"error":"completed")}}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}(a.model,i)}}async function q(a){let b=a.model.slice(6);l.info("Processing direct model completion",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,hasTools:!!(a.tools&&a.tools.length>0)});let c=await k.modelService.generateChatCompletion({modelIdentifier:b,messages:a.messages,temperature:a.temperature,tools:a.tools});return c.success?!0===a.stream?function(a,b){let c=new TextEncoder,d=b.id||`chatcmpl-${Date.now()}`,e=b.created||Math.floor(Date.now()/1e3),f=b.choices?.[0],g=f?.finish_reason??"stop";return new Response(new ReadableStream({start(b){let h=a=>{b.enqueue(c.encode(`data: ${JSON.stringify(a)}
4
+
5
+ `))},i=(b,c)=>({id:d,object:"chat.completion.chunk",created:e,model:a,choices:[{index:0,delta:b,finish_reason:c}]});h(i({role:"assistant",content:""},null));let j="string"==typeof f?.message?.content?f.message.content:"";j.length>0&&h(i({content:j},null));let k=f?.message?.tool_calls;k&&k.length>0&&h(i({tool_calls:k.map((a,b)=>({index:b,...a}))},null)),h(i({},g)),b.enqueue(c.encode("data: [DONE]\n\n")),b.close()}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}(a.model,c.completion):d.NextResponse.json(c.completion):(l.warn("Direct model completion failed",{model:a.model,code:c.error.code,statusCode:c.statusCode}),d.NextResponse.json({error:{message:c.error.message,type:c.error.type,code:c.error.code,param:c.error.param??null}},{status:c.statusCode}))}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
6
+ Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},87821:(a,b,c)=>{"use strict";c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v},96487:()=>{}};
@@ -0,0 +1,5 @@
1
+ "use strict";exports.id=6201,exports.ids=[6201],exports.modules={2173:(a,b,c)=>{c.d(b,{A:()=>r});var d=c(21124),e=c(38301),f=c(81637),g=c(79515),h=c(53773),i=c(37674),j=c(43312),k=c(44079),l=c(20830),m=c(47902),n=c(91034),o=c(30717),p=c(46410),q=c(32720);let r=({roots:a,onChange:b})=>{let c=Array.isArray(a)?a:[],[r,s]=(0,e.useState)(null),t=(a,d)=>{b(c.map((b,c)=>c===a?d:b))};return(0,d.jsxs)(f.default,{children:[(0,d.jsxs)(f.default,{sx:{display:"flex",alignItems:"center",mb:.5},children:[(0,d.jsx)(o.A,{fontSize:"small",sx:{mr:1,color:"text.secondary"}}),(0,d.jsx)(g.default,{variant:"subtitle1",children:"Workspace folders"})]}),(0,d.jsxs)(g.default,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1.5},children:["Limit which folders this server may work in. Advisory only — the server is told these paths via MCP roots; it is not a hard sandbox. Leave empty to default to the server's own root dir. Supports ",(0,d.jsx)("code",{children:"${global:VAR}"}),"."]}),(0,d.jsx)(h.A,{spacing:1,children:c.map((a,e)=>(0,d.jsxs)(f.default,{sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(i.A,{size:"small",fullWidth:!0,placeholder:"/path/to/folder or file:///path",value:a,onChange:a=>t(e,a.target.value)}),(0,d.jsx)(j.A,{title:"Browse folders (on the FLUJO machine)",children:(0,d.jsx)(k.A,{size:"small",onClick:()=>s(e),"aria-label":"browse for folder",children:(0,d.jsx)(p.A,{fontSize:"small"})})}),(0,d.jsx)(j.A,{title:"Remove",children:(0,d.jsx)(k.A,{size:"small",onClick:()=>b(c.filter((a,b)=>b!==e)),"aria-label":"remove workspace folder",children:(0,d.jsx)(n.A,{fontSize:"small"})})})]},e))}),(0,d.jsx)(l.A,{size:"small",startIcon:(0,d.jsx)(m.A,{}),onClick:()=>b([...c,""]),sx:{mt:1},children:"Add folder"}),(0,d.jsx)(q.A,{open:null!==r,title:"Choose a workspace folder",initialPath:null!==r&&c[r]||void 0,onClose:()=>s(null),onSelect:a=>{null!==r&&t(r,a)}})]})}},2560:(a,b,c)=>{c.d(b,{Xk:()=>e});var d=c(38301);function e(a,b){let[c,e]=(0,d.useState)(()=>b);return[c,(0,d.useCallback)(a=>{e(b=>"function"==typeof a?a(b):a)},[a])]}},7329:(a,b,c)=>{function d(a,b){let c=[],d=new Map;for(let e of a){let{key:a,label:f}=b(e),g=d.get(a);g||(g={key:a,label:f,items:[]},d.set(a,g),c.push(g)),g.items.push(e)}return c}function e(a){let b=(a??"").trim().charAt(0).toUpperCase();return b>="A"&&b<="Z"?{key:`letter:${b}`,label:b}:{key:"letter:#",label:"#"}}function f(a,b,c="Ungrouped"){let d=new Map,e=[];for(let c of a){let a=b(c)?.trim();if(a){let b=d.get(a);b?b.push(c):d.set(a,[c])}else e.push(c)}let g=Array.from(d.keys()).sort((a,b)=>a.localeCompare(b)).map(a=>({key:`folder:${a}`,label:a,items:d.get(a)}));return e.length>0&&g.push({key:"folder:__ungrouped__",label:c,items:e}),g}function g(a,b){let c=new Set;for(let d of a){let a=b(d)?.trim();a&&c.add(a)}return Array.from(c).sort((a,b)=>a.localeCompare(b))}c.d(b,{Az:()=>d,Je:()=>f,po:()=>e,yF:()=>g})},32631:(a,b,c)=>{c.d(b,{D:()=>h}),c(21124);var d=c(38301),e=c(19815);c(84040),c(9718);let f=(0,e.h)("frontend/contexts/ThemeContext"),g=(0,d.createContext)(void 0),h=()=>{let a=(0,d.useContext)(g);if(!a)throw f.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return f.debug("useTheme hook accessed"),a}},32720:(a,b,c)=>{c.d(b,{A:()=>B});var d=c(21124),e=c(38301),f=c(40512),g=c(83899),h=c(52327),i=c(81637),j=c(43312),k=c(44079),l=c(37674),m=c(41893),n=c(88745),o=c(8521),p=c(79515),q=c(89490),r=c(75983),s=c(50553),t=c(84233),u=c(19925),v=c(20830),w=c(30717),x=c(98810),y=c(52399),z=c(91314);let A=(0,c(19815).h)("frontend/components/shared/FolderPickerDialog"),B=({open:a,title:b="Choose a folder",selectFiles:c=!1,initialPath:B,onClose:C,onSelect:D})=>{let[E,F]=(0,e.useState)(null),[G,H]=(0,e.useState)(""),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(null),M=(0,e.useCallback)(async a=>{J(!0),L(null);try{let b=a?`?path=${encodeURIComponent(a)}`:"",c=await fetch(`/api/browse${b}`),d=await c.json();if(!c.ok||d.error)return void L(d.error||`HTTP ${c.status}`);F(d),H(d.path)}catch(a){A.warn("Browse failed",a),L("Could not reach the backend to browse folders.")}finally{J(!1)}},[]);(0,e.useEffect)(()=>{a?M(B||void 0):(F(null),L(null))},[a,B,M]);let N=a=>{D(a),C()};return(0,d.jsxs)(f.A,{open:a,onClose:C,maxWidth:"sm",fullWidth:!0,children:[(0,d.jsx)(g.A,{children:b}),(0,d.jsxs)(h.A,{dividers:!0,sx:{display:"flex",flexDirection:"column",gap:1.5},children:[(0,d.jsxs)(i.default,{sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(j.A,{title:"Up one folder",children:(0,d.jsx)("span",{children:(0,d.jsx)(k.A,{size:"small",disabled:!E?.parent||I,onClick:()=>E?.parent&&void M(E.parent),children:(0,d.jsx)(y.A,{fontSize:"small"})})})}),(0,d.jsx)(j.A,{title:"Home folder",children:(0,d.jsx)("span",{children:(0,d.jsx)(k.A,{size:"small",disabled:I,onClick:()=>void M(),children:(0,d.jsx)(z.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{fullWidth:!0,size:"small",value:G,onChange:a=>H(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),M(G))},placeholder:"Type a path and press Enter"})]}),E&&E.drives.length>0&&(0,d.jsx)(i.default,{sx:{display:"flex",gap:.75,flexWrap:"wrap"},children:E.drives.map(a=>(0,d.jsx)(m.A,{label:a,size:"small",variant:E.path.toLowerCase().startsWith(a.toLowerCase())?"filled":"outlined",onClick:()=>void M(a)},a))}),K&&(0,d.jsx)(n.A,{severity:"error",children:K}),(0,d.jsxs)(i.default,{sx:{minHeight:240,maxHeight:"45vh",overflow:"auto",border:1,borderColor:"divider",borderRadius:1},children:[I&&(0,d.jsx)(i.default,{sx:{display:"flex",justifyContent:"center",py:4},children:(0,d.jsx)(o.default,{size:24})}),!I&&E&&0===E.entries.length&&(0,d.jsx)(p.default,{variant:"body2",color:"text.secondary",sx:{p:2},children:"This folder is empty."}),!I&&(0,d.jsx)(q.A,{dense:!0,disablePadding:!0,children:E?.entries.map(a=>(0,d.jsxs)(r.A,{disabled:!a.isDirectory&&!c,onClick:()=>a.isDirectory?void M(a.path):N(a.path),children:[(0,d.jsx)(s.A,{sx:{minWidth:34},children:a.isDirectory?(0,d.jsx)(w.A,{fontSize:"small",color:"primary"}):(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(t.A,{primary:a.name,primaryTypographyProps:{noWrap:!0}})]},a.path))})]})]}),(0,d.jsxs)(u.A,{children:[(0,d.jsx)(v.A,{onClick:C,children:"Cancel"}),(0,d.jsx)(v.A,{variant:"contained",disabled:!E||I,onClick:()=>E&&N(E.path),children:"Select this folder"})]})]})}},33799:(a,b,c)=>{c.d(b,{b:()=>f,c:()=>g});var d=c(50648);async function e(a,b){try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!c.ok||!c.body)return null;let e=null;return await (0,d.z)(c,a=>{"stdout"===a.type||"stderr"===a.type?b(a.data):"result"===a.type&&(e={success:a.success,output:a.commandOutput??""})}),e}catch(a){return console.error("Error streaming git command:",a),null}}let f=async(a,b,c)=>{if(c){let d=await e({action:"installStream",savePath:a,installCommand:b},c);if(d)return{success:d.success,message:d.success?{type:"success",text:"Dependencies installed successfully. You can now build the server."}:{type:"error",text:"Error installing dependencies. You can still try to build the server."},output:d.output||"No output was returned from the installation process."}}try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"install",savePath:a,installCommand:b})}),d=await c.json();if(!c.ok)throw Error(d.error||"Failed to install dependencies");return{success:!0,message:{type:"success",text:"Dependencies installed successfully. You can now build the server."},output:d.commandOutput||"No output was returned from the installation process."}}catch(a){return console.error("Error installing dependencies:",a),{success:!1,message:{type:"error",text:`Error installing dependencies: ${a.message||"Unknown error"}. You can still try to build the server.`},output:a instanceof Response?await a.text():a?.message||"Unknown error"}}},g=async(a,b,c)=>{if(c){let d=await e({action:"buildStream",savePath:a,buildCommand:b},c);if(d)return{success:d.success,message:d.success?{type:"success",text:"Server built successfully."}:{type:"error",text:"Error building server."},output:d.output||"No output was returned from the build process."}}try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"build",savePath:a,buildCommand:b})}),d=await c.json();if(!c.ok)throw Error(d.error||"Failed to build repository");return{success:!0,message:{type:"success",text:"Server built successfully."},output:d.commandOutput||"No output was returned from the build process."}}catch(a){return console.error("Error building server:",a),{success:!1,message:{type:"error",text:`Error building server: ${a.message||"Unknown error"}.`},output:a instanceof Response?await a.text():a?.message||"Unknown error"}}}},46393:(a,b,c)=>{c.d(b,{A:()=>ae});var d=c(21124),e=c(38301),f=c(19815),g=c(84040),h=c(8165),i=c(93083),j=c(65343),k=c(53222),l=c(12033),m=c(91034),n=c(95786),o=c(64956),p=c(55641),q=c(29320),r=c(5748),s=c(38941),t=c(1312),u=c(25750),v=c(61615),w=c(78352),x=c(28055),y=c(41893),z=c(56685),A=c(71756),B=c(91901),C=c(83013);let D=({transport:a,size:b="small"})=>{let c=(()=>{switch(a){case"stdio":return{label:"STDIO",icon:(0,d.jsx)(z.A,{fontSize:"small"}),color:"#1976d2",bgColor:"#e3f2fd"};case"websocket":return{label:"WebSocket",icon:(0,d.jsx)(A.A,{fontSize:"small"}),color:"#2e7d32",bgColor:"#e8f5e8"};case"sse":return{label:"SSE",icon:(0,d.jsx)(B.A,{fontSize:"small"}),color:"#f57c00",bgColor:"#fff3e0"};case"streamable":return{label:"HTTP Stream",icon:(0,d.jsx)(C.A,{fontSize:"small"}),color:"#00796b",bgColor:"#e0f2f1"};default:return{label:"UNKNOWN",icon:(0,d.jsx)(z.A,{fontSize:"small"}),color:"#757575",bgColor:"#f5f5f5"}}})();return(0,d.jsx)(y.A,{icon:c.icon,label:c.label,size:b,sx:{backgroundColor:c.bgColor,color:c.color,fontWeight:500,fontSize:"small"===b?"0.75rem":"0.875rem",height:"small"===b?24:32,"& .MuiChip-icon":{color:c.color}}})};var E=c(40512),F=c(83899),G=c(52327),H=c(19925),I=c(20830),J=c(81637),K=c(79515),L=c(88745),M=c(95587),N=c(77028),O=c(89490),P=c(71439),Q=c(50553),R=c(84233),S=c(72264),T=c(53455),U=c(33799);let V=(0,f.h)("frontend/components/mcp/MCPServerManager/ServerUpdateDialog"),W=({open:a,onClose:b,serverName:c,rootPath:f,installCommand:g,buildCommand:i,enabled:k,updateInfo:l,onToggle:m,onUpdated:n})=>{let[o,p]=(0,e.useState)(null),[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(!1),[w,x]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)({}),[D,W]=(0,e.useState)(""),X=!!(g&&g.trim()),Y=!!(i&&i.trim()),Z=[{key:"stop",label:"Stop server",active:k},{key:"pull",label:"Pull latest changes",active:!0},{key:"install",label:`Install dependencies (${g})`,active:X},{key:"build",label:`Build (${i})`,active:Y},{key:"restart",label:"Restart server",active:k}];(0,e.useEffect)(()=>{a&&(r(!1),t(!1),x(!1),A(null),C({}),W(""))},[a,c]),(0,e.useEffect)(()=>{if(a&&l.remoteUrl&&l.localSha&&l.remoteSha){let a=!1;return(0,T.Qz)(l.remoteUrl,l.localSha,l.remoteSha).then(b=>{a||p(b)}),()=>{a=!0}}p(null)},[a,l.remoteUrl,l.localSha,l.remoteSha]);let $=(0,e.useCallback)((a,b)=>{C(c=>({...c,[a]:b}))},[]),_=(0,e.useCallback)((a,b)=>{W(c=>c+(c?"\n":"")+`--- ${a} ---
2
+ `+(b||"").trim()+"\n")},[]),aa=async()=>{t(!0),A(null),V.info(`Starting update for server ${c}`);let a=(a,b)=>{$(a,"error"),A(b),t(!1)};try{k&&($("stop","running"),await Promise.resolve(m(!1)),$("stop","done")),$("pull","running");let b=await (0,T.Qv)(f);if(!b.success)return void a("pull",b.error||"Failed to pull updates");if(_("Pull",`Updated ${(0,T.Fu)(b.oldSha)} -> ${(0,T.Fu)(b.newSha)}`),$("pull","done"),X){$("install","running");let b=await (0,U.b)(f,g.trim());if(_("Install",b.output),!b.success)return void a("install",b.message.text);$("install","done")}if(Y){$("build","running");let b=await (0,U.c)(f,i.trim());if(_("Build",b.output),!b.success)return void a("build",b.message.text);$("build","done")}k&&($("restart","running"),await Promise.resolve(m(!0)),$("restart","done")),V.info(`Update completed for server ${c}`),x(!0),t(!1),n?.()}catch(a){V.error(`Update failed for server ${c}`,a),A(a.message||"Update failed"),t(!1)}},ab=s||w||Object.keys(B).length>0,ac=l.hasLocalChanges&&!q;return(0,d.jsxs)(E.A,{open:a,onClose:s?void 0:b,maxWidth:"sm",fullWidth:!0,onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(F.A,{component:"div",sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(u.A,{color:"primary"}),"Update ",c]}),(0,d.jsxs)(G.A,{children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:1,flexWrap:"wrap"},children:[(0,d.jsx)(y.A,{size:"small",label:(0,T.Fu)(l.localSha),sx:{fontFamily:"monospace"}}),(0,d.jsx)(K.default,{variant:"body2",color:"text.secondary",children:"→"}),(0,d.jsx)(y.A,{size:"small",color:"primary",label:(0,T.Fu)(l.remoteSha),sx:{fontFamily:"monospace"}}),l.branch&&"HEAD"!==l.branch&&(0,d.jsxs)(K.default,{variant:"body2",color:"text.secondary",children:["on ",(0,d.jsx)("code",{children:l.branch})]}),o?.behindBy!=null&&(0,d.jsxs)(K.default,{variant:"body2",color:"text.secondary",children:["(",o.behindBy," commit",1===o.behindBy?"":"s"," behind)"]})]}),l.repoRoot&&l.repoRoot.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()!==f.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()&&(0,d.jsxs)(K.default,{variant:"body2",color:"text.secondary",sx:{mb:1},children:["This server lives inside a larger repository — the update pulls"," ",(0,d.jsx)("code",{children:l.repoRoot})," as a whole (other servers from the same repository are updated along with it)."]}),o&&o.commits.length>0&&!ab&&(0,d.jsx)(J.default,{sx:{mb:2,p:1,borderRadius:1,border:"1px solid",borderColor:"divider",maxHeight:160,overflow:"auto"},children:o.commits.map(a=>(0,d.jsxs)(K.default,{variant:"body2",sx:{fontSize:"0.8rem"},noWrap:!0,title:a.message,children:[(0,d.jsx)("code",{children:a.sha})," ",a.message]},a.sha))}),l.hasLocalChanges&&!ab&&(0,d.jsxs)(L.A,{severity:"warning",sx:{mb:2},children:[(0,d.jsxs)(K.default,{variant:"body2",sx:{mb:1},children:["This repository has local changes to tracked files. Updating will ",(0,d.jsx)("strong",{children:"discard"})," them. Untracked files (e.g. a ",(0,d.jsx)("code",{children:".env"})," you created) and all FLUJO settings for this server are kept."]}),(0,d.jsx)(J.default,{component:"ul",sx:{m:0,pl:3,maxHeight:100,overflow:"auto"},children:l.dirtyFiles.map(a=>(0,d.jsx)("li",{children:(0,d.jsx)(K.default,{variant:"body2",component:"span",sx:{fontFamily:"monospace",fontSize:"0.8rem"},children:a})},a))}),(0,d.jsx)(M.A,{sx:{mt:1},control:(0,d.jsx)(N.A,{size:"small",checked:q,onChange:a=>r(a.target.checked)}),label:(0,d.jsx)(K.default,{variant:"body2",children:"Discard my local changes and update"})})]}),(0,d.jsx)(O.A,{dense:!0,disablePadding:!0,children:Z.filter(a=>a.active).map(a=>(0,d.jsxs)(P.Ay,{disableGutters:!0,sx:{py:.25},children:[(0,d.jsx)(Q.A,{sx:{minWidth:32},children:(a=>{switch(a){case"running":return(0,d.jsx)(v.default,{size:"small",color:"primary"});case"done":return(0,d.jsx)(h.A,{color:"success",fontSize:"small"});case"error":return(0,d.jsx)(j.A,{color:"error",fontSize:"small"});default:return(0,d.jsx)(S.A,{color:"disabled",fontSize:"small"})}})(B[a.key])}),(0,d.jsx)(R.A,{primary:a.label,primaryTypographyProps:{variant:"body2",noWrap:!0,title:a.label}})]},a.key))}),z&&(0,d.jsxs)(L.A,{severity:"error",sx:{mt:2,whiteSpace:"pre-wrap"},children:[z,k&&(0,d.jsx)(K.default,{variant:"body2",sx:{mt:1},children:"The server was left stopped. Adjust the install/build commands via Edit, then re-enable it."})]}),w&&(0,d.jsxs)(L.A,{severity:"success",sx:{mt:2},children:["Server updated successfully",k?" and restarted":"","."]}),D&&(0,d.jsx)(J.default,{sx:{mt:2,p:1,borderRadius:1,bgcolor:"background.paper",border:"1px solid",borderColor:"divider",fontFamily:"monospace",fontSize:"0.75rem",whiteSpace:"pre-wrap",overflow:"auto",maxHeight:200},children:D})]}),(0,d.jsxs)(H.A,{children:[(0,d.jsx)(I.A,{onClick:b,disabled:s,children:w?"Close":"Cancel"}),!w&&(0,d.jsx)(I.A,{variant:"contained",color:"primary",startIcon:(0,d.jsx)(u.A,{}),onClick:aa,disabled:s||ac,children:s?"Updating…":z?"Retry Update":"Update"})]})]})};var X=c(30873),Y=c(60839),Z=c(30818),$=c(27114),_=c(43312),aa=c(44079),ab=c(67191),ac=c(98463);let ad=(0,f.h)("frontend/components/mcp/MCPServerManager/ServerCard"),ae=({name:a,status:b,path:f,enabled:z,transport:A,onToggle:B=()=>{},onRetry:C=()=>{},onDelete:M=()=>{},onClick:O,onEdit:P=()=>{},onAuthenticate:Q,pickerMode:R=!1,error:S,stderrOutput:U,authorizationUrl:V,selected:ae=!1,onSelect:af,selectionMode:ag=!1,hasOAuthTokens:ah=!1,exposeAsMcpServer:ai=!1,enableMcpApps:aj=!1,updateInfo:ak,installCommand:al,buildCommand:am,onUpdated:an,folder:ao,folders:ap=[],onSetFolder:aq,builtIn:ar=!1})=>{let[as,at]=(0,e.useState)(!1),[au,av]=(0,e.useState)(null),[aw,ax]=(0,e.useState)(!1),[ay,az]=(0,e.useState)(!1),[aA,aB]=(0,e.useState)(""),[aC,aD]=(0,e.useState)("success"),[aE,aF]=(0,e.useState)(!1),[aG,aH]=(0,e.useState)(!1),[aI,aJ]=(0,e.useState)(ai),[aK,aL]=(0,e.useState)(aj);(0,Y.A)(),(0,e.useEffect)(()=>{aJ(ai)},[ai]),(0,e.useEffect)(()=>{aL(aj)},[aj]);let aM=async b=>{aJ(b);let c=await x.S.updateServerConfig(a,{exposeAsMcpServer:b});"success"in c&&c.success?(aB(b?"Server is now exposed to external apps.":"Server is no longer exposed."),aD("success")):(aJ(!b),aB("Failed to update exposure setting."),aD("error")),az(!0)},aN=async b=>{aL(b);let c=await x.S.updateServerConfig(a,{enableMcpApps:b});"success"in c&&c.success?(aB(b?"This server may now render interactive apps in chat (sandboxed).":"Interactive apps disabled for this server."),aD("success")):(aL(!b),aB("Failed to update the MCP Apps setting."),aD("error")),az(!0)},aO=()=>{navigator.clipboard.writeText(""),aB("Endpoint URL copied to clipboard."),aD("success"),az(!0)},aP={connected:"success.main",disconnected:"text.secondary",error:"error.main",connecting:"info.main",initialization:"info.main",requires_authentication:"warning.main"}[b];(0,e.useEffect)(()=>{if(("connecting"===b||"initialization"===b)&&z&&!R){aF(!0);let b=setTimeout(()=>{ad.debug(`Polling status for server: ${a}`),C()},2e3);return()=>{clearTimeout(b),aF(!1)}}"connecting"!==b&&"initialization"!==b&&aF(!1)},[b,z,a,C]);let[aQ,aR]=(0,e.useState)(null);(0,e.useEffect)(()=>()=>{aQ&&clearTimeout(aQ)},[aQ]);let aS=async b=>{b.stopPropagation(),ad.debug(`Reset OAuth tokens button clicked for server: ${a}`),aH(!0);try{let b=await fetch("/api/oauth/reset",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:a})});if(!b.ok){let a=await b.json();throw Error(a.error||"Failed to reset OAuth tokens")}let c=await b.json();ad.info(`OAuth tokens reset successfully for ${a}`,c),aB("OAuth tokens reset successfully. Server will require re-authentication."),aD("success"),az(!0),setTimeout(()=>{C()},500)}catch(b){ad.error(`Failed to reset OAuth tokens for ${a}`,b),aB(`Failed to reset OAuth tokens: ${b instanceof Error?b.message:"Unknown error"}`),aD("error"),az(!0)}finally{aH(!1)}},{getThemeValue:aT,getThemeColor:aU,colors:aV}=(0,g.Ic)(),aW=()=>{ad.debug(`Server restart initiated for: ${a}`),B(!1),setTimeout(()=>{B(!0),ad.info(`Server ${a} restarted`)},1e3)};return(0,d.jsxs)(Z.A,{role:R?"button":void 0,"aria-pressed":R?ae:void 0,sx:{cursor:"pointer",height:R?"100%":void 0,transition:"box-shadow 0.3s ease, border-color 0.12s ease",border:a=>R&&ae?`2px solid ${a.palette.primary.main}`:"2px solid transparent","&:hover":{boxShadow:3}},onClick:()=>{ad.debug(`Server card clicked: ${a}`),O()},children:[(0,d.jsxs)($.A,{sx:{pb:1},children:[(0,d.jsxs)(J.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",mb:1},children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center",flex:1},children:[ag&&af&&(0,d.jsx)(N.A,{checked:ae,onClick:a=>a.stopPropagation(),onChange:a=>af(a.target.checked),size:"small",sx:{mr:1,p:.5}}),(0,d.jsx)(K.default,{variant:"h6",component:"h3",sx:{flex:1},children:a})]}),(0,d.jsxs)(J.default,{sx:{display:"flex",flexDirection:"column",alignItems:"flex-end",gap:.5},children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center",gap:.5},children:[ak?.updateAvailable&&(0,d.jsx)(_.A,{title:`Update available: ${(0,T.Fu)(ak.localSha)} → ${(0,T.Fu)(ak.remoteSha)}. Click to update.`,children:(0,d.jsx)(y.A,{icon:(0,d.jsx)(u.A,{}),label:"Update",color:"warning",size:"small",onClick:b=>{b.stopPropagation(),ad.debug(`Update badge clicked for server: ${a}`),ax(!0)}})}),ar?(0,d.jsx)(_.A,{title:"FLUJO's built-in server — always available, cannot be edited or removed.",children:(0,d.jsx)(y.A,{label:"Built-in",color:"primary",size:"small"})}):(0,d.jsx)(D,{transport:A,size:"small"})]}),(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center"},children:["connected"===b&&(0,d.jsx)(h.A,{color:"success",sx:{mr:.5},fontSize:"small"}),"disconnected"===b&&(0,d.jsx)(i.A,{color:"action",sx:{mr:.5},fontSize:"small"}),"error"===b&&(0,d.jsx)(j.A,{color:"error",sx:{mr:.5},fontSize:"small"}),"requires_authentication"===b&&(0,d.jsx)(n.A,{color:"warning",sx:{mr:.5},fontSize:"small"}),("connecting"===b||"initialization"===b)&&(0,d.jsx)(v.default,{size:"small",color:"primary",sx:{mr:.5}}),(0,d.jsx)(K.default,{variant:"body2",color:aP,children:"requires_authentication"===b?"Requires Authentication":b})]})]})]}),(0,d.jsx)(K.default,{variant:"body2",color:"text.secondary",sx:{mb:1,fontSize:"0.875rem"},noWrap:!0,title:ar?void 0:f,children:ar?"FLUJO's own backend API — flow authoring, execution and server management as MCP tools.":f}),ar&&!R&&(0,d.jsxs)(J.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(q.A,{fontSize:"small",sx:{mr:.5,color:"primary.main"}}),(0,d.jsx)(_.A,{title:"External MCP clients (Claude Code, Claude Desktop, Cursor, …) can drive FLUJO through this local endpoint.",children:(0,d.jsx)(K.default,{variant:"body2",sx:{fontWeight:500},children:"Exposed to external apps"})})]}),(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(K.default,{variant:"caption",sx:{flex:1,fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:"",children:""}),(0,d.jsx)(_.A,{title:"Copy endpoint URL",children:(0,d.jsx)(aa.A,{size:"small",onClick:aO,children:(0,d.jsx)(s.A,{fontSize:"small"})})})]})]}),!ar&&!R&&(0,d.jsxs)(J.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(q.A,{fontSize:"small",sx:{mr:.5,color:aI?"primary.main":"text.disabled"}}),(0,d.jsx)(ab.A,{checked:aI,onChange:a=>aM(a.target.checked),size:"small"}),(0,d.jsx)(_.A,{title:"Re-expose this server's tools to external MCP clients (Claude Desktop, Cursor, …) at a local URL.",children:(0,d.jsx)(K.default,{variant:"body2",sx:{fontWeight:500},children:"Expose to external apps"})})]}),aI&&(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(K.default,{variant:"caption",sx:{flex:1,fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:"",children:""}),(0,d.jsx)(_.A,{title:"Copy endpoint URL",children:(0,d.jsx)(aa.A,{size:"small",onClick:aO,children:(0,d.jsx)(s.A,{fontSize:"small"})})})]})]}),!ar&&!R&&(0,d.jsx)(J.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(r.A,{fontSize:"small",sx:{mr:.5,color:aK?"primary.main":"text.disabled"}}),(0,d.jsx)(ab.A,{checked:aK,onChange:a=>aN(a.target.checked),size:"small"}),(0,d.jsx)(_.A,{title:"Allow this server's tools to render interactive apps (MCP Apps / ui:// resources) in chat. Rendered read-only in a strict sandbox. Only enable for servers you trust.",children:(0,d.jsx)(K.default,{variant:"body2",sx:{fontWeight:500},children:"Render interactive apps"})})]})}),"error"===b&&(0,d.jsxs)(J.default,{sx:{mt:1,mb:1},children:[(0,d.jsxs)(J.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:.5},children:[(0,d.jsx)(K.default,{variant:"body2",fontWeight:"medium",color:"error",children:"Error:"}),(0,d.jsx)(I.A,{size:"small",color:"primary",onClick:b=>{b.stopPropagation(),ad.debug(`View full error clicked for server: ${a}`),at(!0)},children:"View Full Error"})]}),(0,d.jsx)(J.default,{sx:{maxHeight:"80px",overflow:"auto",p:1,borderRadius:1,bgcolor:a=>aU("error.background"),color:a=>aU("error.text"),border:"1px solid",borderColor:a=>aU("error.border"),fontSize:"0.75rem",fontWeight:500,whiteSpace:"pre-wrap"},children:S||"Unknown error"})]}),"requires_authentication"===b&&!R&&(0,d.jsxs)(J.default,{sx:{mt:1,mb:1},children:[(0,d.jsx)(J.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1},children:(0,d.jsx)(K.default,{variant:"body2",fontWeight:"medium",color:"warning.main",children:"Authentication Required"})}),(0,d.jsxs)(I.A,{variant:"contained",color:"warning",size:"small",startIcon:(0,d.jsx)(o.A,{}),onClick:async b=>{if(b.stopPropagation(),ad.debug(`Authenticate button clicked for server: ${a}`),Q)Q();else try{let b=await fetch("/api/oauth/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:a})});if(!b.ok){let a=await b.json();throw Error(a.error||"Failed to initiate OAuth")}let{authorizationUrl:d,alreadyAuthorized:e}=await b.json();if(e||!d){ad.info(`Server ${a} already authorized, no popup needed`),aW();return}let{openOAuthPopup:f}=await c.e(558).then(c.bind(c,60558));await f({url:d,windowName:`oauth_${a}`,onSuccess:b=>{ad.info(`OAuth authentication successful for ${a}`,b),ad.info(`Automatically restarting server ${a} after OAuth completion`),aW()},onError:b=>{ad.error(`OAuth authentication failed for ${a}`,b),aB("OAuth authentication failed"),aD("error"),az(!0)}})}catch(b){ad.error(`Failed to start OAuth authentication for ${a}`,b),aB("Failed to start OAuth authentication"),aD("error"),az(!0)}},sx:{width:"100%"},children:["Authenticate with ",a]})]})]}),!ar&&!R&&(0,d.jsxs)(ac.A,{sx:{justifyContent:"space-between",px:2,py:1},children:[(0,d.jsxs)(J.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(ab.A,{checked:z,onClick:a=>a.stopPropagation(),onChange:b=>{ad.debug(`Server ${a} toggle changed to: ${b.target.checked}`),B(b.target.checked)},color:"primary",size:"small"}),(0,d.jsx)(K.default,{variant:"body2",sx:{ml:.5,fontWeight:500,color:z?"primary.main":"text.secondary"},children:z?"Enabled":"Disabled"}),z&&(0,d.jsx)(_.A,{title:"Restart server",children:(0,d.jsx)(aa.A,{size:"small",onClick:b=>{b.stopPropagation(),ad.debug(`Restart button clicked for server: ${a}`),aW()},sx:{ml:1},children:(0,d.jsx)(k.A,{fontSize:"small"})})})]}),(0,d.jsxs)(J.default,{children:[(0,d.jsx)(_.A,{title:"Retry connection",children:(0,d.jsx)(aa.A,{color:"primary",onClick:c=>{c.stopPropagation(),ad.debug(`Retry button clicked for server: ${a}`),aQ&&clearTimeout(aQ),aF(!0),C();let d=setTimeout(()=>{"connecting"!==b&&"initialization"!==b&&aF(!1),aR(null)},1e4);aR(d)},disabled:aE,size:"small",children:aE?(0,d.jsx)(v.default,{size:"small",color:"primary"}):(0,d.jsx)(k.A,{})})}),"streamable"===A&&ah&&(0,d.jsx)(_.A,{title:"Reset OAuth tokens",children:(0,d.jsx)(aa.A,{color:"warning",onClick:aS,disabled:aG,size:"small",children:aG?(0,d.jsx)(v.default,{size:"small",color:"primary"}):(0,d.jsx)(p.A,{})})}),aq&&(0,d.jsx)(_.A,{title:ao?`Folder: ${ao}`:"Move to folder",children:(0,d.jsx)(aa.A,{color:ao?"primary":"default",onClick:a=>{a.stopPropagation(),av(a.currentTarget)},size:"small",children:(0,d.jsx)(t.A,{})})}),(0,d.jsx)(_.A,{title:"Edit server",children:(0,d.jsx)(aa.A,{color:"primary",onClick:a=>{a.stopPropagation(),P()},size:"small",children:(0,d.jsx)(l.A,{})})}),(0,d.jsx)(_.A,{title:"Delete server",children:(0,d.jsx)(aa.A,{color:"error",onClick:a=>{a.stopPropagation(),M()},size:"small",children:(0,d.jsx)(m.A,{})})})]})]}),aq&&(0,d.jsx)(w.A,{anchorEl:au,open:!!au,currentFolder:ao,folders:ap,onClose:()=>av(null),onAssign:a=>aq(a)}),(0,d.jsxs)(E.A,{open:as,onClose:()=>{ad.debug(`Error modal closed for server: ${a}`),at(!1)},maxWidth:"md",fullWidth:!0,onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(F.A,{component:"div",children:["Error Details for ",a]}),(0,d.jsxs)(G.A,{children:[(0,d.jsx)(J.default,{sx:{p:2,borderRadius:1,bgcolor:a=>aU("error.background"),color:a=>aU("error.text"),border:"1px solid",borderColor:a=>aU("error.border"),fontFamily:"monospace",fontSize:"0.875rem",fontWeight:500,whiteSpace:"pre-wrap",overflow:"auto",maxHeight:"300px",mb:2},children:S||"Unknown error"}),U&&(0,d.jsxs)(J.default,{sx:{mt:2},children:[(0,d.jsx)(K.default,{variant:"h6",gutterBottom:!0,children:"Stderr Output:"}),(0,d.jsx)(J.default,{sx:{p:2,borderRadius:1,bgcolor:"background.paper",border:"1px solid",borderColor:"divider",fontFamily:"monospace",fontSize:"0.875rem",whiteSpace:"pre-wrap",overflow:"auto",maxHeight:"300px"},children:U})]})]}),(0,d.jsxs)(H.A,{children:[(0,d.jsx)(I.A,{onClick:()=>at(!1),children:"Close"}),(0,d.jsx)(I.A,{onClick:()=>{let b=[S||"Unknown error",U?`
3
+
4
+ Stderr Output:
5
+ ${U}`:""].join("");navigator.clipboard.writeText(b),ad.debug(`Error copied to clipboard for server: ${a}`),aB("Error message copied to clipboard"),aD("success"),az(!0)},color:"primary",children:"Copy to Clipboard"})]})]}),ak&&(0,d.jsx)(W,{open:aw,onClose:()=>ax(!1),serverName:a,rootPath:f,installCommand:al,buildCommand:am,enabled:z,updateInfo:ak,onToggle:B,onUpdated:an}),(0,d.jsx)(X.A,{open:ay,autoHideDuration:3e3,onClose:()=>az(!1),anchorOrigin:{vertical:"bottom",horizontal:"center"},children:(0,d.jsx)(L.A,{onClose:()=>az(!1),severity:aC,sx:{width:"100%"},children:aA||"Error message copied to clipboard"})})]})}},53455:(a,b,c)=>{c.d(b,{Fu:()=>i,M8:()=>f,Qv:()=>g,Qz:()=>h});let d=(0,c(19815).h)("frontend/components/mcp/MCPServerManager/utils/serverUpdates"),e=new Map;async function f(a,b=!1){let c=Date.now(),g={},h=[];for(let d of new Set(a.filter(Boolean))){let a=e.get(d);!b&&a&&c-a.at<6e5?g[d]=a.info:h.push(d)}if(h.length>0)try{let a=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"checkUpdatesBatch",paths:h})}),b=await a.json();if(a.ok&&b.results)for(let[a,d]of Object.entries(b.results))e.set(a,{at:c,info:d}),g[a]=d;else d.warn("Batch update check failed",b.error)}catch(a){d.warn("Batch update check request failed",a)}return g}async function g(a){try{let b=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"pullUpdates",savePath:a})}),c=await b.json();if(!b.ok)return{success:!1,error:c.error||"Failed to pull updates"};return{success:!0,oldSha:c.oldSha,newSha:c.newSha,updated:c.updated}}catch(a){return{success:!1,error:a.message||"Failed to pull updates"}}}async function h(a,b,c){let e=a.match(/github\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);if(!e)return null;try{let a=await fetch(`https://api.github.com/repos/${e[1]}/${e[2]}/compare/${b}...${c}`);if(!a.ok)return null;let d=await a.json(),f=Array.isArray(d.commits)?d.commits:[];return{behindBy:"number"==typeof d.total_commits?d.total_commits:null,commits:f.slice(-10).reverse().map(a=>({sha:(a.sha||"").slice(0,7),message:(a.commit?.message||"").split("\n")[0]}))}}catch(a){return d.debug("GitHub compare preview failed (non-fatal)",a),null}}function i(a){return a?a.slice(0,7):""}},59737:(a,b,c)=>{c.d(b,{A:()=>m});var d=c(21124);c(38301);var e=c(60839),f=c(81637),g=c(44079),h=c(79515),i=c(41893),j=c(99561),k=c(17332),l=c(18467);let m=({label:a,count:b,expanded:c,onToggle:m,showFolderIcon:n=!1,children:o})=>{let p=(0,e.A)();return(0,d.jsxs)(f.default,{sx:{mb:1.5},children:[(0,d.jsxs)(f.default,{role:"button",tabIndex:0,"aria-expanded":c,onClick:m,onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),m())},sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.75,borderRadius:1,cursor:"pointer",userSelect:"none",backgroundColor:p.palette.background.default,border:`1px solid ${p.palette.divider}`,"&:hover":{backgroundColor:p.palette.action.hover}},children:[(0,d.jsx)(g.A,{size:"small","aria-label":c?"Collapse section":"Expand section",onClick:a=>{a.stopPropagation(),m()},sx:{transition:"transform 0.2s",transform:c?"rotate(0deg)":"rotate(-90deg)"},children:(0,d.jsx)(k.A,{fontSize:"small"})}),n&&(0,d.jsx)(l.A,{fontSize:"small",sx:{color:"text.secondary"}}),(0,d.jsx)(h.default,{variant:"subtitle2",sx:{fontWeight:600},children:a}),(0,d.jsx)(i.A,{label:b,size:"small",sx:{height:20,fontSize:"0.7rem"}})]}),(0,d.jsx)(j.A,{in:c,unmountOnExit:!0,children:(0,d.jsx)(f.default,{sx:{pt:1.5},children:o})})]})}},61615:(a,b,c)=>{c.d(b,{default:()=>g});var d=c(21124);c(38301);var e=c(81637),f=c(8521);let g=({size:a="medium",color:b="primary",className:c="",sx:g={}})=>{let h="white"===b?{color:"#fff",...g}:g;return(0,d.jsxs)(e.default,{component:"span",sx:{display:"inline-block",lineHeight:0,...h},className:c,role:"status",children:[(0,d.jsx)(f.default,{size:{small:16,medium:24,large:36}[a],color:"white"===b?"inherit":b,"aria-hidden":"true"}),(0,d.jsx)(e.default,{component:"span",sx:{position:"absolute",width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:0},children:"Loading..."})]})}},63650:(a,b,c)=>{c.d(b,{v:()=>h});var d=c(38301),e=c(28055);let f=(0,c(19815).h)("frontend/hooks/useServerStatus");function g(a){return"stdio"===a.transport?a.args&&a.args.length>0?a.args[0]:"Unknown path":"websocket"===a.transport?a.websocketUrl||"Unknown URL":a.serverUrl||"Unknown URL"}function h(){let[a,b]=(0,d.useState)([]),[c,h]=(0,d.useState)(!0),[i,j]=(0,d.useState)(null),[k,l]=(0,d.useState)(new Set),m=(0,d.useCallback)(async()=>{f.debug("Loading servers"),h(!0),j(null);try{let a=await e.S.loadServerConfigs();if(!a||"error"in a){f.warn("Failed to load server configurations:",a?.error),j(a?.error||"Failed to load server configurations"),h(!1);return}let c=await Promise.all(a.map(async a=>{f.debug(`Getting status for server: ${a.name}`);let b=await e.S.getServerStatus(a.name),c="string"==typeof b?b:b.status,d="object"==typeof b&&b.message?b.message:void 0,h="object"==typeof b&&b.stderrOutput?b.stderrOutput:void 0,i=g(a);return{...a,path:i,status:c,error:d,stderrOutput:h}}));f.debug("Final server states:",c),b(c),h(!1)}catch(a){f.warn("Failed to load servers:",a),j("Failed to load servers"),h(!1)}},[]),n=(0,d.useCallback)(async(c,d)=>{f.debug(`Toggling server ${c} to ${d?"enabled":"disabled"}`);try{let g=a.find(a=>a.name===c);if(!g)return f.warn(`Server not found: ${c}`),!1;f.debug(`Found server ${c}, current disabled state: ${g.disabled}`);let h=await e.S.updateServerConfig(c,{disabled:!d});if(h.error)return f.warn("Failed to update server config:",[h.error,c]),!1;f.debug(`Updating server ${c} state in UI, new disabled state: ${!d}`),b(a=>a.map(a=>a.name===c?{...a,disabled:!d}:a)),f.info(`Successfully toggled server ${c} to ${d?"enabled":"disabled"}`);try{let a=await e.S.getServerStatus(c),d="string"==typeof a?a:a.status,f="object"==typeof a&&a.message?a.message:void 0,g="object"==typeof a&&a.stderrOutput?a.stderrOutput:void 0;b(a=>a.map(a=>a.name===c?{...a,status:d,error:f,stderrOutput:g}:a))}catch(a){f.warn(`Failed to get status for server ${c} after toggle:`,a)}return!0}catch(a){return f.warn("Failed to toggle server:",a),!1}},[a]),o=(0,d.useCallback)(async c=>{f.debug(`Deleting server: ${c}`);try{if(!a.find(a=>a.name===c))return f.warn("Server not found:",c),!1;let d=await e.S.deleteServerConfig(c);if(d.error)return f.warn("Failed to delete server config:",d.error),!1;return b(a=>a.filter(a=>a.name!==c)),!0}catch(a){return f.warn("Failed to delete server:",a),!1}},[a]),p=(0,d.useCallback)(async a=>{f.debug("Adding server:",a);try{let c=g(a),d={...a,path:c,status:"connecting",tools:[],env:a.env||{}};b(a=>[...a,d]),l(b=>new Set(b).add(a.name));let h=await e.S.updateServerConfig(a.name,a);if(h.error)return f.warn("Failed to update server config:",h.error),b(b=>b.map(b=>b.name===a.name?{...b,status:"error",error:h.error}:b)),l(b=>{let c=new Set(b);return c.delete(a.name),c}),!1;f.info(`Successfully added server ${a.name}`);try{let c=await e.S.getServerStatus(a.name),d="string"==typeof c?c:c.status,f="object"==typeof c&&c.message?c.message:void 0,g="object"==typeof c&&c.stderrOutput?c.stderrOutput:void 0;b(b=>b.map(b=>b.name===a.name?{...b,status:d,error:f,stderrOutput:g}:b))}catch(b){f.warn(`Failed to get status for server ${a.name} after adding:`,b)}return l(b=>{let c=new Set(b);return c.delete(a.name),c}),!0}catch(c){return f.warn("Failed to add server:",c),b(b=>b.map(b=>b.name===a.name?{...b,status:"error",error:c instanceof Error?c.message:"Unknown error during server addition"}:b)),l(b=>{let c=new Set(b);return c.delete(a.name),c}),!1}},[]),q=(0,d.useCallback)(async(a,c)=>{let d=c??a.name,h=d!==a.name;f.debug("Updating server:",a);try{b(b=>b.map(b=>b.name===d?{...a,path:g(a),status:b.status,error:b.error,stderrOutput:b.stderrOutput}:b));let c=await e.S.updateServerConfig(d,a);if(c.error){if(f.warn("Failed to update server config:",c.error),h)return await m(),!1;return b(b=>b.map(b=>b.name===a.name?{...b,status:"error",error:c.error}:b)),!1}f.info(`Successfully updated config for server ${a.name}`);try{let c=await e.S.getServerStatus(a.name),d="string"==typeof c?c:c.status,f="object"==typeof c&&c.message?c.message:void 0,g="object"==typeof c&&c.stderrOutput?c.stderrOutput:void 0;b(b=>b.map(b=>b.name===a.name?{...b,status:d,error:f,stderrOutput:g}:b))}catch(b){f.warn(`Failed to get status for server ${a.name} after config update:`,b)}return!0}catch(d){if(f.warn("Failed to update server:",d),h)return await m(),!1;let c=d instanceof Error?d.message:"Unknown error during update";return b(b=>b.map(b=>b.name===a.name?{...b,status:"error",error:c}:b)),!1}},[m]),r=(0,d.useCallback)(async(a,c)=>{let d=c&&c.trim()?c.trim():"";f.debug(`Setting folder for server ${a} to ${d||"(none)"}`);try{let c=await e.S.updateServerConfig(a,{folder:d});if("error"in c&&c.error)return f.warn("Failed to update server folder:",c.error),!1;return b(b=>b.map(b=>b.name===a?{...b,folder:d||void 0}:b)),!0}catch(a){return f.warn("Failed to set server folder:",a),!1}},[]),s=(0,d.useCallback)(async(c,d)=>{f.debug(`Saving environment variables for server: ${c}`,d);try{if(!a.find(a=>a.name===c))return f.warn(`Server not found: ${c}`),!1;let g=await e.S.updateServerConfig(c,{env:d});if(g.error)return f.warn("Failed to update server config:",g.error),!1;return f.debug(`Updating environment variables in UI for server: ${c}`),b(a=>a.map(a=>a.name===c?{...a,env:d}:a)),f.info(`Successfully saved environment variables for server: ${c}`),!0}catch(a){return f.warn("Failed to save environment variables:",a),!1}},[a]);return{servers:a,isLoading:c,loadError:i,connectingServers:k,loadServers:m,toggleServer:n,retryServer:(0,d.useCallback)(async a=>{f.debug(`Retrying server status for: ${a}`);try{let c=await e.S.getServerStatus(a),d="string"==typeof c?c:c.status,f="object"==typeof c&&c.message?c.message:void 0,g="object"==typeof c&&c.stderrOutput?c.stderrOutput:void 0;return b(b=>b.map(b=>b.name===a?{...b,status:d,error:f,stderrOutput:g}:b)),!0}catch(a){return f.warn("Failed to retry server status:",a),!1}},[]),deleteServer:o,addServer:p,updateServer:q,setServerFolder:r,saveEnv:s}}},78352:(a,b,c)=>{c.d(b,{A:()=>u});var d=c(21124),e=c(38301),f=c(7118),g=c(94367),h=c(50553),i=c(84233),j=c(91059),k=c(40512),l=c(83899),m=c(52327),n=c(37674),o=c(19925),p=c(20830),q=c(36698),r=c(18467),s=c(31973),t=c(354);let u=({anchorEl:a,open:b,currentFolder:c,folders:u,onClose:v,onAssign:w})=>{let[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)(""),B=a=>{w(a),v()},C=()=>{let a=z.trim();a&&(y(!1),B(a))};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(f.A,{anchorEl:a,open:b,onClose:v,children:[u.length>0&&u.map(a=>(0,d.jsxs)(g.A,{onClick:()=>B(a),selected:a===c,children:[(0,d.jsx)(h.A,{children:a===c?(0,d.jsx)(q.A,{fontSize:"small"}):(0,d.jsx)(r.A,{fontSize:"small"})}),(0,d.jsx)(i.A,{primary:a})]},a)),u.length>0&&(0,d.jsx)(j.A,{}),(0,d.jsxs)(g.A,{onClick:()=>{A(""),y(!0)},children:[(0,d.jsx)(h.A,{children:(0,d.jsx)(s.A,{fontSize:"small"})}),(0,d.jsx)(i.A,{primary:"New folder…"})]}),c&&(0,d.jsxs)(g.A,{onClick:()=>B(void 0),children:[(0,d.jsx)(h.A,{children:(0,d.jsx)(t.A,{fontSize:"small"})}),(0,d.jsx)(i.A,{primary:"Remove from folder"})]})]}),(0,d.jsxs)(k.A,{open:x,onClose:()=>y(!1),maxWidth:"xs",fullWidth:!0,children:[(0,d.jsx)(l.A,{children:"New folder"}),(0,d.jsx)(m.A,{children:(0,d.jsx)(n.A,{autoFocus:!0,margin:"dense",label:"Folder name",fullWidth:!0,value:z,onChange:a=>A(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),C())}})}),(0,d.jsxs)(o.A,{children:[(0,d.jsx)(p.A,{onClick:()=>y(!1),children:"Cancel"}),(0,d.jsx)(p.A,{variant:"contained",disabled:!z.trim(),onClick:C,children:"Create"})]})]})]})}},84040:(a,b,c)=>{c.d(b,{Ic:()=>g});var d=c(32631);let e=(0,c(19815).h)("frontend/utils/theme"),f={light:{background:"#FFFFFF",foreground:"#2C3E50",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"}},dark:{background:"#1a1a1a",foreground:"#f0f0f0",paperBackground:"#2a2a2a",textSecondary:"#aaaaaa",border:"#3a3a3a",heading:"#f8f8f8",text:"#f0f0f0",secondaryText:"#aaa",error:{background:"#3a2222",border:"#5a3333",text:"#f87171"}}};function g(){let{isDarkMode:a}=(0,d.D)();return e.debug(`useThemeUtils called with isDarkMode: ${a}`),{getThemeValue:(b,c)=>a?c:b,getThemeColor:b=>{let c=b.split("."),d=f[a?"dark":"light"];for(let a of c)if(!d||"object"!=typeof d||!(a in d))return e.warn(`Theme color path not found: ${b}`),"";else d=d[a];return d},colors:a?f.dark:f.light,isDarkMode:a}}},88117:(a,b,c)=>{c.d(b,{O:()=>g});var d=c(38301),e=c(28055);let f=(0,c(19815).h)("frontend/hooks/useServerTools");function g(a){let[b,c]=(0,d.useState)([]),[g,h]=(0,d.useState)(!1),[i,j]=(0,d.useState)(null),[k,l]=(0,d.useState)(null),[m,n]=(0,d.useState)(null),[o,p]=(0,d.useState)(0),[q,r]=(0,d.useState)(!1),s=(0,d.useRef)(null),t=(0,d.useCallback)(async(d=!1)=>{if(!a){c([]),j(null);return}if(n(a),!d&&k&&new Date().getTime()-k.getTime()<200&&b.length>0&&a===m)return void f.debug(`Rate limiting tool refresh for server: ${a}`);f.debug(`Loading tools for server: ${a}`),h(!0),j(null);try{let b=await e.S.listServerTools(a);if(a!==m)return void f.debug(`Server changed during tool loading from ${a} to ${m}`);if(b.error)f.warn(`Error loading tools for ${a}:`,b.error),j(b.error),c([]);else{let d=b.tools||[];f.debug(`Loaded ${d.length} tools for ${a}`),c(d),l(new Date),p(0)}}catch(b){if(a!==m)return void f.debug(`Server changed during tool loading from ${a} to ${m}`);f.warn(`Failed to load tools for server ${a}:`,b),j(`Failed to load tools: ${b instanceof Error?b.message:"Unknown error"}`),c([])}finally{a===m&&h(!1)}},[a,k,b.length,m]),u=(0,d.useCallback)(()=>{if(!a)return;s.current&&(clearTimeout(s.current),s.current=null),r(!0);let b=Math.min(1e3*Math.pow(2,o),1e4);return f.debug(`Retrying tool load for ${a} in ${b}ms (attempt ${o+1})`),s.current=setTimeout(()=>{p(a=>a+1),t(!0),r(!1)},b),()=>{s.current&&clearTimeout(s.current)}},[a,o,t]);return{tools:b,isLoading:g||q,error:i,loadTools:t,retryLoadTools:u,isRetrying:q,retryCount:o,testTool:(0,d.useCallback)(async(b,c,d)=>{if(!a)return{success:!1,output:"",error:"No server selected"};f.debug(`Testing tool ${b} on server ${a} with params:`,c);try{let g=await e.S.callTool(a,b,c,d);if(g.error)return f.warn(`Error calling tool ${b}:`,g.error),{success:!1,output:"",error:g.error};return f.debug(`Tool ${b} executed successfully:`,g),{success:!0,output:JSON.stringify(g,null,2)}}catch(a){return f.error(`Exception calling tool ${b}:`,a),{success:!1,output:"",error:a instanceof Error?a.message:"Unknown error occurred"}}},[a])}}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=6826,exports.ids=[6826],exports.modules={8665:(a,b,c)=>{c.d(b,{ED:()=>i,Ws:()=>j,jD:()=>g});var d=c(73496),e=c.n(d);let f=(0,c(50846).h)("backend/utils/registryClient"),g="https://registry.modelcontextprotocol.io";async function h(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{let b=await fetch(a,{headers:{Accept:"application/json"},signal:c.signal,cache:"no-store"});return{status:b.status,body:await b.text()}}finally{clearTimeout(d)}}async function i(a,b){try{return await new Promise((c,d)=>{let f=e().connect(a.origin),g=!1,h=a=>{g||(g=!0,a(),f.close())};f.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 session timed out after ${b}ms`)))),f.on("error",a=>h(()=>d(a)));let i=f.request({":method":"GET",":path":a.pathname+a.search,accept:"application/json"});i.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 request timed out after ${b}ms`)))),i.on("error",a=>h(()=>d(a)));let j=0,k="";i.setEncoding("utf8"),i.on("response",a=>{j=Number(a[":status"]||0)}),i.on("data",a=>{k+=a}),i.on("end",()=>h(()=>c({status:j,body:k}))),i.end()})}catch(c){return f.warn("HTTP/2 request to registry failed, retrying over HTTP/1.1",c instanceof Error?c.message:c),await h(a,b)}}async function j(a,b){let c=await i(a,b);if(c.status<200||c.status>=300)throw Error(`MCP Registry responded with status ${c.status}`);return JSON.parse(c.body)}},25250:(a,b,c)=>{c.d(b,{AH:()=>f,O$:()=>p,XQ:()=>q,Yr:()=>m,cy:()=>s,jg:()=>t,nO:()=>n,vf:()=>o,zz:()=>r});let d={npm:"npx",pypi:"uvx",oci:"docker",nuget:"dnx"},e={npm:"npm",pypi:"PyPI",oci:"Docker",nuget:"NuGet",mcpb:"MCPB",cargo:"Cargo"};function f(a){var b;let c=[];for(let f of a.packages??[])(function(a){if(!a.identifier||!d[a.registryType]&&!a.runtimeHint)return!1;let b=a.transport?.type;return!b||"stdio"===b})(f)&&c.push({kind:"package",label:`${e[b=f.registryType]||b}: ${f.identifier}`,pkg:f});for(let b of a.remotes??[])b.url&&("streamable-http"===b.type||"sse"===b.type)&&c.push({kind:"remote",label:`Remote (${"sse"===b.type?"SSE":"Streamable HTTP"}): ${b.url}`,remote:b});return c}let g=new Set(["mcp","server","mcp-server","mcpserver"]);function h(a){return(function(a){let b=a.indexOf("/"),c=b>=0?a.slice(0,b):"",d=b>=0?a.slice(b+1):a;if(!g.has(d.toLowerCase())||!c)return d;let e=c.split(".").pop()||"";return e?`${e}-${d}`:d})(a).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"mcp-server"}function i(a){let b=a.value??a.default;return"named"===a.type?a.name?void 0!==b&&""!==b?[a.name,b]:a.isRequired&&a.valueHint?[a.name,`<${a.valueHint}>`]:a.isRequired?[a.name]:[]:[]:void 0!==b&&""!==b?[b]:a.isRequired?[`<${a.valueHint||"value"}>`]:[]}function j(a){return(a??[]).flatMap(i)}function k(a){return{name:h(a.name),disabled:!1,autoApprove:[],env:{},_buildCommand:"",_installCommand:""}}function l(a){return a.version?`${a.identifier}@${a.version}`:a.identifier}function m(a,b){return"package"===b.kind?function(a,b){let c,e=b.runtimeHint||d[b.registryType],f=j(b.packageArguments),g=j(b.runtimeArguments),h=function(a){let b={};for(let c of a??[]){if(!c.name)continue;let a=c.value??c.default??"";b[c.name]=c.isSecret?{value:a,metadata:{isSecret:!0}}:a}return b}(b.environmentVariables);switch(b.registryType){case"npm":c=[...g,"-y",l(b),...f];break;case"pypi":c=[...g,b.version?`${b.identifier}==${b.version}`:b.identifier,...f];break;case"oci":{let a=Object.keys(h).flatMap(a=>["-e",a]);c=[..."run"===g[0]?[]:["run","-i","--rm"],...g,...a,function(a){let b=a.identifier.split("/").pop()||a.identifier;return!(b.includes(":")||b.includes("@"))&&a.version?`${a.identifier}:${a.version}`:a.identifier}(b),...f];break}case"nuget":c=[...g,l(b),"--yes",...f];break;default:c=[...g,l(b),...f]}return{...k(a),transport:"stdio",command:e,args:c,env:h,rootPath:"."}}(a,b.pkg):function(a,b){let c={};for(let a of b.headers??[])a.name&&(c[a.name]=a.value??a.default??"");let d=k(a);return{...d,transport:"sse"===b.type?"sse":"streamable",serverUrl:b.url,headers:c,rootPath:`mcp-servers/${d.name}`}}(a,b.remote)}function n(a){return"active"===a}function o(a){let b=a?._meta?.["io.modelcontextprotocol.registry/official"]?.status;return"string"==typeof b&&b.length>0?b:"unverified"}function p(a,b,c,d){let e=m(b,c),f=e.transport??"stdio";return{registryName:a,resolvedName:b.name,serverName:e.name??h(b.name),transport:f,...e.command?{command:e.command}:{},...Array.isArray(e.args)?{args:e.args}:{},...e.serverUrl?{serverUrl:e.serverUrl}:{},requiredEnvNames:"package"===c.kind?(c.pkg.environmentVariables??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name):(c.remote.headers??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name),verificationStatus:d}}function q(a){let b;try{b=new URL(a)}catch{return null}let c=b.searchParams.get("q");if(c)return`/v0.1/servers?search=${encodeURIComponent(c)}&version=latest&limit=1`;if(/^\/v[\d.]+\/servers\/[^/]+\/versions\/[^/]+$/.test(b.pathname))return b.pathname;let d=b.pathname.match(/^\/v[\d.]+\/servers\/([^/]+)(?:\/versions)?\/?$/);if(d){let a=decodeURIComponent(d[1]);return`/v0.1/servers?search=${encodeURIComponent(a)}&version=latest&limit=1`}return null}function r(a){return a?.servers&&a.servers.length>0?a.servers[0]:a?.server?.name?a:null}function s(a,b){if(!b||0===Object.keys(b).length)return a;let c={...a.env??{}};for(let[a,d]of Object.entries(b)){let b=c[a];b&&"object"==typeof b&&b.metadata?.isSecret?c[a]={value:d,metadata:{isSecret:!0}}:c[a]=d}return{...a,env:c}}function t(a,b){return"package"===a.kind?(a.pkg.environmentVariables??[]).filter(a=>a.isRequired&&!(a.value??a.default)&&!b?.[a.name]).map(a=>a.name):(a.remote.headers??[]).filter(a=>a.isRequired&&!(a.value??a.default)).map(a=>a.name)}}};