flujo-ai 3.17.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +196 -181
  3. package/.next/app-path-routes-manifest.json +6 -4
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/server/app/_not-found/page.js +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_not-found.html +1 -1
  10. package/.next/server/app/_not-found.rsc +1 -1
  11. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  12. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/encryption/secure/route.js +1 -1
  16. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  17. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/flow/[id]/route.js +1 -1
  20. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  21. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/flow/compile/route.js +1 -1
  23. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  24. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/flow/generate/route.js +1 -19
  26. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  27. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/improve/route.js +1 -0
  29. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -0
  30. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -0
  31. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  32. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/quick-chat/route.js +1 -0
  35. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/route.js +1 -1
  38. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/init/route.js +1 -1
  42. package/.next/server/app/api/init/route.js.nft.json +1 -1
  43. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  48. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  49. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  51. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  54. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  55. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/mcp/servers/route.js +1 -1
  75. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  78. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  79. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  81. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  82. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  85. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/model/[id]/route.js +1 -1
  88. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/model/provider/route.js +1 -1
  91. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  92. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/model/route.js +1 -1
  94. package/.next/server/app/api/model/route.js.nft.json +1 -1
  95. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/model/test/route.js +1 -1
  97. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  98. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/oauth/reset/route.js +1 -1
  102. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  103. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  105. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  107. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  109. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/planned-executions/route.js +1 -1
  112. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  113. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  115. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  119. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  120. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/chat/page.js +9 -9
  122. package/.next/server/app/chat/page.js.nft.json +1 -1
  123. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  124. package/.next/server/app/chat.html +1 -1
  125. package/.next/server/app/chat.rsc +2 -2
  126. package/.next/server/app/docs/page.js +5 -2
  127. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  128. package/.next/server/app/docs.html +1 -1
  129. package/.next/server/app/docs.rsc +2 -2
  130. package/.next/server/app/executions/page.js +3 -3
  131. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  132. package/.next/server/app/executions.html +1 -1
  133. package/.next/server/app/executions.rsc +2 -2
  134. package/.next/server/app/flows/page.js +3 -39
  135. package/.next/server/app/flows/page.js.nft.json +1 -1
  136. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/flows.html +1 -1
  138. package/.next/server/app/flows.rsc +2 -2
  139. package/.next/server/app/index.html +1 -1
  140. package/.next/server/app/index.rsc +2 -2
  141. package/.next/server/app/mcp/page.js +23 -27
  142. package/.next/server/app/mcp/page.js.nft.json +1 -1
  143. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  144. package/.next/server/app/mcp-flows/route.js +3 -3
  145. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  146. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  148. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  149. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/mcp.html +1 -1
  151. package/.next/server/app/mcp.rsc +2 -2
  152. package/.next/server/app/models/page.js +3 -3
  153. package/.next/server/app/models/page.js.nft.json +1 -1
  154. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  155. package/.next/server/app/page.js +1 -1
  156. package/.next/server/app/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/settings/page.js +2 -2
  158. package/.next/server/app/settings/page.js.nft.json +1 -1
  159. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/settings.html +1 -1
  161. package/.next/server/app/settings.rsc +2 -2
  162. package/.next/server/app/v1/chat/completions/route.js +1 -1
  163. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  164. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  166. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  167. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +1 -1
  169. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  170. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  172. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  173. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  175. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  176. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  178. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  179. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  181. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  182. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  184. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  185. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  187. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  188. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  190. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  191. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/v1/models/route.js +1 -1
  193. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  194. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app-paths-manifest.json +6 -4
  196. package/.next/server/chunks/1403.js +4 -2
  197. package/.next/server/chunks/1912.js +38 -0
  198. package/.next/server/chunks/2350.js +1 -0
  199. package/.next/server/chunks/{7531.js → 2439.js} +2 -2
  200. package/.next/server/chunks/{5504.js → 264.js} +2 -2
  201. package/.next/server/chunks/2776.js +1 -1
  202. package/.next/server/chunks/2859.js +3 -3
  203. package/.next/server/chunks/3304.js +1 -1
  204. package/.next/server/chunks/3310.js +35 -0
  205. package/.next/server/chunks/3984.js +4 -4
  206. package/.next/server/chunks/453.js +1 -0
  207. package/.next/server/chunks/4681.js +1 -1
  208. package/.next/server/chunks/5311.js +1 -0
  209. package/.next/server/chunks/6037.js +41 -0
  210. package/.next/server/chunks/6069.js +6 -0
  211. package/.next/server/chunks/6201.js +5 -0
  212. package/.next/server/chunks/6826.js +1 -0
  213. package/.next/server/chunks/6936.js +8 -6
  214. package/.next/server/chunks/701.js +1 -1
  215. package/.next/server/chunks/7186.js +2 -0
  216. package/.next/server/chunks/7214.js +2 -2
  217. package/.next/server/chunks/7362.js +6 -6
  218. package/.next/server/chunks/7506.js +1 -1
  219. package/.next/server/chunks/7635.js +1 -1
  220. package/.next/server/chunks/7821.js +1 -1
  221. package/.next/server/chunks/7982.js +1 -1
  222. package/.next/server/chunks/8227.js +2 -0
  223. package/.next/server/chunks/8342.js +1 -0
  224. package/.next/server/chunks/{3309.js → 8367.js} +2 -2
  225. package/.next/server/chunks/8739.js +1 -1
  226. package/.next/server/chunks/906.js +35 -0
  227. package/.next/server/chunks/{5888.js → 9314.js} +3 -3
  228. package/.next/server/chunks/9509.js +2 -2
  229. package/.next/server/chunks/9687.js +1 -0
  230. package/.next/server/chunks/9880.js +1 -0
  231. package/.next/server/chunks/9938.js +1 -1
  232. package/.next/server/chunks/9957.js +1 -1
  233. package/.next/server/instrumentation.js.nft.json +1 -1
  234. package/.next/server/middleware-build-manifest.js +1 -1
  235. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  236. package/.next/server/pages/404.html +1 -1
  237. package/.next/server/pages/500.html +1 -1
  238. package/.next/server/server-reference-manifest.js +1 -1
  239. package/.next/server/server-reference-manifest.json +1 -1
  240. package/.next/static/Fdh7zqKv38txmpLAxepeR/_buildManifest.js +1 -0
  241. package/.next/static/chunks/1374-e084b3c40554288a.js +1 -0
  242. package/.next/static/chunks/1892-359187893bbc7f3a.js +1 -0
  243. package/.next/static/chunks/{7126-2bafddf1b09cacac.js → 2084-2463e1d781bad2a6.js} +1 -1
  244. package/.next/static/chunks/4105-8fddb00196bf3c6d.js +1 -0
  245. package/.next/static/chunks/4244-6f399c7ff9980207.js +1 -0
  246. package/.next/static/chunks/4809-423a2a4a90d02f2c.js +1 -0
  247. package/.next/static/chunks/6084-68908a197e957e5f.js +1 -0
  248. package/.next/static/chunks/6509-3380826fd7c82b4e.js +1 -0
  249. package/.next/static/chunks/7290-fd5bb2c94fd7f605.js +1 -0
  250. package/.next/static/chunks/{7583.8a518353bd072db9.js → 7583.b6c2f8874b6b89cd.js} +1 -1
  251. package/.next/static/chunks/8098-297bf477152a565b.js +1 -0
  252. package/.next/static/chunks/{8187.5d6523f30e705998.js → 8187.15bf331f5318c00f.js} +1 -1
  253. package/.next/static/chunks/{9164-36fedeb944fa71e9.js → 9164-a56181e5e93cc47e.js} +1 -1
  254. package/.next/static/chunks/924-64f908860caf1a35.js +1 -0
  255. package/.next/static/chunks/9286-6ea909e5bf70a97e.js +1 -0
  256. package/.next/static/chunks/9747-ffb8be5e59700c27.js +8 -0
  257. package/.next/static/chunks/app/api/backup/route-1691635994fcddb5.js +1 -0
  258. package/.next/static/chunks/app/api/browse/route-1691635994fcddb5.js +1 -0
  259. package/.next/static/chunks/app/api/cwd/route-1691635994fcddb5.js +1 -0
  260. package/.next/static/chunks/app/api/encryption/secure/route-1691635994fcddb5.js +1 -0
  261. package/.next/static/chunks/app/api/env/route-1691635994fcddb5.js +1 -0
  262. package/.next/static/chunks/app/api/flow/[id]/route-1691635994fcddb5.js +1 -0
  263. package/.next/static/chunks/app/api/flow/compile/route-1691635994fcddb5.js +1 -0
  264. package/.next/static/chunks/app/api/flow/generate/route-1691635994fcddb5.js +1 -0
  265. package/.next/static/chunks/app/api/flow/improve/route-1691635994fcddb5.js +1 -0
  266. package/.next/static/chunks/app/api/flow/prompt-renderer/route-1691635994fcddb5.js +1 -0
  267. package/.next/static/chunks/app/api/flow/quick-chat/route-1691635994fcddb5.js +1 -0
  268. package/.next/static/chunks/app/api/flow/route-1691635994fcddb5.js +1 -0
  269. package/.next/static/chunks/app/api/git/route-1691635994fcddb5.js +1 -0
  270. package/.next/static/chunks/app/api/init/route-1691635994fcddb5.js +1 -0
  271. package/.next/static/chunks/app/api/local-models/capability/route-1691635994fcddb5.js +1 -0
  272. package/.next/static/chunks/app/api/local-models/pull/route-1691635994fcddb5.js +1 -0
  273. package/.next/static/chunks/app/api/local-models/suggest/route-1691635994fcddb5.js +1 -0
  274. package/.next/static/chunks/app/api/mcp/cancel/route-1691635994fcddb5.js +1 -0
  275. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-1691635994fcddb5.js +1 -0
  276. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-1691635994fcddb5.js +1 -0
  277. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-1691635994fcddb5.js +1 -0
  278. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-1691635994fcddb5.js +1 -0
  279. package/.next/static/chunks/app/api/mcp/servers/[name]/route-1691635994fcddb5.js +1 -0
  280. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-1691635994fcddb5.js +1 -0
  281. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-1691635994fcddb5.js +1 -0
  282. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-1691635994fcddb5.js +1 -0
  283. package/.next/static/chunks/app/api/mcp/servers/route-1691635994fcddb5.js +1 -0
  284. package/.next/static/chunks/app/api/mcp/test-connection/route-1691635994fcddb5.js +1 -0
  285. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-1691635994fcddb5.js +1 -0
  286. package/.next/static/chunks/app/api/mcp-registry/route-1691635994fcddb5.js +1 -0
  287. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-1691635994fcddb5.js +1 -0
  288. package/.next/static/chunks/app/api/model/[id]/route-1691635994fcddb5.js +1 -0
  289. package/.next/static/chunks/app/api/model/provider/route-1691635994fcddb5.js +1 -0
  290. package/.next/static/chunks/app/api/model/route-1691635994fcddb5.js +1 -0
  291. package/.next/static/chunks/app/api/model/test/route-1691635994fcddb5.js +1 -0
  292. package/.next/static/chunks/app/api/oauth/callback/route-1691635994fcddb5.js +1 -0
  293. package/.next/static/chunks/app/api/oauth/initiate/route-1691635994fcddb5.js +1 -0
  294. package/.next/static/chunks/app/api/oauth/reset/route-1691635994fcddb5.js +1 -0
  295. package/.next/static/chunks/app/api/planned-executions/[id]/route-1691635994fcddb5.js +1 -0
  296. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-1691635994fcddb5.js +1 -0
  297. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-1691635994fcddb5.js +1 -0
  298. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-1691635994fcddb5.js +1 -0
  299. package/.next/static/chunks/app/api/planned-executions/route-1691635994fcddb5.js +1 -0
  300. package/.next/static/chunks/app/api/restore/route-1691635994fcddb5.js +1 -0
  301. package/.next/static/chunks/app/api/storage/route-1691635994fcddb5.js +1 -0
  302. package/.next/static/chunks/app/api/update/route-1691635994fcddb5.js +1 -0
  303. package/.next/static/chunks/app/api/webhooks/[id]/route-1691635994fcddb5.js +1 -0
  304. package/.next/static/chunks/app/chat/page-6486974f4a6c7b57.js +1 -0
  305. package/.next/static/chunks/app/docs/page-5da72cc6db51f238.js +1 -0
  306. package/.next/static/chunks/app/executions/page-fe19f6a1bd3fe05c.js +1 -0
  307. package/.next/static/chunks/app/flows/page-3b84093cdf2aee84.js +1 -0
  308. package/.next/static/chunks/app/mcp/page-355386ec2a542e42.js +1 -0
  309. package/.next/static/chunks/app/mcp-flows/route-1691635994fcddb5.js +1 -0
  310. package/.next/static/chunks/app/mcp-proxy/[server]/route-1691635994fcddb5.js +1 -0
  311. package/.next/static/chunks/app/models/page-20c80d398bf83fc5.js +1 -0
  312. package/.next/static/chunks/app/settings/page-9430dfdaff87d70c.js +1 -0
  313. package/.next/static/chunks/app/v1/chat/completions/route-1691635994fcddb5.js +1 -0
  314. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-1691635994fcddb5.js +1 -0
  315. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-1691635994fcddb5.js +1 -0
  316. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-1691635994fcddb5.js +1 -0
  317. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-1691635994fcddb5.js +1 -0
  318. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-1691635994fcddb5.js +1 -0
  319. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-1691635994fcddb5.js +1 -0
  320. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-1691635994fcddb5.js +1 -0
  321. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-1691635994fcddb5.js +1 -0
  322. package/.next/static/chunks/app/v1/chat/conversations/route-1691635994fcddb5.js +1 -0
  323. package/.next/static/chunks/app/v1/models/route-1691635994fcddb5.js +1 -0
  324. package/.next/static/chunks/{webpack-4015bd6f241940a1.js → webpack-4880945dd240d429.js} +1 -1
  325. package/.next/trace +7 -7
  326. package/.next/types/app/api/flow/improve/route.ts +347 -0
  327. package/.next/types/app/api/flow/quick-chat/route.ts +347 -0
  328. package/.next/types/routes.d.ts +3 -1
  329. package/.next/types/validator.ts +18 -0
  330. package/README.md +1 -1
  331. package/package.json +1 -1
  332. package/.next/server/chunks/117.js +0 -1
  333. package/.next/server/chunks/1519.js +0 -1
  334. package/.next/server/chunks/1877.js +0 -32
  335. package/.next/server/chunks/1905.js +0 -2
  336. package/.next/server/chunks/3243.js +0 -1
  337. package/.next/server/chunks/3370.js +0 -38
  338. package/.next/server/chunks/407.js +0 -6
  339. package/.next/server/chunks/5558.js +0 -1
  340. package/.next/server/chunks/5587.js +0 -1
  341. package/.next/server/chunks/5838.js +0 -1
  342. package/.next/server/chunks/5935.js +0 -2
  343. package/.next/server/chunks/6283.js +0 -2
  344. package/.next/server/chunks/6523.js +0 -1
  345. package/.next/server/chunks/7328.js +0 -1
  346. package/.next/server/chunks/8434.js +0 -1
  347. package/.next/server/chunks/9188.js +0 -1
  348. package/.next/static/KMEKXonxBXI3WzCfozXx4/_buildManifest.js +0 -1
  349. package/.next/static/chunks/1226-af62e7a89fa9032e.js +0 -1
  350. package/.next/static/chunks/1979-e2d922370ecef69f.js +0 -1
  351. package/.next/static/chunks/2158-0d6bb5a428ed0688.js +0 -1
  352. package/.next/static/chunks/510-e39ad4e1fae6dd1f.js +0 -1
  353. package/.next/static/chunks/539-8ddf886986877cfc.js +0 -1
  354. package/.next/static/chunks/5781-4328d17aad13f908.js +0 -8
  355. package/.next/static/chunks/5961-828f4f7efc3e1381.js +0 -1
  356. package/.next/static/chunks/687-98ba5f5043866f48.js +0 -1
  357. package/.next/static/chunks/6902-cba4e59c4295b4a0.js +0 -1
  358. package/.next/static/chunks/8862-1170dad1d6f3cd39.js +0 -1
  359. package/.next/static/chunks/8867-3f7163974605427b.js +0 -1
  360. package/.next/static/chunks/8989-401559d9f3bc80a0.js +0 -1
  361. package/.next/static/chunks/9414-3cd5c3976cba66b2.js +0 -1
  362. package/.next/static/chunks/app/api/backup/route-7248529e02c31012.js +0 -1
  363. package/.next/static/chunks/app/api/browse/route-7248529e02c31012.js +0 -1
  364. package/.next/static/chunks/app/api/cwd/route-7248529e02c31012.js +0 -1
  365. package/.next/static/chunks/app/api/encryption/secure/route-7248529e02c31012.js +0 -1
  366. package/.next/static/chunks/app/api/env/route-7248529e02c31012.js +0 -1
  367. package/.next/static/chunks/app/api/flow/[id]/route-7248529e02c31012.js +0 -1
  368. package/.next/static/chunks/app/api/flow/compile/route-7248529e02c31012.js +0 -1
  369. package/.next/static/chunks/app/api/flow/generate/route-7248529e02c31012.js +0 -1
  370. package/.next/static/chunks/app/api/flow/prompt-renderer/route-7248529e02c31012.js +0 -1
  371. package/.next/static/chunks/app/api/flow/route-7248529e02c31012.js +0 -1
  372. package/.next/static/chunks/app/api/git/route-7248529e02c31012.js +0 -1
  373. package/.next/static/chunks/app/api/init/route-7248529e02c31012.js +0 -1
  374. package/.next/static/chunks/app/api/local-models/capability/route-7248529e02c31012.js +0 -1
  375. package/.next/static/chunks/app/api/local-models/pull/route-7248529e02c31012.js +0 -1
  376. package/.next/static/chunks/app/api/local-models/suggest/route-7248529e02c31012.js +0 -1
  377. package/.next/static/chunks/app/api/mcp/cancel/route-7248529e02c31012.js +0 -1
  378. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7248529e02c31012.js +0 -1
  379. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7248529e02c31012.js +0 -1
  380. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7248529e02c31012.js +0 -1
  381. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7248529e02c31012.js +0 -1
  382. package/.next/static/chunks/app/api/mcp/servers/[name]/route-7248529e02c31012.js +0 -1
  383. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7248529e02c31012.js +0 -1
  384. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7248529e02c31012.js +0 -1
  385. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7248529e02c31012.js +0 -1
  386. package/.next/static/chunks/app/api/mcp/servers/route-7248529e02c31012.js +0 -1
  387. package/.next/static/chunks/app/api/mcp/test-connection/route-7248529e02c31012.js +0 -1
  388. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7248529e02c31012.js +0 -1
  389. package/.next/static/chunks/app/api/mcp-registry/route-7248529e02c31012.js +0 -1
  390. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7248529e02c31012.js +0 -1
  391. package/.next/static/chunks/app/api/model/[id]/route-7248529e02c31012.js +0 -1
  392. package/.next/static/chunks/app/api/model/provider/route-7248529e02c31012.js +0 -1
  393. package/.next/static/chunks/app/api/model/route-7248529e02c31012.js +0 -1
  394. package/.next/static/chunks/app/api/model/test/route-7248529e02c31012.js +0 -1
  395. package/.next/static/chunks/app/api/oauth/callback/route-7248529e02c31012.js +0 -1
  396. package/.next/static/chunks/app/api/oauth/initiate/route-7248529e02c31012.js +0 -1
  397. package/.next/static/chunks/app/api/oauth/reset/route-7248529e02c31012.js +0 -1
  398. package/.next/static/chunks/app/api/planned-executions/[id]/route-7248529e02c31012.js +0 -1
  399. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7248529e02c31012.js +0 -1
  400. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7248529e02c31012.js +0 -1
  401. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7248529e02c31012.js +0 -1
  402. package/.next/static/chunks/app/api/planned-executions/route-7248529e02c31012.js +0 -1
  403. package/.next/static/chunks/app/api/restore/route-7248529e02c31012.js +0 -1
  404. package/.next/static/chunks/app/api/storage/route-7248529e02c31012.js +0 -1
  405. package/.next/static/chunks/app/api/update/route-7248529e02c31012.js +0 -1
  406. package/.next/static/chunks/app/api/webhooks/[id]/route-7248529e02c31012.js +0 -1
  407. package/.next/static/chunks/app/chat/page-c759cf382bcabd77.js +0 -1
  408. package/.next/static/chunks/app/docs/page-fca894f60b9174e9.js +0 -1
  409. package/.next/static/chunks/app/executions/page-4155f9f682ee6f84.js +0 -1
  410. package/.next/static/chunks/app/flows/page-4e1ec20653e5dc86.js +0 -1
  411. package/.next/static/chunks/app/mcp/page-5234695929980171.js +0 -1
  412. package/.next/static/chunks/app/mcp-flows/route-7248529e02c31012.js +0 -1
  413. package/.next/static/chunks/app/mcp-proxy/[server]/route-7248529e02c31012.js +0 -1
  414. package/.next/static/chunks/app/models/page-4fc4d100a8b1d4b4.js +0 -1
  415. package/.next/static/chunks/app/settings/page-9a2bfb8d5bdba29e.js +0 -1
  416. package/.next/static/chunks/app/v1/chat/completions/route-7248529e02c31012.js +0 -1
  417. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7248529e02c31012.js +0 -1
  418. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7248529e02c31012.js +0 -1
  419. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7248529e02c31012.js +0 -1
  420. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7248529e02c31012.js +0 -1
  421. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7248529e02c31012.js +0 -1
  422. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7248529e02c31012.js +0 -1
  423. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7248529e02c31012.js +0 -1
  424. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7248529e02c31012.js +0 -1
  425. package/.next/static/chunks/app/v1/chat/conversations/route-7248529e02c31012.js +0 -1
  426. package/.next/static/chunks/app/v1/models/route-7248529e02c31012.js +0 -1
  427. /package/.next/static/{KMEKXonxBXI3WzCfozXx4 → Fdh7zqKv38txmpLAxepeR}/_ssgManifest.js +0 -0
@@ -5,6 +5,6 @@ ${b.condition}
5
5
  Tool result (untrusted data):
6
6
  \`\`\`json
7
7
  ${m}
8
- \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,48999)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403),c.e(7214),c.e(7821)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
8
+ \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,24423)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(1403),c.e(7214),c.e(7821)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
9
9
 
10
10
  ${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=7635,exports.ids=[7635],exports.modules={27635:(a,b,c)=>{c.d(b,{z:()=>C});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736);function p(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}var q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(59911);let u=(0,g.h)("backend/services/scheduler/state"),v=a=>`planned-execution-state/${a}`;async function w(a){try{return await (0,e.YM)(v(a),{})}catch(b){return u.error(`Failed to load trigger state for ${a}:`,b),{}}}async function x(a,b){await (0,e.VH)(v(a),b)}async function y(a){await (0,e.N2)(v(a))}let z=(0,g.h)("backend/services/scheduler/index"),A={version:1,paused:!1,executions:[]};class B{async start(){this.started||(this.started=!0,z.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){z.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void z.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),z.error(`Failed to arm "${b.name}" (${b.id}):`,c)}z.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await w(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await x(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),z.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await x(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await w(a.id);await x(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>z.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,23514)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>z.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||p(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(5504)]).then(c.bind(c,23514)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>w(a.id),saveState:async b=>{let c=await w(a.id);await x(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>w(a.id),saveState:async b=>{let c=await w(a.id);await x(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;default:z.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,A);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();await this.saveFile({...b,paused:a}),await this.reconcile()}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,t.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(a.id))return{error:"The id must be a UUID"};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await (0,t.xC)(a),await y(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:p(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}default:return"Unknown trigger type"}}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.running.get(a.id);return{armed:c,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"})}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)()){let f,g=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:g,finishedAt:g,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,t.Hy)(a.id,c),z.info(`Skipped fire for "${a.name}" — encryption locked`),c}if(this.running.has(a.id)){let c={runId:e,conversationId:"",firedAt:g,finishedAt:g,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,t.Hy)(a.id,c),z.info(`Skipped overlapping fire for "${a.name}"`),c}this.running.set(a.id,g);let i=(0,d.A)();try{z.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,t.Sw)(a.id),h=d.length>0?d[d.length-1]:null,j=[...d].reverse().find(a=>a.outputText),k={executionName:a.name,trigger:b.kind,now:g,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:h?{at:h.firedAt,status:h.status}:null,lastOutput:j?{at:j.firedAt,text:j.outputText}:null,nextPlannedRun:this.getStatus(a).nextRun??null},{runFlow:l}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403),c.e(7214),c.e(7821)]).then(c.bind(c,57214)),m=await l({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,k),mode:a.saveConversations?"conversation":"ephemeral",conversationId:i,requireApproval:!1,debug:!1,userTurn:!0});f={runId:e,conversationId:i,firedAt:g,finishedAt:new Date().toISOString(),status:"completed"===m.status?"completed":"error",triggerSummary:b.summary,outputText:this.truncateOutput(m.outputText),usage:m.usage,error:"completed"===m.status?void 0:m.error?.message??`Run ended with status "${m.status}"`}}catch(c){f={runId:e,conversationId:i,firedAt:g,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},z.error(`Run crashed for "${a.name}":`,c)}finally{this.running.delete(a.id)}return await (0,t.Hy)(a.id,f),f}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
1
+ "use strict";exports.id=7635,exports.ids=[7635],exports.modules={27635:(a,b,c)=>{c.d(b,{z:()=>C});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736);function p(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}var q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(59911);let u=(0,g.h)("backend/services/scheduler/state"),v=a=>`planned-execution-state/${a}`;async function w(a){try{return await (0,e.YM)(v(a),{})}catch(b){return u.error(`Failed to load trigger state for ${a}:`,b),{}}}async function x(a,b){await (0,e.VH)(v(a),b)}async function y(a){await (0,e.N2)(v(a))}let z=(0,g.h)("backend/services/scheduler/index"),A={version:1,paused:!1,executions:[]};class B{async start(){this.started||(this.started=!0,z.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){z.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void z.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),z.error(`Failed to arm "${b.name}" (${b.id}):`,c)}z.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await w(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await x(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),z.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await x(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await w(a.id);await x(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>z.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,23514)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>z.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||p(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,23514)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>w(a.id),saveState:async b=>{let c=await w(a.id);await x(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>w(a.id),saveState:async b=>{let c=await w(a.id);await x(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;default:z.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,A);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();await this.saveFile({...b,paused:a}),await this.reconcile()}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,t.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(a.id))return{error:"The id must be a UUID"};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await (0,t.xC)(a),await y(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:p(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}default:return"Unknown trigger type"}}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.running.get(a.id);return{armed:c,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"})}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)()){let f,g=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:g,finishedAt:g,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,t.Hy)(a.id,c),z.info(`Skipped fire for "${a.name}" — encryption locked`),c}if(this.running.has(a.id)){let c={runId:e,conversationId:"",firedAt:g,finishedAt:g,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,t.Hy)(a.id,c),z.info(`Skipped overlapping fire for "${a.name}"`),c}this.running.set(a.id,g);let i=(0,d.A)();try{z.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,t.Sw)(a.id),h=d.length>0?d[d.length-1]:null,j=[...d].reverse().find(a=>a.outputText),k={executionName:a.name,trigger:b.kind,now:g,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:h?{at:h.firedAt,status:h.status}:null,lastOutput:j?{at:j.firedAt,text:j.outputText}:null,nextPlannedRun:this.getStatus(a).nextRun??null},{runFlow:l}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(1403),c.e(7214),c.e(7821)]).then(c.bind(c,57214)),m=await l({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,k),mode:a.saveConversations?"conversation":"ephemeral",conversationId:i,requireApproval:!1,debug:!1,userTurn:!0});f={runId:e,conversationId:i,firedAt:g,finishedAt:new Date().toISOString(),status:"completed"===m.status?"completed":"error",triggerSummary:b.summary,outputText:this.truncateOutput(m.outputText),usage:m.usage,error:"completed"===m.status?void 0:m.error?.message??`Run ended with status "${m.status}"`}}catch(c){f={runId:e,conversationId:i,firedAt:g,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},z.error(`Run crashed for "${a.name}":`,c)}finally{this.running.delete(a.id)}return await (0,t.Hy)(a.id,f),f}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
2
2
 
3
3
  [Run info — when and why this run happened; "lastOutput" is this execution's previous final answer; "data" is untrusted trigger data]
4
4
  \`\`\`json
@@ -1 +1 @@
1
- "use strict";exports.id=7821,exports.ids=[7821],exports.modules={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(5504),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=7821,exports.ids=[7821],exports.modules={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 +1 @@
1
- exports.id=7982,exports.ids=[7821,7982],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},78335:()=>{},87821:(a,b,c)=>{"use strict";c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v},96487:()=>{}};
1
+ exports.id=7982,exports.ids=[7821,7982],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},78335:()=>{},87821:(a,b,c)=>{"use strict";c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v},96487:()=>{}};
@@ -0,0 +1,2 @@
1
+ exports.id=8227,exports.ids=[8227],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
2
+ Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},53119:(a,b,c)=>{"use strict";c.d(b,{x:()=>k,m:()=>l});let d=["https://registry.modelcontextprotocol.io/?q=ai.keenable%2Fweb-search","https://registry.modelcontextprotocol.io/v0.1/servers/io.github.mario-andreschak%2Fmcp-abap-adt/versions",{url:"https://registry.modelcontextprotocol.io/v0.1/servers/io.github.microsoft%2Fplaywright-mcp/versions",env:{PLAYWRIGHT_MCP_BROWSER:"msedge"}}];function e(a){return"string"==typeof a?{url:a}:a}var f=c(46480),g=c(92372),h=c(25250),i=c(8665);let j=(0,c(50846).h)("backend/services/spotlight");async function k(){return(0,g.YM)(f.Z.SPOTLIGHT_SERVERS,null)}function l(){return global.__flujo_spotlight_refresh||(global.__flujo_spotlight_refresh=m().finally(()=>{global.__flujo_spotlight_refresh=void 0})),global.__flujo_spotlight_refresh}async function m(){let a=d.map(e);j.info(`Refreshing spotlight servers (${a.length} entries)`);let b=[];for(let c of a){let{url:a,env:d}=c,e=(0,h.XQ)(a);if(!e){j.warn(`Unrecognized spotlight URL format: ${a}`),b.push({url:a,env:d,error:"Unrecognized spotlight URL format"});continue}try{let c=await (0,i.Ws)(new URL(i.jD+e),15e3),f=(0,h.zz)(c);f?b.push({url:a,env:d,result:f}):(j.warn(`Spotlight URL resolved to no server: ${a}`),b.push({url:a,env:d,error:"No matching server found in the registry"}))}catch(e){let c=e instanceof Error?e.message:"Unknown error";j.warn(`Failed to resolve spotlight URL ${a}: ${c}`),b.push({url:a,env:d,error:c})}await new Promise(a=>setTimeout(a,250))}let c={updatedAt:new Date().toISOString(),entries:b},l=await k();if(l){for(let a of c.entries)if(!a.result){let b=l.entries.find(b=>b.url===a.url&&b.result);b?.result&&(a.result=b.result)}}await (0,g.VH)(f.Z.SPOTLIGHT_SERVERS,c);let m=c.entries.filter(a=>a.result).length;return j.info(`Spotlight refresh complete: ${m}/${c.entries.length} entries resolved`),c}},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},72937:(a,b,c)=>{"use strict";c.d(b,{H:()=>j,t:()=>m});var d=c(92372),e=c(23514),f=c(53119),g=c(27635),h=c(58739);let i=(0,c(50846).h)("backend/init");function j(){return global.__flujo_init_promise||(global.__flujo_init_promise=k().catch(a=>{throw global.__flujo_init_promise=void 0,a})),global.__flujo_init_promise}async function k(){if(await (0,d.Pv)(),(0,f.m)().catch(a=>i.warn("Spotlight refresh failed at startup:",a)),await (0,h.isEncryptionLocked)())return void i.info("Encryption locked — deferring MCP/scheduler startup until unlock");await l()}function l(){return global.__flujo_secret_services_promise||(global.__flujo_secret_services_promise=(async()=>{i.info("Initializing MCP servers"),await e.mcpService.startEnabledServers().catch(a=>{i.error("Failed to start enabled servers:",a)}),await (0,g.z)().start().catch(a=>i.error("Failed to start scheduler:",a))})()),global.__flujo_secret_services_promise}async function m(){await (0,h.isUserEncryptionEnabled)()&&(i.info("Encryption unlocked — starting deferred MCP/scheduler startup"),await l())}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},96487:()=>{}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=8342,exports.ids=[8342],exports.modules={354:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M20 6h-8l-2-2H7.17l4 4H20v9.17l1.76 1.76c.15-.28.24-.59.24-.93V8c0-1.1-.9-2-2-2M2.1 2.1.69 3.51l1.56 1.56c-.15.28-.24.59-.24.93L2 18c0 1.1.9 2 2 2h13.17l3.31 3.31 1.41-1.41zM4 18V6.83L15.17 18z"}),"FolderOffOutlined")},423:(a,b,c)=>{c.d(b,{A:()=>s});var d=c(38301),e=c(43249),f=c(2783),g=c(18168),h=c(68333),i=c(6636),j=c(29565),k=c(33105);function l(a){return(0,k.Ay)("MuiCardActionArea",a)}let m=(0,j.A)("MuiCardActionArea",["root","focusVisible","focusHighlight"]);var n=c(14328),o=c(20385),p=c(21124);let q=(0,g.Ay)(n.A,{name:"MuiCardActionArea",slot:"Root",overridesResolver:(a,b)=>b.root})((0,h.A)(({theme:a})=>({display:"block",textAlign:"inherit",borderRadius:"inherit",width:"100%",[`&:hover .${m.focusHighlight}`]:{opacity:(a.vars||a).palette.action.hoverOpacity,"@media (hover: none)":{opacity:0}},[`&.${m.focusVisible} .${m.focusHighlight}`]:{opacity:(a.vars||a).palette.action.focusOpacity}}))),r=(0,g.Ay)("span",{name:"MuiCardActionArea",slot:"FocusHighlight",overridesResolver:(a,b)=>b.focusHighlight})((0,h.A)(({theme:a})=>({overflow:"hidden",pointerEvents:"none",position:"absolute",top:0,right:0,bottom:0,left:0,borderRadius:"inherit",opacity:0,backgroundColor:"currentcolor",transition:a.transitions.create("opacity",{duration:a.transitions.duration.short})}))),s=d.forwardRef(function(a,b){let c=(0,i.b)({props:a,name:"MuiCardActionArea"}),{children:d,className:g,focusVisibleClassName:h,slots:j={},slotProps:k={},...m}=c,n=(a=>{let{classes:b}=a;return(0,f.A)({root:["root"],focusHighlight:["focusHighlight"]},l,b)})(c),s={slots:j,slotProps:k},[t,u]=(0,o.A)("root",{elementType:q,externalForwardedProps:{...s,...m},shouldForwardComponentProp:!0,ownerState:c,ref:b,className:(0,e.A)(n.root,g),additionalProps:{focusVisibleClassName:(0,e.A)(h,n.focusVisible)}}),[v,w]=(0,o.A)("focusHighlight",{elementType:r,externalForwardedProps:s,ownerState:c,ref:b,className:n.focusHighlight});return(0,p.jsxs)(t,{...u,children:[d,(0,p.jsx)(v,{...w})]})})},1312:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2m0 12H4V6h5.17l1.41 1.41.59.59H20zm-7.84-6H8v2h4.16l-1.59 1.59L11.99 17 16 13.01 11.99 9l-1.41 1.41z"}),"DriveFileMoveOutlined")},5748:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M13 13v8h8v-8zM3 21h8v-8H3zM3 3v8h8V3zm13.66-1.31L11 7.34 16.66 13l5.66-5.66z"}),"Widgets")},7503:(a,b,c)=>{c.d(b,{A:()=>p});var d=c(38301),e=c(43249),f=c(2783),g=c(41126),h=c(18168),i=c(6636),j=c(79515),k=c(29565),l=c(33105);function m(a){return(0,l.Ay)("MuiDialogContentText",a)}(0,k.A)("MuiDialogContentText",["root"]);var n=c(21124);let o=(0,h.Ay)(j.default,{shouldForwardProp:a=>(0,g.A)(a)||"classes"===a,name:"MuiDialogContentText",slot:"Root",overridesResolver:(a,b)=>b.root})({}),p=d.forwardRef(function(a,b){let c=(0,i.b)({props:a,name:"MuiDialogContentText"}),{children:d,className:g,...h}=c,j=(a=>{let{classes:b}=a,c=(0,f.A)({root:["root"]},m,b);return{...b,...c}})(h);return(0,n.jsx)(o,{component:"p",variant:"body1",color:"textSecondary",ref:b,ownerState:h,className:(0,e.A)(j.root,g),...c,classes:j})})},18467:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"m9.17 6 2 2H20v10H4V6zM10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8z"}),"FolderOutlined")},21358:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)([(0,e.jsx)("path",{d:"M12 5.99 19.53 19H4.47zM12 2 1 21h22z"},"0"),(0,e.jsx)("path",{d:"M13 16h-2v2h2zm0-6h-2v5h2z"},"1")],"WarningAmber")},27114:(a,b,c)=>{c.d(b,{A:()=>n});var d=c(38301),e=c(43249),f=c(2783),g=c(18168),h=c(6636),i=c(29565),j=c(33105);function k(a){return(0,j.Ay)("MuiCardContent",a)}(0,i.A)("MuiCardContent",["root"]);var l=c(21124);let m=(0,g.Ay)("div",{name:"MuiCardContent",slot:"Root",overridesResolver:(a,b)=>b.root})({padding:16,"&:last-child":{paddingBottom:24}}),n=d.forwardRef(function(a,b){let c=(0,h.b)({props:a,name:"MuiCardContent"}),{className:d,component:g="div",...i}=c,j={...c,component:g},n=(a=>{let{classes:b}=a;return(0,f.A)({root:["root"]},k,b)})(j);return(0,l.jsx)(m,{as:g,className:(0,e.A)(n.root,d),ownerState:j,ref:b,...i})})},30137:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close")},30583:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(44548),e=c(22845);function f({props:a,name:b,defaultTheme:c,themeId:f}){let g=(0,e.A)(c);return f&&(g=g[f]||g),(0,d.A)({theme:g,name:b,props:a})}},30818:(a,b,c)=>{c.d(b,{A:()=>o});var d=c(38301),e=c(43249),f=c(2783),g=c(18168),h=c(6636),i=c(54573),j=c(29565),k=c(33105);function l(a){return(0,k.Ay)("MuiCard",a)}(0,j.A)("MuiCard",["root"]);var m=c(21124);let n=(0,g.Ay)(i.A,{name:"MuiCard",slot:"Root",overridesResolver:(a,b)=>b.root})({overflow:"hidden"}),o=d.forwardRef(function(a,b){let c=(0,h.b)({props:a,name:"MuiCard"}),{className:d,raised:g=!1,...i}=c,j={...c,raised:g},k=(a=>{let{classes:b}=a;return(0,f.A)({root:["root"]},l,b)})(j);return(0,m.jsx)(n,{className:(0,e.A)(k.root,d),elevation:g?8:void 0,ref:b,ownerState:j,...i})})},31973:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M20 6h-8l-2-2H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2m0 12H4V6h5.17l2 2H20zm-8-4h2v2h2v-2h2v-2h-2v-2h-2v2h-2z"}),"CreateNewFolderOutlined")},38435:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(57931).Ay)()},38941:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2m0 16H8V7h11z"}),"ContentCopy")},40443:(a,b,c)=>{c.d(b,{A:()=>g,Y:()=>f});var d=c(29565),e=c(33105);function f(a){return(0,e.Ay)("MuiListItemButton",a)}let g=(0,d.A)("MuiListItemButton",["root","focusVisible","dense","alignItemsFlexStart","disabled","divider","gutters","selected"])},44548:(a,b,c)=>{c.d(b,{A:()=>e});var d=c(75575);function e(a){let{theme:b,name:c,props:e}=a;return b&&b.components&&b.components[c]&&b.components[c].defaultProps?(0,d.A)(b.components[c].defaultProps,e):e}},53222:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4z"}),"Refresh")},56685:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(27080),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M20 4H4c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2m0 14H4V8h16zm-2-1h-6v-2h6zM7.5 17l-1.41-1.41L8.67 13l-2.59-2.59L7.5 9l4 4z"}),"Terminal")},71439:(a,b,c)=>{c.d(b,{Ay:()=>x});var d=c(38301),e=c(43249),f=c(2783),g=c(7103),h=c(18168),i=c(68333),j=c(6636),k=c(67934),l=c(26636),m=c(55470),n=c(29565),o=c(33105);function p(a){return(0,o.Ay)("MuiListItem",a)}(0,n.A)("MuiListItem",["root","container","dense","alignItemsFlexStart","divider","gutters","padding","secondaryAction"]);var q=c(40443);function r(a){return(0,o.Ay)("MuiListItemSecondaryAction",a)}(0,n.A)("MuiListItemSecondaryAction",["root","disableGutters"]);var s=c(21124);let t=(0,h.Ay)("div",{name:"MuiListItemSecondaryAction",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,c.disableGutters&&b.disableGutters]}})({position:"absolute",right:16,top:"50%",transform:"translateY(-50%)",variants:[{props:({ownerState:a})=>a.disableGutters,style:{right:0}}]}),u=d.forwardRef(function(a,b){let c=(0,j.b)({props:a,name:"MuiListItemSecondaryAction"}),{className:g,...h}=c,i=d.useContext(m.A),k={...c,disableGutters:i.disableGutters},l=(a=>{let{disableGutters:b,classes:c}=a;return(0,f.A)({root:["root",b&&"disableGutters"]},r,c)})(k);return(0,s.jsx)(t,{className:(0,e.A)(l.root,g),ownerState:k,ref:b,...h})});u.muiName="ListItemSecondaryAction";let v=(0,h.Ay)("div",{name:"MuiListItem",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,c.dense&&b.dense,"flex-start"===c.alignItems&&b.alignItemsFlexStart,c.divider&&b.divider,!c.disableGutters&&b.gutters,!c.disablePadding&&b.padding,c.hasSecondaryAction&&b.secondaryAction]}})((0,i.A)(({theme:a})=>({display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",width:"100%",boxSizing:"border-box",textAlign:"left",variants:[{props:({ownerState:a})=>!a.disablePadding,style:{paddingTop:8,paddingBottom:8}},{props:({ownerState:a})=>!a.disablePadding&&a.dense,style:{paddingTop:4,paddingBottom:4}},{props:({ownerState:a})=>!a.disablePadding&&!a.disableGutters,style:{paddingLeft:16,paddingRight:16}},{props:({ownerState:a})=>!a.disablePadding&&!!a.secondaryAction,style:{paddingRight:48}},{props:({ownerState:a})=>!!a.secondaryAction,style:{[`& > .${q.A.root}`]:{paddingRight:48}}},{props:{alignItems:"flex-start"},style:{alignItems:"flex-start"}},{props:({ownerState:a})=>a.divider,style:{borderBottom:`1px solid ${(a.vars||a).palette.divider}`,backgroundClip:"padding-box"}},{props:({ownerState:a})=>a.button,style:{transition:a.transitions.create("background-color",{duration:a.transitions.duration.shortest}),"&:hover":{textDecoration:"none",backgroundColor:(a.vars||a).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}}}},{props:({ownerState:a})=>a.hasSecondaryAction,style:{paddingRight:48}}]}))),w=(0,h.Ay)("li",{name:"MuiListItem",slot:"Container",overridesResolver:(a,b)=>b.container})({position:"relative"}),x=d.forwardRef(function(a,b){let c=(0,j.b)({props:a,name:"MuiListItem"}),{alignItems:h="center",children:i,className:n,component:o,components:q={},componentsProps:r={},ContainerComponent:t="li",ContainerProps:{className:x,...y}={},dense:z=!1,disableGutters:A=!1,disablePadding:B=!1,divider:C=!1,secondaryAction:D,slotProps:E={},slots:F={},...G}=c,H=d.useContext(m.A),I=d.useMemo(()=>({dense:z||H.dense||!1,alignItems:h,disableGutters:A}),[h,H.dense,z,A]),J=d.useRef(null),K=d.Children.toArray(i),L=K.length&&(0,k.A)(K[K.length-1],["ListItemSecondaryAction"]),M={...c,alignItems:h,dense:I.dense,disableGutters:A,disablePadding:B,divider:C,hasSecondaryAction:L},N=(a=>{let{alignItems:b,classes:c,dense:d,disableGutters:e,disablePadding:g,divider:h,hasSecondaryAction:i}=a;return(0,f.A)({root:["root",d&&"dense",!e&&"gutters",!g&&"padding",h&&"divider","flex-start"===b&&"alignItemsFlexStart",i&&"secondaryAction"],container:["container"]},p,c)})(M),O=(0,l.A)(J,b),P=F.root||q.Root||v,Q=E.root||r.root||{},R={className:(0,e.A)(N.root,Q.className,n),...G},S=o||"li";return L?(S=R.component||o?S:"div","li"===t&&("li"===S?S="div":"li"===R.component&&(R.component="div")),(0,s.jsx)(m.A.Provider,{value:I,children:(0,s.jsxs)(w,{as:t,className:(0,e.A)(N.container,x),ref:O,ownerState:M,...y,children:[(0,s.jsx)(P,{...Q,...!(0,g.A)(P)&&{as:S,ownerState:{...M,...Q.ownerState}},...R,children:K}),K.pop()]})})):(0,s.jsx)(m.A.Provider,{value:I,children:(0,s.jsxs)(P,{...Q,as:S,ref:O,...!(0,g.A)(P)&&{ownerState:{...M,...Q.ownerState}},...R,children:[K,D&&(0,s.jsx)(u,{children:D})]})})})},75983:(a,b,c)=>{c.d(b,{A:()=>s});var d=c(38301),e=c(43249),f=c(2783),g=c(37489),h=c(18168),i=c(68333),j=c(6636),k=c(41126),l=c(14328),m=c(14758),n=c(26636),o=c(55470),p=c(40443),q=c(21124);let r=(0,h.Ay)(l.A,{shouldForwardProp:a=>(0,k.A)(a)||"classes"===a,name:"MuiListItemButton",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,c.dense&&b.dense,"flex-start"===c.alignItems&&b.alignItemsFlexStart,c.divider&&b.divider,!c.disableGutters&&b.gutters]}})((0,i.A)(({theme:a})=>({display:"flex",flexGrow:1,justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",minWidth:0,boxSizing:"border-box",textAlign:"left",paddingTop:8,paddingBottom:8,transition:a.transitions.create("background-color",{duration:a.transitions.duration.shortest}),"&:hover":{textDecoration:"none",backgroundColor:(a.vars||a).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${p.A.selected}`]:{backgroundColor:a.vars?`rgba(${a.vars.palette.primary.mainChannel} / ${a.vars.palette.action.selectedOpacity})`:(0,g.X4)(a.palette.primary.main,a.palette.action.selectedOpacity),[`&.${p.A.focusVisible}`]:{backgroundColor:a.vars?`rgba(${a.vars.palette.primary.mainChannel} / calc(${a.vars.palette.action.selectedOpacity} + ${a.vars.palette.action.focusOpacity}))`:(0,g.X4)(a.palette.primary.main,a.palette.action.selectedOpacity+a.palette.action.focusOpacity)}},[`&.${p.A.selected}:hover`]:{backgroundColor:a.vars?`rgba(${a.vars.palette.primary.mainChannel} / calc(${a.vars.palette.action.selectedOpacity} + ${a.vars.palette.action.hoverOpacity}))`:(0,g.X4)(a.palette.primary.main,a.palette.action.selectedOpacity+a.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:a.vars?`rgba(${a.vars.palette.primary.mainChannel} / ${a.vars.palette.action.selectedOpacity})`:(0,g.X4)(a.palette.primary.main,a.palette.action.selectedOpacity)}},[`&.${p.A.focusVisible}`]:{backgroundColor:(a.vars||a).palette.action.focus},[`&.${p.A.disabled}`]:{opacity:(a.vars||a).palette.action.disabledOpacity},variants:[{props:({ownerState:a})=>a.divider,style:{borderBottom:`1px solid ${(a.vars||a).palette.divider}`,backgroundClip:"padding-box"}},{props:{alignItems:"flex-start"},style:{alignItems:"flex-start"}},{props:({ownerState:a})=>!a.disableGutters,style:{paddingLeft:16,paddingRight:16}},{props:({ownerState:a})=>a.dense,style:{paddingTop:4,paddingBottom:4}}]}))),s=d.forwardRef(function(a,b){let c=(0,j.b)({props:a,name:"MuiListItemButton"}),{alignItems:g="center",autoFocus:h=!1,component:i="div",children:k,dense:l=!1,disableGutters:s=!1,divider:t=!1,focusVisibleClassName:u,selected:v=!1,className:w,...x}=c,y=d.useContext(o.A),z=d.useMemo(()=>({dense:l||y.dense||!1,alignItems:g,disableGutters:s}),[g,y.dense,l,s]),A=d.useRef(null);(0,m.A)(()=>{h&&A.current&&A.current.focus()},[h]);let B={...c,alignItems:g,dense:z.dense,disableGutters:s,divider:t,selected:v},C=(a=>{let{alignItems:b,classes:c,dense:d,disabled:e,disableGutters:g,divider:h,selected:i}=a,j=(0,f.A)({root:["root",d&&"dense",!g&&"gutters",h&&"divider",e&&"disabled","flex-start"===b&&"alignItemsFlexStart",i&&"selected"]},p.Y,c);return{...c,...j}})(B),D=(0,n.A)(A,b);return(0,q.jsx)(o.A.Provider,{value:z,children:(0,q.jsx)(r,{ref:D,href:x.href||x.to,component:(x.href||x.to)&&"div"===i?"button":i,focusVisibleClassName:(0,e.A)(C.focusVisible,u),ownerState:B,className:(0,e.A)(C.root,w),...x,classes:C,children:k})})})},98463:(a,b,c)=>{c.d(b,{A:()=>n});var d=c(38301),e=c(43249),f=c(2783),g=c(18168),h=c(6636),i=c(29565),j=c(33105);function k(a){return(0,j.Ay)("MuiCardActions",a)}(0,i.A)("MuiCardActions",["root","spacing"]);var l=c(21124);let m=(0,g.Ay)("div",{name:"MuiCardActions",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,!c.disableSpacing&&b.spacing]}})({display:"flex",alignItems:"center",padding:8,variants:[{props:{disableSpacing:!1},style:{"& > :not(style) ~ :not(style)":{marginLeft:8}}}]}),n=d.forwardRef(function(a,b){let c=(0,h.b)({props:a,name:"MuiCardActions"}),{disableSpacing:d=!1,className:g,...i}=c,j={...c,disableSpacing:d},n=(a=>{let{classes:b,disableSpacing:c}=a;return(0,f.A)({root:["root",!c&&"spacing"]},k,b)})(j);return(0,l.jsx)(m,{className:(0,e.A)(n.root,g),ownerState:j,ref:b,...i})})}};
@@ -1,2 +1,2 @@
1
- exports.id=3309,exports.ids=[3309,7821,7982],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
2
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},83868:(a,b,c)=>{"use strict";function d(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}c.d(b,{P:()=>d})},87821:(a,b,c)=>{"use strict";c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v},96487:()=>{}};
1
+ exports.id=8367,exports.ids=[8367],exports.modules={947:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>d.c,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>d.G});var d=c(73456)},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
2
+ Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,c:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(46480),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l]),(0,d.A)(k,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(l,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},83868:(a,b,c)=>{"use strict";function d(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}c.d(b,{P:()=>d})},96487:()=>{}};
@@ -1,2 +1,2 @@
1
- "use strict";exports.id=8739,exports.ids=[8739],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},43326:(a,b,c)=>{c.d(b,{JC:()=>f,Ne:()=>j,Sx:()=>h,ok:()=>g,v0:()=>i});var d=c(33873),e=c.n(d);function f(){return process.cwd()}function g(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?e().resolve(a):f()}function h(){let a=process.env.FLUJO_OLLAMA_URL;return(a&&a.trim().length>0?a.trim():"http://localhost:11434").replace(/\/+$/,"")}function i(){let a=process.env.FLUJO_OLLAMA;return"1"===a||"true"===a||"yes"===a}function j(){return process.env.FLUJO_CONTAINER?"container":process.env.FLUJO_NPM?"npm":"git"}},46480:(a,b,c)=>{c.d(b,{Z:()=>d});var d=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a}({})},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
1
+ "use strict";exports.id=8739,exports.ids=[8739],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},43326:(a,b,c)=>{c.d(b,{JC:()=>f,Ne:()=>j,Sx:()=>h,ok:()=>g,v0:()=>i});var d=c(33873),e=c.n(d);function f(){return process.cwd()}function g(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?e().resolve(a):f()}function h(){let a=process.env.FLUJO_OLLAMA_URL;return(a&&a.trim().length>0?a.trim():"http://localhost:11434").replace(/\/+$/,"")}function i(){let a=process.env.FLUJO_OLLAMA;return"1"===a||"true"===a||"yes"===a}function j(){return process.env.FLUJO_CONTAINER?"container":process.env.FLUJO_NPM?"npm":"git"}},46480:(a,b,c)=>{c.d(b,{Z:()=>d});var d=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",a}({})},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
2
  ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},58739:(a,b,c)=>{c.r(b),c.d(b,{EncryptionLockedError:()=>o,authenticate:()=>G,changeEncryptionPassword:()=>B,decryptWithPassword:()=>E,encryptWithPassword:()=>D,getEncryptionType:()=>L,initializeDefaultEncryption:()=>w,initializeEncryption:()=>x,isEncryptionInitialized:()=>I,isEncryptionLocked:()=>K,isUserEncryptionEnabled:()=>J,logout:()=>H,migrateToUserEncryption:()=>A,verifyPassword:()=>F});var d=c(58862),e=c.n(d),f=c(92372),g=c(46480),h=c(50846),i=c(32524);let j=(0,h.h)("utils/encryption/session"),k=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map);function l(){let a=Date.now(),b=0;for(let[c,d]of k.entries())a-d.createdAt>72e5&&(k.delete(c),b++);b>0&&j.info(`Cleaned up ${b} expired encryption sessions`)}let m=null,n=(0,h.h)("utils/encryption/secure");class o extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,o.prototype)}}let p="data_encryption_key",q="data_encryption_iv",r="data_encryption_salt",s="encryption_version",t="encryption_type";var u=function(a){return a.DEFAULT="default",a.USER="user",a}(u||{});function v(){let a=e().enc.Utf8.parse("flujo_fixed_salt_v1");return e().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function w(){n.debug("initializeDefaultEncryption: Entering method");try{if(await I())return!0;let a=v(),b=e().lib.WordArray.random(8),c=e().lib.WordArray.random(16),d=e().AES.encrypt(b.toString(),a,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7}),h=e().enc.Utf8.parse("flujo_fixed_salt_v1"),i={[p]:d.toString(),[q]:c.toString(),[r]:h.toString(),[s]:1,[t]:"default"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,i),!0}catch(a){return n.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function x(a){n.debug("initializeEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"default"===b[t])return await A(a);let c=e().lib.WordArray.random(16),d=e().PBKDF2(a,c,{keySize:8,iterations:1e5}),h=e().lib.WordArray.random(8),i=e().lib.WordArray.random(16),j=e().AES.encrypt(h.toString(),d,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[p]:j.toString(),[q]:i.toString(),[r]:c.toString(),[s]:1,[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("initializeEncryption: Failed to initialize encryption:",a),!1}}async function y(){n.debug("getDefaultDEK: Entering method");try{let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!a){if(!await w())return n.error("getDefaultDEK: Failed to initialize default encryption"),null;return await y()}if("default"!==a[t])return n.error("getDefaultDEK: Not using default encryption"),null;let b=a[p],c=e().enc.Hex.parse(a[q]),d=v(),h=e().AES.decrypt(b,d,{iv:c,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!h.toString())return n.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return e().enc.Hex.parse(h.toString())}catch(a){return n.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function z(a){n.debug("getUserDEK: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b)return n.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[t])return n.error("getUserDEK: Not using user encryption"),null;let c=b[p],d=e().enc.Hex.parse(b[q]),h=e().enc.Hex.parse(b[r]),i=e().PBKDF2(a,h,{keySize:8,iterations:1e5}),j=e().AES.decrypt(c,i,{iv:d,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!j.toString())return n.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return e().enc.Hex.parse(j.toString())}catch(a){return n.error("getUserDEK: Failed to get user DEK:",a),null}}async function A(a){n.debug("migrateToUserEncryption: Entering method");try{let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(b&&"user"===b[t])return!0;let c=await y();if(!c)return n.error("migrateToUserEncryption: Failed to get default DEK for migration"),!1;let d=e().lib.WordArray.random(16),h=e().PBKDF2(a,d,{keySize:8,iterations:1e5}),i=e().lib.WordArray.random(16),j=e().AES.encrypt(c.toString(e().enc.Utf8),h,{iv:i,mode:e().mode.CBC,padding:e().pad.Pkcs7}),k={[p]:j.toString(),[q]:i.toString(),[r]:d.toString(),[s]:b?b[s]:1,[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,k),!0}catch(a){return n.error("migrateToUserEncryption: Failed to migrate to user encryption:",a),!1}}async function B(a,b){n.debug("changeEncryptionPassword: Entering method");try{let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c)return n.error("changeEncryptionPassword: No encryption metadata found"),!1;if("default"===c[t])return await A(b);let d=c[p],h=e().enc.Hex.parse(c[q]),i=e().enc.Hex.parse(c[r]),j=e().PBKDF2(a,i,{keySize:8,iterations:1e5}),k=e().AES.decrypt(d,j,{iv:h,mode:e().mode.CBC,padding:e().pad.Pkcs7});if(!k.toString())return n.error("changeEncryptionPassword: Failed to decrypt DEK with old password"),!1;let l=e().lib.WordArray.random(16),m=e().PBKDF2(b,l,{keySize:8,iterations:1e5}),o=e().lib.WordArray.random(16),u=e().AES.encrypt(k.toString(e().enc.Utf8),m,{iv:o,mode:e().mode.CBC,padding:e().pad.Pkcs7}),v={[p]:u.toString(),[q]:o.toString(),[r]:l.toString(),[s]:c[s],[t]:"user"};return await (0,f.VH)(g.Z.ENCRYPTION_KEY,v),!0}catch(a){return n.error("changeEncryptionPassword: Failed to change encryption password:",a),!1}}async function C(a,b=!1){n.debug("getDEK: Entering method");try{if(b&&a){n.debug("getDEK: Using session token");let b=function(a){let b=k.get(a);if(!b)return j.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(j.warn(`Session expired: ${a}`),k.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return e().enc.Hex.parse(b);n.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!c){if(n.info("getDEK: No encryption metadata found, initializing default encryption"),!await w())return n.error("getDEK: Failed to initialize default encryption"),null;return await C(a,b)}if("user"!==c[t])return await y();{let c=global.__flujo_server_dek??null;if(c)return n.debug("getDEK: Using server unlock state for user encryption"),e().enc.Hex.parse(c);if(a&&!b){let b=await z(a);if(b)return b;n.warn("getDEK: Provided password did not yield a valid user DEK")}throw n.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new o}}catch(a){if(a instanceof o)throw a;n.error("getDEK: Failed to get DEK:",a);try{if(n.warn("getDEK: Attempting to initialize default encryption as error recovery"),await w())return await y()}catch(a){n.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function D(a,b,c=!1){n.debug("encryptWithPassword: Entering method");try{let d=await C(b,c);if(!d)return null;let f=e().lib.WordArray.random(16),g=e().AES.encrypt(a,d,{iv:f,mode:e().mode.CBC,padding:e().pad.Pkcs7});return f.toString()+":"+g.toString()}catch(a){if(a instanceof o)throw a;return n.error("encryptWithPassword: Failed to encrypt data:",a),null}}async function E(a,b,c=!1){n.debug("decryptWithPassword: Entering method");try{let d=await C(b,c);if(!d)return null;let f=a.split(":");if(2!==f.length)return n.error("decryptWithPassword: Invalid ciphertext format"),null;let g=e().enc.Hex.parse(f[0]),h=f[1];return e().AES.decrypt(h,d,{iv:g,mode:e().mode.CBC,padding:e().pad.Pkcs7}).toString(e().enc.Utf8)}catch(a){if(a instanceof o)throw a;return n.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function F(a){n.debug("verifyPassword: Entering method");let b=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);if(!b||"user"!==b[t])return{valid:!1};{let b=await z(a);if(null!==b){var c;return c=b.toString(),global.__flujo_server_dek=c,j.info("Server encryption unlocked"),{valid:!0,token:function(a){let b=(0,i.A)(),c=Date.now();return k.set(b,{token:b,dek:a,createdAt:c,lastUsed:c}),j.info(`Created encryption session: ${b}`),!m&&(m=setInterval(l,36e5)).unref&&m.unref(),b}(b.toString())}}return{valid:!1}}}async function G(a){n.debug("authenticate: Entering method");let b=await F(a);return b.valid&&b.token||null}async function H(a){n.debug("logout: Entering method");try{return k.has(a)&&(k.delete(a),j.info(`Invalidated encryption session: ${a}`)),!0}catch(a){return n.error("logout: Failed to invalidate session:",a),!1}}async function I(){return n.debug("isEncryptionInitialized: Entering method"),null!==await (0,f.YM)(g.Z.ENCRYPTION_KEY,null)}async function J(){n.debug("isUserEncryptionEnabled: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return null!=a&&"user"===a[t]}async function K(){return await J()&&!global.__flujo_server_dek}async function L(){n.debug("getEncryptionType: Entering method");let a=await (0,f.YM)(g.Z.ENCRYPTION_KEY,null);return a?a[t]||"default":null}},92372:(a,b,c)=>{c.d(b,{EI:()=>B,N2:()=>u,Pv:()=>o,VH:()=>s,Vt:()=>A,YM:()=>t,bB:()=>C,ln:()=>w,pL:()=>D,w5:()=>E});var d=c(29021),e=c(33873),f=c.n(e),g=c(46480),h=c(50846),i=c(43326);let j=(0,h.h)("utils/storage/backend"),k=f().join((0,i.ok)(),"db"),l=f().join((0,i.ok)(),".next","storage"),m=a=>f().join(k,`${a}.json`);async function n(){try{await d.promises.access(k),j.verbose(`Storage directory exists: ${k}`)}catch{j.debug(`Creating storage directory: ${k}`),await d.promises.mkdir(k,{recursive:!0})}try{await d.promises.access(l),j.warn(`Old storage directory found: ${l}. This may cause data inconsistency issues.`)}catch{}}async function o(){for(let a of(j.debug("Verifying storage system initialization"),await n(),Object.values(g.Z)))try{let b=m(a),c=!1;try{await d.promises.access(b),c=!0}catch{}j.debug(`Storage check: ${a} - ${c?"File exists":"File does not exist yet"}`);let e=f().join(l,`${a}.json`);try{await d.promises.access(e),c?j.warn(`Found ${a} in both old and new storage locations. This may cause data inconsistency.`):j.warn(`Found ${a} in old storage location but not in new location. This may cause data loss.`)}catch{}}catch(b){j.error(`Storage verification failed for ${a}:`,b)}j.debug("Storage verification completed")}let p=new Map,q=0;async function r(a,b){let c=f().dirname(a);await d.promises.mkdir(c,{recursive:!0});let e=`${a}.tmp.${process.pid}.${++q}`;try{await d.promises.writeFile(e,b),await d.promises.rename(e,a)}catch(a){try{await d.promises.unlink(e)}catch{}throw a}}async function s(a,b){let c=m(a),d=(p.get(a)??Promise.resolve()).catch(()=>{}).then(()=>r(c,JSON.stringify(b,null,2)));p.set(a,d);try{await d,j.verbose(`Successfully saved item to: ${c}`)}catch(b){throw j.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{p.get(a)===d&&p.delete(a)}}async function t(a,b){try{await n();let c=m(a),e=await d.promises.readFile(c,"utf-8");if(0===e.trim().length)return j.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(e);return j.verbose(`Successfully loaded item from: ${c}`),a}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,e),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return j.verbose(`Item with key "${a}" not found at ${m(a)}, returning default.`),b;throw j.error(`CRITICAL: Error loading item with key "${a}" from ${m(a)}:`,c),c}}async function u(a){let b=m(a);try{await d.promises.unlink(b),j.verbose(`Successfully cleared item: ${b}`)}catch(c){"ENOENT"!==c.code?j.warn(`Error clearing item with key "${a}" at ${b}:`,c):j.verbose(`Item with key "${a}" not found at ${b}, nothing to clear.`)}}let v=/^[A-Za-z0-9_-]{1,64}$/;function w(a){if("string"!=typeof a||!v.test(a))throw Error(`Unsafe collection item id: ${JSON.stringify(a)}`)}let x=a=>f().join(k,a),y=(a,b)=>f().join(x(a),`${b}.json`);function z(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(b);return p.set(a,c),c.catch(()=>{}).finally(()=>{p.get(a)===c&&p.delete(a)}),c}async function A(a,b,c){w(b);let d=y(a,b);try{await z(`${a}/${b}`,()=>r(d,JSON.stringify(c,null,2))),j.verbose(`Successfully saved collection item: ${d}`)}catch(c){throw j.error(`Error saving collection item "${a}/${b}" to ${d}:`,c),c}}async function B(a,b,c){w(b);let e=y(a,b);try{let f=await d.promises.readFile(e,"utf-8");if(0===f.trim().length)return j.warn(`Collection item "${a}/${b}" at ${e} is empty; treating as missing.`),c;try{return JSON.parse(f)}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${e}:`,b);let a=`${e}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,f),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${e}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(d){if("ENOENT"===d.code)return j.verbose(`Collection item "${a}/${b}" not found at ${e}, returning default.`),c;throw j.error(`CRITICAL: Error loading collection item "${a}/${b}" from ${e}:`,d),d}}async function C(a,b){w(b);let c=y(a,b);await z(`${a}/${b}`,async()=>{try{await d.promises.unlink(c),j.verbose(`Successfully deleted collection item: ${c}`)}catch(d){if("ENOENT"!==d.code)throw d;j.verbose(`Collection item "${a}/${b}" not found at ${c}, nothing to delete.`)}})}async function D(a){let b,c=x(a);try{b=await d.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return[];throw a}let e=[];for(let a of b){if(!a.endsWith(".json")||a.includes(".tmp.")||a.includes(".corrupted.")||a.endsWith(".bak"))continue;let b=f().join(c,a);try{let a=await d.promises.readFile(b,"utf-8");if(0===a.trim().length){j.warn(`Collection item file ${b} is empty; skipping.`);continue}e.push(JSON.parse(a))}catch(a){j.error(`Failed to read collection item ${b}; skipping.`,a)}}return e}async function E(a,b,c){let e,f,g=m(a);try{e=await d.promises.readFile(g,"utf-8")}catch(a){if("ENOENT"===a.code)return 0;throw a}if(0===e.trim().length)return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),0;try{f=JSON.parse(e)}catch(b){return j.error(`Migration: legacy ${a}.json is not valid JSON; leaving it in place.`,b),0}if(!Array.isArray(f))return j.error(`Migration: legacy ${a}.json is not an array; leaving it in place.`),0;for(let a of(await d.promises.mkdir(x(b),{recursive:!0}),f)){let e;try{e=c(a),w(e)}catch(a){j.error(`Migration: skipping ${b} item with invalid/unsafe id`,a);continue}let f=y(b,e);try{await d.promises.access(f),j.debug(`Migration: ${b}/${e} already exists; keeping the existing file.`);continue}catch{}await r(f,JSON.stringify(a,null,2))}return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),j.info(`Migration: moved ${f.length} ${b} item(s) from ${a}.json to per-item storage.`),f.length}}};
@@ -0,0 +1,35 @@
1
+ "use strict";exports.id=906,exports.ids=[906],exports.modules={1905:(a,b,c)=>{c.d(b,{Ej:()=>i,NB:()=>m});var d=c(92372),e=c(46480),f=c(50846),g=c(33233);let h=(0,f.h)("backend/services/mcp/autoInstall");async function i(){try{let a=await (0,d.YM)(e.Z.MCP_AUTO_INSTALL_SETTINGS,g.je);return(0,g.zg)(a)}catch(a){return h.warn("Failed to load mcpAutoInstall settings; using safe defaults",a),{...g.je}}}let j="mcp-install-audit",k=Promise.resolve();async function l(){try{return await (0,d.YM)(j,[])}catch(a){return h.error("Failed to load MCP install audit log",a),[]}}async function m(a){let b=k.catch(()=>{}).then(async()=>{let b=await l();b.push(a);let c=b.slice(-300);await (0,d.VH)(j,c)}).catch(a=>{h.error("Failed to append MCP install audit entry",a)});k=b,await b}},9312:(a,b,c)=>{c.d(b,{RB:()=>k,jY:()=>j});var d=c(50846),e=c(20433),f=c(23514),g=c(87821);let h=(0,d.h)("backend/services/flow/generationContext");function i(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function j(){let a=await e.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:i(a.description,100)}:{}})),c=[],d={};try{let a=await f.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await f.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){h.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await f.mcpService.listServerTools(b.name),g=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:i(a.description,100)}:{}}));d[b.name]=g.map(a=>a.name),c.push({name:b.name,connected:!0,tools:g})}}catch(a){h.warn("Could not load MCP servers for the authoring context",a)}let j=[];try{j=await g.flowService.loadFlows()}catch(a){h.warn("Could not load flows for the authoring context",a)}let k={models:b,servers:c,flows:j.map(a=>({id:a.id,name:a.name,...a.description?{description:i(a.description,300)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:k,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:j.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(k),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}function k(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}},33233:(a,b,c)=>{c.d(b,{UM:()=>g,e5:()=>f,je:()=>d,zg:()=>e});let d={requireConsent:!0,namespaceAllowlist:[],trustBrainStem:!0};function e(a){let b=a??{};return{requireConsent:"boolean"==typeof b.requireConsent?b.requireConsent:d.requireConsent,namespaceAllowlist:Array.isArray(b.namespaceAllowlist)?b.namespaceAllowlist.filter(a=>"string"==typeof a&&a.length>0):[],trustBrainStem:"boolean"==typeof b.trustBrainStem?b.trustBrainStem:d.trustBrainStem}}function f(a){let{caller:b,settings:c,registryName:d,allowInstall:e}=a;if("generator"===b)return!0===e?{allowed:!0,reason:"generator-allowinstall",message:"Approved by the per-generation allowInstall opt-in."}:{allowed:!1,reason:"generator-not-allowed",message:"Installing is not allowed in this generation (allowInstall is off)."};if("authoring-tool"===b&&c.trustBrainStem)return{allowed:!0,reason:"brainstem-trusted",message:"Approved: the /mcp-flows authoring tool is trusted (mcpAutoInstall.trustBrainStem)."};if(!c.requireConsent)return{allowed:!0,reason:"consent-disabled",message:"Approved: consent is not required (mcpAutoInstall.requireConsent is off)."};let f=function(a){if("string"!=typeof a)return"";let b=a.indexOf("/");return b>0?a.slice(0,b):""}(d);return""!==f&&c.namespaceAllowlist.includes(f)?{allowed:!0,reason:"namespace-allowlisted",message:`Approved: namespace "${f}" is allowlisted.`}:{allowed:!1,reason:"consent-required",message:"Consent required: review the exact command and arguments, then approve this install (SEP-1024)."}}function g(a,b,c,d,e){return{at:new Date().toISOString(),caller:b,registryName:a.registryName,resolvedName:a.resolvedName,serverName:a.serverName,transport:a.transport,...a.command?{command:a.command}:{},...a.args?{args:a.args}:{},...a.serverUrl?{serverUrl:a.serverUrl}:{},requiredEnvNames:a.requiredEnvNames,verificationStatus:a.verificationStatus,consent:{allowed:c.allowed,reason:c.reason},installed:d,...e?{error:e}:{}}}},87789:(a,b,c)=>{c.d(b,{a:()=>l,e:()=>j});var d=c(50846),e=c(8665),f=c(25250),g=c(23514);let h=(0,d.h)("backend/services/mcp/registryInstall"),i="/v0.1/servers";async function j(a,b=8){let c=new URL(e.jD+i);c.searchParams.set("version","latest"),c.searchParams.set("limit",String(Math.min(Math.max(b,1),30))),a&&c.searchParams.set("search",a);let d=await (0,e.Ws)(c,15e3);return(Array.isArray(d?.servers)?d.servers:[]).map(a=>(function(a){let b=(0,f.AH)(a),c=b[0];return{name:a.name,...a.title?{title:a.title}:{},...a.description?{description:a.description}:{},installable:b.length>0,requiredEnv:c?(0,f.jg)(c):[]}})(a.server))}async function k(a){let b=new URL(e.jD+i);b.searchParams.set("version","latest"),b.searchParams.set("limit","10"),b.searchParams.set("search",a);let c=await (0,e.Ws)(b,15e3),d=Array.isArray(c?.servers)?c.servers:[];return d.find(b=>b.server?.name===a)??d[0]??null}async function l(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A registry server name is required"};try{d=await k(a)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=d?.server??null;if(!e)return{installed:!1,error:`No registry entry found for "${a}"`};let i=(0,f.AH)(e)[0];if(!i)return{installed:!1,error:`"${e.name}" has no install method FLUJO supports (stdio package or HTTP remote)`};let j=(0,f.vf)(d),l=(0,f.O$)(a,e,i,j);if(c?.resolveOnly)return{installed:!1,serverName:l.serverName,plan:l};let m=(0,f.jg)(i,b);if(m.length>0)return{installed:!1,needsEnv:m,plan:l,error:`"${e.name}" requires values for: ${m.join(", ")}`};let n=(0,f.cy)((0,f.Yr)(e,i),b),o=n.name,p=await g.mcpService.loadServerConfigs();if(Array.isArray(p)&&p.some(a=>a.name===o)){h.info(`installRegistryServer: "${o}" already configured; reusing`);let{tools:a,error:b}=await g.mcpService.listServerTools(o);return{installed:!0,alreadyExisted:!0,serverName:o,plan:l,tools:(a??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...b?{error:b}:{}}}h.info(`installRegistryServer: installing "${e.name}" as "${o}" (${i.kind})`);let q=await g.mcpService.updateServerConfig(o,n);if(!Array.isArray(q)&&q&&"success"in q&&!1===q.success)return{installed:!1,error:`Saving the server failed: ${q.error??"unknown error"}`};let{tools:r,error:s}=await g.mcpService.listServerTools(o);return{installed:!0,serverName:o,plan:l,tools:(r??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...s?{error:s}:{}}}},88185:(a,b,c)=>{c.d(b,{R:()=>d});let d=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
2
+ {
3
+ "name": "short_flow_name", // letters/digits/_/- only
4
+ "description": "what the flow does",
5
+ "nodes": [ ... ],
6
+ "edges": [ ... ]
7
+ }
8
+
9
+ NODE TYPES:
10
+ - { "key": "unique_key", "type": "start", "label": "...", "prompt": "system-level instructions for the whole flow" }
11
+ - { "key": "...", "type": "process", "label": "...", "description": "what this step does",
12
+ "model": "<model id or name from the catalog>",
13
+ "prompt": "instructions for this step",
14
+ "servers": [ { "name": "<server name>", "tools": ["tool_a"] } ], // optional; omit "tools" to enable all
15
+ "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history
16
+ "isolatedPrompt": "...", // only with inputMode "isolated"
17
+ "outputMode": "full-conversation" | "latest-message" } // optional, default full-conversation; latest-message hides this step's tool calls/results from later steps (they see only its final response)
18
+ - { "key": "...", "type": "subflow", "label": "...",
19
+ "flow": "<existing flow name or id>", // reference an EXISTING flow, OR:
20
+ "subflowSpec": { ...a nested FlowSpec... }, // define a brand-new child flow INLINE (compiled into its own flow and wired automatically)
21
+ "inputMode": "full-history" | "latest-message" | "isolated",
22
+ "allowCallerPrompt": true | false, // optional, only with inputMode "isolated"; when true a routing step may pass a "prompt" via its handoff tool that overrides the subflow's "prompt" (default)
23
+ "outputMode": "steps" | "final-only" }
24
+ - { "key": "...", "type": "finish", "label": "..." }
25
+
26
+ EDGES: { "from": "<node key>", "to": "<node key>", "bidirectional": true|false }
27
+
28
+ RULES:
29
+ 1. Exactly ONE start node; at least one finish node reachable from it.
30
+ 2. Every process node MUST reference a configured model (by id, display name, or name).
31
+ 3. A process step uses MCP tools ONLY via its "servers" list — never emit nodes of type "mcp".
32
+ 4. Do not embed \${tool:...} or \${resource:...} references in prompts — tools are wired through "servers".
33
+ 5. Branching: give a process node multiple outgoing edges; its model decides where to hand off at runtime. "bidirectional": true lets the target hand back to the source (agent <-> agent).
34
+ 6. A subflow node may have only ONE outgoing edge. Give it EITHER a "flow" (naming an existing flow) OR a "subflowSpec" (an inline nested FlowSpec that becomes its own child flow) — not both. A "subflowSpec" may itself contain subflow nodes with their own "subflowSpec" (bounded nesting), so you can author whole multi-level flows in one object.
35
+ 7. Keep flows minimal — only the steps the task needs. Write clear, specific prompts and labels; fill "description" on process nodes.`}};