flujo-ai 3.11.0 → 3.15.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 (457) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +226 -191
  3. package/.next/app-path-routes-manifest.json +15 -10
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +4 -4
  7. package/.next/routes-manifest.json +20 -1
  8. package/.next/server/app/_not-found/page.js +2 -2
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/server/app/api/backup/route.js +1 -1
  14. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  15. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/browse/route.js +1 -1
  17. package/.next/server/app/api/browse/route.js.nft.json +1 -1
  18. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/cwd/route.js +1 -1
  20. package/.next/server/app/api/cwd/route.js.nft.json +1 -1
  21. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/encryption/secure/route.js +1 -1
  23. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  24. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/env/route.js +2 -2
  26. package/.next/server/app/api/env/route.js.nft.json +1 -1
  27. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/[id]/route.js +1 -1
  29. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  30. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/flow/compile/route.js +1 -0
  32. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -0
  33. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -0
  34. package/.next/server/app/api/flow/generate/route.js +17 -0
  35. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  38. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/flow/route.js +1 -1
  41. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  42. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/git/route.js +2 -2
  44. package/.next/server/app/api/git/route.js.nft.json +1 -1
  45. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/init/route.js +1 -1
  47. package/.next/server/app/api/init/route.js.nft.json +1 -1
  48. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/local-models/capability/route.js +1 -0
  50. package/.next/server/app/api/local-models/capability/route.js.nft.json +1 -0
  51. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -0
  52. package/.next/server/app/api/local-models/pull/route.js +1 -0
  53. package/.next/server/app/api/local-models/pull/route.js.nft.json +1 -0
  54. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/local-models/suggest/route.js +2 -0
  56. package/.next/server/app/api/local-models/suggest/route.js.nft.json +1 -0
  57. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -0
  58. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  59. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  60. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  74. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  75. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  77. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  83. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp/servers/route.js +1 -1
  86. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  87. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  89. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  90. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  92. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  93. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/mcp-registry/route.js +1 -1
  95. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  96. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  98. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  99. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/model/[id]/route.js +1 -1
  101. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  102. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/model/provider/route.js +1 -1
  104. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  105. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/model/route.js +1 -1
  107. package/.next/server/app/api/model/route.js.nft.json +1 -1
  108. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/model/test/route.js +1 -1
  110. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  111. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/oauth/callback/route.js +1 -1
  113. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  114. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/oauth/initiate/route.js +1 -1
  116. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  117. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/oauth/reset/route.js +1 -1
  119. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  120. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/planned-executions/[id]/route.js +2 -1
  122. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  123. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/planned-executions/[id]/run/route.js +2 -1
  125. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  126. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/planned-executions/[id]/runs/route.js +2 -1
  128. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  129. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -1
  131. package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +1 -1
  132. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/planned-executions/route.js +1 -1
  134. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  135. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/restore/route.js +1 -1
  137. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  138. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/storage/route.js +1 -1
  140. package/.next/server/app/api/storage/route.js.nft.json +1 -1
  141. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/update/route.js +1 -1
  143. package/.next/server/app/api/update/route.js.nft.json +1 -1
  144. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  146. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  147. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/chat/page.js +2 -2
  149. package/.next/server/app/chat/page.js.nft.json +1 -1
  150. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  151. package/.next/server/app/chat.html +1 -1
  152. package/.next/server/app/chat.rsc +2 -2
  153. package/.next/server/app/docs/page.js +32 -2
  154. package/.next/server/app/docs/page.js.nft.json +1 -1
  155. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/docs.html +1 -1
  157. package/.next/server/app/docs.rsc +2 -2
  158. package/.next/server/app/executions/page.js +3 -3
  159. package/.next/server/app/executions/page.js.nft.json +1 -1
  160. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  161. package/.next/server/app/executions.html +1 -1
  162. package/.next/server/app/executions.rsc +2 -2
  163. package/.next/server/app/flows/page.js +10 -10
  164. package/.next/server/app/flows/page.js.nft.json +1 -1
  165. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  166. package/.next/server/app/flows.html +1 -1
  167. package/.next/server/app/flows.rsc +2 -2
  168. package/.next/server/app/index.html +1 -1
  169. package/.next/server/app/index.rsc +2 -2
  170. package/.next/server/app/mcp/page.js +11 -11
  171. package/.next/server/app/mcp/page.js.nft.json +1 -1
  172. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  173. package/.next/server/app/mcp-flows/route.js +5 -1
  174. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  175. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  177. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  178. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/mcp.html +1 -1
  180. package/.next/server/app/mcp.rsc +2 -2
  181. package/.next/server/app/models/page.js +3 -3
  182. package/.next/server/app/models/page.js.nft.json +1 -1
  183. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  184. package/.next/server/app/page.js +2 -2
  185. package/.next/server/app/page.js.nft.json +1 -1
  186. package/.next/server/app/page_client-reference-manifest.js +1 -1
  187. package/.next/server/app/settings/page.js +2 -2
  188. package/.next/server/app/settings/page.js.nft.json +1 -1
  189. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/settings.html +1 -1
  191. package/.next/server/app/settings.rsc +2 -2
  192. package/.next/server/app/v1/chat/completions/route.js +1 -1
  193. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  194. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +1 -1
  196. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  197. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +1 -1
  199. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  200. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  202. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  203. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  205. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  206. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +1 -1
  208. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  209. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  211. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  212. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  214. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  215. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  217. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  218. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  220. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  221. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/v1/models/route.js +1 -1
  223. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  224. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app-paths-manifest.json +15 -10
  226. package/.next/server/chunks/1050.js +1 -0
  227. package/.next/server/chunks/1373.js +1 -1
  228. package/.next/server/chunks/1403.js +1 -1
  229. package/.next/server/chunks/1690.js +1 -0
  230. package/.next/server/chunks/1746.js +1 -0
  231. package/.next/server/chunks/1877.js +31 -0
  232. package/.next/server/chunks/1905.js +1 -1
  233. package/.next/server/chunks/2776.js +1 -1
  234. package/.next/server/chunks/2859.js +5 -0
  235. package/.next/server/chunks/3243.js +1 -0
  236. package/.next/server/chunks/3304.js +1 -0
  237. package/.next/server/chunks/3984.js +4 -4
  238. package/.next/server/chunks/4681.js +1 -0
  239. package/.next/server/chunks/5504.js +2 -2
  240. package/.next/server/chunks/5558.js +1 -0
  241. package/.next/server/chunks/5587.js +1 -0
  242. package/.next/server/chunks/5734.js +4 -4
  243. package/.next/server/chunks/{1331.js → 5873.js} +3 -3
  244. package/.next/server/chunks/{9314.js → 5888.js} +3 -3
  245. package/.next/server/chunks/5935.js +2 -0
  246. package/.next/server/chunks/6195.js +35 -0
  247. package/.next/server/chunks/6523.js +1 -0
  248. package/.next/server/chunks/6936.js +6 -6
  249. package/.next/server/chunks/6996.js +3 -3
  250. package/.next/server/chunks/701.js +1 -1
  251. package/.next/server/chunks/7214.js +2 -2
  252. package/.next/server/chunks/724.js +2 -2
  253. package/.next/server/chunks/7328.js +1 -0
  254. package/.next/server/chunks/{5389.js → 7362.js} +17 -17
  255. package/.next/server/chunks/7635.js +6 -0
  256. package/.next/server/chunks/{2287.js → 8367.js} +2 -2
  257. package/.next/server/chunks/8434.js +1 -0
  258. package/.next/server/chunks/{2253.js → 8572.js} +1 -1
  259. package/.next/server/chunks/8739.js +1 -1
  260. package/.next/server/chunks/8994.js +2 -0
  261. package/.next/server/chunks/9188.js +1 -1
  262. package/.next/server/chunks/9509.js +2 -2
  263. package/.next/server/chunks/9794.js +1 -0
  264. package/.next/server/chunks/9957.js +1 -0
  265. package/.next/server/functions-config-manifest.json +3 -0
  266. package/.next/server/instrumentation.js +1 -1
  267. package/.next/server/instrumentation.js.nft.json +1 -1
  268. package/.next/server/middleware-build-manifest.js +1 -1
  269. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  270. package/.next/server/pages/404.html +1 -1
  271. package/.next/server/pages/500.html +1 -1
  272. package/.next/server/pages-manifest.json +1 -1
  273. package/.next/server/server-reference-manifest.js +1 -1
  274. package/.next/server/server-reference-manifest.json +1 -1
  275. package/.next/static/5bnHIDHGn1uWHUQhpqe6Z/_buildManifest.js +1 -0
  276. package/.next/static/chunks/1226-af62e7a89fa9032e.js +1 -0
  277. package/.next/static/chunks/1979-e2d922370ecef69f.js +1 -0
  278. package/.next/static/chunks/2158-0d6bb5a428ed0688.js +1 -0
  279. package/.next/static/chunks/2403-5c26e0abd76095b1.js +1 -0
  280. package/.next/static/chunks/2709-29f91a54eef90221.js +1 -0
  281. package/.next/static/chunks/510-e39ad4e1fae6dd1f.js +1 -0
  282. package/.next/static/chunks/539-8ddf886986877cfc.js +1 -0
  283. package/.next/static/chunks/6582-6735fdd6b42b5c35.js +1 -0
  284. package/.next/static/chunks/6902-cba4e59c4295b4a0.js +1 -0
  285. package/.next/static/chunks/8862-1170dad1d6f3cd39.js +1 -0
  286. package/.next/static/chunks/8867-3f7163974605427b.js +1 -0
  287. package/.next/static/chunks/8989-401559d9f3bc80a0.js +1 -0
  288. package/.next/static/chunks/9164-36fedeb944fa71e9.js +1 -0
  289. package/.next/static/chunks/9414-3cd5c3976cba66b2.js +1 -0
  290. package/.next/static/chunks/9554-cb5bd72cb40e8dbe.js +1 -0
  291. package/.next/static/chunks/9984-1ed094ea9f5b1f17.js +1 -0
  292. package/.next/static/chunks/app/api/backup/route-7248529e02c31012.js +1 -0
  293. package/.next/static/chunks/app/api/browse/route-7248529e02c31012.js +1 -0
  294. package/.next/static/chunks/app/api/cwd/route-7248529e02c31012.js +1 -0
  295. package/.next/static/chunks/app/api/encryption/secure/route-7248529e02c31012.js +1 -0
  296. package/.next/static/chunks/app/api/env/route-7248529e02c31012.js +1 -0
  297. package/.next/static/chunks/app/api/flow/[id]/route-7248529e02c31012.js +1 -0
  298. package/.next/static/chunks/app/api/flow/compile/route-7248529e02c31012.js +1 -0
  299. package/.next/static/chunks/app/api/flow/generate/route-7248529e02c31012.js +1 -0
  300. package/.next/static/chunks/app/api/flow/prompt-renderer/route-7248529e02c31012.js +1 -0
  301. package/.next/static/chunks/app/api/flow/route-7248529e02c31012.js +1 -0
  302. package/.next/static/chunks/app/api/git/route-7248529e02c31012.js +1 -0
  303. package/.next/static/chunks/app/api/init/route-7248529e02c31012.js +1 -0
  304. package/.next/static/chunks/app/api/local-models/capability/route-7248529e02c31012.js +1 -0
  305. package/.next/static/chunks/app/api/local-models/pull/route-7248529e02c31012.js +1 -0
  306. package/.next/static/chunks/app/api/local-models/suggest/route-7248529e02c31012.js +1 -0
  307. package/.next/static/chunks/app/api/mcp/cancel/route-7248529e02c31012.js +1 -0
  308. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7248529e02c31012.js +1 -0
  309. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7248529e02c31012.js +1 -0
  310. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7248529e02c31012.js +1 -0
  311. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7248529e02c31012.js +1 -0
  312. package/.next/static/chunks/app/api/mcp/servers/[name]/route-7248529e02c31012.js +1 -0
  313. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7248529e02c31012.js +1 -0
  314. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7248529e02c31012.js +1 -0
  315. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7248529e02c31012.js +1 -0
  316. package/.next/static/chunks/app/api/mcp/servers/route-7248529e02c31012.js +1 -0
  317. package/.next/static/chunks/app/api/mcp/test-connection/route-7248529e02c31012.js +1 -0
  318. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7248529e02c31012.js +1 -0
  319. package/.next/static/chunks/app/api/mcp-registry/route-7248529e02c31012.js +1 -0
  320. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7248529e02c31012.js +1 -0
  321. package/.next/static/chunks/app/api/model/[id]/route-7248529e02c31012.js +1 -0
  322. package/.next/static/chunks/app/api/model/provider/route-7248529e02c31012.js +1 -0
  323. package/.next/static/chunks/app/api/model/route-7248529e02c31012.js +1 -0
  324. package/.next/static/chunks/app/api/model/test/route-7248529e02c31012.js +1 -0
  325. package/.next/static/chunks/app/api/oauth/callback/route-7248529e02c31012.js +1 -0
  326. package/.next/static/chunks/app/api/oauth/initiate/route-7248529e02c31012.js +1 -0
  327. package/.next/static/chunks/app/api/oauth/reset/route-7248529e02c31012.js +1 -0
  328. package/.next/static/chunks/app/api/planned-executions/[id]/route-7248529e02c31012.js +1 -0
  329. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7248529e02c31012.js +1 -0
  330. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7248529e02c31012.js +1 -0
  331. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7248529e02c31012.js +1 -0
  332. package/.next/static/chunks/app/api/planned-executions/route-7248529e02c31012.js +1 -0
  333. package/.next/static/chunks/app/api/restore/route-7248529e02c31012.js +1 -0
  334. package/.next/static/chunks/app/api/storage/route-7248529e02c31012.js +1 -0
  335. package/.next/static/chunks/app/api/update/route-7248529e02c31012.js +1 -0
  336. package/.next/static/chunks/app/api/webhooks/[id]/route-7248529e02c31012.js +1 -0
  337. package/.next/static/chunks/app/chat/{page-aea8c8cbfa461e7f.js → page-c759cf382bcabd77.js} +1 -1
  338. package/.next/static/chunks/app/docs/page-1d349e2d82f7b104.js +1 -0
  339. package/.next/static/chunks/app/executions/page-4155f9f682ee6f84.js +1 -0
  340. package/.next/static/chunks/app/flows/page-375150edff9134a3.js +1 -0
  341. package/.next/static/chunks/app/mcp/page-5234695929980171.js +1 -0
  342. package/.next/static/chunks/app/mcp-flows/route-7248529e02c31012.js +1 -0
  343. package/.next/static/chunks/app/mcp-proxy/[server]/route-7248529e02c31012.js +1 -0
  344. package/.next/static/chunks/app/models/page-4fc4d100a8b1d4b4.js +1 -0
  345. package/.next/static/chunks/app/settings/page-9a2bfb8d5bdba29e.js +1 -0
  346. package/.next/static/chunks/app/v1/chat/completions/route-7248529e02c31012.js +1 -0
  347. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7248529e02c31012.js +1 -0
  348. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7248529e02c31012.js +1 -0
  349. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7248529e02c31012.js +1 -0
  350. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7248529e02c31012.js +1 -0
  351. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7248529e02c31012.js +1 -0
  352. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7248529e02c31012.js +1 -0
  353. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7248529e02c31012.js +1 -0
  354. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7248529e02c31012.js +1 -0
  355. package/.next/static/chunks/app/v1/chat/conversations/route-7248529e02c31012.js +1 -0
  356. package/.next/static/chunks/app/v1/models/route-7248529e02c31012.js +1 -0
  357. package/.next/static/chunks/{webpack-63a4c59e84967e90.js → webpack-4015bd6f241940a1.js} +1 -1
  358. package/.next/trace +7 -7
  359. package/.next/types/app/api/flow/compile/route.ts +347 -0
  360. package/.next/types/app/api/flow/generate/route.ts +347 -0
  361. package/.next/types/app/api/local-models/capability/route.ts +347 -0
  362. package/.next/types/app/api/local-models/pull/route.ts +347 -0
  363. package/.next/types/app/api/local-models/suggest/route.ts +347 -0
  364. package/.next/types/routes.d.ts +6 -1
  365. package/.next/types/validator.ts +45 -0
  366. package/README.md +12 -5
  367. package/next.config.mjs +119 -105
  368. package/package.json +90 -90
  369. package/scripts/launch-next.mjs +17 -3
  370. package/.next/server/chunks/1381.js +0 -1
  371. package/.next/server/chunks/1555.js +0 -1
  372. package/.next/server/chunks/3426.js +0 -1
  373. package/.next/server/chunks/4239.js +0 -1
  374. package/.next/server/chunks/4379.js +0 -1
  375. package/.next/server/chunks/4706.js +0 -1
  376. package/.next/server/chunks/4729.js +0 -6
  377. package/.next/server/chunks/4989.js +0 -1
  378. package/.next/server/chunks/5443.js +0 -1
  379. package/.next/server/chunks/598.js +0 -1
  380. package/.next/server/chunks/6064.js +0 -1
  381. package/.next/server/chunks/812.js +0 -2
  382. package/.next/static/9Pzu8N65j3JuRQ7zVUtwD/_buildManifest.js +0 -1
  383. package/.next/static/chunks/1374-e084b3c40554288a.js +0 -1
  384. package/.next/static/chunks/1424-01898260211a09d0.js +0 -1
  385. package/.next/static/chunks/1811-8ee01cf37161913c.js +0 -1
  386. package/.next/static/chunks/2160-4d9f132965bc2a89.js +0 -1
  387. package/.next/static/chunks/2624-b985ab3eac1139c3.js +0 -1
  388. package/.next/static/chunks/3403-7c5037145e384171.js +0 -1
  389. package/.next/static/chunks/4205-b9e33afc7e96ecb9.js +0 -1
  390. package/.next/static/chunks/5648-2c6caf3d55f95e11.js +0 -1
  391. package/.next/static/chunks/7329-78f54f68ea2d37e2.js +0 -1
  392. package/.next/static/chunks/7396-807a034f58b57712.js +0 -1
  393. package/.next/static/chunks/7458-4445e76668151564.js +0 -1
  394. package/.next/static/chunks/8215-a966f4c36f1ca174.js +0 -1
  395. package/.next/static/chunks/8862-8f17ef601bb1fbd0.js +0 -1
  396. package/.next/static/chunks/8890-a7a8c6f1dc3cd343.js +0 -1
  397. package/.next/static/chunks/9164-d15e4dab0a1bf282.js +0 -1
  398. package/.next/static/chunks/app/api/backup/route-3291f6991ce3f52c.js +0 -1
  399. package/.next/static/chunks/app/api/browse/route-3291f6991ce3f52c.js +0 -1
  400. package/.next/static/chunks/app/api/cwd/route-3291f6991ce3f52c.js +0 -1
  401. package/.next/static/chunks/app/api/encryption/secure/route-3291f6991ce3f52c.js +0 -1
  402. package/.next/static/chunks/app/api/env/route-3291f6991ce3f52c.js +0 -1
  403. package/.next/static/chunks/app/api/flow/[id]/route-3291f6991ce3f52c.js +0 -1
  404. package/.next/static/chunks/app/api/flow/prompt-renderer/route-3291f6991ce3f52c.js +0 -1
  405. package/.next/static/chunks/app/api/flow/route-3291f6991ce3f52c.js +0 -1
  406. package/.next/static/chunks/app/api/git/route-3291f6991ce3f52c.js +0 -1
  407. package/.next/static/chunks/app/api/init/route-3291f6991ce3f52c.js +0 -1
  408. package/.next/static/chunks/app/api/mcp/cancel/route-3291f6991ce3f52c.js +0 -1
  409. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-3291f6991ce3f52c.js +0 -1
  410. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-3291f6991ce3f52c.js +0 -1
  411. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-3291f6991ce3f52c.js +0 -1
  412. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-3291f6991ce3f52c.js +0 -1
  413. package/.next/static/chunks/app/api/mcp/servers/[name]/route-3291f6991ce3f52c.js +0 -1
  414. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-3291f6991ce3f52c.js +0 -1
  415. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-3291f6991ce3f52c.js +0 -1
  416. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-3291f6991ce3f52c.js +0 -1
  417. package/.next/static/chunks/app/api/mcp/servers/route-3291f6991ce3f52c.js +0 -1
  418. package/.next/static/chunks/app/api/mcp/test-connection/route-3291f6991ce3f52c.js +0 -1
  419. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-3291f6991ce3f52c.js +0 -1
  420. package/.next/static/chunks/app/api/mcp-registry/route-3291f6991ce3f52c.js +0 -1
  421. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-3291f6991ce3f52c.js +0 -1
  422. package/.next/static/chunks/app/api/model/[id]/route-3291f6991ce3f52c.js +0 -1
  423. package/.next/static/chunks/app/api/model/provider/route-3291f6991ce3f52c.js +0 -1
  424. package/.next/static/chunks/app/api/model/route-3291f6991ce3f52c.js +0 -1
  425. package/.next/static/chunks/app/api/model/test/route-3291f6991ce3f52c.js +0 -1
  426. package/.next/static/chunks/app/api/oauth/callback/route-3291f6991ce3f52c.js +0 -1
  427. package/.next/static/chunks/app/api/oauth/initiate/route-3291f6991ce3f52c.js +0 -1
  428. package/.next/static/chunks/app/api/oauth/reset/route-3291f6991ce3f52c.js +0 -1
  429. package/.next/static/chunks/app/api/planned-executions/[id]/route-3291f6991ce3f52c.js +0 -1
  430. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-3291f6991ce3f52c.js +0 -1
  431. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-3291f6991ce3f52c.js +0 -1
  432. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-3291f6991ce3f52c.js +0 -1
  433. package/.next/static/chunks/app/api/planned-executions/route-3291f6991ce3f52c.js +0 -1
  434. package/.next/static/chunks/app/api/restore/route-3291f6991ce3f52c.js +0 -1
  435. package/.next/static/chunks/app/api/storage/route-3291f6991ce3f52c.js +0 -1
  436. package/.next/static/chunks/app/api/update/route-3291f6991ce3f52c.js +0 -1
  437. package/.next/static/chunks/app/api/webhooks/[id]/route-3291f6991ce3f52c.js +0 -1
  438. package/.next/static/chunks/app/docs/page-2a4cff7c40706a48.js +0 -1
  439. package/.next/static/chunks/app/executions/page-95fec57bf97ee809.js +0 -1
  440. package/.next/static/chunks/app/flows/page-7fe295069ccdb5fe.js +0 -1
  441. package/.next/static/chunks/app/mcp/page-0f923960004aa437.js +0 -1
  442. package/.next/static/chunks/app/mcp-flows/route-3291f6991ce3f52c.js +0 -1
  443. package/.next/static/chunks/app/mcp-proxy/[server]/route-3291f6991ce3f52c.js +0 -1
  444. package/.next/static/chunks/app/models/page-d81d2b1fe2f1d063.js +0 -1
  445. package/.next/static/chunks/app/settings/page-d03a168f6efbf7fd.js +0 -1
  446. package/.next/static/chunks/app/v1/chat/completions/route-3291f6991ce3f52c.js +0 -1
  447. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-3291f6991ce3f52c.js +0 -1
  448. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-3291f6991ce3f52c.js +0 -1
  449. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-3291f6991ce3f52c.js +0 -1
  450. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-3291f6991ce3f52c.js +0 -1
  451. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-3291f6991ce3f52c.js +0 -1
  452. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-3291f6991ce3f52c.js +0 -1
  453. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-3291f6991ce3f52c.js +0 -1
  454. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-3291f6991ce3f52c.js +0 -1
  455. package/.next/static/chunks/app/v1/chat/conversations/route-3291f6991ce3f52c.js +0 -1
  456. package/.next/static/chunks/app/v1/models/route-3291f6991ce3f52c.js +0 -1
  457. /package/.next/static/{9Pzu8N65j3JuRQ7zVUtwD → 5bnHIDHGn1uWHUQhpqe6Z}/_ssgManifest.js +0 -0
@@ -0,0 +1,31 @@
1
+ "use strict";exports.id=1877,exports.ids=[1877],exports.modules={8665:(a,b,c)=>{c.d(b,{ED:()=>i,Ws:()=>j,jD:()=>g});var d=c(73496),e=c.n(d);let f=(0,c(50846).h)("backend/utils/registryClient"),g="https://registry.modelcontextprotocol.io";async function h(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{let b=await fetch(a,{headers:{Accept:"application/json"},signal:c.signal,cache:"no-store"});return{status:b.status,body:await b.text()}}finally{clearTimeout(d)}}async function i(a,b){try{return await new Promise((c,d)=>{let f=e().connect(a.origin),g=!1,h=a=>{g||(g=!0,a(),f.close())};f.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 session timed out after ${b}ms`)))),f.on("error",a=>h(()=>d(a)));let i=f.request({":method":"GET",":path":a.pathname+a.search,accept:"application/json"});i.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 request timed out after ${b}ms`)))),i.on("error",a=>h(()=>d(a)));let j=0,k="";i.setEncoding("utf8"),i.on("response",a=>{j=Number(a[":status"]||0)}),i.on("data",a=>{k+=a}),i.on("end",()=>h(()=>c({status:j,body:k}))),i.end()})}catch(c){return f.warn("HTTP/2 request to registry failed, retrying over HTTP/1.1",c instanceof Error?c.message:c),await h(a,b)}}async function j(a,b){let c=await i(a,b);if(c.status<200||c.status>=300)throw Error(`MCP Registry responded with status ${c.status}`);return JSON.parse(c.body)}},25250:(a,b,c)=>{c.d(b,{AH:()=>f,XQ:()=>m,Yr:()=>l,cy:()=>o,jg:()=>p,zz:()=>n});let d={npm:"npx",pypi:"uvx",oci:"docker",nuget:"dnx"},e={npm:"npm",pypi:"PyPI",oci:"Docker",nuget:"NuGet",mcpb:"MCPB",cargo:"Cargo"};function f(a){var b;let c=[];for(let f of a.packages??[])(function(a){if(!a.identifier||!d[a.registryType]&&!a.runtimeHint)return!1;let b=a.transport?.type;return!b||"stdio"===b})(f)&&c.push({kind:"package",label:`${e[b=f.registryType]||b}: ${f.identifier}`,pkg:f});for(let b of a.remotes??[])b.url&&("streamable-http"===b.type||"sse"===b.type)&&c.push({kind:"remote",label:`Remote (${"sse"===b.type?"SSE":"Streamable HTTP"}): ${b.url}`,remote:b});return c}let g=new Set(["mcp","server","mcp-server","mcpserver"]);function h(a){let b=a.value??a.default;return"named"===a.type?a.name?void 0!==b&&""!==b?[a.name,b]:a.isRequired&&a.valueHint?[a.name,`<${a.valueHint}>`]:a.isRequired?[a.name]:[]:[]:void 0!==b&&""!==b?[b]:a.isRequired?[`<${a.valueHint||"value"}>`]:[]}function i(a){return(a??[]).flatMap(h)}function j(a){return{name:(function(a){let b=a.indexOf("/"),c=b>=0?a.slice(0,b):"",d=b>=0?a.slice(b+1):a;if(!g.has(d.toLowerCase())||!c)return d;let e=c.split(".").pop()||"";return e?`${e}-${d}`:d})(a.name).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"mcp-server",disabled:!1,autoApprove:[],env:{},_buildCommand:"",_installCommand:""}}function k(a){return a.version?`${a.identifier}@${a.version}`:a.identifier}function l(a,b){return"package"===b.kind?function(a,b){let c,e=b.runtimeHint||d[b.registryType],f=i(b.packageArguments),g=i(b.runtimeArguments),h=function(a){let b={};for(let c of a??[]){if(!c.name)continue;let a=c.value??c.default??"";b[c.name]=c.isSecret?{value:a,metadata:{isSecret:!0}}:a}return b}(b.environmentVariables);switch(b.registryType){case"npm":c=[...g,"-y",k(b),...f];break;case"pypi":c=[...g,b.version?`${b.identifier}==${b.version}`:b.identifier,...f];break;case"oci":{let a=Object.keys(h).flatMap(a=>["-e",a]);c=[..."run"===g[0]?[]:["run","-i","--rm"],...g,...a,function(a){let b=a.identifier.split("/").pop()||a.identifier;return!(b.includes(":")||b.includes("@"))&&a.version?`${a.identifier}:${a.version}`:a.identifier}(b),...f];break}case"nuget":c=[...g,k(b),"--yes",...f];break;default:c=[...g,k(b),...f]}return{...j(a),transport:"stdio",command:e,args:c,env:h,rootPath:"."}}(a,b.pkg):function(a,b){let c={};for(let a of b.headers??[])a.name&&(c[a.name]=a.value??a.default??"");let d=j(a);return{...d,transport:"sse"===b.type?"sse":"streamable",serverUrl:b.url,headers:c,rootPath:`mcp-servers/${d.name}`}}(a,b.remote)}function m(a){let b;try{b=new URL(a)}catch{return null}let c=b.searchParams.get("q");if(c)return`/v0.1/servers?search=${encodeURIComponent(c)}&version=latest&limit=1`;if(/^\/v[\d.]+\/servers\/[^/]+\/versions\/[^/]+$/.test(b.pathname))return b.pathname;let d=b.pathname.match(/^\/v[\d.]+\/servers\/([^/]+)(?:\/versions)?\/?$/);if(d){let a=decodeURIComponent(d[1]);return`/v0.1/servers?search=${encodeURIComponent(a)}&version=latest&limit=1`}return null}function n(a){return a?.servers&&a.servers.length>0?a.servers[0]:a?.server?.name?a:null}function o(a,b){if(!b||0===Object.keys(b).length)return a;let c={...a.env??{}};for(let[a,d]of Object.entries(b)){let b=c[a];b&&"object"==typeof b&&b.metadata?.isSecret?c[a]={value:d,metadata:{isSecret:!0}}:c[a]=d}return{...a,env:c}}function p(a,b){return"package"===a.kind?(a.pkg.environmentVariables??[]).filter(a=>a.isRequired&&!(a.value??a.default)&&!b?.[a.name]).map(a=>a.name):(a.remote.headers??[]).filter(a=>a.isRequired&&!(a.value??a.default)).map(a=>a.name)}},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:[],f=d.find(b=>b.server?.name===a);return(f??d[0])?.server??null}async function l(a,b){let c;if(!a||"string"!=typeof a)return{installed:!1,error:"A registry server name is required"};try{c=await k(a)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}if(!c)return{installed:!1,error:`No registry entry found for "${a}"`};let d=(0,f.AH)(c)[0];if(!d)return{installed:!1,error:`"${c.name}" has no install method FLUJO supports (stdio package or HTTP remote)`};let e=(0,f.jg)(d,b);if(e.length>0)return{installed:!1,needsEnv:e,error:`"${c.name}" requires values for: ${e.join(", ")}`};let i=(0,f.cy)((0,f.Yr)(c,d),b),j=i.name,l=await g.mcpService.loadServerConfigs();if(Array.isArray(l)&&l.some(a=>a.name===j)){h.info(`installRegistryServer: "${j}" already configured; reusing`);let{tools:a,error:b}=await g.mcpService.listServerTools(j);return{installed:!0,alreadyExisted:!0,serverName:j,tools:(a??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...b?{error:b}:{}}}h.info(`installRegistryServer: installing "${c.name}" as "${j}" (${d.kind})`);let m=await g.mcpService.updateServerConfig(j,i);if(!Array.isArray(m)&&m&&"success"in m&&!1===m.success)return{installed:!1,error:`Saving the server failed: ${m.error??"unknown error"}`};let{tools:n,error:o}=await g.mcpService.listServerTools(j);return{installed:!0,serverName:j,tools:(n??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...o?{error:o}:{}}}},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
+ - { "key": "...", "type": "subflow", "label": "...", "flow": "<existing flow name or id>",
18
+ "inputMode": "full-history" | "latest-message" | "isolated",
19
+ "outputMode": "steps" | "final-only" }
20
+ - { "key": "...", "type": "finish", "label": "..." }
21
+
22
+ EDGES: { "from": "<node key>", "to": "<node key>", "bidirectional": true|false }
23
+
24
+ RULES:
25
+ 1. Exactly ONE start node; at least one finish node reachable from it.
26
+ 2. Every process node MUST reference a configured model (by id, display name, or name).
27
+ 3. A process step uses MCP tools ONLY via its "servers" list — never emit nodes of type "mcp".
28
+ 4. Do not embed \${tool:...} or \${resource:...} references in prompts — tools are wired through "servers".
29
+ 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).
30
+ 6. A subflow node may have only ONE outgoing edge, and its "flow" must name an existing flow.
31
+ 7. Keep flows minimal — only the steps the task needs. Write clear, specific prompts and labels; fill "description" on process nodes.`}};
@@ -1,2 +1,2 @@
1
1
  "use strict";exports.id=1905,exports.ids=[1905],exports.modules={9047:(a,b,c)=>{c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>T,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>U});var d=c(91488);c(27806);let e={LOG_LEVEL:3},f={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},g="number"==typeof e.LOG_LEVEL?e.LOG_LEVEL:f.ERROR;function h(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=h(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>h(a,b+1)):c[d]=e)}return c}function i(a,b,c,d,e){if(a>=("number"==typeof e?e:g)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let e=new Date().toISOString(),g=`[${e}] [${b}]`,i=`${g} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?h(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?h(b):b,2);i+=`:
2
- ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case f.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case f.DEBUG:console.debug(i);break;case f.INFO:console.info(i);break;case f.WARN:console.warn(i);break;case f.ERROR:console.error(i);break;default:console.log(i)}}}function j(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{i(f.VERBOSE,d,a,c,b)},debug:(a,c)=>{i(f.DEBUG,d,a,c,b)},info:(a,c)=>{i(f.INFO,d,a,c,b)},warn:(a,c)=>{i(f.WARN,d,a,c,b)},error:(a,c)=>{i(f.ERROR,d,a,c,b)}}}var k=c(29021),l=c(33873),m=c.n(l),n=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}({});function o(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?m().resolve(a):process.cwd()}let p=j("utils/storage/backend"),q=m().join(o(),"db"),r=m().join(o(),".next","storage"),s=a=>m().join(q,`${a}.json`);async function t(){try{await k.promises.access(q),p.verbose(`Storage directory exists: ${q}`)}catch{p.debug(`Creating storage directory: ${q}`),await k.promises.mkdir(q,{recursive:!0})}try{await k.promises.access(r),p.warn(`Old storage directory found: ${r}. This may cause data inconsistency issues.`)}catch{}}let u=new Map,v=0;async function w(a,b){let c=m().dirname(a);await k.promises.mkdir(c,{recursive:!0});let d=`${a}.tmp.${process.pid}.${++v}`;try{await k.promises.writeFile(d,b),await k.promises.rename(d,a)}catch(a){try{await k.promises.unlink(d)}catch{}throw a}}async function x(a,b){let c=s(a),d=(u.get(a)??Promise.resolve()).catch(()=>{}).then(()=>w(c,JSON.stringify(b,null,2)));u.set(a,d);try{await d,p.verbose(`Successfully saved item to: ${c}`)}catch(b){throw p.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{u.get(a)===d&&u.delete(a)}}async function y(a,b){try{await t();let c=s(a),d=await k.promises.readFile(c,"utf-8");if(0===d.trim().length)return p.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(d);return p.verbose(`Successfully loaded item from: ${c}`),a}catch(b){p.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await k.promises.writeFile(a,d),p.info(`Created backup of corrupted file at: ${a}`)}catch(a){p.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 p.verbose(`Item with key "${a}" not found at ${s(a)}, returning default.`),b;throw p.error(`CRITICAL: Error loading item with key "${a}" from ${s(a)}:`,c),c}}var z=c(92347),A=c.n(z);let B=j("utils/encryption/session"),C=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map),D=j("utils/encryption/secure");class E extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,E.prototype)}}let F="data_encryption_key",G="data_encryption_iv",H="data_encryption_salt",I="encryption_type";var J=function(a){return a.DEFAULT="default",a.USER="user",a}(J||{});function K(){let a=A().enc.Utf8.parse("flujo_fixed_salt_v1");return A().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function L(){D.debug("initializeDefaultEncryption: Entering method");try{if(await Q())return!0;let a=K(),b=A().lib.WordArray.random(8),c=A().lib.WordArray.random(16),d=A().AES.encrypt(b.toString(),a,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7}),e=A().enc.Utf8.parse("flujo_fixed_salt_v1"),f={[F]:d.toString(),[G]:c.toString(),[H]:e.toString(),encryption_version:1,[I]:"default"};return await x(n.ENCRYPTION_KEY,f),!0}catch(a){return D.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function M(){D.debug("getDefaultDEK: Entering method");try{let a=await y(n.ENCRYPTION_KEY,null);if(!a){if(!await L())return D.error("getDefaultDEK: Failed to initialize default encryption"),null;return await M()}if("default"!==a[I])return D.error("getDefaultDEK: Not using default encryption"),null;let b=a[F],c=A().enc.Hex.parse(a[G]),d=K(),e=A().AES.decrypt(b,d,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!e.toString())return D.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return A().enc.Hex.parse(e.toString())}catch(a){return D.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function N(a){D.debug("getUserDEK: Entering method");try{let b=await y(n.ENCRYPTION_KEY,null);if(!b)return D.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[I])return D.error("getUserDEK: Not using user encryption"),null;let c=b[F],d=A().enc.Hex.parse(b[G]),e=A().enc.Hex.parse(b[H]),f=A().PBKDF2(a,e,{keySize:8,iterations:1e5}),g=A().AES.decrypt(c,f,{iv:d,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!g.toString())return D.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return A().enc.Hex.parse(g.toString())}catch(a){return D.error("getUserDEK: Failed to get user DEK:",a),null}}async function O(a,b=!1){D.debug("getDEK: Entering method");try{if(b&&a){D.debug("getDEK: Using session token");let b=function(a){let b=C.get(a);if(!b)return B.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(B.warn(`Session expired: ${a}`),C.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return A().enc.Hex.parse(b);D.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await y(n.ENCRYPTION_KEY,null);if(!c){if(D.info("getDEK: No encryption metadata found, initializing default encryption"),!await L())return D.error("getDEK: Failed to initialize default encryption"),null;return await O(a,b)}if("user"!==c[I])return await M();{let c=global.__flujo_server_dek??null;if(c)return D.debug("getDEK: Using server unlock state for user encryption"),A().enc.Hex.parse(c);if(a&&!b){let b=await N(a);if(b)return b;D.warn("getDEK: Provided password did not yield a valid user DEK")}throw D.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new E}}catch(a){if(a instanceof E)throw a;D.error("getDEK: Failed to get DEK:",a);try{if(D.warn("getDEK: Attempting to initialize default encryption as error recovery"),await L())return await M()}catch(a){D.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function P(a,b,c=!1){D.debug("decryptWithPassword: Entering method");try{let d=await O(b,c);if(!d)return null;let e=a.split(":");if(2!==e.length)return D.error("decryptWithPassword: Invalid ciphertext format"),null;let f=A().enc.Hex.parse(e[0]),g=e[1];return A().AES.decrypt(g,d,{iv:f,mode:A().mode.CBC,padding:A().pad.Pkcs7}).toString(A().enc.Utf8)}catch(a){if(a instanceof E)throw a;return D.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function Q(){return D.debug("isEncryptionInitialized: Entering method"),null!==await y(n.ENCRYPTION_KEY,null)}var R=c(40410);let S=j("backend/utils/resolveGlobalVars");async function T(a){S.debug("Entering resolveGlobalVars method");let b=await y(n.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);S.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:")){S.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await P(a);if(c)e=c,S.debug(`Successfully decrypted global variable: ${b}`);else{S.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){S.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){S.warn(`Skipping failed encrypted global variable: ${b}`);continue}S.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else S.warn(`Global variable not found: ${b}`)}return c},f=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>f(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await f(d);return b}return a},g=await f(a);return"object"==typeof a&&null!==a&&S.debug("Resolved global variables result:",JSON.stringify(g,null,2)),S.debug("Completed global variable resolution"),g}async function U(a,b=0){if(S.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return S.warn("Empty value provided"),null;if(b>=10)return S.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){S.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await P(a);if(!d)return S.warn(`Failed to decrypt value at depth ${b}`),null;S.debug(`Successfully decrypted value at depth ${b}`),S.verbose(d),c=d}catch(a){return S.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(S.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){S.debug(`Resolving global variables at depth ${b}`);try{let a=await T(c);if(S.verbose(a),a!==c)return S.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),U(a,b+1);c=a}catch(a){return S.error(`Error resolving global variables at depth ${b}:`,a),null}}return S.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,R.D)([T,U]),(0,d.A)(T,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(U,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},32631:(a,b,c)=>{c.d(b,{D:()=>h}),c(21124);var d=c(38301),e=c(19815);c(84040),c(9718);let f=(0,e.h)("frontend/contexts/ThemeContext"),g=(0,d.createContext)(void 0),h=()=>{let a=(0,d.useContext)(g);if(!a)throw f.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return f.debug("useTheme hook accessed"),a}},38296:(a,b,c)=>{c.d(b,{A:()=>C});var d=c(21124),e=c(38301),f=c(54573),g=c(81637),h=c(79515),i=c(20830),j=c(53773),k=c(82666),l=c(37674),m=c(67101),n=c(41893),o=c(95587),p=c(77028),q=c(44079),r=c(6537),s=c(19815),t=c(49938),u=c(47902),v=c(11480),w=c(93083),x=c(85557),y=c(91034),z=c(82571),A=c(92173);let B=(0,s.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),C=({serverName:a,initialEnv:b,onSave:c,onDelete:s,onServerRestart:C})=>{let{globalEnvVars:D}=(0,t.rX)(),[E,F]=(0,e.useState)([]),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(null);(0,e.useEffect)(()=>{B.debug(`Initializing environment variables for server: ${a}`,{variableCount:Object.keys(b).length}),F(Object.entries(b).map(([a,b])=>{let c="object"==typeof b&&null!==b&&"value"in b?b.value:b,d="object"==typeof b&&null!==b&&"metadata"in b?b.metadata:{isSecret:(0,z.xc)(a)},e=c.match(/\$\{global:([^}]+)\}/);if(e){let b=e[1];return{key:a,value:c,isSecret:d.isSecret,isBound:!0,boundTo:b}}let f="string"==typeof c&&(c.startsWith("encrypted:")||c.startsWith("encrypted_failed:"));return{key:a,value:f?A.gF:c,isSecret:d.isSecret,isEncrypted:f}}))},[b]);let O=async b=>{B.debug(`Removing environment variable at index: ${b}`);let c=E[b];if("Global"===a&&s&&c.key)try{await s(c.key),F(E.filter((a,c)=>c!==b))}catch(a){B.error(`Failed to delete environment variable: ${c.key}`,a)}else F(E.filter((a,c)=>c!==b)),H(!0)},P=(a,b,c)=>{let d=[...E];if("isSecret"===b){let b=d[a];b.isSecret&&!c?d[a]={...b,isSecret:c,value:"",isEncrypted:!1,showWarning:!0}:d[a]={...b,isSecret:c}}else{let e={...d[a],[b]:c,isSecret:"key"===b?(0,z.xc)(c):d[a].isSecret};"key"===b&&(e.isValidKey=""===c||/^[a-zA-Z0-9_]+$/.test(c)),"value"===b&&(d[a].isEncrypted&&(e.isEncrypted=!1),d[a].showWarning&&c&&(e.showWarning=!1)),d[a]=e}F(d),H(!0)},Q=async()=>{if(E.some(a=>""!==a.key&&!1===a.isValidKey))return void B.error("Cannot save: Some variable names contain invalid characters");B.debug(`Saving environment variables for server: ${a}`,{variableCount:E.length}),J(!0);try{let b=E.reduce((a,b)=>{let{key:c,value:d,isBound:e,boundTo:f,isSecret:g,isEncrypted:h}=b;return c&&(e&&f?a[c]={value:`$\{global:${f}}`,metadata:{isSecret:g}}:g&&d===A.gF||(a[c]={value:d,metadata:{isSecret:g}})),a},{});await c(b),H(!1),C&&"Global"!==a&&(B.debug(`Restarting server after env variable changes: ${a}`),await C(a))}catch(a){B.error("Failed to save environment variables:",a)}J(!1)};return(0,d.jsxs)(f.A,{sx:{p:3,borderRadius:2,border:1,borderColor:a=>"dark"===a.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,d.jsxs)(h.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",a]}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,d.jsx)(u.A,{}),onClick:()=>{B.debug("Adding new environment variable"),F([...E,{key:"",value:"",isSecret:!1}]),H(!0)},children:"Add Variable"})]}),(0,d.jsx)(j.A,{spacing:3,children:E.map((a,b)=>(0,d.jsxs)(k.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,placeholder:"Variable name",value:a.key,onChange:a=>P(b,"key",a.target.value),error:!1===a.isValidKey,helperText:!1===a.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,type:a.isSecret?"password":"text",placeholder:a.showWarning?"Re-enter value":"Value",value:a.value,onChange:a=>P(b,"value",a.target.value),InputProps:{readOnly:a.isBound,startAdornment:a.isEncrypted?(0,d.jsx)(m.A,{position:"start",children:(0,d.jsx)(v.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:a.isBound?(0,d.jsx)(m.A,{position:"end",children:(0,d.jsx)(n.A,{size:"small",label:`Bound to global: ${a.boundTo}`,color:"primary",variant:"outlined",onDelete:()=>(a=>{B.debug(`Unbinding variable at index: ${a}`);let b=[...E];b[a]={...b[a],isBound:!1,boundTo:void 0},F(b),H(!0)})(b),deleteIcon:(0,d.jsx)(w.A,{fontSize:"small"})})}):null},error:a.showWarning,helperText:a.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:b=>a.isBound?"dark"===b.palette.mode?"#1a1a1a":"#f9fafb":b.palette.background.paper}})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:2,children:(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(o.A,{control:(0,d.jsx)(p.A,{checked:a.isSecret,onChange:a=>P(b,"isSecret",a.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!a.isBound&&(0,d.jsx)(q.A,{size:"small",color:"primary",onClick:()=>(a=>{B.debug(`Opening bind modal for variable at index: ${a}`),N(a),L(!0)})(b),title:"Bind to global variable",sx:{mr:1},children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(q.A,{size:"small",color:"error",onClick:()=>O(b),title:"Remove variable",children:(0,d.jsx)(y.A,{fontSize:"small"})})]})})]},b))}),(0,d.jsx)(r.A,{open:K,onClose:()=>{L(!1),N(null)},children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,d.jsx)(h.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(D).length?(0,d.jsx)(h.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,d.jsx)(g.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(D).map(([a,b])=>(0,d.jsxs)(i.A,{fullWidth:!0,variant:"text",onClick:()=>(a=>{if(null!==M){B.debug(`Binding variable at index ${M} to global variable: ${a}`);let b=[...E];b[M]={...b[M],isBound:!0,boundTo:a,value:`$\{global:${a}}`},F(b),L(!1),N(null),H(!0)}})(a),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,d.jsx)(h.default,{variant:"body2",children:a}),(0,d.jsx)(h.default,{variant:"caption",color:"text.secondary",children:b&&"object"==typeof b&&b.metadata&&b.metadata.isSecret?A.gF:b&&"object"==typeof b?b.value:b})]},a))}),(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,d.jsx)(i.A,{variant:"outlined",onClick:()=>{L(!1),N(null)},children:"Cancel"})})]})}),G&&(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,d.jsx)(i.A,{variant:"contained",color:"success",onClick:Q,disabled:I||E.some(a=>""!==a.key&&!1===a.isValidKey),children:I?"Saving...":"Save Changes"})})]})}},82571:(a,b,c)=>{c.d(b,{xc:()=>e,yo:()=>f});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}},84040:(a,b,c)=>{c.d(b,{Ic:()=>g});var d=c(32631);let e=(0,c(19815).h)("frontend/utils/theme"),f={light:{background:"#FFFFFF",foreground:"#2C3E50",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"}},dark:{background:"#1a1a1a",foreground:"#f0f0f0",paperBackground:"#2a2a2a",textSecondary:"#aaaaaa",border:"#3a3a3a",heading:"#f8f8f8",text:"#f0f0f0",secondaryText:"#aaa",error:{background:"#3a2222",border:"#5a3333",text:"#f87171"}}};function g(){let{isDarkMode:a}=(0,d.D)();return e.debug(`useThemeUtils called with isDarkMode: ${a}`),{getThemeValue:(b,c)=>a?c:b,getThemeColor:b=>{let c=b.split("."),d=f[a?"dark":"light"];for(let a of c)if(!d||"object"!=typeof d||!(a in d))return e.warn(`Theme color path not found: ${b}`),"";else d=d[a];return d},colors:a?f.dark:f.light,isDarkMode:a}}},92173:(a,b,c)=>{c.d(b,{RJ:()=>e,gF:()=>d});let d="masked:********",e="********"}};
2
+ ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case f.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case f.DEBUG:console.debug(i);break;case f.INFO:console.info(i);break;case f.WARN:console.warn(i);break;case f.ERROR:console.error(i);break;default:console.log(i)}}}function j(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{i(f.VERBOSE,d,a,c,b)},debug:(a,c)=>{i(f.DEBUG,d,a,c,b)},info:(a,c)=>{i(f.INFO,d,a,c,b)},warn:(a,c)=>{i(f.WARN,d,a,c,b)},error:(a,c)=>{i(f.ERROR,d,a,c,b)}}}var k=c(29021),l=c(33873),m=c.n(l),n=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}({});function o(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?m().resolve(a):process.cwd()}let p=j("utils/storage/backend"),q=m().join(o(),"db"),r=m().join(o(),".next","storage"),s=a=>m().join(q,`${a}.json`);async function t(){try{await k.promises.access(q),p.verbose(`Storage directory exists: ${q}`)}catch{p.debug(`Creating storage directory: ${q}`),await k.promises.mkdir(q,{recursive:!0})}try{await k.promises.access(r),p.warn(`Old storage directory found: ${r}. This may cause data inconsistency issues.`)}catch{}}let u=new Map,v=0;async function w(a,b){let c=m().dirname(a);await k.promises.mkdir(c,{recursive:!0});let d=`${a}.tmp.${process.pid}.${++v}`;try{await k.promises.writeFile(d,b),await k.promises.rename(d,a)}catch(a){try{await k.promises.unlink(d)}catch{}throw a}}async function x(a,b){let c=s(a),d=(u.get(a)??Promise.resolve()).catch(()=>{}).then(()=>w(c,JSON.stringify(b,null,2)));u.set(a,d);try{await d,p.verbose(`Successfully saved item to: ${c}`)}catch(b){throw p.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{u.get(a)===d&&u.delete(a)}}async function y(a,b){try{await t();let c=s(a),d=await k.promises.readFile(c,"utf-8");if(0===d.trim().length)return p.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(d);return p.verbose(`Successfully loaded item from: ${c}`),a}catch(b){p.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await k.promises.writeFile(a,d),p.info(`Created backup of corrupted file at: ${a}`)}catch(a){p.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 p.verbose(`Item with key "${a}" not found at ${s(a)}, returning default.`),b;throw p.error(`CRITICAL: Error loading item with key "${a}" from ${s(a)}:`,c),c}}var z=c(92347),A=c.n(z);let B=j("utils/encryption/session"),C=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map),D=j("utils/encryption/secure");class E extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,E.prototype)}}let F="data_encryption_key",G="data_encryption_iv",H="data_encryption_salt",I="encryption_type";var J=function(a){return a.DEFAULT="default",a.USER="user",a}(J||{});function K(){let a=A().enc.Utf8.parse("flujo_fixed_salt_v1");return A().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function L(){D.debug("initializeDefaultEncryption: Entering method");try{if(await Q())return!0;let a=K(),b=A().lib.WordArray.random(8),c=A().lib.WordArray.random(16),d=A().AES.encrypt(b.toString(),a,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7}),e=A().enc.Utf8.parse("flujo_fixed_salt_v1"),f={[F]:d.toString(),[G]:c.toString(),[H]:e.toString(),encryption_version:1,[I]:"default"};return await x(n.ENCRYPTION_KEY,f),!0}catch(a){return D.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function M(){D.debug("getDefaultDEK: Entering method");try{let a=await y(n.ENCRYPTION_KEY,null);if(!a){if(!await L())return D.error("getDefaultDEK: Failed to initialize default encryption"),null;return await M()}if("default"!==a[I])return D.error("getDefaultDEK: Not using default encryption"),null;let b=a[F],c=A().enc.Hex.parse(a[G]),d=K(),e=A().AES.decrypt(b,d,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!e.toString())return D.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return A().enc.Hex.parse(e.toString())}catch(a){return D.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function N(a){D.debug("getUserDEK: Entering method");try{let b=await y(n.ENCRYPTION_KEY,null);if(!b)return D.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[I])return D.error("getUserDEK: Not using user encryption"),null;let c=b[F],d=A().enc.Hex.parse(b[G]),e=A().enc.Hex.parse(b[H]),f=A().PBKDF2(a,e,{keySize:8,iterations:1e5}),g=A().AES.decrypt(c,f,{iv:d,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!g.toString())return D.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return A().enc.Hex.parse(g.toString())}catch(a){return D.error("getUserDEK: Failed to get user DEK:",a),null}}async function O(a,b=!1){D.debug("getDEK: Entering method");try{if(b&&a){D.debug("getDEK: Using session token");let b=function(a){let b=C.get(a);if(!b)return B.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(B.warn(`Session expired: ${a}`),C.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return A().enc.Hex.parse(b);D.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await y(n.ENCRYPTION_KEY,null);if(!c){if(D.info("getDEK: No encryption metadata found, initializing default encryption"),!await L())return D.error("getDEK: Failed to initialize default encryption"),null;return await O(a,b)}if("user"!==c[I])return await M();{let c=global.__flujo_server_dek??null;if(c)return D.debug("getDEK: Using server unlock state for user encryption"),A().enc.Hex.parse(c);if(a&&!b){let b=await N(a);if(b)return b;D.warn("getDEK: Provided password did not yield a valid user DEK")}throw D.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new E}}catch(a){if(a instanceof E)throw a;D.error("getDEK: Failed to get DEK:",a);try{if(D.warn("getDEK: Attempting to initialize default encryption as error recovery"),await L())return await M()}catch(a){D.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function P(a,b,c=!1){D.debug("decryptWithPassword: Entering method");try{let d=await O(b,c);if(!d)return null;let e=a.split(":");if(2!==e.length)return D.error("decryptWithPassword: Invalid ciphertext format"),null;let f=A().enc.Hex.parse(e[0]),g=e[1];return A().AES.decrypt(g,d,{iv:f,mode:A().mode.CBC,padding:A().pad.Pkcs7}).toString(A().enc.Utf8)}catch(a){if(a instanceof E)throw a;return D.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function Q(){return D.debug("isEncryptionInitialized: Entering method"),null!==await y(n.ENCRYPTION_KEY,null)}var R=c(40410);let S=j("backend/utils/resolveGlobalVars");async function T(a){S.debug("Entering resolveGlobalVars method");let b=await y(n.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);S.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:")){S.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await P(a);if(c)e=c,S.debug(`Successfully decrypted global variable: ${b}`);else{S.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){S.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){S.warn(`Skipping failed encrypted global variable: ${b}`);continue}S.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else S.warn(`Global variable not found: ${b}`)}return c},f=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>f(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await f(d);return b}return a},g=await f(a);return"object"==typeof a&&null!==a&&S.debug("Resolved global variables result:",JSON.stringify(g,null,2)),S.debug("Completed global variable resolution"),g}async function U(a,b=0){if(S.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return S.warn("Empty value provided"),null;if(b>=10)return S.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){S.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await P(a);if(!d)return S.warn(`Failed to decrypt value at depth ${b}`),null;S.debug(`Successfully decrypted value at depth ${b}`),S.verbose(d),c=d}catch(a){return S.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(S.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){S.debug(`Resolving global variables at depth ${b}`);try{let a=await T(c);if(S.verbose(a),a!==c)return S.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),U(a,b+1);c=a}catch(a){return S.error(`Error resolving global variables at depth ${b}:`,a),null}}return S.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,R.D)([T,U]),(0,d.A)(T,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(U,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},32631:(a,b,c)=>{c.d(b,{D:()=>h}),c(21124);var d=c(38301),e=c(19815);c(84040),c(9718);let f=(0,e.h)("frontend/contexts/ThemeContext"),g=(0,d.createContext)(void 0),h=()=>{let a=(0,d.useContext)(g);if(!a)throw f.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return f.debug("useTheme hook accessed"),a}},38296:(a,b,c)=>{c.d(b,{A:()=>C});var d=c(21124),e=c(38301),f=c(54573),g=c(81637),h=c(79515),i=c(20830),j=c(53773),k=c(82666),l=c(37674),m=c(67101),n=c(41893),o=c(95587),p=c(77028),q=c(44079),r=c(6537),s=c(19815),t=c(49938),u=c(47902),v=c(11480),w=c(93083),x=c(85557),y=c(91034),z=c(82571),A=c(92173);let B=(0,s.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),C=({serverName:a,initialEnv:b,onSave:c,onDelete:s,onServerRestart:C})=>{let{globalEnvVars:D}=(0,t.rX)(),[E,F]=(0,e.useState)([]),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(null);(0,e.useEffect)(()=>{B.debug(`Initializing environment variables for server: ${a}`,{variableCount:Object.keys(b).length}),F(Object.entries(b).map(([a,b])=>{let c="object"==typeof b&&null!==b&&"value"in b?b.value:b,d="object"==typeof b&&null!==b&&"metadata"in b?b.metadata:{isSecret:(0,z.xc)(a)},e=c.match(/\$\{global:([^}]+)\}/);if(e){let b=e[1];return{key:a,value:c,isSecret:d.isSecret,isBound:!0,boundTo:b}}let f="string"==typeof c&&(c.startsWith("encrypted:")||c.startsWith("encrypted_failed:"));return{key:a,value:f?A.gF:c,isSecret:d.isSecret,isEncrypted:f}}))},[b]);let O=async b=>{B.debug(`Removing environment variable at index: ${b}`);let c=E[b];if("Global"===a&&s&&c.key)try{await s(c.key),F(E.filter((a,c)=>c!==b))}catch(a){B.error(`Failed to delete environment variable: ${c.key}`,a)}else F(E.filter((a,c)=>c!==b)),H(!0)},P=(a,b,c)=>{let d=[...E];if("isSecret"===b){let b=d[a];b.isSecret&&!c?d[a]={...b,isSecret:c,value:"",isEncrypted:!1,showWarning:!0}:d[a]={...b,isSecret:c}}else{let e={...d[a],[b]:c,isSecret:"key"===b?(0,z.xc)(c):d[a].isSecret};"key"===b&&(e.isValidKey=""===c||/^[a-zA-Z0-9_]+$/.test(c)),"value"===b&&(d[a].isEncrypted&&(e.isEncrypted=!1),d[a].showWarning&&c&&(e.showWarning=!1)),d[a]=e}F(d),H(!0)},Q=async()=>{if(E.some(a=>""!==a.key&&!1===a.isValidKey))return void B.error("Cannot save: Some variable names contain invalid characters");B.debug(`Saving environment variables for server: ${a}`,{variableCount:E.length}),J(!0);try{let b=E.reduce((a,b)=>{let{key:c,value:d,isBound:e,boundTo:f,isSecret:g,isEncrypted:h}=b;return c&&(e&&f?a[c]={value:`$\{global:${f}}`,metadata:{isSecret:g}}:g&&d===A.gF||(a[c]={value:d,metadata:{isSecret:g}})),a},{});await c(b),H(!1),C&&"Global"!==a&&(B.debug(`Restarting server after env variable changes: ${a}`),await C(a))}catch(a){B.error("Failed to save environment variables:",a)}J(!1)};return(0,d.jsxs)(f.A,{sx:{p:3,borderRadius:2,border:1,borderColor:a=>"dark"===a.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,d.jsxs)(h.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",a]}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,d.jsx)(u.A,{}),onClick:()=>{B.debug("Adding new environment variable"),F([...E,{key:"",value:"",isSecret:!1}]),H(!0)},children:"Add Variable"})]}),(0,d.jsx)(j.A,{spacing:3,children:E.map((a,b)=>(0,d.jsxs)(k.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,placeholder:"Variable name",value:a.key,onChange:a=>P(b,"key",a.target.value),error:!1===a.isValidKey,helperText:!1===a.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,type:a.isSecret?"password":"text",placeholder:a.showWarning?"Re-enter value":"Value",value:a.value,onChange:a=>P(b,"value",a.target.value),InputProps:{readOnly:a.isBound,startAdornment:a.isEncrypted?(0,d.jsx)(m.A,{position:"start",children:(0,d.jsx)(v.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:a.isBound?(0,d.jsx)(m.A,{position:"end",children:(0,d.jsx)(n.A,{size:"small",label:`Bound to global: ${a.boundTo}`,color:"primary",variant:"outlined",onDelete:()=>(a=>{B.debug(`Unbinding variable at index: ${a}`);let b=[...E];b[a]={...b[a],isBound:!1,boundTo:void 0},F(b),H(!0)})(b),deleteIcon:(0,d.jsx)(w.A,{fontSize:"small"})})}):null},error:a.showWarning,helperText:a.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:b=>a.isBound?"dark"===b.palette.mode?"#1a1a1a":"#f9fafb":b.palette.background.paper}})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:2,children:(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(o.A,{control:(0,d.jsx)(p.A,{checked:a.isSecret,onChange:a=>P(b,"isSecret",a.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!a.isBound&&(0,d.jsx)(q.A,{size:"small",color:"primary",onClick:()=>(a=>{B.debug(`Opening bind modal for variable at index: ${a}`),N(a),L(!0)})(b),title:"Bind to global variable",sx:{mr:1},children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(q.A,{size:"small",color:"error",onClick:()=>O(b),title:"Remove variable",children:(0,d.jsx)(y.A,{fontSize:"small"})})]})})]},b))}),(0,d.jsx)(r.A,{open:K,onClose:()=>{L(!1),N(null)},children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,d.jsx)(h.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(D).length?(0,d.jsx)(h.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,d.jsx)(g.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(D).map(([a,b])=>(0,d.jsxs)(i.A,{fullWidth:!0,variant:"text",onClick:()=>(a=>{if(null!==M){B.debug(`Binding variable at index ${M} to global variable: ${a}`);let b=[...E];b[M]={...b[M],isBound:!0,boundTo:a,value:`$\{global:${a}}`},F(b),L(!1),N(null),H(!0)}})(a),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,d.jsx)(h.default,{variant:"body2",children:a}),(0,d.jsx)(h.default,{variant:"caption",color:"text.secondary",children:b&&"object"==typeof b&&b.metadata&&b.metadata.isSecret?A.gF:b&&"object"==typeof b?b.value:b})]},a))}),(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,d.jsx)(i.A,{variant:"outlined",onClick:()=>{L(!1),N(null)},children:"Cancel"})})]})}),G&&(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,d.jsx)(i.A,{variant:"contained",color:"success",onClick:Q,disabled:I||E.some(a=>""!==a.key&&!1===a.isValidKey),children:I?"Saving...":"Save Changes"})})]})}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}},84040:(a,b,c)=>{c.d(b,{Ic:()=>g});var d=c(32631);let e=(0,c(19815).h)("frontend/utils/theme"),f={light:{background:"#FFFFFF",foreground:"#2C3E50",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"}},dark:{background:"#1a1a1a",foreground:"#f0f0f0",paperBackground:"#2a2a2a",textSecondary:"#aaaaaa",border:"#3a3a3a",heading:"#f8f8f8",text:"#f0f0f0",secondaryText:"#aaa",error:{background:"#3a2222",border:"#5a3333",text:"#f87171"}}};function g(){let{isDarkMode:a}=(0,d.D)();return e.debug(`useThemeUtils called with isDarkMode: ${a}`),{getThemeValue:(b,c)=>a?c:b,getThemeColor:b=>{let c=b.split("."),d=f[a?"dark":"light"];for(let a of c)if(!d||"object"!=typeof d||!(a in d))return e.warn(`Theme color path not found: ${b}`),"";else d=d[a];return d},colors:a?f.dark:f.light,isDarkMode:a}}},92173:(a,b,c)=>{c.d(b,{RJ:()=>e,gF:()=>d});let d="masked:********",e="********"}};
@@ -1,3 +1,3 @@
1
1
  exports.id=2776,exports.ids=[2776],exports.modules={11525:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,81170,23)),Promise.resolve().then(c.t.bind(c,23597,23)),Promise.resolve().then(c.t.bind(c,36893,23)),Promise.resolve().then(c.t.bind(c,89748,23)),Promise.resolve().then(c.t.bind(c,6060,23)),Promise.resolve().then(c.t.bind(c,7184,23)),Promise.resolve().then(c.t.bind(c,69576,23)),Promise.resolve().then(c.t.bind(c,73041,23)),Promise.resolve().then(c.t.bind(c,51384,23))},13516:(a,b,c)=>{"use strict";c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},19815:(a,b,c)=>{"use strict";c.d(b,{h:()=>i});let d={LOG_LEVEL:3},e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.LOG_LEVEL?d.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
- ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},24677:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,54160,23)),Promise.resolve().then(c.t.bind(c,31603,23)),Promise.resolve().then(c.t.bind(c,68495,23)),Promise.resolve().then(c.t.bind(c,75170,23)),Promise.resolve().then(c.t.bind(c,55145,23)),Promise.resolve().then(c.t.bind(c,78922,23)),Promise.resolve().then(c.t.bind(c,29234,23)),Promise.resolve().then(c.t.bind(c,34644,23)),Promise.resolve().then(c.bind(c,82146))},30301:(a,b,c)=>{Promise.resolve().then(c.bind(c,41306))},41306:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"C:\\\\Users\\\\MarioAndreschak\\\\Documents\\\\GitHub\\\\FLUJO\\\\src\\\\frontend\\\\components\\\\AppWrapper.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx","default")},41917:(a,b,c)=>{Promise.resolve().then(c.bind(c,49428))},49428:(a,b,c)=>{"use strict";c.d(b,{default:()=>p});var d=c(21124),e=c(38301),f=c.n(e),g=c(13973);let h=(0,c(19815).h)("frontend/components/AppWrapper"),i=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/ThemeContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading theme..."})}),j=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/StorageContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading storage..."})}),k=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Navigation"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading navigation..."})}),l=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./EncryptionAuthDialog"]},ssr:!1,loading:()=>null}),m=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/TourContext"]},ssr:!1,loading:()=>null}),n=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Tour/TourOverlay"]},ssr:!1,loading:()=>null});class o extends f().Component{constructor(a){super(a),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(a){h.error("AppWrapper error boundary caught an error:",a)}render(){return this.state.hasError?(0,d.jsxs)("div",{style:{padding:"20px",textAlign:"center"},children:[(0,d.jsx)("h2",{children:"Something went wrong loading the application."}),(0,d.jsx)("p",{children:"Please try refreshing the page."}),(0,d.jsx)("button",{onClick:()=>window.location.reload(),style:{padding:"8px 16px",background:"#3498DB",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",marginTop:"10px"},children:"Refresh"})]}):this.props.children}}function p({children:a}){return h.debug("Rendering AppWrapper"),(0,d.jsx)(o,{children:(0,d.jsx)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading application..."}),children:(0,d.jsx)(i,{children:(0,d.jsx)(j,{children:(0,d.jsxs)(m,{children:[(0,d.jsxs)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading navigation..."}),children:[(0,d.jsx)(k,{}),(0,d.jsx)(l,{})]}),(0,d.jsx)("main",{children:a}),(0,d.jsx)(n,{})]})})})})})}},50846:(a,b,c)=>{"use strict";c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
+ ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},24677:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,54160,23)),Promise.resolve().then(c.t.bind(c,31603,23)),Promise.resolve().then(c.t.bind(c,68495,23)),Promise.resolve().then(c.t.bind(c,75170,23)),Promise.resolve().then(c.t.bind(c,77526,23)),Promise.resolve().then(c.t.bind(c,78922,23)),Promise.resolve().then(c.t.bind(c,29234,23)),Promise.resolve().then(c.t.bind(c,12263,23)),Promise.resolve().then(c.bind(c,82146))},30301:(a,b,c)=>{Promise.resolve().then(c.bind(c,41306))},41306:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"C:\\\\Users\\\\MarioAndreschak\\\\Documents\\\\GitHub\\\\FLUJO\\\\src\\\\frontend\\\\components\\\\AppWrapper.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx","default")},41917:(a,b,c)=>{Promise.resolve().then(c.bind(c,49428))},49428:(a,b,c)=>{"use strict";c.d(b,{default:()=>p});var d=c(21124),e=c(38301),f=c.n(e),g=c(13973);let h=(0,c(19815).h)("frontend/components/AppWrapper"),i=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/ThemeContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading theme..."})}),j=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/StorageContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading storage..."})}),k=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Navigation"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading navigation..."})}),l=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./EncryptionAuthDialog"]},ssr:!1,loading:()=>null}),m=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/TourContext"]},ssr:!1,loading:()=>null}),n=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Tour/TourOverlay"]},ssr:!1,loading:()=>null});class o extends f().Component{constructor(a){super(a),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(a){h.error("AppWrapper error boundary caught an error:",a)}render(){return this.state.hasError?(0,d.jsxs)("div",{style:{padding:"20px",textAlign:"center"},children:[(0,d.jsx)("h2",{children:"Something went wrong loading the application."}),(0,d.jsx)("p",{children:"Please try refreshing the page."}),(0,d.jsx)("button",{onClick:()=>window.location.reload(),style:{padding:"8px 16px",background:"#3498DB",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",marginTop:"10px"},children:"Refresh"})]}):this.props.children}}function p({children:a}){return h.debug("Rendering AppWrapper"),(0,d.jsx)(o,{children:(0,d.jsx)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading application..."}),children:(0,d.jsx)(i,{children:(0,d.jsx)(j,{children:(0,d.jsxs)(m,{children:[(0,d.jsxs)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading navigation..."}),children:[(0,d.jsx)(k,{}),(0,d.jsx)(l,{})]}),(0,d.jsx)("main",{children:a}),(0,d.jsx)(n,{})]})})})})})}},50846:(a,b,c)=>{"use strict";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+=`:
3
3
  ${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)}}}},51472:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>m,metadata:()=>l});var d=c(75338),e=c(94294),f=c.n(e),g=c(81464),h=c.n(g);c(61135);var i=c(50846),j=c(41306);let k=(0,i.h)("app/layout"),l={title:"FLUJO",description:"A browser-based application for managing models, MCP servers, flows and chat interactions"};function m({children:a}){return k.debug("Rendering RootLayout"),(0,d.jsx)("html",{lang:"en",children:(0,d.jsx)("body",{className:`${f().variable} ${h().variable} antialiased`,children:(0,d.jsx)(j.default,{children:a})})})}},61135:()=>{}};
@@ -0,0 +1,5 @@
1
+ "use strict";exports.id=2859,exports.ids=[2859],exports.modules={30227:(a,b,c)=>{c.d(b,{cI:()=>m,oV:()=>o,yM:()=>k});var d=c(50846),e=c(88185),f=c(38204),g=c(9312),h=c(87789);let i=(0,d.h)("backend/services/mcp/flowAuthoringTools"),j=["list_flow_building_blocks","validate_flow_spec","create_flow","search_mcp_marketplace","install_mcp_server"];function k(a){return j.includes(a)}function l(){return{type:"object",properties:{spec:{type:"object",description:"The FlowSpec object (see the tool description for the format)."}},required:["spec"]}}function m(){return[{name:"list_flow_building_blocks",description:'List everything a FlowSpec may reference in this FLUJO instance: configured models (bind to process steps), MCP servers and their tools (attach via "servers"), and existing flows (usable as subflow targets). Call this before authoring a spec.',inputSchema:{type:"object",properties:{}}},{name:"validate_flow_spec",description:`Compile and validate a FlowSpec WITHOUT saving. Returns the compiled flow's validation result (errors block saving; warnings are advisory) so you can iterate until clean, then call create_flow.
2
+
3
+ ${e.R}`,inputSchema:l()},{name:"create_flow",description:`Create a new FLUJO flow from a FlowSpec. The spec is compiled deterministically (layout, ids, and wiring are generated for you) and saved ONLY when validation finds zero errors — otherwise the issues are returned to fix. Use list_flow_building_blocks first to see the models, MCP servers/tools, and existing flows you may reference.
4
+
5
+ ${e.R}`,inputSchema:l()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument, or pick a keyless alternative). First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}}]}function n(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function o(a,b){try{if("list_flow_building_blocks"===a){let a=await (0,g.jY)();return n(a.blocks)}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await (0,h.e)(a);return n(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await (0,h.a)(a,c);return n(d,!d.installed)}if("validate_flow_spec"===a||"create_flow"===a){let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(b);if(!c)return n({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await (0,f.V)(c,{save:"create_flow"===a});if(!d.success)return n({error:d.error,issues:d.issues??[]},!0);let e={flowId:d.flow.id,flowName:d.flow.name,nodeCount:d.flow.nodes.length,edgeCount:d.flow.edges.length,validation:d.validation,..."create_flow"===a?{saved:d.saved,...d.saved?{note:`Flow "${d.flow.name}" was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${d.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return n(e,"create_flow"===a&&!d.saved)}return n({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return i.error("authoringCallTool failed",{toolName:a,err:b}),n({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},38204:(a,b,c)=>{c.d(b,{V:()=>j});var d=c(50846),e=c(79989),f=c(81226),g=c(84671),h=c(9312);let i=(0,d.h)("backend/services/flow/compileFlow");async function j(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,h.jY)(),d=(0,f.d)(a,c.compile);if(!d.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:d.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};let k=(0,h.RB)(d.issues,(0,g.nC)(d.flow,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools})),l=!1;return b.save&&0===k.errorCount?(await e.flowService.saveFlow(d.flow),l=!0,i.info(`Compiled and saved flow "${d.flow.name}" (${d.flow.id})`)):b.save&&i.info(`Compiled flow "${d.flow.name}" has ${k.errorCount} error(s); NOT saved`),{success:!0,flow:d.flow,validation:k,saved:l}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>y,internalToolDefinitions:()=>m});var d=c(50846),e=c(79989),f=c(20433),g=c(27635),h=c(57214),i=c(30227),j=c(81495);let k=(0,d.h)("backend/services/mcp/internalTools");function l(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function m(){return[...(0,i.cI)(),{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}}]}async function n(a){let b=await e.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function o(a){let b=String(a?.flow??"").trim();if(!b)return l({error:'Provide "flow": a flow name or id.'},!0);let c=await n(b);if(!c)return l({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return l({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,h.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return l({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return l({error:b.error?.message??"Unknown error during flow execution."},!0);return l(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function p(a){let b=String(a?.flow??"").trim();if(!b)return l({error:'Provide "flow": a flow name or id.'},!0);let c=await n(b);if(!c)return l({error:`No flow named or with id "${b}".`},!0);let d=await e.flowService.deleteFlow(c.id);return d.success?l({deleted:!0,flowId:c.id,flowName:c.name}):l({error:d.error??`Failed to delete flow "${c.name}".`},!0)}async function q(a){let b=await a.loadServerConfigs();return Array.isArray(b)?l(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){k.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):l({error:b.error??"Failed to load server configs."},!0)}async function r(a,b){let c=String(b?.server??"").trim();if(!c)return l({error:'Provide "server": a FLUJO server name.'},!0);if(c===j._)return l(m().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:d,error:e}=await a.listServerTools(c);return e?l({error:e},!0):l(d.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function s(a,b){let c=String(b?.server??"").trim(),d=String(b?.tool??"").trim();if(!c||!d)return l({error:'Provide "server" and "tool".'},!0);if(c===j._)return l({error:`"${j._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let e=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},f="number"==typeof b?.timeout?b.timeout:void 0,g=await a.callTool(c,d,e,f);if(!g.success)return l({error:g.error??`Tool call failed on ${c}.`},!0);let h=g.data;return h&&Array.isArray(h.content)?h:l(h??{ok:!0})}async function t(a,b){let c=String(b?.server??"").trim();if(!c)return l({error:'Provide "server": a FLUJO server name.'},!0);if(c===j._)return l({ok:!0,note:`"${j._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return l({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return l({restarted:!0,server:c,status:e.status})}async function u(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return l({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===j._)return l({error:`The built-in "${j._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?l({error:e.error},!0):l({server:c,enabled:d})}async function v(){return l((await f.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function w(){return l((await (0,g.z)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function x(a){let b=String(a?.id??"").trim();if(!b)return l({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,g.z)().runNow(b);return d||!c?l({error:d??"Run failed."},!0):l({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function y(a,b,c){try{if((0,i.yM)(b))return await (0,i.oV)(b,c);switch(b){case"execute_flow":return await o(c);case"delete_flow":return await p(c);case"list_mcp_servers":return await q(a);case"list_mcp_server_tools":return await r(a,c);case"call_mcp_tool":return await s(a,c);case"restart_mcp_server":return await t(a,c);case"set_mcp_server_enabled":return await u(a,c);case"list_models":return await v();case"list_planned_executions":return await w();case"run_planned_execution":return await x(c);default:return l({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return k.error("internalCallTool failed",{toolName:b,err:a}),l({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=3243,exports.ids=[3243,9989],exports.modules={9312:(a,b,c)=>{c.d(b,{RB:()=>k,jY:()=>j});var d=c(50846),e=c(20433),f=c(23514),g=c(79989);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}}},79989:(a,b,c)=>{c.d(b,{flowService:()=>k});var d=c(32524),e=c(92372),f=c(46480);let g=(0,c(50846).h)("backend/services/flow/index"),h=f.Z.FLOWS;async function i(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,h,a=>a.id)}catch(a){g.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class j{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return g.debug("Using cached flows"),this.flowsCache;g.debug("Loading flows from storage"),await i();let a=await (0,e.pL)(h);return this.flowsCache=a,g.info("Loaded flows from storage",{count:a.length}),a}catch(a){return g.error("Failed to load flows",a),[]}}async getFlow(a){try{g.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return g.debug(`Flow ${a} found in cache`),b;await i();let c=null;try{c=await (0,e.EI)(h,a,null)}catch(b){g.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return g.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return g.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(5504),c.e(724),c.e(1403)]).then(c.bind(c,91403));b.clearFlowCache(a),g.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){g.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{g.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await i(),await (0,e.Vt)(h,a.id,a);let b=this.flowsCache;if(b){let c=b.findIndex(b=>b.id===a.id);c>=0?b[c]=a:b.push(a),this.flowsCache=b}return await this.invalidateExecutionCache(a.id),g.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return g.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{g.debug(`Deleting flow: ${a}`),await i(),await (0,e.bB)(h,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),g.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return g.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}createNode(a,b){g.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return g.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){g.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return g.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return g.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){g.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return g.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){g.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return g.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let k=new j},81226:(a,b,c)=>{c.d(b,{d:()=>k});var d=c(32524),e=c(49181);let f={type:"arrowclosed",width:20,height:20,color:"#1976d2"},g={stroke:"#1976d2",strokeWidth:2},h=new Set(["full-history","latest-message","isolated"]),i=new Set(["steps","final-only"]);function j(a){let b=(0,e.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}function k(a,b={}){let c=[],e=(a,b,d)=>c.push({severity:"error",code:a,message:b,nodeKey:d}),m=(a,b,d)=>c.push({severity:"warning",code:a,message:b,nodeKey:d}),n=b.models??[],o=new Set((b.servers??[]).map(a=>a.name)),p=b.serverTools??{},q=b.flows??[],r=Array.isArray(a?.nodes)?a.nodes:[],s=Array.isArray(a?.edges)?a.edges:[],t=new Map,u=[],v=[];for(let a of r){let b=a?.key;if(!b||"string"!=typeof b){e("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(t.has(b)){e("node-duplicate-key",`Duplicate node key "${b}" — keys must be unique; the later node was dropped.`,b);continue}let c=a.type;if("mcp"===c){e("mcp-node-not-allowed",`Node "${b}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,b);continue}if("start"!==c&&"process"!==c&&"finish"!==c&&"subflow"!==c){e("unknown-node-type",`Node "${b}" has unknown type "${String(c)}".`,b);continue}let f={},g="string"==typeof a.prompt?a.prompt:void 0;if("start"===c){let{text:a,stripped:c}=j(g??"");c&&m("pill-stripped",`Node "${b}": binding pills are not supported in generated prompts and were replaced with plain names.`,b),f.promptTemplate=a}else if("process"===c){let{text:c,stripped:d}=j(g??"");if(d&&m("pill-stripped",`Node "${b}": binding pills are not supported in generated prompts and were replaced with plain names.`,b),f.promptTemplate=c,a.model){let c=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(a.model,n);c?f.boundModel=c:(f.boundModel=a.model,m("model-unresolved",`Node "${b}": model "${a.model}" does not match any configured model (by id, display name, or name).`,b))}void 0!==a.inputMode&&(h.has(a.inputMode)?(f.inputMode=a.inputMode,"isolated"===a.inputMode&&"string"==typeof a.isolatedPrompt&&(f.isolatedPrompt=a.isolatedPrompt)):m("invalid-input-mode",`Node "${b}": inputMode "${String(a.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,b))}else if("subflow"===c){if(a.flow){let c=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}(a.flow,q);c?f.subflowId=c:e("subflow-unresolved",`Node "${b}": flow "${a.flow}" does not match any existing flow (by id or name).`,b)}else e("subflow-missing-flow",`Node "${b}": subflow nodes need a "flow" (name or id of an existing flow).`,b);if(void 0!==a.inputMode&&(h.has(a.inputMode)?f.inputMode=a.inputMode:m("invalid-input-mode",`Node "${b}": inputMode "${String(a.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,b)),void 0!==a.outputMode&&(i.has(a.outputMode)?f.outputMode=a.outputMode:m("invalid-output-mode",`Node "${b}": outputMode "${String(a.outputMode)}" is not valid (steps | final-only); omitted.`,b)),void 0!==g){let{text:a,stripped:c}=j(g);c&&m("pill-stripped",`Node "${b}": binding pills are not supported in generated prompts and were replaced with plain names.`,b),f.promptTemplate=a}}let k={id:(0,d.A)(),type:c,position:{x:0,y:0},data:{label:a.label||`${c.charAt(0).toUpperCase()}${c.slice(1)} Node`,type:c,...a.description?{description:a.description}:{},properties:f}};if(t.set(b,k),u.push(k),"process"===c&&Array.isArray(a.servers)){let c=new Set;for(let e of a.servers){let a,f=e?.name;if(!f||"string"!=typeof f){m("server-missing-name",`Node "${b}": a server reference is missing its "name"; skipped.`,b);continue}if(c.has(f))continue;c.add(f),o.has(f)||m("server-unknown",`Node "${b}": MCP server "${f}" is not configured in FLUJO.`,b);let g=p[f];if(Array.isArray(e.tools)){if(a=e.tools.filter(a=>"string"==typeof a&&a),g){let c=a.filter(a=>!g.includes(a));c.length>0&&m("tool-unknown",`Node "${b}": server "${f}" does not report tool(s): ${c.join(", ")}.`,b)}}else a=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:f,type:"mcp",properties:{boundServer:f,enabledTools:a}}};u.push(h),v.push({processKey:b,mcpNode:h})}}else"process"!==c&&Array.isArray(a.servers)&&a.servers.length>0&&m("servers-on-non-process",`Node "${b}": only process nodes can have "servers"; ignored.`,b)}if(0===t.size)return e("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),l(null,c);let w=[],x=new Set;for(let a of s){let b=a?.from,c=a?.to,d=b?t.get(b):void 0,f=c?t.get(c):void 0;if(!d||!f){e("edge-unknown-node",`Edge "${String(b)}" -> "${String(c)}" references a node key that does not exist (or was dropped).`);continue}if(d===f){e("edge-self-loop",`Edge "${b}" -> "${c}": a node cannot connect to itself.`);continue}if("start"===f.type){e("edge-into-start",`Edge "${b}" -> "${c}": nothing may connect INTO a start node.`);continue}if("finish"===d.type){e("edge-out-of-finish",`Edge "${b}" -> "${c}": nothing may connect OUT OF a finish node.`);continue}let g=`${b}->${c}`;if(x.has(g)){m("edge-duplicate",`Edge "${b}" -> "${c}" appears more than once; kept the first.`);continue}x.add(g);let h=!0===a.bidirectional;h&&("start"===d.type||"finish"===f.type)&&(m("bidirectional-illegal",`Edge "${b}" -> "${c}" cannot be bidirectional; downgraded to one-way.`),h=!1),w.push(function(a,b,c){let d=`${a.type}-bottom`,e=`${b.type}-top`;return{id:`${a.id}:${d}->${b.id}:${e}`,source:a.id,sourceHandle:d,target:b.id,targetHandle:e,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{}},animated:!0}}(d,f,h))}for(let{processKey:a,mcpNode:b}of v){let c=t.get(a);w.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...f},markerStart:{...f},style:{...g}}}(c,b))}!function(a,b,c,d){let e=new Map;for(let a of c)a.data?.edgeType!=="mcp"&&(e.has(a.source)||e.set(a.source,[]),e.get(a.source).push(a.target));let f=[...b.values()],g=f.filter(a=>"start"===a.type),h=g.length>0?g:f.slice(0,1),i=new Map,j=h.map(a=>({id:a.id,depth:0}));for(let a of j)i.set(a.id,0);for(;j.length;){let{id:a,depth:b}=j.shift();for(let c of e.get(a)??[])i.has(c)||(i.set(c,b+1),j.push({id:c,depth:b+1}))}let k=0;for(let a of i.values())k=Math.max(k,a);for(let a of f)i.has(a.id)||i.set(a.id,k+1);let l=new Map;for(let a of f){let b=i.get(a.id),c=l.get(b)??0;l.set(b,c+1),a.position={x:250+280*c,y:150+170*b}}let m=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=m.get(a)??0;m.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}}(0,t,w,v);let y=q.map(a=>a.name);return l({id:(0,d.A)(),name:function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(a?.name,y),...a?.description?{description:a.description}:{},nodes:u,edges:w},c)}function l(a,b){let c=b.filter(a=>"error"===a.severity).length;return{flow:a,issues:b,errorCount:c,warningCount:b.length-c}}}};
@@ -0,0 +1 @@
1
+ exports.id=3304,exports.ids=[3304],exports.modules={231:(a,b,c)=>{var d=c(2269),e=c(76787);a.exports=function(a){return e(a)&&"[object Arguments]"==d(a)}},595:a=>{var b=Object.prototype.toString;a.exports=function(a){return b.call(a)}},598:(a,b,c)=>{var d=c(32390);a.exports=function(a,b){var c=b?d(a.buffer):a.buffer;return new a.constructor(c,a.byteOffset,a.length)}},1291:a=>{a.exports=function(a){var b=typeof a;return"string"==b||"number"==b||"symbol"==b||"boolean"==b?"__proto__"!==a:null===a}},2269:(a,b,c)=>{var d=c(97922),e=c(60112),f=c(595),g=d?d.toStringTag:void 0;a.exports=function(a){return null==a?void 0===a?"[object Undefined]":"[object Null]":g&&g in Object(a)?e(a):f(a)}},2560:(a,b,c)=>{var d=c(21211),e=c(56705),f=c(36774),g=c(53346),h=/^\[object .+?Constructor\]$/,i=Object.prototype,j=Function.prototype.toString,k=i.hasOwnProperty,l=RegExp("^"+j.call(k).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");a.exports=function(a){return!(!f(a)||e(a))&&(d(a)?l:h).test(g(a))}},5113:(a,b,c)=>{var d=c(97922),e=d?d.prototype:void 0,f=e?e.valueOf:void 0;a.exports=function(a){return f?Object(f.call(a)):{}}},6616:(a,b,c)=>{var d=c(95158),e=c(34846),f=c(18388),g=c(71226),h=c(12875),i=c(79035),j=c(89108),k=c(55092),l=c(45905),m=c(62127),n=c(20413),o=c(78178),p=c(92642),q=c(96016),r=c(28418),s=c(34022),t=c(39545),u=c(38443),v=c(36774),w=c(68369),x=c(89095),y=c(37794),z="[object Arguments]",A="[object Function]",B="[object Object]",C={};C[z]=C["[object Array]"]=C["[object ArrayBuffer]"]=C["[object DataView]"]=C["[object Boolean]"]=C["[object Date]"]=C["[object Float32Array]"]=C["[object Float64Array]"]=C["[object Int8Array]"]=C["[object Int16Array]"]=C["[object Int32Array]"]=C["[object Map]"]=C["[object Number]"]=C[B]=C["[object RegExp]"]=C["[object Set]"]=C["[object String]"]=C["[object Symbol]"]=C["[object Uint8Array]"]=C["[object Uint8ClampedArray]"]=C["[object Uint16Array]"]=C["[object Uint32Array]"]=!0,C["[object Error]"]=C[A]=C["[object WeakMap]"]=!1,a.exports=function a(b,c,D,E,F,G){var H,I=1&c,J=2&c,K=4&c;if(D&&(H=F?D(b,E,F,G):D(b)),void 0!==H)return H;if(!v(b))return b;var L=s(b);if(L){if(H=p(b),!I)return j(b,H)}else{var M=o(b),N=M==A||"[object GeneratorFunction]"==M;if(t(b))return i(b,I);if(M==B||M==z||N&&!F){if(H=J||N?{}:r(b),!I)return J?l(b,h(H,b)):k(b,g(H,b))}else{if(!C[M])return F?b:{};H=q(b,M,I)}}G||(G=new d);var O=G.get(b);if(O)return O;G.set(b,H),w(b)?b.forEach(function(d){H.add(a(d,c,D,d,b,G))}):u(b)&&b.forEach(function(d,e){H.set(e,a(d,c,D,e,b,G))});var P=K?J?n:m:J?y:x,Q=L?void 0:P(b);return e(Q||b,function(d,e){Q&&(d=b[e=d]),f(H,e,a(d,c,D,e,b,G))}),H}},7898:(a,b,c)=>{a.exports=c(96918)["__core-js_shared__"]},8100:a=>{var b=Object.prototype;a.exports=function(a){var c=a&&a.constructor;return a===("function"==typeof c&&c.prototype||b)}},10110:(a,b,c)=>{a.exports=c(22271)(c(96918),"Set")},11045:(a,b,c)=>{a.exports=c(96918).Uint8Array},11782:(a,b,c)=>{var d=c(55e3),e=c(13356),f=c(62242);a.exports=function(a,b){var c=this.__data__;if(c instanceof d){var g=c.__data__;if(!e||g.length<199)return g.push([a,b]),this.size=++c.size,this;c=this.__data__=new f(g)}return c.set(a,b),this.size=c.size,this}},11956:(a,b,c)=>{var d=c(23966),e=c(16478),f=c(38798),g=f&&f.isTypedArray;a.exports=g?e(g):d},12875:(a,b,c)=>{var d=c(18376),e=c(37794);a.exports=function(a,b){return a&&d(b,e(b),a)}},13356:(a,b,c)=>{a.exports=c(22271)(c(96918),"Map")},13396:(a,b,c)=>{var d=c(43882);a.exports=function(a){var b=this.__data__,c=d(b,a);return c<0?void 0:b[c][1]}},15144:(a,b,c)=>{var d=c(96101),e=c(15385),f=c(34022),g=c(39545),h=c(51234),i=c(11956),j=Object.prototype.hasOwnProperty;a.exports=function(a,b){var c=f(a),k=!c&&e(a),l=!c&&!k&&g(a),m=!c&&!k&&!l&&i(a),n=c||k||l||m,o=n?d(a.length,String):[],p=o.length;for(var q in a)(b||j.call(a,q))&&!(n&&("length"==q||l&&("offset"==q||"parent"==q)||m&&("buffer"==q||"byteLength"==q||"byteOffset"==q)||h(q,p)))&&o.push(q);return o}},15385:(a,b,c)=>{var d=c(231),e=c(76787),f=Object.prototype,g=f.hasOwnProperty,h=f.propertyIsEnumerable;a.exports=d(function(){return arguments}())?d:function(a){return e(a)&&g.call(a,"callee")&&!h.call(a,"callee")}},16478:a=>{a.exports=function(a){return function(b){return a(b)}}},18117:(a,b,c)=>{var d=c(91704);a.exports=function(a,b,c){"__proto__"==b&&d?d(a,b,{configurable:!0,enumerable:!0,value:c,writable:!0}):a[b]=c}},18313:(a,b,c)=>{a.exports=c(22271)(c(96918),"DataView")},18376:(a,b,c)=>{var d=c(18388),e=c(18117);a.exports=function(a,b,c,f){var g=!c;c||(c={});for(var h=-1,i=b.length;++h<i;){var j=b[h],k=f?f(c[j],a[j],j,c,a):void 0;void 0===k&&(k=a[j]),g?e(c,j,k):d(c,j,k)}return c}},18388:(a,b,c)=>{var d=c(18117),e=c(38093),f=Object.prototype.hasOwnProperty;a.exports=function(a,b,c){var g=a[b];f.call(a,b)&&e(g,c)&&(void 0!==c||b in a)||d(a,b,c)}},20413:(a,b,c)=>{var d=c(70996),e=c(23400),f=c(37794);a.exports=function(a){return d(a,f,e)}},21211:(a,b,c)=>{var d=c(2269),e=c(36774);a.exports=function(a){if(!e(a))return!1;var b=d(a);return"[object Function]"==b||"[object GeneratorFunction]"==b||"[object AsyncFunction]"==b||"[object Proxy]"==b}},21432:(a,b,c)=>{a.exports=c(81008)(Object.getPrototypeOf,Object)},22271:(a,b,c)=>{var d=c(2560),e=c(78853);a.exports=function(a,b){var c=e(a,b);return d(c)?c:void 0}},23400:(a,b,c)=>{var d=c(25589),e=c(21432),f=c(71009),g=c(56338);a.exports=Object.getOwnPropertySymbols?function(a){for(var b=[];a;)d(b,f(a)),a=e(a);return b}:g},23854:(a,b,c)=>{var d=c(32390);a.exports=function(a,b){var c=b?d(a.buffer):a.buffer;return new a.constructor(c,a.byteOffset,a.byteLength)}},23966:(a,b,c)=>{var d=c(2269),e=c(68627),f=c(76787),g={};g["[object Float32Array]"]=g["[object Float64Array]"]=g["[object Int8Array]"]=g["[object Int16Array]"]=g["[object Int32Array]"]=g["[object Uint8Array]"]=g["[object Uint8ClampedArray]"]=g["[object Uint16Array]"]=g["[object Uint32Array]"]=!0,g["[object Arguments]"]=g["[object Array]"]=g["[object ArrayBuffer]"]=g["[object Boolean]"]=g["[object DataView]"]=g["[object Date]"]=g["[object Error]"]=g["[object Function]"]=g["[object Map]"]=g["[object Number]"]=g["[object Object]"]=g["[object RegExp]"]=g["[object Set]"]=g["[object String]"]=g["[object WeakMap]"]=!1,a.exports=function(a){return f(a)&&e(a.length)&&!!g[d(a)]}},24363:(a,b,c)=>{a.exports=c(81008)(Object.keys,Object)},25589:a=>{a.exports=function(a,b){for(var c=-1,d=b.length,e=a.length;++c<d;)a[e+c]=b[c];return a}},27907:a=>{a.exports=function(a){var b=this.has(a)&&delete this.__data__[a];return this.size-=!!b,b}},27950:a=>{a.exports=function(a){return this.__data__.has(a)}},28315:a=>{a.exports=function(a){var b=this.__data__,c=b.delete(a);return this.size=b.size,c}},28418:(a,b,c)=>{var d=c(55229),e=c(21432),f=c(8100);a.exports=function(a){return"function"!=typeof a.constructor||f(a)?{}:d(e(a))}},29584:(a,b,c)=>{var d=c(43882);a.exports=function(a){return d(this.__data__,a)>-1}},32390:(a,b,c)=>{var d=c(11045);a.exports=function(a){var b=new a.constructor(a.byteLength);return new d(b).set(new d(a)),b}},32444:(a,b,c)=>{var d=c(36774),e=c(8100),f=c(97198),g=Object.prototype.hasOwnProperty;a.exports=function(a){if(!d(a))return f(a);var b=e(a),c=[];for(var h in a)"constructor"==h&&(b||!g.call(a,h))||c.push(h);return c}},34022:a=>{a.exports=Array.isArray},34693:(a,b,c)=>{var d=c(55e3);a.exports=function(){this.__data__=new d,this.size=0}},34846:a=>{a.exports=function(a,b){for(var c=-1,d=null==a?0:a.length;++c<d&&!1!==b(a[c],c,a););return a}},36774:a=>{a.exports=function(a){var b=typeof a;return null!=a&&("object"==b||"function"==b)}},37624:(a,b,c)=>{var d=c(43882);a.exports=function(a,b){var c=this.__data__,e=d(c,a);return e<0?(++this.size,c.push([a,b])):c[e][1]=b,this}},37794:(a,b,c)=>{var d=c(15144),e=c(32444),f=c(56947);a.exports=function(a){return f(a)?d(a,!0):e(a)}},38093:a=>{a.exports=function(a,b){return a===b||a!=a&&b!=b}},38443:(a,b,c)=>{var d=c(46945),e=c(16478),f=c(38798),g=f&&f.isMap;a.exports=g?e(g):d},38798:(a,b,c)=>{a=c.nmd(a);var d=c(58009),e=b&&!b.nodeType&&b,f=e&&a&&!a.nodeType&&a,g=f&&f.exports===e&&d.process,h=function(){try{var a=f&&f.require&&f.require("util").types;if(a)return a;return g&&g.binding&&g.binding("util")}catch(a){}}();a.exports=h},39545:(a,b,c)=>{a=c.nmd(a);var d=c(96918),e=c(61852),f=b&&!b.nodeType&&b,g=f&&a&&!a.nodeType&&a,h=g&&g.exports===f?d.Buffer:void 0,i=h?h.isBuffer:void 0;a.exports=i||e},42082:a=>{a.exports=function(a){return this.__data__.get(a)}},42995:(a,b,c)=>{a.exports=c(22271)(Object,"create")},43304:(a,b,c)=>{var d=c(6616);a.exports=function(a){return d(a,5)}},43882:(a,b,c)=>{var d=c(38093);a.exports=function(a,b){for(var c=a.length;c--;)if(d(a[c][0],b))return c;return -1}},45905:(a,b,c)=>{var d=c(18376),e=c(23400);a.exports=function(a,b){return d(a,e(a),b)}},46945:(a,b,c)=>{var d=c(78178),e=c(76787);a.exports=function(a){return e(a)&&"[object Map]"==d(a)}},48173:(a,b,c)=>{var d=c(43882),e=Array.prototype.splice;a.exports=function(a){var b=this.__data__,c=d(b,a);return!(c<0)&&(c==b.length-1?b.pop():e.call(b,c,1),--this.size,!0)}},51234:a=>{var b=/^(?:0|[1-9]\d*)$/;a.exports=function(a,c){var d=typeof a;return!!(c=null==c?0x1fffffffffffff:c)&&("number"==d||"symbol"!=d&&b.test(a))&&a>-1&&a%1==0&&a<c}},51507:a=>{a.exports=function(){this.__data__=[],this.size=0}},51674:(a,b,c)=>{var d=c(61048);a.exports=function(a,b){var c=d(this,a),e=c.size;return c.set(a,b),this.size+=+(c.size!=e),this}},53346:a=>{var b=Function.prototype.toString;a.exports=function(a){if(null!=a){try{return b.call(a)}catch(a){}try{return a+""}catch(a){}}return""}},55e3:(a,b,c)=>{var d=c(51507),e=c(48173),f=c(13396),g=c(29584),h=c(37624);function i(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}i.prototype.clear=d,i.prototype.delete=e,i.prototype.get=f,i.prototype.has=g,i.prototype.set=h,a.exports=i},55092:(a,b,c)=>{var d=c(18376),e=c(71009);a.exports=function(a,b){return d(a,e(a),b)}},55229:(a,b,c)=>{var d=c(36774),e=Object.create;a.exports=function(){function a(){}return function(b){if(!d(b))return{};if(e)return e(b);a.prototype=b;var c=new a;return a.prototype=void 0,c}}()},56338:a=>{a.exports=function(){return[]}},56705:(a,b,c)=>{var d=c(7898),e=function(){var a=/[^.]+$/.exec(d&&d.keys&&d.keys.IE_PROTO||"");return a?"Symbol(src)_1."+a:""}();a.exports=function(a){return!!e&&e in a}},56947:(a,b,c)=>{var d=c(21211),e=c(68627);a.exports=function(a){return null!=a&&e(a.length)&&!d(a)}},58009:a=>{a.exports="object"==typeof global&&global&&global.Object===Object&&global},58279:a=>{a.exports=function(a,b){for(var c=-1,d=null==a?0:a.length,e=0,f=[];++c<d;){var g=a[c];b(g,c,a)&&(f[e++]=g)}return f}},60112:(a,b,c)=>{var d=c(97922),e=Object.prototype,f=e.hasOwnProperty,g=e.toString,h=d?d.toStringTag:void 0;a.exports=function(a){var b=f.call(a,h),c=a[h];try{a[h]=void 0;var d=!0}catch(a){}var e=g.call(a);return d&&(b?a[h]=c:delete a[h]),e}},61048:(a,b,c)=>{var d=c(1291);a.exports=function(a,b){var c=a.__data__;return d(b)?c["string"==typeof b?"string":"hash"]:c.map}},61852:a=>{a.exports=function(){return!1}},62127:(a,b,c)=>{var d=c(70996),e=c(71009),f=c(89095);a.exports=function(a){return d(a,f,e)}},62242:(a,b,c)=>{var d=c(93113),e=c(99303),f=c(98142),g=c(91362),h=c(51674);function i(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}i.prototype.clear=d,i.prototype.delete=e,i.prototype.get=f,i.prototype.has=g,i.prototype.set=h,a.exports=i},68369:(a,b,c)=>{var d=c(85787),e=c(16478),f=c(38798),g=f&&f.isSet;a.exports=g?e(g):d},68627:a=>{a.exports=function(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=0x1fffffffffffff}},70318:(a,b,c)=>{var d=c(42995);a.exports=function(a,b){var c=this.__data__;return this.size+=+!this.has(a),c[a]=d&&void 0===b?"__lodash_hash_undefined__":b,this}},70996:(a,b,c)=>{var d=c(25589),e=c(34022);a.exports=function(a,b,c){var f=b(a);return e(a)?f:d(f,c(a))}},71009:(a,b,c)=>{var d=c(58279),e=c(56338),f=Object.prototype.propertyIsEnumerable,g=Object.getOwnPropertySymbols;a.exports=g?function(a){return null==a?[]:d(g(a=Object(a)),function(b){return f.call(a,b)})}:e},71226:(a,b,c)=>{var d=c(18376),e=c(89095);a.exports=function(a,b){return a&&d(b,e(b),a)}},74026:(a,b,c)=>{var d=c(42995),e=Object.prototype.hasOwnProperty;a.exports=function(a){var b=this.__data__;if(d){var c=b[a];return"__lodash_hash_undefined__"===c?void 0:c}return e.call(b,a)?b[a]:void 0}},74502:(a,b,c)=>{var d=c(42995),e=Object.prototype.hasOwnProperty;a.exports=function(a){var b=this.__data__;return d?void 0!==b[a]:e.call(b,a)}},74772:(a,b,c)=>{a.exports=c(22271)(c(96918),"WeakMap")},76787:a=>{a.exports=function(a){return null!=a&&"object"==typeof a}},78178:(a,b,c)=>{var d=c(18313),e=c(13356),f=c(86233),g=c(10110),h=c(74772),i=c(2269),j=c(53346),k="[object Map]",l="[object Promise]",m="[object Set]",n="[object WeakMap]",o="[object DataView]",p=j(d),q=j(e),r=j(f),s=j(g),t=j(h),u=i;(d&&u(new d(new ArrayBuffer(1)))!=o||e&&u(new e)!=k||f&&u(f.resolve())!=l||g&&u(new g)!=m||h&&u(new h)!=n)&&(u=function(a){var b=i(a),c="[object Object]"==b?a.constructor:void 0,d=c?j(c):"";if(d)switch(d){case p:return o;case q:return k;case r:return l;case s:return m;case t:return n}return b}),a.exports=u},78853:a=>{a.exports=function(a,b){return null==a?void 0:a[b]}},79035:(a,b,c)=>{a=c.nmd(a);var d=c(96918),e=b&&!b.nodeType&&b,f=e&&a&&!a.nodeType&&a,g=f&&f.exports===e?d.Buffer:void 0,h=g?g.allocUnsafe:void 0;a.exports=function(a,b){if(b)return a.slice();var c=a.length,d=h?h(c):new a.constructor(c);return a.copy(d),d}},80782:(a,b,c)=>{var d=c(92349),e=c(27907),f=c(74026),g=c(74502),h=c(70318);function i(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}i.prototype.clear=d,i.prototype.delete=e,i.prototype.get=f,i.prototype.has=g,i.prototype.set=h,a.exports=i},81008:a=>{a.exports=function(a,b){return function(c){return a(b(c))}}},83246:a=>{var b=/\w*$/;a.exports=function(a){var c=new a.constructor(a.source,b.exec(a));return c.lastIndex=a.lastIndex,c}},85787:(a,b,c)=>{var d=c(78178),e=c(76787);a.exports=function(a){return e(a)&&"[object Set]"==d(a)}},86233:(a,b,c)=>{a.exports=c(22271)(c(96918),"Promise")},89095:(a,b,c)=>{var d=c(15144),e=c(90637),f=c(56947);a.exports=function(a){return f(a)?d(a):e(a)}},89108:a=>{a.exports=function(a,b){var c=-1,d=a.length;for(b||(b=Array(d));++c<d;)b[c]=a[c];return b}},90637:(a,b,c)=>{var d=c(8100),e=c(24363),f=Object.prototype.hasOwnProperty;a.exports=function(a){if(!d(a))return e(a);var b=[];for(var c in Object(a))f.call(a,c)&&"constructor"!=c&&b.push(c);return b}},91362:(a,b,c)=>{var d=c(61048);a.exports=function(a){return d(this,a).has(a)}},91704:(a,b,c)=>{var d=c(22271);a.exports=function(){try{var a=d(Object,"defineProperty");return a({},"",{}),a}catch(a){}}()},92349:(a,b,c)=>{var d=c(42995);a.exports=function(){this.__data__=d?d(null):{},this.size=0}},92642:a=>{var b=Object.prototype.hasOwnProperty;a.exports=function(a){var c=a.length,d=new a.constructor(c);return c&&"string"==typeof a[0]&&b.call(a,"index")&&(d.index=a.index,d.input=a.input),d}},93113:(a,b,c)=>{var d=c(80782),e=c(55e3),f=c(13356);a.exports=function(){this.size=0,this.__data__={hash:new d,map:new(f||e),string:new d}}},95158:(a,b,c)=>{var d=c(55e3),e=c(34693),f=c(28315),g=c(42082),h=c(27950),i=c(11782);function j(a){var b=this.__data__=new d(a);this.size=b.size}j.prototype.clear=e,j.prototype.delete=f,j.prototype.get=g,j.prototype.has=h,j.prototype.set=i,a.exports=j},96016:(a,b,c)=>{var d=c(32390),e=c(23854),f=c(83246),g=c(5113),h=c(598);a.exports=function(a,b,c){var i=a.constructor;switch(b){case"[object ArrayBuffer]":return d(a);case"[object Boolean]":case"[object Date]":return new i(+a);case"[object DataView]":return e(a,c);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return h(a,c);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(a);case"[object RegExp]":return f(a);case"[object Symbol]":return g(a)}}},96101:a=>{a.exports=function(a,b){for(var c=-1,d=Array(a);++c<a;)d[c]=b(c);return d}},96918:(a,b,c)=>{var d=c(58009),e="object"==typeof self&&self&&self.Object===Object&&self;a.exports=d||e||Function("return this")()},97198:a=>{a.exports=function(a){var b=[];if(null!=a)for(var c in Object(a))b.push(c);return b}},97922:(a,b,c)=>{a.exports=c(96918).Symbol},98142:(a,b,c)=>{var d=c(61048);a.exports=function(a){return d(this,a).get(a)}},99303:(a,b,c)=>{var d=c(61048);a.exports=function(a){var b=d(this,a).delete(a);return this.size-=!!b,b}}};