flujo-ai 3.17.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +196 -181
  3. package/.next/app-path-routes-manifest.json +6 -4
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/server/app/_not-found/page.js +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_not-found.html +1 -1
  10. package/.next/server/app/_not-found.rsc +1 -1
  11. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  12. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/encryption/secure/route.js +1 -1
  16. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  17. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/flow/[id]/route.js +1 -1
  20. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  21. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/flow/compile/route.js +1 -1
  23. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  24. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/flow/generate/route.js +1 -19
  26. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  27. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/improve/route.js +1 -0
  29. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -0
  30. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -0
  31. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  32. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/quick-chat/route.js +1 -0
  35. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/route.js +1 -1
  38. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/init/route.js +1 -1
  42. package/.next/server/app/api/init/route.js.nft.json +1 -1
  43. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  48. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  49. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  51. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  54. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  55. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/mcp/servers/route.js +1 -1
  75. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  78. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  79. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  81. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  82. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  85. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/model/[id]/route.js +1 -1
  88. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/model/provider/route.js +1 -1
  91. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  92. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/model/route.js +1 -1
  94. package/.next/server/app/api/model/route.js.nft.json +1 -1
  95. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/model/test/route.js +1 -1
  97. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  98. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/oauth/reset/route.js +1 -1
  102. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  103. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  105. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  107. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  109. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/planned-executions/route.js +1 -1
  112. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  113. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  115. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  119. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  120. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/chat/page.js +9 -9
  122. package/.next/server/app/chat/page.js.nft.json +1 -1
  123. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  124. package/.next/server/app/chat.html +1 -1
  125. package/.next/server/app/chat.rsc +2 -2
  126. package/.next/server/app/docs/page.js +5 -2
  127. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  128. package/.next/server/app/docs.html +1 -1
  129. package/.next/server/app/docs.rsc +2 -2
  130. package/.next/server/app/executions/page.js +3 -3
  131. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  132. package/.next/server/app/executions.html +1 -1
  133. package/.next/server/app/executions.rsc +2 -2
  134. package/.next/server/app/flows/page.js +3 -39
  135. package/.next/server/app/flows/page.js.nft.json +1 -1
  136. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/flows.html +1 -1
  138. package/.next/server/app/flows.rsc +2 -2
  139. package/.next/server/app/index.html +1 -1
  140. package/.next/server/app/index.rsc +2 -2
  141. package/.next/server/app/mcp/page.js +23 -27
  142. package/.next/server/app/mcp/page.js.nft.json +1 -1
  143. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  144. package/.next/server/app/mcp-flows/route.js +3 -3
  145. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  146. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  148. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  149. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/mcp.html +1 -1
  151. package/.next/server/app/mcp.rsc +2 -2
  152. package/.next/server/app/models/page.js +3 -3
  153. package/.next/server/app/models/page.js.nft.json +1 -1
  154. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  155. package/.next/server/app/page.js +1 -1
  156. package/.next/server/app/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/settings/page.js +2 -2
  158. package/.next/server/app/settings/page.js.nft.json +1 -1
  159. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/settings.html +1 -1
  161. package/.next/server/app/settings.rsc +2 -2
  162. package/.next/server/app/v1/chat/completions/route.js +1 -1
  163. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  164. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  166. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  167. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +1 -1
  169. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  170. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  172. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  173. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  175. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  176. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  178. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  179. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  181. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  182. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  184. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  185. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  187. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  188. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  190. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  191. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/v1/models/route.js +1 -1
  193. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  194. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app-paths-manifest.json +6 -4
  196. package/.next/server/chunks/1403.js +4 -2
  197. package/.next/server/chunks/1912.js +38 -0
  198. package/.next/server/chunks/2350.js +1 -0
  199. package/.next/server/chunks/{7531.js → 2439.js} +2 -2
  200. package/.next/server/chunks/{5504.js → 264.js} +2 -2
  201. package/.next/server/chunks/2776.js +1 -1
  202. package/.next/server/chunks/2859.js +3 -3
  203. package/.next/server/chunks/3304.js +1 -1
  204. package/.next/server/chunks/3310.js +35 -0
  205. package/.next/server/chunks/3984.js +4 -4
  206. package/.next/server/chunks/453.js +1 -0
  207. package/.next/server/chunks/4681.js +1 -1
  208. package/.next/server/chunks/5311.js +1 -0
  209. package/.next/server/chunks/6037.js +41 -0
  210. package/.next/server/chunks/6069.js +6 -0
  211. package/.next/server/chunks/6201.js +5 -0
  212. package/.next/server/chunks/6826.js +1 -0
  213. package/.next/server/chunks/6936.js +8 -6
  214. package/.next/server/chunks/701.js +1 -1
  215. package/.next/server/chunks/7186.js +2 -0
  216. package/.next/server/chunks/7214.js +2 -2
  217. package/.next/server/chunks/7362.js +6 -6
  218. package/.next/server/chunks/7506.js +1 -1
  219. package/.next/server/chunks/7635.js +1 -1
  220. package/.next/server/chunks/7821.js +1 -1
  221. package/.next/server/chunks/7982.js +1 -1
  222. package/.next/server/chunks/8227.js +2 -0
  223. package/.next/server/chunks/8342.js +1 -0
  224. package/.next/server/chunks/{3309.js → 8367.js} +2 -2
  225. package/.next/server/chunks/8739.js +1 -1
  226. package/.next/server/chunks/906.js +35 -0
  227. package/.next/server/chunks/{5888.js → 9314.js} +3 -3
  228. package/.next/server/chunks/9509.js +2 -2
  229. package/.next/server/chunks/9687.js +1 -0
  230. package/.next/server/chunks/9880.js +1 -0
  231. package/.next/server/chunks/9938.js +1 -1
  232. package/.next/server/chunks/9957.js +1 -1
  233. package/.next/server/instrumentation.js.nft.json +1 -1
  234. package/.next/server/middleware-build-manifest.js +1 -1
  235. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  236. package/.next/server/pages/404.html +1 -1
  237. package/.next/server/pages/500.html +1 -1
  238. package/.next/server/server-reference-manifest.js +1 -1
  239. package/.next/server/server-reference-manifest.json +1 -1
  240. package/.next/static/Fdh7zqKv38txmpLAxepeR/_buildManifest.js +1 -0
  241. package/.next/static/chunks/1374-e084b3c40554288a.js +1 -0
  242. package/.next/static/chunks/1892-359187893bbc7f3a.js +1 -0
  243. package/.next/static/chunks/{7126-2bafddf1b09cacac.js → 2084-2463e1d781bad2a6.js} +1 -1
  244. package/.next/static/chunks/4105-8fddb00196bf3c6d.js +1 -0
  245. package/.next/static/chunks/4244-6f399c7ff9980207.js +1 -0
  246. package/.next/static/chunks/4809-423a2a4a90d02f2c.js +1 -0
  247. package/.next/static/chunks/6084-68908a197e957e5f.js +1 -0
  248. package/.next/static/chunks/6509-3380826fd7c82b4e.js +1 -0
  249. package/.next/static/chunks/7290-fd5bb2c94fd7f605.js +1 -0
  250. package/.next/static/chunks/{7583.8a518353bd072db9.js → 7583.b6c2f8874b6b89cd.js} +1 -1
  251. package/.next/static/chunks/8098-297bf477152a565b.js +1 -0
  252. package/.next/static/chunks/{8187.5d6523f30e705998.js → 8187.15bf331f5318c00f.js} +1 -1
  253. package/.next/static/chunks/{9164-36fedeb944fa71e9.js → 9164-a56181e5e93cc47e.js} +1 -1
  254. package/.next/static/chunks/924-64f908860caf1a35.js +1 -0
  255. package/.next/static/chunks/9286-6ea909e5bf70a97e.js +1 -0
  256. package/.next/static/chunks/9747-ffb8be5e59700c27.js +8 -0
  257. package/.next/static/chunks/app/api/backup/route-1691635994fcddb5.js +1 -0
  258. package/.next/static/chunks/app/api/browse/route-1691635994fcddb5.js +1 -0
  259. package/.next/static/chunks/app/api/cwd/route-1691635994fcddb5.js +1 -0
  260. package/.next/static/chunks/app/api/encryption/secure/route-1691635994fcddb5.js +1 -0
  261. package/.next/static/chunks/app/api/env/route-1691635994fcddb5.js +1 -0
  262. package/.next/static/chunks/app/api/flow/[id]/route-1691635994fcddb5.js +1 -0
  263. package/.next/static/chunks/app/api/flow/compile/route-1691635994fcddb5.js +1 -0
  264. package/.next/static/chunks/app/api/flow/generate/route-1691635994fcddb5.js +1 -0
  265. package/.next/static/chunks/app/api/flow/improve/route-1691635994fcddb5.js +1 -0
  266. package/.next/static/chunks/app/api/flow/prompt-renderer/route-1691635994fcddb5.js +1 -0
  267. package/.next/static/chunks/app/api/flow/quick-chat/route-1691635994fcddb5.js +1 -0
  268. package/.next/static/chunks/app/api/flow/route-1691635994fcddb5.js +1 -0
  269. package/.next/static/chunks/app/api/git/route-1691635994fcddb5.js +1 -0
  270. package/.next/static/chunks/app/api/init/route-1691635994fcddb5.js +1 -0
  271. package/.next/static/chunks/app/api/local-models/capability/route-1691635994fcddb5.js +1 -0
  272. package/.next/static/chunks/app/api/local-models/pull/route-1691635994fcddb5.js +1 -0
  273. package/.next/static/chunks/app/api/local-models/suggest/route-1691635994fcddb5.js +1 -0
  274. package/.next/static/chunks/app/api/mcp/cancel/route-1691635994fcddb5.js +1 -0
  275. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-1691635994fcddb5.js +1 -0
  276. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-1691635994fcddb5.js +1 -0
  277. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-1691635994fcddb5.js +1 -0
  278. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-1691635994fcddb5.js +1 -0
  279. package/.next/static/chunks/app/api/mcp/servers/[name]/route-1691635994fcddb5.js +1 -0
  280. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-1691635994fcddb5.js +1 -0
  281. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-1691635994fcddb5.js +1 -0
  282. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-1691635994fcddb5.js +1 -0
  283. package/.next/static/chunks/app/api/mcp/servers/route-1691635994fcddb5.js +1 -0
  284. package/.next/static/chunks/app/api/mcp/test-connection/route-1691635994fcddb5.js +1 -0
  285. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-1691635994fcddb5.js +1 -0
  286. package/.next/static/chunks/app/api/mcp-registry/route-1691635994fcddb5.js +1 -0
  287. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-1691635994fcddb5.js +1 -0
  288. package/.next/static/chunks/app/api/model/[id]/route-1691635994fcddb5.js +1 -0
  289. package/.next/static/chunks/app/api/model/provider/route-1691635994fcddb5.js +1 -0
  290. package/.next/static/chunks/app/api/model/route-1691635994fcddb5.js +1 -0
  291. package/.next/static/chunks/app/api/model/test/route-1691635994fcddb5.js +1 -0
  292. package/.next/static/chunks/app/api/oauth/callback/route-1691635994fcddb5.js +1 -0
  293. package/.next/static/chunks/app/api/oauth/initiate/route-1691635994fcddb5.js +1 -0
  294. package/.next/static/chunks/app/api/oauth/reset/route-1691635994fcddb5.js +1 -0
  295. package/.next/static/chunks/app/api/planned-executions/[id]/route-1691635994fcddb5.js +1 -0
  296. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-1691635994fcddb5.js +1 -0
  297. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-1691635994fcddb5.js +1 -0
  298. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-1691635994fcddb5.js +1 -0
  299. package/.next/static/chunks/app/api/planned-executions/route-1691635994fcddb5.js +1 -0
  300. package/.next/static/chunks/app/api/restore/route-1691635994fcddb5.js +1 -0
  301. package/.next/static/chunks/app/api/storage/route-1691635994fcddb5.js +1 -0
  302. package/.next/static/chunks/app/api/update/route-1691635994fcddb5.js +1 -0
  303. package/.next/static/chunks/app/api/webhooks/[id]/route-1691635994fcddb5.js +1 -0
  304. package/.next/static/chunks/app/chat/page-6486974f4a6c7b57.js +1 -0
  305. package/.next/static/chunks/app/docs/page-5da72cc6db51f238.js +1 -0
  306. package/.next/static/chunks/app/executions/page-fe19f6a1bd3fe05c.js +1 -0
  307. package/.next/static/chunks/app/flows/page-3b84093cdf2aee84.js +1 -0
  308. package/.next/static/chunks/app/mcp/page-355386ec2a542e42.js +1 -0
  309. package/.next/static/chunks/app/mcp-flows/route-1691635994fcddb5.js +1 -0
  310. package/.next/static/chunks/app/mcp-proxy/[server]/route-1691635994fcddb5.js +1 -0
  311. package/.next/static/chunks/app/models/page-20c80d398bf83fc5.js +1 -0
  312. package/.next/static/chunks/app/settings/page-9430dfdaff87d70c.js +1 -0
  313. package/.next/static/chunks/app/v1/chat/completions/route-1691635994fcddb5.js +1 -0
  314. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-1691635994fcddb5.js +1 -0
  315. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-1691635994fcddb5.js +1 -0
  316. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-1691635994fcddb5.js +1 -0
  317. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-1691635994fcddb5.js +1 -0
  318. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-1691635994fcddb5.js +1 -0
  319. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-1691635994fcddb5.js +1 -0
  320. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-1691635994fcddb5.js +1 -0
  321. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-1691635994fcddb5.js +1 -0
  322. package/.next/static/chunks/app/v1/chat/conversations/route-1691635994fcddb5.js +1 -0
  323. package/.next/static/chunks/app/v1/models/route-1691635994fcddb5.js +1 -0
  324. package/.next/static/chunks/{webpack-4015bd6f241940a1.js → webpack-4880945dd240d429.js} +1 -1
  325. package/.next/trace +7 -7
  326. package/.next/types/app/api/flow/improve/route.ts +347 -0
  327. package/.next/types/app/api/flow/quick-chat/route.ts +347 -0
  328. package/.next/types/routes.d.ts +3 -1
  329. package/.next/types/validator.ts +18 -0
  330. package/README.md +1 -1
  331. package/package.json +1 -1
  332. package/.next/server/chunks/117.js +0 -1
  333. package/.next/server/chunks/1519.js +0 -1
  334. package/.next/server/chunks/1877.js +0 -32
  335. package/.next/server/chunks/1905.js +0 -2
  336. package/.next/server/chunks/3243.js +0 -1
  337. package/.next/server/chunks/3370.js +0 -38
  338. package/.next/server/chunks/407.js +0 -6
  339. package/.next/server/chunks/5558.js +0 -1
  340. package/.next/server/chunks/5587.js +0 -1
  341. package/.next/server/chunks/5838.js +0 -1
  342. package/.next/server/chunks/5935.js +0 -2
  343. package/.next/server/chunks/6283.js +0 -2
  344. package/.next/server/chunks/6523.js +0 -1
  345. package/.next/server/chunks/7328.js +0 -1
  346. package/.next/server/chunks/8434.js +0 -1
  347. package/.next/server/chunks/9188.js +0 -1
  348. package/.next/static/KMEKXonxBXI3WzCfozXx4/_buildManifest.js +0 -1
  349. package/.next/static/chunks/1226-af62e7a89fa9032e.js +0 -1
  350. package/.next/static/chunks/1979-e2d922370ecef69f.js +0 -1
  351. package/.next/static/chunks/2158-0d6bb5a428ed0688.js +0 -1
  352. package/.next/static/chunks/510-e39ad4e1fae6dd1f.js +0 -1
  353. package/.next/static/chunks/539-8ddf886986877cfc.js +0 -1
  354. package/.next/static/chunks/5781-4328d17aad13f908.js +0 -8
  355. package/.next/static/chunks/5961-828f4f7efc3e1381.js +0 -1
  356. package/.next/static/chunks/687-98ba5f5043866f48.js +0 -1
  357. package/.next/static/chunks/6902-cba4e59c4295b4a0.js +0 -1
  358. package/.next/static/chunks/8862-1170dad1d6f3cd39.js +0 -1
  359. package/.next/static/chunks/8867-3f7163974605427b.js +0 -1
  360. package/.next/static/chunks/8989-401559d9f3bc80a0.js +0 -1
  361. package/.next/static/chunks/9414-3cd5c3976cba66b2.js +0 -1
  362. package/.next/static/chunks/app/api/backup/route-7248529e02c31012.js +0 -1
  363. package/.next/static/chunks/app/api/browse/route-7248529e02c31012.js +0 -1
  364. package/.next/static/chunks/app/api/cwd/route-7248529e02c31012.js +0 -1
  365. package/.next/static/chunks/app/api/encryption/secure/route-7248529e02c31012.js +0 -1
  366. package/.next/static/chunks/app/api/env/route-7248529e02c31012.js +0 -1
  367. package/.next/static/chunks/app/api/flow/[id]/route-7248529e02c31012.js +0 -1
  368. package/.next/static/chunks/app/api/flow/compile/route-7248529e02c31012.js +0 -1
  369. package/.next/static/chunks/app/api/flow/generate/route-7248529e02c31012.js +0 -1
  370. package/.next/static/chunks/app/api/flow/prompt-renderer/route-7248529e02c31012.js +0 -1
  371. package/.next/static/chunks/app/api/flow/route-7248529e02c31012.js +0 -1
  372. package/.next/static/chunks/app/api/git/route-7248529e02c31012.js +0 -1
  373. package/.next/static/chunks/app/api/init/route-7248529e02c31012.js +0 -1
  374. package/.next/static/chunks/app/api/local-models/capability/route-7248529e02c31012.js +0 -1
  375. package/.next/static/chunks/app/api/local-models/pull/route-7248529e02c31012.js +0 -1
  376. package/.next/static/chunks/app/api/local-models/suggest/route-7248529e02c31012.js +0 -1
  377. package/.next/static/chunks/app/api/mcp/cancel/route-7248529e02c31012.js +0 -1
  378. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7248529e02c31012.js +0 -1
  379. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7248529e02c31012.js +0 -1
  380. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7248529e02c31012.js +0 -1
  381. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7248529e02c31012.js +0 -1
  382. package/.next/static/chunks/app/api/mcp/servers/[name]/route-7248529e02c31012.js +0 -1
  383. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7248529e02c31012.js +0 -1
  384. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7248529e02c31012.js +0 -1
  385. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7248529e02c31012.js +0 -1
  386. package/.next/static/chunks/app/api/mcp/servers/route-7248529e02c31012.js +0 -1
  387. package/.next/static/chunks/app/api/mcp/test-connection/route-7248529e02c31012.js +0 -1
  388. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7248529e02c31012.js +0 -1
  389. package/.next/static/chunks/app/api/mcp-registry/route-7248529e02c31012.js +0 -1
  390. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7248529e02c31012.js +0 -1
  391. package/.next/static/chunks/app/api/model/[id]/route-7248529e02c31012.js +0 -1
  392. package/.next/static/chunks/app/api/model/provider/route-7248529e02c31012.js +0 -1
  393. package/.next/static/chunks/app/api/model/route-7248529e02c31012.js +0 -1
  394. package/.next/static/chunks/app/api/model/test/route-7248529e02c31012.js +0 -1
  395. package/.next/static/chunks/app/api/oauth/callback/route-7248529e02c31012.js +0 -1
  396. package/.next/static/chunks/app/api/oauth/initiate/route-7248529e02c31012.js +0 -1
  397. package/.next/static/chunks/app/api/oauth/reset/route-7248529e02c31012.js +0 -1
  398. package/.next/static/chunks/app/api/planned-executions/[id]/route-7248529e02c31012.js +0 -1
  399. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7248529e02c31012.js +0 -1
  400. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7248529e02c31012.js +0 -1
  401. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7248529e02c31012.js +0 -1
  402. package/.next/static/chunks/app/api/planned-executions/route-7248529e02c31012.js +0 -1
  403. package/.next/static/chunks/app/api/restore/route-7248529e02c31012.js +0 -1
  404. package/.next/static/chunks/app/api/storage/route-7248529e02c31012.js +0 -1
  405. package/.next/static/chunks/app/api/update/route-7248529e02c31012.js +0 -1
  406. package/.next/static/chunks/app/api/webhooks/[id]/route-7248529e02c31012.js +0 -1
  407. package/.next/static/chunks/app/chat/page-c759cf382bcabd77.js +0 -1
  408. package/.next/static/chunks/app/docs/page-fca894f60b9174e9.js +0 -1
  409. package/.next/static/chunks/app/executions/page-4155f9f682ee6f84.js +0 -1
  410. package/.next/static/chunks/app/flows/page-4e1ec20653e5dc86.js +0 -1
  411. package/.next/static/chunks/app/mcp/page-5234695929980171.js +0 -1
  412. package/.next/static/chunks/app/mcp-flows/route-7248529e02c31012.js +0 -1
  413. package/.next/static/chunks/app/mcp-proxy/[server]/route-7248529e02c31012.js +0 -1
  414. package/.next/static/chunks/app/models/page-4fc4d100a8b1d4b4.js +0 -1
  415. package/.next/static/chunks/app/settings/page-9a2bfb8d5bdba29e.js +0 -1
  416. package/.next/static/chunks/app/v1/chat/completions/route-7248529e02c31012.js +0 -1
  417. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7248529e02c31012.js +0 -1
  418. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7248529e02c31012.js +0 -1
  419. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7248529e02c31012.js +0 -1
  420. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7248529e02c31012.js +0 -1
  421. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7248529e02c31012.js +0 -1
  422. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7248529e02c31012.js +0 -1
  423. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7248529e02c31012.js +0 -1
  424. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7248529e02c31012.js +0 -1
  425. package/.next/static/chunks/app/v1/chat/conversations/route-7248529e02c31012.js +0 -1
  426. package/.next/static/chunks/app/v1/models/route-7248529e02c31012.js +0 -1
  427. /package/.next/static/{KMEKXonxBXI3WzCfozXx4 → Fdh7zqKv38txmpLAxepeR}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
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.
1
+ "use strict";exports.id=2859,exports.ids=[2859],exports.modules={29715:(a,b,c)=>{c.d(b,{N:()=>h});var d=c(91403),e=c(92372),f=c(60184);let g=(0,c(50846).h)("backend/execution/flow/loadConversationState");async function h(a){if(d.FlowExecutor.conversationStates.has(a))return g.debug("Loaded state from memory",{conversationId:a}),d.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,e.YM)(b,void 0);if(c)return g.debug("Loaded state from storage",{conversationId:a}),await (0,f.jM)(c),d.FlowExecutor.conversationStates.set(a,c),c}catch(b){g.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}},30227:(a,b,c)=>{c.d(b,{cI:()=>p,oV:()=>r,yM:()=>n});var d=c(50846),e=c(88185),f=c(38204),g=c(9312),h=c(87789),i=c(1905),j=c(33233),k=c(25250);let l=(0,d.h)("backend/services/mcp/flowAuthoringTools"),m=["list_flow_building_blocks","validate_flow_spec","create_flow","search_mcp_marketplace","install_mcp_server"];function n(a){return m.includes(a)}function o(){return{type:"object",properties:{spec:{type:"object",description:"The FlowSpec object (see the tool description for the format)."}},required:["spec"]}}function p(){return[{name:"list_flow_building_blocks",description:'List everything a FlowSpec may reference in this FLUJO instance: configured models (bind to process steps), MCP servers and their tools (attach via "servers"), and existing flows (usable as subflow targets). Call this before authoring a spec.',inputSchema:{type:"object",properties:{}}},{name:"validate_flow_spec",description:`Compile and validate a FlowSpec WITHOUT saving. Returns the compiled flow's validation result (errors block saving; warnings are advisory) so you can iterate until clean, then call create_flow.
2
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.
3
+ ${e.R}`,inputSchema:o()},{name:"create_flow",description:`Create a new FLUJO flow from a FlowSpec. The spec is compiled deterministically (layout, ids, and wiring are generated for you) and saved ONLY when validation finds zero errors — otherwise the issues are returned to fix. Use list_flow_building_blocks first to see the models, MCP servers/tools, and existing flows you may reference.
4
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(87821),f=c(81226),g=c(84671),h=c(9312);let i=(0,d.h)("backend/services/flow/compileFlow");async function j(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,h.jY)(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let k=(0,f.dM)(a,d);if(!k.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:k.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(k.flow.id=b.updateFlowId);let l=(0,h.RB)(k.issues,(0,g.nC)(k.flow,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools})),m=!1;return b.save&&0===l.errorCount?(await e.flowService.saveFlow(k.flow),m=!0,i.info(`Compiled and saved flow "${k.flow.name}" (${k.flow.id})`)):b.save&&i.info(`Compiled flow "${k.flow.name}" has ${l.errorCount} error(s); NOT saved`),{success:!0,flow:k.flow,validation:l,saved:m}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>Q,internalToolDefinitions:()=>v});var d=c(33873),e=c.n(d),f=c(29021),g=c(79646),h=c(50846),i=c(87821),j=c(20433),k=c(27635),l=c(57214),m=c(38204),n=c(29715),o=c(60184),p=c(14214),q=c(43326),r=c(30227),s=c(81495);let t=(0,h.h)("backend/services/mcp/internalTools");function u(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function v(){return[...(0,r.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:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. 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"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"terminal",description:'Run a shell command on the FLUJO host and return its combined stdout/stderr plus exit code. Runs through a shell, so pipes and chained commands (e.g. "npm install && npm run build") work. Use it to install dependencies, build a cloned MCP server, inspect the filesystem, or run diagnostics. Working directory defaults to the FLUJO data directory (where cloned servers live under mcp-servers/); pass "cwd" to run elsewhere. The command is killed if it exceeds the timeout, and very large output is truncated.',inputSchema:{type:"object",properties:{command:{type:"string",description:'The shell command line to execute, e.g. "npm install && npm run build".'},cwd:{type:"string",description:"Optional working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory."},timeout:{type:"number",description:"Optional timeout in seconds (default 60, max 600). The command is killed if it runs longer."}},required:["command"]}}]}async function w(a){let b=await i.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function x(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({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 u({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,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return u({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return u({error:b.error?.message??"Unknown error during flow execution."},!0);return u(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function y(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.deleteFlow(c.id);return d.success?u({deleted:!0,flowId:c.id,flowName:c.name}):u({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function z(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);return c?u({...z(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):u({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function B(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.listFlowVersions(c.id);return u({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function C(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return u({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.getFlowVersion(d.id,c);return e?u({versionId:e.versionId,savedAt:e.savedAt,...z(e.flow)}):u({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function D(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return u({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.revertFlow(d.id,c);return e.success?u({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):u({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function E(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return u({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?u({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):u({error:e.error,issues:e.issues??[]},!0)}async function F(a){let b=await a.loadServerConfigs();return Array.isArray(b)?u(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){t.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}:{}}}))):u({error:b.error??"Failed to load server configs."},!0)}async function G(a,b){let c=String(b?.server??"").trim();if(!c)return u({error:'Provide "server": a FLUJO server name.'},!0);if(c===s._)return u(v().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:d,error:e}=await a.listServerTools(c);return e?u({error:e},!0):u(d.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function H(a,b){let c=String(b?.server??"").trim(),d=String(b?.tool??"").trim();if(!c||!d)return u({error:'Provide "server" and "tool".'},!0);if(c===s._)return u({error:`"${s._}" 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 u({error:g.error??`Tool call failed on ${c}.`},!0);let h=g.data;return h&&Array.isArray(h.content)?h:u(h??{ok:!0})}async function I(a,b){let c=String(b?.server??"").trim();if(!c)return u({error:'Provide "server": a FLUJO server name.'},!0);if(c===s._)return u({ok:!0,note:`"${s._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return u({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return u({restarted:!0,server:c,status:e.status})}async function J(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return u({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===s._)return u({error:`The built-in "${s._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?u({error:e.error},!0):u({server:c,enabled:d})}async function K(){return u((await j.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 L(){return u((await (0,k.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 M(a){let b=String(a?.id??"").trim();if(!b)return u({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,k.z)().runNow(b);return d||!c?u({error:d??"Run failed."},!0):u({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 N(a){let b,c=e().join((0,q.ok)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return u([]);return u({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===p.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return t.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return u(g?d.slice(0,g):d)}async function O(a){let b=String(a?.conversation??"").trim();if(!b)return u({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,o.u8)(b);let c=await (0,n.N)(b);if(!c)return u({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,o.Os)(b),e=d?(0,o.cc)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),u({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}async function P(a){let b=String(a?.command??"").trim();if(!b)return u({error:'Provide "command": a shell command line to run.'},!0);let c=(0,q.ok)(),d="string"==typeof a?.cwd?a.cwd.trim():"",f=d?e().isAbsolute(d)?d:e().join(c,d):c,h=Math.min(1e3*("number"==typeof a?.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let c,d="",e=!1,i=!1,j=!1,k=a=>{!e&&(d+=a).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0)};try{c=(0,g.spawn)(b,{cwd:f,shell:!0,env:process.env})}catch(b){a(u({error:`Failed to start command: ${b instanceof Error?b.message:String(b)}`,cwd:f},!0));return}let l=setTimeout(()=>{j=!0;try{c.kill()}catch{}},h),m=b=>{i||(i=!0,clearTimeout(l),a(b))};c.stdout?.on("data",a=>k(a.toString())),c.stderr?.on("data",a=>k(a.toString())),c.on("error",a=>{k(`
5
+ ${e.R}`,inputSchema:o()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Installs are gated by consent (SEP-1024): unless this trusted authoring tool is allowed via the mcpAutoInstall settings (trustBrainStem / requireConsent / namespaceAllowlist), the tool returns the exact resolved command + arguments with consentRequired=true INSTEAD of installing, and the caller must obtain explicit approval. Every attempt is written to an audit log (command, args, env NAMES, verification status — never secret values) before any spawn. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument), or the resolved plan when consent is required. First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}}]}function q(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function r(a,b){try{if("list_flow_building_blocks"===a){let a=await (0,g.jY)();return q(a.blocks)}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await (0,h.e)(a);return q(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await (0,h.a)(a,c,{resolveOnly:!0});if(!d.plan)return q(d,!0);let e=await (0,i.Ej)(),f=(0,j.e5)({caller:"authoring-tool",settings:e,registryName:a}),g=(0,k.nO)(d.plan.verificationStatus)?void 0:`Unverified / self-asserted registry entry (status: ${d.plan.verificationStatus}). Registry entries are publisher-asserted — review the command before approving.`;if(await (0,i.NB)((0,j.UM)(d.plan,"authoring-tool",f,!1)),!f.allowed)return q({installed:!1,consentRequired:!0,message:f.message,plan:d.plan,...g?{verificationWarning:g}:{}});let l=await (0,h.a)(a,c);return await (0,i.NB)((0,j.UM)(l.plan??d.plan,"authoring-tool",f,l.installed,l.error)),q({...l,...g?{verificationWarning:g}:{}},!l.installed)}if("validate_flow_spec"===a||"create_flow"===a){let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(b);if(!c)return q({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await (0,f.V)(c,{save:"create_flow"===a});if(!d.success)return q({error:d.error,issues:d.issues??[]},!0);let e=d.flows.length,g=e>1?` (plus ${e-1} nested subflow flow(s))`:"",h={flowId:d.flow.id,flowName:d.flow.name,nodeCount:d.flow.nodes.length,edgeCount:d.flow.edges.length,...e>1?{flows:d.flows.map(a=>({id:a.id,name:a.name}))}:{},validation:d.validation,..."create_flow"===a?{saved:d.saved,...d.saved?{note:`Flow "${d.flow.name}"${g} was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${d.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return q(h,"create_flow"===a&&!d.saved)}return q({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return l.error("authoringCallTool failed",{toolName:a,err:b}),q({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},38204:(a,b,c)=>{c.d(b,{V:()=>j});var d=c(50846),e=c(87821),f=c(81226),g=c(84671),h=c(9312);let i=(0,d.h)("backend/services/flow/compileFlow");async function j(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,h.jY)(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let k=(0,f.dM)(a,d);if(!k.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:k.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(k.flow.id=b.updateFlowId);let l=k.flows.flatMap(a=>(0,g.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),m=(0,h.RB)(k.issues,{issues:l,errorCount:0,warningCount:0,isRunnable:!0}),n=!1;if(b.save&&0===m.errorCount){for(let a of k.flows)await e.flowService.saveFlow(a);n=!0,i.info(`Compiled and saved ${k.flows.length} flow(s); root "${k.flow.name}" (${k.flow.id})`)}else b.save&&i.info(`Compiled flow "${k.flow.name}" has ${m.errorCount} error(s); NOT saved`);return{success:!0,flow:k.flow,flows:k.flows,validation:m,saved:n}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>Q,internalToolDefinitions:()=>v});var d=c(33873),e=c.n(d),f=c(29021),g=c(79646),h=c(50846),i=c(87821),j=c(20433),k=c(27635),l=c(57214),m=c(38204),n=c(29715),o=c(60184),p=c(14214),q=c(43326),r=c(30227),s=c(81495);let t=(0,h.h)("backend/services/mcp/internalTools");function u(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function v(){return[...(0,r.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:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. 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"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"terminal",description:'Run a shell command on the FLUJO host and return its combined stdout/stderr plus exit code. Runs through a shell, so pipes and chained commands (e.g. "npm install && npm run build") work. Use it to install dependencies, build a cloned MCP server, inspect the filesystem, or run diagnostics. Working directory defaults to the FLUJO data directory (where cloned servers live under mcp-servers/); pass "cwd" to run elsewhere. The command is killed if it exceeds the timeout, and very large output is truncated.',inputSchema:{type:"object",properties:{command:{type:"string",description:'The shell command line to execute, e.g. "npm install && npm run build".'},cwd:{type:"string",description:"Optional working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory."},timeout:{type:"number",description:"Optional timeout in seconds (default 60, max 600). The command is killed if it runs longer."}},required:["command"]}}]}async function w(a){let b=await i.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function x(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({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 u({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,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return u({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return u({error:b.error?.message??"Unknown error during flow execution."},!0);return u(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function y(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.deleteFlow(c.id);return d.success?u({deleted:!0,flowId:c.id,flowName:c.name}):u({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function z(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);return c?u({...z(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):u({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function B(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": a flow name or id.'},!0);let c=await w(b);if(!c)return u({error:`No flow named or with id "${b}".`},!0);let d=await i.flowService.listFlowVersions(c.id);return u({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function C(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return u({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.getFlowVersion(d.id,c);return e?u({versionId:e.versionId,savedAt:e.savedAt,...z(e.flow)}):u({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function D(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return u({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}".`},!0);let e=await i.flowService.revertFlow(d.id,c);return e.success?u({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):u({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function E(a){let b=String(a?.flow??"").trim();if(!b)return u({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return u({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await w(b);if(!d)return u({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?u({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):u({error:e.error,issues:e.issues??[]},!0)}async function F(a){let b=await a.loadServerConfigs();return Array.isArray(b)?u(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){t.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}:{}}}))):u({error:b.error??"Failed to load server configs."},!0)}async function G(a,b){let c=String(b?.server??"").trim();if(!c)return u({error:'Provide "server": a FLUJO server name.'},!0);if(c===s._)return u(v().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:d,error:e}=await a.listServerTools(c);return e?u({error:e},!0):u(d.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function H(a,b){let c=String(b?.server??"").trim(),d=String(b?.tool??"").trim();if(!c||!d)return u({error:'Provide "server" and "tool".'},!0);if(c===s._)return u({error:`"${s._}" 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 u({error:g.error??`Tool call failed on ${c}.`},!0);let h=g.data;return h&&Array.isArray(h.content)?h:u(h??{ok:!0})}async function I(a,b){let c=String(b?.server??"").trim();if(!c)return u({error:'Provide "server": a FLUJO server name.'},!0);if(c===s._)return u({ok:!0,note:`"${s._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return u({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return u({restarted:!0,server:c,status:e.status})}async function J(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return u({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===s._)return u({error:`The built-in "${s._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?u({error:e.error},!0):u({server:c,enabled:d})}async function K(){return u((await j.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 L(){return u((await (0,k.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 M(a){let b=String(a?.id??"").trim();if(!b)return u({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,k.z)().runNow(b);return d||!c?u({error:d??"Run failed."},!0):u({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 N(a){let b,c=e().join((0,q.ok)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return u([]);return u({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===p.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return t.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return u(g?d.slice(0,g):d)}async function O(a){let b=String(a?.conversation??"").trim();if(!b)return u({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,o.u8)(b);let c=await (0,n.N)(b);if(!c)return u({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,o.Os)(b),e=d?(0,o.cc)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),u({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}async function P(a){let b=String(a?.command??"").trim();if(!b)return u({error:'Provide "command": a shell command line to run.'},!0);let c=(0,q.ok)(),d="string"==typeof a?.cwd?a.cwd.trim():"",f=d?e().isAbsolute(d)?d:e().join(c,d):c,h=Math.min(1e3*("number"==typeof a?.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let c,d="",e=!1,i=!1,j=!1,k=a=>{!e&&(d+=a).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0)};try{c=(0,g.spawn)(b,{cwd:f,shell:!0,env:process.env})}catch(b){a(u({error:`Failed to start command: ${b instanceof Error?b.message:String(b)}`,cwd:f},!0));return}let l=setTimeout(()=>{j=!0;try{c.kill()}catch{}},h),m=b=>{i||(i=!0,clearTimeout(l),a(b))};c.stdout?.on("data",a=>k(a.toString())),c.stderr?.on("data",a=>k(a.toString())),c.on("error",a=>{k(`
6
6
  ${a.message}`),m(u({error:`Command failed to start: ${a.message}`,cwd:f,output:d},!0))}),c.on("close",a=>{if(j)return void m(u({timedOut:!0,cwd:f,exitCode:a,output:`${d}
7
7
  [killed after ${h/1e3}s timeout]`},!0));m(u({exitCode:a,cwd:f,output:d},0!==a))})})}async function Q(a,b,c){try{if((0,r.yM)(b))return await (0,r.oV)(b,c);switch(b){case"execute_flow":return await x(c);case"read_flow":return await A(c);case"update_flow":return await E(c);case"list_flow_versions":return await B(c);case"read_flow_version":return await C(c);case"revert_flow":return await D(c);case"delete_flow":return await y(c);case"list_mcp_servers":return await F(a);case"list_mcp_server_tools":return await G(a,c);case"call_mcp_tool":return await H(a,c);case"restart_mcp_server":return await I(a,c);case"set_mcp_server_enabled":return await J(a,c);case"list_models":return await K();case"list_planned_executions":return await L();case"run_planned_execution":return await M(c);case"list_conversations":return await N(c);case"read_conversation":return await O(c);case"terminal":return await P(c);default:return u({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return t.error("internalCallTool failed",{toolName:b,err:a}),u({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
@@ -1 +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}}};
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)}},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(80179),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}},80179:(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))}},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}}};
@@ -0,0 +1,35 @@
1
+ "use strict";exports.id=3310,exports.ids=[3310],exports.modules={23310:(a,b,c)=>{c.d(b,{GN:()=>u,Xg:()=>v});var d=c(50846),e=c(20433),f=c(24423),g=c(81226),h=c(84671),i=c(88185),j=c(87789),k=c(1905),l=c(33233),m=c(9312);let n=(0,d.h)("backend/services/flow/generateFlow");function o(a,b,c,d){let e=c?`MULTI-LEVEL FLOWS — you MAY design subflows that are themselves brand-new flows:
2
+ - A subflow node normally references an EXISTING flow via "flow". To instead create a NEW child flow, use ONE of these on the subflow node (not "flow"):
3
+ - "subflowSpec": an inline nested FlowSpec (you author the whole child now), or
4
+ - "generateSubflow": a short natural-language description of the child — FLUJO will generate that child flow for you.
5
+ - Nest only when a self-contained sub-task genuinely deserves its own flow. Nesting is bounded: at most ${d} level(s) deep and ${g.lk} flows total. Keep it minimal.`:`SUBFLOWS: a subflow node's "flow" must reference an EXISTING flow (by name or id). Do NOT use "subflowSpec" or "generateSubflow" — multi-level generation is off for this run.`,f=b?`CAPABILITY ACQUISITION — you are allowed to EXPAND this FLUJO instance:
6
+ - If the task needs a capability none of the configured servers provides (voice, vision, browsing, email, code execution, …), use search_mcp_marketplace to find a server for it, then install_mcp_server to install the best match. Prefer servers that need no API keys (empty requiredEnv); if the best option needs keys, install a keyless alternative or note the requirement in the flow description.
7
+ - After a successful install, reference the returned server name in a process node's "servers" list and enable the tools it reported.
8
+ - Be ambitious: an actual capability (real audio, real browsing, real files) beats a text approximation. Search with several short terms ("voice", "tts", "speech") — the registry matches server NAMES only.`:`CAPABILITY DISCOVERY — you may search but NOT install:
9
+ - If the task needs a capability none of the configured servers provides, you may use search_mcp_marketplace to see what exists. Do NOT reference unconfigured servers in the spec; instead mention the recommended server (its registry name) in the flow "description" so the user can install it.`;return`You design workflows for FLUJO, an MCP-first workflow builder. The user describes what they want; you emit a flow specification as JSON.
10
+
11
+ OUTPUT FORMAT — when you are done (after any tool use), respond with ONLY one JSON object, no prose, no code fences.
12
+
13
+ ${i.R}
14
+
15
+ GENERATED-FLOW DEFAULTS (context saving): process nodes you leave without an explicit inputMode/outputMode are compiled with inputMode "latest-message" and outputMode "latest-message" — each step sees only the current task and later steps see only its final response, not its tool calls/results. When a step genuinely needs the whole conversation or later steps need its intermediate work, set "full-history" / "full-conversation" explicitly.
16
+
17
+ ${f}
18
+
19
+ ${e}
20
+
21
+ ${a}`}function p(a){return a.map(a=>`- [${a.severity}] ${a.message}`).join("\n")}function q(a){let b=[{type:"function",function:{name:"search_mcp_marketplace",description:'Search the public MCP server registry. The registry matches the query against server NAMES only (substring), so use short single terms ("voice", "tts", "browser") and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it requires.',parameters:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}}}];return a&&b.push({type:"function",function:{name:"install_mcp_server",description:"Install an MCP server from the registry (by the exact name returned by search) and connect it. Returns the server name to reference in the spec and the tools it provides — or needsEnv when required keys are missing (then pick an alternative or note it for the user). Installing can take a while (package download).",parameters:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'}},required:["name"]}}}),b}async function r(a,b,c,d){if("search_mcp_marketplace"===a){let a="string"==typeof b.query?b.query:"";try{return await (0,j.e)(a)}catch(a){return{error:`Registry search failed: ${a instanceof Error?a.message:String(a)}`}}}if("install_mcp_server"===a){if(!c)return{error:"Installing is not allowed in this generation (allowInstall is off)."};let a="string"==typeof b.name?b.name:"",e=await (0,j.a)(a,void 0,{resolveOnly:!0}),f=await (0,k.Ej)(),g=(0,l.e5)({caller:"generator",settings:f,registryName:a,allowInstall:c});e.plan&&await (0,k.NB)((0,l.UM)(e.plan,"generator",g,!1));let h=await (0,j.a)(a);return h.plan&&await (0,k.NB)((0,l.UM)(h.plan,"generator",g,h.installed,h.error)),h.installed&&h.serverName&&(d.contextDirty=!0,d.installedServers.push({name:h.serverName,tools:(h.tools??[]).map(a=>a.name),...h.alreadyExisted?{alreadyExisted:!0}:{},...h.plan?.command?{command:h.plan.command}:{},...h.plan?.args?{args:h.plan.args}:{},...h.plan?.verificationStatus?{verificationStatus:h.plan.verificationStatus}:{}})),h}return{error:`Unknown tool: ${a}`}}async function s(a,b,c,d,e,f,g){let h={};for(let a of e){if("function"!==a.type)continue;let b=a.function.name;h[b]=a=>r(b,a,f,g)}for(let i=0;i<=8;i++){let j=e.length>0&&i<8,{completion:k}=await a.createCompletion({model:b,apiKey:c,messages:d,temperature:0,...j?{tools:e,localToolExecutors:h}:{}}),l=k.choices?.[0]?.message,m=l?.tool_calls??[];if(0===m.length)return"string"==typeof l?.content?l.content:"";for(let a of(d.push({role:"assistant",content:l?.content??null,tool_calls:m}),m)){if("function"!==a.type)continue;let b={};try{b=JSON.parse(a.function.arguments||"{}")}catch{}n.info(`Generator tool call: ${a.function.name}(${a.function.arguments})`);let c=await r(a.function.name,b,f,g);d.push({role:"tool",tool_call_id:a.id,content:JSON.stringify(c)})}7===i&&d.push({role:"user",content:"Tool budget exhausted. Emit the COMPLETE flow specification now as a single JSON object using what you have."})}return""}function t(a){let b=a.indexOf("{");if(-1===b)return null;let c=0,d=!1,e=!1;for(let f=b;f<a.length;f++){let g=a[f];if(d){e?e=!1:"\\"===g?e=!0:'"'===g&&(d=!1);continue}if('"'===g)d=!0;else if("{"===g)c++;else if("}"===g&&0==--c)try{return JSON.parse(a.slice(b,f+1))}catch{break}}return null}async function u(a){var b;let c="string"==typeof a?.description?a.description.trim():"";if(!c)return{success:!1,error:"A flow description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let d=!0===a.allowInstall,i=!0===a.allowSubflows,j=i?"number"!=typeof(b=a.maxDepth)||Number.isNaN(b)?2:Math.max(0,Math.min(g.A_,Math.floor(b))):0,k=await e.modelService.getModel(a.modelId);if(!k)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let l=await e.modelService.resolveAndDecryptApiKey(k.ApiKey);if(!l)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let r=await (0,m.jY)(),u=(0,f.getCompletionAdapter)(k),v=q(d),w={installedServers:[],contextDirty:!1},x=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),y=1;async function z(a,b){let c,e=[{role:"system",content:o(r.catalog,d,i&&b<j,j)},{role:"user",content:a}];try{c=await s(u,k,l,e,v,d,w)}catch(a){return n.warn("A child subflow generation call failed; leaving the subflow unresolved",a),null}let f=t(c);return f&&"object"==typeof f?f:null}async function A(a,b){if(a&&Array.isArray(a.nodes))for(let c of a.nodes){if(c?.type!=="subflow"||c.flow)continue;if(c.subflowSpec){await A(c.subflowSpec,b+1);continue}let a="string"==typeof c.generateSubflow?c.generateSubflow.trim():"";if(!a)continue;if(b+1>j||y>=g.lk){n.info(`Not expanding generateSubflow (depth ${b+1}, ${y} flows so far): budget/depth reached`);continue}let d=await z(a,b+1);d?(y++,c.subflowSpec=d,delete c.generateSubflow,await A(d,b+1)):delete c.generateSubflow}}let B=[{role:"system",content:o(r.catalog,d,i,j)},{role:"user",content:c}],C=null,D=0;for(let a=0;a<=x;a++){let b;D++,y=1;try{b=await s(u,k,l,B,v,d,w)}catch(a){if(n.error("Generator model call failed",a),C)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}let c=t(b);if(!c){if(n.warn(`Attempt ${D}: model output contained no parseable JSON object`),w.contextDirty){try{r=await (0,m.jY)()}catch(a){n.warn("Re-gathering context after install failed; keeping the stale catalog",a)}w.contextDirty=!1}B.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}if(i)try{await A(c,0)}catch(a){n.warn("Subflow expansion failed; compiling the root spec as-is",a)}if(w.contextDirty){try{r=await (0,m.jY)()}catch(a){n.warn("Re-gathering context after install failed; validating with the stale catalog",a)}w.contextDirty=!1}let e=(0,g.dM)(c,r.compile,{maxDepth:j,maxFlows:g.lk});if(!e.flow){B.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
22
+ ${p(e.issues)}
23
+ Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}for(let a of e.flows)(0,g.Zn)(a);let f=e.flows.map(a=>({flow:a,validation:(0,h.nC)(a,{models:r.compile.models,servers:r.validatorServers,serverTools:r.compile.serverTools})})),o=(0,m.RB)(e.issues,{issues:f.flatMap(a=>a.validation.issues),errorCount:0,warningCount:0,isRunnable:!0});if(C={flows:f,rootFlow:e.flow,validation:o},0===o.errorCount)break;n.info(`Attempt ${D}: bundle has ${o.errorCount} error(s)`+(a<x?"; asking the model to repair":"; repair budget exhausted")),a<x&&B.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
24
+ ${p(o.issues)}
25
+ Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return C?(n.info(`Generated draft bundle rooted at "${C.rootFlow.name}" (${C.flows.length} flow(s)) in ${D} attempt(s): ${C.validation.errorCount} error(s), ${C.validation.warningCount} warning(s), ${w.installedServers.length} server(s) installed`),{success:!0,flow:C.rootFlow,validation:C.validation,flows:C.flows,rootFlowId:C.rootFlow.id,attempts:D,installedServers:w.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the description or a different generator model.",statusCode:422}}async function v(a){let b="string"==typeof a?.description?a.description.trim():"";if(!b)return{success:!1,error:"A change description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let c=a?.flow;if(!c||"object"!=typeof c||!Array.isArray(c.nodes)||!Array.isArray(c.edges))return{success:!1,error:"A valid flow to improve is required",statusCode:400};let d=await e.modelService.getModel(a.modelId);if(!d)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let i=await e.modelService.resolveAndDecryptApiKey(d.ApiKey);if(!i)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let j=!0===a.allowInstall,k=await (0,m.jY)(),l=(0,f.getCompletionAdapter)(d),r=q(j),u={installedServers:[],contextDirty:!1},v=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),w=(0,g.FH)(c),x={};for(let a of c.nodes)a?.id&&a.position&&"number"==typeof a.position.x&&"number"==typeof a.position.y&&(x[a.id]={x:a.position.x,y:a.position.y});let y=a=>({models:a.compile.models,servers:a.compile.servers,serverTools:a.compile.serverTools,flows:(a.compile.flows??[]).filter(a=>a.id!==c.id)}),z=`EXISTING FLOW (modify this — keep unchanged parts intact, and KEEP each node's "key" for any node you do NOT restructure so its canvas position is preserved):
26
+ ${JSON.stringify(w)}
27
+
28
+ CHANGE REQUEST:
29
+ ${b}
30
+
31
+ Re-emit the COMPLETE flow specification as a single JSON object (only the JSON), including the nodes you did not change.`,A=[{role:"system",content:o(k.catalog,j,!1,0)},{role:"user",content:z}],B=null,C=0;for(let a=0;a<=v;a++){let b;C++;try{b=await s(l,d,i,A,r,j,u)}catch(a){if(n.error("Improver model call failed",a),B)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}if(u.contextDirty){try{k=await (0,m.jY)()}catch(a){n.warn("Re-gathering context after install failed; using the stale catalog",a)}u.contextDirty=!1}let e=t(b);if(!e){n.warn(`Improve attempt ${C}: model output contained no parseable JSON object`),A.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}let f=(0,g.dM)(e,y(k),{maxDepth:0,maxFlows:1,positions:x});if(!f.flow){A.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
32
+ ${p(f.issues)}
33
+ Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}f.flow.id=c.id,"string"==typeof e.name&&e.name.trim()||(f.flow.name=c.name),(0,g.Zn)(f.flow);let o=(0,h.nC)(f.flow,{models:k.compile.models,servers:k.validatorServers,serverTools:k.compile.serverTools}),q=(0,m.RB)(f.issues,o);if(B={flows:[{flow:f.flow,validation:o}],rootFlow:f.flow,validation:q},0===q.errorCount)break;n.info(`Improve attempt ${C}: flow has ${q.errorCount} error(s)`+(a<v?"; asking the model to repair":"; repair budget exhausted")),a<v&&A.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
34
+ ${p(q.issues)}
35
+ Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return B?(n.info(`Improved draft "${B.rootFlow.name}" in ${C} attempt(s): ${B.validation.errorCount} error(s), ${B.validation.warningCount} warning(s), ${u.installedServers.length} server(s) installed`),{success:!0,flow:B.rootFlow,validation:B.validation,flows:B.flows,rootFlowId:B.rootFlow.id,attempts:C,installedServers:u.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the change request or a different generator model.",statusCode:422}}},49181:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},84671:(a,b,c)=>{c.d(b,{nC:()=>h});var d=c(49181);function e(a){return a.data?.type??a.type??"unknown"}function f(a){return a.data?.label||a.id}function g(a){return a.data?.edgeType==="mcp"}function h(a,b={}){let c=[],i=Array.isArray(a?.nodes)?a.nodes:[],j=Array.isArray(a?.edges)?a.edges:[],k=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?f(e):void 0}),l=new Map((b.models??[]).map(a=>[a.id,a])),m=new Map((b.servers??[]).map(a=>[a.name,a])),n=!!b.models,o=!!b.servers,p=i.filter(a=>"start"===e(a)),q=i.filter(a=>"finish"===e(a)),r=i.filter(a=>"process"===e(a)),s=i.filter(a=>"mcp"===e(a));if(0===p.length)k("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(p.length>1)for(let a of p.slice(1))k("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===q.length&&k("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),r)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(n&&!l.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";k("error","process-model-missing",`Process node "${f(a)}" is bound to a model that no longer exists${c}.`,a)}}else k("error","process-missing-model",`Process node "${f(a)}" has no model bound.`,a)}for(let a of s){let b=(a.data?.properties??{}).boundServer;if(b){if(o&&!m.has(b))k("warning","mcp-server-missing",`MCP node "${f(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(o){let c=m.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;k("warning","mcp-server-disconnected",`MCP node "${f(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else k("warning","mcp-missing-server",`MCP node "${f(a)}" is not bound to a server.`,a);j.some(b=>g(b)&&(b.source===a.id||b.target===a.id))||k("warning","mcp-node-unconnected",`MCP node "${f(a)}" is not connected to any Process node.`,a)}if(p.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!g(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(j);for(let b of p)a.get(b.id)?.length||k("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(p.map(a=>a.id),a);for(let a of[...r,...q])b.has(a.id)||k("warning","unreachable-node",`${"finish"===e(a)?"Finish":"Process"} node "${f(a)}" is not reachable from the Start node.`,a)}for(let a of i.filter(a=>"subflow"===e(a))){let b=j.filter(b=>!g(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&k("error","subflow-multiple-outgoing",`Subflow node "${f(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a)}for(let a of r){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let h=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=new Set;for(let b of c){if(!g(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let h=d.get(c);if(!h||"mcp"!==e(h))continue;let i=h.data?.properties?.boundServer;"string"==typeof i&&i&&f.add(i)}return f}(a.id,i,j),l=new Set;for(let e of(0,d.A$)(c)){if("handoff"===e.server)continue;let c=`${e.kind}:${e.server}:${e.name}`;!l.has(c)&&(l.add(c),h.has(e.server)?"tool"===e.kind&&b.serverTools&&b.serverTools[e.server]&&!b.serverTools[e.server].includes(e.name)&&k("warning","tool-unavailable",`Process node "${f(a)}" references tool "${e.name}" which server "${e.server}" no longer provides.`,a):k("error","tool-pill-disconnected",`Process node "${f(a)}" references ${e.kind} "${e.name}" from server "${e.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let t=c.filter(a=>"error"===a.severity).length,u=c.length-t;return{issues:c,errorCount:t,warningCount:u,isRunnable:0===t}}}};