flujo-ai 3.19.0 → 3.20.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 (446) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +213 -206
  3. package/.next/app-path-routes-manifest.json +9 -8
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +18 -18
  6. package/.next/react-loadable-manifest.json +8 -8
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page.js +2 -2
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/server/app/api/backup/route.js +1 -1
  14. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  15. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/browse/route.js +1 -1
  17. package/.next/server/app/api/browse/route.js.nft.json +1 -1
  18. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/cwd/route.js +1 -1
  20. package/.next/server/app/api/cwd/route.js.nft.json +1 -1
  21. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/encryption/secure/route.js +1 -1
  23. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  24. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/env/route.js +1 -1
  26. package/.next/server/app/api/env/route.js.nft.json +1 -1
  27. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/[id]/route.js +1 -1
  29. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  30. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/flow/compile/route.js +1 -1
  32. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/generate/route.js +1 -1
  35. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  36. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/flow/improve/route.js +1 -1
  38. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  41. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  42. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/flow/quick-chat/route.js +1 -1
  44. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  45. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/flow/repair/route.js +1 -1
  47. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  48. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/flow/route.js +1 -1
  50. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  51. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/git/route.js +1 -1
  53. package/.next/server/app/api/git/route.js.nft.json +1 -1
  54. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/init/route.js +1 -1
  56. package/.next/server/app/api/init/route.js.nft.json +1 -1
  57. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  62. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  63. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  74. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  75. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  77. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  81. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  83. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  86. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  87. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/mcp/servers/route.js +1 -1
  89. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  90. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  92. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  93. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  95. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  96. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/mcp-registry/route.js +1 -1
  98. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  99. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  101. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  102. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/model/[id]/route.js +1 -1
  104. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  105. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/model/provider/route.js +1 -1
  107. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  108. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/model/route.js +1 -1
  110. package/.next/server/app/api/model/route.js.nft.json +1 -1
  111. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/model/test/route.js +1 -1
  113. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  114. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/oauth/callback/route.js +1 -1
  116. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  117. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/oauth/initiate/route.js +1 -1
  119. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  120. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/oauth/reset/route.js +1 -1
  122. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  123. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
  125. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  126. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
  128. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  129. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
  131. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  132. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -1
  134. package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +1 -1
  135. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/planned-executions/route.js +1 -1
  137. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  138. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/restore/route.js +1 -1
  140. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  141. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/storage/route.js +1 -1
  143. package/.next/server/app/api/storage/route.js.nft.json +1 -1
  144. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/update/route.js +1 -1
  146. package/.next/server/app/api/update/route.js.nft.json +1 -1
  147. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  149. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  150. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/chat/page.js +7 -7
  152. package/.next/server/app/chat/page.js.nft.json +1 -1
  153. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  154. package/.next/server/app/chat.html +1 -1
  155. package/.next/server/app/chat.rsc +2 -2
  156. package/.next/server/app/docs/page.js +9 -2
  157. package/.next/server/app/docs/page.js.nft.json +1 -1
  158. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  159. package/.next/server/app/docs.html +1 -1
  160. package/.next/server/app/docs.rsc +2 -2
  161. package/.next/server/app/executions/page.js +1 -1
  162. package/.next/server/app/executions/page.js.nft.json +1 -1
  163. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  164. package/.next/server/app/executions.html +1 -1
  165. package/.next/server/app/executions.rsc +2 -2
  166. package/.next/server/app/flows/page.js +3 -3
  167. package/.next/server/app/flows/page.js.nft.json +1 -1
  168. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  169. package/.next/server/app/flows.html +1 -1
  170. package/.next/server/app/flows.rsc +2 -2
  171. package/.next/server/app/index.html +1 -1
  172. package/.next/server/app/index.rsc +2 -2
  173. package/.next/server/app/mcp/page.js +2 -2
  174. package/.next/server/app/mcp/page.js.nft.json +1 -1
  175. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  176. package/.next/server/app/mcp-flows/route.js +1 -1
  177. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  178. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  180. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  181. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/mcp.html +1 -1
  183. package/.next/server/app/mcp.rsc +2 -2
  184. package/.next/server/app/models/page.js +1 -1
  185. package/.next/server/app/models/page.js.nft.json +1 -1
  186. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  187. package/.next/server/app/page.js +2 -2
  188. package/.next/server/app/page.js.nft.json +1 -1
  189. package/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/settings/page.js +1 -1
  191. package/.next/server/app/settings/page.js.nft.json +1 -1
  192. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  193. package/.next/server/app/settings.html +1 -1
  194. package/.next/server/app/settings.rsc +2 -2
  195. package/.next/server/app/v1/chat/completions/route.js +1 -1
  196. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  197. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  199. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  200. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +1 -1
  202. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  203. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  205. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  206. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  208. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  209. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  211. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  212. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  214. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  215. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -0
  217. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js.nft.json +1 -0
  218. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -0
  219. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  220. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  221. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  223. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  224. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  226. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  227. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/v1/models/route.js +1 -1
  229. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  230. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app-paths-manifest.json +9 -8
  232. package/.next/server/chunks/1083.js +1 -1
  233. package/.next/server/chunks/1197.js +2 -2
  234. package/.next/server/chunks/1373.js +1 -1
  235. package/.next/server/chunks/1690.js +1 -0
  236. package/.next/server/chunks/1746.js +1 -1
  237. package/.next/server/chunks/2261.js +1 -0
  238. package/.next/server/chunks/2350.js +1 -1
  239. package/.next/server/chunks/264.js +1 -1
  240. package/.next/server/chunks/2859.js +1 -1
  241. package/.next/server/chunks/289.js +1 -0
  242. package/.next/server/chunks/3574.js +2 -2
  243. package/.next/server/chunks/{3310.js → 3778.js} +2 -2
  244. package/.next/server/chunks/3953.js +1 -1
  245. package/.next/server/chunks/3984.js +4 -4
  246. package/.next/server/chunks/4045.js +1 -0
  247. package/.next/server/chunks/4322.js +1 -0
  248. package/.next/server/chunks/4436.js +1 -0
  249. package/.next/server/chunks/4498.js +40 -0
  250. package/.next/server/chunks/4637.js +13 -6
  251. package/.next/server/chunks/4671.js +1 -0
  252. package/.next/server/chunks/{1912.js → 4690.js} +2 -2
  253. package/.next/server/chunks/5708.js +7 -0
  254. package/.next/server/chunks/5734.js +4 -4
  255. package/.next/server/chunks/{6088.js → 6532.js} +2 -2
  256. package/.next/server/chunks/6772.js +1 -1
  257. package/.next/server/chunks/{6136.js → 6908.js} +2 -2
  258. package/.next/server/chunks/6981.js +1 -0
  259. package/.next/server/chunks/6996.js +3 -3
  260. package/.next/server/chunks/701.js +1 -1
  261. package/.next/server/chunks/7101.js +64 -0
  262. package/.next/server/chunks/7214.js +2 -2
  263. package/.next/server/chunks/724.js +3 -3
  264. package/.next/server/chunks/7362.js +4 -4
  265. package/.next/server/chunks/7463.js +6 -0
  266. package/.next/server/chunks/7506.js +1 -1
  267. package/.next/server/chunks/7635.js +1 -1
  268. package/.next/server/chunks/7821.js +1 -1
  269. package/.next/server/chunks/8298.js +1 -0
  270. package/.next/server/chunks/8739.js +2 -2
  271. package/.next/server/chunks/9509.js +2 -2
  272. package/.next/server/chunks/9957.js +1 -0
  273. package/.next/server/functions-config-manifest.json +3 -3
  274. package/.next/server/instrumentation.js.nft.json +1 -1
  275. package/.next/server/middleware-build-manifest.js +1 -1
  276. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  277. package/.next/server/pages/404.html +1 -1
  278. package/.next/server/pages/500.html +1 -1
  279. package/.next/server/server-reference-manifest.js +1 -1
  280. package/.next/server/server-reference-manifest.json +1 -1
  281. package/.next/static/chunks/{1892-a0f5ec7152540dc3.js → 1892-5c1e38d89e0a5a9c.js} +1 -1
  282. package/.next/static/chunks/{3272-ab88dd195ea61b65.js → 3272-fd8d59523f61da96.js} +1 -1
  283. package/.next/static/chunks/3381-5fd2417957ca0881.js +1 -0
  284. package/.next/static/chunks/{1634-d4019c4a5cac2ed0.js → 3648-733cf7ca4a5d1f19.js} +1 -1
  285. package/.next/static/chunks/422-268783d9ad5897e1.js +1 -0
  286. package/.next/static/chunks/{5501-7d6e38c7c8cc3c5a.js → 5501-c400aaeaf57e6297.js} +1 -1
  287. package/.next/static/chunks/7258-e27017c1b98f43f9.js +1 -0
  288. package/.next/static/chunks/{7583.5355a64005f2b265.js → 7583.26a8c1f6e6823daf.js} +1 -1
  289. package/.next/static/chunks/{8187.57929e3f925fe538.js → 8187.fd653767df53db87.js} +1 -1
  290. package/.next/static/chunks/{7829-b843e80f32a83256.js → 8755-9f375ec8740fecac.js} +1 -1
  291. package/.next/static/chunks/{9164-14dc5889cb7478c0.js → 9164-f54d3531ca1df5f7.js} +1 -1
  292. package/.next/static/chunks/{9747-ffb8be5e59700c27.js → 9587-706bfd1a692c4660.js} +3 -3
  293. package/.next/static/chunks/app/api/backup/route-b296683a5faf800a.js +1 -0
  294. package/.next/static/chunks/app/api/browse/route-b296683a5faf800a.js +1 -0
  295. package/.next/static/chunks/app/api/cwd/route-b296683a5faf800a.js +1 -0
  296. package/.next/static/chunks/app/api/encryption/secure/route-b296683a5faf800a.js +1 -0
  297. package/.next/static/chunks/app/api/env/route-b296683a5faf800a.js +1 -0
  298. package/.next/static/chunks/app/api/flow/[id]/route-b296683a5faf800a.js +1 -0
  299. package/.next/static/chunks/app/api/flow/compile/route-b296683a5faf800a.js +1 -0
  300. package/.next/static/chunks/app/api/flow/generate/route-b296683a5faf800a.js +1 -0
  301. package/.next/static/chunks/app/api/flow/improve/route-b296683a5faf800a.js +1 -0
  302. package/.next/static/chunks/app/api/flow/prompt-renderer/route-b296683a5faf800a.js +1 -0
  303. package/.next/static/chunks/app/api/flow/quick-chat/route-b296683a5faf800a.js +1 -0
  304. package/.next/static/chunks/app/api/flow/repair/route-b296683a5faf800a.js +1 -0
  305. package/.next/static/chunks/app/api/flow/route-b296683a5faf800a.js +1 -0
  306. package/.next/static/chunks/app/api/git/route-b296683a5faf800a.js +1 -0
  307. package/.next/static/chunks/app/api/init/route-b296683a5faf800a.js +1 -0
  308. package/.next/static/chunks/app/api/local-models/capability/route-b296683a5faf800a.js +1 -0
  309. package/.next/static/chunks/app/api/local-models/pull/route-b296683a5faf800a.js +1 -0
  310. package/.next/static/chunks/app/api/local-models/suggest/route-b296683a5faf800a.js +1 -0
  311. package/.next/static/chunks/app/api/mcp/cancel/route-b296683a5faf800a.js +1 -0
  312. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b296683a5faf800a.js +1 -0
  313. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b296683a5faf800a.js +1 -0
  314. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b296683a5faf800a.js +1 -0
  315. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b296683a5faf800a.js +1 -0
  316. package/.next/static/chunks/app/api/mcp/servers/[name]/route-b296683a5faf800a.js +1 -0
  317. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b296683a5faf800a.js +1 -0
  318. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b296683a5faf800a.js +1 -0
  319. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b296683a5faf800a.js +1 -0
  320. package/.next/static/chunks/app/api/mcp/servers/route-b296683a5faf800a.js +1 -0
  321. package/.next/static/chunks/app/api/mcp/test-connection/route-b296683a5faf800a.js +1 -0
  322. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b296683a5faf800a.js +1 -0
  323. package/.next/static/chunks/app/api/mcp-registry/route-b296683a5faf800a.js +1 -0
  324. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b296683a5faf800a.js +1 -0
  325. package/.next/static/chunks/app/api/model/[id]/route-b296683a5faf800a.js +1 -0
  326. package/.next/static/chunks/app/api/model/provider/route-b296683a5faf800a.js +1 -0
  327. package/.next/static/chunks/app/api/model/route-b296683a5faf800a.js +1 -0
  328. package/.next/static/chunks/app/api/model/test/route-b296683a5faf800a.js +1 -0
  329. package/.next/static/chunks/app/api/oauth/callback/route-b296683a5faf800a.js +1 -0
  330. package/.next/static/chunks/app/api/oauth/initiate/route-b296683a5faf800a.js +1 -0
  331. package/.next/static/chunks/app/api/oauth/reset/route-b296683a5faf800a.js +1 -0
  332. package/.next/static/chunks/app/api/planned-executions/[id]/route-b296683a5faf800a.js +1 -0
  333. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b296683a5faf800a.js +1 -0
  334. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b296683a5faf800a.js +1 -0
  335. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b296683a5faf800a.js +1 -0
  336. package/.next/static/chunks/app/api/planned-executions/route-b296683a5faf800a.js +1 -0
  337. package/.next/static/chunks/app/api/restore/route-b296683a5faf800a.js +1 -0
  338. package/.next/static/chunks/app/api/storage/route-b296683a5faf800a.js +1 -0
  339. package/.next/static/chunks/app/api/update/route-b296683a5faf800a.js +1 -0
  340. package/.next/static/chunks/app/api/webhooks/[id]/route-b296683a5faf800a.js +1 -0
  341. package/.next/static/chunks/app/chat/page-a67ad3683443e7ad.js +1 -0
  342. package/.next/static/chunks/app/docs/page-097827ec4dae1d30.js +1 -0
  343. package/.next/static/chunks/app/executions/page-cb0dcc66d84c9bf8.js +1 -0
  344. package/.next/static/chunks/app/flows/page-abdd0642e378c5da.js +1 -0
  345. package/.next/static/chunks/app/mcp/{page-9a612d0be5a3336d.js → page-7d3a269dce68b529.js} +1 -1
  346. package/.next/static/chunks/app/mcp-flows/route-b296683a5faf800a.js +1 -0
  347. package/.next/static/chunks/app/mcp-proxy/[server]/route-b296683a5faf800a.js +1 -0
  348. package/.next/static/chunks/app/v1/chat/completions/route-b296683a5faf800a.js +1 -0
  349. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b296683a5faf800a.js +1 -0
  350. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b296683a5faf800a.js +1 -0
  351. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b296683a5faf800a.js +1 -0
  352. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b296683a5faf800a.js +1 -0
  353. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b296683a5faf800a.js +1 -0
  354. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b296683a5faf800a.js +1 -0
  355. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b296683a5faf800a.js +1 -0
  356. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b296683a5faf800a.js +1 -0
  357. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b296683a5faf800a.js +1 -0
  358. package/.next/static/chunks/app/v1/chat/conversations/route-b296683a5faf800a.js +1 -0
  359. package/.next/static/chunks/app/v1/models/route-b296683a5faf800a.js +1 -0
  360. package/.next/static/chunks/webpack-ef5b2cef70829f42.js +1 -0
  361. package/.next/trace +9 -7
  362. package/.next/types/app/v1/chat/conversations/[conversationId]/resources/route.ts +347 -0
  363. package/.next/types/routes.d.ts +2 -1
  364. package/.next/types/validator.ts +9 -0
  365. package/README.md +1 -1
  366. package/package.json +1 -1
  367. package/.next/server/chunks/2194.js +0 -1
  368. package/.next/server/chunks/3648.js +0 -1
  369. package/.next/server/chunks/4239.js +0 -1
  370. package/.next/server/chunks/4372.js +0 -1
  371. package/.next/server/chunks/4681.js +0 -1
  372. package/.next/server/chunks/5148.js +0 -1
  373. package/.next/server/chunks/6465.js +0 -1
  374. package/.next/server/chunks/7403.js +0 -38
  375. package/.next/server/chunks/7865.js +0 -9
  376. package/.next/static/chunks/1711-ccf5eba61d618a1a.js +0 -1
  377. package/.next/static/chunks/3625-74c77250d64d1cd3.js +0 -1
  378. package/.next/static/chunks/924-64f908860caf1a35.js +0 -1
  379. package/.next/static/chunks/app/api/backup/route-ff084c1cc278df77.js +0 -1
  380. package/.next/static/chunks/app/api/browse/route-ff084c1cc278df77.js +0 -1
  381. package/.next/static/chunks/app/api/cwd/route-ff084c1cc278df77.js +0 -1
  382. package/.next/static/chunks/app/api/encryption/secure/route-ff084c1cc278df77.js +0 -1
  383. package/.next/static/chunks/app/api/env/route-ff084c1cc278df77.js +0 -1
  384. package/.next/static/chunks/app/api/flow/[id]/route-ff084c1cc278df77.js +0 -1
  385. package/.next/static/chunks/app/api/flow/compile/route-ff084c1cc278df77.js +0 -1
  386. package/.next/static/chunks/app/api/flow/generate/route-ff084c1cc278df77.js +0 -1
  387. package/.next/static/chunks/app/api/flow/improve/route-ff084c1cc278df77.js +0 -1
  388. package/.next/static/chunks/app/api/flow/prompt-renderer/route-ff084c1cc278df77.js +0 -1
  389. package/.next/static/chunks/app/api/flow/quick-chat/route-ff084c1cc278df77.js +0 -1
  390. package/.next/static/chunks/app/api/flow/repair/route-ff084c1cc278df77.js +0 -1
  391. package/.next/static/chunks/app/api/flow/route-ff084c1cc278df77.js +0 -1
  392. package/.next/static/chunks/app/api/git/route-ff084c1cc278df77.js +0 -1
  393. package/.next/static/chunks/app/api/init/route-ff084c1cc278df77.js +0 -1
  394. package/.next/static/chunks/app/api/local-models/capability/route-ff084c1cc278df77.js +0 -1
  395. package/.next/static/chunks/app/api/local-models/pull/route-ff084c1cc278df77.js +0 -1
  396. package/.next/static/chunks/app/api/local-models/suggest/route-ff084c1cc278df77.js +0 -1
  397. package/.next/static/chunks/app/api/mcp/cancel/route-ff084c1cc278df77.js +0 -1
  398. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-ff084c1cc278df77.js +0 -1
  399. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-ff084c1cc278df77.js +0 -1
  400. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-ff084c1cc278df77.js +0 -1
  401. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-ff084c1cc278df77.js +0 -1
  402. package/.next/static/chunks/app/api/mcp/servers/[name]/route-ff084c1cc278df77.js +0 -1
  403. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-ff084c1cc278df77.js +0 -1
  404. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-ff084c1cc278df77.js +0 -1
  405. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-ff084c1cc278df77.js +0 -1
  406. package/.next/static/chunks/app/api/mcp/servers/route-ff084c1cc278df77.js +0 -1
  407. package/.next/static/chunks/app/api/mcp/test-connection/route-ff084c1cc278df77.js +0 -1
  408. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-ff084c1cc278df77.js +0 -1
  409. package/.next/static/chunks/app/api/mcp-registry/route-ff084c1cc278df77.js +0 -1
  410. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-ff084c1cc278df77.js +0 -1
  411. package/.next/static/chunks/app/api/model/[id]/route-ff084c1cc278df77.js +0 -1
  412. package/.next/static/chunks/app/api/model/provider/route-ff084c1cc278df77.js +0 -1
  413. package/.next/static/chunks/app/api/model/route-ff084c1cc278df77.js +0 -1
  414. package/.next/static/chunks/app/api/model/test/route-ff084c1cc278df77.js +0 -1
  415. package/.next/static/chunks/app/api/oauth/callback/route-ff084c1cc278df77.js +0 -1
  416. package/.next/static/chunks/app/api/oauth/initiate/route-ff084c1cc278df77.js +0 -1
  417. package/.next/static/chunks/app/api/oauth/reset/route-ff084c1cc278df77.js +0 -1
  418. package/.next/static/chunks/app/api/planned-executions/[id]/route-ff084c1cc278df77.js +0 -1
  419. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-ff084c1cc278df77.js +0 -1
  420. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-ff084c1cc278df77.js +0 -1
  421. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-ff084c1cc278df77.js +0 -1
  422. package/.next/static/chunks/app/api/planned-executions/route-ff084c1cc278df77.js +0 -1
  423. package/.next/static/chunks/app/api/restore/route-ff084c1cc278df77.js +0 -1
  424. package/.next/static/chunks/app/api/storage/route-ff084c1cc278df77.js +0 -1
  425. package/.next/static/chunks/app/api/update/route-ff084c1cc278df77.js +0 -1
  426. package/.next/static/chunks/app/api/webhooks/[id]/route-ff084c1cc278df77.js +0 -1
  427. package/.next/static/chunks/app/chat/page-1d764d1de5ad5d2f.js +0 -1
  428. package/.next/static/chunks/app/docs/page-d670c1ec8af5cb54.js +0 -1
  429. package/.next/static/chunks/app/executions/page-109274291811d467.js +0 -1
  430. package/.next/static/chunks/app/flows/page-df8eda0e83934fb2.js +0 -1
  431. package/.next/static/chunks/app/mcp-flows/route-ff084c1cc278df77.js +0 -1
  432. package/.next/static/chunks/app/mcp-proxy/[server]/route-ff084c1cc278df77.js +0 -1
  433. package/.next/static/chunks/app/v1/chat/completions/route-ff084c1cc278df77.js +0 -1
  434. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-ff084c1cc278df77.js +0 -1
  435. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-ff084c1cc278df77.js +0 -1
  436. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-ff084c1cc278df77.js +0 -1
  437. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-ff084c1cc278df77.js +0 -1
  438. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-ff084c1cc278df77.js +0 -1
  439. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-ff084c1cc278df77.js +0 -1
  440. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-ff084c1cc278df77.js +0 -1
  441. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-ff084c1cc278df77.js +0 -1
  442. package/.next/static/chunks/app/v1/chat/conversations/route-ff084c1cc278df77.js +0 -1
  443. package/.next/static/chunks/app/v1/models/route-ff084c1cc278df77.js +0 -1
  444. package/.next/static/chunks/webpack-3e8560996ac8c1e0.js +0 -1
  445. /package/.next/static/{itJEX_uJ7hJ7oF-igwwK9 → dvSaKx6-EfRNi7Xj-cSv_}/_buildManifest.js +0 -0
  446. /package/.next/static/{itJEX_uJ7hJ7oF-igwwK9 → dvSaKx6-EfRNi7Xj-cSv_}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=2350,exports.ids=[2350,7821],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>g,FH:()=>s,Zn:()=>t,dM:()=>r,lk:()=>h,pX:()=>q});var d=c(32524),e=c(49181),f=c(45131);let g=3,h=8;function i(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let j={type:"arrowclosed",width:20,height:20,color:"#1976d2"},k={stroke:"#1976d2",strokeWidth:2},l=new Set(["full-history","latest-message","isolated"]),m=new Set(["steps","final-only"]),n=new Set(["full-conversation","latest-message"]);function o(a){let b=(0,e.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}function p(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function q(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function r(a,b={},c={}){let e=[],s=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),t=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),u=b.models??[],v=new Set((b.servers??[]).map(a=>a.name)),w=b.serverTools??{},x=i(c.maxDepth,0,g,g),y=i(c.maxFlows,1,h,h),z=[],A=[...(b.flows??[]).map(a=>a.name)],B=[],C=0;var D=function a(e,g,h){let r=Array.isArray(e?.nodes)?e.nodes:[],D=Array.isArray(e?.edges)?e.edges:[],E=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,A);A.push(E),C++;let F=(0,d.A)(),G=[...h,E],I=new Map,J=[],K=[];for(let c of r){let e=c?.key;if(!e||"string"!=typeof e){s("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(I.has(e)){s("node-duplicate-key",`Duplicate node key "${e}" — keys must be unique; the later node was dropped.`,e);continue}let f=c.type;if("mcp"===f){s("mcp-node-not-allowed",`Node "${e}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,e);continue}if("start"!==f&&"process"!==f&&"finish"!==f&&"subflow"!==f){s("unknown-node-type",`Node "${e}" has unknown type "${String(f)}".`,e);continue}let h={},j="string"==typeof c.prompt?c.prompt:void 0;if("start"===f){let{text:a,stripped:b}=o(j??"");b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}else if("process"===f){let{text:a,stripped:b}=o(j??"");if(b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a,c.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(c.model,u);a?h.boundModel=a:(h.boundModel=c.model,t("model-unresolved",`Node "${e}": model "${c.model}" does not match any configured model (by id, display name, or name).`,e))}void 0!==c.inputMode&&(l.has(c.inputMode)?(h.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(h.isolatedPrompt=c.isolatedPrompt)):t("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(n.has(c.outputMode)?h.outputMode=c.outputMode:t("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,e)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?t("invalid-max-turns",`Node "${e}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,e):h.maxTurns=i(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(h.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(h.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(h.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(h.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim())}else if("subflow"===f){if(function(c,d,e,f,g){let h=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,i=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0;if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,h?"parallelFlows":null,i?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&t("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(h||i)&&s("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(g.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?g.itemSplit=c.itemSplit:t("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(g.sequential=!0),H(c,g)):s("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}if(c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return s("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=p(c.flow,[...b.flows??[],...B]);return a?g.subflowId=a:s("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>x)return s("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${x} level(s); this inline subflow was not compiled.`,d);if(C>=y)return s("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${y} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?g.subflowId=b.id:s("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(h){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){s("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){s("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=p(e,[...b.flows??[],...B]);c?a.includes(c)||a.push(c):s("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(g.parallelSubflowIds=a,H(c,g)):s("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(i){let b=[];for(let g of c.parallelSubflowSpecs){if(!g||"object"!=typeof g){s("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>x){s("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${x} level(s); a parallel inline subflow was not compiled.`,d);continue}if(C>=y){s("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${y} flows in one bundle; it was not compiled.`,d);continue}let c=a(g,e+1,f);c?b.push(c.id):s("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(g.parallelSubflowIds=b,H(c,g)):s("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return s("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d);s("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,e,g,G,h),void 0!==c.inputMode&&(l.has(c.inputMode)?h.inputMode=c.inputMode:t("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(m.has(c.outputMode)?h.outputMode=c.outputMode:t("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,e)),void 0!==j){let{text:a,stripped:b}=o(j);b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(h.allowCallerPrompt=c.allowCallerPrompt),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim())}let k={id:(0,d.A)(),type:f,position:{x:0,y:0},data:{label:c.label||`${f.charAt(0).toUpperCase()}${f.slice(1)} Node`,type:f,...c.description?{description:c.description}:{},properties:h}};if(I.set(e,k),J.push(k),"process"===f&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,f=b?.name;if(!f||"string"!=typeof f){t("server-missing-name",`Node "${e}": a server reference is missing its "name"; skipped.`,e);continue}if(a.has(f))continue;a.add(f),v.has(f)||t("server-unknown",`Node "${e}": MCP server "${f}" is not configured in FLUJO.`,e);let g=w[f];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&t("tool-unknown",`Node "${e}": server "${f}" does not report tool(s): ${a.join(", ")}.`,e)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:f,type:"mcp",properties:{boundServer:f,enabledTools:c}}};J.push(h),K.push({processKey:e,mcpNode:h})}}else"process"!==f&&Array.isArray(c.servers)&&c.servers.length>0&&t("servers-on-non-process",`Node "${e}": only process nodes can have "servers"; ignored.`,e)}if(0===I.size)return s("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let L=[],M=new Set;for(let a of D){let b,c=a?.from,d=a?.to,e=c?I.get(c):void 0,g=d?I.get(d):void 0;if(!e||!g){s("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===g){s("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("start"===g.type){s("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){s("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let h=`${c}->${d}`;if(M.has(h)){t("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}M.add(h);let i=!0===a.bidirectional;i&&("start"===e.type||"finish"===g.type)&&(t("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),i=!1);let j=a.condition;j&&"object"==typeof j&&("process"!==e.type?t("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(j.kind)?"string"!=typeof j.value||0===j.value.length?t("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==j.kind||(0,f.wM)(j.value)||t("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:j.kind,value:j.value,..."last-message"===j.target?{target:"last-message"}:{},...!0===j.ignoreCase?{ignoreCase:!0}:{},...!0===j.negate?{negate:!0}:{}}):t("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(j.kind)}"; the condition was dropped.`)),L.push(q(e,g,i,b))}for(let{processKey:a,mcpNode:b}of K){let c=I.get(a);L.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...j},markerStart:{...j},style:{...k}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c)a.data?.edgeType!=="mcp"&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target));let g=[...b.values()],h=g.filter(a=>"start"===a.type),i=h.length>0?h:g.slice(0,1),j=new Map,k=i.map(a=>({id:a.id,depth:0}));for(let a of k)j.set(a.id,0);for(;k.length;){let{id:a,depth:b}=k.shift();for(let c of f.get(a)??[])j.has(c)||(j.set(c,b+1),k.push({id:c,depth:b+1}))}let l=0;for(let a of j.values())l=Math.max(l,a);for(let a of g)j.has(a.id)||j.set(a.id,l+1);let m=new Map;for(let[a,c]of b)m.set(c.id,a);let n=new Map;for(let a of g){let b=m.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=j.get(a.id),f=n.get(d)??0;n.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let o=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=o.get(a)??0;o.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}}(0,I,L,K,0===g?c.positions:void 0);let N={id:F,name:E,...e?.description?{description:e.description}:{},nodes:J,edges:L};return z.push(N),B.push({id:N.id,name:N.name}),N}(a,0,[]),E=z,F=e;let G=F.filter(a=>"error"===a.severity).length;return{flow:D,flows:E,issues:F,errorCount:G,warningCount:F.length-G};function H(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?t("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:t("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function s(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,...a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else"subflow"===b&&(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0?(d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy)):"string"==typeof c.subflowId&&c.subflowId&&(d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function t(a){for(let b of a.nodes){if("process"!==b.type)continue;let a=b.data.properties??{};void 0===a.inputMode&&(a.inputMode="latest-message"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}},87821:(a,b,c)=>{c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(7865)]).then(c.bind(c,77865));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v}};
1
+ "use strict";exports.id=2350,exports.ids=[2350,7821],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>g,FH:()=>u,Zn:()=>v,dM:()=>t,lk:()=>h,pX:()=>s});var d=c(32524),e=c(49181),f=c(45131);let g=3,h=8;function i(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let j={type:"arrowclosed",width:20,height:20,color:"#1976d2"},k={stroke:"#1976d2",strokeWidth:2},l={type:"arrowclosed",width:20,height:20,color:"#009688"},m={stroke:"#009688",strokeWidth:2},n=new Set(["full-history","latest-message","isolated"]),o=new Set(["steps","final-only"]),p=new Set(["full-conversation","latest-message"]);function q(a){let b=(0,e.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}function r(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function s(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function t(a,b={},c={}){let e=[],u=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),v=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),w=b.models??[],x=new Set((b.servers??[]).map(a=>a.name)),y=b.serverTools??{},z=i(c.maxDepth,0,g,g),A=i(c.maxFlows,1,h,h),B=[],C=[...(b.flows??[]).map(a=>a.name)],D=[],E=0;var F=function a(e,g,h){let t=Array.isArray(e?.nodes)?e.nodes:[],F=Array.isArray(e?.edges)?e.edges:[],G=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,C);C.push(G),E++;let H=(0,d.A)(),I=[...h,G],K=new Map,L=[],M=[];for(let c of t){let e=c?.key;if(!e||"string"!=typeof e){u("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(K.has(e)){u("node-duplicate-key",`Duplicate node key "${e}" — keys must be unique; the later node was dropped.`,e);continue}let f=c.type;if("mcp"===f){u("mcp-node-not-allowed",`Node "${e}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,e);continue}if("start"!==f&&"process"!==f&&"finish"!==f&&"subflow"!==f&&"resource"!==f){u("unknown-node-type",`Node "${e}" has unknown type "${String(f)}".`,e);continue}let h={},j="string"==typeof c.prompt?c.prompt:void 0;if("start"===f){let{text:a,stripped:b}=q(j??"");b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}else if("process"===f){let{text:a,stripped:b}=q(j??"");if(b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a,c.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(c.model,w);a?h.boundModel=a:(h.boundModel=c.model,v("model-unresolved",`Node "${e}": model "${c.model}" does not match any configured model (by id, display name, or name).`,e))}void 0!==c.inputMode&&(n.has(c.inputMode)?(h.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(h.isolatedPrompt=c.isolatedPrompt)):v("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(p.has(c.outputMode)?h.outputMode=c.outputMode:v("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,e)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?v("invalid-max-turns",`Node "${e}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,e):h.maxTurns=i(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(h.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(h.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(h.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(h.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(h.captureResource=c.captureResource.trim())}else if("subflow"===f){if(function(c,d,e,f,g){let h=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,i=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0;if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,h?"parallelFlows":null,i?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&v("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(h||i)&&u("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(g.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?g.itemSplit=c.itemSplit:v("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(g.sequential=!0),J(c,g)):u("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}if(c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return u("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=r(c.flow,[...b.flows??[],...D]);return a?g.subflowId=a:u("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>z)return u("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${z} level(s); this inline subflow was not compiled.`,d);if(E>=A)return u("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${A} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?g.subflowId=b.id:u("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(h){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){u("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){u("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=r(e,[...b.flows??[],...D]);c?a.includes(c)||a.push(c):u("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(g.parallelSubflowIds=a,J(c,g)):u("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(i){let b=[];for(let g of c.parallelSubflowSpecs){if(!g||"object"!=typeof g){u("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>z){u("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${z} level(s); a parallel inline subflow was not compiled.`,d);continue}if(E>=A){u("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${A} flows in one bundle; it was not compiled.`,d);continue}let c=a(g,e+1,f);c?b.push(c.id):u("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(g.parallelSubflowIds=b,J(c,g)):u("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return u("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d);u("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,e,g,I,h),void 0!==c.inputMode&&(n.has(c.inputMode)?h.inputMode=c.inputMode:v("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(o.has(c.outputMode)?h.outputMode=c.outputMode:v("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,e)),void 0!==j){let{text:a,stripped:b}=q(j);b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(h.allowCallerPrompt=c.allowCallerPrompt),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(h.captureResource=c.captureResource.trim())}else if("resource"===f){let a="string"==typeof c.runName?c.runName.trim():"",b="string"==typeof c.server?c.server.trim():"",d="string"==typeof c.uri?c.uri.trim():"";a?(h.scope="run",h.runName=a,(b||d)&&v("resource-both-bindings",`Node "${e}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,e)):(h.scope="mcp",b&&(h.boundServer=b),d&&(h.uri=d),b&&d?x.has(b)||v("server-unknown",`Node "${e}": MCP server "${b}" is not configured in FLUJO.`,e):v("resource-missing-binding",`Node "${e}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,e))}let k={id:(0,d.A)(),type:f,position:{x:0,y:0},data:{label:c.label||`${f.charAt(0).toUpperCase()}${f.slice(1)} Node`,type:f,...c.description?{description:c.description}:{},properties:h}};if(K.set(e,k),L.push(k),"process"===f&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,f=b?.name;if(!f||"string"!=typeof f){v("server-missing-name",`Node "${e}": a server reference is missing its "name"; skipped.`,e);continue}if(a.has(f))continue;a.add(f),x.has(f)||v("server-unknown",`Node "${e}": MCP server "${f}" is not configured in FLUJO.`,e);let g=y[f];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&v("tool-unknown",`Node "${e}": server "${f}" does not report tool(s): ${a.join(", ")}.`,e)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:f,type:"mcp",properties:{boundServer:f,enabledTools:c}}};L.push(h),M.push({processKey:e,mcpNode:h})}}else"process"!==f&&Array.isArray(c.servers)&&c.servers.length>0&&v("servers-on-non-process",`Node "${e}": only process nodes can have "servers"; ignored.`,e)}if(0===K.size)return u("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let N=[],O=new Set;for(let a of F){let b,c=a?.from,d=a?.to,e=c?K.get(c):void 0,g=d?K.get(d):void 0;if(!e||!g){u("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===g){u("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===e.type||"resource"===g.type){if(("resource"!==e.type||"process"!==g.type)&&("process"!==e.type||"resource"!==g.type)){u("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&v("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&v("resource-edge-bidirectional",`Edge "${c}" -> "${d}": resource wiring is directional (read vs write); "bidirectional" was ignored — add the opposite edge explicitly if the step both reads and writes.`);let b=`${c}->${d}`;if(O.has(b)){v("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}O.add(b),N.push(function(a,b){let c="resource"===a.type?"resource-out":"process-right-resource",d="resource"===b.type?"resource-in":"process-left-resource";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"resourceEdge",data:{edgeType:"resource"},animated:!1,markerEnd:{...l},style:{...m}}}(e,g));continue}if("start"===g.type){u("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){u("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let h=`${c}->${d}`;if(O.has(h)){v("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}O.add(h);let i=!0===a.bidirectional;i&&("start"===e.type||"finish"===g.type)&&(v("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),i=!1);let j=a.condition;j&&"object"==typeof j&&("process"!==e.type?v("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(j.kind)?"string"!=typeof j.value||0===j.value.length?v("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==j.kind||(0,f.wM)(j.value)||v("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:j.kind,value:j.value,..."last-message"===j.target?{target:"last-message"}:{},...!0===j.ignoreCase?{ignoreCase:!0}:{},...!0===j.negate?{negate:!0}:{}}):v("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(j.kind)}"; the condition was dropped.`)),N.push(s(e,g,i,b))}for(let{processKey:a,mcpNode:b}of M){let c=K.get(a);N.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...j},markerStart:{...j},style:{...k}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c){let b=a.data?.edgeType;"mcp"!==b&&"resource"!==b&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target))}let g=[...b.values()],h=g.filter(a=>"resource"===a.type),i=g.filter(a=>"resource"!==a.type),j=i.filter(a=>"start"===a.type),k=j.length>0?j:i.slice(0,1),l=new Map,m=k.map(a=>({id:a.id,depth:0}));for(let a of m)l.set(a.id,0);for(;m.length;){let{id:a,depth:b}=m.shift();for(let c of f.get(a)??[])l.has(c)||(l.set(c,b+1),m.push({id:c,depth:b+1}))}let n=0;for(let a of l.values())n=Math.max(n,a);for(let a of i)l.has(a.id)||l.set(a.id,n+1);let o=new Map;for(let[a,c]of b)o.set(c.id,a);let p=new Map;for(let a of i){let b=o.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=l.get(a.id),f=p.get(d)??0;p.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let q=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=q.get(a)??0;q.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}let r=new Map(g.map(a=>[a.id,a])),s=new Map,t=0;for(let a of h){let b=o.get(a.id),d=e&&b?e[b]:void 0;if(d&&"number"==typeof d.x&&"number"==typeof d.y){a.position={x:d.x,y:d.y};continue}let f=c.find(b=>b.data?.edgeType==="resource"&&(b.source===a.id||b.target===a.id)),g=f?f.source===a.id?f.target:f.source:void 0,h=g?r.get(g):void 0;if(h){let b=s.get(h.id)??0;s.set(h.id,b+1),a.position={x:h.position.x-320,y:h.position.y+150*b}}else{let b=0;for(let a of i)b=Math.max(b,a.position.y);a.position={x:250+280*t,y:b+170},t++}}}(0,K,N,M,0===g?c.positions:void 0);let P={id:H,name:G,...e?.description?{description:e.description}:{},nodes:L,edges:N};return B.push(P),D.push({id:P.id,name:P.name}),P}(a,0,[]),G=B,H=e;let I=H.filter(a=>"error"===a.severity).length;return{flow:F,flows:G,issues:H,errorCount:I,warningCount:H.length-I};function J(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?v("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:v("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function u(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b&&"resource"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,...a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else"subflow"===b?(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0?(d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy)):"string"==typeof c.subflowId&&c.subflowId&&(d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource)):"resource"===b&&("run"===c.scope&&"string"==typeof c.runName&&c.runName?d.runName=c.runName:("string"==typeof c.boundServer&&c.boundServer&&(d.server=c.boundServer),"string"==typeof c.uri&&c.uri&&(d.uri=c.uri)));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function v(a){for(let b of a.nodes){if("process"!==b.type)continue;let a=b.data.properties??{};void 0===a.inputMode&&(a.inputMode="latest-message"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}},87821:(a,b,c)=>{c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(4498)]).then(c.bind(c,44498));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v}};