flujo-ai 3.9.1 → 3.11.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 (404) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +186 -179
  3. package/.next/app-path-routes-manifest.json +6 -5
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/react-loadable-manifest.json +7 -7
  7. package/.next/server/app/_not-found/page.js +2 -2
  8. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_not-found.html +1 -1
  11. package/.next/server/app/_not-found.rsc +1 -1
  12. package/.next/server/app/api/backup/route.js +1 -2
  13. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  14. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/browse/route.js +1 -2
  16. package/.next/server/app/api/browse/route.js.nft.json +1 -1
  17. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/cwd/route.js +1 -2
  19. package/.next/server/app/api/cwd/route.js.nft.json +1 -1
  20. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/encryption/secure/route.js +1 -1
  22. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  23. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/env/route.js +2 -2
  25. package/.next/server/app/api/env/route.js.nft.json +1 -1
  26. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/flow/[id]/route.js +1 -1
  28. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  29. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
  31. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  32. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/flow/route.js +1 -1
  34. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  35. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/git/route.js +4 -3
  37. package/.next/server/app/api/git/route.js.nft.json +1 -1
  38. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/init/route.js +1 -1
  40. package/.next/server/app/api/init/route.js.nft.json +1 -1
  41. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/mcp/cancel/route.js +2 -2
  43. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  44. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  46. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  47. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  49. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  50. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  52. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  53. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  55. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/mcp/servers/route.js +1 -1
  70. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  71. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  73. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  74. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -0
  76. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -0
  77. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -0
  78. package/.next/server/app/api/mcp-registry/route.js +1 -2
  79. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  80. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -2
  82. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  83. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/model/[id]/route.js +1 -1
  85. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  86. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/model/provider/route.js +2 -2
  88. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  89. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/model/route.js +1 -1
  91. package/.next/server/app/api/model/route.js.nft.json +1 -1
  92. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/model/test/route.js +2 -2
  94. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  95. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/oauth/callback/route.js +2 -2
  97. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  98. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/oauth/initiate/route.js +2 -2
  100. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  101. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/oauth/reset/route.js +2 -2
  103. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  104. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
  106. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  107. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
  109. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  110. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
  112. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  113. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -2
  115. package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +1 -1
  116. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/planned-executions/route.js +1 -1
  118. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  119. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/restore/route.js +1 -2
  121. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  122. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/storage/route.js +1 -2
  124. package/.next/server/app/api/storage/route.js.nft.json +1 -1
  125. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/update/route.js +1 -2
  127. package/.next/server/app/api/update/route.js.nft.json +1 -1
  128. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  130. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  131. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/chat/page.js +8 -8
  133. package/.next/server/app/chat/page.js.nft.json +1 -1
  134. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/chat.html +1 -1
  136. package/.next/server/app/chat.rsc +2 -2
  137. package/.next/server/app/docs/page.js +1 -1
  138. package/.next/server/app/docs/page.js.nft.json +1 -1
  139. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  140. package/.next/server/app/docs.html +1 -1
  141. package/.next/server/app/docs.rsc +1 -1
  142. package/.next/server/app/executions/page.js +2 -2
  143. package/.next/server/app/executions/page.js.nft.json +1 -1
  144. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  145. package/.next/server/app/executions.html +1 -1
  146. package/.next/server/app/executions.rsc +2 -2
  147. package/.next/server/app/flows/page.js +10 -10
  148. package/.next/server/app/flows/page.js.nft.json +1 -1
  149. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/flows.html +1 -1
  151. package/.next/server/app/flows.rsc +2 -2
  152. package/.next/server/app/index.html +1 -1
  153. package/.next/server/app/index.rsc +2 -2
  154. package/.next/server/app/mcp/page.js +13 -13
  155. package/.next/server/app/mcp/page.js.nft.json +1 -1
  156. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/mcp-flows/route.js +1 -1
  158. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  159. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  161. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  162. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/mcp.html +1 -1
  164. package/.next/server/app/mcp.rsc +2 -2
  165. package/.next/server/app/models/page.js +3 -3
  166. package/.next/server/app/models/page.js.nft.json +1 -1
  167. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app/page.js +1 -1
  169. package/.next/server/app/page.js.nft.json +1 -1
  170. package/.next/server/app/page_client-reference-manifest.js +1 -1
  171. package/.next/server/app/settings/page.js +2 -2
  172. package/.next/server/app/settings/page.js.nft.json +1 -1
  173. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  174. package/.next/server/app/settings.html +1 -1
  175. package/.next/server/app/settings.rsc +2 -2
  176. package/.next/server/app/v1/chat/completions/route.js +2 -2
  177. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  178. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +1 -1
  180. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  181. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  183. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  184. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  186. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  187. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  189. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  190. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +1 -1
  192. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  193. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +6 -6
  195. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  196. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  198. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  199. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  201. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  202. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/v1/chat/conversations/route.js +2 -2
  204. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  205. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/v1/models/route.js +2 -2
  207. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  208. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app-paths-manifest.json +6 -5
  210. package/.next/server/chunks/117.js +1 -0
  211. package/.next/server/chunks/{5873.js → 1331.js} +3 -3
  212. package/.next/server/chunks/1373.js +1 -1
  213. package/.next/server/chunks/1403.js +2 -2
  214. package/.next/server/chunks/1692.js +1 -1
  215. package/.next/server/chunks/1905.js +2 -2
  216. package/.next/server/chunks/{6637.js → 2287.js} +2 -2
  217. package/.next/server/chunks/2776.js +1 -1
  218. package/.next/server/chunks/3426.js +1 -0
  219. package/.next/server/chunks/3984.js +4 -4
  220. package/.next/server/chunks/4239.js +1 -1
  221. package/.next/server/chunks/4379.js +1 -0
  222. package/.next/server/chunks/4706.js +1 -1
  223. package/.next/server/chunks/4729.js +2 -2
  224. package/.next/server/chunks/5389.js +13 -13
  225. package/.next/server/chunks/5504.js +17 -0
  226. package/.next/server/chunks/5734.js +6 -6
  227. package/.next/server/chunks/6936.js +13 -13
  228. package/.next/server/chunks/6996.js +3 -3
  229. package/.next/server/chunks/7214.js +1 -1
  230. package/.next/server/chunks/724.js +12 -12
  231. package/.next/server/chunks/7506.js +1 -1
  232. package/.next/server/chunks/{473.js → 7731.js} +2 -2
  233. package/.next/server/chunks/8126.js +1 -0
  234. package/.next/server/chunks/8460.js +1 -1
  235. package/.next/server/chunks/8739.js +1 -1
  236. package/.next/server/chunks/9188.js +1 -1
  237. package/.next/server/chunks/9343.js +1 -1
  238. package/.next/server/chunks/{120.js → 9387.js} +2 -2
  239. package/.next/server/chunks/9509.js +2 -0
  240. package/.next/server/chunks/{5547.js → 9688.js} +2 -2
  241. package/.next/server/chunks/9938.js +1 -1
  242. package/.next/server/chunks/9989.js +1 -1
  243. package/.next/server/functions-config-manifest.json +1 -0
  244. package/.next/server/middleware-build-manifest.js +1 -1
  245. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  246. package/.next/server/pages/404.html +1 -1
  247. package/.next/server/pages/500.html +1 -1
  248. package/.next/server/pages-manifest.json +1 -1
  249. package/.next/server/server-reference-manifest.js +1 -1
  250. package/.next/server/server-reference-manifest.json +1 -1
  251. package/.next/static/9Pzu8N65j3JuRQ7zVUtwD/_buildManifest.js +1 -0
  252. package/.next/static/chunks/1811-8ee01cf37161913c.js +1 -0
  253. package/.next/static/chunks/2380-5696e0dc0469f6a5.js +1 -0
  254. package/.next/static/chunks/3217.1a7e24fd70294370.js +1 -0
  255. package/.next/static/chunks/3545.d3a512315a9fce3e.js +1 -0
  256. package/.next/static/chunks/4205-b9e33afc7e96ecb9.js +1 -0
  257. package/.next/static/chunks/5781-4328d17aad13f908.js +8 -0
  258. package/.next/static/chunks/687-98ba5f5043866f48.js +1 -0
  259. package/.next/static/chunks/7458-4445e76668151564.js +1 -0
  260. package/.next/static/chunks/{9718-12d33c1a26bb002d.js → 8215-a966f4c36f1ca174.js} +1 -1
  261. package/.next/static/chunks/8862-8f17ef601bb1fbd0.js +1 -0
  262. package/.next/static/chunks/8890-a7a8c6f1dc3cd343.js +1 -0
  263. package/.next/static/chunks/9164-d15e4dab0a1bf282.js +1 -0
  264. package/.next/static/chunks/9195.294887f083b1a11b.js +1 -0
  265. package/.next/static/chunks/app/api/backup/{route-acd5b6e731d45f1a.js → route-3291f6991ce3f52c.js} +1 -1
  266. package/.next/static/chunks/app/api/browse/{route-acd5b6e731d45f1a.js → route-3291f6991ce3f52c.js} +1 -1
  267. package/.next/static/chunks/app/api/cwd/{route-acd5b6e731d45f1a.js → route-3291f6991ce3f52c.js} +1 -1
  268. package/.next/static/chunks/app/api/encryption/secure/{route-acd5b6e731d45f1a.js → route-3291f6991ce3f52c.js} +1 -1
  269. package/.next/static/chunks/app/api/env/route-3291f6991ce3f52c.js +1 -0
  270. package/.next/static/chunks/app/api/flow/[id]/route-3291f6991ce3f52c.js +1 -0
  271. package/.next/static/chunks/app/api/flow/prompt-renderer/route-3291f6991ce3f52c.js +1 -0
  272. package/.next/static/chunks/app/api/flow/route-3291f6991ce3f52c.js +1 -0
  273. package/.next/static/chunks/app/api/git/route-3291f6991ce3f52c.js +1 -0
  274. package/.next/static/chunks/app/api/init/route-3291f6991ce3f52c.js +1 -0
  275. package/.next/static/chunks/app/api/mcp/cancel/route-3291f6991ce3f52c.js +1 -0
  276. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-3291f6991ce3f52c.js +1 -0
  277. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-3291f6991ce3f52c.js +1 -0
  278. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-3291f6991ce3f52c.js +1 -0
  279. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-3291f6991ce3f52c.js +1 -0
  280. package/.next/static/chunks/app/api/mcp/servers/[name]/route-3291f6991ce3f52c.js +1 -0
  281. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-3291f6991ce3f52c.js +1 -0
  282. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-3291f6991ce3f52c.js +1 -0
  283. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-3291f6991ce3f52c.js +1 -0
  284. package/.next/static/chunks/app/api/mcp/servers/route-3291f6991ce3f52c.js +1 -0
  285. package/.next/static/chunks/app/api/mcp/test-connection/route-3291f6991ce3f52c.js +1 -0
  286. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-3291f6991ce3f52c.js +1 -0
  287. package/.next/static/chunks/app/api/mcp-registry/route-3291f6991ce3f52c.js +1 -0
  288. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-3291f6991ce3f52c.js +1 -0
  289. package/.next/static/chunks/app/api/model/[id]/route-3291f6991ce3f52c.js +1 -0
  290. package/.next/static/chunks/app/api/model/provider/route-3291f6991ce3f52c.js +1 -0
  291. package/.next/static/chunks/app/api/model/route-3291f6991ce3f52c.js +1 -0
  292. package/.next/static/chunks/app/api/model/test/route-3291f6991ce3f52c.js +1 -0
  293. package/.next/static/chunks/app/api/oauth/callback/route-3291f6991ce3f52c.js +1 -0
  294. package/.next/static/chunks/app/api/oauth/initiate/route-3291f6991ce3f52c.js +1 -0
  295. package/.next/static/chunks/app/api/oauth/reset/route-3291f6991ce3f52c.js +1 -0
  296. package/.next/static/chunks/app/api/planned-executions/[id]/route-3291f6991ce3f52c.js +1 -0
  297. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-3291f6991ce3f52c.js +1 -0
  298. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-3291f6991ce3f52c.js +1 -0
  299. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-3291f6991ce3f52c.js +1 -0
  300. package/.next/static/chunks/app/api/planned-executions/route-3291f6991ce3f52c.js +1 -0
  301. package/.next/static/chunks/app/api/restore/route-3291f6991ce3f52c.js +1 -0
  302. package/.next/static/chunks/app/api/storage/route-3291f6991ce3f52c.js +1 -0
  303. package/.next/static/chunks/app/api/update/route-3291f6991ce3f52c.js +1 -0
  304. package/.next/static/chunks/app/api/webhooks/[id]/route-3291f6991ce3f52c.js +1 -0
  305. package/.next/static/chunks/app/chat/page-aea8c8cbfa461e7f.js +1 -0
  306. package/.next/static/chunks/app/executions/{page-b46744c507a6e810.js → page-95fec57bf97ee809.js} +1 -1
  307. package/.next/static/chunks/app/flows/page-7fe295069ccdb5fe.js +1 -0
  308. package/.next/static/chunks/app/mcp/page-0f923960004aa437.js +1 -0
  309. package/.next/static/chunks/app/mcp-flows/route-3291f6991ce3f52c.js +1 -0
  310. package/.next/static/chunks/app/mcp-proxy/[server]/route-3291f6991ce3f52c.js +1 -0
  311. package/.next/static/chunks/app/models/page-d81d2b1fe2f1d063.js +1 -0
  312. package/.next/static/chunks/app/page-6e18a8cd78b2050e.js +1 -0
  313. package/.next/static/chunks/app/settings/page-d03a168f6efbf7fd.js +1 -0
  314. package/.next/static/chunks/app/v1/chat/completions/route-3291f6991ce3f52c.js +1 -0
  315. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-3291f6991ce3f52c.js +1 -0
  316. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-3291f6991ce3f52c.js +1 -0
  317. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-3291f6991ce3f52c.js +1 -0
  318. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-3291f6991ce3f52c.js +1 -0
  319. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-3291f6991ce3f52c.js +1 -0
  320. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-3291f6991ce3f52c.js +1 -0
  321. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-3291f6991ce3f52c.js +1 -0
  322. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-3291f6991ce3f52c.js +1 -0
  323. package/.next/static/chunks/app/v1/chat/conversations/route-3291f6991ce3f52c.js +1 -0
  324. package/.next/static/chunks/app/v1/models/route-3291f6991ce3f52c.js +1 -0
  325. package/.next/static/chunks/{webpack-6f17a022ac16e8bd.js → webpack-63a4c59e84967e90.js} +1 -1
  326. package/.next/trace +7 -7
  327. package/.next/types/app/api/mcp/test-connection/stream/route.ts +347 -0
  328. package/.next/types/routes.d.ts +2 -1
  329. package/.next/types/validator.ts +9 -0
  330. package/README.md +37 -7
  331. package/package.json +2 -2
  332. package/.next/server/chunks/1986.js +0 -1
  333. package/.next/server/chunks/2181.js +0 -17
  334. package/.next/server/chunks/5486.js +0 -1
  335. package/.next/server/chunks/62.js +0 -1
  336. package/.next/server/chunks/6542.js +0 -1
  337. package/.next/static/6EKGB09pbUp8R7aHuLiP1/_buildManifest.js +0 -1
  338. package/.next/static/chunks/2380-2a7acfa037ec8e80.js +0 -1
  339. package/.next/static/chunks/3217.79ca74c918fc772c.js +0 -1
  340. package/.next/static/chunks/3235-dfcb73b8d483f8cd.js +0 -1
  341. package/.next/static/chunks/3545.c3fbe14528517a75.js +0 -1
  342. package/.next/static/chunks/3750-38474d67566af4c3.js +0 -1
  343. package/.next/static/chunks/3810-cee95063d5535307.js +0 -1
  344. package/.next/static/chunks/39-1732a0b689c7b641.js +0 -1
  345. package/.next/static/chunks/6134-758747aabd77289d.js +0 -8
  346. package/.next/static/chunks/7488-b58bc701d0deda00.js +0 -1
  347. package/.next/static/chunks/8862-1314a13b011c4817.js +0 -1
  348. package/.next/static/chunks/9164-81ca1a1bccdc5ed2.js +0 -1
  349. package/.next/static/chunks/9195.01a57af6d6cdf1a5.js +0 -1
  350. package/.next/static/chunks/app/api/env/route-acd5b6e731d45f1a.js +0 -1
  351. package/.next/static/chunks/app/api/flow/[id]/route-acd5b6e731d45f1a.js +0 -1
  352. package/.next/static/chunks/app/api/flow/prompt-renderer/route-acd5b6e731d45f1a.js +0 -1
  353. package/.next/static/chunks/app/api/flow/route-acd5b6e731d45f1a.js +0 -1
  354. package/.next/static/chunks/app/api/git/route-acd5b6e731d45f1a.js +0 -1
  355. package/.next/static/chunks/app/api/init/route-acd5b6e731d45f1a.js +0 -1
  356. package/.next/static/chunks/app/api/mcp/cancel/route-acd5b6e731d45f1a.js +0 -1
  357. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-acd5b6e731d45f1a.js +0 -1
  358. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-acd5b6e731d45f1a.js +0 -1
  359. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-acd5b6e731d45f1a.js +0 -1
  360. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-acd5b6e731d45f1a.js +0 -1
  361. package/.next/static/chunks/app/api/mcp/servers/[name]/route-acd5b6e731d45f1a.js +0 -1
  362. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-acd5b6e731d45f1a.js +0 -1
  363. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-acd5b6e731d45f1a.js +0 -1
  364. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-acd5b6e731d45f1a.js +0 -1
  365. package/.next/static/chunks/app/api/mcp/servers/route-acd5b6e731d45f1a.js +0 -1
  366. package/.next/static/chunks/app/api/mcp/test-connection/route-acd5b6e731d45f1a.js +0 -1
  367. package/.next/static/chunks/app/api/mcp-registry/route-acd5b6e731d45f1a.js +0 -1
  368. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-acd5b6e731d45f1a.js +0 -1
  369. package/.next/static/chunks/app/api/model/[id]/route-acd5b6e731d45f1a.js +0 -1
  370. package/.next/static/chunks/app/api/model/provider/route-acd5b6e731d45f1a.js +0 -1
  371. package/.next/static/chunks/app/api/model/route-acd5b6e731d45f1a.js +0 -1
  372. package/.next/static/chunks/app/api/model/test/route-acd5b6e731d45f1a.js +0 -1
  373. package/.next/static/chunks/app/api/oauth/callback/route-acd5b6e731d45f1a.js +0 -1
  374. package/.next/static/chunks/app/api/oauth/initiate/route-acd5b6e731d45f1a.js +0 -1
  375. package/.next/static/chunks/app/api/oauth/reset/route-acd5b6e731d45f1a.js +0 -1
  376. package/.next/static/chunks/app/api/planned-executions/[id]/route-acd5b6e731d45f1a.js +0 -1
  377. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-acd5b6e731d45f1a.js +0 -1
  378. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-acd5b6e731d45f1a.js +0 -1
  379. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-acd5b6e731d45f1a.js +0 -1
  380. package/.next/static/chunks/app/api/planned-executions/route-acd5b6e731d45f1a.js +0 -1
  381. package/.next/static/chunks/app/api/restore/route-acd5b6e731d45f1a.js +0 -1
  382. package/.next/static/chunks/app/api/storage/route-acd5b6e731d45f1a.js +0 -1
  383. package/.next/static/chunks/app/api/update/route-acd5b6e731d45f1a.js +0 -1
  384. package/.next/static/chunks/app/api/webhooks/[id]/route-acd5b6e731d45f1a.js +0 -1
  385. package/.next/static/chunks/app/chat/page-019d2b836f34f40d.js +0 -1
  386. package/.next/static/chunks/app/flows/page-7b5c0e06951398ac.js +0 -1
  387. package/.next/static/chunks/app/mcp/page-1ca55f88a3045b5d.js +0 -1
  388. package/.next/static/chunks/app/mcp-flows/route-acd5b6e731d45f1a.js +0 -1
  389. package/.next/static/chunks/app/mcp-proxy/[server]/route-acd5b6e731d45f1a.js +0 -1
  390. package/.next/static/chunks/app/models/page-a20e6c4e1a5a0c9a.js +0 -1
  391. package/.next/static/chunks/app/page-471879d3918aeeb6.js +0 -1
  392. package/.next/static/chunks/app/settings/page-88f7e1b65a6681ec.js +0 -1
  393. package/.next/static/chunks/app/v1/chat/completions/route-acd5b6e731d45f1a.js +0 -1
  394. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-acd5b6e731d45f1a.js +0 -1
  395. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-acd5b6e731d45f1a.js +0 -1
  396. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-acd5b6e731d45f1a.js +0 -1
  397. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-acd5b6e731d45f1a.js +0 -1
  398. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-acd5b6e731d45f1a.js +0 -1
  399. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-acd5b6e731d45f1a.js +0 -1
  400. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-acd5b6e731d45f1a.js +0 -1
  401. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-acd5b6e731d45f1a.js +0 -1
  402. package/.next/static/chunks/app/v1/chat/conversations/route-acd5b6e731d45f1a.js +0 -1
  403. package/.next/static/chunks/app/v1/models/route-acd5b6e731d45f1a.js +0 -1
  404. /package/.next/static/{6EKGB09pbUp8R7aHuLiP1 → 9Pzu8N65j3JuRQ7zVUtwD}/_ssgManifest.js +0 -0
@@ -3,4 +3,4 @@
3
3
  <${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
4
4
  </${b.function.name}>`)}catch(c){q.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:A}),a.push(`<${b.function.name}>
5
5
  <error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
6
- </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=i.g4,q.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${A}.`);break}q.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${A} but no tools found after classification. Treating as final.`),d=i.g4;break}q.warn(`TOOL_CALL_ACTION received for conv ${A} but no tool_calls found in last message. Treating as final.`),d=i.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){q.info(`[Action Handling] Step ${F}: Handling Handoff Action (Edge ID) for conv ${A}`),q.info(`Handoff action received for conv ${A}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){c=e.id,q.debug(`Found handoff tool call ID: ${c} for edge ${d}`);let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),q.info(`Appended tool result message for handoff tool call ${c}`)}else q.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else q.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);J();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,G({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),q.info(`Transitioning conv ${A} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(A,b),K){q.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${A}.`),L();break}q.info(`Continuing loop for conv ${A} after handoff.`);continue}q.error(`Handoff failed for conv ${A}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=i.O;break}if(d===i.E5){q.info(`[Action Handling] Step ${F}: Handling STAY_ON_NODE_ACTION for conv ${A}`),q.info(`Stay on node action received for conv ${A} at step ${F}`);break}q.warn(`Unrecognized action '${d}' received at step ${F} for conv ${A}. Treating as final response.`),d=i.g4;break}}catch(a){if(q.error(`Unhandled error during execution loop for conv ${A}`,{loopError:a}),d!==i.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=i.O}}d===i.O&&"error"!==b.status&&(b.status="error");let M=Date.now()-f,N=b.status||(d===i.g4?"completed":d===i.O?"error":"running");q.info(`Execution finished for conv ${A}. Final Action: ${d}, Final Status: ${N}`,{duration:`${M}ms`}),J(),("completed"===N||"error"===N)&&G({type:"run:done",status:N});try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",q.verbose(`Updated conversation title for ${A} before final return to: ${b.title}`))}await s(B,b),q.debug(`Saved final state for conversation ${A} before returning.`)}catch(a){q.error(`Failed to save final state for conversation ${A}:`,a)}e.FlowExecutor.conversationStates.set(A,b);let O=()=>{x&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(A)},P={conversationId:b.conversationId||A,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return q.info(`Returning paused debug state for conv ${A}`),{...P,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===i.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},q.error(`Returning error result for conv ${A}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),O(),{...P,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let Q=b.messages.length>0?b.messages[b.messages.length-1]:null,R="",S="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(S=b.lastResponse._flujo_xml_tools,R=Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:"",R+=(R?"\n\n":"")+S,b.lastResponse=R):R="string"==typeof b.lastResponse?b.lastResponse:Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:d!==i.Jp||l?"Processing complete.":"";let T=S?void 0:Q?.role==="assistant"?Q.tool_calls:void 0;return q.info(`Returning success result for conv ${A}`,{action:d,status:b.status,flujo:l,requireApproval:t,flujodebug:u}),O(),{...P,status:b.status||(d===i.g4?"completed":"running"),outputText:R,toolCalls:T,pendingToolCalls:b.pendingToolCalls}}},94706:(a,b,c)=>{c.d(b,{validateFlowForRun:()=>m});var d=c(50846),e=c(79989),f=c(20433),g=c(1133),h=c(49181);function i(a){return a.data?.type??a.type??"unknown"}function j(a){return a.data?.label||a.id}function k(a){return a.data?.edgeType==="mcp"}let l=(0,d.h)("backend/execution/flow/validateFlowForRun");async function m(a){let b,c,d=await e.flowService.getFlow(a);if(!d)return l.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0};try{b=await f.modelService.loadModels()}catch(a){l.warn("validateFlowForRun: could not load models; skipping model checks",a)}try{let a=await g.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){l.warn("validateFlowForRun: could not load servers; skipping server checks",a)}return function(a,b={}){let c=[],d=Array.isArray(a?.nodes)?a.nodes:[],e=Array.isArray(a?.edges)?a.edges:[],f=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?j(e):void 0}),g=new Map((b.models??[]).map(a=>[a.id,a])),l=new Map((b.servers??[]).map(a=>[a.name,a])),m=!!b.models,n=!!b.servers,o=d.filter(a=>"start"===i(a)),p=d.filter(a=>"finish"===i(a)),q=d.filter(a=>"process"===i(a)),r=d.filter(a=>"mcp"===i(a));if(0===o.length)f("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(o.length>1)for(let a of o.slice(1))f("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===p.length&&f("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),q)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(m&&!g.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";f("error","process-model-missing",`Process node "${j(a)}" is bound to a model that no longer exists${c}.`,a)}}else f("error","process-missing-model",`Process node "${j(a)}" has no model bound.`,a)}for(let a of r){let b=(a.data?.properties??{}).boundServer;if(b){if(n&&!l.has(b))f("warning","mcp-server-missing",`MCP node "${j(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(n){let c=l.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;f("warning","mcp-server-disconnected",`MCP node "${j(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else f("warning","mcp-missing-server",`MCP node "${j(a)}" is not bound to a server.`,a);e.some(b=>k(b)&&(b.source===a.id||b.target===a.id))||f("warning","mcp-node-unconnected",`MCP node "${j(a)}" is not connected to any Process node.`,a)}if(o.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!k(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(e);for(let b of o)a.get(b.id)?.length||f("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(o.map(a=>a.id),a);for(let a of[...q,...p])b.has(a.id)||f("warning","unreachable-node",`${"finish"===i(a)?"Finish":"Process"} node "${j(a)}" is not reachable from the Start node.`,a)}for(let a of d.filter(a=>"subflow"===i(a))){let b=e.filter(b=>!k(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&f("error","subflow-multiple-outgoing",`Subflow node "${j(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a)}for(let a of q){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let g=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!k(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==i(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}(a.id,d,e),l=new Set;for(let d of(0,h.A$)(c)){if("handoff"===d.server)continue;let c=`${d.kind}:${d.server}:${d.name}`;!l.has(c)&&(l.add(c),g.has(d.server)?"tool"===d.kind&&b.serverTools&&b.serverTools[d.server]&&!b.serverTools[d.server].includes(d.name)&&f("warning","tool-unavailable",`Process node "${j(a)}" references tool "${d.name}" which server "${d.server}" no longer provides.`,a):f("error","tool-pill-disconnected",`Process node "${j(a)}" references ${d.kind} "${d.name}" from server "${d.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let s=c.filter(a=>"error"===a.severity).length,t=c.length-s;return{issues:c,errorCount:s,warningCount:t,isRunnable:0===s}}(d,{models:b,servers:c})}}};
6
+ </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=i.g4,q.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${A}.`);break}q.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${A} but no tools found after classification. Treating as final.`),d=i.g4;break}q.warn(`TOOL_CALL_ACTION received for conv ${A} but no tool_calls found in last message. Treating as final.`),d=i.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){q.info(`[Action Handling] Step ${F}: Handling Handoff Action (Edge ID) for conv ${A}`),q.info(`Handoff action received for conv ${A}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){c=e.id,q.debug(`Found handoff tool call ID: ${c} for edge ${d}`);let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),q.info(`Appended tool result message for handoff tool call ${c}`)}else q.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else q.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);J();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,G({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),q.info(`Transitioning conv ${A} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(A,b),K){q.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${A}.`),L();break}q.info(`Continuing loop for conv ${A} after handoff.`);continue}q.error(`Handoff failed for conv ${A}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=i.O;break}if(d===i.E5){q.info(`[Action Handling] Step ${F}: Handling STAY_ON_NODE_ACTION for conv ${A}`),q.info(`Stay on node action received for conv ${A} at step ${F}`);break}q.warn(`Unrecognized action '${d}' received at step ${F} for conv ${A}. Treating as final response.`),d=i.g4;break}}catch(a){if(q.error(`Unhandled error during execution loop for conv ${A}`,{loopError:a}),d!==i.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=i.O}}d===i.O&&"error"!==b.status&&(b.status="error");let M=Date.now()-f,N=b.status||(d===i.g4?"completed":d===i.O?"error":"running");q.info(`Execution finished for conv ${A}. Final Action: ${d}, Final Status: ${N}`,{duration:`${M}ms`}),J(),("completed"===N||"error"===N)&&G({type:"run:done",status:N});try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",q.verbose(`Updated conversation title for ${A} before final return to: ${b.title}`))}await s(B,b),q.debug(`Saved final state for conversation ${A} before returning.`)}catch(a){q.error(`Failed to save final state for conversation ${A}:`,a)}e.FlowExecutor.conversationStates.set(A,b);let O=()=>{x&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(A)},P={conversationId:b.conversationId||A,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return q.info(`Returning paused debug state for conv ${A}`),{...P,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===i.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},q.error(`Returning error result for conv ${A}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),O(),{...P,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let Q=b.messages.length>0?b.messages[b.messages.length-1]:null,R="",S="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(S=b.lastResponse._flujo_xml_tools,R=Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:"",R+=(R?"\n\n":"")+S,b.lastResponse=R):R="string"==typeof b.lastResponse?b.lastResponse:Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:d!==i.Jp||l?"Processing complete.":"";let T=S?void 0:Q?.role==="assistant"?Q.tool_calls:void 0;return q.info(`Returning success result for conv ${A}`,{action:d,status:b.status,flujo:l,requireApproval:t,flujodebug:u}),O(),{...P,status:b.status||(d===i.g4?"completed":"running"),outputText:R,toolCalls:T,pendingToolCalls:b.pendingToolCalls}}},94706:(a,b,c)=>{c.d(b,{validateFlowForRun:()=>m});var d=c(50846),e=c(79989),f=c(20433),g=c(23514),h=c(49181);function i(a){return a.data?.type??a.type??"unknown"}function j(a){return a.data?.label||a.id}function k(a){return a.data?.edgeType==="mcp"}let l=(0,d.h)("backend/execution/flow/validateFlowForRun");async function m(a){let b,c,d=await e.flowService.getFlow(a);if(!d)return l.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0};try{b=await f.modelService.loadModels()}catch(a){l.warn("validateFlowForRun: could not load models; skipping model checks",a)}try{let a=await g.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){l.warn("validateFlowForRun: could not load servers; skipping server checks",a)}return function(a,b={}){let c=[],d=Array.isArray(a?.nodes)?a.nodes:[],e=Array.isArray(a?.edges)?a.edges:[],f=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?j(e):void 0}),g=new Map((b.models??[]).map(a=>[a.id,a])),l=new Map((b.servers??[]).map(a=>[a.name,a])),m=!!b.models,n=!!b.servers,o=d.filter(a=>"start"===i(a)),p=d.filter(a=>"finish"===i(a)),q=d.filter(a=>"process"===i(a)),r=d.filter(a=>"mcp"===i(a));if(0===o.length)f("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(o.length>1)for(let a of o.slice(1))f("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===p.length&&f("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),q)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(m&&!g.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";f("error","process-model-missing",`Process node "${j(a)}" is bound to a model that no longer exists${c}.`,a)}}else f("error","process-missing-model",`Process node "${j(a)}" has no model bound.`,a)}for(let a of r){let b=(a.data?.properties??{}).boundServer;if(b){if(n&&!l.has(b))f("warning","mcp-server-missing",`MCP node "${j(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(n){let c=l.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;f("warning","mcp-server-disconnected",`MCP node "${j(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else f("warning","mcp-missing-server",`MCP node "${j(a)}" is not bound to a server.`,a);e.some(b=>k(b)&&(b.source===a.id||b.target===a.id))||f("warning","mcp-node-unconnected",`MCP node "${j(a)}" is not connected to any Process node.`,a)}if(o.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!k(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(e);for(let b of o)a.get(b.id)?.length||f("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(o.map(a=>a.id),a);for(let a of[...q,...p])b.has(a.id)||f("warning","unreachable-node",`${"finish"===i(a)?"Finish":"Process"} node "${j(a)}" is not reachable from the Start node.`,a)}for(let a of d.filter(a=>"subflow"===i(a))){let b=e.filter(b=>!k(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&f("error","subflow-multiple-outgoing",`Subflow node "${j(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a)}for(let a of q){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let g=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!k(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==i(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}(a.id,d,e),l=new Set;for(let d of(0,h.A$)(c)){if("handoff"===d.server)continue;let c=`${d.kind}:${d.server}:${d.name}`;!l.has(c)&&(l.add(c),g.has(d.server)?"tool"===d.kind&&b.serverTools&&b.serverTools[d.server]&&!b.serverTools[d.server].includes(d.name)&&f("warning","tool-unavailable",`Process node "${j(a)}" references tool "${d.name}" which server "${d.server}" no longer provides.`,a):f("error","tool-pill-disconnected",`Process node "${j(a)}" references ${d.kind} "${d.name}" from server "${d.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let s=c.filter(a=>"error"===a.severity).length,t=c.length-s;return{issues:c,errorCount:s,warningCount:t,isRunnable:0===s}}(d,{models:b,servers:c})}}};
@@ -1,21 +1,21 @@
1
- "use strict";exports.id=724,exports.ids=[724],exports.modules={8164:(a,b,c)=>{c.d(b,{A$:()=>f.A$,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b));var f=c(49181);c(73456)},49181:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},60724:(a,b,c)=>{c.d(b,{h:()=>k});var d=c(79989),e=c(20433),f=c(1133),g=c(50846),h=c(8164);let i=(0,g.h)("backend/utils/PromptRenderer");class j{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;i.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h}=await this.findNodePrompt(b,a),j=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,k=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h;i.debug("Exclusion settings",{excludeModelPrompt:j,excludeStartNodePrompt:k,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0}});let l="",m=null;if(!k){let b=await this.findStartNodePrompt(a);b&&(i.debug("Adding start node prompt",{length:b.length}),l+=b+"\n\n")}if(!j){let c=await this.findModelPrompt(b,a);c.prompt&&(i.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),l+=c.prompt+"\n\n"),m=c.functionCallingSchema,c.reasoningSchema&&(l+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
1
+ "use strict";exports.id=724,exports.ids=[724],exports.modules={8164:(a,b,c)=>{c.d(b,{A$:()=>f.A$,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b));var f=c(49181);c(73456)},49181:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},60724:(a,b,c)=>{c.d(b,{h:()=>k});var d=c(79989),e=c(20433),f=c(23514),g=c(50846),h=c(8164);let i=(0,g.h)("backend/utils/PromptRenderer");class j{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;i.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:j}=await this.findNodePrompt(b,a),k=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,l=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,m=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:j;i.debug("Exclusion settings",{excludeModelPrompt:k,excludeStartNodePrompt:l,excludeSystemPrompt:m,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let n="",o=null;if(!l){let b=await this.findStartNodePrompt(a);b&&(i.debug("Adding start node prompt",{length:b.length}),n+=b+"\n\n")}if(!k){let c=await this.findModelPrompt(b,a);c.prompt&&(i.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),n+=c.prompt+"\n\n"),o=c.functionCallingSchema,c.reasoningSchema&&(n+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
2
2
 
3
- `),m&&(l+=`Please use the following pattern to use a tool: ${m}
3
+ `),o&&(n+=`Please use the following pattern to use a tool: ${o}
4
4
 
5
- `),l+=`# GENERAL INFORMATION:
6
- `,l+=`You are operating in a workflow with other agents, each with it's own responsibilities.
7
- `,l+=`You will receive a message from the user which may contain tasks that are outside of your scope.
8
- `,l+=`Focus on the part of the user-message that can be accomplished using the tools provided to you.
5
+ `)}return m||(n+=`# GENERAL INFORMATION:
6
+ `,n+=`You are operating in a workflow with other agents, each with it's own responsibilities.
7
+ `,n+=`You will receive a message from the user which may contain tasks that are outside of your scope.
8
+ `,n+=`Focus on the part of the user-message that can be accomplished using the tools provided to you.
9
9
 
10
- `,l+=`You may do multiple tool calls.
10
+ `,n+=`You may do multiple tool calls.
11
11
 
12
- `,l+=`After you completed the user's request to the best of your ability, you can use the 'handoff_to_xxxx' tool.
12
+ `,n+=`After you completed the user's request to the best of your ability, you can use the 'handoff_to_xxxx' tool.
13
13
 
14
- `,l+=`The processing may be handed back to you as part of a loop. In this case repeat processing your instructions as if you were executing them for the first time.
14
+ `,n+=`The processing may be handed back to you as part of a loop. In this case repeat processing your instructions as if you were executing them for the first time.
15
15
 
16
- `}return f&&(l+=`# YOUR OPERATIONAL INSTRUCTION:
17
- `,i.debug("Adding node prompt",{length:f.length}),l+=f+`
18
- `),l=await this.resolveBindings(l,d,m),e&&(i.debug("Adding conversation history placeholder"),l+="\n\n[Conversation History will be included here]"),i.info("Prompt rendering completed",{totalLength:l.length,hasStartNodePrompt:!k,hasModelPrompt:!j,hasNodePrompt:!!f,includesConversationHistory:e}),l}async findStartNodePrompt(a){i.debug(`Finding start node prompt for flow ${a}`);let b=await d.flowService.getFlow(a);if(!b)return i.warn(`Flow not found: ${a}`),"";let c=b.nodes.find(a=>"start"===a.type);if(!c)return i.warn(`Start node not found in flow: ${a}`),"";let e=c.data.properties?.promptTemplate||"";return i.debug("Found start node prompt",{nodeId:c.id,length:e.length}),e}async findModelPrompt(a,b){i.debug(`Finding model prompt for node ${a} in flow ${b}`);let c=await d.flowService.getFlow(b);if(!c)return i.warn(`Flow not found: ${b}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let f=c.nodes.find(b=>b.id===a);if(!f)return i.warn(`Node not found: ${a} in flow: ${b}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let g=f.data.properties?.boundModel;if(!g)return i.debug(`No model bound to node ${a}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let h=await e.modelService.getModel(g);if(!h)return i.warn(`Model not found: ${g}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let j=h.promptTemplate||"",k=h.reasoningSchema||null,l=h.functionCallingSchema||null;return i.debug("Found model prompt",{modelId:g,modelName:h.name,length:j.length}),{prompt:j,modelId:g,reasoningSchema:k,functionCallingSchema:l}}async findNodePrompt(a,b){i.debug(`Finding node prompt for node ${a} in flow ${b}`);let c=await d.flowService.getFlow(b);if(!c)return i.warn(`Flow not found: ${b}`),{prompt:"",excludeModelPrompt:!1,excludeStartNodePrompt:!1};let e=c.nodes.find(b=>b.id===a);if(!e)return i.warn(`Node not found: ${a} in flow: ${b}`),{prompt:"",excludeModelPrompt:!1,excludeStartNodePrompt:!1};let f=e.data.properties?.promptTemplate||"",g=e.data.properties?.excludeModelPrompt||!1,h=e.data.properties?.excludeStartNodePrompt||!1;return i.debug("Found node prompt and settings",{length:f.length,excludeModelPrompt:g,excludeStartNodePrompt:h}),{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h}}async resolveBindings(a,b,c){b="raw";let d=(0,h.A$)(a);if(0===d.length)return a;i.debug(`Resolving ${d.length} binding pills`,{renderMode:b});let e=this.resolveFormatType(c),f="",g=0;for(let c of d)f+=a.slice(g,c.index),g=c.index+c.fullMatch.length,"resource"===c.kind?f+=await this.renderResourceBinding(c.server,c.name):"raw"===b?f+=c.fullMatch:f+=await this.renderToolBinding(c.server,c.name,e,c.fullMatch);return f+=a.slice(g),i.debug("Resolved binding pills"),f}resolveFormatType(a){return a?a.includes('"tool"')&&a.includes('"parameters"')?"json":a.includes("<")&&a.includes("</")?"xml":"text":"text"}async ensureConnected(a){let b=await f.mcpService.getServerStatus(a);return"connected"!==b.status&&(i.debug(`force connect ${a}`),await f.mcpService.connectServer(a),b=await f.mcpService.getServerStatus(a)),"connected"===b.status}async renderToolBinding(a,b,c,d){for(let e=0;e<3;e++){try{if(await this.ensureConnected(a)){let d=await f.mcpService.listServerTools(a),e=d.tools?.find(a=>a.name===b);if(e)switch(c){case"json":return this.formatToolDescriptionJSON(a,b,e);case"xml":return this.formatToolDescriptionXML(a,b,e);default:{let c=this.formatToolParameters(e);return`[The user is referencing a tool \`tool:${a}__${b}\` (${e.description||"No description"})${c}]`}}i.warn(`Tool not found: ${b} in server ${a}`)}else i.warn(`Server not connected: ${a}`)}catch(a){i.warn(`Error resolving tool pill (attempt ${e+1}): ${d}`,a)}await this.delay(100*Math.pow(2,e+1))}return i.error(`Failed to resolve tool pill after multiple retries: ${d}`),d}async renderResourceBinding(a,b){for(let c=0;c<3;c++){try{if(await this.ensureConnected(a)){let c=await f.mcpService.readResource(a,b);if(c.success&&c.data){let d=this.formatResourceContents(c.data);return`
16
+ `),f&&(n+=`# YOUR OPERATIONAL INSTRUCTION:
17
+ `,i.debug("Adding node prompt",{length:f.length}),n+=f+`
18
+ `),n=await this.resolveBindings(n,d,o),e&&(i.debug("Adding conversation history placeholder"),n+="\n\n[Conversation History will be included here]"),i.info("Prompt rendering completed",{totalLength:n.length,hasStartNodePrompt:!l,hasModelPrompt:!k,hasSystemPrompt:!m,hasNodePrompt:!!f,includesConversationHistory:e}),n}async findStartNodePrompt(a){i.debug(`Finding start node prompt for flow ${a}`);let b=await d.flowService.getFlow(a);if(!b)return i.warn(`Flow not found: ${a}`),"";let c=b.nodes.find(a=>"start"===a.type);if(!c)return i.warn(`Start node not found in flow: ${a}`),"";let e=c.data.properties?.promptTemplate||"";return i.debug("Found start node prompt",{nodeId:c.id,length:e.length}),e}async findModelPrompt(a,b){i.debug(`Finding model prompt for node ${a} in flow ${b}`);let c=await d.flowService.getFlow(b);if(!c)return i.warn(`Flow not found: ${b}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let f=c.nodes.find(b=>b.id===a);if(!f)return i.warn(`Node not found: ${a} in flow: ${b}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let g=f.data.properties?.boundModel;if(!g)return i.debug(`No model bound to node ${a}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let h=await e.modelService.getModel(g);if(!h)return i.warn(`Model not found: ${g}`),{prompt:"",modelId:null,reasoningSchema:null,functionCallingSchema:null};let j=h.promptTemplate||"",k=h.reasoningSchema||null,l=h.functionCallingSchema||null;return i.debug("Found model prompt",{modelId:g,modelName:h.name,length:j.length}),{prompt:j,modelId:g,reasoningSchema:k,functionCallingSchema:l}}async findNodePrompt(a,b){i.debug(`Finding node prompt for node ${a} in flow ${b}`);let c=await d.flowService.getFlow(b);if(!c)return i.warn(`Flow not found: ${b}`),{prompt:"",excludeModelPrompt:!1,excludeStartNodePrompt:!1,excludeSystemPrompt:!1};let e=c.nodes.find(b=>b.id===a);if(!e)return i.warn(`Node not found: ${a} in flow: ${b}`),{prompt:"",excludeModelPrompt:!1,excludeStartNodePrompt:!1,excludeSystemPrompt:!1};let f=e.data.properties?.promptTemplate||"",g=e.data.properties?.excludeModelPrompt||!1,h=e.data.properties?.excludeStartNodePrompt||!1,j=e.data.properties?.excludeSystemPrompt||!1;return i.debug("Found node prompt and settings",{length:f.length,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:j}),{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:j}}async resolveBindings(a,b,c){b="raw";let d=(0,h.A$)(a);if(0===d.length)return a;i.debug(`Resolving ${d.length} binding pills`,{renderMode:b});let e=this.resolveFormatType(c),f="",g=0;for(let c of d)f+=a.slice(g,c.index),g=c.index+c.fullMatch.length,"resource"===c.kind?f+=await this.renderResourceBinding(c.server,c.name):"raw"===b?f+=c.fullMatch:f+=await this.renderToolBinding(c.server,c.name,e,c.fullMatch);return f+=a.slice(g),i.debug("Resolved binding pills"),f}resolveFormatType(a){return a?a.includes('"tool"')&&a.includes('"parameters"')?"json":a.includes("<")&&a.includes("</")?"xml":"text":"text"}async ensureConnected(a){let b=await f.mcpService.getServerStatus(a);return"connected"!==b.status&&(i.debug(`force connect ${a}`),await f.mcpService.connectServer(a),b=await f.mcpService.getServerStatus(a)),"connected"===b.status}async renderToolBinding(a,b,c,d){for(let e=0;e<3;e++){try{if(await this.ensureConnected(a)){let d=await f.mcpService.listServerTools(a),e=d.tools?.find(a=>a.name===b);if(e)switch(c){case"json":return this.formatToolDescriptionJSON(a,b,e);case"xml":return this.formatToolDescriptionXML(a,b,e);default:{let c=this.formatToolParameters(e);return`[The user is referencing a tool \`tool:${a}__${b}\` (${e.description||"No description"})${c}]`}}i.warn(`Tool not found: ${b} in server ${a}`)}else i.warn(`Server not connected: ${a}`)}catch(a){i.warn(`Error resolving tool pill (attempt ${e+1}): ${d}`,a)}await this.delay(100*Math.pow(2,e+1))}return i.error(`Failed to resolve tool pill after multiple retries: ${d}`),d}async renderResourceBinding(a,b){for(let c=0;c<3;c++){try{if(await this.ensureConnected(a)){let c=await f.mcpService.readResource(a,b);if(c.success&&c.data){let d=this.formatResourceContents(c.data);return`
19
19
  [Resource ${b} (from ${a})]:
20
20
  ${d}
21
21
  `}return i.warn(`Failed to read resource ${b} from ${a}: ${c.error}`),`[Resource ${b} from ${a} could not be read: ${c.error||"unknown error"}]`}i.warn(`Server not connected for resource read: ${a}`)}catch(a){i.warn(`Error resolving resource pill (attempt ${c+1}): ${b}`,a)}await this.delay(100*Math.pow(2,c+1))}return`[Resource ${b} from ${a} is currently unavailable]`}formatResourceContents(a){let b=a?.contents;return Array.isArray(b)&&0!==b.length?b.map(a=>"string"==typeof a.text?a.text:"string"==typeof a.blob?`[binary ${a.mimeType||"data"} omitted]`:JSON.stringify(a)).join("\n\n"):"(empty resource)"}formatToolDescriptionJSON(a,b,c){let d={tool:`${b}`,parameters:{}};if(c.inputSchema?.properties)for(let a in c.inputSchema.properties){let b=c.inputSchema.properties[a];d.parameters[a]=b.description||a}return`[Tool: \`tool:${a}__${b}\` (${c.description||"No description"})
@@ -5,6 +5,6 @@ ${b.condition}
5
5
  Tool result (untrusted data):
6
6
  \`\`\`json
7
7
  ${m}
8
- \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(2181)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(2181)]).then(c.bind(c,48999)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(2181),c.e(724),c.e(1403),c.e(7214),c.e(9989)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
8
+ \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,48999)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403),c.e(7214),c.e(9989)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
9
9
 
10
10
  ${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
@@ -1,2 +1,2 @@
1
- exports.id=473,exports.ids=[473],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3421:(a,b,c)=>{"use strict";Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(71237),e=c(55088),f=c(17679);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}},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}.
2
- 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:()=>{},95736:(a,b,c)=>{"use strict";a.exports=c(44870)},96487:()=>{},97020:(a,b,c)=>{"use strict";c.d(b,{Af:()=>g,PK:()=>f,Pq:()=>e});var d=c(1133);function e(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}function f(a){return"string"!=typeof a||0===a.length?"A non-empty server name is required":a.length>200?"Server name must be 200 characters or fewer":"."===a||".."===a?'Server name cannot be "." or ".."':/[/\\\x00-\x1f]/.test(a)?'Server name cannot contain "/", "\\", or control characters':null}async function g(a){let b=await d.mcpService.loadServerConfigs();return Array.isArray(b)?{config:b.find(b=>b.name===a)}:{error:b.error||"Failed to load server configs"}}}};
1
+ exports.id=7731,exports.ids=[7731],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}},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}.
2
+ 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:()=>{},96487:()=>{},97020:(a,b,c)=>{"use strict";c.d(b,{Af:()=>g,PK:()=>f,Pq:()=>e});var d=c(23514);function e(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}function f(a){return"string"!=typeof a||0===a.length?"A non-empty server name is required":a.length>200?"Server name must be 200 characters or fewer":"."===a||".."===a?'Server name cannot be "." or ".."':/[/\\\x00-\x1f]/.test(a)?'Server name cannot contain "/", "\\", or control characters':null}async function g(a){let b=await d.mcpService.loadServerConfigs();return Array.isArray(b)?{config:b.find(b=>b.name===a)}:{error:b.error||"Failed to load server configs"}}}};
@@ -0,0 +1 @@
1
+ exports.id=8126,exports.ids=[8126,9989],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}},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)},78335:()=>{},79989:(a,b,c)=>{"use strict";c.d(b,{flowService:()=>k});var d=c(32524),e=c(92372),f=c(46480);let g=(0,c(50846).h)("backend/services/flow/index"),h=f.Z.FLOWS;async function i(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,h,a=>a.id)}catch(a){g.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class j{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return g.debug("Using cached flows"),this.flowsCache;g.debug("Loading flows from storage"),await i();let a=await (0,e.pL)(h);return this.flowsCache=a,g.info("Loaded flows from storage",{count:a.length}),a}catch(a){return g.error("Failed to load flows",a),[]}}async getFlow(a){try{g.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return g.debug(`Flow ${a} found in cache`),b;await i();let c=null;try{c=await (0,e.EI)(h,a,null)}catch(b){g.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 g.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return g.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(5504),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),g.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){g.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{g.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await i(),await (0,e.Vt)(h,a.id,a);let b=this.flowsCache;if(b){let c=b.findIndex(b=>b.id===a.id);c>=0?b[c]=a:b.push(a),this.flowsCache=b}return await this.invalidateExecutionCache(a.id),g.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return g.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{g.debug(`Deleting flow: ${a}`),await i(),await (0,e.bB)(h,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),g.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return g.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}createNode(a,b){g.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 g.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){g.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 g.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return g.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){g.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 g.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){g.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return g.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let k=new j},96487:()=>{}};
@@ -1 +1 @@
1
- "use strict";exports.id=8460,exports.ids=[8460],exports.modules={28055:(a,b,c)=>{c.d(b,{S:()=>f});let d=(0,c(19815).h)("frontend/services/mcp/index");class e{async loadServerConfigs(){try{let a=await fetch("/api/mcp/servers"),b=await a.json();if(!a.ok||b&&b.error){let a=b&&b.error||"Failed to load server configs";return d.warn("Failed to load server configs:",a),{error:a}}return b}catch(a){return d.warn("Failed to load server configs:",a),{error:"Failed to load server configs"}}}async listServerTools(a){try{let b=this.toolsCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return d.debug(`Using cached tools for server ${a}`),{tools:b.tools};let e=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/tools`),f=await e.json();if(f.error)return d.warn(`Error listing tools for server ${a}:`,f.error),{tools:[],error:f.error};let g=Array.isArray(f.tools)?f.tools:[];return this.toolsCache.set(a,{tools:g,timestamp:c}),{tools:g}}catch(b){return d.warn(`Failed to list tools for server ${a}:`,b),{tools:[],error:`Failed to list tools: ${b instanceof Error?b.message:"Unknown error"}`}}}clearToolsCache(a){a?(this.toolsCache.delete(a),d.debug(`Cleared tools cache for server ${a}`)):(this.toolsCache.clear(),d.debug("Cleared all tools cache"))}async listServerResources(a){try{let b=this.resourcesCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return d.debug(`Using cached resources for server ${a}`),b.data;let e=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/resources`),f=await e.json(),g={resources:Array.isArray(f.resources)?f.resources:[],resourceTemplates:Array.isArray(f.resourceTemplates)?f.resourceTemplates:[],error:f.error};return g.error||this.resourcesCache.set(a,{data:g,timestamp:c}),g}catch(b){return d.warn(`Failed to list resources for server ${a}:`,b),{resources:[],resourceTemplates:[],error:`Failed to list resources: ${b instanceof Error?b.message:"Unknown error"}`}}}async readResource(a,b){try{let c=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/resources/read?uri=${encodeURIComponent(b)}`);return await c.json()}catch(c){return d.warn(`Failed to read resource ${b} on server ${a}:`,c),{success:!1,error:"Failed to read resource"}}}async listServerPrompts(a){try{let b=this.promptsCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return d.debug(`Using cached prompts for server ${a}`),{prompts:b.prompts};let e=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/prompts`),f=await e.json();if(f.error)return d.warn(`Error listing prompts for server ${a}:`,f.error),{prompts:[],error:f.error};let g=Array.isArray(f.prompts)?f.prompts:[];return this.promptsCache.set(a,{prompts:g,timestamp:c}),{prompts:g}}catch(b){return d.warn(`Failed to list prompts for server ${a}:`,b),{prompts:[],error:`Failed to list prompts: ${b instanceof Error?b.message:"Unknown error"}`}}}async getPrompt(a,b,c){try{let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/prompts/get`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:b,arguments:c})});return await d.json()}catch(c){return d.warn(`Failed to get prompt ${b} on server ${a}:`,c),{success:!1,error:"Failed to get prompt"}}}clearCapabilitiesCache(a){a?(this.resourcesCache.delete(a),this.promptsCache.delete(a)):(this.resourcesCache.clear(),this.promptsCache.clear())}async callTool(a,b,c,e){try{let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/tools/${encodeURIComponent(b)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({args:c,timeout:e})});return await d.json()}catch(c){return d.warn(`Failed to call tool ${b} on server ${a}:`,c),{error:"Failed to call tool"}}}async updateServerConfig(a,b){try{let c=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),e=await c.json();if(c.ok)return d.info(`Successfully updated server config for ${a}`),{success:!0,data:e};if(void 0!==b.disabled)return d.info(`Config update for ${a} treated as success for toggle operation`),{success:!0,data:{...b,name:a},_originalError:e.error};return d.warn(`Failed to update server config for ${a}:`,e.error),{success:!1,error:e.error}}catch(b){return d.warn(`Failed to update server config for ${a}:`,b),{error:"Failed to update server config"}}}async testConnection(a){try{let b=await fetch("/api/mcp/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return await b.json()}catch(b){return d.warn(`Failed to test connection for ${a.name}:`,b),{success:!1,error:`Failed to reach the FLUJO backend to run the connection test: ${b instanceof Error?b.message:"Unknown error"}`}}}async getServerStatus(a){try{let b=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/status`,{headers:{Accept:"application/json"}}),c=await b.json();if(c.error)return d.warn(`Error getting status for server ${a}:`,c.error),{status:"error",message:c.error};return c}catch(b){return d.warn(`Failed to get status for server ${a}:`,b),{status:"error",message:`Failed to get server status: ${b instanceof Error?b.message:"Unknown error"}`}}}async deleteServerConfig(a){try{let b=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}`,{method:"DELETE"});return await b.json()}catch(b){return d.warn(`Failed to delete server config for ${a}:`,b),{error:"Failed to delete server config"}}}async retryServer(a){return d.debug(`Retrying server status for: ${a}`),this.getServerStatus(a)}async restartServer(a){d.debug(`Restarting server: ${a}`);try{let b=await this.updateServerConfig(a,{disabled:!0});if(b.error)return d.warn(`Failed to disable server ${a} during restart:`,b.error),{error:`Failed to restart server: ${b.error}`};await new Promise(a=>setTimeout(a,1e3));let c=await this.updateServerConfig(a,{disabled:!1});if(c.error)return d.warn(`Failed to enable server ${a} during restart:`,c.error),{error:`Failed to restart server: ${c.error}`};return d.info(`Successfully restarted server ${a}`),{success:!0}}catch(b){return d.warn(`Failed to restart server ${a}:`,b),{error:`Failed to restart server: ${b instanceof Error?b.message:"Unknown error"}`}}}constructor(){this.toolsCache=new Map,this.resourcesCache=new Map,this.promptsCache=new Map,this.CACHE_TTL=6e4}}let f=new e},83434:(a,b,c)=>{c.d(b,{N:()=>e,X:()=>d}),(0,c(19815).h)("frontend/services/model");let d=()=>{throw Error("ModelService can only be used in browser environment")},e=new Proxy({},{get(a,b){let c=d(),e=c[b];return"function"==typeof e?e.bind(c):e}})}};
1
+ "use strict";exports.id=8460,exports.ids=[8460],exports.modules={28055:(a,b,c)=>{c.d(b,{S:()=>g});var d=c(50648);let e=(0,c(19815).h)("frontend/services/mcp/index");class f{async loadServerConfigs(){try{let a=await fetch("/api/mcp/servers"),b=await a.json();if(!a.ok||b&&b.error){let a=b&&b.error||"Failed to load server configs";return e.warn("Failed to load server configs:",a),{error:a}}return b}catch(a){return e.warn("Failed to load server configs:",a),{error:"Failed to load server configs"}}}async listServerTools(a){try{let b=this.toolsCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return e.debug(`Using cached tools for server ${a}`),{tools:b.tools};let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/tools`),f=await d.json();if(f.error)return e.warn(`Error listing tools for server ${a}:`,f.error),{tools:[],error:f.error};let g=Array.isArray(f.tools)?f.tools:[];return this.toolsCache.set(a,{tools:g,timestamp:c}),{tools:g}}catch(b){return e.warn(`Failed to list tools for server ${a}:`,b),{tools:[],error:`Failed to list tools: ${b instanceof Error?b.message:"Unknown error"}`}}}clearToolsCache(a){a?(this.toolsCache.delete(a),e.debug(`Cleared tools cache for server ${a}`)):(this.toolsCache.clear(),e.debug("Cleared all tools cache"))}async listServerResources(a){try{let b=this.resourcesCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return e.debug(`Using cached resources for server ${a}`),b.data;let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/resources`),f=await d.json(),g={resources:Array.isArray(f.resources)?f.resources:[],resourceTemplates:Array.isArray(f.resourceTemplates)?f.resourceTemplates:[],error:f.error};return g.error||this.resourcesCache.set(a,{data:g,timestamp:c}),g}catch(b){return e.warn(`Failed to list resources for server ${a}:`,b),{resources:[],resourceTemplates:[],error:`Failed to list resources: ${b instanceof Error?b.message:"Unknown error"}`}}}async readResource(a,b){try{let c=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/resources/read?uri=${encodeURIComponent(b)}`);return await c.json()}catch(c){return e.warn(`Failed to read resource ${b} on server ${a}:`,c),{success:!1,error:"Failed to read resource"}}}async listServerPrompts(a){try{let b=this.promptsCache.get(a),c=Date.now();if(b&&c-b.timestamp<this.CACHE_TTL)return e.debug(`Using cached prompts for server ${a}`),{prompts:b.prompts};let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/prompts`),f=await d.json();if(f.error)return e.warn(`Error listing prompts for server ${a}:`,f.error),{prompts:[],error:f.error};let g=Array.isArray(f.prompts)?f.prompts:[];return this.promptsCache.set(a,{prompts:g,timestamp:c}),{prompts:g}}catch(b){return e.warn(`Failed to list prompts for server ${a}:`,b),{prompts:[],error:`Failed to list prompts: ${b instanceof Error?b.message:"Unknown error"}`}}}async getPrompt(a,b,c){try{let d=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/prompts/get`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:b,arguments:c})});return await d.json()}catch(c){return e.warn(`Failed to get prompt ${b} on server ${a}:`,c),{success:!1,error:"Failed to get prompt"}}}clearCapabilitiesCache(a){a?(this.resourcesCache.delete(a),this.promptsCache.delete(a)):(this.resourcesCache.clear(),this.promptsCache.clear())}async callTool(a,b,c,d){try{let e=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/tools/${encodeURIComponent(b)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({args:c,timeout:d})});return await e.json()}catch(c){return e.warn(`Failed to call tool ${b} on server ${a}:`,c),{error:"Failed to call tool"}}}async updateServerConfig(a,b){try{let c=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json();if(c.ok)return e.info(`Successfully updated server config for ${a}`),{success:!0,data:d};if(void 0!==b.disabled)return e.info(`Config update for ${a} treated as success for toggle operation`),{success:!0,data:{...b,name:a},_originalError:d.error};return e.warn(`Failed to update server config for ${a}:`,d.error),{success:!1,error:d.error}}catch(b){return e.warn(`Failed to update server config for ${a}:`,b),{error:"Failed to update server config"}}}async testConnection(a){try{let b=await fetch("/api/mcp/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});return await b.json()}catch(b){return e.warn(`Failed to test connection for ${a.name}:`,b),{success:!1,error:`Failed to reach the FLUJO backend to run the connection test: ${b instanceof Error?b.message:"Unknown error"}`}}}async testConnectionStreaming(a,b){try{let c=await fetch("/api/mcp/test-connection/stream",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!c.ok||!c.body)return e.warn(`Streaming test-connection unavailable (status ${c.status}); falling back`),this.testConnection(a);let f=null;if(await (0,d.z)(c,a=>{b(a),"result"===a.type&&(f={success:a.success,error:a.error,requiresAuthentication:a.requiresAuthentication,data:a.data})}),f)return f;return e.warn("Streaming test-connection ended without a result event"),{success:!1,error:"The connection test stream ended unexpectedly without a result."}}catch(b){return e.warn(`Streaming test connection failed for ${a.name}; falling back to non-streaming:`,b),this.testConnection(a)}}async getServerStatus(a){try{let b=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}/status`,{headers:{Accept:"application/json"}}),c=await b.json();if(c.error)return e.warn(`Error getting status for server ${a}:`,c.error),{status:"error",message:c.error};return c}catch(b){return e.warn(`Failed to get status for server ${a}:`,b),{status:"error",message:`Failed to get server status: ${b instanceof Error?b.message:"Unknown error"}`}}}async deleteServerConfig(a){try{let b=await fetch(`/api/mcp/servers/${encodeURIComponent(a)}`,{method:"DELETE"});return await b.json()}catch(b){return e.warn(`Failed to delete server config for ${a}:`,b),{error:"Failed to delete server config"}}}async retryServer(a){return e.debug(`Retrying server status for: ${a}`),this.getServerStatus(a)}async restartServer(a){e.debug(`Restarting server: ${a}`);try{let b=await this.updateServerConfig(a,{disabled:!0});if(b.error)return e.warn(`Failed to disable server ${a} during restart:`,b.error),{error:`Failed to restart server: ${b.error}`};await new Promise(a=>setTimeout(a,1e3));let c=await this.updateServerConfig(a,{disabled:!1});if(c.error)return e.warn(`Failed to enable server ${a} during restart:`,c.error),{error:`Failed to restart server: ${c.error}`};return e.info(`Successfully restarted server ${a}`),{success:!0}}catch(b){return e.warn(`Failed to restart server ${a}:`,b),{error:`Failed to restart server: ${b instanceof Error?b.message:"Unknown error"}`}}}constructor(){this.toolsCache=new Map,this.resourcesCache=new Map,this.promptsCache=new Map,this.CACHE_TTL=6e4}}let g=new f},50648:(a,b,c)=>{c.d(b,{z:()=>d});async function d(a,b){if(!a.body||"function"!=typeof a.body.getReader)throw Error("Response has no readable body to stream");let c=a.body.getReader(),d=new TextDecoder,e=function(){let a="",b=(a,b)=>{let c=a.trim();if(c)try{b.push(JSON.parse(c))}catch{}};return{push(c){let d;a+=c;let e=[];for(;(d=a.indexOf("\n"))>=0;)b(a.slice(0,d),e),a=a.slice(d+1);return e},flush(){let c=[];return b(a,c),a="",c}}}();try{for(;;){let{value:a,done:f}=await c.read();if(f)break;for(let c of e.push(d.decode(a,{stream:!0})))b(c)}let a=d.decode();if(a)for(let c of e.push(a))b(c);for(let a of e.flush())b(a)}finally{try{c.releaseLock()}catch{}}}},83434:(a,b,c)=>{c.d(b,{N:()=>e,X:()=>d}),(0,c(19815).h)("frontend/services/model");let d=()=>{throw Error("ModelService can only be used in browser environment")},e=new Proxy({},{get(a,b){let c=d(),e=c[b];return"function"==typeof e?e.bind(c):e}})}};
@@ -1,2 +1,2 @@
1
1
  "use strict";exports.id=8739,exports.ids=[8739],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},43326:(a,b,c)=>{c.d(b,{JC:()=>f,Ne:()=>h,ok:()=>g});var d=c(33873),e=c.n(d);function f(){return process.cwd()}function g(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?e().resolve(a):f()}function h(){return process.env.FLUJO_CONTAINER?"container":process.env.FLUJO_NPM?"npm":"git"}},46480:(a,b,c)=>{c.d(b,{Z:()=>d});var d=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a}({})},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
- ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},58739:(a,b,c)=>{c.r(b),c.d(b,{authenticate:()=>F,changeEncryptionPassword:()=>A,decryptWithPassword:()=>D,encryptWithPassword:()=>C,getEncryptionType:()=>J,initializeDefaultEncryption:()=>v,initializeEncryption:()=>w,isEncryptionInitialized:()=>H,isUserEncryptionEnabled:()=>I,logout:()=>G,migrateToUserEncryption:()=>z,verifyPassword:()=>E});var d=c(58862),e=c.n(d),f=c(92372),g=c(46480),h=c(50846),i=c(32524);let j=(0,h.h)("utils/encryption/session"),k=new Map;function l(){let a=Date.now(),b=0;for(let[c,d]of k.entries())a-d.createdAt>72e5&&(k.delete(c),b++);b>0&&j.info(`Cleaned up ${b} expired encryption sessions`)}let m=null,n=(0,h.h)("utils/encryption/secure"),o="data_encryption_key",p="data_encryption_iv",q="data_encryption_salt",r="encryption_version",s="encryption_type";var t=function(a){return a.DEFAULT="default",a.USER="user",a}(t||{});function u(){let a=e().enc.Utf8.parse("flujo_fixed_salt_v1");return e().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function v(){n.debug("initializeDefaultEncryption: Entering method");try{if(await H())return!0;let a=u(),b=e().lib.WordArray.random(8),c=e().lib.WordArray.random(16),d=e().AES.encrypt(b.toString(),a,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7}),h=e().enc.Utf8.parse("flujo_fixed_salt_v1"),i={[o]:d.toString(),[p]:c.toString(),[q]:h.toString(),[r]:1,[s]:"default"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,i),!0}catch(a){return n.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function w(a){n.debug("initializeEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"default"===b[s])return await z(a);let c=e().lib.WordArray.random(16),d=e().PBKDF2(a,c,{keySize:8,iterations:1e5}),h=e().lib.WordArray.random(8),i=e().lib.WordArray.random(16),j=e().AES.encrypt(h.toString(),d,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[o]:j.toString(),[p]:i.toString(),[q]:c.toString(),[r]:1,[s]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("initializeEncryption: Failed to initialize encryption:",a),!1}}async function x(){n.debug("getDefaultDEK: Entering method");try{let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!a){if(!await v())return n.error("getDefaultDEK: Failed to initialize default encryption"),null;return await x()}if("default"!==a[s])return n.error("getDefaultDEK: Not using default encryption"),null;let b=a[o],c=e().enc.Hex.parse(a[p]),d=u(),h=e().AES.decrypt(b,d,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!h.toString())return n.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return e().enc.Hex.parse(h.toString())}catch(a){return n.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function y(a){n.debug("getUserDEK: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b)return n.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[s])return n.error("getUserDEK: Not using user encryption"),null;let c=b[o],d=e().enc.Hex.parse(b[p]),h=e().enc.Hex.parse(b[q]),i=e().PBKDF2(a,h,{keySize:8,iterations:1e5}),j=e().AES.decrypt(c,i,{iv:d,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!j.toString())return n.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return e().enc.Hex.parse(j.toString())}catch(a){return n.error("getUserDEK: Failed to get user DEK:",a),null}}async function z(a){n.debug("migrateToUserEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"user"===b[s])return!0;let c=await x();if(!c)return n.error("migrateToUserEncryption: Failed to get default DEK for migration"),!1;let d=e().lib.WordArray.random(16),h=e().PBKDF2(a,d,{keySize:8,iterations:1e5}),i=e().lib.WordArray.random(16),j=e().AES.encrypt(c.toString(),h,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[o]:j.toString(),[p]:i.toString(),[q]:d.toString(),[r]:b?b[r]:1,[s]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("migrateToUserEncryption: Failed to migrate to user encryption:",a),!1}}async function A(a,b){n.debug("changeEncryptionPassword: Entering method");try{let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c)return n.error("changeEncryptionPassword: No encryption metadata found"),!1;if("default"===c[s])return await z(b);let d=c[o],h=e().enc.Hex.parse(c[p]),i=e().enc.Hex.parse(c[q]),j=e().PBKDF2(a,i,{keySize:8,iterations:1e5}),k=e().AES.decrypt(d,j,{iv:h,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!k.toString())return n.error("changeEncryptionPassword: Failed to decrypt DEK with old password"),!1;let l=e().lib.WordArray.random(16),m=e().PBKDF2(b,l,{keySize:8,iterations:1e5}),t=e().lib.WordArray.random(16),u=e().AES.encrypt(k.toString(),m,{iv:t,mode:e().mode.CBC,padding:e().pad.Pkcs7}),v={[o]:u.toString(),[p]:t.toString(),[q]:l.toString(),[r]:c[r],[s]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,v),!0}catch(a){return n.error("changeEncryptionPassword: Failed to change encryption password:",a),!1}}async function B(a,b=!1){n.debug("getDEK: Entering method");try{if(b&&a){n.debug("getDEK: Using session token");let b=function(a){let b=k.get(a);if(!b)return j.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(j.warn(`Session expired: ${a}`),k.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return e().enc.Hex.parse(b);n.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c){if(n.info("getDEK: No encryption metadata found, initializing default encryption"),!await v())return n.error("getDEK: Failed to initialize default encryption"),null;return await B(a,b)}if("user"!==c[s])return await x();{if(!a||b){n.warn("getDEK: Password required for user encryption but not provided, falling back to default encryption");let a=await x();if(a)return a;if(!await v())return n.error("getDEK: Failed to initialize default encryption as fallback"),null;return await x()}let c=await y(a);if(c)return c;return n.warn("getDEK: Failed to get user DEK, falling back to default encryption"),await x()}}catch(a){n.error("getDEK: Failed to get DEK:",a);try{if(n.warn("getDEK: Attempting to initialize default encryption as error recovery"),await v())return await x()}catch(a){n.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function C(a,b,c=!1){n.debug("encryptWithPassword: Entering method");try{let d=await B(b,c);if(!d)return null;let f=e().lib.WordArray.random(16),g=e().AES.encrypt(a,d,{iv:f,mode:e().mode.CBC,padding:e().pad.Pkcs7});return f.toString()+":"+g.toString()}catch(a){return n.error("encryptWithPassword: Failed to encrypt data:",a),null}}async function D(a,b,c=!1){n.debug("decryptWithPassword: Entering method");try{let d=await B(b,c);if(!d)return null;let f=a.split(":");if(2!==f.length)return n.error("decryptWithPassword: Invalid ciphertext format"),null;let g=e().enc.Hex.parse(f[0]),h=f[1];return e().AES.decrypt(h,d,{iv:g,mode:e().mode.CBC,padding:e().pad.Pkcs7}).toString(e().enc.Utf8)}catch(a){return n.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function E(a){n.debug("verifyPassword: Entering method");let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b||"user"!==b[s])return{valid:!1};{let b=await y(a);return null!==b?{valid:!0,token:function(a){let b=(0,i.A)(),c=Date.now();return k.set(b,{token:b,dek:a,createdAt:c,lastUsed:c}),j.info(`Created encryption session: ${b}`),!m&&(m=setInterval(l,36e5)).unref&&m.unref(),b}(b.toString())}:{valid:!1}}}async function F(a){n.debug("authenticate: Entering method");let b=await E(a);return b.valid&&b.token||null}async function G(a){n.debug("logout: Entering method");try{return k.has(a)&&(k.delete(a),j.info(`Invalidated encryption session: ${a}`)),!0}catch(a){return n.error("logout: Failed to invalidate session:",a),!1}}async function H(){return n.debug("isEncryptionInitialized: Entering method"),null!==await (0,f.YM)(g.Z.ENCRYPTION_KEY,null)}async function I(){n.debug("isUserEncryptionEnabled: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return null!==a&&"user"===a[s]}async function J(){n.debug("getEncryptionType: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return a?a[s]||"default":null}},92372:(a,b,c)=>{c.d(b,{N2:()=>u,Pv:()=>o,VH:()=>s,YM:()=>t});var d=c(29021),e=c(33873),f=c.n(e),g=c(46480),h=c(50846),i=c(43326);let j=(0,h.h)("utils/storage/backend"),k=f().join((0,i.ok)(),"db"),l=f().join((0,i.ok)(),".next","storage"),m=a=>f().join(k,`${a}.json`);async function n(){try{await d.promises.access(k),j.verbose(`Storage directory exists: ${k}`)}catch{j.debug(`Creating storage directory: ${k}`),await d.promises.mkdir(k,{recursive:!0})}try{await d.promises.access(l),j.warn(`Old storage directory found: ${l}. This may cause data inconsistency issues.`)}catch{}}async function o(){for(let a of(j.debug("Verifying storage system initialization"),await n(),Object.values(g.Z)))try{let b=m(a),c=!1;try{await d.promises.access(b),c=!0}catch{}j.debug(`Storage check: ${a} - ${c?"File exists":"File does not exist yet"}`);let e=f().join(l,`${a}.json`);try{await d.promises.access(e),c?j.warn(`Found ${a} in both old and new storage locations. This may cause data inconsistency.`):j.warn(`Found ${a} in old storage location but not in new location. This may cause data loss.`)}catch{}}catch(b){j.error(`Storage verification failed for ${a}:`,b)}j.debug("Storage verification completed")}let p=new Map,q=0;async function r(a,b){let c=f().dirname(a);await d.promises.mkdir(c,{recursive:!0});let e=`${a}.tmp.${process.pid}.${++q}`;try{await d.promises.writeFile(e,b),await d.promises.rename(e,a)}catch(a){try{await d.promises.unlink(e)}catch{}throw a}}async function s(a,b){let c=m(a),d=(p.get(a)??Promise.resolve()).catch(()=>{}).then(()=>r(c,JSON.stringify(b,null,2)));p.set(a,d);try{await d,j.verbose(`Successfully saved item to: ${c}`)}catch(b){throw j.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{p.get(a)===d&&p.delete(a)}}async function t(a,b){try{await n();let c=m(a),e=await d.promises.readFile(c,"utf-8");if(0===e.trim().length)return j.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(e);return j.verbose(`Successfully loaded item from: ${c}`),a}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,e),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return j.verbose(`Item with key "${a}" not found at ${m(a)}, returning default.`),b;throw j.error(`CRITICAL: Error loading item with key "${a}" from ${m(a)}:`,c),c}}async function u(a){let b=m(a);try{await d.promises.unlink(b),j.verbose(`Successfully cleared item: ${b}`)}catch(c){"ENOENT"!==c.code?j.warn(`Error clearing item with key "${a}" at ${b}:`,c):j.verbose(`Item with key "${a}" not found at ${b}, nothing to clear.`)}}}};
2
+ ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},58739:(a,b,c)=>{c.r(b),c.d(b,{EncryptionLockedError:()=>o,authenticate:()=>G,changeEncryptionPassword:()=>B,decryptWithPassword:()=>E,encryptWithPassword:()=>D,getEncryptionType:()=>L,initializeDefaultEncryption:()=>w,initializeEncryption:()=>x,isEncryptionInitialized:()=>I,isEncryptionLocked:()=>K,isUserEncryptionEnabled:()=>J,logout:()=>H,migrateToUserEncryption:()=>A,verifyPassword:()=>F});var d=c(58862),e=c.n(d),f=c(92372),g=c(46480),h=c(50846),i=c(32524);let j=(0,h.h)("utils/encryption/session"),k=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map);function l(){let a=Date.now(),b=0;for(let[c,d]of k.entries())a-d.createdAt>72e5&&(k.delete(c),b++);b>0&&j.info(`Cleaned up ${b} expired encryption sessions`)}let m=null,n=(0,h.h)("utils/encryption/secure");class o extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,o.prototype)}}let p="data_encryption_key",q="data_encryption_iv",r="data_encryption_salt",s="encryption_version",t="encryption_type";var u=function(a){return a.DEFAULT="default",a.USER="user",a}(u||{});function v(){let a=e().enc.Utf8.parse("flujo_fixed_salt_v1");return e().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function w(){n.debug("initializeDefaultEncryption: Entering method");try{if(await I())return!0;let a=v(),b=e().lib.WordArray.random(8),c=e().lib.WordArray.random(16),d=e().AES.encrypt(b.toString(),a,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7}),h=e().enc.Utf8.parse("flujo_fixed_salt_v1"),i={[p]:d.toString(),[q]:c.toString(),[r]:h.toString(),[s]:1,[t]:"default"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,i),!0}catch(a){return n.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function x(a){n.debug("initializeEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"default"===b[t])return await A(a);let c=e().lib.WordArray.random(16),d=e().PBKDF2(a,c,{keySize:8,iterations:1e5}),h=e().lib.WordArray.random(8),i=e().lib.WordArray.random(16),j=e().AES.encrypt(h.toString(),d,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[p]:j.toString(),[q]:i.toString(),[r]:c.toString(),[s]:1,[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("initializeEncryption: Failed to initialize encryption:",a),!1}}async function y(){n.debug("getDefaultDEK: Entering method");try{let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!a){if(!await w())return n.error("getDefaultDEK: Failed to initialize default encryption"),null;return await y()}if("default"!==a[t])return n.error("getDefaultDEK: Not using default encryption"),null;let b=a[p],c=e().enc.Hex.parse(a[q]),d=v(),h=e().AES.decrypt(b,d,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!h.toString())return n.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return e().enc.Hex.parse(h.toString())}catch(a){return n.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function z(a){n.debug("getUserDEK: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b)return n.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[t])return n.error("getUserDEK: Not using user encryption"),null;let c=b[p],d=e().enc.Hex.parse(b[q]),h=e().enc.Hex.parse(b[r]),i=e().PBKDF2(a,h,{keySize:8,iterations:1e5}),j=e().AES.decrypt(c,i,{iv:d,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!j.toString())return n.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return e().enc.Hex.parse(j.toString())}catch(a){return n.error("getUserDEK: Failed to get user DEK:",a),null}}async function A(a){n.debug("migrateToUserEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"user"===b[t])return!0;let c=await y();if(!c)return n.error("migrateToUserEncryption: Failed to get default DEK for migration"),!1;let d=e().lib.WordArray.random(16),h=e().PBKDF2(a,d,{keySize:8,iterations:1e5}),i=e().lib.WordArray.random(16),j=e().AES.encrypt(c.toString(e().enc.Utf8),h,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[p]:j.toString(),[q]:i.toString(),[r]:d.toString(),[s]:b?b[s]:1,[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("migrateToUserEncryption: Failed to migrate to user encryption:",a),!1}}async function B(a,b){n.debug("changeEncryptionPassword: Entering method");try{let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c)return n.error("changeEncryptionPassword: No encryption metadata found"),!1;if("default"===c[t])return await A(b);let d=c[p],h=e().enc.Hex.parse(c[q]),i=e().enc.Hex.parse(c[r]),j=e().PBKDF2(a,i,{keySize:8,iterations:1e5}),k=e().AES.decrypt(d,j,{iv:h,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!k.toString())return n.error("changeEncryptionPassword: Failed to decrypt DEK with old password"),!1;let l=e().lib.WordArray.random(16),m=e().PBKDF2(b,l,{keySize:8,iterations:1e5}),o=e().lib.WordArray.random(16),u=e().AES.encrypt(k.toString(e().enc.Utf8),m,{iv:o,mode:e().mode.CBC,padding:e().pad.Pkcs7}),v={[p]:u.toString(),[q]:o.toString(),[r]:l.toString(),[s]:c[s],[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,v),!0}catch(a){return n.error("changeEncryptionPassword: Failed to change encryption password:",a),!1}}async function C(a,b=!1){n.debug("getDEK: Entering method");try{if(b&&a){n.debug("getDEK: Using session token");let b=function(a){let b=k.get(a);if(!b)return j.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(j.warn(`Session expired: ${a}`),k.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return e().enc.Hex.parse(b);n.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c){if(n.info("getDEK: No encryption metadata found, initializing default encryption"),!await w())return n.error("getDEK: Failed to initialize default encryption"),null;return await C(a,b)}if("user"!==c[t])return await y();{let c=global.__flujo_server_dek??null;if(c)return n.debug("getDEK: Using server unlock state for user encryption"),e().enc.Hex.parse(c);if(a&&!b){let b=await z(a);if(b)return b;n.warn("getDEK: Provided password did not yield a valid user DEK")}throw n.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new o}}catch(a){if(a instanceof o)throw a;n.error("getDEK: Failed to get DEK:",a);try{if(n.warn("getDEK: Attempting to initialize default encryption as error recovery"),await w())return await y()}catch(a){n.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function D(a,b,c=!1){n.debug("encryptWithPassword: Entering method");try{let d=await C(b,c);if(!d)return null;let f=e().lib.WordArray.random(16),g=e().AES.encrypt(a,d,{iv:f,mode:e().mode.CBC,padding:e().pad.Pkcs7});return f.toString()+":"+g.toString()}catch(a){if(a instanceof o)throw a;return n.error("encryptWithPassword: Failed to encrypt data:",a),null}}async function E(a,b,c=!1){n.debug("decryptWithPassword: Entering method");try{let d=await C(b,c);if(!d)return null;let f=a.split(":");if(2!==f.length)return n.error("decryptWithPassword: Invalid ciphertext format"),null;let g=e().enc.Hex.parse(f[0]),h=f[1];return e().AES.decrypt(h,d,{iv:g,mode:e().mode.CBC,padding:e().pad.Pkcs7}).toString(e().enc.Utf8)}catch(a){if(a instanceof o)throw a;return n.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function F(a){n.debug("verifyPassword: Entering method");let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b||"user"!==b[t])return{valid:!1};{let b=await z(a);if(null!==b){var c;return c=b.toString(),global.__flujo_server_dek=c,j.info("Server encryption unlocked"),{valid:!0,token:function(a){let b=(0,i.A)(),c=Date.now();return k.set(b,{token:b,dek:a,createdAt:c,lastUsed:c}),j.info(`Created encryption session: ${b}`),!m&&(m=setInterval(l,36e5)).unref&&m.unref(),b}(b.toString())}}return{valid:!1}}}async function G(a){n.debug("authenticate: Entering method");let b=await F(a);return b.valid&&b.token||null}async function H(a){n.debug("logout: Entering method");try{return k.has(a)&&(k.delete(a),j.info(`Invalidated encryption session: ${a}`)),!0}catch(a){return n.error("logout: Failed to invalidate session:",a),!1}}async function I(){return n.debug("isEncryptionInitialized: Entering method"),null!==await (0,f.YM)(g.Z.ENCRYPTION_KEY,null)}async function J(){n.debug("isUserEncryptionEnabled: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return null!=a&&"user"===a[t]}async function K(){return await J()&&!global.__flujo_server_dek}async function L(){n.debug("getEncryptionType: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return a?a[t]||"default":null}},92372:(a,b,c)=>{c.d(b,{EI:()=>B,N2:()=>u,Pv:()=>o,VH:()=>s,Vt:()=>A,YM:()=>t,bB:()=>C,ln:()=>w,pL:()=>D,w5:()=>E});var d=c(29021),e=c(33873),f=c.n(e),g=c(46480),h=c(50846),i=c(43326);let j=(0,h.h)("utils/storage/backend"),k=f().join((0,i.ok)(),"db"),l=f().join((0,i.ok)(),".next","storage"),m=a=>f().join(k,`${a}.json`);async function n(){try{await d.promises.access(k),j.verbose(`Storage directory exists: ${k}`)}catch{j.debug(`Creating storage directory: ${k}`),await d.promises.mkdir(k,{recursive:!0})}try{await d.promises.access(l),j.warn(`Old storage directory found: ${l}. This may cause data inconsistency issues.`)}catch{}}async function o(){for(let a of(j.debug("Verifying storage system initialization"),await n(),Object.values(g.Z)))try{let b=m(a),c=!1;try{await d.promises.access(b),c=!0}catch{}j.debug(`Storage check: ${a} - ${c?"File exists":"File does not exist yet"}`);let e=f().join(l,`${a}.json`);try{await d.promises.access(e),c?j.warn(`Found ${a} in both old and new storage locations. This may cause data inconsistency.`):j.warn(`Found ${a} in old storage location but not in new location. This may cause data loss.`)}catch{}}catch(b){j.error(`Storage verification failed for ${a}:`,b)}j.debug("Storage verification completed")}let p=new Map,q=0;async function r(a,b){let c=f().dirname(a);await d.promises.mkdir(c,{recursive:!0});let e=`${a}.tmp.${process.pid}.${++q}`;try{await d.promises.writeFile(e,b),await d.promises.rename(e,a)}catch(a){try{await d.promises.unlink(e)}catch{}throw a}}async function s(a,b){let c=m(a),d=(p.get(a)??Promise.resolve()).catch(()=>{}).then(()=>r(c,JSON.stringify(b,null,2)));p.set(a,d);try{await d,j.verbose(`Successfully saved item to: ${c}`)}catch(b){throw j.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{p.get(a)===d&&p.delete(a)}}async function t(a,b){try{await n();let c=m(a),e=await d.promises.readFile(c,"utf-8");if(0===e.trim().length)return j.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(e);return j.verbose(`Successfully loaded item from: ${c}`),a}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,e),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return j.verbose(`Item with key "${a}" not found at ${m(a)}, returning default.`),b;throw j.error(`CRITICAL: Error loading item with key "${a}" from ${m(a)}:`,c),c}}async function u(a){let b=m(a);try{await d.promises.unlink(b),j.verbose(`Successfully cleared item: ${b}`)}catch(c){"ENOENT"!==c.code?j.warn(`Error clearing item with key "${a}" at ${b}:`,c):j.verbose(`Item with key "${a}" not found at ${b}, nothing to clear.`)}}let v=/^[A-Za-z0-9_-]{1,64}$/;function w(a){if("string"!=typeof a||!v.test(a))throw Error(`Unsafe collection item id: ${JSON.stringify(a)}`)}let x=a=>f().join(k,a),y=(a,b)=>f().join(x(a),`${b}.json`);function z(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(b);return p.set(a,c),c.catch(()=>{}).finally(()=>{p.get(a)===c&&p.delete(a)}),c}async function A(a,b,c){w(b);let d=y(a,b);try{await z(`${a}/${b}`,()=>r(d,JSON.stringify(c,null,2))),j.verbose(`Successfully saved collection item: ${d}`)}catch(c){throw j.error(`Error saving collection item "${a}/${b}" to ${d}:`,c),c}}async function B(a,b,c){w(b);let e=y(a,b);try{let f=await d.promises.readFile(e,"utf-8");if(0===f.trim().length)return j.warn(`Collection item "${a}/${b}" at ${e} is empty; treating as missing.`),c;try{return JSON.parse(f)}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${e}:`,b);let a=`${e}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,f),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${e}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(d){if("ENOENT"===d.code)return j.verbose(`Collection item "${a}/${b}" not found at ${e}, returning default.`),c;throw j.error(`CRITICAL: Error loading collection item "${a}/${b}" from ${e}:`,d),d}}async function C(a,b){w(b);let c=y(a,b);await z(`${a}/${b}`,async()=>{try{await d.promises.unlink(c),j.verbose(`Successfully deleted collection item: ${c}`)}catch(d){if("ENOENT"!==d.code)throw d;j.verbose(`Collection item "${a}/${b}" not found at ${c}, nothing to delete.`)}})}async function D(a){let b,c=x(a);try{b=await d.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return[];throw a}let e=[];for(let a of b){if(!a.endsWith(".json")||a.includes(".tmp.")||a.includes(".corrupted.")||a.endsWith(".bak"))continue;let b=f().join(c,a);try{let a=await d.promises.readFile(b,"utf-8");if(0===a.trim().length){j.warn(`Collection item file ${b} is empty; skipping.`);continue}e.push(JSON.parse(a))}catch(a){j.error(`Failed to read collection item ${b}; skipping.`,a)}}return e}async function E(a,b,c){let e,f,g=m(a);try{e=await d.promises.readFile(g,"utf-8")}catch(a){if("ENOENT"===a.code)return 0;throw a}if(0===e.trim().length)return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),0;try{f=JSON.parse(e)}catch(b){return j.error(`Migration: legacy ${a}.json is not valid JSON; leaving it in place.`,b),0}if(!Array.isArray(f))return j.error(`Migration: legacy ${a}.json is not an array; leaving it in place.`),0;for(let a of(await d.promises.mkdir(x(b),{recursive:!0}),f)){let e;try{e=c(a),w(e)}catch(a){j.error(`Migration: skipping ${b} item with invalid/unsafe id`,a);continue}let f=y(b,e);try{await d.promises.access(f),j.debug(`Migration: ${b}/${e} already exists; keeping the existing file.`);continue}catch{}await r(f,JSON.stringify(a,null,2))}return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),j.info(`Migration: moved ${f.length} ${b} item(s) from ${a}.json to per-item storage.`),f.length}}};
@@ -1 +1 @@
1
- "use strict";exports.id=9188,exports.ids=[9188],exports.modules={8070:(a,b,c)=>{c.d(b,{IK:()=>G,M6:()=>z,Uw:()=>F,lA:()=>I,v2:()=>H,vm:()=>E});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839),j=c(54573),k=c(81637),l=c(79515),m=c(44079),n=c(99561),o=c(48823),p=c(98540),q=c(83144),r=c(88970),s=c(17332),t=c(63908);let u=(0,h.Ay)(j.A,{shouldForwardProp:a=>!["nodeType","selected"].includes(a)})(({theme:a,nodeType:b,selected:c})=>({padding:a.spacing(1.5),width:"200px",borderRadius:"8px",backgroundColor:a.palette.background.paper,border:`2px solid ${"start"===b?"#795548":"process"===b?a.palette.secondary.main:"finish"===b?a.palette.success.main:"mcp"===b?a.palette.info.main:a.palette.warning.main}`,boxShadow:c?`0 0 0 2px ${a.palette.primary.main}, 0 3px 10px rgba(0,0,0,0.2)`:a.shadows[2],transition:"all 0.2s ease","&:hover":{boxShadow:`0 0 0 1px ${"start"===b?"#795548":"process"===b?a.palette.secondary.main:"finish"===b?a.palette.success.main:"mcp"===b?a.palette.info.main:a.palette.warning.main}, 0 3px 10px rgba(0,0,0,0.1)`}})),v=(0,h.Ay)(k.default,{shouldForwardProp:a=>"nodeType"!==a})(({theme:a,nodeType:b})=>({display:"flex",alignItems:"center",justifyContent:"space-between",borderBottom:`1px solid ${"start"===b?"#A1887F":"process"===b?a.palette.secondary.light:"finish"===b?a.palette.success.light:"mcp"===b?a.palette.info.light:a.palette.warning.light}`,marginBottom:a.spacing(1),paddingBottom:a.spacing(.5)})),w=(0,h.Ay)(k.default)({display:"flex",alignItems:"center",gap:"8px"}),x=(0,h.Ay)(k.default)(({theme:a})=>({marginTop:a.spacing(1),fontSize:"0.8rem"})),y=(0,h.Ay)(k.default)(({theme:a})=>({display:"flex",justifyContent:"space-between",padding:a.spacing(.5,0),borderBottom:`1px dashed ${"dark"===a.palette.mode?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.1)"}`})),z=(a,b)=>{switch(a){case"start":default:return"#795548";case"process":return b.palette.secondary.main;case"finish":return b.palette.success.main;case"mcp":return b.palette.info.main;case"subflow":return b.palette.warning.main}},A=a=>({backgroundColor:a.palette.info.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),B=a=>({backgroundColor:a.palette.secondary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),C=a=>({backgroundColor:a.palette.primary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),D=({data:a,nodeType:b,selected:c})=>{let h=(0,i.A)(),[j,k]=(0,e.useState)(!1),z=a||{label:"No Label",properties:{}},D="string"==typeof z.label?z.label:"No Label",E=z.properties||{},F=Object.keys(E).length;return(0,d.jsx)(d.Fragment,{children:(0,d.jsxs)(u,{elevation:2,nodeType:b,selected:c,children:[(()=>{if("mcp"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"mcp-top",type:"target",position:g.yX.Top,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-right",type:"target",position:g.yX.Right,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-bottom",type:"source",position:g.yX.Bottom,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-left",type:"target",position:g.yX.Left,style:A(h)})]});if("process"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"process-top",type:"target",position:g.yX.Top,style:B(h)}),(0,d.jsx)(f.h7,{id:"process-bottom",type:"source",position:g.yX.Bottom,style:B(h)}),(0,d.jsx)(f.h7,{id:"process-left-mcp",type:"source",position:g.yX.Left,style:C(h)}),(0,d.jsx)(f.h7,{id:"process-right-mcp",type:"source",position:g.yX.Right,style:C(h)})]});if("start"===b)return(0,d.jsx)(f.h7,{id:"start-bottom",type:"source",position:g.yX.Bottom,style:B(h)});if("finish"===b)return(0,d.jsx)(f.h7,{id:"finish-top",type:"target",position:g.yX.Top,style:B(h)});if("subflow"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"subflow-top",type:"target",position:g.yX.Top,style:B(h)}),(0,d.jsx)(f.h7,{id:"subflow-bottom",type:"source",position:g.yX.Bottom,style:B(h)})]});return null})(),(0,d.jsxs)(v,{nodeType:b,children:[(0,d.jsxs)(w,{children:[(a=>{switch(a){case"start":default:return(0,d.jsx)(o.A,{sx:{color:"#795548"}});case"process":return(0,d.jsx)(p.A,{color:"secondary"});case"finish":return(0,d.jsx)(q.A,{color:"success"});case"mcp":return(0,d.jsx)(p.A,{color:"info"});case"subflow":return(0,d.jsx)(r.A,{sx:{color:"warning.main"}})}})(b),(0,d.jsx)(l.default,{variant:"subtitle2",fontWeight:"bold",children:D})]}),F>0&&(0,d.jsx)(m.A,{size:"small",onClick:a=>{a.stopPropagation(),k(!j)},sx:{padding:.5},children:j?(0,d.jsx)(t.A,{fontSize:"small"}):(0,d.jsx)(s.A,{fontSize:"small"})})]}),(0,d.jsx)(n.A,{in:j,children:(0,d.jsx)(x,{children:Object.entries(E).map(([a,b])=>(0,d.jsxs)(y,{children:[(0,d.jsxs)(l.default,{variant:"caption",sx:{fontWeight:"bold"},children:[a,":"]}),(0,d.jsxs)(l.default,{variant:"caption",children:[String(b).substring(0,30),String(b).length>30?"...":""]})]},a))})}),F>0&&!j&&(0,d.jsx)(l.default,{variant:"caption",color:"text.secondary",children:`${F} properties configured`})]})})},E=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"start",selected:a.selected})}),F=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"process",selected:a.selected})}),G=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"finish",selected:a.selected})}),H=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"mcp",selected:a.selected})}),I=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"subflow",selected:a.selected})})},63281:(a,b,c)=>{c.d(b,{g:()=>g});var d=c(2117);let e=(0,c(19815).h)("frontend/services/flow/index");class f{async loadFlows(){e.debug("loadFlows: Entering method");try{if(this.flowsCache)return e.debug("loadFlows: Using cached flows",{count:this.flowsCache.length}),this.flowsCache;let a=await fetch("/api/flow");if(!a.ok){let b=await a.json();throw Error(b.error||"Failed to load flows")}let b=await a.json();return e.debug("loadFlows: Loaded flows from API",{count:b.length}),this.flowsCache=b,b}catch(a){return e.warn("loadFlows: Failed to load flows:",a),[]}}async getFlow(a){e.debug("getFlow: Entering method",{flowId:a});try{if(this.flowsCache){let b=this.flowsCache.find(b=>b.id===a);if(b)return e.debug("getFlow: Using cached flow",{flowId:a}),b}let b=await fetch(`/api/flow/${encodeURIComponent(a)}`);if(!b.ok){if(404===b.status)return e.debug(`getFlow: Flow ${a} not found`),null;let c=await b.json();throw Error(c.error||`Failed to get flow: ${a}`)}let c=await b.json();return e.debug("getFlow: Retrieved flow from API",{flowId:a}),c}catch(b){return e.warn(`getFlow: Failed to get flow ${a}:`,b),null}}async addFlow(a){e.debug("addFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch("/api/flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to add flow"}}let c=await b.json();return this.flowsCache&&this.flowsCache.push(c),e.debug("addFlow: Flow added successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("addFlow: Failed to add flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to add flow"}}}async updateFlow(a){e.debug("updateFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch(`/api/flow/${encodeURIComponent(a.id)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to update flow"}}let c=await b.json();if(this.flowsCache){let b=this.flowsCache.findIndex(b=>b.id===a.id);b>=0?this.flowsCache[b]=c:this.flowsCache.push(c)}return e.debug("updateFlow: Flow updated successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("updateFlow: Failed to update flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to update flow"}}}async deleteFlow(a){e.debug("deleteFlow: Entering method",{flowId:a});try{let b=await fetch(`/api/flow/${encodeURIComponent(a)}`,{method:"DELETE"});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to delete flow"}}return this.flowsCache&&(this.flowsCache=this.flowsCache.filter(b=>b.id!==a)),e.debug("deleteFlow: Flow deleted successfully",{flowId:a}),{success:!0}}catch(a){return e.warn("deleteFlow: Failed to delete flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to delete flow"}}}createNode(a,b){return e.debug("createNode: Entering method",{type:a,position:b}),{id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}}}createStartNode(){return{id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}}}createNewFlow(a="NewFlow"){return e.debug("createNewFlow: Entering method",{name:a}),{id:(0,d.A)(),name:a,nodes:[this.createStartNode()],edges:[]}}createHistoryEntry(a,b){return e.debug("createHistoryEntry: Entering method"),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){return e.debug("generateSampleFlow: Entering method",{name:a}),{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"}]}}constructor(){this.flowsCache=null}}let g=new f},80076:(a,b,c)=>{c.d(b,{R:()=>k,A:()=>o});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839);function j(a){return a===g.yX.Left||a===g.yX.Right?"h":"v"}let k="flowEdgeWaypoint",l={x:16,y:-16},m=(0,h.Ay)("button")(({theme:a})=>({background:a.palette.background.paper,border:`1px solid ${a.palette.divider}`,cursor:"pointer",borderRadius:"50%",fontSize:"10px",width:"20px",height:"20px",display:"flex",justifyContent:"center",alignItems:"center",color:a.palette.text.secondary,boxShadow:"dark"===a.palette.mode?"0 2px 4px rgba(0,0,0,0.3)":"0 2px 4px rgba(0,0,0,0.1)","&:hover":{background:a.palette.error.main,borderColor:a.palette.error.main,color:a.palette.error.contrastText}})),n=(0,h.Ay)(f.tE)({"&&.animated":{strokeDasharray:5,animation:"flowPathAnimation 0.5s infinite linear"},"&&.animated-both":{strokeDasharray:5,animation:"flowPathAnimation 0.75s infinite linear alternate"},"@keyframes flowPathAnimation":{"0%":{strokeDashoffset:10},"100%":{strokeDashoffset:0}}}),o=({variant:a,id:b,sourceX:c,sourceY:h,targetX:o,targetY:p,sourcePosition:q,targetPosition:r,style:s={},markerEnd:t,markerStart:u,data:v,selected:w})=>{let x,y,z=(0,i.A)(),{deleteElements:A,screenToFlowPosition:B}=(0,f.VH)(),[C,D]=(0,e.useState)(!1),[E,F]=(0,e.useState)(null),G=(0,e.useRef)(null),H=(0,e.useRef)(!1),I=v?.waypoints??(v?.waypoint?[v.waypoint]:[]),J=E??I,K="standard"===a&&!!v?.bidirectional,L=q||("mcp"===a?g.yX.Left:g.yX.Bottom),M=r||("mcp"===a?g.yX.Right:g.yX.Top),N=null;if(J.length>0)x=(N=function(a,b,c,d,e,f=8){let g=[a,...e,c],h=[a],i=[],j=b,k=(a,b)=>{let c;c=h[h.length-1],.01>Math.abs(c.x-a.x)&&.01>Math.abs(c.y-a.y)||(h.push(a),i.push(b))};for(let a=1;a<g.length;a++){let b=h[h.length-1],c=g[a],e=a-1;if(a===g.length-1){if("v"===d)if("h"===j)k({x:c.x,y:b.y},e);else{let a=(b.y+c.y)/2;k({x:b.x,y:a},e),k({x:c.x,y:a},e)}else if("v"===j)k({x:b.x,y:c.y},e);else{let a=(b.x+c.x)/2;k({x:a,y:b.y},e),k({x:a,y:c.y},e)}k(c,e)}else k("v"===j?{x:b.x,y:c.y}:{x:c.x,y:b.y},e),k(c,e),j="v"===j?"h":"v"}!function(a,b){for(let c=1;c<a.length-1;c++){let d=a[c-1],e=a[c],f=a[c+1],g=.01>Math.abs(d.x-e.x)&&.01>Math.abs(f.x-e.x)&&(e.y-d.y)*(f.y-e.y)<0,h=.01>Math.abs(d.y-e.y)&&.01>Math.abs(f.y-e.y)&&(e.x-d.x)*(f.x-e.x)<0;if(g||h){if(g){let g=(a[c-2]?.x??e.x-1)<=e.x,h=g?e.x-12:e.x+12,i=g?e.x+12:e.x-12,j=b[c-1];a.splice(c-1,3,{x:h,y:d.y},{x:h,y:e.y},{x:i,y:e.y},{x:i,y:f.y}),b.splice(c-1,2,j,j,j)}else{let g=(a[c-2]?.y??e.y-1)<=e.y,h=g?e.y-12:e.y+12,i=g?e.y+12:e.y-12,j=b[c-1];a.splice(c-1,3,{x:d.x,y:h},{x:e.x,y:h},{x:e.x,y:i},{x:f.x,y:i}),b.splice(c-1,2,j,j,j)}c++}}}(h,i);let l=[];for(let a=0;a<h.length-1;a++)l.push({a:h[a],b:h[a+1],gap:i[a]});return{d:function(a,b){if(0===a.length)return"";let c=`M ${a[0].x},${a[0].y}`;for(let d=1;d<a.length-1;d++){let e=a[d-1],f=a[d],g=a[d+1],h=Math.hypot(f.x-e.x,f.y-e.y),i=Math.hypot(g.x-f.x,g.y-f.y),j=Math.min(b,h/2,i/2);if(j<.5){c+=` L ${f.x},${f.y}`;continue}let k={x:f.x-(f.x-e.x)/h*j,y:f.y-(f.y-e.y)/h*j},l={x:f.x+(g.x-f.x)/i*j,y:f.y+(g.y-f.y)/i*j};c+=` L ${k.x},${k.y} Q ${f.x},${f.y} ${l.x},${l.y}`}let d=a[a.length-1];return c+` L ${d.x},${d.y}`}(h,f),points:h,segments:l,midpoint:function(a,b){let c=0;for(let b=0;b<a.length-1;b++)c+=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(0===c)return a[0];let d=.5*c;for(let b=0;b<a.length-1;b++){let c=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(d<=c){let e=0===c?0:d/c;return{x:a[b].x+(a[b+1].x-a[b].x)*e,y:a[b].y+(a[b+1].y-a[b].y)*e}}d-=c}return a[a.length-1]}(h,.5)}}({x:c,y:h},j(L),{x:o,y:p},j(M),J,16)).d,y=N.midpoint;else{let[a,b,d]=(0,g.oN)({sourceX:c,sourceY:h,sourcePosition:L,targetX:o,targetY:p,targetPosition:M,borderRadius:16});x=a,y={x:b,y:d}}let O={...s,strokeWidth:w?3:2,stroke:"mcp"===a?w?z.palette.info.light:z.palette.info.main:w?z.palette.primary.main:z.palette.text.secondary},P="mcp"===a?"":K?"animated-both":v?.animated!==!1?"animated":"",Q=a=>{document.dispatchEvent(new CustomEvent(k,{detail:{edgeId:b,waypoints:a&&a.length>0?a:null}}))},R=a=>{if(0!==a.button)return;let b=B({x:a.clientX,y:a.clientY}),c=N?function(a,b){let c=0,d=1/0;for(let e of b){let b=function(a,b,c){let d=c.x-b.x,e=c.y-b.y,f=d*d+e*e,g=0===f?0:Math.max(0,Math.min(1,((a.x-b.x)*d+(a.y-b.y)*e)/f));return Math.hypot(a.x-(b.x+d*g),a.y-(b.y+e*g))}(a,e.a,e.b);b<d&&(d=b,c=e.gap)}return c}(b,N.segments):0,d=[...J];d.splice(c,0,b),G.current={index:c,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:d,active:!1,fromPath:!0},a.target.setPointerCapture(a.pointerId)},S=a=>{let b=G.current;if(!b||a.pointerId!==b.pointerId)return;if(!b.active){if(4>Math.hypot(a.clientX-b.startClient.x,a.clientY-b.startClient.y))return;b.active=!0}let c=[...b.base];c[b.index]=B({x:a.clientX,y:a.clientY}),F(c)},T=a=>{let b=G.current;if(!b||a.pointerId!==b.pointerId||(G.current=null,a.target.releasePointerCapture(a.pointerId),H.current=b.active,!b.active))return;let c=[...b.base];c[b.index]=B({x:a.clientX,y:a.clientY}),Q(c),F(null)},U=null!==E,V=w||C||U;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n,{path:x,markerEnd:t,markerStart:u,style:O,id:b,className:P}),(0,d.jsx)("path",{d:x,fill:"none",stroke:"transparent",strokeWidth:20,style:{cursor:U?"grabbing":"grab"},onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),onPointerDown:R,onPointerMove:S,onPointerUp:T}),(0,d.jsxs)(f.rV,{children:[V&&J.map((a,b)=>(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${a.x}px,${a.y}px)`,width:12,height:12,borderRadius:"50%",background:z.palette.primary.main,border:`2px solid ${z.palette.background.paper}`,boxShadow:z.shadows[1],cursor:"move",pointerEvents:"all",touchAction:"none",zIndex:1001},className:"nodrag nopan",title:"Drag to move; double-click to remove this bend",onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),onPointerDown:a=>{0===a.button&&(a.stopPropagation(),G.current={index:b,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:[...J],active:!1,fromPath:!1},a.target.setPointerCapture(a.pointerId))},onPointerMove:S,onPointerUp:T,onDoubleClick:a=>{a.stopPropagation(),(a=>{let b=J.filter((b,c)=>c!==a);F(null),Q(b)})(b)}},b)),(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${y.x+l.x}px,${y.y+l.y}px)`,pointerEvents:V&&!U?"all":"none",opacity:V&&!U?1:0,transition:"opacity 120ms ease",zIndex:1e3},className:"nodrag nopan",onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),children:(0,d.jsx)(m,{title:"Delete connection (drag to re-route)",style:{touchAction:"none"},onPointerDown:R,onPointerMove:S,onPointerUp:T,onClick:a=>{if(a.stopPropagation(),H.current){H.current=!1;return}A({edges:[{id:b}]})},children:"\xd7"})})]})]})}},90837:(a,b,c)=>{c.d(b,{jY:()=>f,oY:()=>g});var d=c(21124);c(38301);var e=c(80076);let f=a=>(0,d.jsx)(e.A,{...a,variant:"standard"}),g=a=>(0,d.jsx)(e.A,{...a,variant:"mcp"})}};
1
+ "use strict";exports.id=9188,exports.ids=[9188],exports.modules={8070:(a,b,c)=>{c.d(b,{IK:()=>G,M6:()=>z,Uw:()=>F,lA:()=>I,v2:()=>H,vm:()=>E});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839),j=c(54573),k=c(81637),l=c(79515),m=c(44079),n=c(99561),o=c(48823),p=c(98540),q=c(83144),r=c(88970),s=c(17332),t=c(63908);let u=(0,h.Ay)(j.A,{shouldForwardProp:a=>!["nodeType","selected"].includes(a)})(({theme:a,nodeType:b,selected:c})=>({padding:a.spacing(1.5),width:"200px",borderRadius:"8px",backgroundColor:a.palette.background.paper,border:`2px solid ${"start"===b?"#795548":"process"===b?a.palette.secondary.main:"finish"===b?a.palette.success.main:"mcp"===b?a.palette.info.main:a.palette.warning.main}`,boxShadow:c?`0 0 0 2px ${a.palette.primary.main}, 0 3px 10px rgba(0,0,0,0.2)`:a.shadows[2],transition:"all 0.2s ease","&:hover":{boxShadow:`0 0 0 1px ${"start"===b?"#795548":"process"===b?a.palette.secondary.main:"finish"===b?a.palette.success.main:"mcp"===b?a.palette.info.main:a.palette.warning.main}, 0 3px 10px rgba(0,0,0,0.1)`}})),v=(0,h.Ay)(k.default,{shouldForwardProp:a=>"nodeType"!==a})(({theme:a,nodeType:b})=>({display:"flex",alignItems:"center",justifyContent:"space-between",borderBottom:`1px solid ${"start"===b?"#A1887F":"process"===b?a.palette.secondary.light:"finish"===b?a.palette.success.light:"mcp"===b?a.palette.info.light:a.palette.warning.light}`,marginBottom:a.spacing(1),paddingBottom:a.spacing(.5)})),w=(0,h.Ay)(k.default)({display:"flex",alignItems:"center",gap:"8px"}),x=(0,h.Ay)(k.default)(({theme:a})=>({marginTop:a.spacing(1),fontSize:"0.8rem"})),y=(0,h.Ay)(k.default)(({theme:a})=>({display:"flex",justifyContent:"space-between",padding:a.spacing(.5,0),borderBottom:`1px dashed ${"dark"===a.palette.mode?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.1)"}`})),z=(a,b)=>{switch(a){case"start":default:return"#795548";case"process":return b.palette.secondary.main;case"finish":return b.palette.success.main;case"mcp":return b.palette.info.main;case"subflow":return b.palette.warning.main}},A=a=>({backgroundColor:a.palette.info.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),B=a=>({backgroundColor:a.palette.secondary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),C=a=>({backgroundColor:a.palette.primary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),D=({data:a,nodeType:b,selected:c})=>{let h=(0,i.A)(),[j,k]=(0,e.useState)(!1),z=a||{label:"No Label",properties:{}},D="string"==typeof z.label?z.label:"No Label",E=z.properties||{},F=Object.keys(E).length;return(0,d.jsx)(d.Fragment,{children:(0,d.jsxs)(u,{elevation:2,nodeType:b,selected:c,children:[(()=>{if("mcp"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"mcp-top",type:"target",position:g.yX.Top,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-right",type:"target",position:g.yX.Right,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-bottom",type:"source",position:g.yX.Bottom,style:A(h)}),(0,d.jsx)(f.h7,{id:"mcp-left",type:"target",position:g.yX.Left,style:A(h)})]});if("process"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"process-top",type:"target",position:g.yX.Top,style:B(h)}),(0,d.jsx)(f.h7,{id:"process-bottom",type:"source",position:g.yX.Bottom,style:B(h)}),(0,d.jsx)(f.h7,{id:"process-left-mcp",type:"source",position:g.yX.Left,style:C(h)}),(0,d.jsx)(f.h7,{id:"process-right-mcp",type:"source",position:g.yX.Right,style:C(h)})]});if("start"===b)return(0,d.jsx)(f.h7,{id:"start-bottom",type:"source",position:g.yX.Bottom,style:B(h)});if("finish"===b)return(0,d.jsx)(f.h7,{id:"finish-top",type:"target",position:g.yX.Top,style:B(h)});if("subflow"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"subflow-top",type:"target",position:g.yX.Top,style:B(h)}),(0,d.jsx)(f.h7,{id:"subflow-bottom",type:"source",position:g.yX.Bottom,style:B(h)})]});return null})(),(0,d.jsxs)(v,{nodeType:b,children:[(0,d.jsxs)(w,{children:[(a=>{switch(a){case"start":default:return(0,d.jsx)(o.A,{sx:{color:"#795548"}});case"process":return(0,d.jsx)(p.A,{color:"secondary"});case"finish":return(0,d.jsx)(q.A,{color:"success"});case"mcp":return(0,d.jsx)(p.A,{color:"info"});case"subflow":return(0,d.jsx)(r.A,{sx:{color:"warning.main"}})}})(b),(0,d.jsx)(l.default,{variant:"subtitle2",fontWeight:"bold",children:D})]}),F>0&&(0,d.jsx)(m.A,{size:"small",onClick:a=>{a.stopPropagation(),k(!j)},sx:{padding:.5},children:j?(0,d.jsx)(t.A,{fontSize:"small"}):(0,d.jsx)(s.A,{fontSize:"small"})})]}),(0,d.jsx)(n.A,{in:j,children:(0,d.jsx)(x,{children:Object.entries(E).map(([a,b])=>(0,d.jsxs)(y,{children:[(0,d.jsxs)(l.default,{variant:"caption",sx:{fontWeight:"bold"},children:[a,":"]}),(0,d.jsxs)(l.default,{variant:"caption",children:[String(b).substring(0,30),String(b).length>30?"...":""]})]},a))})}),F>0&&!j&&(0,d.jsx)(l.default,{variant:"caption",color:"text.secondary",children:`${F} properties configured`})]})})},E=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"start",selected:a.selected})}),F=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"process",selected:a.selected})}),G=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"finish",selected:a.selected})}),H=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"mcp",selected:a.selected})}),I=(0,e.memo)(function(a){return(0,d.jsx)(D,{...a,nodeType:"subflow",selected:a.selected})})},63281:(a,b,c)=>{c.d(b,{g:()=>g});var d=c(2117);let e=(0,c(19815).h)("frontend/services/flow/index");class f{async loadFlows(){e.debug("loadFlows: Entering method");try{if(this.flowsCache)return e.debug("loadFlows: Using cached flows",{count:this.flowsCache.length}),this.flowsCache;let a=await fetch("/api/flow");if(!a.ok){let b=await a.json();throw Error(b.error||"Failed to load flows")}let b=await a.json();return e.debug("loadFlows: Loaded flows from API",{count:b.length}),this.flowsCache=b,b}catch(a){return e.warn("loadFlows: Failed to load flows:",a),[]}}async getFlow(a){e.debug("getFlow: Entering method",{flowId:a});try{if(this.flowsCache){let b=this.flowsCache.find(b=>b.id===a);if(b)return e.debug("getFlow: Using cached flow",{flowId:a}),b}let b=await fetch(`/api/flow/${encodeURIComponent(a)}`);if(!b.ok){if(404===b.status)return e.debug(`getFlow: Flow ${a} not found`),null;let c=await b.json();throw Error(c.error||`Failed to get flow: ${a}`)}let c=await b.json();return e.debug("getFlow: Retrieved flow from API",{flowId:a}),c}catch(b){return e.warn(`getFlow: Failed to get flow ${a}:`,b),null}}async addFlow(a){e.debug("addFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch("/api/flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to add flow"}}let c=await b.json();return this.flowsCache&&this.flowsCache.push(c),e.debug("addFlow: Flow added successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("addFlow: Failed to add flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to add flow"}}}async updateFlow(a){e.debug("updateFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch(`/api/flow/${encodeURIComponent(a.id)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to update flow"}}let c=await b.json();if(this.flowsCache){let b=this.flowsCache.findIndex(b=>b.id===a.id);b>=0?this.flowsCache[b]=c:this.flowsCache.push(c)}return e.debug("updateFlow: Flow updated successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("updateFlow: Failed to update flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to update flow"}}}async deleteFlow(a){e.debug("deleteFlow: Entering method",{flowId:a});try{let b=await fetch(`/api/flow/${encodeURIComponent(a)}`,{method:"DELETE"});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to delete flow"}}return this.flowsCache&&(this.flowsCache=this.flowsCache.filter(b=>b.id!==a)),e.debug("deleteFlow: Flow deleted successfully",{flowId:a}),{success:!0}}catch(a){return e.warn("deleteFlow: Failed to delete flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to delete flow"}}}createNode(a,b){return e.debug("createNode: Entering method",{type:a,position:b}),{id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}}}createStartNode(){return{id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}}}createNewFlow(a="NewFlow"){return e.debug("createNewFlow: Entering method",{name:a}),{id:(0,d.A)(),name:a,nodes:[this.createStartNode()],edges:[]}}createHistoryEntry(a,b){return e.debug("createHistoryEntry: Entering method"),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){return e.debug("generateSampleFlow: Entering method",{name:a}),{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"}]}}constructor(){this.flowsCache=null}}let g=new f},90837:(a,b,c)=>{c.d(b,{jY:()=>f,oY:()=>g});var d=c(21124);c(38301);var e=c(97004);let f=a=>(0,d.jsx)(e.A,{...a,variant:"standard"}),g=a=>(0,d.jsx)(e.A,{...a,variant:"mcp"})},97004:(a,b,c)=>{c.d(b,{R:()=>k,A:()=>o});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839);function j(a){return a===g.yX.Left||a===g.yX.Right?"h":"v"}let k="flowEdgeWaypoint",l={x:16,y:-16},m=(0,h.Ay)("button")(({theme:a})=>({background:a.palette.background.paper,border:`1px solid ${a.palette.divider}`,cursor:"pointer",borderRadius:"50%",fontSize:"10px",width:"20px",height:"20px",display:"flex",justifyContent:"center",alignItems:"center",color:a.palette.text.secondary,boxShadow:"dark"===a.palette.mode?"0 2px 4px rgba(0,0,0,0.3)":"0 2px 4px rgba(0,0,0,0.1)","&:hover":{background:a.palette.error.main,borderColor:a.palette.error.main,color:a.palette.error.contrastText}})),n=(0,h.Ay)(f.tE)({"&&.animated":{strokeDasharray:5,animation:"flowPathAnimation 500ms infinite linear"},"&&.animated-both":{strokeDasharray:5,animation:"flowPathAnimation 750ms infinite linear alternate"},"@keyframes flowPathAnimation":{"0%":{strokeDashoffset:10},"100%":{strokeDashoffset:0}}}),o=({variant:a,id:b,sourceX:c,sourceY:h,targetX:o,targetY:p,sourcePosition:q,targetPosition:r,style:s={},markerEnd:t,markerStart:u,data:v,selected:w})=>{let x,y,z=(0,i.A)(),{deleteElements:A,screenToFlowPosition:B}=(0,f.VH)(),[C,D]=(0,e.useState)(!1),[E,F]=(0,e.useState)(null),G=(0,e.useRef)(null),H=(0,e.useRef)(!1),I=v?.waypoints??(v?.waypoint?[v.waypoint]:[]),J=E??I,K="standard"===a&&!!v?.bidirectional,L=q||("mcp"===a?g.yX.Left:g.yX.Bottom),M=r||("mcp"===a?g.yX.Right:g.yX.Top),N=null;if(J.length>0)x=(N=function(a,b,c,d,e,f=8){let g=[a,...e,c],h=[a],i=[],j=b,k=(a,b)=>{let c;c=h[h.length-1],.01>Math.abs(c.x-a.x)&&.01>Math.abs(c.y-a.y)||(h.push(a),i.push(b))};for(let a=1;a<g.length;a++){let b=h[h.length-1],c=g[a],e=a-1;if(a===g.length-1){if("v"===d)if("h"===j)k({x:c.x,y:b.y},e);else{let a=(b.y+c.y)/2;k({x:b.x,y:a},e),k({x:c.x,y:a},e)}else if("v"===j)k({x:b.x,y:c.y},e);else{let a=(b.x+c.x)/2;k({x:a,y:b.y},e),k({x:a,y:c.y},e)}k(c,e)}else k("v"===j?{x:b.x,y:c.y}:{x:c.x,y:b.y},e),k(c,e),j="v"===j?"h":"v"}!function(a,b){for(let c=1;c<a.length-1;c++){let d=a[c-1],e=a[c],f=a[c+1],g=.01>Math.abs(d.x-e.x)&&.01>Math.abs(f.x-e.x)&&(e.y-d.y)*(f.y-e.y)<0,h=.01>Math.abs(d.y-e.y)&&.01>Math.abs(f.y-e.y)&&(e.x-d.x)*(f.x-e.x)<0;if(g||h){if(g){let g=(a[c-2]?.x??e.x-1)<=e.x,h=g?e.x-12:e.x+12,i=g?e.x+12:e.x-12,j=b[c-1];a.splice(c-1,3,{x:h,y:d.y},{x:h,y:e.y},{x:i,y:e.y},{x:i,y:f.y}),b.splice(c-1,2,j,j,j)}else{let g=(a[c-2]?.y??e.y-1)<=e.y,h=g?e.y-12:e.y+12,i=g?e.y+12:e.y-12,j=b[c-1];a.splice(c-1,3,{x:d.x,y:h},{x:e.x,y:h},{x:e.x,y:i},{x:f.x,y:i}),b.splice(c-1,2,j,j,j)}c++}}}(h,i);let l=[];for(let a=0;a<h.length-1;a++)l.push({a:h[a],b:h[a+1],gap:i[a]});return{d:function(a,b){if(0===a.length)return"";let c=`M ${a[0].x},${a[0].y}`;for(let d=1;d<a.length-1;d++){let e=a[d-1],f=a[d],g=a[d+1],h=Math.hypot(f.x-e.x,f.y-e.y),i=Math.hypot(g.x-f.x,g.y-f.y),j=Math.min(b,h/2,i/2);if(j<.5){c+=` L ${f.x},${f.y}`;continue}let k={x:f.x-(f.x-e.x)/h*j,y:f.y-(f.y-e.y)/h*j},l={x:f.x+(g.x-f.x)/i*j,y:f.y+(g.y-f.y)/i*j};c+=` L ${k.x},${k.y} Q ${f.x},${f.y} ${l.x},${l.y}`}let d=a[a.length-1];return c+` L ${d.x},${d.y}`}(h,f),points:h,segments:l,midpoint:function(a,b){let c=0;for(let b=0;b<a.length-1;b++)c+=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(0===c)return a[0];let d=.5*c;for(let b=0;b<a.length-1;b++){let c=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(d<=c){let e=0===c?0:d/c;return{x:a[b].x+(a[b+1].x-a[b].x)*e,y:a[b].y+(a[b+1].y-a[b].y)*e}}d-=c}return a[a.length-1]}(h,.5)}}({x:c,y:h},j(L),{x:o,y:p},j(M),J,16)).d,y=N.midpoint;else{let[a,b,d]=(0,g.oN)({sourceX:c,sourceY:h,sourcePosition:L,targetX:o,targetY:p,targetPosition:M,borderRadius:16});x=a,y={x:b,y:d}}let O="mcp"===a?"":K?"animated-both":v?.animated!==!1?"animated":"",P={...s,strokeWidth:w?3:2,stroke:"mcp"===a?w?z.palette.info.light:z.palette.info.main:w?z.palette.primary.main:z.palette.text.secondary,...O?{animationDuration:`${Math.round((K?750:500)*(a=>{let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)|0;return .9+Math.abs(b)%1e3/1e3*.2})(b))}ms`}:{}},Q=a=>{document.dispatchEvent(new CustomEvent(k,{detail:{edgeId:b,waypoints:a&&a.length>0?a:null}}))},R=a=>{if(0!==a.button)return;let b=B({x:a.clientX,y:a.clientY}),c=N?function(a,b){let c=0,d=1/0;for(let e of b){let b=function(a,b,c){let d=c.x-b.x,e=c.y-b.y,f=d*d+e*e,g=0===f?0:Math.max(0,Math.min(1,((a.x-b.x)*d+(a.y-b.y)*e)/f));return Math.hypot(a.x-(b.x+d*g),a.y-(b.y+e*g))}(a,e.a,e.b);b<d&&(d=b,c=e.gap)}return c}(b,N.segments):0,d=[...J];d.splice(c,0,b),G.current={index:c,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:d,active:!1,fromPath:!0},a.target.setPointerCapture(a.pointerId)},S=a=>{let b=G.current;if(!b||a.pointerId!==b.pointerId)return;if(!b.active){if(4>Math.hypot(a.clientX-b.startClient.x,a.clientY-b.startClient.y))return;b.active=!0}let c=[...b.base];c[b.index]=B({x:a.clientX,y:a.clientY}),F(c)},T=a=>{let b=G.current;if(!b||a.pointerId!==b.pointerId||(G.current=null,a.target.releasePointerCapture(a.pointerId),H.current=b.active,!b.active))return;let c=[...b.base];c[b.index]=B({x:a.clientX,y:a.clientY}),Q(c),F(null)},U=null!==E,V=w||C||U;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n,{path:x,markerEnd:t,markerStart:u,style:P,id:b,className:O}),(0,d.jsx)("path",{d:x,fill:"none",stroke:"transparent",strokeWidth:20,style:{cursor:U?"grabbing":"grab"},onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),onPointerDown:R,onPointerMove:S,onPointerUp:T}),(0,d.jsxs)(f.rV,{children:[V&&J.map((a,b)=>(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${a.x}px,${a.y}px)`,width:12,height:12,borderRadius:"50%",background:z.palette.primary.main,border:`2px solid ${z.palette.background.paper}`,boxShadow:z.shadows[1],cursor:"move",pointerEvents:"all",touchAction:"none",zIndex:1001},className:"nodrag nopan",title:"Drag to move; double-click to remove this bend",onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),onPointerDown:a=>{0===a.button&&(a.stopPropagation(),G.current={index:b,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:[...J],active:!1,fromPath:!1},a.target.setPointerCapture(a.pointerId))},onPointerMove:S,onPointerUp:T,onDoubleClick:a=>{a.stopPropagation(),(a=>{let b=J.filter((b,c)=>c!==a);F(null),Q(b)})(b)}},b)),(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${y.x+l.x}px,${y.y+l.y}px)`,pointerEvents:V&&!U?"all":"none",opacity:V&&!U?1:0,transition:"opacity 120ms ease",zIndex:1e3},className:"nodrag nopan",onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),children:(0,d.jsx)(m,{title:"Delete connection (drag to re-route)",style:{touchAction:"none"},onPointerDown:R,onPointerMove:S,onPointerUp:T,onClick:a=>{if(a.stopPropagation(),H.current){H.current=!1;return}A({edges:[{id:b}]})},children:"\xd7"})})]})]})}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=9343,exports.ids=[9343],exports.modules={49343:(a,b,c)=>{c.r(b),c.d(b,{BashSession:()=>P,betaAgentToolset20260401:()=>N,betaBashTool:()=>Q,betaEditTool:()=>T,betaGlobTool:()=>U,betaGrepTool:()=>V,betaReadTool:()=>R,betaWriteTool:()=>S,extractSkillArchive:()=>I,resolvePath:()=>O,resolveSkillVersion:()=>G,setupSkills:()=>F});var d,e,f,g,h,i,j,k=c(67746),l=c(51455),m=c(73024),n=c(76760),o=c(31421),p=c(77598),q=c(80481),r=c(31390),s=c(42032);function t(a){if("object"!==a.inputSchema.type)throw Error(`JSON schema for tool "${a.name}" must be an object, but got ${a.inputSchema.type}`);return{type:"custom",name:a.name,input_schema:a.inputSchema,description:a.description,run:a.run,parse:a=>a,...a.close?{close:a.close}:{}}}c(23514),c(98572);var u=c(68491);async function v(a){try{return await l.realpath(a)}catch{return a}}async function w(a){let b=[],c=a;for(;;){let d;try{d=await l.realpath(c)}catch{let d=!1;try{d=(await l.lstat(c)).isSymbolicLink()}catch{}if(d){c=n.resolve(n.dirname(c),await l.readlink(c));continue}let e=n.dirname(c);if(e===c)return a;b.push(n.basename(c)),c=e;continue}return b.length?n.join(d,...b.reverse()):d}}async function x(a,b,c){let d=c?.allowOutside??!1;if(n.isAbsolute(b)){if(!d)throw new s.v(`absolute path ${JSON.stringify(b)} not permitted`);return n.resolve(b)}let e=await v(n.resolve(a)),f=n.resolve(e,b);if(d)return f;let g=await w(f),h=e.endsWith(n.sep)?e:e+n.sep;if(g!==e&&!g.startsWith(h))throw new s.v(`path ${JSON.stringify(b)} escapes workdir`);return g}async function y(a,b){let c,d=n.dirname(a),e=n.join(d,`.tmp-${process.pid}-${(0,p.randomUUID)()}`);try{c=await l.open(e,"wx",420),await c.writeFile(b,"utf-8"),await c.sync(),await c.close(),c=void 0,await l.rename(e,a)}catch(a){throw c&&await c.close().catch(()=>{}),await l.unlink(e).catch(()=>{}),a}}function z(a,b){switch(a?.code){case"ENOENT":return`${b}: no such file or directory`;case"EACCES":case"EPERM":return`${b}: permission denied`;case"ENOTDIR":return`${b}: not a directory`;case"EISDIR":return`${b}: is a directory`;case"ELOOP":return`${b}: too many levels of symbolic links`;case"ENAMETOOLONG":return`${b}: file name too long`;case"ENOSPC":return`${b}: no space left on device`;case"EMFILE":case"ENFILE":return`${b}: too many open files`;default:return`${b}: ${a instanceof Error?a.message:String(a)}`}}var A=c(57975),B=c(57075),C=c(46466),D=c(82562);let E=(0,A.promisify)(o.execFile);async function F(a){let{client:b,sessionId:c}=a;if(!b||!c)return async()=>{};let d=(0,D.WG)(b),e=await b.beta.sessions.retrieve(c),f=n.resolve(a.workdir,"skills"),g=[];for(let a of e.agent.skills)try{let c=await G(b,a.skill_id,a.version),e=await b.beta.skills.versions.retrieve(c,{skill_id:a.skill_id}),h=n.basename(e.name.trim());(""===h||"."===h||".."===h)&&(h=a.skill_id);let i=n.resolve(f,h);if(i!==f&&!i.startsWith(f+n.sep)){d.warn("skill name escapes the skills dir; skipping",{component:"agent-tool-context",name:e.name});continue}let j=await b.beta.skills.versions.download(c,{skill_id:a.skill_id});await l.rm(i,{recursive:!0,force:!0}),await l.mkdir(i,{recursive:!0,mode:493}),g.push(i),await I(j,i),d.info("downloaded skill",{component:"agent-tool-context",skill_id:a.skill_id,version:c,dest:i})}catch(b){d.warn("failed to download skill",{component:"agent-tool-context",skill_id:a.skill_id,error:String(b)})}return async()=>{for(let a of g)await l.rm(a,{recursive:!0,force:!0}).catch(b=>{d.warn("failed to clean up skill",{component:"agent-tool-context",dest:a,error:String(b)})})}}async function G(a,b,c){let d;if(/^\d+$/.test(c))return c;for await(let c of a.beta.skills.versions.list(b))/^\d+$/.test(c.version)&&(void 0===d||BigInt(c.version)>BigInt(d))&&(d=c.version);if(void 0===d)throw new r.pJ(`skill ${JSON.stringify(b)} has no concrete version to resolve ${JSON.stringify(c)} against`);return d}async function H(a,b){try{let{stdout:c}=await E(a,b);return c}catch(b){if(null!=b&&"object"==typeof b&&"ENOENT"===b.code)throw new r.pJ(`skill extraction requires the \`${a}\` command, but it was not found on PATH`);throw b}}async function I(a,b){let c=n.join(b,`.skill-archive-${process.pid}-${Date.now()}`);if(!a.body)throw new r.pJ("skill download response had no body");await (0,C.pipeline)(B.Readable.fromWeb(a.body),m.createWriteStream(c));let d=n.join(n.dirname(b),`.skill-stage-${process.pid}-${Date.now()}`);try{let a=await J(c,4),e=a.length>=4&&80===a[0]&&75===a[1]&&3===a[2]&&4===a[3],f=e?"unzip":"tar",g=await H(f,e?["-Z1",c]:["-tf",c]);for(let a of g.split("\n")){let b=a.trim();if(b&&(n.isAbsolute(b)||b.split(/[\\/]/).includes("..")))throw new r.pJ(`refusing to extract unsafe archive member: ${b}`)}for(let a of(await H(f,e?["-Z",c]:["-tvf",c])).split("\n")){let b=a.trimStart()[0];if("l"===b||"h"===b||"b"===b||"c"===b||"p"===b||"s"===b)throw new r.pJ("refusing to extract archive with symlink/hardlink/device member")}let h=function(a){let b,c=!1;for(let d of a.split("\n")){let a=d.trim().split("/").filter(a=>""!==a&&"."!==a);if(0===a.length)continue;let e=a[0];if(void 0===b)b=e;else if(e!==b)return"";a.length>1&&(c=!0)}return void 0!==b&&c?b:""}(g);await l.mkdir(d,{recursive:!0,mode:493}),await H(f,e?["-oq",c,"-d",d]:["-xf",c,"-C",d]);let i=h?n.join(d,h):d;for(let a of(await l.readdir(i)))await l.rename(n.join(i,a),n.join(b,a))}finally{await l.rm(c,{force:!0}),await l.rm(d,{recursive:!0,force:!0})}}async function J(a,b){let c=await l.open(a,"r");try{let a=Buffer.alloc(b),{bytesRead:d}=await c.read(a,0,b,0);return a.subarray(0,d)}finally{await c.close()}}let K=/\x1b\[[0-9;?]*[ -/]*[@-~]/g,L=l.glob;function M(a){return void 0===a?262144:a}function N(a){return[Q(a),R(a),S(a),T(a),U(a),V(a)]}function O(a,b){return x(a.workdir,b,{allowOutside:a.unrestrictedPaths??!1})}class P{constructor(a,b=function(){let a={};for(let[b,c]of Object.entries(process.env))b.startsWith("ANTHROPIC_")||(a[b]=c);return a}()){d.add(this),e.set(this,void 0),f.set(this,""),g.set(this,!1),h.set(this,!1),i.set(this,null),(0,k.G)(this,e,o.spawn("/bin/bash",["--noprofile","--norc"],{cwd:a,env:{...b,PS1:"",PS2:"",TERM:"dumb"},stdio:["pipe","pipe","pipe"],detached:!0}),"f"),(0,k.g)(this,e,"f").stdout.setEncoding("utf8"),(0,k.g)(this,e,"f").stderr.setEncoding("utf8"),(0,k.g)(this,e,"f").stdout.on("data",a=>(0,k.g)(this,d,"m",j).call(this,a)),(0,k.g)(this,e,"f").stderr.on("data",a=>(0,k.g)(this,d,"m",j).call(this,a)),(0,k.g)(this,e,"f").once("close",()=>{(0,k.G)(this,h,!0,"f");let a=(0,k.g)(this,i,"f");(0,k.G)(this,i,null,"f"),a?.resolve()})}get closed(){return(0,k.g)(this,h,"f")}async exec(a,b={}){if((0,k.g)(this,h,"f"))throw new r.pJ("bash session terminated");let c=b.timeoutMs??12e4,d=b.signal;if(d?.aborted)throw new r.pJ("bash command aborted");(0,k.G)(this,f,"","f"),(0,k.G)(this,g,!1,"f");let j=`__ANT_CMD_${p.randomUUID()}_DONE__`,l=`${j.slice(0,8)}''${j.slice(8)}`,m=`{ ${a}
1
+ "use strict";exports.id=9343,exports.ids=[9343],exports.modules={49343:(a,b,c)=>{c.r(b),c.d(b,{BashSession:()=>P,betaAgentToolset20260401:()=>N,betaBashTool:()=>Q,betaEditTool:()=>T,betaGlobTool:()=>U,betaGrepTool:()=>V,betaReadTool:()=>R,betaWriteTool:()=>S,extractSkillArchive:()=>I,resolvePath:()=>O,resolveSkillVersion:()=>G,setupSkills:()=>F});var d,e,f,g,h,i,j,k=c(67746),l=c(51455),m=c(73024),n=c(76760),o=c(31421),p=c(77598),q=c(80481),r=c(31390),s=c(42032);function t(a){if("object"!==a.inputSchema.type)throw Error(`JSON schema for tool "${a.name}" must be an object, but got ${a.inputSchema.type}`);return{type:"custom",name:a.name,input_schema:a.inputSchema,description:a.description,run:a.run,parse:a=>a,...a.close?{close:a.close}:{}}}c(1133),c(98572);var u=c(68491);async function v(a){try{return await l.realpath(a)}catch{return a}}async function w(a){let b=[],c=a;for(;;){let d;try{d=await l.realpath(c)}catch{let d=!1;try{d=(await l.lstat(c)).isSymbolicLink()}catch{}if(d){c=n.resolve(n.dirname(c),await l.readlink(c));continue}let e=n.dirname(c);if(e===c)return a;b.push(n.basename(c)),c=e;continue}return b.length?n.join(d,...b.reverse()):d}}async function x(a,b,c){let d=c?.allowOutside??!1;if(n.isAbsolute(b)){if(!d)throw new s.v(`absolute path ${JSON.stringify(b)} not permitted`);return n.resolve(b)}let e=await v(n.resolve(a)),f=n.resolve(e,b);if(d)return f;let g=await w(f),h=e.endsWith(n.sep)?e:e+n.sep;if(g!==e&&!g.startsWith(h))throw new s.v(`path ${JSON.stringify(b)} escapes workdir`);return g}async function y(a,b){let c,d=n.dirname(a),e=n.join(d,`.tmp-${process.pid}-${(0,p.randomUUID)()}`);try{c=await l.open(e,"wx",420),await c.writeFile(b,"utf-8"),await c.sync(),await c.close(),c=void 0,await l.rename(e,a)}catch(a){throw c&&await c.close().catch(()=>{}),await l.unlink(e).catch(()=>{}),a}}function z(a,b){switch(a?.code){case"ENOENT":return`${b}: no such file or directory`;case"EACCES":case"EPERM":return`${b}: permission denied`;case"ENOTDIR":return`${b}: not a directory`;case"EISDIR":return`${b}: is a directory`;case"ELOOP":return`${b}: too many levels of symbolic links`;case"ENAMETOOLONG":return`${b}: file name too long`;case"ENOSPC":return`${b}: no space left on device`;case"EMFILE":case"ENFILE":return`${b}: too many open files`;default:return`${b}: ${a instanceof Error?a.message:String(a)}`}}var A=c(57975),B=c(57075),C=c(46466),D=c(82562);let E=(0,A.promisify)(o.execFile);async function F(a){let{client:b,sessionId:c}=a;if(!b||!c)return async()=>{};let d=(0,D.WG)(b),e=await b.beta.sessions.retrieve(c),f=n.resolve(a.workdir,"skills"),g=[];for(let a of e.agent.skills)try{let c=await G(b,a.skill_id,a.version),e=await b.beta.skills.versions.retrieve(c,{skill_id:a.skill_id}),h=n.basename(e.name.trim());(""===h||"."===h||".."===h)&&(h=a.skill_id);let i=n.resolve(f,h);if(i!==f&&!i.startsWith(f+n.sep)){d.warn("skill name escapes the skills dir; skipping",{component:"agent-tool-context",name:e.name});continue}let j=await b.beta.skills.versions.download(c,{skill_id:a.skill_id});await l.rm(i,{recursive:!0,force:!0}),await l.mkdir(i,{recursive:!0,mode:493}),g.push(i),await I(j,i),d.info("downloaded skill",{component:"agent-tool-context",skill_id:a.skill_id,version:c,dest:i})}catch(b){d.warn("failed to download skill",{component:"agent-tool-context",skill_id:a.skill_id,error:String(b)})}return async()=>{for(let a of g)await l.rm(a,{recursive:!0,force:!0}).catch(b=>{d.warn("failed to clean up skill",{component:"agent-tool-context",dest:a,error:String(b)})})}}async function G(a,b,c){let d;if(/^\d+$/.test(c))return c;for await(let c of a.beta.skills.versions.list(b))/^\d+$/.test(c.version)&&(void 0===d||BigInt(c.version)>BigInt(d))&&(d=c.version);if(void 0===d)throw new r.pJ(`skill ${JSON.stringify(b)} has no concrete version to resolve ${JSON.stringify(c)} against`);return d}async function H(a,b){try{let{stdout:c}=await E(a,b);return c}catch(b){if(null!=b&&"object"==typeof b&&"ENOENT"===b.code)throw new r.pJ(`skill extraction requires the \`${a}\` command, but it was not found on PATH`);throw b}}async function I(a,b){let c=n.join(b,`.skill-archive-${process.pid}-${Date.now()}`);if(!a.body)throw new r.pJ("skill download response had no body");await (0,C.pipeline)(B.Readable.fromWeb(a.body),m.createWriteStream(c));let d=n.join(n.dirname(b),`.skill-stage-${process.pid}-${Date.now()}`);try{let a=await J(c,4),e=a.length>=4&&80===a[0]&&75===a[1]&&3===a[2]&&4===a[3],f=e?"unzip":"tar",g=await H(f,e?["-Z1",c]:["-tf",c]);for(let a of g.split("\n")){let b=a.trim();if(b&&(n.isAbsolute(b)||b.split(/[\\/]/).includes("..")))throw new r.pJ(`refusing to extract unsafe archive member: ${b}`)}for(let a of(await H(f,e?["-Z",c]:["-tvf",c])).split("\n")){let b=a.trimStart()[0];if("l"===b||"h"===b||"b"===b||"c"===b||"p"===b||"s"===b)throw new r.pJ("refusing to extract archive with symlink/hardlink/device member")}let h=function(a){let b,c=!1;for(let d of a.split("\n")){let a=d.trim().split("/").filter(a=>""!==a&&"."!==a);if(0===a.length)continue;let e=a[0];if(void 0===b)b=e;else if(e!==b)return"";a.length>1&&(c=!0)}return void 0!==b&&c?b:""}(g);await l.mkdir(d,{recursive:!0,mode:493}),await H(f,e?["-oq",c,"-d",d]:["-xf",c,"-C",d]);let i=h?n.join(d,h):d;for(let a of(await l.readdir(i)))await l.rename(n.join(i,a),n.join(b,a))}finally{await l.rm(c,{force:!0}),await l.rm(d,{recursive:!0,force:!0})}}async function J(a,b){let c=await l.open(a,"r");try{let a=Buffer.alloc(b),{bytesRead:d}=await c.read(a,0,b,0);return a.subarray(0,d)}finally{await c.close()}}let K=/\x1b\[[0-9;?]*[ -/]*[@-~]/g,L=l.glob;function M(a){return void 0===a?262144:a}function N(a){return[Q(a),R(a),S(a),T(a),U(a),V(a)]}function O(a,b){return x(a.workdir,b,{allowOutside:a.unrestrictedPaths??!1})}class P{constructor(a,b=function(){let a={};for(let[b,c]of Object.entries(process.env))b.startsWith("ANTHROPIC_")||(a[b]=c);return a}()){d.add(this),e.set(this,void 0),f.set(this,""),g.set(this,!1),h.set(this,!1),i.set(this,null),(0,k.G)(this,e,o.spawn("/bin/bash",["--noprofile","--norc"],{cwd:a,env:{...b,PS1:"",PS2:"",TERM:"dumb"},stdio:["pipe","pipe","pipe"],detached:!0}),"f"),(0,k.g)(this,e,"f").stdout.setEncoding("utf8"),(0,k.g)(this,e,"f").stderr.setEncoding("utf8"),(0,k.g)(this,e,"f").stdout.on("data",a=>(0,k.g)(this,d,"m",j).call(this,a)),(0,k.g)(this,e,"f").stderr.on("data",a=>(0,k.g)(this,d,"m",j).call(this,a)),(0,k.g)(this,e,"f").once("close",()=>{(0,k.G)(this,h,!0,"f");let a=(0,k.g)(this,i,"f");(0,k.G)(this,i,null,"f"),a?.resolve()})}get closed(){return(0,k.g)(this,h,"f")}async exec(a,b={}){if((0,k.g)(this,h,"f"))throw new r.pJ("bash session terminated");let c=b.timeoutMs??12e4,d=b.signal;if(d?.aborted)throw new r.pJ("bash command aborted");(0,k.G)(this,f,"","f"),(0,k.G)(this,g,!1,"f");let j=`__ANT_CMD_${p.randomUUID()}_DONE__`,l=`${j.slice(0,8)}''${j.slice(8)}`,m=`{ ${a}
2
2
  } </dev/null 2>&1; printf '\\n${l}%d\\n' $?
3
3
  `;if((0,k.g)(this,e,"f").stdin.write(m),0>(0,k.g)(this,f,"f").indexOf(j)){let a,b,{promise:e,resolve:f}=(0,u.n)();(0,k.G)(this,i,{sentinel:j,resolve:f},"f");try{await Promise.race([e,new Promise((b,d)=>{a=setTimeout(()=>d(new r.pJ(`bash command timed out after ${c}ms`)),c)}),new Promise((a,c)=>{d&&(b=()=>c(new r.pJ("bash command aborted")),d.addEventListener("abort",b,{once:!0}))})])}finally{a&&clearTimeout(a),b&&d&&d.removeEventListener("abort",b),(0,k.G)(this,i,null,"f")}}let n=(0,k.g)(this,f,"f").indexOf(j);if(n<0)throw new r.pJ("bash session terminated");let o=(0,k.g)(this,f,"f").slice(n+j.length).match(/^(-?\d+)/),q=o?parseInt(o[1],10):-1,s=(0,k.g)(this,f,"f").slice(0,n).replace(K,"").replace(/\n+$/,"");return(0,k.g)(this,g,"f")&&(s=`[output truncated]
4
4
  ${s}`),{output:s,exitCode:q}}close(){if((0,k.g)(this,h,"f"))return;(0,k.G)(this,h,!0,"f");let a=(0,k.g)(this,i,"f");(0,k.G)(this,i,null,"f"),a?.resolve(),(0,k.g)(this,e,"f").stdout.destroy(),(0,k.g)(this,e,"f").stderr.destroy(),(0,k.g)(this,e,"f").stdin.destroy();try{process.kill(-(0,k.g)(this,e,"f").pid,"SIGKILL")}catch{(0,k.g)(this,e,"f").kill("SIGKILL")}(0,k.g)(this,e,"f").unref()}}function Q(a){let b,c=Promise.resolve();return t({name:"bash",description:"Run a bash command in a persistent shell. State (cwd, env vars) persists across calls.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command to run"},restart:{type:"boolean",description:"Restart the persistent shell before running"},timeout_ms:{type:"integer",description:"Per-call timeout in milliseconds"}}},run:async({command:d,restart:e,timeout_ms:f},g)=>{let h=c,i=(0,u.n)();c=i.promise;try{await h}catch{}try{if(e&&(b?.close(),b=void 0),!d){if(e)return"bash session restarted";throw new s.v("bash: command is required")}b??(b=new P(a.workdir,a.env));try{let{output:a,exitCode:c}=await b.exec(d,{timeoutMs:f??12e4,signal:g?.signal});if(0!==c)throw new s.v(a||`exit ${c}`);return a}catch(a){if(a instanceof s.v)throw a;throw b.close(),b=void 0,new s.v(`bash: ${a instanceof Error?a.message:String(a)}`)}}finally{i.resolve()}},close:()=>{b?.close(),b=void 0}})}function R(a){return t({name:"read",description:"Read a UTF-8 text file relative to the workdir.",inputSchema:{type:"object",properties:{file_path:{type:"string"},view_range:{type:"array",items:{type:"integer"},description:"[start_line, end_line] 1-indexed inclusive"}},required:["file_path"]},run:async({file_path:b,view_range:c})=>{let d;if(!b)throw new s.v("read: file_path is required");let e=await O(a,b);try{let c=await l.stat(e);if(!c.isFile())throw new s.v(`read: ${b} is not a regular file`);let f=M(a.maxFileBytes);if(null!==f&&c.size>f)throw new s.v(`read: ${b} is ${c.size} bytes, exceeds ${f}-byte limit. Use bash (head/tail/sed) to read a slice.`);d=await l.readFile(e,"utf8")}catch(a){if(a instanceof s.v)throw a;throw new s.v(`read: ${z(a,b)}`)}if(!c)return d;if(2!==c.length)throw new s.v("read: view_range must be [start_line, end_line]");let[f,g]=c,h=d.split("\n"),i=Math.max(0,f-1),j=g>0?g:h.length;return h.slice(i,j).join("\n")}})}function S(a){return t({name:"write",description:"Write a UTF-8 text file relative to the workdir, creating parent directories as needed.",inputSchema:{type:"object",properties:{file_path:{type:"string"},content:{type:"string"}},required:["file_path","content"]},run:async({file_path:b,content:c})=>{if(!b)throw new s.v("write: file_path is required");let d=await O(a,b);try{await l.mkdir(n.dirname(d),{recursive:!0,mode:493}),await y(d,c??"")}catch(a){throw new s.v(`write: ${z(a,b)}`)}return`wrote ${Buffer.byteLength(c??"")} bytes to ${b}`}})}function T(a){return t({name:"edit",description:"Replace old_string with new_string in a file. old_string must be unique unless replace_all.",inputSchema:{type:"object",properties:{file_path:{type:"string"},old_string:{type:"string"},new_string:{type:"string"},replace_all:{type:"boolean"}},required:["file_path","old_string","new_string"]},run:async({file_path:b,old_string:c,new_string:d,replace_all:e})=>{let f,g;if(!b)throw new s.v("edit: file_path is required");if(!c)throw new s.v("edit: old_string is required");let h=await O(a,b);try{let c=await l.stat(h);if(!c.isFile())throw new s.v(`edit: ${b} is not a regular file`);let d=M(a.maxFileBytes);if(null!==d&&c.size>d)throw new s.v(`edit: ${b} is ${c.size} bytes, exceeds ${d}-byte limit. Use bash (sed/awk) to edit a large file.`);f=await l.readFile(h,"utf8")}catch(a){if(a instanceof s.v)throw a;throw new s.v(`edit: ${z(a,b)}`)}let i=f.split(c).length-1;if(0===i)throw new s.v(`edit: old_string not found in ${b}`);if(e)g=f.split(c).join(d);else{if(i>1)throw new s.v(`edit: old_string appears ${i} times in ${b} (must be unique)`);g=f.replace(c,()=>d)}try{await y(h,g)}catch(a){throw new s.v(`edit: write: ${z(a,b)}`)}return`edited ${b} (${e?i:1} replacement(s))`}})}function U(a){return t({name:"glob",description:"Match files under the workdir against a glob pattern. Results are mtime-sorted, newest first.",inputSchema:{type:"object",properties:{pattern:{type:"string"},path:{type:"string",description:"Directory to search in. Defaults to the workdir."}},required:["pattern"]},run:async({pattern:b,path:c})=>{if(!b)throw new s.v("glob: pattern is required");let d=n.resolve(a.workdir),e=b;if(n.isAbsolute(b)){if(!a.unrestrictedPaths)throw new s.v("glob: absolute pattern not permitted");d=n.parse(b).root,e=n.relative(d,b)}else c&&(d=await O(a,c));if(!a.unrestrictedPaths&&e.split(/[\\/]/).includes(".."))throw new s.v('glob: ".." is not permitted in the pattern');let f=[];try{for await(let b of L(e,{cwd:d,withFileTypes:!0,exclude:a=>".git"===a.name||"node_modules"===a.name})){if(!b.isFile())continue;let c=n.join(b.parentPath,b.name);if(!a.unrestrictedPaths&&!function(a,b){let c=n.relative(a,b);return""===c||!c.startsWith(".."+n.sep)&&".."!==c&&!n.isAbsolute(c)}(d,c))continue;let e=0;try{e=(await l.stat(c)).mtimeMs}catch{}f.push({path:c,mtime:e})}}catch(a){throw new s.v(`glob: ${a instanceof Error?a.message:String(a)}`)}return 0===f.length?"no matches":(f.sort((a,b)=>b.mtime-a.mtime),f.slice(0,200).map(a=>a.path).join("\n"))}})}function V(a){return t({name:"grep",description:"Search file contents for a regex. Uses ripgrep if available, otherwise a built-in walker.",inputSchema:{type:"object",properties:{pattern:{type:"string"},path:{type:"string"}},required:["pattern"]},run:async({pattern:b,path:c},d)=>{var e,f,g,h;if(!b)throw new s.v("grep: pattern is required");let i=n.resolve(a.workdir);c&&(i=await O(a,c));let j=await Z();return j?(e=j,f=b,g=i,h=d?.signal,new Promise((a,b)=>{let c=o.spawn(e,["-n","--no-heading","-e",f,"--",g],{...h?{signal:h}:{}}),d="",i="",j=!1;c.stdout.on("data",a=>{!j&&(d+=a).length>102400&&(j=!0,d=d.slice(0,102400),c.kill("SIGKILL"))}),c.stderr.on("data",a=>i+=a),c.on("close",c=>h?.aborted?b(new s.v("grep: aborted")):j?a(d+`