flujo-ai 3.18.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 (487) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +252 -231
  3. package/.next/app-path-routes-manifest.json +13 -11
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +21 -21
  6. package/.next/react-loadable-manifest.json +11 -11
  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_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_not-found.html +1 -1
  11. package/.next/server/app/_not-found.rsc +2 -2
  12. package/.next/server/app/api/backup/route.js +1 -1
  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_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/encryption/secure/route.js +1 -1
  18. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  19. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/env/route.js +2 -2
  21. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/flow/[id]/route.js +1 -1
  23. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  24. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/flow/compile/route.js +1 -1
  26. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  27. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/generate/route.js +1 -1
  29. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  30. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/flow/improve/route.js +1 -1
  32. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
  35. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  36. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/flow/quick-chat/route.js +1 -1
  38. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/flow/repair/route.js +1 -0
  41. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -0
  42. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -0
  43. package/.next/server/app/api/flow/route.js +1 -1
  44. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  45. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/git/route.js +4 -4
  47. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/init/route.js +1 -1
  49. package/.next/server/app/api/init/route.js.nft.json +1 -1
  50. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/mcp/cancel/route.js +2 -2
  55. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  74. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  76. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  79. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/mcp/servers/route.js +1 -1
  82. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  83. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  85. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  88. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  89. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/mcp-registry/route.js +2 -1
  91. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  92. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/model/[id]/route.js +1 -1
  95. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  96. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/model/provider/route.js +2 -2
  98. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  99. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/model/route.js +1 -1
  101. package/.next/server/app/api/model/route.js.nft.json +1 -1
  102. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/model/test/route.js +2 -2
  104. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  105. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/oauth/callback/route.js +2 -2
  107. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/oauth/initiate/route.js +2 -2
  109. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/oauth/reset/route.js +2 -2
  111. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  112. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/planned-executions/[id]/route.js +2 -2
  114. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  115. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/planned-executions/[id]/run/route.js +2 -2
  117. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  118. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/planned-executions/[id]/runs/route.js +2 -2
  120. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  121. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/planned-executions/route.js +1 -1
  124. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  125. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/restore/route.js +1 -1
  127. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  128. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  132. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  133. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/chat/page.js +8 -7
  135. package/.next/server/app/chat/page.js.nft.json +1 -1
  136. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/chat.html +1 -1
  138. package/.next/server/app/chat.rsc +3 -3
  139. package/.next/server/app/docs/page.js +37 -6
  140. package/.next/server/app/docs/page.js.nft.json +1 -1
  141. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  142. package/.next/server/app/docs.html +1 -1
  143. package/.next/server/app/docs.rsc +3 -3
  144. package/.next/server/app/executions/page.js +3 -5
  145. package/.next/server/app/executions/page.js.nft.json +1 -1
  146. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  147. package/.next/server/app/executions.html +1 -1
  148. package/.next/server/app/executions.rsc +3 -3
  149. package/.next/server/app/flows/page.js +3 -3
  150. package/.next/server/app/flows/page.js.nft.json +1 -1
  151. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/flows.html +1 -1
  153. package/.next/server/app/flows.rsc +3 -3
  154. package/.next/server/app/index.html +1 -1
  155. package/.next/server/app/index.rsc +3 -3
  156. package/.next/server/app/mcp/page.js +6 -6
  157. package/.next/server/app/mcp/page.js.nft.json +1 -1
  158. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  159. package/.next/server/app/mcp-flows/route.js +1 -5
  160. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  161. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  163. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  164. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/mcp.html +1 -1
  166. package/.next/server/app/mcp.rsc +3 -3
  167. package/.next/server/app/models/page.js +2 -3
  168. package/.next/server/app/models/page.js.nft.json +1 -1
  169. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  170. package/.next/server/app/page.js +3 -2
  171. package/.next/server/app/page.js.nft.json +1 -1
  172. package/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/.next/server/app/settings/page.js +4 -3
  174. package/.next/server/app/settings/page.js.nft.json +1 -1
  175. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  176. package/.next/server/app/settings.html +1 -1
  177. package/.next/server/app/settings.rsc +3 -3
  178. package/.next/server/app/v1/chat/completions/route.js +1 -1
  179. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  180. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  182. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  183. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  185. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  186. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  188. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  189. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  191. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  192. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  194. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  195. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +3 -3
  197. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  198. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -0
  200. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js.nft.json +1 -0
  201. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -0
  202. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  203. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  204. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  206. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  207. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/v1/chat/conversations/route.js +2 -2
  209. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  210. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/v1/models/route.js +2 -2
  212. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  213. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app-paths-manifest.json +13 -11
  215. package/.next/server/chunks/{2776.js → 1083.js} +2 -3
  216. package/.next/server/chunks/1119.js +1 -0
  217. package/.next/server/chunks/{7731.js → 1152.js} +2 -2
  218. package/.next/server/chunks/1197.js +2 -0
  219. package/.next/server/chunks/1373.js +1 -1
  220. package/.next/server/chunks/1491.js +1 -0
  221. package/.next/server/chunks/{8460.js → 1991.js} +1 -1
  222. package/.next/server/chunks/2246.js +1 -0
  223. package/.next/server/chunks/2261.js +1 -0
  224. package/.next/server/chunks/227.js +5 -0
  225. package/.next/server/chunks/2350.js +1 -1
  226. package/.next/server/chunks/2430.js +1 -0
  227. package/.next/server/chunks/264.js +1 -1
  228. package/.next/server/chunks/2859.js +3 -7
  229. package/.next/server/chunks/289.js +1 -0
  230. package/.next/server/chunks/3511.js +1 -0
  231. package/.next/server/chunks/{6069.js → 3574.js} +2 -2
  232. package/.next/server/chunks/3778.js +42 -0
  233. package/.next/server/chunks/{8367.js → 38.js} +2 -2
  234. package/.next/server/chunks/3953.js +1 -0
  235. package/.next/server/chunks/3984.js +4 -4
  236. package/.next/server/chunks/4028.js +1 -0
  237. package/.next/server/chunks/4045.js +1 -0
  238. package/.next/server/chunks/4265.js +1 -0
  239. package/.next/server/chunks/4436.js +1 -0
  240. package/.next/server/chunks/{8227.js → 4456.js} +2 -2
  241. package/.next/server/chunks/4498.js +40 -0
  242. package/.next/server/chunks/4637.js +70 -0
  243. package/.next/server/chunks/4671.js +1 -0
  244. package/.next/server/chunks/{1912.js → 4690.js} +2 -2
  245. package/.next/server/chunks/4949.js +1 -0
  246. package/.next/server/chunks/5625.js +28 -0
  247. package/.next/server/chunks/{805.js → 5662.js} +2 -2
  248. package/.next/server/chunks/5708.js +64 -0
  249. package/.next/server/chunks/5734.js +4 -4
  250. package/.next/server/chunks/62.js +1 -0
  251. package/.next/server/chunks/6532.js +52 -0
  252. package/.next/server/chunks/{6760.js → 6772.js} +1 -1
  253. package/.next/server/chunks/{6201.js → 6901.js} +3 -2
  254. package/.next/server/chunks/{9314.js → 6908.js} +3 -3
  255. package/.next/server/chunks/6981.js +1 -0
  256. package/.next/server/chunks/6996.js +3 -3
  257. package/.next/server/chunks/701.js +1 -1
  258. package/.next/server/chunks/7101.js +64 -0
  259. package/.next/server/chunks/7214.js +3 -3
  260. package/.next/server/chunks/724.js +3 -3
  261. package/.next/server/chunks/7362.js +4 -4
  262. package/.next/server/chunks/7463.js +6 -0
  263. package/.next/server/chunks/7506.js +1 -1
  264. package/.next/server/chunks/7635.js +1 -1
  265. package/.next/server/chunks/7821.js +1 -1
  266. package/.next/server/chunks/8739.js +2 -2
  267. package/.next/server/chunks/9509.js +2 -2
  268. package/.next/server/chunks/9632.js +1 -0
  269. package/.next/server/chunks/9957.js +1 -1
  270. package/.next/server/functions-config-manifest.json +3 -3
  271. package/.next/server/instrumentation.js.nft.json +1 -1
  272. package/.next/server/middleware-build-manifest.js +1 -1
  273. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  274. package/.next/server/pages/404.html +1 -1
  275. package/.next/server/pages/500.html +1 -1
  276. package/.next/server/server-reference-manifest.js +1 -1
  277. package/.next/server/server-reference-manifest.json +1 -1
  278. package/.next/static/chunks/1161-970b105d0ab11425.js +1 -0
  279. package/.next/static/chunks/1620-0d8ecd877f123f7b.js +1 -0
  280. package/.next/static/chunks/1871-14c3e63ca865d85e.js +1 -0
  281. package/.next/static/chunks/{1892-359187893bbc7f3a.js → 1892-5c1e38d89e0a5a9c.js} +1 -1
  282. package/.next/static/chunks/3217.058098140ec3f563.js +1 -0
  283. package/.next/static/chunks/3381-5fd2417957ca0881.js +1 -0
  284. package/.next/static/chunks/{3545.d3a512315a9fce3e.js → 3545.353a62a68d3b7fd1.js} +1 -1
  285. package/.next/static/chunks/{2084-2463e1d781bad2a6.js → 3648-733cf7ca4a5d1f19.js} +1 -1
  286. package/.next/static/chunks/3736-5e2b3f6cda1bb923.js +1 -0
  287. package/.next/static/chunks/3930-cc8d73c953811b97.js +1 -0
  288. package/.next/static/chunks/422-268783d9ad5897e1.js +1 -0
  289. package/.next/static/chunks/4365-5d0e3d01c1bc0fdc.js +1 -0
  290. package/.next/static/chunks/5134-e21bd33daaf14ecf.js +1 -0
  291. package/.next/static/chunks/5501-c400aaeaf57e6297.js +1 -0
  292. package/.next/static/chunks/5619-82fc5c3133837739.js +1 -0
  293. package/.next/static/chunks/6013-cb423bc438256acb.js +1 -0
  294. package/.next/static/chunks/6920-a83ad5c0d5a54cf3.js +1 -0
  295. package/.next/static/chunks/7258-e27017c1b98f43f9.js +1 -0
  296. package/.next/static/chunks/{7583.b6c2f8874b6b89cd.js → 7583.26a8c1f6e6823daf.js} +1 -1
  297. package/.next/static/chunks/7687-7edf1a6e1f063b08.js +1 -0
  298. package/.next/static/chunks/8066-c202a83aef15143a.js +1 -0
  299. package/.next/static/chunks/{8187.15bf331f5318c00f.js → 8187.fd653767df53db87.js} +1 -1
  300. package/.next/static/chunks/8755-9f375ec8740fecac.js +1 -0
  301. package/.next/static/chunks/{9164-a56181e5e93cc47e.js → 9164-f54d3531ca1df5f7.js} +1 -1
  302. package/.next/static/chunks/{9747-ffb8be5e59700c27.js → 9587-706bfd1a692c4660.js} +3 -3
  303. package/.next/static/chunks/app/api/backup/route-b296683a5faf800a.js +1 -0
  304. package/.next/static/chunks/app/api/browse/route-b296683a5faf800a.js +1 -0
  305. package/.next/static/chunks/app/api/cwd/route-b296683a5faf800a.js +1 -0
  306. package/.next/static/chunks/app/api/encryption/secure/route-b296683a5faf800a.js +1 -0
  307. package/.next/static/chunks/app/api/env/route-b296683a5faf800a.js +1 -0
  308. package/.next/static/chunks/app/api/flow/[id]/route-b296683a5faf800a.js +1 -0
  309. package/.next/static/chunks/app/api/flow/compile/route-b296683a5faf800a.js +1 -0
  310. package/.next/static/chunks/app/api/flow/generate/route-b296683a5faf800a.js +1 -0
  311. package/.next/static/chunks/app/api/flow/improve/route-b296683a5faf800a.js +1 -0
  312. package/.next/static/chunks/app/api/flow/prompt-renderer/route-b296683a5faf800a.js +1 -0
  313. package/.next/static/chunks/app/api/flow/quick-chat/route-b296683a5faf800a.js +1 -0
  314. package/.next/static/chunks/app/api/flow/repair/route-b296683a5faf800a.js +1 -0
  315. package/.next/static/chunks/app/api/flow/route-b296683a5faf800a.js +1 -0
  316. package/.next/static/chunks/app/api/git/route-b296683a5faf800a.js +1 -0
  317. package/.next/static/chunks/app/api/init/route-b296683a5faf800a.js +1 -0
  318. package/.next/static/chunks/app/api/local-models/capability/route-b296683a5faf800a.js +1 -0
  319. package/.next/static/chunks/app/api/local-models/pull/route-b296683a5faf800a.js +1 -0
  320. package/.next/static/chunks/app/api/local-models/suggest/route-b296683a5faf800a.js +1 -0
  321. package/.next/static/chunks/app/api/mcp/cancel/route-b296683a5faf800a.js +1 -0
  322. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b296683a5faf800a.js +1 -0
  323. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b296683a5faf800a.js +1 -0
  324. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b296683a5faf800a.js +1 -0
  325. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b296683a5faf800a.js +1 -0
  326. package/.next/static/chunks/app/api/mcp/servers/[name]/route-b296683a5faf800a.js +1 -0
  327. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b296683a5faf800a.js +1 -0
  328. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b296683a5faf800a.js +1 -0
  329. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b296683a5faf800a.js +1 -0
  330. package/.next/static/chunks/app/api/mcp/servers/route-b296683a5faf800a.js +1 -0
  331. package/.next/static/chunks/app/api/mcp/test-connection/route-b296683a5faf800a.js +1 -0
  332. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b296683a5faf800a.js +1 -0
  333. package/.next/static/chunks/app/api/mcp-registry/route-b296683a5faf800a.js +1 -0
  334. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b296683a5faf800a.js +1 -0
  335. package/.next/static/chunks/app/api/model/[id]/route-b296683a5faf800a.js +1 -0
  336. package/.next/static/chunks/app/api/model/provider/route-b296683a5faf800a.js +1 -0
  337. package/.next/static/chunks/app/api/model/route-b296683a5faf800a.js +1 -0
  338. package/.next/static/chunks/app/api/model/test/route-b296683a5faf800a.js +1 -0
  339. package/.next/static/chunks/app/api/oauth/callback/route-b296683a5faf800a.js +1 -0
  340. package/.next/static/chunks/app/api/oauth/initiate/route-b296683a5faf800a.js +1 -0
  341. package/.next/static/chunks/app/api/oauth/reset/route-b296683a5faf800a.js +1 -0
  342. package/.next/static/chunks/app/api/planned-executions/[id]/route-b296683a5faf800a.js +1 -0
  343. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b296683a5faf800a.js +1 -0
  344. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b296683a5faf800a.js +1 -0
  345. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b296683a5faf800a.js +1 -0
  346. package/.next/static/chunks/app/api/planned-executions/route-b296683a5faf800a.js +1 -0
  347. package/.next/static/chunks/app/api/restore/route-b296683a5faf800a.js +1 -0
  348. package/.next/static/chunks/app/api/storage/route-b296683a5faf800a.js +1 -0
  349. package/.next/static/chunks/app/api/update/route-b296683a5faf800a.js +1 -0
  350. package/.next/static/chunks/app/api/webhooks/[id]/route-b296683a5faf800a.js +1 -0
  351. package/.next/static/chunks/app/chat/page-a67ad3683443e7ad.js +1 -0
  352. package/.next/static/chunks/app/docs/page-097827ec4dae1d30.js +1 -0
  353. package/.next/static/chunks/app/executions/page-cb0dcc66d84c9bf8.js +1 -0
  354. package/.next/static/chunks/app/flows/page-abdd0642e378c5da.js +1 -0
  355. package/.next/static/chunks/app/{layout-2878f13d7e253503.js → layout-64fc0ae7efe81e3c.js} +1 -1
  356. package/.next/static/chunks/app/mcp/page-7d3a269dce68b529.js +1 -0
  357. package/.next/static/chunks/app/mcp-flows/route-b296683a5faf800a.js +1 -0
  358. package/.next/static/chunks/app/mcp-proxy/[server]/route-b296683a5faf800a.js +1 -0
  359. package/.next/static/chunks/app/models/{error-2b00c98abf1e02cf.js → error-5732fbb053e182c5.js} +1 -1
  360. package/.next/static/chunks/app/models/page-616950f93a1e0027.js +1 -0
  361. package/.next/static/chunks/app/{page-6e18a8cd78b2050e.js → page-77e1ba238b0ee1d0.js} +1 -1
  362. package/.next/static/chunks/app/settings/{page-9430dfdaff87d70c.js → page-199d0ffae9ec7263.js} +1 -1
  363. package/.next/static/chunks/app/v1/chat/completions/route-b296683a5faf800a.js +1 -0
  364. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b296683a5faf800a.js +1 -0
  365. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b296683a5faf800a.js +1 -0
  366. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b296683a5faf800a.js +1 -0
  367. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b296683a5faf800a.js +1 -0
  368. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b296683a5faf800a.js +1 -0
  369. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b296683a5faf800a.js +1 -0
  370. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b296683a5faf800a.js +1 -0
  371. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b296683a5faf800a.js +1 -0
  372. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b296683a5faf800a.js +1 -0
  373. package/.next/static/chunks/app/v1/chat/conversations/route-b296683a5faf800a.js +1 -0
  374. package/.next/static/chunks/app/v1/models/route-b296683a5faf800a.js +1 -0
  375. package/.next/static/chunks/webpack-ef5b2cef70829f42.js +1 -0
  376. package/.next/static/dvSaKx6-EfRNi7Xj-cSv_/_buildManifest.js +1 -0
  377. package/.next/trace +9 -7
  378. package/.next/types/app/api/flow/repair/route.ts +347 -0
  379. package/.next/types/app/v1/chat/conversations/[conversationId]/resources/route.ts +347 -0
  380. package/.next/types/routes.d.ts +3 -1
  381. package/.next/types/validator.ts +18 -0
  382. package/README.md +1 -1
  383. package/package.json +1 -1
  384. package/.next/server/chunks/1050.js +0 -1
  385. package/.next/server/chunks/1403.js +0 -8
  386. package/.next/server/chunks/2439.js +0 -52
  387. package/.next/server/chunks/2666.js +0 -1
  388. package/.next/server/chunks/3310.js +0 -35
  389. package/.next/server/chunks/453.js +0 -1
  390. package/.next/server/chunks/4681.js +0 -1
  391. package/.next/server/chunks/5311.js +0 -1
  392. package/.next/server/chunks/6037.js +0 -41
  393. package/.next/server/chunks/6390.js +0 -28
  394. package/.next/server/chunks/6936.js +0 -37
  395. package/.next/server/chunks/7186.js +0 -2
  396. package/.next/server/chunks/7982.js +0 -1
  397. package/.next/server/chunks/8342.js +0 -1
  398. package/.next/server/chunks/906.js +0 -35
  399. package/.next/server/chunks/9687.js +0 -1
  400. package/.next/server/chunks/9880.js +0 -1
  401. package/.next/server/chunks/9938.js +0 -1
  402. package/.next/static/Fdh7zqKv38txmpLAxepeR/_buildManifest.js +0 -1
  403. package/.next/static/chunks/1374-e084b3c40554288a.js +0 -1
  404. package/.next/static/chunks/2380-5696e0dc0469f6a5.js +0 -1
  405. package/.next/static/chunks/2709-29f91a54eef90221.js +0 -1
  406. package/.next/static/chunks/3217.1a7e24fd70294370.js +0 -1
  407. package/.next/static/chunks/4105-8fddb00196bf3c6d.js +0 -1
  408. package/.next/static/chunks/4244-6f399c7ff9980207.js +0 -1
  409. package/.next/static/chunks/4809-423a2a4a90d02f2c.js +0 -1
  410. package/.next/static/chunks/6084-68908a197e957e5f.js +0 -1
  411. package/.next/static/chunks/6509-3380826fd7c82b4e.js +0 -1
  412. package/.next/static/chunks/6582-6735fdd6b42b5c35.js +0 -1
  413. package/.next/static/chunks/690-391bc0f482a9f67c.js +0 -1
  414. package/.next/static/chunks/7290-fd5bb2c94fd7f605.js +0 -1
  415. package/.next/static/chunks/8098-297bf477152a565b.js +0 -1
  416. package/.next/static/chunks/924-64f908860caf1a35.js +0 -1
  417. package/.next/static/chunks/9286-6ea909e5bf70a97e.js +0 -1
  418. package/.next/static/chunks/9562-93cc45aef3630781.js +0 -1
  419. package/.next/static/chunks/9984-1ed094ea9f5b1f17.js +0 -1
  420. package/.next/static/chunks/app/api/backup/route-1691635994fcddb5.js +0 -1
  421. package/.next/static/chunks/app/api/browse/route-1691635994fcddb5.js +0 -1
  422. package/.next/static/chunks/app/api/cwd/route-1691635994fcddb5.js +0 -1
  423. package/.next/static/chunks/app/api/encryption/secure/route-1691635994fcddb5.js +0 -1
  424. package/.next/static/chunks/app/api/env/route-1691635994fcddb5.js +0 -1
  425. package/.next/static/chunks/app/api/flow/[id]/route-1691635994fcddb5.js +0 -1
  426. package/.next/static/chunks/app/api/flow/compile/route-1691635994fcddb5.js +0 -1
  427. package/.next/static/chunks/app/api/flow/generate/route-1691635994fcddb5.js +0 -1
  428. package/.next/static/chunks/app/api/flow/improve/route-1691635994fcddb5.js +0 -1
  429. package/.next/static/chunks/app/api/flow/prompt-renderer/route-1691635994fcddb5.js +0 -1
  430. package/.next/static/chunks/app/api/flow/quick-chat/route-1691635994fcddb5.js +0 -1
  431. package/.next/static/chunks/app/api/flow/route-1691635994fcddb5.js +0 -1
  432. package/.next/static/chunks/app/api/git/route-1691635994fcddb5.js +0 -1
  433. package/.next/static/chunks/app/api/init/route-1691635994fcddb5.js +0 -1
  434. package/.next/static/chunks/app/api/local-models/capability/route-1691635994fcddb5.js +0 -1
  435. package/.next/static/chunks/app/api/local-models/pull/route-1691635994fcddb5.js +0 -1
  436. package/.next/static/chunks/app/api/local-models/suggest/route-1691635994fcddb5.js +0 -1
  437. package/.next/static/chunks/app/api/mcp/cancel/route-1691635994fcddb5.js +0 -1
  438. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-1691635994fcddb5.js +0 -1
  439. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-1691635994fcddb5.js +0 -1
  440. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-1691635994fcddb5.js +0 -1
  441. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-1691635994fcddb5.js +0 -1
  442. package/.next/static/chunks/app/api/mcp/servers/[name]/route-1691635994fcddb5.js +0 -1
  443. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-1691635994fcddb5.js +0 -1
  444. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-1691635994fcddb5.js +0 -1
  445. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-1691635994fcddb5.js +0 -1
  446. package/.next/static/chunks/app/api/mcp/servers/route-1691635994fcddb5.js +0 -1
  447. package/.next/static/chunks/app/api/mcp/test-connection/route-1691635994fcddb5.js +0 -1
  448. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-1691635994fcddb5.js +0 -1
  449. package/.next/static/chunks/app/api/mcp-registry/route-1691635994fcddb5.js +0 -1
  450. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-1691635994fcddb5.js +0 -1
  451. package/.next/static/chunks/app/api/model/[id]/route-1691635994fcddb5.js +0 -1
  452. package/.next/static/chunks/app/api/model/provider/route-1691635994fcddb5.js +0 -1
  453. package/.next/static/chunks/app/api/model/route-1691635994fcddb5.js +0 -1
  454. package/.next/static/chunks/app/api/model/test/route-1691635994fcddb5.js +0 -1
  455. package/.next/static/chunks/app/api/oauth/callback/route-1691635994fcddb5.js +0 -1
  456. package/.next/static/chunks/app/api/oauth/initiate/route-1691635994fcddb5.js +0 -1
  457. package/.next/static/chunks/app/api/oauth/reset/route-1691635994fcddb5.js +0 -1
  458. package/.next/static/chunks/app/api/planned-executions/[id]/route-1691635994fcddb5.js +0 -1
  459. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-1691635994fcddb5.js +0 -1
  460. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-1691635994fcddb5.js +0 -1
  461. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-1691635994fcddb5.js +0 -1
  462. package/.next/static/chunks/app/api/planned-executions/route-1691635994fcddb5.js +0 -1
  463. package/.next/static/chunks/app/api/restore/route-1691635994fcddb5.js +0 -1
  464. package/.next/static/chunks/app/api/storage/route-1691635994fcddb5.js +0 -1
  465. package/.next/static/chunks/app/api/update/route-1691635994fcddb5.js +0 -1
  466. package/.next/static/chunks/app/api/webhooks/[id]/route-1691635994fcddb5.js +0 -1
  467. package/.next/static/chunks/app/chat/page-6486974f4a6c7b57.js +0 -1
  468. package/.next/static/chunks/app/docs/page-5da72cc6db51f238.js +0 -1
  469. package/.next/static/chunks/app/executions/page-fe19f6a1bd3fe05c.js +0 -1
  470. package/.next/static/chunks/app/flows/page-3b84093cdf2aee84.js +0 -1
  471. package/.next/static/chunks/app/mcp/page-355386ec2a542e42.js +0 -1
  472. package/.next/static/chunks/app/mcp-flows/route-1691635994fcddb5.js +0 -1
  473. package/.next/static/chunks/app/mcp-proxy/[server]/route-1691635994fcddb5.js +0 -1
  474. package/.next/static/chunks/app/models/page-20c80d398bf83fc5.js +0 -1
  475. package/.next/static/chunks/app/v1/chat/completions/route-1691635994fcddb5.js +0 -1
  476. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-1691635994fcddb5.js +0 -1
  477. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-1691635994fcddb5.js +0 -1
  478. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-1691635994fcddb5.js +0 -1
  479. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-1691635994fcddb5.js +0 -1
  480. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-1691635994fcddb5.js +0 -1
  481. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-1691635994fcddb5.js +0 -1
  482. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-1691635994fcddb5.js +0 -1
  483. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-1691635994fcddb5.js +0 -1
  484. package/.next/static/chunks/app/v1/chat/conversations/route-1691635994fcddb5.js +0 -1
  485. package/.next/static/chunks/app/v1/models/route-1691635994fcddb5.js +0 -1
  486. package/.next/static/chunks/webpack-4880945dd240d429.js +0 -1
  487. /package/.next/static/{Fdh7zqKv38txmpLAxepeR → dvSaKx6-EfRNi7Xj-cSv_}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ "use strict";exports.id=2261,exports.ids=[2261,7821],exports.modules={28001:(a,b,c)=>{c.d(b,{internalListResourceTemplates:()=>k,internalListResources:()=>j,internalReadResource:()=>l});var d=c(50846),e=c(2826),f=c(61539),g=c(14214),h=c(81495);let i=(0,d.h)("backend/services/mcp/internalResources");async function j(){try{return{resources:(await (0,f.yP)(200)).map(a=>({uri:a.uri,name:a.name??`${a.kind}-${a.id.slice(0,8)}`,mimeType:a.mimeType,description:function(a){let b=a.producedBy;switch(b.source){case"tool-result":return`Tool result of ${b.server??"?"}/${b.toolName??"?"}${b.nodeId?` (node ${b.nodeId})`:""}`;case"capture":return`Captured output of node ${b.nodeName??b.nodeId??"?"}`;case"mcp-link":return`Resource link from ${b.server??"?"}/${b.toolName??"?"}`;default:return"Run resource"}}(a),size:a.size}))}}catch(a){return i.error("internalListResources failed",a),{resources:[],error:a instanceof Error?a.message:String(a)}}}function k(){return{resourceTemplates:[{uriTemplate:`${e.j}{conversationId}/{resourceId}`,name:"Run-scoped resource",description:"A data artifact captured during a flow run (tool result, node output). List concrete URIs via resources/list."}]}}async function l(a){let b=(0,f.Ns)(a);if(!b)return{success:!1,error:`Not a run-resource URI: ${a}`,statusCode:400};try{let c=await (0,f.gy)(a,{at:Date.now(),source:"mcp-read"});if(!c)return{success:!1,error:`Run resource not found: ${a}`,statusCode:404};try{g.$.emitterFor(b.conversationId)({type:"resource:read",server:h._,uri:a,name:c.entry.name,mimeType:c.entry.mimeType,size:c.entry.size,source:"mcp-read"})}catch{}return{success:!0,data:c.contents}}catch(b){return i.error(`internalReadResource failed for ${a}`,b),{success:!1,error:b instanceof Error?b.message:String(b),statusCode:500}}}},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}};
@@ -0,0 +1,5 @@
1
+ "use strict";exports.id=227,exports.ids=[227],exports.modules={30227:(a,b,c)=>{c.d(b,{cI:()=>p,oV:()=>r,yM:()=>n});var d=c(50846),e=c(88185),f=c(38204),g=c(9312),h=c(14265),i=c(1905),j=c(33233),k=c(25250);let l=(0,d.h)("backend/services/mcp/flowAuthoringTools"),m=["list_flow_building_blocks","validate_flow_spec","create_flow","search_mcp_marketplace","install_mcp_server","install_best_mcp_server"];function n(a){return m.includes(a)}function o(){return{type:"object",properties:{spec:{type:"object",description:"The FlowSpec object (see the tool description for the format)."}},required:["spec"]}}function p(){return[{name:"list_flow_building_blocks",description:'List everything a FlowSpec may reference in this FLUJO instance: configured models (bind to process steps), MCP servers and their tools (attach via "servers"), and existing flows (usable as subflow targets). Call this before authoring a spec.',inputSchema:{type:"object",properties:{}}},{name:"validate_flow_spec",description:`Compile and validate a FlowSpec WITHOUT saving. Returns the compiled flow's validation result (errors block saving; warnings are advisory) so you can iterate until clean, then call create_flow.
2
+
3
+ ${e.R}`,inputSchema:o()},{name:"create_flow",description:`Create a new FLUJO flow from a FlowSpec. The spec is compiled deterministically (layout, ids, and wiring are generated for you) and saved ONLY when validation finds zero errors — otherwise the issues are returned to fix. Use list_flow_building_blocks first to see the models, MCP servers/tools, and existing flows you may reference.
4
+
5
+ ${e.R}`,inputSchema:o()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Installs are gated by consent (SEP-1024): unless this trusted authoring tool is allowed via the mcpAutoInstall settings (trustBrainStem / requireConsent / namespaceAllowlist), the tool returns the exact resolved command + arguments with consentRequired=true INSTEAD of installing, and the caller must obtain explicit approval. Every attempt is written to an audit log (command, args, env NAMES, verification status — never secret values) before any spawn. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument), or the resolved plan when consent is required. First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}},{name:"install_best_mcp_server",description:"Install the BEST WORKING MCP server for a capability, unattended — the recommended way to acquire a capability when you don't already have a specific server name. Searches the registry, RANKS candidates by blended quality (GitHub stars + recent activity, npm weekly downloads, registry status), then installs best→worst until one actually boots and exposes tools (the \"works-gate\"): candidates that need unavailable keys, can't be installed, or start with zero tools are skipped automatically. Same consent/audit rules and third-party-code warning as install_mcp_server. Returns the installed server name + its tools and the list of candidates tried, or needsEnv/consentRequired. Prefer this over search+install for headless self-improvement; use install_mcp_server only when you must pin an exact server.",inputSchema:{type:"object",properties:{capability:{type:"string",description:'Short capability term matched against server names, e.g. "youtube", "email", "browser".'},env:{type:"object",description:"Optional env var values shared across attempted servers (e.g. an API key).",additionalProperties:{type:"string"}}},required:["capability"]}}]}function q(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function r(a,b){try{if("list_flow_building_blocks"===a){let a=await (0,g.jY)();return q(a.blocks)}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await (0,h.e3)(a);return q(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await (0,h.aM)(a,c,{resolveOnly:!0});if(!d.plan)return q(d,!0);let e=await (0,i.Ej)(),f=(0,j.e5)({caller:"authoring-tool",settings:e,registryName:a}),g=(0,k.nO)(d.plan.verificationStatus)?void 0:`Unverified / self-asserted registry entry (status: ${d.plan.verificationStatus}). Registry entries are publisher-asserted — review the command before approving.`;if(await (0,i.NB)((0,j.UM)(d.plan,"authoring-tool",f,!1)),!f.allowed)return q({installed:!1,consentRequired:!0,message:f.message,plan:d.plan,...g?{verificationWarning:g}:{}});let l=await (0,h.aM)(a,c);return await (0,i.NB)((0,j.UM)(l.plan??d.plan,"authoring-tool",f,l.installed,l.error)),q({...l,...g?{verificationWarning:g}:{}},!l.installed)}if("install_best_mcp_server"===a){let a="string"==typeof b?.capability?b.capability:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0;if(!a)return q({error:'Provide a "capability" search term.'},!0);let d=await (0,i.Ej)(),e=(0,j.e5)({caller:"authoring-tool",settings:d,registryName:a});if(!e.allowed){let b=(await (0,h.e3)(a)).find(a=>a.installable),d=b?await (0,h.aM)(b.name,c,{resolveOnly:!0}):null;return d?.plan&&await (0,i.NB)((0,j.UM)(d.plan,"authoring-tool",e,!1)),q({installed:!1,consentRequired:!0,message:e.message,...d?.plan?{plan:d.plan}:{}})}let f=await (0,h.LG)(a,c,{onAttempt:async(a,b)=>{a&&await (0,i.NB)((0,j.UM)(a,"authoring-tool",e,b.installed,b.error))}}),g=f.installed&&!(0,k.nO)(f.plan?.verificationStatus)?`Installed an unverified / self-asserted registry entry (status: ${f.plan?.verificationStatus}).`:void 0;return q({...f,...g?{verificationWarning:g}:{}},!f.installed)}if("validate_flow_spec"===a||"create_flow"===a){let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(b);if(!c)return q({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await (0,f.V)(c,{save:"create_flow"===a});if(!d.success)return q({error:d.error,issues:d.issues??[]},!0);let e=d.flows.length,g=e>1?` (plus ${e-1} nested subflow flow(s))`:"",h={flowId:d.flow.id,flowName:d.flow.name,nodeCount:d.flow.nodes.length,edgeCount:d.flow.edges.length,...e>1?{flows:d.flows.map(a=>({id:a.id,name:a.name}))}:{},validation:d.validation,..."create_flow"===a?{saved:d.saved,...d.saved?{note:`Flow "${d.flow.name}"${g} was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${d.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return q(h,"create_flow"===a&&!d.saved)}return q({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return l.error("authoringCallTool failed",{toolName:a,err:b}),q({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},38204:(a,b,c)=>{c.d(b,{V:()=>j});var d=c(50846),e=c(87821),f=c(81226),g=c(84671),h=c(9312);let i=(0,d.h)("backend/services/flow/compileFlow");async function j(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,h.jY)(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let k=(0,f.dM)(a,d);if(!k.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:k.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(k.flow.id=b.updateFlowId);let l=k.flows.flatMap(a=>(0,g.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),m=(0,h.RB)(k.issues,{issues:l,errorCount:0,warningCount:0,isRunnable:!0}),n=!1;if(b.save&&0===m.errorCount){for(let a of k.flows)await e.flowService.saveFlow(a);n=!0,i.info(`Compiled and saved ${k.flows.length} flow(s); root "${k.flow.name}" (${k.flow.id})`)}else b.save&&i.info(`Compiled flow "${k.flow.name}" has ${m.errorCount} error(s); NOT saved`);return{success:!0,flow:k.flow,flows:k.flows,validation:m,saved:n}}}};
@@ -1 +1 @@
1
- "use strict";exports.id=2350,exports.ids=[2350,7821],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>f,FH:()=>p,Zn:()=>q,dM:()=>o,lk:()=>g});var d=c(32524),e=c(49181);let f=3,g=8;function h(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let i={type:"arrowclosed",width:20,height:20,color:"#1976d2"},j={stroke:"#1976d2",strokeWidth:2},k=new Set(["full-history","latest-message","isolated"]),l=new Set(["steps","final-only"]),m=new Set(["full-conversation","latest-message"]);function n(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 o(a,b={},c={}){let e=[],p=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),q=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),r=b.models??[],s=new Set((b.servers??[]).map(a=>a.name)),t=b.serverTools??{},u=h(c.maxDepth,0,f,f),v=h(c.maxFlows,1,g,g),w=[],x=[...(b.flows??[]).map(a=>a.name)],y=[],z=0;var A=function a(e,f,g){let h=Array.isArray(e?.nodes)?e.nodes:[],o=Array.isArray(e?.edges)?e.edges:[],A=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,x);x.push(A),z++;let B=(0,d.A)(),C=[...g,A],D=new Map,E=[],F=[];for(let c of h){let e=c?.key;if(!e||"string"!=typeof e){p("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(D.has(e)){p("node-duplicate-key",`Duplicate node key "${e}" — keys must be unique; the later node was dropped.`,e);continue}let g=c.type;if("mcp"===g){p("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"!==g&&"process"!==g&&"finish"!==g&&"subflow"!==g){p("unknown-node-type",`Node "${e}" has unknown type "${String(g)}".`,e);continue}let h={},i="string"==typeof c.prompt?c.prompt:void 0;if("start"===g){let{text:a,stripped:b}=n(i??"");b&&q("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"===g){let{text:a,stripped:b}=n(i??"");if(b&&q("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,r);a?h.boundModel=a:(h.boundModel=c.model,q("model-unresolved",`Node "${e}": model "${c.model}" does not match any configured model (by id, display name, or name).`,e))}void 0!==c.inputMode&&(k.has(c.inputMode)?(h.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(h.isolatedPrompt=c.isolatedPrompt)):q("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:q("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,e))}else if("subflow"===g){if(function(c,d,e,f,g){if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&q("subflow-multiple-sources",`Node "${d}": a subflow node should have only one of "flow", "subflowSpec", or "generateSubflow"; applying precedence flow > subflowSpec > generateSubflow.`,d),c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return p("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}(c.flow,[...b.flows??[],...y]);return a?g.subflowId=a:p("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>u)return p("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${u} level(s); this inline subflow was not compiled.`,d);if(z>=v)return p("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${v} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?g.subflowId=b.id:p("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return p("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);p("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), or "generateSubflow".`,d)}(c,e,f,C,h),void 0!==c.inputMode&&(k.has(c.inputMode)?h.inputMode=c.inputMode:q("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(l.has(c.outputMode)?h.outputMode=c.outputMode:q("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,e)),void 0!==i){let{text:a,stripped:b}=n(i);b&&q("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)}let j={id:(0,d.A)(),type:g,position:{x:0,y:0},data:{label:c.label||`${g.charAt(0).toUpperCase()}${g.slice(1)} Node`,type:g,...c.description?{description:c.description}:{},properties:h}};if(D.set(e,j),E.push(j),"process"===g&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,f=b?.name;if(!f||"string"!=typeof f){q("server-missing-name",`Node "${e}": a server reference is missing its "name"; skipped.`,e);continue}if(a.has(f))continue;a.add(f),s.has(f)||q("server-unknown",`Node "${e}": MCP server "${f}" is not configured in FLUJO.`,e);let g=t[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&&q("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}}};E.push(h),F.push({processKey:e,mcpNode:h})}}else"process"!==g&&Array.isArray(c.servers)&&c.servers.length>0&&q("servers-on-non-process",`Node "${e}": only process nodes can have "servers"; ignored.`,e)}if(0===D.size)return p("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let G=[],H=new Set;for(let a of o){let b=a?.from,c=a?.to,d=b?D.get(b):void 0,e=c?D.get(c):void 0;if(!d||!e){p("edge-unknown-node",`Edge "${String(b)}" -> "${String(c)}" references a node key that does not exist (or was dropped).`);continue}if(d===e){p("edge-self-loop",`Edge "${b}" -> "${c}": a node cannot connect to itself.`);continue}if("start"===e.type){p("edge-into-start",`Edge "${b}" -> "${c}": nothing may connect INTO a start node.`);continue}if("finish"===d.type){p("edge-out-of-finish",`Edge "${b}" -> "${c}": nothing may connect OUT OF a finish node.`);continue}let f=`${b}->${c}`;if(H.has(f)){q("edge-duplicate",`Edge "${b}" -> "${c}" appears more than once; kept the first.`);continue}H.add(f);let g=!0===a.bidirectional;g&&("start"===d.type||"finish"===e.type)&&(q("bidirectional-illegal",`Edge "${b}" -> "${c}" cannot be bidirectional; downgraded to one-way.`),g=!1),G.push(function(a,b,c){let d=`${a.type}-bottom`,e=`${b.type}-top`;return{id:`${a.id}:${d}->${b.id}:${e}`,source:a.id,sourceHandle:d,target:b.id,targetHandle:e,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{}},animated:!0}}(d,e,g))}for(let{processKey:a,mcpNode:b}of F){let c=D.get(a);G.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...i},markerStart:{...i},style:{...j}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c)a.data?.edgeType!=="mcp"&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target));let g=[...b.values()],h=g.filter(a=>"start"===a.type),i=h.length>0?h:g.slice(0,1),j=new Map,k=i.map(a=>({id:a.id,depth:0}));for(let a of k)j.set(a.id,0);for(;k.length;){let{id:a,depth:b}=k.shift();for(let c of f.get(a)??[])j.has(c)||(j.set(c,b+1),k.push({id:c,depth:b+1}))}let l=0;for(let a of j.values())l=Math.max(l,a);for(let a of g)j.has(a.id)||j.set(a.id,l+1);let m=new Map;for(let[a,c]of b)m.set(c.id,a);let n=new Map;for(let a of g){let b=m.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=j.get(a.id),f=n.get(d)??0;n.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let o=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=o.get(a)??0;o.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}}(0,D,G,F,0===f?c.positions:void 0);let I={id:B,name:A,...e?.description?{description:e.description}:{},nodes:E,edges:G};return w.push(I),y.push({id:I.id,name:I.name}),I}(a,0,[]),B=w,C=e;let D=C.filter(a=>"error"===a.severity).length;return{flow:A,flows:B,issues:C,errorCount:D,warningCount:C.length-D}}function p(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);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else"subflow"===b&&("string"==typeof c.subflowId&&c.subflowId&&(d.flow=c.subflowId),"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));f.push(d)}let g=[];for(let a of c)a.data?.edgeType!=="mcp"&&a.source&&a.target&&(d.has(a.source)||d.has(a.target)||g.push({from:a.source,to:a.target,...a.data?.bidirectional?{bidirectional:!0}:{}}));return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function q(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(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v}};
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}};
@@ -0,0 +1 @@
1
+ exports.id=2430,exports.ids=[2430],exports.modules={8188:(a,b,c)=>{"use strict";c.d(b,{A:()=>K});var d=c(21124),e=c(38301),f=c(27114),g=c(79515),h=c(81637),i=c(43312),j=c(41893),k=c(30818),l=c(423),m=c(98463),n=c(44079),o=c(12033),p=c(91034),q=c(56667),r=c(96955),s=c(18467),t=c(76133),u=c(83434),v=c(19815),w=c(40512),x=c(83899),y=c(52327),z=c(8521),A=c(88745),B=c(91059),C=c(19925),D=c(68730),E=c(8165),F=c(65343);let G=({title:a,attempt:b})=>(0,d.jsxs)(h.default,{sx:{mb:2},children:[(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:.5},children:[b.ok?(0,d.jsx)(E.A,{color:"success",fontSize:"small"}):(0,d.jsx)(F.A,{color:"error",fontSize:"small"}),(0,d.jsx)(g.default,{variant:"subtitle2",children:a}),"number"==typeof b.status&&(0,d.jsx)(j.A,{size:"small",label:`HTTP ${b.status}`}),(0,d.jsx)(j.A,{size:"small",variant:"outlined",label:`${b.durationMs} ms`})]}),b.ok?(0,d.jsxs)(g.default,{variant:"body2",color:"text.secondary",sx:{pl:3},children:["Response: ",b.content?`"${b.content}"`:"(empty)"]}):(0,d.jsxs)(h.default,{sx:{pl:3},children:[(0,d.jsx)(g.default,{variant:"body2",color:"error.main",children:b.error?.message}),(b.error?.code||b.error?.type)&&(0,d.jsxs)(g.default,{variant:"caption",color:"text.secondary",display:"block",children:[b.error?.type?`type: ${b.error.type}`:"",b.error?.type&&b.error?.code?" \xb7 ":"",b.error?.code?`code: ${b.error.code}`:""]}),b.error?.retryAfter&&(0,d.jsxs)(g.default,{variant:"caption",color:"text.secondary",display:"block",children:["retry-after: ",b.error.retryAfter,"s"]}),b.error?.body!==void 0&&(0,d.jsx)(h.default,{component:"pre",sx:{mt:.5,p:1,bgcolor:"action.hover",borderRadius:1,fontSize:"0.7rem",overflowX:"auto",maxHeight:160},children:JSON.stringify(b.error.body,null,2)})]})]}),H=({open:a,modelLabel:b,loading:c,result:e,error:f,onClose:i,onRetry:j})=>(0,d.jsxs)(w.A,{open:a,onClose:i,maxWidth:"sm",fullWidth:!0,children:[(0,d.jsxs)(x.A,{children:["Test model: ",b]}),(0,d.jsx)(y.A,{dividers:!0,children:c?(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",gap:2,py:3},children:[(0,d.jsx)(z.default,{size:24}),(0,d.jsx)(g.default,{variant:"body2",children:"Sending a direct test request (SDK + axios)…"})]}):f?(0,d.jsx)(A.A,{severity:"error",children:f}):e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(A.A,{severity:e.ok?"success":"warning",sx:{mb:2},children:e.diagnosis}),(0,d.jsxs)(g.default,{variant:"caption",color:"text.secondary",display:"block",sx:{mb:2},children:["model: ",e.model,e.baseUrl?` \xb7 ${e.baseUrl}`:"",e.provider?` \xb7 ${e.provider}`:""]}),(0,d.jsx)(B.A,{sx:{mb:2}}),(0,d.jsx)(G,{title:"OpenAI SDK (used by flows)",attempt:e.sdk}),(0,d.jsx)(G,{title:"axios (independent cross-check)",attempt:e.axios})]}):null}),(0,d.jsxs)(C.A,{children:[(0,d.jsx)(D.A,{onClick:j,disabled:c,children:"Run again"}),(0,d.jsx)(D.A,{onClick:i,variant:"contained",children:"Close"})]})]});var I=c(78352);let J=(0,v.h)("frontend/components/models/list/ModelCard"),K=({model:a,onEdit:b,onDelete:c,folder:v,folders:w=[],onSetFolder:x,selectable:y=!1,selected:z=!1,onSelect:A})=>{let[B,C]=(0,e.useState)(!1),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[K,L]=(0,e.useState)(null),[M,N]=(0,e.useState)(null),O=async()=>{E(!0),L(null),G(null);try{let b=await (0,u.X)().testModel({modelId:a.id});G(b)}catch(b){J.error("Model test failed",{modelId:a.id,error:b}),L(b instanceof Error?b.message:"Failed to run test")}finally{E(!1)}},P=(0,d.jsx)(d.Fragment,{children:(0,d.jsxs)(f.A,{sx:{flexGrow:1},children:[(0,d.jsx)(g.default,{variant:"h6",gutterBottom:!0,children:a.displayName||a.name}),(0,d.jsx)(g.default,{variant:"body2",color:"text.secondary",sx:{mb:2},style:{display:"-webkit-box",WebkitLineClamp:3,WebkitBoxOrient:"vertical",overflow:"hidden",textOverflow:"ellipsis"},children:a.description}),(0,d.jsxs)(h.default,{sx:{mb:1},children:[(0,d.jsxs)(g.default,{variant:"body2",color:"text.secondary",children:["Provider: ",(0,t.T_)(a.provider,a.adapter).label]}),a.displayName&&(0,d.jsxs)(g.default,{variant:"body2",color:"text.secondary",noWrap:!0,children:["Model: ",a.name]}),"number"==typeof a.contextWindow&&(0,d.jsxs)(g.default,{variant:"body2",color:"text.secondary",children:["Context: ",a.contextWindow.toLocaleString()," tokens"]})]}),a.baseUrl&&(0,d.jsx)(i.A,{title:a.baseUrl,arrow:!0,placement:"top",children:(0,d.jsxs)(g.default,{variant:"body2",color:"text.secondary",noWrap:!0,children:["Base URL: ",a.baseUrl]})}),v&&(0,d.jsx)(j.A,{icon:(0,d.jsx)(s.A,{}),label:v,size:"small",variant:"outlined",sx:{mt:1,maxWidth:"100%"}})]})});return y?(0,d.jsx)(k.A,{elevation:z?4:2,role:"radio","aria-checked":z,sx:{height:"100%",display:"flex",flexDirection:"column",border:a=>z?`2px solid ${a.palette.primary.main}`:"2px solid transparent",transition:"border-color 120ms, box-shadow 120ms"},children:(0,d.jsx)(l.A,{onClick:()=>A?.(a.id),sx:{height:"100%",display:"flex",flexDirection:"column",alignItems:"stretch"},children:P})}):(0,d.jsxs)(k.A,{elevation:2,sx:{height:"100%",display:"flex",flexDirection:"column"},children:[P,(0,d.jsxs)(m.A,{disableSpacing:!0,children:[(0,d.jsx)(i.A,{title:"Test model (direct SDK call, no flow)",arrow:!0,children:(0,d.jsx)(n.A,{"aria-label":"test",onClick:()=>{C(!0),O()},children:(0,d.jsx)(q.A,{})})}),(0,d.jsx)(n.A,{"aria-label":"edit",onClick:b,children:(0,d.jsx)(o.A,{})}),(0,d.jsx)(n.A,{"aria-label":"delete",onClick:c,children:(0,d.jsx)(p.A,{})}),x&&(0,d.jsx)(i.A,{title:"Move to folder…",arrow:!0,children:(0,d.jsx)(n.A,{"aria-label":"move to folder",onClick:a=>N(a.currentTarget),sx:{ml:"auto"},children:(0,d.jsx)(r.A,{})})})]}),x&&(0,d.jsx)(I.A,{anchorEl:M,open:!!M,currentFolder:v,folders:w,onClose:()=>N(null),onAssign:x}),(0,d.jsx)(H,{open:B,modelLabel:a.displayName||a.name,loading:D,result:F,error:K,onClose:()=>C(!1),onRetry:O})]})}},32640:(a,b,c)=>{"use strict";c.d(b,{Lg:()=>g,eZ:()=>i,fC:()=>f,h5:()=>j});var d=c(76133),e=c(7329);let f={"name-asc":"Name (A-Z)","name-desc":"Name (Z-A)",provider:"Provider","context-desc":"Context (largest)","context-asc":"Context (smallest)"},g=a=>a.displayName||a.name||"",h=a=>(0,d.T_)(a.provider,a.adapter).label;function i(a,b){switch(b){case"provider":{let b=h(a);return{key:`provider:${b}`,label:b}}case"context-asc":case"context-desc":var c;return"number"!=typeof(c=a.contextWindow)||Number.isNaN(c)?{key:"ctx:unknown",label:"Unknown context"}:c<=8e3?{key:"ctx:<=8k",label:"≤ 8K tokens"}:c<=32e3?{key:"ctx:8k-32k",label:"8K–32K tokens"}:c<=128e3?{key:"ctx:32k-128k",label:"32K–128K tokens"}:c<=1e6?{key:"ctx:128k-1m",label:"128K–1M tokens"}:{key:"ctx:>1m",label:"> 1M tokens"};default:return(0,e.po)(g(a))}}function j(a,b){return[...a].sort((a,c)=>{switch(b){case"name-asc":return g(a).localeCompare(g(c));case"name-desc":return g(c).localeCompare(g(a));case"provider":return h(a).localeCompare(h(c))||g(a).localeCompare(g(c));case"context-desc":case"context-asc":{let d="number"!=typeof a.contextWindow||Number.isNaN(a.contextWindow)?void 0:a.contextWindow,e="number"!=typeof c.contextWindow||Number.isNaN(c.contextWindow)?void 0:c.contextWindow;if(void 0===d&&void 0===e)return g(a).localeCompare(g(c));if(void 0===d)return 1;if(void 0===e)return -1;let f="context-desc"===b?e-d:d-e;return 0!==f?f:g(a).localeCompare(g(c))}default:return 0}})}},43010:()=>{},64535:(a,b,c)=>{"use strict";c.d(b,{A$:()=>j,X8:()=>g,YP:()=>k,js:()=>i});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a,b,c){return`\${${a}:${b}__${c}}`}function h(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}function i(a){return a.startsWith("${")&&a.endsWith("}")?h(a.slice(2,-1)):null}function j(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=h(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}function k(a){var b,c;return"tool"===a.kind&&"handoff"===a.server?`handoff:${a.name}`:`${a.kind}:${b=a.server,c=a.name,`${b}__${c}`}`}},76133:(a,b,c)=>{"use strict";c.d(b,{T_:()=>e,xx:()=>d});let d=[{id:"openai",label:"OpenAI",provider:"openai",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://api.openai.com/v1",showBaseUrl:!0},{id:"openrouter",label:"OpenRouter",provider:"openrouter",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://openrouter.ai/api/v1",showBaseUrl:!0},{id:"requesty",label:"Requesty",provider:"requesty",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://router.requesty.ai/v1",showBaseUrl:!0},{id:"xai",label:"X.ai",provider:"xai",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://api.x.ai/v1",showBaseUrl:!0},{id:"ollama",label:"Ollama",provider:"ollama",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"http://localhost:11434/v1",showBaseUrl:!0},{id:"litellm",label:"LiteLLM",provider:"litellm",adapter:"openai",sdkLabel:"OpenAI SDK (via LiteLLM Proxy)",baseUrl:"http://localhost:4000/v1",showBaseUrl:!0},{id:"gemini-openai",label:"Gemini (OpenAI Format)",provider:"gemini",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai/",showBaseUrl:!0},{id:"gemini-native",label:"Gemini (Native)",provider:"gemini",adapter:"gemini",sdkLabel:"GenAI SDK",baseUrl:"",showBaseUrl:!1,defaultModels:["gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash"]},{id:"anthropic-openai",label:"Anthropic (OpenAI Format)",provider:"anthropic",adapter:"openai",sdkLabel:"OpenAI SDK",baseUrl:"https://api.anthropic.com/v1/",showBaseUrl:!0},{id:"anthropic-native",label:"Anthropic (Native)",provider:"anthropic",adapter:"anthropic",sdkLabel:"Anthropic SDK",baseUrl:"",showBaseUrl:!1,defaultModels:["claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5-20251001","claude-fable-5"]},{id:"claude-subscription",label:"Claude Subscription",provider:"claude-subscription",adapter:"claude-cli",sdkLabel:"Claude CLI",baseUrl:"",showBaseUrl:!1,defaultModels:["opus","sonnet","haiku","fable"]}];function e(a,b){let c=a||"openai",e=b||"openai";return d.find(a=>a.provider===c&&a.adapter===e)||d.find(a=>a.provider===c)||d[0]}},85838:(a,b,c)=>{"use strict";c.d(b,{A:()=>C});var d=c(21124),e=c(38301),f=c(19815),g=c(90647),h=c(49257),i=c(74576),j=c(81637),k=c(79515),l=c(48317),m=c(7499),n=c(54573),o=c(9604),p=c(22813),q=c(28055);c(43010);var r=c(64535);let s=(0,f.h)("frontend/components/shared/PromptBuilder"),t=a=>{s.debug("Deserializing markdown to Slate value");let b=a.split("\n").map(a=>({type:"paragraph",children:(a=>{let b=(0,r.A$)(a);if(0===b.length)return[{text:a}];let c=[],d=0;for(let e of b)e.index>d&&c.push({text:a.slice(d,e.index)}),c.push({type:"binding-reference",kind:e.kind,server:e.server,name:e.name,children:[{text:""}]}),d=e.index+e.fullMatch.length;return d<a.length&&c.push({text:a.slice(d)}),c})(a)}));return b.length>0?b:[{type:"paragraph",children:[{text:""}]}]},u=a=>{s.debug("Serializing Slate value to markdown");let b=0,c=a.map(a=>a.children?a.children.map(a=>g.EY.isText(a)?a.text:"binding-reference"===a.type?(b++,(0,r.X8)(a.kind,a.server,a.name)):"").join(""):"").join("\n");return b>0&&s.debug(`Serialized ${b} binding references`),c},v=a=>{let{attributes:b,children:c,element:e}=a;return"binding-reference"===e.type?(0,d.jsxs)("span",{...b,className:"tool-reference-wrapper",children:[(0,d.jsx)(()=>{let a=(0,h.Zi)(),b=(a=>"tool"===a.kind&&"handoff"===a.server)(e),c="resource"===e.kind?"resource":b?"handoff":"",f=()=>{let b=h.rL.findPath(a,e);s.debug(`Removing binding reference: ${e.kind}:${e.server}:${e.name}`),g.gB.removeNodes(a,{at:b})};return(0,d.jsxs)("span",{contentEditable:!1,className:`tool-reference-container ${c}`,children:[(0,d.jsx)("span",{className:`tool-reference ${c}`,children:(0,r.YP)(e)}),(0,d.jsx)("span",{className:`tool-reference-delete ${c}`,role:"button",tabIndex:0,onClick:a=>{a.preventDefault(),a.stopPropagation(),f()},onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),a.stopPropagation(),f())},children:"\xd7"})]})},{}),c," "]}):(0,d.jsx)("p",{...b,children:c})},w=a=>{let{attributes:b,children:c,leaf:e}=a,f=c;return e.bold&&(f=(0,d.jsx)("strong",{children:f})),e.italic&&(f=(0,d.jsx)("em",{children:f})),e.code&&(f=(0,d.jsx)("code",{children:f})),(0,d.jsx)("span",{...b,children:f})},x=({server:a,name:b})=>{let c="handoff"===a,[f,g]=(0,e.useState)(null),[h,i]=(0,e.useState)(!0);return((0,e.useEffect)(()=>{let c=!1;return(async()=>{try{i(!0);let d=await q.S.listServerTools(a),e=d.tools?.find(a=>a.name===b);c||g(e||null)}catch(c){s.error(`Failed to fetch tool info for ${a}:${b}`,c)}finally{c||i(!1)}})(),()=>{c=!0}},[a,b]),h)?(0,d.jsx)("span",{className:`tool-reference-preview loading ${c?"handoff":""}`,children:`tool:${a}__${b}`}):f?(0,d.jsxs)("span",{className:`tool-reference-preview ${c?"handoff":""}`,children:["[The user is referencing a ",c?"handoff":"tool"," `tool:",a,"__",b,"` (",f.description||"No description",")]"]}):(0,d.jsx)("span",{className:`tool-reference-preview not-found ${c?"handoff":""}`,children:`tool:${a}__${b} (Tool not found)`})},y=({server:a,name:b})=>{let[c,f]=(0,e.useState)(null),[g,h]=(0,e.useState)(!0);return((0,e.useEffect)(()=>{let c=!1;return(async()=>{try{h(!0);let d=await q.S.listServerResources(a),e=[...d.resources||[],...d.resourceTemplates||[]].find(a=>a.uri===b||a.uriTemplate===b);c||f(e?.description||e?.name||null)}catch(c){s.error(`Failed to fetch resource info for ${a}:${b}`,c)}finally{c||h(!1)}})(),()=>{c=!0}},[a,b]),g)?(0,d.jsx)("span",{className:"tool-reference-preview loading resource",children:`resource:${a}__${b}`}):(0,d.jsxs)("span",{className:"tool-reference-preview resource",children:["[The contents of resource `",b,"` from `",a,"`",c?` (${c})`:""," will be inserted here]"]})},z=({binding:a})=>"resource"===a.kind?(0,d.jsx)(y,{server:a.server,name:a.name}):(0,d.jsx)(x,{server:a.server,name:a.name}),A=({value:a})=>{s.debug("Rendering preview");let b=[],c=0;for(let d of(0,r.A$)(a))d.index>c&&b.push({type:"text",value:a.slice(c,d.index)}),b.push({type:"binding",binding:d,key:d.index}),c=d.index+d.fullMatch.length;c<a.length&&b.push({type:"text",value:a.slice(c)});let e=[],f=[],g=()=>{e.push((0,d.jsx)("p",{children:f},`p-${e.length}`)),f=[]};for(let a of b)if("text"===a.type){let b=a.value.split("\n");for(let a=0;a<b.length;a++)f.push(b[a]),a<b.length-1&&g()}else f.push((0,d.jsx)(z,{binding:a.binding},`binding-${a.key}`));return f.length>0&&g(),(0,d.jsx)("div",{className:"preview-content",children:e})},B=(0,e.forwardRef)(({value:a,onChange:b,label:c="Prompt Builder",height:f=300,onModeChange:q,customPreviewRenderer:x},y)=>{s.info("PromptBuilder initialized");let z=(0,e.useMemo)(()=>{let a=(0,i.$k)((0,h.o$)((0,g.ie)())),{isInline:b,isVoid:c}=a;return a.isInline=a=>"binding-reference"===a.type||b(a),a.isVoid=a=>"binding-reference"===a.type||c(a),a},[]),[B,C]=(0,e.useState)("raw"),[D,E]=(0,e.useState)(()=>t(a||"")),F=(0,e.useRef)(!1),[,G]=(0,e.useState)(0);(0,e.useImperativeHandle)(y,()=>({insertText:a=>{s.info(`insertText called with text length: ${a.length}`);let c=(0,r.js)(a);if(c){s.info(`Inserting ${c.kind} reference: ${c.server}:${c.name}`);let a={type:"binding-reference",kind:c.kind,server:c.server,name:c.name,children:[{text:""}]};z.selection||g.gB.select(z,g.KE.end(z,[])),g.gB.insertNodes(z,a),g.gB.move(z),G(a=>a+1),E([...z.children])}else z.selection||g.gB.select(z,g.KE.end(z,[])),g.gB.insertText(z,a);b(u(z.children)),s.info("insertText completed successfully")},getMode:()=>B})),(0,e.useEffect)(()=>{u(D)!==u(t(a||""))&&(s.debug("External value change detected"),F.current=!0,E(t(a||"")))},[a,D]);let H=(0,e.useCallback)(a=>{if(F.current){F.current=!1;return}E(a),b(u(a))},[b]);return(0,d.jsxs)(j.default,{sx:{width:"100%",height:"100%",display:"flex",flexDirection:"column"},children:[c&&(0,d.jsx)(k.default,{variant:"subtitle1",gutterBottom:!0,sx:{fontWeight:"medium",mb:1},children:c}),(0,d.jsx)(j.default,{sx:{mb:1},children:(0,d.jsxs)(l.A,{value:B,exclusive:!0,onChange:(a,b)=>{null!==b&&(s.info(`Mode changed from ${B} to ${b}`),C(b),q&&q(b))},size:"small",children:[(0,d.jsxs)(m.A,{value:"raw",children:[(0,d.jsx)(o.A,{fontSize:"small",sx:{mr:.5}}),"Raw"]}),(0,d.jsxs)(m.A,{value:"preview",children:[(0,d.jsx)(p.A,{fontSize:"small",sx:{mr:.5}}),"Preview"]})]})}),(0,d.jsx)(n.A,{elevation:0,sx:{border:"1px solid rgba(0, 0, 0, 0.12)",borderRadius:1,overflow:"hidden",flexGrow:1,display:"flex",flexDirection:"column"},children:"raw"===B?(0,d.jsx)(j.default,{className:"slate-editor-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto",p:2},children:(0,d.jsx)(h.A,{editor:z,initialValue:D,onChange:H,children:(0,d.jsx)(h.Fo,{className:"slate-editor",renderElement:v,renderLeaf:w,placeholder:"Write your prompt here..."})})}):x?(0,d.jsx)(j.default,{className:"custom-preview-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto"},children:x()}):(0,d.jsx)(j.default,{className:"preview-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto",p:2},children:(0,d.jsx)(A,{value:a})})})]})});B.displayName="PromptBuilder";let C=B}};