flujo-ai 3.26.0 → 3.28.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 (706) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +470 -306
  3. package/.next/app-path-routes-manifest.json +28 -8
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +24 -0
  6. package/.next/react-loadable-manifest.json +31 -18
  7. package/.next/routes-manifest.json +29 -0
  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 +2 -2
  11. package/.next/server/app/api/approvals/[id]/route.js +1 -1
  12. package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
  13. package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/approvals/route.js +2 -2
  15. package/.next/server/app/api/approvals/route.js.nft.json +1 -1
  16. package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/backup/route.js +1 -1
  18. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  19. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/bugs/enhance/route.js +3 -3
  22. package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
  23. package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/cwd/route.js +1 -1
  25. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/encryption/secure/route.js +1 -1
  27. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  28. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/env/route.js +2 -2
  30. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/flow/[id]/route.js +1 -1
  32. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js +1 -0
  35. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/[id]/versions/route.js +1 -0
  38. package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -0
  39. package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -0
  40. package/.next/server/app/api/flow/compile/route.js +1 -1
  41. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  42. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/flow/generate/route.js +1 -1
  44. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  45. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/flow/improve/route.js +1 -1
  47. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  48. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
  50. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  51. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/flow/quick-chat/route.js +1 -1
  53. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  54. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/flow/repair/route.js +1 -1
  56. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  57. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/flow/route.js +1 -1
  59. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  60. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/git/route.js +2 -2
  62. package/.next/server/app/api/git/route.js.nft.json +1 -1
  63. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/init/route.js +1 -1
  65. package/.next/server/app/api/init/route.js.nft.json +1 -1
  66. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/mcp/app-sandbox/route.js +1 -0
  71. package/.next/server/app/api/mcp/app-sandbox/route.js.nft.json +1 -0
  72. package/.next/server/app/api/mcp/app-sandbox/route_client-reference-manifest.js +1 -0
  73. package/.next/server/app/api/mcp/cancel/route.js +2 -2
  74. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  75. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/mcp/oauth-capability/route.js +1 -0
  77. package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -0
  78. package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -0
  79. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  81. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  83. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  86. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  87. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  89. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  90. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  92. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  93. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  95. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  96. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  98. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  101. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  102. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/mcp/servers/route.js +1 -1
  104. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  105. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  107. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  108. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  110. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  111. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/mcp-registry/route.js +2 -2
  113. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  114. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  116. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/model/[id]/route.js +1 -1
  118. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  119. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/model/provider/route.js +2 -2
  121. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  122. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/model/route.js +1 -1
  124. package/.next/server/app/api/model/route.js.nft.json +1 -1
  125. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/model/test/route.js +2 -2
  127. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  128. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/oauth/callback/route.js +2 -2
  130. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  131. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/oauth/initiate/route.js +2 -2
  133. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  134. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/oauth/reset/route.js +2 -2
  136. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  137. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/packages/build/route.js +1 -0
  139. package/.next/server/app/api/packages/build/route.js.nft.json +1 -0
  140. package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -0
  141. package/.next/server/app/api/packages/derive-secrets/route.js +1 -0
  142. package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -0
  143. package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -0
  144. package/.next/server/app/api/packages/install/route.js +1 -0
  145. package/.next/server/app/api/packages/install/route.js.nft.json +1 -0
  146. package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -0
  147. package/.next/server/app/api/packages/install/status/route.js +1 -0
  148. package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -0
  149. package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -0
  150. package/.next/server/app/api/packages/installed/route.js +1 -0
  151. package/.next/server/app/api/packages/installed/route.js.nft.json +1 -0
  152. package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -0
  153. package/.next/server/app/api/packages/resolve/route.js +1 -0
  154. package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -0
  155. package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -0
  156. package/.next/server/app/api/packages/uninstall/route.js +1 -0
  157. package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -0
  158. package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -0
  159. package/.next/server/app/api/planned-executions/[id]/route.js +2 -2
  160. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/planned-executions/[id]/run/route.js +2 -2
  163. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  164. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/planned-executions/[id]/runs/route.js +2 -2
  166. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  167. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
  170. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  171. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/planned-executions/route.js +1 -1
  173. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  174. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/registry/auth/resend/route.js +1 -0
  176. package/.next/server/app/api/registry/auth/resend/route.js.nft.json +1 -0
  177. package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app/api/registry/auth/reset/route.js +1 -0
  179. package/.next/server/app/api/registry/auth/reset/route.js.nft.json +1 -0
  180. package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -0
  181. package/.next/server/app/api/registry/auth/route.js +1 -0
  182. package/.next/server/app/api/registry/auth/route.js.nft.json +1 -0
  183. package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -0
  184. package/.next/server/app/api/registry/oauth/callback/route.js +1 -0
  185. package/.next/server/app/api/registry/oauth/callback/route.js.nft.json +1 -0
  186. package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -0
  187. package/.next/server/app/api/registry/oauth/initiate/route.js +1 -0
  188. package/.next/server/app/api/registry/oauth/initiate/route.js.nft.json +1 -0
  189. package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -0
  190. package/.next/server/app/api/registry/publish/route.js +1 -0
  191. package/.next/server/app/api/registry/publish/route.js.nft.json +1 -0
  192. package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -0
  193. package/.next/server/app/api/registry/settings/route.js +1 -0
  194. package/.next/server/app/api/registry/settings/route.js.nft.json +1 -0
  195. package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -0
  196. package/.next/server/app/api/restore/route.js +1 -1
  197. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  198. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/runs/active/route.js +2 -2
  200. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  201. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/storage/route.js +1 -1
  203. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/update/route.js +1 -1
  205. package/.next/server/app/api/update/route.js.nft.json +1 -1
  206. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/waves/route.js +1 -1
  208. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  209. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  211. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  212. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/chat/page.js +9 -10
  214. package/.next/server/app/chat/page.js.nft.json +1 -1
  215. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/chat.html +1 -1
  217. package/.next/server/app/chat.rsc +3 -3
  218. package/.next/server/app/docs/page.js +7 -6
  219. package/.next/server/app/docs/page.js.nft.json +1 -1
  220. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/docs.html +1 -1
  222. package/.next/server/app/docs.rsc +3 -3
  223. package/.next/server/app/executions/page.js +39 -3
  224. package/.next/server/app/executions/page.js.nft.json +1 -1
  225. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/executions.html +1 -1
  227. package/.next/server/app/executions.rsc +3 -3
  228. package/.next/server/app/flows/page.js +3 -3
  229. package/.next/server/app/flows/page.js.nft.json +1 -1
  230. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/flows.html +1 -1
  232. package/.next/server/app/flows.rsc +4 -4
  233. package/.next/server/app/index.html +1 -1
  234. package/.next/server/app/index.rsc +3 -3
  235. package/.next/server/app/mcp/page.js +14 -14
  236. package/.next/server/app/mcp/page.js.nft.json +1 -1
  237. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/mcp-flows/route.js +1 -1
  239. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  240. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  242. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  243. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/mcp.html +1 -1
  245. package/.next/server/app/mcp.rsc +3 -3
  246. package/.next/server/app/models/page.js +2 -2
  247. package/.next/server/app/models/page.js.nft.json +1 -1
  248. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/packages/page.js +2 -0
  250. package/.next/server/app/packages/page.js.nft.json +1 -0
  251. package/.next/server/app/packages/page_client-reference-manifest.js +1 -0
  252. package/.next/server/app/packages.html +1 -0
  253. package/.next/server/app/packages.meta +7 -0
  254. package/.next/server/app/packages.rsc +22 -0
  255. package/.next/server/app/page.js +1 -1
  256. package/.next/server/app/page.js.nft.json +1 -1
  257. package/.next/server/app/page_client-reference-manifest.js +1 -1
  258. package/.next/server/app/settings/page.js +2 -2
  259. package/.next/server/app/settings/page.js.nft.json +1 -1
  260. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  261. package/.next/server/app/settings.html +1 -1
  262. package/.next/server/app/settings.rsc +3 -3
  263. package/.next/server/app/v1/chat/completions/route.js +1 -1
  264. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  265. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  267. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  268. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  270. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  271. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  273. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  274. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  276. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  277. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  279. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  280. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +3 -3
  282. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  283. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
  285. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  287. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  288. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  290. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  291. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/v1/chat/conversations/route.js +2 -2
  293. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  294. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/v1/chat/events/route.js +11 -0
  296. package/.next/server/app/v1/chat/events/route.js.nft.json +1 -0
  297. package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -0
  298. package/.next/server/app/v1/models/route.js +2 -2
  299. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  300. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  301. package/.next/server/app/waves/page.js +4 -4
  302. package/.next/server/app/waves/page.js.nft.json +1 -1
  303. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  304. package/.next/server/app/waves.html +1 -1
  305. package/.next/server/app/waves.rsc +3 -3
  306. package/.next/server/app-paths-manifest.json +28 -8
  307. package/.next/server/chunks/1083.js +1 -1
  308. package/.next/server/chunks/1114.js +1 -1
  309. package/.next/server/chunks/1197.js +1 -1
  310. package/.next/server/chunks/1226.js +1 -1
  311. package/.next/server/chunks/1314.js +1 -0
  312. package/.next/server/chunks/1604.js +70 -0
  313. package/.next/server/chunks/1615.js +1 -0
  314. package/.next/server/chunks/1659.js +1 -1
  315. package/.next/server/chunks/166.js +5 -5
  316. package/.next/server/chunks/1805.js +1 -0
  317. package/.next/server/chunks/1819.js +2 -0
  318. package/.next/server/chunks/1925.js +1 -0
  319. package/.next/server/chunks/2388.js +1 -0
  320. package/.next/server/chunks/2434.js +2 -0
  321. package/.next/server/chunks/2666.js +1 -0
  322. package/.next/server/chunks/2859.js +1 -1
  323. package/.next/server/chunks/2940.js +46 -0
  324. package/.next/server/chunks/2985.js +1 -0
  325. package/.next/server/chunks/3128.js +62 -0
  326. package/.next/server/chunks/3273.js +1 -0
  327. package/.next/server/chunks/3298.js +1 -1
  328. package/.next/server/chunks/{8445.js → 3392.js} +2 -2
  329. package/.next/server/chunks/346.js +1 -0
  330. package/.next/server/chunks/3570.js +249 -0
  331. package/.next/server/chunks/3629.js +1 -0
  332. package/.next/server/chunks/38.js +2 -2
  333. package/.next/server/chunks/3951.js +151 -0
  334. package/.next/server/chunks/4042.js +1 -0
  335. package/.next/server/chunks/4265.js +1 -1
  336. package/.next/server/chunks/4306.js +1 -0
  337. package/.next/server/chunks/4322.js +1 -0
  338. package/.next/server/chunks/4426.js +6 -0
  339. package/.next/server/chunks/{6745.js → 4661.js} +1 -1
  340. package/.next/server/chunks/4671.js +1 -1
  341. package/.next/server/chunks/4681.js +1 -0
  342. package/.next/server/chunks/4765.js +1 -0
  343. package/.next/server/chunks/4771.js +2 -2
  344. package/.next/server/chunks/5067.js +1 -0
  345. package/.next/server/chunks/5096.js +1 -0
  346. package/.next/server/chunks/510.js +1 -0
  347. package/.next/server/chunks/5148.js +1 -1
  348. package/.next/server/chunks/{4578.js → 5150.js} +1 -1
  349. package/.next/server/chunks/5200.js +1 -0
  350. package/.next/server/chunks/5463.js +1 -1
  351. package/.next/server/chunks/5471.js +1 -0
  352. package/.next/server/chunks/5544.js +5 -5
  353. package/.next/server/chunks/5708.js +6 -5
  354. package/.next/server/chunks/5880.js +1 -0
  355. package/.next/server/chunks/5958.js +2 -0
  356. package/.next/server/chunks/6005.js +1 -0
  357. package/.next/server/chunks/6126.js +53 -0
  358. package/.next/server/chunks/6529.js +5 -0
  359. package/.next/server/chunks/6537.js +1 -1
  360. package/.next/server/chunks/6826.js +1 -1
  361. package/.next/server/chunks/6849.js +66 -0
  362. package/.next/server/chunks/688.js +3 -0
  363. package/.next/server/chunks/701.js +1 -1
  364. package/.next/server/chunks/7032.js +1 -1
  365. package/.next/server/chunks/7214.js +4 -4
  366. package/.next/server/chunks/724.js +1 -1
  367. package/.next/server/chunks/7463.js +4 -4
  368. package/.next/server/chunks/7506.js +1 -1
  369. package/.next/server/chunks/7538.js +21 -0
  370. package/.next/server/chunks/7579.js +8 -7
  371. package/.next/server/chunks/{3030.js → 7674.js} +1 -1
  372. package/.next/server/chunks/7821.js +1 -1
  373. package/.next/server/chunks/793.js +393 -0
  374. package/.next/server/chunks/8037.js +1 -0
  375. package/.next/server/chunks/8165.js +3 -0
  376. package/.next/server/chunks/8339.js +1 -0
  377. package/.next/server/chunks/8387.js +1 -1
  378. package/.next/server/chunks/8522.js +2 -0
  379. package/.next/server/chunks/8568.js +12 -0
  380. package/.next/server/chunks/8667.js +1 -0
  381. package/.next/server/chunks/869.js +2 -0
  382. package/.next/server/chunks/{3489.js → 8730.js} +1 -1
  383. package/.next/server/chunks/8739.js +2 -2
  384. package/.next/server/chunks/8745.js +1 -1
  385. package/.next/server/chunks/8979.js +37 -0
  386. package/.next/server/chunks/8994.js +1 -1
  387. package/.next/server/chunks/9165.js +1 -1
  388. package/.next/server/chunks/9285.js +1 -1
  389. package/.next/server/chunks/94.js +1 -1
  390. package/.next/server/chunks/9400.js +2 -0
  391. package/.next/server/chunks/{4456.js → 9472.js} +2 -2
  392. package/.next/server/chunks/9583.js +1 -0
  393. package/.next/server/chunks/9671.js +1 -0
  394. package/.next/server/chunks/9724.js +393 -0
  395. package/.next/server/chunks/991.js +2 -0
  396. package/.next/server/functions-config-manifest.json +1 -0
  397. package/.next/server/instrumentation.js +1 -1
  398. package/.next/server/instrumentation.js.nft.json +1 -1
  399. package/.next/server/middleware-build-manifest.js +1 -1
  400. package/.next/server/middleware-manifest.json +1 -1
  401. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  402. package/.next/server/pages/404.html +1 -1
  403. package/.next/server/pages/500.html +1 -1
  404. package/.next/server/server-reference-manifest.js +1 -1
  405. package/.next/server/server-reference-manifest.json +1 -1
  406. package/.next/server/src/middleware.js +1 -1
  407. package/.next/server/src/middleware.js.map +1 -1
  408. package/.next/static/Q6ITx_bZyoEOnKdZu_C7j/_buildManifest.js +1 -0
  409. package/.next/static/chunks/1594-309fa6363f215d76.js +1 -0
  410. package/.next/static/chunks/1809-e56cf3c476261e34.js +1 -0
  411. package/.next/static/chunks/1937-6bbdcdc660db562c.js +1 -0
  412. package/.next/static/chunks/1988-1b651d581fc44a36.js +1 -0
  413. package/.next/static/chunks/{2003-7710c23acaef11c9.js → 2003-f826c607d609d1fa.js} +1 -1
  414. package/.next/static/chunks/2164-7d6451e88a447de7.js +1 -0
  415. package/.next/static/chunks/218-6cbe09820faa3272.js +1 -0
  416. package/.next/static/chunks/2566-60acd5838abd9f3f.js +1 -0
  417. package/.next/static/chunks/{2403-5c26e0abd76095b1.js → 2800-4fa29a3eeb693593.js} +1 -1
  418. package/.next/static/chunks/289-98f50bfcf833d661.js +1 -0
  419. package/.next/static/chunks/3089.9e15df4ffd0fe4e8.js +1 -0
  420. package/.next/static/chunks/{3217.f728df99ab5da33c.js → 3217.260785c2198d1e9d.js} +1 -1
  421. package/.next/static/chunks/3392-6dd9ad3be66a7ce9.js +1 -0
  422. package/.next/static/chunks/3418-a2f5d0c4f29ee2fb.js +1 -0
  423. package/.next/static/chunks/{3556-3b6f7c99b015b752.js → 3556-b9855146c7506696.js} +1 -1
  424. package/.next/static/chunks/3827-9e9a6e11ef808d90.js +1 -0
  425. package/.next/static/chunks/3910.5c6885d7a5bd753e.js +1 -0
  426. package/.next/static/chunks/3948-1cb8fc7a64805254.js +1 -0
  427. package/.next/static/chunks/3958-5641a828b320f2fe.js +100 -0
  428. package/.next/static/chunks/{488-623d07c3fbc21e28.js → 488-7ab54d8ae2b4b550.js} +1 -1
  429. package/.next/static/chunks/5328-4e556503b70e72b4.js +1 -0
  430. package/.next/static/chunks/{5512.d01d565f73109a1a.js → 5512.682bef7fd3a7c286.js} +1 -1
  431. package/.next/static/chunks/6195-8c4c57628e9013d5.js +1 -0
  432. package/.next/static/chunks/6669-a949326b30ea1d39.js +1 -0
  433. package/.next/static/chunks/6777-4b0d05731a089de4.js +1 -0
  434. package/.next/static/chunks/6947-0ff3545efb53e959.js +1 -0
  435. package/.next/static/chunks/7111-44538f8a64241b74.js +1 -0
  436. package/.next/static/chunks/7304-e7cd725083617b81.js +8 -0
  437. package/.next/static/chunks/7445-2802e158c9093556.js +1 -0
  438. package/.next/static/chunks/795-704a0e742ecc2ef6.js +1 -0
  439. package/.next/static/chunks/812-3ceea0da38ad2891.js +1 -0
  440. package/.next/static/chunks/{8345.fbc0af16acce7256.js → 8345.bc5534ec13abc9ee.js} +1 -1
  441. package/.next/static/chunks/8401-0f39d91810180a88.js +1 -0
  442. package/.next/static/chunks/{8405.e728bc83a7c9fed6.js → 8405.73e8be2c8e5b55c5.js} +1 -1
  443. package/.next/static/chunks/8551-a28272acfda62ac9.js +1 -0
  444. package/.next/static/chunks/8855-02889c9ab4bf0bcf.js +1 -0
  445. package/.next/static/chunks/{8989-401559d9f3bc80a0.js → 8989-5fa9c7c670eb9a1a.js} +1 -1
  446. package/.next/static/chunks/{9164-829ab5b085ec06d6.js → 9164-840f056a0e11d979.js} +1 -1
  447. package/.next/static/chunks/9562-ef0ddd4e6b9023cf.js +1 -0
  448. package/.next/static/chunks/app/api/approvals/[id]/route-c745e5b53b81491a.js +1 -0
  449. package/.next/static/chunks/app/api/approvals/route-c745e5b53b81491a.js +1 -0
  450. package/.next/static/chunks/app/api/backup/route-c745e5b53b81491a.js +1 -0
  451. package/.next/static/chunks/app/api/browse/route-c745e5b53b81491a.js +1 -0
  452. package/.next/static/chunks/app/api/bugs/enhance/route-c745e5b53b81491a.js +1 -0
  453. package/.next/static/chunks/app/api/cwd/route-c745e5b53b81491a.js +1 -0
  454. package/.next/static/chunks/app/api/encryption/secure/route-c745e5b53b81491a.js +1 -0
  455. package/.next/static/chunks/app/api/env/route-c745e5b53b81491a.js +1 -0
  456. package/.next/static/chunks/app/api/flow/[id]/route-c745e5b53b81491a.js +1 -0
  457. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-c745e5b53b81491a.js +1 -0
  458. package/.next/static/chunks/app/api/flow/[id]/versions/route-c745e5b53b81491a.js +1 -0
  459. package/.next/static/chunks/app/api/flow/compile/route-c745e5b53b81491a.js +1 -0
  460. package/.next/static/chunks/app/api/flow/generate/route-c745e5b53b81491a.js +1 -0
  461. package/.next/static/chunks/app/api/flow/improve/route-c745e5b53b81491a.js +1 -0
  462. package/.next/static/chunks/app/api/flow/prompt-renderer/route-c745e5b53b81491a.js +1 -0
  463. package/.next/static/chunks/app/api/flow/quick-chat/route-c745e5b53b81491a.js +1 -0
  464. package/.next/static/chunks/app/api/flow/repair/route-c745e5b53b81491a.js +1 -0
  465. package/.next/static/chunks/app/api/flow/route-c745e5b53b81491a.js +1 -0
  466. package/.next/static/chunks/app/api/git/route-c745e5b53b81491a.js +1 -0
  467. package/.next/static/chunks/app/api/init/route-c745e5b53b81491a.js +1 -0
  468. package/.next/static/chunks/app/api/local-models/capability/route-c745e5b53b81491a.js +1 -0
  469. package/.next/static/chunks/app/api/local-models/pull/route-c745e5b53b81491a.js +1 -0
  470. package/.next/static/chunks/app/api/local-models/suggest/route-c745e5b53b81491a.js +1 -0
  471. package/.next/static/chunks/app/api/mcp/app-sandbox/route-c745e5b53b81491a.js +1 -0
  472. package/.next/static/chunks/app/api/mcp/cancel/route-c745e5b53b81491a.js +1 -0
  473. package/.next/static/chunks/app/api/mcp/oauth-capability/route-c745e5b53b81491a.js +1 -0
  474. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-c745e5b53b81491a.js +1 -0
  475. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-c745e5b53b81491a.js +1 -0
  476. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-c745e5b53b81491a.js +1 -0
  477. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-c745e5b53b81491a.js +1 -0
  478. package/.next/static/chunks/app/api/mcp/servers/[name]/route-c745e5b53b81491a.js +1 -0
  479. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-c745e5b53b81491a.js +1 -0
  480. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-c745e5b53b81491a.js +1 -0
  481. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-c745e5b53b81491a.js +1 -0
  482. package/.next/static/chunks/app/api/mcp/servers/route-c745e5b53b81491a.js +1 -0
  483. package/.next/static/chunks/app/api/mcp/test-connection/route-c745e5b53b81491a.js +1 -0
  484. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-c745e5b53b81491a.js +1 -0
  485. package/.next/static/chunks/app/api/mcp-registry/route-c745e5b53b81491a.js +1 -0
  486. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-c745e5b53b81491a.js +1 -0
  487. package/.next/static/chunks/app/api/model/[id]/route-c745e5b53b81491a.js +1 -0
  488. package/.next/static/chunks/app/api/model/provider/route-c745e5b53b81491a.js +1 -0
  489. package/.next/static/chunks/app/api/model/route-c745e5b53b81491a.js +1 -0
  490. package/.next/static/chunks/app/api/model/test/route-c745e5b53b81491a.js +1 -0
  491. package/.next/static/chunks/app/api/oauth/callback/route-c745e5b53b81491a.js +1 -0
  492. package/.next/static/chunks/app/api/oauth/initiate/route-c745e5b53b81491a.js +1 -0
  493. package/.next/static/chunks/app/api/oauth/reset/route-c745e5b53b81491a.js +1 -0
  494. package/.next/static/chunks/app/api/packages/build/route-c745e5b53b81491a.js +1 -0
  495. package/.next/static/chunks/app/api/packages/derive-secrets/route-c745e5b53b81491a.js +1 -0
  496. package/.next/static/chunks/app/api/packages/install/route-c745e5b53b81491a.js +1 -0
  497. package/.next/static/chunks/app/api/packages/install/status/route-c745e5b53b81491a.js +1 -0
  498. package/.next/static/chunks/app/api/packages/installed/route-c745e5b53b81491a.js +1 -0
  499. package/.next/static/chunks/app/api/packages/resolve/route-c745e5b53b81491a.js +1 -0
  500. package/.next/static/chunks/app/api/packages/uninstall/route-c745e5b53b81491a.js +1 -0
  501. package/.next/static/chunks/app/api/planned-executions/[id]/route-c745e5b53b81491a.js +1 -0
  502. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-c745e5b53b81491a.js +1 -0
  503. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-c745e5b53b81491a.js +1 -0
  504. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-c745e5b53b81491a.js +1 -0
  505. package/.next/static/chunks/app/api/planned-executions/reconcile/route-c745e5b53b81491a.js +1 -0
  506. package/.next/static/chunks/app/api/planned-executions/route-c745e5b53b81491a.js +1 -0
  507. package/.next/static/chunks/app/api/registry/auth/resend/route-c745e5b53b81491a.js +1 -0
  508. package/.next/static/chunks/app/api/registry/auth/reset/route-c745e5b53b81491a.js +1 -0
  509. package/.next/static/chunks/app/api/registry/auth/route-c745e5b53b81491a.js +1 -0
  510. package/.next/static/chunks/app/api/registry/oauth/callback/route-c745e5b53b81491a.js +1 -0
  511. package/.next/static/chunks/app/api/registry/oauth/initiate/route-c745e5b53b81491a.js +1 -0
  512. package/.next/static/chunks/app/api/registry/publish/route-c745e5b53b81491a.js +1 -0
  513. package/.next/static/chunks/app/api/registry/settings/route-c745e5b53b81491a.js +1 -0
  514. package/.next/static/chunks/app/api/restore/route-c745e5b53b81491a.js +1 -0
  515. package/.next/static/chunks/app/api/runs/active/route-c745e5b53b81491a.js +1 -0
  516. package/.next/static/chunks/app/api/storage/route-c745e5b53b81491a.js +1 -0
  517. package/.next/static/chunks/app/api/update/route-c745e5b53b81491a.js +1 -0
  518. package/.next/static/chunks/app/api/waves/route-c745e5b53b81491a.js +1 -0
  519. package/.next/static/chunks/app/api/webhooks/[id]/route-c745e5b53b81491a.js +1 -0
  520. package/.next/static/chunks/app/chat/page-c39160ddf90bbae9.js +1 -0
  521. package/.next/static/chunks/app/docs/page-250523af44e96120.js +1 -0
  522. package/.next/static/chunks/app/executions/page-10d09f36de30939f.js +1 -0
  523. package/.next/static/chunks/app/flows/page-0d8fb471adfc2981.js +1 -0
  524. package/.next/static/chunks/app/layout-eea7078d7553c21a.js +1 -0
  525. package/.next/static/chunks/app/mcp/page-8ad71bf5801bfe5f.js +1 -0
  526. package/.next/static/chunks/app/mcp-flows/route-c745e5b53b81491a.js +1 -0
  527. package/.next/static/chunks/app/mcp-proxy/[server]/route-c745e5b53b81491a.js +1 -0
  528. package/.next/static/chunks/app/models/page-17e8e6668f92f58d.js +1 -0
  529. package/.next/static/chunks/app/packages/page-9f61751e98134f3d.js +1 -0
  530. package/.next/static/chunks/app/{page-0a95c40a65dbd2eb.js → page-d3ea90b065b95d1e.js} +1 -1
  531. package/.next/static/chunks/app/settings/page-afbf8790e99fecaf.js +1 -0
  532. package/.next/static/chunks/app/v1/chat/completions/route-c745e5b53b81491a.js +1 -0
  533. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-c745e5b53b81491a.js +1 -0
  534. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-c745e5b53b81491a.js +1 -0
  535. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-c745e5b53b81491a.js +1 -0
  536. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-c745e5b53b81491a.js +1 -0
  537. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-c745e5b53b81491a.js +1 -0
  538. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-c745e5b53b81491a.js +1 -0
  539. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-c745e5b53b81491a.js +1 -0
  540. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-c745e5b53b81491a.js +1 -0
  541. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-c745e5b53b81491a.js +1 -0
  542. package/.next/static/chunks/app/v1/chat/conversations/route-c745e5b53b81491a.js +1 -0
  543. package/.next/static/chunks/app/v1/chat/events/route-c745e5b53b81491a.js +1 -0
  544. package/.next/static/chunks/app/v1/models/route-c745e5b53b81491a.js +1 -0
  545. package/.next/static/chunks/app/waves/page-97ad6b51c9cae4b3.js +1 -0
  546. package/.next/static/chunks/webpack-0d4a4e773990ac44.js +1 -0
  547. package/.next/static/css/{64cb1f185b52a623.css → 69ab44eb350e0b6c.css} +1 -1
  548. package/.next/trace +10 -10
  549. package/.next/types/app/api/flow/[id]/versions/[versionId]/route.ts +347 -0
  550. package/.next/types/app/api/flow/[id]/versions/route.ts +347 -0
  551. package/.next/types/app/api/mcp/app-sandbox/route.ts +347 -0
  552. package/.next/types/app/api/mcp/oauth-capability/route.ts +347 -0
  553. package/.next/types/app/api/packages/build/route.ts +347 -0
  554. package/.next/types/app/api/packages/derive-secrets/route.ts +347 -0
  555. package/.next/types/app/api/packages/install/route.ts +347 -0
  556. package/.next/types/app/api/packages/install/status/route.ts +347 -0
  557. package/.next/types/app/api/packages/installed/route.ts +347 -0
  558. package/.next/types/app/api/packages/resolve/route.ts +347 -0
  559. package/.next/types/app/api/packages/uninstall/route.ts +347 -0
  560. package/.next/types/app/api/registry/auth/resend/route.ts +347 -0
  561. package/.next/types/app/api/registry/auth/reset/route.ts +347 -0
  562. package/.next/types/app/api/registry/auth/route.ts +347 -0
  563. package/.next/types/app/api/registry/oauth/callback/route.ts +347 -0
  564. package/.next/types/app/api/registry/oauth/initiate/route.ts +347 -0
  565. package/.next/types/app/api/registry/publish/route.ts +347 -0
  566. package/.next/types/app/api/registry/settings/route.ts +347 -0
  567. package/.next/types/app/packages/page.ts +84 -0
  568. package/.next/types/app/v1/chat/events/route.ts +347 -0
  569. package/.next/types/routes.d.ts +22 -2
  570. package/.next/types/validator.ts +180 -0
  571. package/README.md +1 -1
  572. package/package.json +97 -90
  573. package/.next/server/chunks/1152.js +0 -2
  574. package/.next/server/chunks/1223.js +0 -1
  575. package/.next/server/chunks/1377.js +0 -1
  576. package/.next/server/chunks/2373.js +0 -1
  577. package/.next/server/chunks/289.js +0 -1
  578. package/.next/server/chunks/3774.js +0 -6
  579. package/.next/server/chunks/3823.js +0 -41
  580. package/.next/server/chunks/3855.js +0 -1
  581. package/.next/server/chunks/3924.js +0 -52
  582. package/.next/server/chunks/4372.js +0 -1
  583. package/.next/server/chunks/4545.js +0 -21
  584. package/.next/server/chunks/4561.js +0 -65
  585. package/.next/server/chunks/4677.js +0 -37
  586. package/.next/server/chunks/472.js +0 -1
  587. package/.next/server/chunks/4793.js +0 -2
  588. package/.next/server/chunks/4836.js +0 -1
  589. package/.next/server/chunks/5311.js +0 -1
  590. package/.next/server/chunks/5662.js +0 -2
  591. package/.next/server/chunks/5734.js +0 -60
  592. package/.next/server/chunks/584.js +0 -1
  593. package/.next/server/chunks/62.js +0 -1
  594. package/.next/server/chunks/6240.js +0 -1
  595. package/.next/server/chunks/6306.js +0 -1
  596. package/.next/server/chunks/6793.js +0 -1
  597. package/.next/server/chunks/6908.js +0 -12
  598. package/.next/server/chunks/6996.js +0 -62
  599. package/.next/server/chunks/7362.js +0 -158
  600. package/.next/server/chunks/8216.js +0 -1
  601. package/.next/server/chunks/856.js +0 -5
  602. package/.next/server/chunks/8652.js +0 -42
  603. package/.next/server/chunks/9427.js +0 -1
  604. package/.next/static/Il6IDWxf3CN0dv-P6QQrp/_buildManifest.js +0 -1
  605. package/.next/static/chunks/1675-773454288de4309d.js +0 -1
  606. package/.next/static/chunks/1731-6e45fb529f9044a3.js +0 -1
  607. package/.next/static/chunks/2318-76fcb6c769b1a569.js +0 -1
  608. package/.next/static/chunks/2566-6e2b9d9349814789.js +0 -1
  609. package/.next/static/chunks/2734-59fbe2f62a59df86.js +0 -1
  610. package/.next/static/chunks/3089.6b4e21e1faa304e2.js +0 -1
  611. package/.next/static/chunks/3109-11bdec9bdfd996c3.js +0 -1
  612. package/.next/static/chunks/333-5f3c5be57c80c48c.js +0 -1
  613. package/.next/static/chunks/3333-b7b3e5758a568013.js +0 -1
  614. package/.next/static/chunks/4003-3b3768446ae333df.js +0 -1
  615. package/.next/static/chunks/4635-0fe310d3be64e71e.js +0 -1
  616. package/.next/static/chunks/4690-ec7d397cfacedac3.js +0 -1
  617. package/.next/static/chunks/4775-cb9c0be621363a08.js +0 -8
  618. package/.next/static/chunks/5336-81da1080de29ebfc.js +0 -1
  619. package/.next/static/chunks/6691-117567b2b40cd9f4.js +0 -1
  620. package/.next/static/chunks/7274-1184563607f2b5f5.js +0 -1
  621. package/.next/static/chunks/812-624e93f4c0f671c7.js +0 -1
  622. package/.next/static/chunks/8166-e75acdc559b34fcd.js +0 -1
  623. package/.next/static/chunks/8607-5787e42775fc3acb.js +0 -1
  624. package/.next/static/chunks/8610-660d5088bc1dd7a7.js +0 -1
  625. package/.next/static/chunks/9240-d0a51f4d504f34b1.js +0 -1
  626. package/.next/static/chunks/9562-b7922ceb400ec536.js +0 -1
  627. package/.next/static/chunks/9704-6b7415964d7c042a.js +0 -1
  628. package/.next/static/chunks/app/api/approvals/[id]/route-6b442f97c5062f2c.js +0 -1
  629. package/.next/static/chunks/app/api/approvals/route-6b442f97c5062f2c.js +0 -1
  630. package/.next/static/chunks/app/api/backup/route-6b442f97c5062f2c.js +0 -1
  631. package/.next/static/chunks/app/api/browse/route-6b442f97c5062f2c.js +0 -1
  632. package/.next/static/chunks/app/api/bugs/enhance/route-6b442f97c5062f2c.js +0 -1
  633. package/.next/static/chunks/app/api/cwd/route-6b442f97c5062f2c.js +0 -1
  634. package/.next/static/chunks/app/api/encryption/secure/route-6b442f97c5062f2c.js +0 -1
  635. package/.next/static/chunks/app/api/env/route-6b442f97c5062f2c.js +0 -1
  636. package/.next/static/chunks/app/api/flow/[id]/route-6b442f97c5062f2c.js +0 -1
  637. package/.next/static/chunks/app/api/flow/compile/route-6b442f97c5062f2c.js +0 -1
  638. package/.next/static/chunks/app/api/flow/generate/route-6b442f97c5062f2c.js +0 -1
  639. package/.next/static/chunks/app/api/flow/improve/route-6b442f97c5062f2c.js +0 -1
  640. package/.next/static/chunks/app/api/flow/prompt-renderer/route-6b442f97c5062f2c.js +0 -1
  641. package/.next/static/chunks/app/api/flow/quick-chat/route-6b442f97c5062f2c.js +0 -1
  642. package/.next/static/chunks/app/api/flow/repair/route-6b442f97c5062f2c.js +0 -1
  643. package/.next/static/chunks/app/api/flow/route-6b442f97c5062f2c.js +0 -1
  644. package/.next/static/chunks/app/api/git/route-6b442f97c5062f2c.js +0 -1
  645. package/.next/static/chunks/app/api/init/route-6b442f97c5062f2c.js +0 -1
  646. package/.next/static/chunks/app/api/local-models/capability/route-6b442f97c5062f2c.js +0 -1
  647. package/.next/static/chunks/app/api/local-models/pull/route-6b442f97c5062f2c.js +0 -1
  648. package/.next/static/chunks/app/api/local-models/suggest/route-6b442f97c5062f2c.js +0 -1
  649. package/.next/static/chunks/app/api/mcp/cancel/route-6b442f97c5062f2c.js +0 -1
  650. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-6b442f97c5062f2c.js +0 -1
  651. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-6b442f97c5062f2c.js +0 -1
  652. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-6b442f97c5062f2c.js +0 -1
  653. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-6b442f97c5062f2c.js +0 -1
  654. package/.next/static/chunks/app/api/mcp/servers/[name]/route-6b442f97c5062f2c.js +0 -1
  655. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-6b442f97c5062f2c.js +0 -1
  656. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-6b442f97c5062f2c.js +0 -1
  657. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-6b442f97c5062f2c.js +0 -1
  658. package/.next/static/chunks/app/api/mcp/servers/route-6b442f97c5062f2c.js +0 -1
  659. package/.next/static/chunks/app/api/mcp/test-connection/route-6b442f97c5062f2c.js +0 -1
  660. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-6b442f97c5062f2c.js +0 -1
  661. package/.next/static/chunks/app/api/mcp-registry/route-6b442f97c5062f2c.js +0 -1
  662. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-6b442f97c5062f2c.js +0 -1
  663. package/.next/static/chunks/app/api/model/[id]/route-6b442f97c5062f2c.js +0 -1
  664. package/.next/static/chunks/app/api/model/provider/route-6b442f97c5062f2c.js +0 -1
  665. package/.next/static/chunks/app/api/model/route-6b442f97c5062f2c.js +0 -1
  666. package/.next/static/chunks/app/api/model/test/route-6b442f97c5062f2c.js +0 -1
  667. package/.next/static/chunks/app/api/oauth/callback/route-6b442f97c5062f2c.js +0 -1
  668. package/.next/static/chunks/app/api/oauth/initiate/route-6b442f97c5062f2c.js +0 -1
  669. package/.next/static/chunks/app/api/oauth/reset/route-6b442f97c5062f2c.js +0 -1
  670. package/.next/static/chunks/app/api/planned-executions/[id]/route-6b442f97c5062f2c.js +0 -1
  671. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-6b442f97c5062f2c.js +0 -1
  672. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-6b442f97c5062f2c.js +0 -1
  673. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-6b442f97c5062f2c.js +0 -1
  674. package/.next/static/chunks/app/api/planned-executions/reconcile/route-6b442f97c5062f2c.js +0 -1
  675. package/.next/static/chunks/app/api/planned-executions/route-6b442f97c5062f2c.js +0 -1
  676. package/.next/static/chunks/app/api/restore/route-6b442f97c5062f2c.js +0 -1
  677. package/.next/static/chunks/app/api/runs/active/route-6b442f97c5062f2c.js +0 -1
  678. package/.next/static/chunks/app/api/storage/route-6b442f97c5062f2c.js +0 -1
  679. package/.next/static/chunks/app/api/update/route-6b442f97c5062f2c.js +0 -1
  680. package/.next/static/chunks/app/api/waves/route-6b442f97c5062f2c.js +0 -1
  681. package/.next/static/chunks/app/api/webhooks/[id]/route-6b442f97c5062f2c.js +0 -1
  682. package/.next/static/chunks/app/chat/page-04ad1fad78048afb.js +0 -1
  683. package/.next/static/chunks/app/docs/page-5475c616764dbb18.js +0 -1
  684. package/.next/static/chunks/app/executions/page-c18708ed96d228ec.js +0 -1
  685. package/.next/static/chunks/app/flows/page-f7e44aa545bcc56e.js +0 -1
  686. package/.next/static/chunks/app/layout-e6fbae80e0f456a6.js +0 -1
  687. package/.next/static/chunks/app/mcp/page-3638fbee04a3a6ea.js +0 -1
  688. package/.next/static/chunks/app/mcp-flows/route-6b442f97c5062f2c.js +0 -1
  689. package/.next/static/chunks/app/mcp-proxy/[server]/route-6b442f97c5062f2c.js +0 -1
  690. package/.next/static/chunks/app/models/page-e690a986047b1e62.js +0 -1
  691. package/.next/static/chunks/app/settings/page-3ef9b95187e18a5a.js +0 -1
  692. package/.next/static/chunks/app/v1/chat/completions/route-6b442f97c5062f2c.js +0 -1
  693. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-6b442f97c5062f2c.js +0 -1
  694. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-6b442f97c5062f2c.js +0 -1
  695. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-6b442f97c5062f2c.js +0 -1
  696. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-6b442f97c5062f2c.js +0 -1
  697. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-6b442f97c5062f2c.js +0 -1
  698. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-6b442f97c5062f2c.js +0 -1
  699. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-6b442f97c5062f2c.js +0 -1
  700. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-6b442f97c5062f2c.js +0 -1
  701. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-6b442f97c5062f2c.js +0 -1
  702. package/.next/static/chunks/app/v1/chat/conversations/route-6b442f97c5062f2c.js +0 -1
  703. package/.next/static/chunks/app/v1/models/route-6b442f97c5062f2c.js +0 -1
  704. package/.next/static/chunks/app/waves/page-c9a307e2236423a4.js +0 -1
  705. package/.next/static/chunks/webpack-a6844e1074885c2f.js +0 -1
  706. /package/.next/static/{Il6IDWxf3CN0dv-P6QQrp → Q6ITx_bZyoEOnKdZu_C7j}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
- "use strict";exports.id=7463,exports.ids=[7463],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>m});var d=c(8336),e=c(78606),f=c(27386),g=c(33132);function h(a){return a.data?.type??a.type??"unknown"}function i(a){return a.data?.label||a.id}function j(a){return a.data?.edgeType==="mcp"}function k(a){return a.data?.edgeType==="resource"}function l(a){return j(a)||k(a)}function m(a,b={}){let c=[],n=Array.isArray(a?.nodes)?a.nodes:[],o=Array.isArray(a?.edges)?a.edges:[],p=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?i(e):void 0}),q=new Map((b.models??[]).map(a=>[a.id,a])),r=new Map((b.servers??[]).map(a=>[a.name,a])),s=!!b.models,t=!!b.servers,u=n.filter(a=>"start"===h(a)),v=n.filter(a=>"finish"===h(a)),w=n.filter(a=>"process"===h(a)),x=n.filter(a=>"mcp"===h(a));if(0===u.length)p("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(u.length>1)for(let a of u.slice(1))p("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===v.length&&p("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),w)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(s&&!q.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";p("error","process-model-missing",`Process node "${i(a)}" is bound to a model that no longer exists${c}.`,a)}}else p("error","process-missing-model",`Process node "${i(a)}" has no model bound.`,a)}for(let a of x){let b=(a.data?.properties??{}).boundServer;if(b){if(t&&!r.has(b))p("warning","mcp-server-missing",`MCP node "${i(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(t){let c=r.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;p("warning","mcp-server-disconnected",`MCP node "${i(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else p("warning","mcp-missing-server",`MCP node "${i(a)}" is not bound to a server.`,a);o.some(b=>j(b)&&(b.source===a.id||b.target===a.id))||p("warning","mcp-node-unconnected",`MCP node "${i(a)}" is not connected to any Process node.`,a)}for(let a of n.filter(a=>"resource"===h(a))){let b=a.data?.properties??{},c="run"===b.scope?"run":"mcp",d="string"==typeof b.boundServer?b.boundServer:"",e="string"==typeof b.uri?b.uri:"",g="string"==typeof b.runName?b.runName.trim():"";"mcp"!==c||d&&e||p("warning","resource-missing-binding",`Resource node "${i(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||g||p("warning","resource-missing-binding",`Resource node "${i(a)}" is a run artifact with no name; give it a name so steps can produce/consume it.`,a),"run"===c&&g&&!(0,f.qW)(g)&&p("warning","resource-run-name",`Resource node "${i(a)}" is named "${g}", which is not a valid artifact name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${res:...}.`,a),"mcp"===c&&d&&t&&!r.has(d)&&p("warning","resource-server-missing",`Resource node "${i(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=o.filter(b=>k(b)&&(b.source===a.id||b.target===a.id));0===h.length&&p("warning","resource-node-unconnected",`Resource node "${i(a)}" is not connected to any Process node.`,a);let j=h.filter(b=>b.target===a.id);"mcp"===c&&j.length>0&&p("error","resource-produce-static",`Resource node "${i(a)}" is a static MCP resource, but a step writes INTO it. Only run artifacts (scope "run") can be produced by a step — flip the edge or make this a run artifact.`,a),"run"===c&&j.length>1&&p("warning","resource-multiple-producers",`Resource node "${i(a)}" is produced by ${j.length} steps; the last writer wins. Consider one producer per artifact.`,a),"run"===c&&0===j.length&&h.length>0&&p("warning","resource-consumed-never-produced",`Resource node "${i(a)}" is consumed but no step in this flow produces it; it resolves to nothing unless an earlier run captured it.`,a)}for(let a of n.filter(a=>"signal"===h(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||p("warning","signal-missing-topic",`Signal node "${i(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(u.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)!l(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(o);for(let b of u)a.get(b.id)?.length||p("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}(u.map(a=>a.id),a);for(let a of[...w,...v])b.has(a.id)||p("warning","unreachable-node",`${"finish"===h(a)?"Finish":"Process"} node "${i(a)}" is not reachable from the Start node.`,a)}for(let a of n.filter(a=>"subflow"===h(a))){let b=o.filter(b=>!l(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&p("error","subflow-multiple-outgoing",`Subflow node "${i(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a);let c=a.data?.properties??{},d="string"==typeof c.subflowId&&c.subflowId?c.subflowId:void 0,e=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&e.length>0&&p("error","subflow-both-targets",`Subflow node "${i(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let g=!0===c.mapOverList;g&&e.length>0&&p("error","subflow-map-and-parallel",`Subflow node "${i(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),g&&!d&&0===e.length&&p("error","subflow-map-no-child",`Subflow node "${i(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let h=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];h.length>0&&!d&&p("error","subflow-spawn-no-child",`Subflow node "${i(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),h.length>0&&e.length>0&&p("error","subflow-spawn-and-parallel",`Subflow node "${i(a)}" combines "spawnBriefs" with "parallelSubflowIds"; spawn briefs run one sub-agent per brief and cannot be combined with a multi-flow fan-out list.`,a),h.length>0&&g&&p("error","subflow-spawn-and-map",`Subflow node "${i(a)}" combines "spawnBriefs" with "mapOverList"; use one lane source or the other.`,a);let j="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(j&&((0,f.qW)(j)||p("warning","subflow-parallel-var-name",`Subflow node "${i(a)}" reads dynamic fan-out targets from "${j}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to capture with \${var:...}.`,a),g&&p("error","subflow-map-and-parallel-var",`Subflow node "${i(a)}" combines "mapOverList" with dynamic fan-out ("parallelSubflowIdsVar"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),n.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===j})||p("warning","subflow-parallel-var-uncaptured",`Subflow node "${i(a)}" reads dynamic fan-out targets from variable "${j}", but no node captures it (captureVariable). It may be seeded by the caller; otherwise it resolves to no targets and the node falls back to its static parallel list.`,a)),!0===c.allowCallerFanout&&g&&p("error","subflow-map-and-caller-fanout",`Subflow node "${i(a)}" combines "mapOverList" with agentic fan-out ("allowCallerFanout"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),e.length>0||h.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&p("warning","subflow-concurrency-limit",`Subflow node "${i(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(n.map(a=>[a.id,a])),b=new Set;for(let c of o){if(l(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let f=a.get(c.source),g=f?h(f):"unknown";if("process"!==g){p("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${f?i(f):c.source}" has a routing condition, but only process nodes can route on a condition.`,f??void 0);continue}b.add(c.source),(0,e.C)(d.kind)?"always"===d.kind||("string"!=typeof d.value||0===d.value.length?p("warning","edge-condition-value",`Process node "${i(f)}" has an outgoing edge condition with no "value"; it will never match.`,f):"regex"!==d.kind||(0,e.wM)(d.value)||p("warning","edge-condition-regex",`Process node "${i(f)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,f)):p("warning","edge-condition-kind",`Process node "${i(f)}" has an outgoing edge whose condition kind "${String(d.kind)}" is unknown; it will never match.`,f)}for(let c of b){let b=a.get(c);b&&(o.some(a=>!l(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||p("warning","edge-condition-no-fallback",`Process node "${i(b)}" has conditioned outgoing edges but no bare fallback edge; if no condition matches, the flow ends here.`,b))}}{let a=new Set;for(let b of n){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,f.qW)(d)||p("warning","capture-var-name",`${"subflow"===h(b)?"Subflow":"Process"} node "${i(b)}" captures into "${d}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${var:...}.`,b)}}let b=["promptTemplate","isolatedPrompt"],c=new Set;for(let d of n){let e=d.data?.properties??{};for(let g of b){let b=e[g];if("string"==typeof b&&b)for(let e of(0,f.T9)(b)){if(a.has(e))continue;let b=`${d.id}:${e}`;c.has(b)||(c.add(b),p("warning","var-ref-uncaptured",`${i(d)} references \${var:${e}} but no step in this flow captures "${e}" (via captureVariable). It resolves to empty unless supplied as a run input — check for a typo or a step ordered after this one.`,d))}}}}{for(let a of n){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,g.g2)(b.trim());(0,g.ng)(c)||p("warning","capture-kv-name",`${"subflow"===h(a)?"Subflow":"Process"} node "${i(a)}" captures into kv "${b.trim()}", whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${kv:...}.`,a)}}let a=["promptTemplate","isolatedPrompt"],b=new Set;for(let c of n){let d=c.data?.properties??{};for(let e of a){let a=d[e];if("string"==typeof a&&a)for(let d of(0,g.pf)(a)){let{key:a}=(0,g.g2)(d);if((0,g.ng)(a))continue;let e=`${c.id}:${d}`;b.has(e)||(b.add(e),p("warning","kv-ref-name",`${i(c)} references \${kv:${d}}, whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it resolves to empty.`,c))}}}}for(let a of w){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let e=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!j(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==h(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}(a.id,n,o),f=new Set;for(let g of(0,d.A$)(c)){if("handoff"===g.server)continue;let c=`${g.kind}:${g.server}:${g.name}`;!f.has(c)&&(f.add(c),e.has(g.server)?"tool"===g.kind&&b.serverTools&&b.serverTools[g.server]&&!b.serverTools[g.server].includes(g.name)&&p("warning","tool-unavailable",`Process node "${i(a)}" references tool "${g.name}" which server "${g.server}" no longer provides.`,a):p("error","tool-pill-disconnected",`Process node "${i(a)}" references ${g.kind} "${g.name}" from server "${g.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let y=c.filter(a=>"error"===a.severity).length,z=c.length-y;return{issues:c,errorCount:y,warningCount:z,isRunnable:0===y}}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>C});var d=c(18230),e=c(44561),f=c(79111),g=c(44479);let h=(0,d.h)("backend/execution/flow/persistConversationState");async function i(a,b){let c="conversations/",d=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,f.ln)(d),null!=b.conversationId&&(0,f.ln)(b.conversationId),b.ephemeral)?(h.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,g.isConversationDeleted)(b.conversationId)?(h.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})}var j=c(34115),k=c(96249),l=c(37860),m=c(26485),n=c(80808),o=c(59448),p=c(11659),q=c(86028),r=c(12763),s=c(82464),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c;try{b=await r.modelService.loadModels()}catch(a){u.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await s.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){u.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,t.nC)(a,{models:b,servers:c})}async function w(a){let b=await p.flowService.getFlow(a);return b?v(b):(u.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var x=c(85701),y=c(35796);let z=(0,d.h)("backend/execution/flow/runFlow");p.flowService.getFlowByName||(p.flowService.getFlowByName=async a=>(await p.flowService.loadFlows()).find(b=>b.name===a)||null,z.info("Added getFlowByName method directly to flowService instance."));let A=p.flowService;async function B(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await p.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,l.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){z.warn("Failed to publish runFlow flow-run event:",a)}}async function C(a){let b,c,d,h=Date.now(),l=a.flujo??!0,r=a.requireApproval??!1,s=a.debug??!1,t=a.continueDebug??!1,u=a.userTurn??!1,C="ephemeral"===a.mode,D=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),E={model:a.modelName,messages:D,processNodeId:a.processNodeId};z.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:D.length,mode:C?"ephemeral":"conversation",flujo:l,requireApproval:r,flujodebug:s,conversationId:a.conversationId});let F=a.conversationId||crypto.randomUUID(),G=`conversations/${F}`,H="new",I=!1;if(z.info(`Effective Conversation ID for this run: ${F}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(F))c=e.FlowExecutor.conversationStates.get(F),z.info(`Resuming conversation ${F} from memory`,{currentNodeId:c.currentNodeId}),H="memory";else if(!C)try{(c=await (0,f.YM)(G,void 0))?(z.info(`Loaded conversation state from storage: ${F}`),H="storage",await (0,j.jM)(c),e.FlowExecutor.conversationStates.set(F,c)):z.info(`No state found in storage for conversation: ${F}. Will create new state.`)}catch(a){z.warn(`Error loading conversation state from storage for ${F}:`,a)}if(c?((b=c).conversationId!==F&&(z.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${F}). Using effectiveConvId.`),b.conversationId=F),"new"!==H&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(z.info(`Resuming completed/errored/fresh conversation ${F}. Resetting status to 'running'.`),I="error"===b.status,b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===H&&e.FlowExecutor.conversationStates.set(F,b)),E.processNodeId&&"new"!==H&&(z.info(`Edit detected: Resetting currentNodeId for conversation ${F} to provided processNodeId: ${E.processNodeId}`),b.currentNodeId=E.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},q.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(F,b),z.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(z.info(`Creating new conversation state object for ID: ${F}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:F,currentNodeId:void 0,status:"running",title:a.title?.trim()||"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:s,executionTrace:s&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=r,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),C&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId),b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>x.A)return z.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:m.O,sharedState:b};let J=[...b.messages??[]];if("new"===H){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&E.model){let a=E.model.substring(5),d=await A.getFlowByName(a);if(!d)return z.error(`Flow not found: ${a}`),{status:"error",conversationId:F,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:m.O,sharedState:b};c=d.id}if(!c)return z.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:m.O,sharedState:b};b.flowId=c;let d=(E.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} during init to: ${b.title}`))}await i(G,b),z.debug(`Saved initial state for new conversation ${F}.`)}catch(a){z.error(`Failed to save initial state for new conversation ${F}:`,a)}e.FlowExecutor.conversationStates.set(F,b)}else E.messages&&E.messages.length>0&&(b.messages=E.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),z.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(u||void 0===b.debugMode)&&(b.debugMode=s),u&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,j.UG)(b,J)}catch(a){z.warn(`Conversation-log reconcile failed for ${F}; continuing`,a)}if(u&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(z.info(`New user turn for ${F}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(F,b))}if(I&&u&&!C&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;if(a?.role!=="user"){let a;for(let c=b.messages.length-1;c>=0;c--)if("user"===b.messages[c].role){a=b.messages[c].processNodeId;break}if(!a&&b.flowId)try{let c=await p.flowService.getFlow(b.flowId);a=c?.nodes?.find(a=>"start"===a.type)?.id}catch(a){z.warn(`Could not resolve start node for error-resume of ${F}`,a)}a&&a!==b.currentNodeId&&(z.info(`Error-resume for ${F}: replaying turn from entry node ${a} (was ${b.currentNodeId}).`),b.currentNodeId=a,e.FlowExecutor.conversationStates.set(F,b))}}u&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),z.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${F}.`));let K=!1,L=0,M=a.emit??k.$.emitterFor(F),N=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),O=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.usage.cacheReadTokens??0;d&&(c.cacheReadTokens=(c.cacheReadTokens??0)+d);let e=a.processNodeId||"unknown",f=c.byNode[e]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};f.promptTokens+=a.usage.promptTokens,f.completionTokens+=a.usage.completionTokens,f.totalTokens+=a.usage.totalTokens,d&&(f.cacheReadTokens=(f.cacheReadTokens??0)+d),c.byNode[e]=f,b.usage=c,M({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0,...d?{cacheReadTokens:d}:{}})},P=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),N.has(a.id)||(N.add(a.id),"system"!==a.role&&(M({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),O(a)))};if(M({type:"run:start",flowId:b.flowId}),(u||"new"===H)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
2
- `+c.map(a=>`• ${a.message}`).join("\n");z.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${F}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=m.O,K=!0}}catch(a){z.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let Q=()=>!!b.isCancelled||!!(0,g.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),R=!!b.debugMode&&!t,S=()=>{b.status="paused_debug",M({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!K)for(;;){if(L++,z.debug(`--- Starting Execution Step ${L} for Conv ${F} ---`),L>150){z.warn(`Max internal iterations (150) reached for conv ${F}. Breaking loop.`),d!==m.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=m.O);break}if(Q()){z.info(`Cancellation flag detected for conv ${F}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,z.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${F}.`);let c=await n.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!c.success){z.error(`Debug tool processing failed for conv ${F}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(F,b),P();try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state after debug tool execution for conv ${F}:`,a)}if(R){z.info(`[Debug Step] Paused after tool execution for conv ${F}.`),S();break}continue}if(!R&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b);if(a&&b.breakpoints.includes(a)&&b.lastBreakNodeId!==a){z.info(`Breakpoint hit at node ${a} for conv ${F}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,M({type:"breakpoint:hit",node:{nodeId:a}}),M({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state on breakpoint for conv ${F}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);z.verbose(`Message history before step ${L}`,a)}else z.verbose(`No messages in history before step ${L}`);let a=await e.FlowExecutor.executeStep(b,M);if(b=a.sharedState,d=a.action,P(),b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} after step ${L} to: ${b.title}`))}if(z.info(`Step ${L} completed for conv ${F}. Action: ${d}`,{currentNodeId:b.currentNodeId}),z.verbose(`Shared state after step ${L}`,b),z.debug(`[Action Handling] Step ${L}: Received action "${d}" for conv ${F}`),d===m.O){z.info(`[Action Handling] Step ${L}: Handling ERROR_ACTION for conv ${F}`),z.error(`Error action received during step ${L} for conv ${F}`,{error:b.lastResponse});break}if(d===m.g4){z.info(`[Action Handling] Step ${L}: Handling FINAL_RESPONSE_ACTION for conv ${F}`),z.info(`Final response action received at step ${L} for conv ${F}`),b.status="completed",z.info(`Setting conversation status to 'completed' for conv ${F}`);break}if(d===m.Jp){z.info(`[Action Handling] Step ${L}: Handling TOOL_CALL_ACTION for conv ${F}`),z.info(`Tool call action received at step ${L} for conv ${F}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(l){if(r&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";z.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${F})`),b.status="error",b.pendingToolCalls=a.tool_calls,b.lastResponse={success:!1,error:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,errorDetails:{message:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,type:"approval_required",name:e}},d=m.O;break}if(r){z.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${F}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(F,b);try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} before pausing to: ${b.title}`))}await i(G,b),z.verbose(`Saved state before pausing for approval for conv ${F}`)}catch(a){z.error(`Failed to save state before pausing for approval for conv ${F}:`,a)}M({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if(R){z.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${F}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(F,b);try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state before debug tool pause for conv ${F}:`,a)}S();break}{z.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${F}`);let c=await n.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!c.success){z.error(`Internal tool processing failed for conv ${F}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}z.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${F}`);let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(F,b),P(),z.info(`Continuing loop for conv ${F} after internal tool processing (no approval needed).`);continue}}else{z.info(`[flujo=false] Tool call action received for conv ${F}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,o.$9)(a.function.name,b.toolNameMap)?(z.verbose("tool is internal:",a.function.name),f.push(a)):(z.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){z.info(`[flujo=false] Processing ${f.length} internal tools for conv ${F}. External tools (${g.length}) will be ignored this step.`);let a=await n.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!a.success){z.error(`[flujo=false] Internal tool processing failed for conv ${F}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=m.O;break}z.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${F}`);let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),e.FlowExecutor.conversationStates.set(F,b),z.info(`Continuing loop for conv ${F} after internal tool processing (flujo=false).`);continue}if(g.length>0){z.info(`[flujo=false] Found ${g.length} external tools for conv ${F}. Wrapping in XML and returning.`);let a=[];for(let b of g)if("function"===b.type)try{let c=JSON.parse(b.function.arguments||"{}"),d="";for(let a in c){let b=String(c[a]).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;");d+=`
1
+ "use strict";exports.id=7463,exports.ids=[7463],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>p});var d=c(8336),e=c(17587),f=c(78606),g=c(27386),h=c(33132);function i(a){return a.data?.type??a.type??"unknown"}function j(a){return a.data?.label||a.id}function k(a){return a.data?.edgeType==="mcp"}function l(a){return a.data?.edgeType==="resource"}function m(a){return k(a)||l(a)}function n(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!k(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==i(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}function o(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=[],g=new Set;for(let b of c){if(m(b))continue;let c=null;b.source===a?c=b.target:b.target===a&&b.data?.bidirectional&&(c=b.source),!c||g.has(c)||(g.add(c),f.push(c))}let h=f.map(a=>d.get(a)).filter(a=>!!a).map(a=>({id:a.id,label:a.data?.label,type:i(a)}));return new Set((0,e.E9)(h).values())}function p(a,b={}){let c=[],e=Array.isArray(a?.nodes)?a.nodes:[],q=Array.isArray(a?.edges)?a.edges:[],r=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?j(e):void 0}),s=new Map((b.models??[]).map(a=>[a.id,a])),t=new Map((b.servers??[]).map(a=>[a.name,a])),u=!!b.models,v=!!b.servers,w=e.filter(a=>"start"===i(a)),x=e.filter(a=>"finish"===i(a)),y=e.filter(a=>"process"===i(a)),z=e.filter(a=>"mcp"===i(a));if(0===w.length)r("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(w.length>1)for(let a of w.slice(1))r("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===x.length&&r("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),y)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(u&&!s.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";r("error","process-model-missing",`Process node "${j(a)}" is bound to a model that no longer exists${c}.`,a)}}else r("error","process-missing-model",`Process node "${j(a)}" has no model bound.`,a)}for(let a of z){let b=(a.data?.properties??{}).boundServer;if(b){if(v&&!t.has(b))r("warning","mcp-server-missing",`MCP node "${j(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(v){let c=t.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;r("warning","mcp-server-disconnected",`MCP node "${j(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else r("warning","mcp-missing-server",`MCP node "${j(a)}" is not bound to a server.`,a);q.some(b=>k(b)&&(b.source===a.id||b.target===a.id))||r("warning","mcp-node-unconnected",`MCP node "${j(a)}" is not connected to any Process node.`,a)}for(let a of e.filter(a=>"resource"===i(a))){let b=a.data?.properties??{},c="run"===b.scope?"run":"mcp",d="string"==typeof b.boundServer?b.boundServer:"",e="string"==typeof b.uri?b.uri:"",f="string"==typeof b.runName?b.runName.trim():"";"mcp"!==c||d&&e||r("warning","resource-missing-binding",`Resource node "${j(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||f||r("warning","resource-missing-binding",`Resource node "${j(a)}" is a run artifact with no name; give it a name so steps can produce/consume it.`,a),"run"===c&&f&&!(0,g.qW)(f)&&r("warning","resource-run-name",`Resource node "${j(a)}" is named "${f}", which is not a valid artifact name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${res:...}.`,a),"mcp"===c&&d&&v&&!t.has(d)&&r("warning","resource-server-missing",`Resource node "${j(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=q.filter(b=>l(b)&&(b.source===a.id||b.target===a.id));0===h.length&&r("warning","resource-node-unconnected",`Resource node "${j(a)}" is not connected to any Process node.`,a);let i=h.filter(b=>b.target===a.id);"mcp"===c&&i.length>0&&r("error","resource-produce-static",`Resource node "${j(a)}" is a static MCP resource, but a step writes INTO it. Only run artifacts (scope "run") can be produced by a step — flip the edge or make this a run artifact.`,a),"run"===c&&i.length>1&&r("warning","resource-multiple-producers",`Resource node "${j(a)}" is produced by ${i.length} steps; the last writer wins. Consider one producer per artifact.`,a),"run"===c&&0===i.length&&h.length>0&&r("warning","resource-consumed-never-produced",`Resource node "${j(a)}" is consumed but no step in this flow produces it; it resolves to nothing unless an earlier run captured it.`,a)}for(let a of e.filter(a=>"signal"===i(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||r("warning","signal-missing-topic",`Signal node "${j(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(w.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)!m(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(q);for(let b of w)a.get(b.id)?.length||r("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}(w.map(a=>a.id),a);for(let a of[...y,...x])b.has(a.id)||r("warning","unreachable-node",`${"finish"===i(a)?"Finish":"Process"} node "${j(a)}" is not reachable from the Start node.`,a)}for(let a of e.filter(a=>"subflow"===i(a))){let b=q.filter(b=>!m(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&r("error","subflow-multiple-outgoing",`Subflow node "${j(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a);let c=a.data?.properties??{},d="string"==typeof c.subflowId&&c.subflowId?c.subflowId:void 0,f=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&f.length>0&&r("error","subflow-both-targets",`Subflow node "${j(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let h=!0===c.mapOverList;h&&f.length>0&&r("error","subflow-map-and-parallel",`Subflow node "${j(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),h&&!d&&0===f.length&&r("error","subflow-map-no-child",`Subflow node "${j(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let i=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];i.length>0&&!d&&r("error","subflow-spawn-no-child",`Subflow node "${j(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),i.length>0&&f.length>0&&r("error","subflow-spawn-and-parallel",`Subflow node "${j(a)}" combines "spawnBriefs" with "parallelSubflowIds"; spawn briefs run one sub-agent per brief and cannot be combined with a multi-flow fan-out list.`,a),i.length>0&&h&&r("error","subflow-spawn-and-map",`Subflow node "${j(a)}" combines "spawnBriefs" with "mapOverList"; use one lane source or the other.`,a);let k="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(k&&((0,g.qW)(k)||r("warning","subflow-parallel-var-name",`Subflow node "${j(a)}" reads dynamic fan-out targets from "${k}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to capture with \${var:...}.`,a),h&&r("error","subflow-map-and-parallel-var",`Subflow node "${j(a)}" combines "mapOverList" with dynamic fan-out ("parallelSubflowIdsVar"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),e.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===k})||r("warning","subflow-parallel-var-uncaptured",`Subflow node "${j(a)}" reads dynamic fan-out targets from variable "${k}", but no node captures it (captureVariable). It may be seeded by the caller; otherwise it resolves to no targets and the node falls back to its static parallel list.`,a)),!0===c.allowCallerFanout&&h&&r("error","subflow-map-and-caller-fanout",`Subflow node "${j(a)}" combines "mapOverList" with agentic fan-out ("allowCallerFanout"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),f.length>0||i.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&r("warning","subflow-concurrency-limit",`Subflow node "${j(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(e.map(a=>[a.id,a])),b=new Set;for(let c of q){if(m(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let e=a.get(c.source),g=e?i(e):"unknown";if("process"!==g){r("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${e?j(e):c.source}" has a routing condition, but only process nodes can route on a condition.`,e??void 0);continue}b.add(c.source),(0,f.C)(d.kind)?"always"===d.kind||("string"!=typeof d.value||0===d.value.length?r("warning","edge-condition-value",`Process node "${j(e)}" has an outgoing edge condition with no "value"; it will never match.`,e):"regex"!==d.kind||(0,f.wM)(d.value)||r("warning","edge-condition-regex",`Process node "${j(e)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,e)):r("warning","edge-condition-kind",`Process node "${j(e)}" has an outgoing edge whose condition kind "${String(d.kind)}" is unknown; it will never match.`,e)}for(let c of b){let b=a.get(c);b&&(q.some(a=>!m(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||r("warning","edge-condition-no-fallback",`Process node "${j(b)}" has conditioned outgoing edges but no bare fallback edge; if no condition matches, the flow ends here.`,b))}}{let a=new Set;for(let b of e){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,g.qW)(d)||r("warning","capture-var-name",`${"subflow"===i(b)?"Subflow":"Process"} node "${j(b)}" captures into "${d}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${var:...}.`,b)}}let b=["promptTemplate","isolatedPrompt"],c=new Set;for(let d of e){let e=d.data?.properties??{};for(let f of b){let b=e[f];if("string"==typeof b&&b)for(let e of(0,g.T9)(b)){if(a.has(e))continue;let b=`${d.id}:${e}`;c.has(b)||(c.add(b),r("warning","var-ref-uncaptured",`${j(d)} references \${var:${e}} but no step in this flow captures "${e}" (via captureVariable). It resolves to empty unless supplied as a run input — check for a typo or a step ordered after this one.`,d))}}}}{for(let a of e){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,h.g2)(b.trim());(0,h.ng)(c)||r("warning","capture-kv-name",`${"subflow"===i(a)?"Subflow":"Process"} node "${j(a)}" captures into kv "${b.trim()}", whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${kv:...}.`,a)}}let a=["promptTemplate","isolatedPrompt"],b=new Set;for(let c of e){let d=c.data?.properties??{};for(let e of a){let a=d[e];if("string"==typeof a&&a)for(let d of(0,h.pf)(a)){let{key:a}=(0,h.g2)(d);if((0,h.ng)(a))continue;let e=`${c.id}:${d}`;b.has(e)||(b.add(e),r("warning","kv-ref-name",`${j(c)} references \${kv:${d}}, whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it resolves to empty.`,c))}}}}for(let a of y){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let f=n(a.id,e,q),g=null,h=new Set,i=new Set;for(let k of(0,d.A$)(c)){if("handoff"===k.server){let b=`handoff:${k.name}`;if(i.has(b))continue;i.add(b),h.add(k.name),g||(g=o(a.id,e,q)),g.has(k.name)||r("warning","handoff-pill-obsolete",`Process node "${j(a)}" references handoff tool "${k.name}", which no longer exists (the target node was removed, or renamed so the tool name changed). Update or remove the pill.`,a);continue}let c=`${k.kind}:${k.server}:${k.name}`;!i.has(c)&&(i.add(c),f.has(k.server)?"tool"===k.kind&&b.serverTools&&b.serverTools[k.server]&&!b.serverTools[k.server].includes(k.name)&&r("warning","tool-unavailable",`Process node "${j(a)}" references tool "${k.name}" which server "${k.server}" no longer provides.`,a):r("error","tool-pill-disconnected",`Process node "${j(a)}" references ${k.kind} "${k.name}" from server "${k.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}if(h.size>0)for(let b of g??o(a.id,e,q))h.has(b)||r("warning","handoff-target-unreferenced",`Process node "${j(a)}" can hand off to "${b}" but its prompt never references \${tool:handoff__${b}}, so the model may never route there.`,a)}if(b.serverTools)for(let a of y)for(let c of n(a.id,e,q)){let d=b.serverTools[c];Array.isArray(d)&&0===d.length&&r("warning","mcp-server-no-tools",`Process node "${j(a)}" is connected to MCP server "${c}", which currently exposes 0 tools. The connection has no effect until the server provides tools.`,a)}let A=c.filter(a=>"error"===a.severity).length,B=c.length-A;return{issues:c,errorCount:A,warningCount:B,isRunnable:0===A}}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>E});var d=c(18230),e=c(1604),f=c(79111),g=c(44479);let h=(0,d.h)("backend/execution/flow/persistConversationState");async function i(a,b){let c="conversations/",d=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,f.ln)(d),null!=b.conversationId&&(0,f.ln)(b.conversationId),b.ephemeral)?(h.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,g.isConversationDeleted)(b.conversationId)?(h.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})}var j=c(34115),k=c(96249),l=c(37860),m=c(26485),n=c(75684),o=c(59448),p=c(11659),q=c(86028),r=c(12763),s=c(18952),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c;try{b=await r.modelService.loadModels()}catch(a){u.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await s.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){u.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,t.nC)(a,{models:b,servers:c})}async function w(a){let b=await p.flowService.getFlow(a);return b?v(b):(u.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var x=c(85701),y=c(35796);let z=(0,d.h)("backend/execution/flow/runFlow");p.flowService.getFlowByName||(p.flowService.getFlowByName=async a=>(await p.flowService.loadFlows()).find(b=>b.name===a)||null,z.info("Added getFlowByName method directly to flowService instance."));let A=p.flowService;async function B(a){let b;if("boolean"==typeof a.unattended)return a.unattended;try{let c=a.flowSnapshot??(a.flowId?await p.flowService.getFlow(a.flowId)??void 0:void 0);b=c?.unattended}catch(a){z.debug("resolveUnattended: flow load failed; using source default",{err:a})}let c="boolean"==typeof b?b:"schedule"===a.source;return a.unattended=c,c}async function C(a,b,c){let d;if(!await B(a))return"complete";let e=a.currentNodeId;if(!e)return"complete";try{d=a.flowSnapshot??(a.flowId?await p.flowService.getFlow(a.flowId)??void 0:void 0)}catch(a){return z.debug("[Unattended] flow load failed; completing normally",{err:a}),"complete"}if(!d)return"complete";let f=d.nodes?.find(a=>a.id===e);if(!f||"process"!==f.type)return"complete";let g=new Set((d.nodes??[]).filter(a=>"mcp"===a.type).map(a=>a.id)),h=Array.from(new Set((d.edges??[]).filter(a=>a.source===e&&"mcpEdge"!==a.type&&a.data?.edgeType!=="mcp"&&a.data?.bidirectional!==!0&&!g.has(a.target)).map(a=>a.target))).filter(a=>(d.nodes??[]).some(b=>b.id===a));if(1===h.length){let d=h[0];z.info(`[Unattended] Process node ${e} ended on plain text; auto-advancing to sole forward successor ${d} for conv ${a.conversationId}.`);let f=a.currentNodeId;return a.currentNodeId=d,a.handoffRequested=void 0,c.delete(e),b({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:d,edgeId:`unattended-auto:${e}->${d}`}),"advanced"}if(h.length>1){let b=c.get(e)??0;if(b<1)return c.set(e,b+1),z.info(`[Unattended] Process node ${e} ended on plain text with ${h.length} forward successors; nudging to hand off (attempt ${b+1}/1).`),a.messages.push({id:crypto.randomUUID(),role:"user",content:"You ended your turn without calling a tool or handing off, but this is an unattended run that cannot stop at this step. To continue you MUST call one of your handoff tools to route to the next step. If your work at this step is complete, hand off to the finishing/next step now.",timestamp:Date.now(),processNodeId:e}),"nudged";z.warn(`[Unattended] Process node ${e} still did not hand off after 1 nudge(s); completing the run to avoid a loop.`)}return"complete"}async function D(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await p.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,l.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){z.warn("Failed to publish runFlow flow-run event:",a)}}async function E(a){let b,c,d,h=Date.now(),l=a.flujo??!0,r=a.requireApproval??!1,s=a.debug??!1,t=a.continueDebug??!1,u=a.userTurn??!1,B="ephemeral"===a.mode,E=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),F={model:a.modelName,messages:E,processNodeId:a.processNodeId};z.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:E.length,mode:B?"ephemeral":"conversation",flujo:l,requireApproval:r,flujodebug:s,conversationId:a.conversationId});let G=a.conversationId||crypto.randomUUID(),H=`conversations/${G}`,I="new",J=!1;if(z.info(`Effective Conversation ID for this run: ${G}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(G))c=e.FlowExecutor.conversationStates.get(G),z.info(`Resuming conversation ${G} from memory`,{currentNodeId:c.currentNodeId}),I="memory";else if(!B)try{(c=await (0,f.YM)(H,void 0))?(z.info(`Loaded conversation state from storage: ${G}`),I="storage",await (0,j.jM)(c),e.FlowExecutor.conversationStates.set(G,c)):z.info(`No state found in storage for conversation: ${G}. Will create new state.`)}catch(a){z.warn(`Error loading conversation state from storage for ${G}:`,a)}if(c?((b=c).conversationId!==G&&(z.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${G}). Using effectiveConvId.`),b.conversationId=G),"new"!==I&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(z.info(`Resuming completed/errored/fresh conversation ${G}. Resetting status to 'running'.`),J="error"===b.status,b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===I&&e.FlowExecutor.conversationStates.set(G,b)),F.processNodeId&&"new"!==I&&(z.info(`Edit detected: Resetting currentNodeId for conversation ${G} to provided processNodeId: ${F.processNodeId}`),b.currentNodeId=F.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},q.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(G,b),z.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(z.info(`Creating new conversation state object for ID: ${G}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:G,currentNodeId:void 0,status:"running",title:a.title?.trim()||"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:s,executionTrace:s&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=r,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),B&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId,b.parentConversationId=a.parentRunId,!b.rootConversationId)){let c=e.FlowExecutor.conversationStates.get(a.parentRunId);b.rootConversationId=c?.rootConversationId??c?.conversationId??a.parentRunId}if(b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>x.A)return z.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:G,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:m.O,sharedState:b};let K=[...b.messages??[]];if("new"===I){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&F.model){let a=F.model.substring(5),d=await A.getFlowByName(a);if(!d)return z.error(`Flow not found: ${a}`),{status:"error",conversationId:G,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:m.O,sharedState:b};c=d.id}if(!c)return z.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:G,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:m.O,sharedState:b};b.flowId=c;let d=(F.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${G} during init to: ${b.title}`))}await i(H,b),z.debug(`Saved initial state for new conversation ${G}.`)}catch(a){z.error(`Failed to save initial state for new conversation ${G}:`,a)}e.FlowExecutor.conversationStates.set(G,b)}else F.messages&&F.messages.length>0&&(b.messages=F.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),z.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(u||void 0===b.debugMode)&&(b.debugMode=s),u&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,j.UG)(b,K)}catch(a){z.warn(`Conversation-log reconcile failed for ${G}; continuing`,a)}if(u&&"new"!==I&&!F.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(z.info(`New user turn for ${G}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(G,b))}if(J&&u&&!B&&"new"!==I&&!F.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;if(a?.role!=="user"){let a;for(let c=b.messages.length-1;c>=0;c--)if("user"===b.messages[c].role){a=b.messages[c].processNodeId;break}if(!a&&b.flowId)try{let c=await p.flowService.getFlow(b.flowId);a=c?.nodes?.find(a=>"start"===a.type)?.id}catch(a){z.warn(`Could not resolve start node for error-resume of ${G}`,a)}a&&a!==b.currentNodeId&&(z.info(`Error-resume for ${G}: replaying turn from entry node ${a} (was ${b.currentNodeId}).`),b.currentNodeId=a,e.FlowExecutor.conversationStates.set(G,b))}}u&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),z.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${G}.`));let L=!1,M=0,N=new Map,O=a.emit??k.$.emitterFor(G),P=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),Q=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.usage.cacheReadTokens??0;d&&(c.cacheReadTokens=(c.cacheReadTokens??0)+d);let e=a.processNodeId||"unknown",f=c.byNode[e]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};f.promptTokens+=a.usage.promptTokens,f.completionTokens+=a.usage.completionTokens,f.totalTokens+=a.usage.totalTokens,d&&(f.cacheReadTokens=(f.cacheReadTokens??0)+d),c.byNode[e]=f,b.usage=c,O({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0,...d?{cacheReadTokens:d}:{}})},R=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),P.has(a.id)||(P.add(a.id),"system"!==a.role&&(O({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),Q(a)))};if(O({type:"run:start",flowId:b.flowId}),(u||"new"===I)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
2
+ `+c.map(a=>`• ${a.message}`).join("\n");z.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${G}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=m.O,L=!0}}catch(a){z.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let S=()=>!!b.isCancelled||!!(0,g.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),T=!!b.debugMode&&!t,U=()=>{b.status="paused_debug",O({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!L)for(;;){if(M++,z.debug(`--- Starting Execution Step ${M} for Conv ${G} ---`),M>150){z.warn(`Max internal iterations (150) reached for conv ${G}. Breaking loop.`),d!==m.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=m.O);break}if(S()){z.info(`Cancellation flag detected for conv ${G}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,z.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${G}.`);let c=await n.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:O,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:S});if(!c.success){z.error(`Debug tool processing failed for conv ${G}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(G,b),R();try{b.updatedAt=Date.now(),await i(H,b)}catch(a){z.error(`Failed to save state after debug tool execution for conv ${G}:`,a)}if(T){z.info(`[Debug Step] Paused after tool execution for conv ${G}.`),U();break}continue}if(!T&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b),c=b.breakpoints.includes("*");if(a&&(c||b.breakpoints.includes(a))&&b.lastBreakNodeId!==a){c&&(b.breakpoints=b.breakpoints.filter(a=>"*"!==a)),z.info(`Breakpoint hit at node ${a}${c?" (attach)":""} for conv ${G}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,O({type:"breakpoint:hit",node:{nodeId:a}}),O({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await i(H,b)}catch(a){z.error(`Failed to save state on breakpoint for conv ${G}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);z.verbose(`Message history before step ${M}`,a)}else z.verbose(`No messages in history before step ${M}`);let a=await e.FlowExecutor.executeStep(b,O);if(b=a.sharedState,d=a.action,R(),b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${G} after step ${M} to: ${b.title}`))}if(z.info(`Step ${M} completed for conv ${G}. Action: ${d}`,{currentNodeId:b.currentNodeId}),z.verbose(`Shared state after step ${M}`,b),z.debug(`[Action Handling] Step ${M}: Received action "${d}" for conv ${G}`),d===m.O){z.info(`[Action Handling] Step ${M}: Handling ERROR_ACTION for conv ${G}`),z.error(`Error action received during step ${M} for conv ${G}`,{error:b.lastResponse});break}if(d===m.g4){z.info(`[Action Handling] Step ${M}: Handling FINAL_RESPONSE_ACTION for conv ${G}`),z.info(`Final response action received at step ${M} for conv ${G}`);let a=await C(b,O,N);if("advanced"===a||"nudged"===a){R(),e.FlowExecutor.conversationStates.set(G,b);continue}b.status="completed",z.info(`Setting conversation status to 'completed' for conv ${G}`);break}if(d===m.Jp){z.info(`[Action Handling] Step ${M}: Handling TOOL_CALL_ACTION for conv ${G}`),z.info(`Tool call action received at step ${M} for conv ${G}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(l){if(r&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";z.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${G})`),b.status="error",b.pendingToolCalls=a.tool_calls,b.lastResponse={success:!1,error:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,errorDetails:{message:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,type:"approval_required",name:e}},d=m.O;break}if(r){z.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${G}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(G,b);try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${G} before pausing to: ${b.title}`))}await i(H,b),z.verbose(`Saved state before pausing for approval for conv ${G}`)}catch(a){z.error(`Failed to save state before pausing for approval for conv ${G}:`,a)}O({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if(T){z.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${G}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(G,b);try{b.updatedAt=Date.now(),await i(H,b)}catch(a){z.error(`Failed to save state before debug tool pause for conv ${G}:`,a)}U();break}{z.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${G}`);let c=await n.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:O,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:S});if(!c.success){z.error(`Internal tool processing failed for conv ${G}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}z.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${G}`);let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(G,b),R(),z.info(`Continuing loop for conv ${G} after internal tool processing (no approval needed).`);continue}}else{z.info(`[flujo=false] Tool call action received for conv ${G}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,o.$9)(a.function.name,b.toolNameMap)?(z.verbose("tool is internal:",a.function.name),f.push(a)):(z.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){z.info(`[flujo=false] Processing ${f.length} internal tools for conv ${G}. External tools (${g.length}) will be ignored this step.`);let a=await n.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:O,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:S});if(!a.success){z.error(`[flujo=false] Internal tool processing failed for conv ${G}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=m.O;break}z.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${G}`);let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),e.FlowExecutor.conversationStates.set(G,b),z.info(`Continuing loop for conv ${G} after internal tool processing (flujo=false).`);continue}if(g.length>0){z.info(`[flujo=false] Found ${g.length} external tools for conv ${G}. Wrapping in XML and returning.`);let a=[];for(let b of g)if("function"===b.type)try{let c=JSON.parse(b.function.arguments||"{}"),d="";for(let a in c){let b=String(c[a]).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;");d+=`
3
3
  <${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
4
- </${b.function.name}>`)}catch(c){z.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:F}),a.push(`<${b.function.name}>
4
+ </${b.function.name}>`)}catch(c){z.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:G}),a.push(`<${b.function.name}>
5
5
  <error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
6
- </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=m.g4,z.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${F}.`);break}z.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${F} but no tools found after classification. Treating as final.`),d=m.g4;break}z.warn(`TOOL_CALL_ACTION received for conv ${F} but no tool_calls found in last message. Treating as final.`),d=m.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){z.info(`[Action Handling] Step ${L}: Handling Handoff Action (Edge ID) for conv ${F}`),z.info(`Handoff action received for conv ${F}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c=b.messages.length>0?b.messages[b.messages.length-1]:null;if(c?.role==="assistant"&&c.tool_calls){let e,f,g=c.tool_calls.filter(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_"))),h=a=>b.handoffNameMap?.[a]||a.replace("handoff_to_",""),i=g.filter(b=>"function"===b.type&&h(b.function.name)===a),j=i.length>0?i:g.slice(0,1);0===j.length&&z.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`);let k=[],l="";for(let c of(j.forEach((c,g)=>{if("function"===c.type)try{let a=JSON.parse(c.function.arguments||"{}"),b="string"==typeof a?.task?a.task.trim():"",d="string"==typeof a?.prompt?a.prompt.trim():"",g=b||(j.length>1?d:"");if(g&&k.push(g),!l&&d&&(l=d),!e&&Array.isArray(a?.parallelFlows)){let b=a.parallelFlows.filter(a=>"string"==typeof a&&""!==a.trim());b.length>0&&(e=b)}let h=a?.concurrencyLimit;void 0===f&&"number"==typeof h&&h>=1&&(f=Math.floor(h))}catch(a){z.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller input for this call`,{parseError:a})}b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Handoff processed",targetNodeId:a,...j.length>1?{lane:g+1,laneCount:j.length}:{}}),timestamp:Date.now(),processNodeId:b.currentNodeId})}),g))j.includes(c)||(b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Not executed",reason:"A different handoff was chosen this turn."}),timestamp:Date.now(),processNodeId:b.currentNodeId}),z.warn(`Handoff call ${"function"===c.type?c.function.name:c.id} targeted a different node than the chosen route; answered as not executed.`));if(l||1!==k.length||(l=k[0]),l||k.length>0||e&&e.length>0)b.handoffInput={targetNodeId:a,prompt:l,...k.length>0?{tasks:k}:{},...e&&e.length>0?{parallelFlows:e}:{},...void 0!==f?{concurrencyLimit:f}:{}},z.info(`Captured caller handoff input for node ${a}`,{promptChars:l.length,spawnBriefs:k.length,fanoutCount:e?.length??0});else try{let c=await p.flowService.getFlow(b.flowId),d=c?.nodes?.find(b=>b.id===a),e=d?.data?.properties;d?.type!=="subflow"||e?.inputMode!=="isolated"||e?.allowCallerPrompt!==!0||e?.allowCallerFanout===!0||e?.promptTemplate?.trim()||z.warn(`Handoff to isolated subflow node ${a} has neither a caller-supplied prompt nor an authored promptTemplate; the subflow will start with an empty prompt and may stall. The routing model should have supplied the required "prompt" argument (issue #169).`,{targetNodeId:a})}catch(a){z.debug("Issue #169 empty-prompt handoff guard check failed (non-fatal)",{guardErr:a})}}else z.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);P();let f=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,M({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:a,edgeId:d}),z.info(`Transitioning conv ${F} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(F,b),R){z.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${F}.`),S();break}z.info(`Continuing loop for conv ${F} after handoff.`);continue}z.error(`Handoff failed for conv ${F}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=m.O;break}if(d===m.E5){z.info(`[Action Handling] Step ${L}: Handling STAY_ON_NODE_ACTION for conv ${F}`),z.info(`Stay on node action received for conv ${F} at step ${L}`);break}z.warn(`Unrecognized action '${d}' received at step ${L} for conv ${F}. Treating as final response.`),d=m.g4;break}}catch(a){if(z.error(`Unhandled error during execution loop for conv ${F}`,{loopError:a}),d!==m.O&&Q()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d!==m.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=m.O}}d!==m.O&&Q()&&(z.info(`Cancellation flag set at run end for conv ${F}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d===m.O&&"error"!==b.status&&(b.status="error");let T=Date.now()-h,U=b.status||(d===m.g4?"completed":d===m.O?"error":"running");if(z.info(`Execution finished for conv ${F}. Final Action: ${d}, Final Status: ${U}`,{duration:`${T}ms`}),P(),("completed"===U||"error"===U)&&(M({type:"run:done",status:U}),"schedule"!==b.source&&(b.runDepth??0)===0)){let a=b.messages[b.messages.length-1],c=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:void 0;B(b,U,c)}try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} before final return to: ${b.title}`))}await i(G,b),z.debug(`Saved final state for conversation ${F} before returning.`)}catch(a){z.error(`Failed to save final state for conversation ${F}:`,a)}(0,g.isConversationDeleted)(F)?e.FlowExecutor.conversationStates.delete(F):e.FlowExecutor.conversationStates.set(F,b);let V=()=>{C&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(F)},W={conversationId:b.conversationId||F,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return z.info(`Returning paused debug state for conv ${F}`),{...W,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===m.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},z.error(`Returning error result for conv ${F}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),V(),{...W,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let X=b.messages.length>0?b.messages[b.messages.length-1]:null,Y="",Z="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(Z=b.lastResponse._flujo_xml_tools,Y=X?.role==="assistant"&&"string"==typeof X.content?X.content:"",Y+=(Y?"\n\n":"")+Z,b.lastResponse=Y):Y="string"==typeof b.lastResponse?b.lastResponse:X?.role==="assistant"&&"string"==typeof X.content?X.content:d!==m.Jp||l?"Processing complete.":"";let $=Z?void 0:X?.role==="assistant"?X.tool_calls:void 0;return z.info(`Returning success result for conv ${F}`,{action:d,status:b.status,flujo:l,requireApproval:r,flujodebug:s}),V(),{...W,status:b.status||(d===m.g4?"completed":"running"),outputText:Y,toolCalls:$,pendingToolCalls:b.pendingToolCalls}}}};
6
+ </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=m.g4,z.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${G}.`);break}z.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${G} but no tools found after classification. Treating as final.`),d=m.g4;break}z.warn(`TOOL_CALL_ACTION received for conv ${G} but no tool_calls found in last message. Treating as final.`),d=m.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){z.info(`[Action Handling] Step ${M}: Handling Handoff Action (Edge ID) for conv ${G}`),z.info(`Handoff action received for conv ${G}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){b.handoffInput=void 0;let c=b.messages.length>0?b.messages[b.messages.length-1]:null;if(c?.role==="assistant"&&c.tool_calls){let e,f,g=c.tool_calls.filter(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_"))),h=a=>b.handoffNameMap?.[a]||a.replace("handoff_to_",""),i=g.filter(b=>"function"===b.type&&h(b.function.name)===a),j=i.length>0?i:g.slice(0,1);0===j.length&&z.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`);let k=[],l="";for(let c of(j.forEach((c,g)=>{if("function"===c.type)try{let a=JSON.parse(c.function.arguments||"{}"),b="string"==typeof a?.task?a.task.trim():"",d="string"==typeof a?.prompt?a.prompt.trim():"",g=b||(j.length>1?d:"");if(g&&k.push(g),!l&&d&&(l=d),!e&&Array.isArray(a?.parallelFlows)){let b=a.parallelFlows.filter(a=>"string"==typeof a&&""!==a.trim());b.length>0&&(e=b)}let h=a?.concurrencyLimit;void 0===f&&"number"==typeof h&&h>=1&&(f=Math.floor(h))}catch(a){z.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller input for this call`,{parseError:a})}b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Handoff processed",targetNodeId:a,...j.length>1?{lane:g+1,laneCount:j.length}:{}}),timestamp:Date.now(),processNodeId:b.currentNodeId})}),g))j.includes(c)||(b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Not executed",reason:"A different handoff was chosen this turn."}),timestamp:Date.now(),processNodeId:b.currentNodeId}),z.warn(`Handoff call ${"function"===c.type?c.function.name:c.id} targeted a different node than the chosen route; answered as not executed.`));if(l||1!==k.length||(l=k[0]),l||k.length>0||e&&e.length>0)b.handoffInput={targetNodeId:a,prompt:l,...k.length>0?{tasks:k}:{},...e&&e.length>0?{parallelFlows:e}:{},...void 0!==f?{concurrencyLimit:f}:{}},z.info(`Captured caller handoff input for node ${a}`,{promptChars:l.length,spawnBriefs:k.length,fanoutCount:e?.length??0});else try{let c=await p.flowService.getFlow(b.flowId),d=c?.nodes?.find(b=>b.id===a),e=d?.data?.properties,f=d?.type==="subflow"?e?.promptTemplate:e?.isolatedPrompt;d?.type!=="subflow"&&d?.type!=="process"||e?.inputMode!=="isolated"||e?.allowCallerPrompt===!1||e?.allowCallerFanout===!0||f?.trim()||z.warn(`Handoff to isolated ${d?.type} node ${a} has neither a caller-supplied prompt nor an authored message; the target will start with an empty prompt and may stall. The routing model should have supplied the required "prompt" argument (issue #169).`,{targetNodeId:a})}catch(a){z.debug("Issue #169 empty-prompt handoff guard check failed (non-fatal)",{guardErr:a})}}else z.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);R();let f=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,O({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:a,edgeId:d}),z.info(`Transitioning conv ${G} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(G,b),T){z.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${G}.`),U();break}z.info(`Continuing loop for conv ${G} after handoff.`);continue}z.error(`Handoff failed for conv ${G}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=m.O;break}if(d===m.E5){z.info(`[Action Handling] Step ${M}: Handling STAY_ON_NODE_ACTION for conv ${G}`),z.info(`Stay on node action received for conv ${G} at step ${M}`);break}z.warn(`Unrecognized action '${d}' received at step ${M} for conv ${G}. Treating as final response.`),d=m.g4;break}}catch(a){if(z.error(`Unhandled error during execution loop for conv ${G}`,{loopError:a}),d!==m.O&&S()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d!==m.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=m.O}}d!==m.O&&S()&&(z.info(`Cancellation flag set at run end for conv ${G}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d===m.O&&"error"!==b.status&&(b.status="error");let V=Date.now()-h,W=b.status||(d===m.g4?"completed":d===m.O?"error":"running");if(z.info(`Execution finished for conv ${G}. Final Action: ${d}, Final Status: ${W}`,{duration:`${V}ms`}),R(),("completed"===W||"error"===W)&&(O({type:"run:done",status:W}),"schedule"!==b.source&&(b.runDepth??0)===0)){let a=b.messages[b.messages.length-1],c=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:void 0;D(b,W,c)}try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${G} before final return to: ${b.title}`))}await i(H,b),z.debug(`Saved final state for conversation ${G} before returning.`)}catch(a){z.error(`Failed to save final state for conversation ${G}:`,a)}(0,g.isConversationDeleted)(G)?e.FlowExecutor.conversationStates.delete(G):e.FlowExecutor.conversationStates.set(G,b);let X=()=>{B&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(G)},Y={conversationId:b.conversationId||G,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return z.info(`Returning paused debug state for conv ${G}`),{...Y,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===m.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},z.error(`Returning error result for conv ${G}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),X(),{...Y,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let Z=b.messages.length>0?b.messages[b.messages.length-1]:null,$="",_="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(_=b.lastResponse._flujo_xml_tools,$=Z?.role==="assistant"&&"string"==typeof Z.content?Z.content:"",$+=($?"\n\n":"")+_,b.lastResponse=$):$="string"==typeof b.lastResponse?b.lastResponse:Z?.role==="assistant"&&"string"==typeof Z.content?Z.content:d!==m.Jp||l?"Processing complete.":"";let aa=_?void 0:Z?.role==="assistant"?Z.tool_calls:void 0;return z.info(`Returning success result for conv ${G}`,{action:d,status:b.status,flujo:l,requireApproval:r,flujodebug:s}),X(),{...Y,status:b.status||(d===m.g4?"completed":"running"),outputText:$,toolCalls:aa,pendingToolCalls:b.pendingToolCalls}}}};
@@ -5,6 +5,6 @@ ${b.condition}
5
5
  Tool result (untrusted data):
6
6
  \`\`\`json
7
7
  ${m}
8
- \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(4545)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(4545)]).then(c.bind(c,87182)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(4545),c.e(7821),c.e(724),c.e(3823),c.e(4671),c.e(7214)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
8
+ \`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(5096),c.e(7538),c.e(1925)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(5096),c.e(7538),c.e(1925)]).then(c.bind(c,62101)),{normalizeMaxTokens:f}=await c.e(4042).then(c.bind(c,54042)),g=await d.getModel(a);if(!g)throw Error(`config: The AI-check model no longer exists (${a})`);let i=await d.resolveAndDecryptApiKey(g.ApiKey);if(!i)throw Error("config: Could not resolve the AI-check model API key");let j=e(g),{completion:k}=await j.createCompletion({model:g,apiKey:i,temperature:0,maxTokens:f(g.maxTokens),messages:[{role:"system",content:h},{role:"user",content:b}]}),l=k.choices?.[0]?.message?.content;return"string"==typeof l?l:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(1373),c.e(5096),c.e(7538),c.e(7821),c.e(346),c.e(724),c.e(2940),c.e(4671),c.e(7214),c.e(4306)]).then(c.bind(c,57214)),e=await d({flowId:a,prompt:`${b}
9
9
 
10
10
  ${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
@@ -0,0 +1,21 @@
1
+ exports.id=7538,exports.ids=[4042,7538],exports.modules={7573:(a,b,c)=>{"use strict";c.d(b,{l:()=>j,s:()=>k});var d=c(37067),e=c.n(d),f=c(44708),g=c.n(f),h=c(78975),i=c(81251);function j(a){if("requesty"===a||"openrouter"===a)return{"HTTP-Referer":"https://flujo.com.co","X-Title":"FLUJO"}}function k(a){let{apiKey:b,baseURL:c,maxRetries:d=2,timeout:f=i.l,defaultHeaders:j}=a,k=!c||c.trim().toLowerCase().startsWith("https")?new(g()).Agent({keepAlive:!1}):new(e()).Agent({keepAlive:!1});return new h.Ay({apiKey:b,baseURL:c,httpAgent:k,maxRetries:d,timeout:f,...j?{defaultHeaders:j}:{}})}},7658:(a,b,c)=>{"use strict";c.d(b,{AC:()=>o,Eu:()=>p,K3:()=>i,LV:()=>n,PA:()=>j,XS:()=>q,isBuiltInServerName:()=>l});var d=c(92372),e=c(38844),f=c(50846),g=c(81495);let h=(0,f.h)("backend/services/mcp/internal/registry"),i="filesystem",j="bash",k=[g._,i,j];function l(a){return k.includes(a)}async function m(){try{let a=await (0,d.YM)(e.Z.MCP_INTERNAL_OVERRIDES,{});return a&&"object"==typeof a?a:{}}catch(a){return h.warn("loadInternalOverrides: failed to read overrides",a),{}}}async function n(a,b){let c=await m();c[a]={...c[a]??{},disabled:b},await (0,d.VH)(e.Z.MCP_INTERNAL_OVERRIDES,c),h.info(`setInternalServerDisabled: ${a} -> disabled=${b}`)}async function o(a){let b=await m(),c=b[a]?.roots;return Array.isArray(c)?c.filter(a=>"string"==typeof a&&a.trim().length>0):[]}async function p(a,b){let c=Array.from(new Set((Array.isArray(b)?b:[]).map(a=>"string"==typeof a?a.trim():"").filter(Boolean))),f=await m();f[a]={...f[a]??{},roots:c},await (0,d.VH)(e.Z.MCP_INTERNAL_OVERRIDES,f),h.info(`setInternalServerRoots: ${a} -> ${c.length} root(s)`)}async function q(){let a=await m();return k.map(a=>{var b;return(b=a)===g._?(0,g.z)():{name:b,transport:"stdio",command:"",args:[],env:{},disabled:!1,autoApprove:[],rootPath:"",_buildCommand:"",_installCommand:"",builtIn:!0,exposeAsMcpServer:!0}}).map(b=>{let c=a[b.name];if(!c)return b;let d={...b};return c.disabled&&(d.disabled=!0),Array.isArray(c.roots)&&c.roots.length&&(d.roots=c.roots),d})}},17748:(a,b,c)=>{"use strict";c.d(b,{Ah:()=>s,dX:()=>u,jf:()=>p,lO:()=>t,ox:()=>q,wk:()=>l});var d=c(29021),e=c(33873),f=c(21820),g=c(68780),h=c(50846),i=c(77213),j=c(43326);let k=(0,h.h)("app/api/mcp/utils");function l(a){let b=a.transport?._abortController;return b?.signal.aborted===!0}function m(a){return k.debug("Entering isLikelyFilePath method"),a.includes(".")&&(a.includes("/")||a.includes("\\")||/\.[a-zA-Z0-9]+$/.test(a))}let n=new Set(["UNABLE_TO_VERIFY_LEAF_SIGNATURE","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","UNABLE_TO_GET_ISSUER_CERT","SELF_SIGNED_CERT_IN_CHAIN","DEPTH_ZERO_SELF_SIGNED_CERT","CERT_HAS_EXPIRED","CERT_UNTRUSTED","ERR_TLS_CERT_ALTNAME_INVALID"]),o=/unable to verify|self[- ]signed certificate|certificate has expired|altname|leaf signature|unable to get local issuer/i;function p(a){let{messages:b,codes:c}=function(a){let b=[],c=[],d=a,e=0;for(;d&&e<10;){if(d instanceof Error){d.message&&b.push(d.message);let a=d.code;"string"==typeof a&&c.push(a)}else"string"==typeof d&&b.push(d);let a=d?.cause,f=d?.errors;if(a)d=a;else if(Array.isArray(f)&&f.length>0)d=f[0];else break;e++}return{messages:b,codes:c}}(a),d=Array.from(new Set(b.filter(Boolean))),e=d.join(": ");e||(e=a instanceof Error?a.message||a.name:String(a));let f=Array.from(new Set(c));return f.length>0&&!f.some(a=>e.includes(a))&&(e+=` (${f.join(", ")})`),(f.some(a=>n.has(a))||d.some(a=>o.test(a)))&&(e+=`
2
+
3
+ This looks like a TLS certificate trust problem: the server presents a certificate signed by a custom/private CA that Node.js does not trust by default.
4
+ To fix it, start FLUJO so Node trusts your CA:
5
+ • Trust the OS certificate store (default in FLUJO): NODE_OPTIONS=--use-system-ca, or
6
+ • Point Node at the CA file: set NODE_EXTRA_CA_CERTS=C:\\path\\to\\root-ca.crt (or FLUJO_EXTRA_CA_CERTS)
7
+ then restart FLUJO. (curl works because it uses the OS trust store; Node does not unless told to.)`),e}function q(a,b,c){k.debug("Entering enhanceConnectionErrorMessage method"),k.info(`Received ${c.length} stderr log entries for ${b.name}`),c.length>0&&k.info(`Stderr logs for ${b.name}:
8
+ ${c.join("\n")}`);let h=c.join("\n").trim();if(h)return k.info(`Using stderr output as primary error information for ${b.name}: ${h}`),h;if(k.warn(`No stderr output available for ${b.name}`),!(a instanceof Error))return p(a);let l=a.message;if(k.debug(`Enhancing error message for: ${l}`),l.includes("Connection timeout"))return l;if(a instanceof g.Nh){if(k.debug(`MCP Error code: ${a.code}`),a.code===g.O4.ConnectionClosed)try{let a=`${i.VL}/${b.name}`;if("stdio"===b.transport){let c=b.command;if(k.debug(`Server directory: ${a}`),k.debug(`Executable path: ${c}`),"cmd.exe"===c&&b.args&&b.args.length>1&&"/c"===b.args[0]){let c=b.args[1];k.debug(`Checking .bat file: ${c}`);let f=e.isAbsolute(c)?c:e.join((0,j.getDataDir)(),a,c);k.debug(`Full .bat file path: ${f}`);let g=d.existsSync(f);if(k.debug(`.bat file exists: ${g}`),!g)return`MCP connection closed: ${l}. The .bat file does not exist: ${f}${h?"\n\nStderr output:\n"+h:""}`}else if(m(c)){k.debug(`Checking if executable exists: ${c}`);let b=d.existsSync(c);if(k.debug(`Executable exists: ${b}`),!b){let b=e.join((0,j.getDataDir)(),a,c);k.debug(`Checking in server directory: ${b}`);let f=d.existsSync(b);if(k.debug(`Executable exists in server directory: ${f}`),!f)return`MCP connection closed: ${l}. The executable file does not exist: ${c} or ${b}${h?"\n\nStderr output:\n"+h:""}`}}if(b.args&&b.args.length>0){let c=b.args[0];if(m(c)){k.debug(`Checking script file: ${c}`);let b=((k.debug("Entering isAbsolutePath method"),"win32"===f.platform())?/^[a-zA-Z]:[/\\]/.test(c)||c.startsWith("\\\\"):c.startsWith("/"))?c:e.join((0,j.getDataDir)(),a,c);k.debug(`Full script path: ${b}`);let g=d.existsSync(b);if(k.debug(`Script exists: ${g}`),!g)return`MCP connection closed: ${l}. The script file does not exist: ${b}${h?"\n\nStderr output:\n"+h:""}`}}}else if("websocket"===b.transport)try{new URL(b.websocketUrl)}catch(a){return`MCP connection closed: ${l}. Invalid WebSocket URL: ${b.websocketUrl}${h?"\n\nStderr output:\n"+h:""}`}if(h)return`MCP connection closed: ${l}. Check if the server is running and accessible.
9
+
10
+ Stderr output:
11
+ ${h}`;return`MCP connection closed: ${l}. Check if the server is running and accessible.`}catch(a){return k.warn("Error checking file existence:",a),`MCP connection closed: ${l}. Error checking files: ${a instanceof Error?a.message:"Unknown error"}${h?"\n\nStderr output:\n"+h:""}`}return h?`MCP error ${a.code}: ${l}
12
+
13
+ Stderr output:
14
+ ${h}`:`MCP error ${a.code}: ${l}`}let n=p(a);return h?`${n}
15
+
16
+ Stderr output:
17
+ ${h}`:n}let r=["OAuth authentication required","UnauthorizedError","invalid_token","token_expired","HTTP 401","HTTP 403","Missing Authorization header","Authorization header is required"];function s(a){if(!(a instanceof Error))return!1;if("OAuthAuthenticationRequired"===a.name)return!0;let b=a.code;if(401===b||403===b)return!0;let c=a.errorCode;return"string"==typeof c&&c.length>0||r.some(b=>a.message.includes(b))}function t(a){let b=a instanceof Error?a.message:String(a);return b.includes("SSE stream disconnected")||b.includes("Failed to reconnect SSE stream")||b.includes("Maximum reconnection attempts")||/\bterminated\b/i.test(b)}function u(a){return k.debug("Entering formatErrorResponse method"),{error:`Internal server error: ${a instanceof Error?a.message:"Unknown error"}`}}},20433:(a,b,c)=>{"use strict";c.d(b,{modelService:()=>F});var d=c(78975),e=c(54042),f=c(92372),g=c(38844),h=c(50846),i=c(49680),j=c(40829);let k=(0,h.h)("backend/services/model/provider");function l(a){if(a.includes("openrouter.ai"))return"openrouter";if(a.includes("requesty.ai"))return"requesty";if(a.includes("api.x.ai"))return"xai";if(a.includes("generativelanguage.googleapis.com"))return"gemini";if(a.includes("api.anthropic.com"))return"anthropic";else if(a.includes("api.mistral.ai"))return"mistral";else if(a.includes("api.openai.com"))return"openai";else if(function(a){try{let b=new URL(a);if("4000"===b.port||b.pathname.toLowerCase().includes("/litellm"))return!0}catch{if(a.includes(":4000")||a.toLowerCase().includes("/litellm"))return!0}return!1}(a))return"litellm";else return"ollama"}async function m(){k.debug("fetchOpenRouterModels: Entering method");let a=await fetch("https://openrouter.ai/api/v1/models",{headers:{"Content-Type":"application/json",Accept:"application/json"}});if(!a.ok)throw Error(`OpenRouter API error: ${a.status} ${a.statusText}`);let b=await a.json();return b.data&&Array.isArray(b.data)?b.data.map(a=>({id:a.id,name:a.name||a.id,description:a.description})):[]}async function n(a,b){k.debug("fetchOpenAIModels: Entering method");let c=b;c=c.endsWith("/")?`${c}models`:`${c}/models`,k.debug(`Fetching models from: ${c}`);let d={"Content-Type":"application/json"};a&&(b.includes("anthropic")?(d["x-api-key"]=`${a}`,d["anthropic-version"]="2023-06-01"):d.Authorization=`Bearer ${a}`);try{k.verbose(`fetching models @${c} with ${JSON.stringify(d)}`);let a=await fetch(c,{headers:d});if(!a.ok)throw k.verbose("model list response",a),Error(`API error: ${a.status} ${a.statusText}`);let e=await a.json();if(e.data&&Array.isArray(e.data)){if(k.debug("Successfully parsed response in standard OpenAI format"),b.includes("api.openai.com"))return e.data.filter(a=>a.id.includes("gpt")).map(a=>({id:a.id,name:a.id,description:`OpenAI ${a.id}`}));return e.data.filter(a=>a.id).map(a=>({id:a.id,name:a.name||a.id,description:a.description||`Model ${a.id}`}))}if("list"===e.object&&Array.isArray(e.data))return k.debug("Parsing response in Ollama format"),e.data.map(a=>({id:a.id,name:a.id,description:`${a.owned_by?`${a.owned_by}: `:""}${a.id}`}));return k.warn("Could not parse API response in any known format",{data:e}),[]}catch(a){throw k.error(`Error fetching models from ${c}:`,a),a}}async function o(a,b,c){k.debug(`fetchModelsFromProvider: Fetching models for provider: ${a}`);try{if("openrouter"===a)return await m();return await n(c,b)}catch(b){return k.error(`fetchModelsFromProvider: Error fetching models for provider ${a}:`,b),[]}}let p=(0,h.h)("backend/services/model/cache");class q{getCacheKey(a){return a.toLowerCase().replace(/\/$/,"")}isValid(a){return Date.now()-a.timestamp<a.ttl}get(a){let b=this.getCacheKey(a),c=this.cache.get(b);return c?this.isValid(c)?(p.debug("Cache hit",{baseUrl:a,key:b,modelCount:c.models.length}),c.models):(p.debug("Cache miss - entry expired",{baseUrl:a,key:b,age:Date.now()-c.timestamp}),this.cache.delete(b),null):(p.debug("Cache miss - no entry found",{baseUrl:a,key:b}),null)}set(a,b,c){let d=this.getCacheKey(a),e={models:b,timestamp:Date.now(),ttl:c||this.DEFAULT_TTL};this.cache.set(d,e),p.debug("Models cached",{baseUrl:a,key:d,modelCount:b.length,ttl:e.ttl})}clear(a){let b=this.getCacheKey(a),c=this.cache.delete(b);p.debug("Cache cleared",{baseUrl:a,key:b,deleted:c})}clearAll(){let a=this.cache.size;this.cache.clear(),p.debug("All cache cleared",{entriesCleared:a})}getStats(){let a=this.cache.size,b=0,c=0;for(let a of this.cache.values())this.isValid(a)?b++:c++;return{totalEntries:a,validEntries:b,expiredEntries:c}}cleanup(){let a=[];for(let[b,c]of this.cache.entries())this.isValid(c)||a.push(b);a.forEach(a=>this.cache.delete(a)),a.length>0&&p.debug("Cache cleanup completed",{expiredEntriesRemoved:a.length})}constructor(){this.cache=new Map,this.DEFAULT_TTL=3e5}}let r=new q;var s=c(73814),t=c(7573),u=c(62101);let v=(0,h.h)("backend/services/model/testConnection"),w=[{role:"user",content:"Reply with the single word: pong"}],x=["premature close","econnreset","socket hang up","epipe","und_err","terminated","network","fetch failed"];function y(a){if(!a)return;let b=["retry-after","x-ratelimit-reset","x-ratelimit-remaining","x-ratelimit-limit"],c={};for(let d of Object.keys(a))b.includes(d.toLowerCase())&&(c[d.toLowerCase()]=String(a[d]));return Object.keys(c).length>0?c:void 0}async function z(a,b,c,e){let f=Date.now();try{let d=(0,t.s)({apiKey:c,baseURL:b,maxRetries:0,defaultHeaders:(0,t.l)(e)}),g=await d.chat.completions.create({model:a,messages:w,temperature:0}),h=Date.now()-f,i=g?.error;if(i)return{ok:!1,durationMs:h,error:{message:i.message||"Provider returned an error in the response body",code:void 0!==i.code?String(i.code):void 0,type:i.type,body:i}};return{ok:!0,status:200,durationMs:h,content:g.choices?.[0]?.message?.content?.slice(0,500)??"",usage:g.usage}}catch(c){let a=Date.now()-f;if(c instanceof d.Ay.APIError){let b=c.error,d=y(c.headers);return{ok:!1,status:c.status,durationMs:a,error:{name:c.name,message:c.message,status:c.status,code:c.code??void 0,type:c.type??void 0,param:c.param??void 0,retryAfter:d?.["retry-after"],headers:d,body:b,stack:c.stack}}}let b=c instanceof Error?c.message:String(c);return{ok:!1,durationMs:a,error:{name:c instanceof Error?c.name:void 0,message:b,code:c?.code,stack:c instanceof Error?c.stack:void 0}}}}async function A(a,b,c,d){let e=Date.now(),f=(b||"https://api.openai.com/v1").replace(/\/+$/,""),g=`${f}/chat/completions`;try{let b=await s.A.post(g,{model:a,messages:w,temperature:0},{headers:{Authorization:`Bearer ${c}`,"Content-Type":"application/json",...(0,t.l)(d)??{}},timeout:6e5,validateStatus:()=>!0}),f=Date.now()-e,h=b.data;if(b.status<200||b.status>=300||h?.error){let a=h?.error??h;return{ok:!1,status:b.status,durationMs:f,error:{message:a?.message||`HTTP ${b.status}`,status:b.status,code:a?.code!==void 0?String(a.code):void 0,type:a?.type,headers:y(b.headers),body:a}}}return{ok:!0,status:b.status,durationMs:f,content:h?.choices?.[0]?.message?.content?.slice(0,500)??"",usage:h?.usage}}catch(b){let a=Date.now()-e;return{ok:!1,status:b.response?.status,durationMs:a,error:{name:b.name,message:b.message,status:b.response?.status,code:b.code,body:b.response?.data,stack:b.stack}}}}async function B(a,b){let c=Date.now();try{let d=(0,u.getCompletionAdapter)(a),{completion:f}=await d.createCompletion({model:a,apiKey:b,messages:[...w],temperature:0,maxTokens:(0,e.normalizeMaxTokens)(a.maxTokens)}),g=Date.now()-c,h=f?.error;if(h)return{ok:!1,durationMs:g,error:{message:h.message||"Provider returned an error"}};return{ok:!0,status:200,durationMs:g,content:f.choices?.[0]?.message?.content?.slice(0,500)??"",usage:f.usage}}catch(a){return{ok:!1,durationMs:Date.now()-c,error:{name:a instanceof Error?a.name:void 0,message:a instanceof Error?a.message:String(a),stack:a instanceof Error?a.stack:void 0}}}}async function C(a){let{modelName:b,baseUrl:c,apiKey:d,provider:e,adapter:f,model:g}=a;if(v.info("Testing model connection",{modelName:b,baseUrl:c,provider:e,adapter:f,hasApiKey:!!d}),f&&"openai"!==f&&g){let a=await B(g,d),h={ok:a.ok,durationMs:0,content:"n/a — native SDK adapter; the axios cross-check applies only to OpenAI-compatible endpoints."},i=a.ok?`Connected successfully via the ${f} adapter (native SDK). The model and credentials are working.`:`The native ${f} adapter failed: ${a.error?.message??"unknown error"}. Check the model name and the ${"claude-cli"===f?"OAuth token (claude setup-token) and that the `claude` CLI is installed":"API key"}.`;return{ok:a.ok,model:b,baseUrl:c,provider:e,sdk:a,axios:h,diagnosis:i}}let[h,i]=await Promise.all([z(b,c,d,e),A(b,c,d,e)]),j={ok:h.ok,model:b,baseUrl:c,provider:e,sdk:h,axios:i,diagnosis:function(a,b){if(a.ok&&b.ok)return"Both the SDK and axios reached the provider successfully. The model, key, and base URL are working.";if(a.ok&&!b.ok)return`The SDK succeeded but the axios cross-check failed. This is unusual; the model is usable via flows. axios error: ${b.error?.message??"unknown"}.`;if(!a.ok&&b.ok)return!function(a){if(!a)return!1;let b=a.toLowerCase();return x.some(a=>b.includes(a))}(a.error?.message)?`The SDK failed but axios succeeded. Likely an SDK/transport issue rather than the provider or key. SDK error: ${a.error?.message??"unknown"}.`:'The SDK failed with a transport error ("'+(a.error?.message??"")+'") while axios succeeded against the same endpoint and key. This is the keep-alive / "Premature close" connection-reuse bug, not a provider or key problem. The flow engine now disables keep-alive to avoid it.';let c=a.error?.status??b.error?.status;if(401===c||403===c)return"Both attempts failed with an auth error. The API key is missing, invalid, or lacks access to this model.";if(429===c){let b=a.error?.retryAfter??a.error?.headers?.["retry-after"];return"Both attempts were rate-limited (429) by the provider"+(b?` (retry after ${b}s)`:"")+'. For OpenRouter ":free" models this is a hard daily/throughput limit — try a paid model or wait.'}return 404===c?"Both attempts returned 404. The model name is probably wrong for this provider/base URL.":`Both the SDK and axios failed to reach the provider. SDK error: ${a.error?.message??"unknown"}; axios error: ${b.error?.message??"unknown"}. Check the base URL and network connectivity.`}(h,i)};return v.info("Model connection test complete",{modelName:b,sdkOk:h.ok,axiosOk:i.ok}),j}let D=(0,h.h)("backend/services/model/index");class E{async loadModels(){D.debug("loadModels: Entering method");try{return await (0,f.YM)(g.Z.MODELS,[])}catch(a){return D.warn("loadModels: Failed to load models:",a),[]}}async getModel(a){D.debug(`getModel: Looking for model with ID: ${a}`);try{let b=(await this.loadModels()).find(b=>b.id===a)||null;if(b)return D.debug(`getModel: Model ${a} found`),b;return D.debug(`getModel: Model ${a} not found`),null}catch(b){return D.error(`getModel: Error finding model ${a}:`,b),null}}async addModel(a){D.debug("addModel: Entering method");try{let b=await this.loadModels();if(a.displayName&&a.displayName.trim()){let c=a.displayName.trim();if(b.find(a=>a.displayName?.toLowerCase()===c.toLowerCase()))return{success:!1,error:`A model with the display name "${c}" already exists`};a.displayName=c}let c={...a,ApiKey:await this.resolveApiKeyForSave(a.ApiKey,void 0)},d=[...b,c];return await (0,f.VH)(g.Z.MODELS,d),{success:!0,model:c}}catch(a){return D.warn("addModel: Failed to add model:",a),{success:!1,error:a instanceof Error?a.message:"Failed to add model"}}}async resolveApiKeyForSave(a,b){let c=a??"";return c===i.RJ?b??"":c.startsWith("${global:")||c.startsWith("encrypted:")||c.startsWith("encrypted_failed:")?c:""===c.trim()?"":await (0,j.Rs)(c)}async updateModel(a){D.debug("updateModel: Entering method");try{if(D.verbose("updateModel: full model before validation",JSON.stringify(a)),!a.id)return D.warn("updateModel: Missing model ID"),{success:!1,error:"Model ID is required"};let b=await this.loadModels(),c=b.find(b=>b.id===a.id);if(!c)return D.warn("updateModel: Model not found",{modelId:a.id}),{success:!1,error:"Model not found"};if(!a.provider)return D.warn("updateModel: Missing provider",{modelId:a.id}),{success:!1,error:"Provider is required"};if(a.displayName&&a.displayName.trim()){let c=a.displayName.trim(),d=b.find(b=>b.displayName?.toLowerCase()===c.toLowerCase()&&b.id!==a.id);if(d){let b=`A model with the display name "${c}" already exists (ID: ${d.id})`;return D.warn("updateModel: Duplicate display name",{modelId:a.id,displayName:c,duplicateId:d.id,duplicateDisplayName:d.displayName}),{success:!1,error:b}}a.displayName=c}let d={...c,...a};d.ApiKey=await this.resolveApiKeyForSave(a.ApiKey,c.ApiKey);let e=b.map(b=>b.id===a.id?d:b);return D.verbose("updateModel: Updating models",JSON.stringify(d)),await (0,f.VH)(g.Z.MODELS,e),D.debug("updateModel: Model updated successfully",{modelId:a.id,displayName:d.displayName}),{success:!0,model:d}}catch(b){return D.error("updateModel: Failed to update model",{modelId:a.id,displayName:a.displayName,error:b instanceof Error?b.message:b}),{success:!1,error:b instanceof Error?b.message:"An unexpected error occurred while updating the model"}}}async deleteModel(a){D.debug("deleteModel: Entering method");try{if(!a)return D.warn("deleteModel: Missing model ID"),{success:!1,error:"Model ID is required"};let b=await this.loadModels(),c=b.find(b=>b.id===a);if(!c)return D.warn("deleteModel: Model not found",{modelId:a}),{success:!1,error:"Model not found"};D.debug("deleteModel: Attempting to delete model",{modelId:a,displayName:c.displayName});let d=b.filter(b=>b.id!==a);return await (0,f.VH)(g.Z.MODELS,d),D.debug("deleteModel: Model deleted successfully",{modelId:a,displayName:c.displayName}),{success:!0}}catch(b){return D.error("deleteModel: Failed to delete model",{modelId:a,error:b instanceof Error?b.message:b}),{success:!1,error:b instanceof Error?b.message:"An unexpected error occurred while deleting the model"}}}async listModels(){D.debug("listModels: Entering method");try{let a=await this.loadModels();return D.debug("listModels: Models loaded successfully",{count:a.length}),{success:!0,models:a}}catch(a){return D.error("listModels: Failed to list models",{error:a instanceof Error?a.message:a}),{success:!1,error:a instanceof Error?a.message:"An unexpected error occurred while listing models"}}}async fetchProviderModels(a,b,c,d){D.debug(`fetchProviderModels: Fetching models for baseUrl: ${a}`,{modelId:b,hasApiKey:!!d,searchTerm:c?`"${c}"`:"none"});try{let e=r.get(a);if(e)D.debug("Using cached models",{count:e.length});else{let c;if(D.debug("Cache miss - fetching from provider"),b){D.debug(`Looking up model with ID: ${b}`);let d=(await this.loadModels()).find(a=>a.id===b);d&&d.provider?(c=d.provider,D.debug(`Using stored provider: ${c}`)):(c=l(a),D.debug(`Provider determined from URL as: ${c}`))}else c=l(a),D.debug(`Provider determined from URL as: ${c}`);let f=null;if(d&&d!==i.RJ)f=await (0,j.GN)(d),D.debug("Using directly-supplied API key for provider fetch");else if(b){D.debug(`Looking up stored API key for model ID: ${b}`);let a=await this.getModel(b);a?(f=await (0,j.GN)(a.ApiKey),D.debug("Resolved stored API key for provider fetch")):D.warn(`Model with ID ${b} not found for API key resolution`)}else D.warn("No API key supplied and no modelId provided - provider fetch will be unauthenticated");D.info(`Fetching models from provider: ${c}`),e=await o(c,a,f),D.debug(`Successfully fetched ${e.length} models from provider`),r.set(a,e)}if(c&&c.trim()){let a=function(a,b){if(!b||0===b.trim().length)return a;let c=b.toLowerCase().trim();return a.filter(a=>{let b=a.id.toLowerCase(),d=a.name.toLowerCase();if(b.includes(c)||d.includes(c))return!0;let e=a=>{let b=0,d=0;for(;b<a.length&&d<c.length;)a[b]===c[d]&&d++,b++;return d===c.length};return e(b)||e(d)}).sort((a,b)=>{let d=a.id.toLowerCase(),e=b.id.toLowerCase(),f=a.name.toLowerCase(),g=b.name.toLowerCase(),h=d.includes(c)||f.includes(c),i=e.includes(c)||g.includes(c);return h&&!i?-1:!h&&i?1:a.id.length-b.id.length})}(e,c);return D.debug("Search filtering applied",{searchTerm:`"${c}"`,originalCount:e.length,filteredCount:a.length}),a}return e}catch(b){throw D.error(`fetchProviderModels: Error fetching models for ${a}:`,b),b}}async testModel(a){let{modelId:b,apiKey:c}=a,d=a.name,e=a.baseUrl,f=a.provider,g=a.adapter,h=null,k=null;if(c&&c!==i.RJ&&(k=await (0,j.GN)(c)),b&&(h=await this.getModel(b))&&(d=d||h.name,e=e||h.baseUrl,f=f||h.provider,g=g||h.adapter,k||(k=await (0,j.GN)(h.ApiKey))),!d)throw Error("Model name is required to run a test");if(!k)throw Error("Could not resolve an API key for this model");return C({modelName:d,baseUrl:e,apiKey:k,provider:f,adapter:g,model:h??void 0})}async generateChatCompletion(a){let{modelIdentifier:b,messages:c,tools:f}=a;D.debug("generateChatCompletion: Entering method",{modelIdentifier:b,messageCount:c?.length||0,hasTools:!!(f&&f.length>0)});try{let d=await this.loadModels(),g=b.trim().toLowerCase(),h=d.filter(a=>(a.displayName?.trim().toLowerCase()||"")===g);if(0===h.length&&(h=d.filter(a=>(a.name||"").trim().toLowerCase()===g)),0===h.length)return{success:!1,error:{message:`Model not found: model-${b}`,type:"invalid_request_error",code:"model_not_found",param:"model"},statusCode:404};if(h.length>1)return{success:!1,error:{message:`The identifier "${b}" matches more than one configured model. Address the model by its unique display name instead.`,type:"invalid_request_error",code:"model_ambiguous",param:"model"},statusCode:400};let i=h[0];if("claude-cli"===i.adapter&&f&&f.length>0)return{success:!1,error:{message:"Tool definitions are not supported for this model via the direct completion endpoint.",type:"invalid_request_error",code:"tools_not_supported_for_this_model",param:"tools"},statusCode:400};let k=await (0,j.GN)(i.ApiKey);if(!k)return{success:!1,error:{message:"Failed to resolve the API key for this model.",type:"api_error",code:"api_key_error",param:null},statusCode:500};let l="number"==typeof a.temperature?a.temperature:i.temperature?parseFloat(i.temperature):0,m=(0,e.normalizeMaxTokens)(a.maxTokens)??(0,e.normalizeMaxTokens)(i.maxTokens),n=(0,u.getCompletionAdapter)(i);D.debug("generateChatCompletion: calling completion adapter",{adapter:i.adapter||"openai",model:i.name,temperature:l,maxTokens:m});let{completion:o}=await n.createCompletion({model:i,apiKey:k,messages:c,tools:f&&f.length>0?f:void 0,temperature:l,maxTokens:m,maxTurns:1});if(o&&"object"==typeof o&&"error"in o&&o.error){let a=o.error;return D.warn("generateChatCompletion: provider returned an in-band error object",{code:a?.code,type:a?.type}),{success:!1,error:E.sanitizeProviderError(a),statusCode:502}}if(!o?.choices?.[0])return{success:!1,error:{message:"Invalid response structure from provider: missing choices.",type:"api_error",code:"invalid_provider_response",param:null},statusCode:502};return{success:!0,completion:{...o,model:`model-${b}`}}}catch(a){if(D.error("generateChatCompletion: provider call failed",{modelIdentifier:b,error:a instanceof Error?a.message:String(a)}),a instanceof d.Ay.APIError){let b=a.error,c=E.sanitizeProviderError(b,a.message);return{success:!1,error:{message:c.message,type:"api_error"!==c.type?c.type:"string"==typeof a.type?a.type:"api_error",code:"provider_error"!==c.code?c.code:"string"==typeof a.code?a.code:"provider_error",param:c.param??("string"==typeof a.param?a.param:null)},statusCode:"number"==typeof a.status?a.status:500}}return{success:!1,error:{message:a instanceof Error?a.message:"Failed to generate completion",type:"api_error",code:"internal_error",param:null},statusCode:500}}}static sanitizeProviderError(a,b){let c=b||("string"==typeof a?.message?a.message:"")||"Provider returned an unspecified error.";b&&"string"==typeof a?.message&&a.message&&a.message!==b&&(c=`${b} - ${a.message}`);let d=a?.metadata;if(d){let a;if("string"==typeof d.raw)try{let b=JSON.parse(d.raw);a=b?.error?.message||b?.message||d.raw}catch{a=d.raw}else if(d.raw&&"object"==typeof d.raw){let b=d.raw;a=b.error?.message||b.message}let b=[];d.provider_name&&b.push(String(d.provider_name)),a&&b.push(a),b.length>0&&(c=`${c} (upstream: ${b.join(": ")})`)}return{message:c,type:"string"==typeof a?.type?a.type:"api_error",code:"string"==typeof a?.code?a.code:"provider_error",param:"string"==typeof a?.param?a.param:null}}constructor(){this.encryptApiKey=j.Rs,this.decryptApiKey=j.Tt,this.resolveAndDecryptApiKey=j.GN,this.isEncryptionConfigured=j.yg,this.isUserEncryptionEnabled=j.eS,this.setEncryptionKey=j.nB,this.initializeDefaultEncryption=j.hO}}let F=new E},24463:(a,b,c)=>{"use strict";c.r(b),c.d(b,{MCPService:()=>ay,mcpService:()=>az});var d=c(32524),e=c(79748),f=c.n(e),g=c(33873),h=c.n(g),i=c(50846),j=c(43326);async function k(a,b,c){if(0===a.length)return;let d=0,e=async()=>{for(;;){let b=d++;if(b>=a.length)return;await c(a[b])}},f=Math.min(Math.max(1,Math.floor(b)||1),a.length);await Promise.all(Array.from({length:f},()=>e()))}var l=c(74186),m=c(68780),n=c(73456),o=c(68383),p=c(72904),q=c(92372),r=c(38844),s=c(4231),t=c(37601),u=c(58302),v=c(51605),w=c(3712),x=c(29021),y=c(21820),z=c(77213),A=c(25096),B=c(17748);let C=new Set(["npx","bunx","uvx","pipx","dlx"]),D=new Set(["pnpm","yarn","bun","npm"]),E=new Set(["dlx","exec","x"]);function F(a,b=[]){let c=((a||"").split(/[\\/]/).filter(Boolean).pop()||"").toLowerCase().replace(/\.(cmd|exe|bat|ps1)$/i,"");if(C.has(c))return!0;if(D.has(c)){let a=(b[0]||"").toLowerCase();return E.has(a)}return!1}let G=new Set(["node","npm","npx"]);var H=c(62850),I=c(20433),J=c(62101),K=c(54042);let L=(0,i.h)("backend/services/mcp/sampling");function M(a){return a.sampling}function N(a){let b=M(a);return!!(b?.enabled&&b.modelId)}function O(a){let b=M(a);return b?.enabled?JSON.stringify({m:b.modelId,t:b.maxTokens,r:b.maxCallsPerMinute}):""}function P(a){let b=[];return async c=>{let d=M(a);if(!d?.enabled||!d.modelId)throw new m.Nh(m.O4.InvalidRequest,"Sampling is not enabled for this server");let e=d.maxCallsPerMinute??10,f=Date.now(),g=f-6e4;for(;b.length>0&&b[0]<g;)b.shift();if(b.length>=e)throw L.warn(`Sampling rate limit (${e}/min) hit for ${a.name}`),new m.Nh(m.O4.InvalidRequest,`Sampling rate limit of ${e}/min exceeded`);b.push(f);let h=await I.modelService.getModel(d.modelId);if(!h)throw new m.Nh(m.O4.InternalError,`Sampling model not found: ${d.modelId}`);let i=await I.modelService.resolveAndDecryptApiKey(h.ApiKey);if(!i)throw new m.Nh(m.O4.InternalError,"Could not resolve the sampling model API key");let j=c.params,k=function(a){let b=[];for(let c of(a.systemPrompt&&b.push({role:"system",content:a.systemPrompt}),a.messages||[])){let a=c.content,d=a?.type==="text"&&"string"==typeof a.text?a.text:`[unsupported ${a?.type||"non-text"} content omitted]`;b.push({role:c.role,content:d})}return b}(j),l="number"==typeof j.temperature?j.temperature:.7;L.info(`Sampling for ${a.name} via model ${h.name} (${k.length} messages)`);let n=(0,J.getCompletionAdapter)(h),{completion:o}=await n.createCompletion({model:h,apiKey:i,messages:k,temperature:l,maxTokens:(0,K.normalizeMaxTokens)(h.maxTokens)}),p=o.choices?.[0]?.message?.content;return{role:"assistant",content:{type:"text",text:"string"==typeof p?p:""},model:h.name,stopReason:"endTurn"}}}var Q=c(34079);let R=(0,i.h)("backend/services/mcp/connection");async function S(a){if("streamable"!==a.transport&&"sse"!==a.transport||!a.headers||"object"!=typeof a.headers)return a;let b={};for(let[c,d]of Object.entries(a.headers)){if(!c)continue;let{value:a}=(0,Q.at)(d,c);if(!a||(0,Q.uh)(a))continue;let e=await (0,n.G)(a);e&&(b[c]=e)}return{...a,headers:b}}function T(a){let b={};for(let[c,d]of Object.entries(a)){if(!c)continue;let{value:a}=(0,Q.at)(d,c);"string"==typeof a&&a.length>0&&(b[c]=a)}return b}function U(a){let b={};if(a)for(let[c,d]of Object.entries(a))d&&"object"==typeof d&&"value"in d?b[c]=d.value:b[c]=d;return b}function V(a){return JSON.stringify({command:a.command,args:a.args??[],env:U(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??""})}function W(a){return JSON.stringify({transport:a.transport,url:a.serverUrl??"",headers:a.headers??{},requestInit:a.requestInit??{},eventSourceInit:a.eventSourceInit??{},reconnectionOptions:a.reconnectionOptions??{},sessionId:a.sessionId??"",oauthClientId:a.oauthClientId??"",oauthClientInformation:a.oauthClientInformation??{},oauthClientSecret:a.oauthClientSecret??"",oauthTokens:a.oauthTokens??{}})}function X(a){R.debug("Entering createNewClient method");let b=N(a),c=new s.K({name:`flujo-${a.name}-client`,version:"3.28.0"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{}}});return(0,H.FP)(c,a),b&&c.setRequestHandler(m.u9,P(a)),c.__flujoCapKey=O(a),c}function Y(a){if(R.debug("Entering createTransport method"),"streamable"===a.transport){R.info(`Creating streamable http transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.reconnectionOptions&&"object"==typeof a.reconnectionOptions&&(b.reconnectionOptions=a.reconnectionOptions),"string"==typeof a.sessionId&&a.sessionId.length>0&&(b.sessionId=a.sessionId),a.headers&&"object"==typeof a.headers){let c=T(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},R.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}a.oauthClientId||a.oauthClientInformation?(R.info(`Setting up OAuth authentication for ${a.name}`),b.authProvider=(0,A.C)(a),a.oauthTokens?.access_token?(R.debug(`OAuth provider configured for ${a.name} with existing tokens`),R.debug(`Token expires in: ${a.oauthTokens.expires_in} seconds`)):R.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)):R.debug(`No OAuth configuration found for ${a.name}`);let c=new v.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=W(a),c}if("sse"===a.transport){R.info(`Creating legacy sse transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit),a.headers&&"object"==typeof a.headers){let c=T(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},R.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new w.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=W(a),c}if("websocket"===a.transport)return R.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new u.I(new URL(a.websocketUrl));{var b=a;if(R.debug("Entering createStdioTransport method"),"stdio"!==b.transport)throw Error("Cannot create stdio transport for non-stdio config");let{command:c,args:d,env:e,cwd:f}=Z(b);R.info(`Creating StdioClientTransport for ${b.name} with stderr: 'pipe'`);let g=new t.oQ({command:c,args:d,env:e,cwd:f,stderr:"pipe"});return g.__flujoStdioKey=V(b),g.stderr?R.info(`Stderr stream is available for ${b.name}`):R.warn(`Stderr stream is NOT available for ${b.name}`),g}}function Z(a){let b=a.command,c=a.args?[...a.args]:[],d=`${z.VL}/${a.name}`;R.info(`Creating stdio transport for server ${a.name}`),R.debug(`Original command: ${b}`),R.debug(`Original args: ${JSON.stringify(c)}`),R.debug(`Server directory: ${d}`);let e=!g.isAbsolute(b)&&(b.includes("/")||b.includes("\\")),f=!b.includes("/")&&!b.includes("\\");if(R.debug(`Is relative path: ${e}`),R.debug(`Is just filename: ${f}`),"win32"===y.platform()&&b.toLowerCase().endsWith(".bat"))if(R.debug(`Detected .bat file on Windows: ${b}`),f){let a=g.join((0,j.getDataDir)(),d,b);R.debug(`Checking if file exists at: ${a}`);let e=x.existsSync(a);R.debug(`File exists: ${e}`),e?(R.debug(`Using full path to .bat file: ${a}`),c=["/c",a,...c]):(R.warn(`WARNING: .bat file not found at ${a}`),c=["/c",b,...c]),b="cmd.exe"}else R.debug(`Using cmd.exe with path as provided: ${b}`),c=["/c",b,...c],b="cmd.exe";let h=function(a,b){if(!a||!(!a.includes("/")&&!a.includes("\\")))return a;let c=a.toLowerCase();if(!G.has(c))return a;if("node"===c)return b.execPath||a;if(!b.execPath)return a;let d=b.dirname(b.execPath);for(let a of"win32"===b.platform?[`${c}.cmd`,`${c}.exe`,c]:[c]){let c=b.joinPath(d,a);if(b.fileExists(c))return c}return a}(b,{execPath:process.execPath,platform:y.platform(),dirname:g.dirname,joinPath:g.join,fileExists:x.existsSync});h!==b&&(R.debug(`Resolved Node toolchain command "${b}" to absolute path: ${h}`),b=h),R.debug(`Final command: ${b}`),R.debug(`Final args: ${JSON.stringify(c)}`);let i=function({command:a,args:b=[],rootPath:c,cwd:d,serverName:e,defaultCwd:f}){let g=c||d||f;return e&&F(a,b)&&(g.split(/[\\/]/).filter(Boolean).pop()||"")===e&&function(a){let b=a.match(/^(.*[\\/])[^\\/]+[\\/]*$/);return b?b[1].replace(/[\\/]+$/,""):""}(g)||g}({command:a.command,args:a.args,rootPath:a.rootPath,cwd:a.cwd,serverName:a.name,defaultCwd:`${z.VL}/${a.name}`}),k=g.isAbsolute(i)?i:g.join((0,j.getDataDir)(),i);R.debug(`cwd: ${k}`),R.debug(`env: ${JSON.stringify(a.env)}`);let l=U(a.env);return R.verbose("Transformed environment variables",JSON.stringify(l)),{command:b,args:c,env:l,cwd:k}}function $(a,b){return null!==a.exitCode||null!==a.signalCode?Promise.resolve(!0):new Promise(c=>{let d=()=>{clearTimeout(e),c(!0)},e=setTimeout(()=>{a.removeListener("exit",d),c(!1)},b);e.unref?.(),a.once("exit",d)})}async function _(a,b,c,d){R.debug("Entering safelyCloseClient method");let e=d?.gracePeriodMs??15e3,f=d?.killEscalationMs??5e3;try{let c=a.transport?._process;if(c&&"function"==typeof c.kill&&null===c.exitCode&&null===c.signalCode){try{c.stdin&&!c.stdin.destroyed&&(c.stdin.end(),R.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){R.warn(`Error closing stdin for ${b}:`,a)}let a=await $(c,e);if(!a){R.warn(`Process did not exit within ${e}ms after stdin close, sending SIGTERM for ${b}`);try{c.kill("SIGTERM")}catch(a){R.error(`Error sending SIGTERM for ${b}:`,a)}a=await $(c,f)}if(a)R.info(`Process exited gracefully for ${b}`);else{R.warn(`Process did not respond to SIGTERM, sending SIGKILL for ${b}`);try{c.kill("SIGKILL")}catch(a){R.error(`Error sending SIGKILL for ${b}:`,a)}}}await a.close(),R.info(`Client closed successfully for ${b}`)}catch(a){R.warn(`Error closing client for ${b}:`,a)}}let aa=(0,i.h)("backend/services/mcp/betaClient");async function ab(){try{let a=await (0,q.YM)(r.Z.SPEECH_SETTINGS,void 0);return!!a?.experimental?.mcpBetaProtocol}catch(a){return aa.warn("Failed to read mcpBetaProtocol setting; defaulting to disabled",{err:a}),!1}}function ac(a){return!0===a.__flujoBeta}function ad(a){let b=N(a),c=new o.Kj({name:`flujo-${a.name}-client`,version:"3.27.0"},{capabilities:{roots:{listChanged:!0},...b?{sampling:{}}:{}},versionNegotiation:{mode:"auto"}});if(c.setRequestHandler("roots/list",(0,H.sG)(a)),b){let b=P(a);c.setRequestHandler("sampling/createMessage",async a=>b(a))}return c.__flujoBeta=!0,c.__flujoCapKey=O(a),aa.info(`Created v2-beta MCP client for ${a.name} (version negotiation: auto)`),c}function ae(a){let b=a.requestInit&&"object"==typeof a.requestInit?a.requestInit:void 0;if(a.headers&&"object"==typeof a.headers){let c=T(a.headers);Object.keys(c).length>0&&(b={...b||{},headers:{...b?.headers||{},...c}})}return b}function af(a){if("websocket"===a.transport)throw Error("The v2-beta MCP SDK has no websocket transport; use the v1 path");if("streamable"===a.transport){let b={},c=ae(a);c&&(b.requestInit=c),a.reconnectionOptions&&"object"==typeof a.reconnectionOptions&&(b.reconnectionOptions=a.reconnectionOptions),"string"==typeof a.sessionId&&a.sessionId.length>0&&(b.sessionId=a.sessionId),(a.oauthClientId||a.oauthClientInformation)&&(b.authProvider=(0,A.C)(a));let d=new o.jS(new URL(a.serverUrl),b);return d.__flujoHttpKey=W(a),d.__flujoKind="streamable",aa.info(`Created v2-beta streamable transport for ${a.name}`),d}if("sse"===a.transport){let b={},c=ae(a);c&&(b.requestInit=c),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit);let d=new o.Am(new URL(a.serverUrl),b);return d.__flujoHttpKey=W(a),d.__flujoKind="sse",aa.info(`Created v2-beta SSE transport for ${a.name}`),d}let{command:b,args:c,env:d,cwd:e}=Z(a),f=new p.oQ({command:b,args:c,env:d,cwd:e,stderr:"pipe"});return f.__flujoStdioKey=V(a),f.__flujoKind="stdio",aa.info(`Created v2-beta stdio transport for ${a.name}`),f}let ag=(0,i.h)("backend/services/mcp/tools"),ah=0x80000000-1;async function ai(a,b){if(ag.debug("Entering listServerTools method"),!a)return ag.warn(`Server ${b} not connected`),{tools:[],error:"Server not connected"};try{ag.info(`Listing tools for server ${b}`);let c=await a.listTools();ag.verbose("Raw response from MCP server:",c);let d=(c.tools||[]).map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema||{},...a.annotations?{annotations:a.annotations}:{},...a._meta?{_meta:a._meta}:{}}));return ag.verbose("Processed tools:",d),{tools:d}}catch(c){ag.warn(`Failed to list tools for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{tools:[],error:a.includes("Connection timeout")?a:`Failed to list tools: ${a}`}}}async function aj(a,b,c,d,e,f){if(ag.debug("Entering callTool method"),!a)return ag.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};let g=void 0!==e&&e>0?Math.min(1e3*e,ah):ah;try{ag.debug(`Original args for tool ${c}:`,d);let b=await (0,n.resolveGlobalVars)(d),e=function(a,b){if(!a)return{};let c={};for(let d in a){let e=a[d];null==e?(ag.debug(`Normalizing undefined/null value for parameter '${d}' in tool '${b}'`),d.includes("number")||d.endsWith("Count")||d.endsWith("Id")||d.endsWith("Limit")?(c[d]=0,ag.debug(`Using default value 0 for likely number parameter: ${d}`)):d.includes("bool")||d.startsWith("is")||d.startsWith("has")||d.startsWith("should")?(c[d]=!1,ag.debug(`Using default value false for likely boolean parameter: ${d}`)):d.includes("array")||d.endsWith("s")||d.endsWith("List")||d.endsWith("Items")?(c[d]=[],ag.debug(`Using empty array for likely array parameter: ${d}`)):d.includes("object")||d.endsWith("Options")||d.endsWith("Config")||d.endsWith("Settings")?(c[d]={},ag.debug(`Using empty object for likely object parameter: ${d}`)):(c[d]="",ag.debug(`Using empty string for parameter with unknown type: ${d}`))):c[d]=e}return c}("object"==typeof b&&null!==b?b:{},c);ag.debug(`Normalized args for tool ${c}:`,e),ag.debug(`Calling tool ${c} with SDK timeout ${g}ms`);let h={timeout:g,resetTimeoutOnProgress:!0,onprogress:a=>{ag.debug(`Progress for tool ${c}: ${a.progress}${void 0!==a.total?`/${a.total}`:""}${a.message?` — ${a.message}`:""}`),f?.(a)}},i=ac(a)?await a.callTool.call(a,{name:c,arguments:e},h):await a.callTool({name:c,arguments:e},void 0,h);return{success:!0,data:i}}catch(e){ag.warn(`Failed to call tool ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;if(e instanceof m.Nh&&e.code===m.O4.RequestTimeout){let a=Math.round(g/1e3);return ag.warn(`Tool ${c} execution timed out after ${a} seconds`),{success:!1,error:`Tool execution timed out after ${a} seconds`,errorType:"timeout",toolName:c,timeout:a,statusCode:408}}if(a.includes("401")||a.includes("Unauthorized")||a.includes("invalid_token")||a.includes("token_expired"))return ag.info(`OAuth authentication error detected for tool ${c} on server ${b}`),{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate the server.",statusCode:401,requiresAuthentication:!0};return(a.includes("404")||a.includes("Not Found"))&&(ag.info(`404 error detected for tool ${c} on server ${b} - may indicate OAuth issues`),d=404,a="Tool endpoint not found (404). This may indicate OAuth authentication issues or the server may not be properly configured."),e instanceof m.Nh?(a=`Failed to call tool: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code?d=400:-32603===e.code&&(d=500)):a=`Failed to call tool: ${a}`,{success:!1,error:a,statusCode:d}}}let ak=(0,i.h)("backend/services/mcp/resources");async function al(a,b){if(ak.debug("Entering listServerResources method"),!a)return ak.warn(`Server ${b} not connected`),{resources:[],error:"Server not connected"};try{ak.info(`Listing resources for server ${b}`);let c=(await a.listResources()).resources||[];return ak.verbose("Processed resources:",c),{resources:c}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return ak.debug(`Server ${b} does not support resources/list`),{resources:[]};ak.warn(`Failed to list resources for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resources:[],error:a.includes("Connection timeout")?a:`Failed to list resources: ${a}`}}}async function am(a,b){if(ak.debug("Entering listServerResourceTemplates method"),!a)return ak.warn(`Server ${b} not connected`),{resourceTemplates:[],error:"Server not connected"};try{return ak.info(`Listing resource templates for server ${b}`),{resourceTemplates:(await a.listResourceTemplates()).resourceTemplates||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return ak.debug(`Server ${b} does not support resources/templates/list`),{resourceTemplates:[]};ak.warn(`Failed to list resource templates for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resourceTemplates:[],error:a.includes("Connection timeout")?a:`Failed to list resource templates: ${a}`}}}async function an(a,b,c){if(ak.debug("Entering readResource method"),!a)return ak.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let d=await (0,n.resolveGlobalVars)(c);ak.info(`Reading resource ${d} from server ${b}`);let e=await a.readResource({uri:d});return{success:!0,data:e}}catch(e){ak.warn(`Failed to read resource ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to read resource: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to read resource: ${a}`,{success:!1,error:a,statusCode:d}}}let ao=(0,i.h)("backend/services/mcp/prompts");async function ap(a,b){if(ao.debug("Entering listServerPrompts method"),!a)return ao.warn(`Server ${b} not connected`),{prompts:[],error:"Server not connected"};try{return ao.info(`Listing prompts for server ${b}`),{prompts:(await a.listPrompts()).prompts||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return ao.debug(`Server ${b} does not support prompts/list`),{prompts:[]};ao.warn(`Failed to list prompts for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{prompts:[],error:a.includes("Connection timeout")?a:`Failed to list prompts: ${a}`}}}async function aq(a,b,c,d){if(ao.debug("Entering getPrompt method"),!a)return ao.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let e;if(d&&Object.keys(d).length>0){let a=await (0,n.resolveGlobalVars)(d);e="object"==typeof a&&null!==a?a:void 0}ao.info(`Getting prompt ${c} from server ${b}`);let f=await a.getPrompt({name:c,arguments:e});return{success:!0,data:f}}catch(e){ao.warn(`Failed to get prompt ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to get prompt: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to get prompt: ${a}`,{success:!1,error:a,statusCode:d}}}var ar=c(40829),as=c(49680);function at(a){return"stdio"===a.transport&&F(a.command,a.args??[])}var au=c(76054),av=c(81495),aw=c(7658);void 0===global.__mcp_clients&&(global.__mcp_clients=new Map),void 0===global.__mcp_connecting&&(global.__mcp_connecting=new Set),void 0===global.__mcp_starting_up&&(global.__mcp_starting_up=!0),void 0===global.__mcp_active_transports&&(global.__mcp_active_transports=new Map);let ax=(0,i.h)("backend/services/mcp/index");class ay{get clients(){return global.__mcp_clients}get connectingServers(){return global.__mcp_connecting}get activeTransports(){return global.__mcp_active_transports}static{this.MAX_STDERR_LOG_ENTRIES=200}appendStderrLog(a,b){let c=this.stderrLogs.get(a)||[];c.push(b),c.length>ay.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-ay.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){this.clients.delete(a),this.activeTransports.delete(a)}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),ax.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){ax.warn(`Maximum retry attempts (5) reached for server ${a}, stopping retries`),this.connectionRetryAttempts.delete(a);return}let d=Math.min(5e3*Math.pow(2,c),3e5);ax.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout(async()=>{ax.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){ax.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){ax.info(`Server ${a} is now disabled, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}let d=this.getClient(a);if(d)try{await d.ping({timeout:5e3}),ax.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){ax.warn(`Server ${a} has a registered client but ping failed (${b instanceof Error?b.message:String(b)}); reconnecting from scratch`)}this.connectionRetryAttempts.set(a,c+1);try{let e=d?await this.forceReconnect(a):await this.connectServer(b);if(e.success)ax.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(ax.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication){ax.info(`Server ${a} requires authentication, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){ax.error(`Error during retry connection for server ${a}:`,c),this.scheduleConnectionRetry(a,b)}},d);this.connectionRetryTimers.set(a,e)}isStartingUp(){return!0===global.__mcp_starting_up}setStartingUp(a){global.__mcp_starting_up=a,ax.info(`Backend startup state set to: ${a?"starting":"complete"}`)}getClient(a){let b=this.clients.get(a);if(b&&(0,B.wk)(b)){ax.warn(`getClient: client for ${a} has a closed/aborted connection — evicting it`),this.clients.delete(a);return}return ax.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){ax.debug("loadServerConfigs: Entering method");try{let a=await (0,l.loadServerConfigs)();if(!Array.isArray(a))return ax.warn("loadServerConfigs: Received non-array response",a),a;for(let b of(await (0,aw.XS)())){if(a.some(a=>a.name===b.name)){ax.warn(`loadServerConfigs: A stored server is named "${b.name}" — it shadows FLUJO's built-in server`);continue}a.push(b)}return ax.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){return ax.warn("loadServerConfigs: Failed to load server configs:",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async getServerConfig(a){ax.debug(`getServerConfig: Looking up config for server ${a}`);let b=await this.loadServerConfigs();if(!Array.isArray(b))return ax.warn(`getServerConfig: Failed to load configs for ${a}:`,b.error),null;let c=b.find(b=>b.name===a);return c||(ax.warn(`getServerConfig: Server ${a} not found in configs`),null)}async isServerDisabled(a){let b=await this.getServerConfig(a);return b?.disabled===!0}async isInternalServer(a){if(!(0,aw.isBuiltInServerName)(a))return!1;let b=await (0,l.loadServerConfigs)();return!Array.isArray(b)||!b.some(b=>b.name===a)}async connectServer(a){let b="string"==typeof a?a:a.name;if((0,aw.isBuiltInServerName)(b)&&("string"!=typeof a?!0===a.builtIn:await this.isInternalServer(b)))return this.connectingServers.delete(b),{success:!0};let c=this.inFlightConnects.get(b);if(c)return ax.debug(`connectServer: reusing in-flight connection attempt for ${b}`),c;let d=this.connectServerInternal(a).finally(()=>{this.inFlightConnects.delete(b)});return this.inFlightConnects.set(b,d),d}async connectServerInternal(a){let b;if("string"==typeof a){ax.info(`connectServer: Looking up config for server ${a}`);let c=await this.getServerConfig(a);if(!c)return ax.warn(`connectServer: Server ${a} not found in configs`),{success:!1,error:`Server configuration for "${a}" not found. The server may have been deleted or not properly configured.`};b=c}else b=a;if((("string"==typeof a?b:await this.getServerConfig(b.name))??b).disabled)return ax.info(`connectServer: Server ${b.name} is disabled — refusing to create a client/transport`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!1,error:`Server '${b.name}' is disabled. Enable it on the MCP page to use it.`};let c=(0,d.A)();ax.info(`connectServer: Starting connection for server ${b.name} [RequestID: ${c}]`),this.connectingServers.add(b.name);try{this.stderrLogs.set(b.name,[]),b=await S(b);let a=await ab()&&"websocket"!==b.transport,c=this.clients.get(b.name);if(c){let{needsNewClient:d,reason:e}=function(a,b,c=!1){if(R.debug("Entering shouldRecreateClient method"),(0,B.wk)(a))return{needsNewClient:!0,reason:"Existing connection is closed"};if((a.__flujoCapKey??"")!==O(b))return{needsNewClient:!0,reason:"Client capabilities (sampling) changed"};let d=!0===a.__flujoBeta,e=c&&"websocket"!==b.transport;if(d!==e)return{needsNewClient:!0,reason:e?"Beta MCP protocol enabled":"Beta MCP protocol disabled"};if(d){let c=a.transport;if(!c||c.__flujoKind!==b.transport)return{needsNewClient:!0,reason:`Transport type changed to ${b.transport}`};if("stdio"===b.transport){if(c.__flujoStdioKey!==V(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}else if(c.__flujoHttpKey!==W(b))return{needsNewClient:!0,reason:`${b.transport} auth/connection parameters changed`};return{needsNewClient:!1}}if("websocket"===b.transport){if(!(a.transport instanceof u.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof v.j))return{needsNewClient:!0,reason:"Transport type changed to streamable"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"Streamable server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing streamable transport has no config key"};if(e!==W(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof w.A))return{needsNewClient:!0,reason:"Transport type changed to sse"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"SSE server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing sse transport has no config key"};if(e!==W(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof t.oQ))return{needsNewClient:!0,reason:"Transport type changed to stdio"};if("stdio"!==b.transport)return{needsNewClient:!0,reason:"Transport type changed from stdio"};let c=a.transport.__flujoStdioKey;if(!c)return{needsNewClient:!0,reason:"Existing stdio transport has no config key"};if(c!==V(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}(c,b,a);if(!d)return ax.info(`connectServer: Server ${b.name} is already connected`),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!0};ax.info(`connectServer: Existing client for ${b.name} is stale (${e}), recreating`),this.deregisterClient(b.name);try{await _(c,b.name,b)}catch(a){ax.debug(`connectServer: error closing stale client for ${b.name}: ${a instanceof Error?a.message:String(a)}`)}c=void 0}c=a?ad(b):X(b);let d=a?af(b):Y(b),e=d.stderr;if(e&&"function"==typeof e.on){let a=b.name;e.on("data",b=>{let c=b.toString();ax.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)})}d.onclose=()=>{if(this.activeTransports.get(b.name)!==d)return void ax.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${b.name}`);ax.warn(`connectServer: Connection closed for server ${b.name}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ax.info(`Server ${b.name} is now disabled, skipping reconnection logic`);ax.info(`Connection closed for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ax.warn(`Error checking server config for ${b.name} during onclose:`,a)})},d.onerror=a=>{if((0,B.lO)(a))return void ax.debug(`connectServer: transient SSE stream disconnect for ${b.name} (self-healing, ignored): ${a instanceof Error?a.message:String(a)}`);if(this.activeTransports.get(b.name)!==d)return void ax.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${b.name}`);if(ax.error(`connectServer: Transport error for server ${b.name}:`),a instanceof Error){ax.error(`Error name: ${a.name}`),ax.error(`Error message: ${a.message}`),ax.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&ax.error(`Error code: ${b}`),ax.error(`Error chain: ${(0,B.jf)(a)}`)}else if(a&&"object"==typeof a){ax.error(`Error type: ${typeof a}`),ax.error(`Error constructor: ${a.constructor?.name||"Unknown"}`);let b=Object.getOwnPropertyNames(a);b.length>0?(ax.error(`Error properties: ${b.join(", ")}`),b.forEach(b=>{try{let c=a[b];ax.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){ax.error(` ${b}: [Unable to serialize: ${a}]`)}})):ax.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);ax.error(`JSON stringified error: ${b}`)}catch(a){ax.error(`Cannot JSON stringify error: ${a}`)}}else ax.error(`Error value: ${String(a)} (type: ${typeof a})`);this.appendStderrLog(b.name,`Transport error: ${(0,B.jf)(a)}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ax.info(`Server ${b.name} is now disabled, skipping reconnection after transport error`);ax.info(`Transport error for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ax.warn(`Error checking server config for ${b.name} during onerror:`,a)})},await c.connect(d),this.clients.set(b.name,c),this.activeTransports.set(b.name,d),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name);let f=function(a){if(ac(a))try{return a.getNegotiatedProtocolVersion()}catch{return}}(c);return ax.info(`connectServer: Successfully connected to ${b.name}`+(f?` (beta SDK, negotiated MCP protocol ${f})`:"")),{success:!0}}catch(f){ax.error(`connectServer: Failed to connect to server ${b.name}:`,f);let a=f instanceof Error?f.message:String(f),c=f instanceof Error?f.name:"";if(a.includes("OAuth authentication required")||"OAuthAuthenticationRequired"===c){if(ax.info(`OAuth authentication required for server ${b.name}`),"streamable"===b.transport){let a=b;a.authorizationUrl&&ax.info(`Authorization URL available for ${b.name}: ${a.authorizationUrl}`)}return{success:!1,error:a,requiresAuthentication:!0}}if((0,B.Ah)(f)){if(ax.info(`OAuth authentication error detected for server ${b.name}: ${a}`),"streamable"===b.transport){let a=b;if(!a.oauthScopes||0===a.oauthScopes.length){ax.info(`Dynamically enabling OAuth for server ${b.name} due to authentication error`);try{let c={...a,oauthScopes:["read"]},d=await this.loadServerConfigs();if(Array.isArray(d)){let a=d.findIndex(a=>a.name===b.name);-1!==a&&(d[a]=c,await (0,l.q)(new Map(d.map(a=>[a.name,a]))),ax.info(`Updated config for ${b.name} to enable OAuth`))}}catch(a){ax.warn(`Failed to update config for ${b.name} to enable OAuth:`,a)}}}return{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate.",requiresAuthentication:!0}}let d=this.stderrLogs.get(b.name)||[],e=(0,B.ox)(f,b,d);return this.lastConnectionError.set(b.name,e),{success:!1,error:e}}finally{this.connectingServers.delete(b.name)}}async testConnection(a,b,c){ax.info(`testConnection: Testing connection to ${a.name||"(unnamed)"} via ${a.transport} transport`);let d=a=>{try{b?.(a)}catch{}},e=[],f=null,g=null;try{let b,h=a,i=c?.storedName||a.name;if(("streamable"===a.transport||"sse"===a.transport)&&i){let b=await this.loadServerConfigs(),c=Array.isArray(b)?b.find(a=>a.name===i):void 0,d=c?.headers,e=a.headers;h={...a,headers:(0,Q.x0)(e,d)}}let j=await S(h),k=await ab()&&"websocket"!==j.transport;f=k?ad(j):X(j);let l=(g=k?af(j):Y(j)).stderr;l&&"function"==typeof l.on&&l.on("data",a=>{let b=a.toString();e.push(b),d({type:"stderr",data:b})}),g.onerror=a=>{let b=`Transport error: ${(0,B.jf)(a)}`;e.push(b),d({type:"stderr",data:b+"\n"})},d({type:"status",phase:"spawning",message:"Starting server / opening transport..."});let m=at(a)?9e4:15e3,n=at(a),o=new Promise((a,c)=>{b=setTimeout(()=>c(Error(`Connection timeout after ${m/1e3}s`+(n?" — the package may still be downloading via npx/uvx. Try running the Test again (the package is cached after the first download), or verify the command and network access.":""))),m)});d({type:"status",phase:"handshaking",message:"Performing MCP handshake..."});try{await Promise.race([f.connect(g),o])}finally{b&&clearTimeout(b)}d({type:"status",phase:"listing-tools",message:"Handshake OK — listing tools..."});let p=0;try{let a=await f.listTools();p=Array.isArray(a?.tools)?a.tools.length:0}catch(b){ax.debug(`testConnection: connected to ${a.name} but listTools failed: ${b instanceof Error?b.message:String(b)}`)}return ax.info(`testConnection: Successfully connected to ${a.name} (${p} tools)`),d({type:"result",success:!0,data:{toolCount:p}}),{success:!0,data:{toolCount:p}}}catch(g){let b;ax.warn(`testConnection: Failed to connect to ${a.name}:`,g);let c=(0,B.Ah)(g);if(c&&("streamable"===a.transport||"sse"===a.transport)){let c=a.serverUrl;c&&(b=(await (0,au.n)(c)).oauthCapable)}let f=(0,B.ox)(g,a,e);return d({type:"result",success:!1,error:f,requiresAuthentication:c,oauthCapable:b}),{success:!1,error:f,requiresAuthentication:c,oauthCapable:b}}finally{if(f)try{await _(f,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){ax.debug(`testConnection: error closing test client for ${a.name}: ${b instanceof Error?b.message:String(b)}`)}}}setNodeRoots(a,b,c){for(let d of(0,H.eS)(a,b,c))this.notifyRootsChanged(d)}notifyRootsChanged(a){let b=this.getClient(a);if(!b)return void ax.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{ax.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),ax.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){ax.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}async disconnectServer(a){if(ax.debug(`disconnectServer: Entering method for server ${a}`),await this.isInternalServer(a))return{success:!0};this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);let b=this.getClient(a);if(!b)return ax.warn(`disconnectServer: Server ${a} not found in clients map`),this.deregisterClient(a),{success:!1,error:`Server ${a} not found`};this.deregisterClient(a);try{let c=await this.getServerConfig(a);return await _(b,a,c||void 0),ax.info(`disconnectServer: Disconnected server ${a}`),{success:!0}}catch(b){return ax.warn(`disconnectServer: Failed to disconnect server ${a}:`,b),{success:!1,error:`Failed to disconnect server: ${b instanceof Error?b.message:"Unknown error"}`}}}async forceReconnect(a){if(ax.info(`forceReconnect: Forcing fresh connection for server ${a}`),await this.isInternalServer(a))return{success:!0};let b=this.clients.get(a);if(b){this.deregisterClient(a);let c=await this.getServerConfig(a);try{await _(b,a,c||void 0)}catch(b){ax.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a){if(ax.debug(`listServerTools: Entering method for server ${a}`),await this.isInternalServer(a)){if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ax.warn(`listServerTools: ${b}`),{tools:[],error:b}}let{internalToolDefinitionsFor:b}=await c.e(5463).then(c.bind(c,25463));return{tools:await b(a)}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ax.warn(`listServerTools: ${b}`),{tools:[],error:b}}let b=this.getClient(a);b||ax.warn(`listServerTools: Client not found for ${a}`);let d=await ai(b,a);if(d.error){ax.warn(`listServerTools: Listing tools for ${a} failed (${d.error}); forcing reconnect and retrying once`);let c=await this.forceReconnect(a);if(!c.success)return ax.warn(`listServerTools: Reconnect for ${a} failed: ${c.error}`),{tools:[],error:c.error||d.error};b=this.clients.get(a),(d=await ai(b,a)).error?ax.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,d.error):ax.info(`listServerTools: Recovered after reconnect for ${a}; listed ${d.tools.length} tools`)}else ax.info(`listServerTools: Listed ${d.tools.length} tools for ${a}`);return d}async callTool(a,b,d,e,f){if(ax.debug(`callTool: Entering method for server ${a}, tool ${b}`),await this.isInternalServer(a)){if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ax.warn(`callTool: ${b}`),{success:!1,error:b}}let{internalCallToolFor:e}=await c.e(5463).then(c.bind(c,25463)),f=await e(this,a,b,d);return ax.info(`callTool: Dispatched internal tool ${b} on ${a}`),{success:!0,data:f}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ax.warn(`callTool: ${b}`),{success:!1,error:b}}let g=this.getClient(a);if(!g){ax.warn(`callTool: No client for ${a}; forcing reconnect before calling ${b}`);let c=await this.forceReconnect(a);c.success?g=this.clients.get(a):ax.warn(`callTool: Reconnect for ${a} failed: ${c.error}`)}let h=await aj(g,a,b,d,e,f);return ax.info(`callTool: Called tool ${b} on ${a}`),h}async listWithReconnect(a,b,c){if(await this.isInternalServer(a))return c;if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ax.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=this.getClient(a);d||ax.warn(`listWithReconnect: Client not found for ${a}`);let e=await b(d,a);if(!e.error)return e;ax.warn(`listWithReconnect: Listing for ${a} failed (${e.error}); forcing reconnect and retrying once`);let f=await this.forceReconnect(a);return f.success?(d=this.clients.get(a),(e=await b(d,a)).error?ax.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,e.error):ax.info(`listWithReconnect: Recovered after reconnect for ${a}`),e):(ax.warn(`listWithReconnect: Reconnect for ${a} failed: ${f.error}`),{...c,error:f.error||e.error})}async listServerResources(a){if(ax.debug(`listServerResources: Entering method for server ${a}`),a===av._&&await this.isInternalServer(a)){let{internalListResources:a}=await Promise.all([c.e(1373),c.e(7821),c.e(346),c.e(724),c.e(2940),c.e(6537)]).then(c.bind(c,28001));return a()}if(a===aw.K3){let{filesystemListResources:a}=await c.e(793).then(c.bind(c,10793));return a()}return this.listWithReconnect(a,al,{resources:[]})}async listServerResourceTemplates(a){if(ax.debug(`listServerResourceTemplates: Entering method for server ${a}`),a===av._&&await this.isInternalServer(a)){let{internalListResourceTemplates:a}=await Promise.all([c.e(1373),c.e(7821),c.e(346),c.e(724),c.e(2940),c.e(6537)]).then(c.bind(c,28001));return a()}return this.listWithReconnect(a,am,{resourceTemplates:[]})}async readResource(a,b){if(ax.debug(`readResource: Entering method for server ${a}, uri ${b}`),a===av._&&await this.isInternalServer(a)){let{internalReadResource:a}=await Promise.all([c.e(1373),c.e(7821),c.e(346),c.e(724),c.e(2940),c.e(6537)]).then(c.bind(c,28001));return a(b)}if(a===aw.K3){let{filesystemReadResource:a,isFilesystemAppUri:d}=await c.e(793).then(c.bind(c,10793));if(d(b))return a(b)}let d=this.getClient(a);d||ax.warn(`readResource: Client not found for ${a}`);let e=await an(d,a,b);return ax.info(`readResource: Read resource ${b} on ${a}`),e}async listServerPrompts(a){return ax.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,ap,{prompts:[]})}async getPrompt(a,b,c){ax.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=this.getClient(a);d||ax.warn(`getPrompt: Client not found for ${a}`);let e=await aq(d,a,b,c);return ax.info(`getPrompt: Got prompt ${b} on ${a}`),e}async resolveOAuthSecretForSave(a,b){return a===as.RJ?b??"":a?a.startsWith("${global:")||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")?a:await (0,ar.Rs)(a):""}async resolveHeadersForSave(a,b){let c={};for(let[d,e]of Object.entries(a||{})){if(!d)continue;let{value:a,isSecret:f}=(0,Q.at)(e,d);if(!f){""!==a&&(c[d]={value:a,metadata:{isSecret:!1}});continue}if((0,Q.uh)(a)){let a=b?.[d];void 0!==a&&(c[d]=a);continue}if(a){if((0,Q.T6)(a)||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")){c[d]={value:a,metadata:{isSecret:!0}};continue}c[d]={value:await (0,ar.Rs)(a),metadata:{isSecret:!0}}}}return c}async ensureRemoteServerRootDir(a){try{if(!["streamable","sse","websocket"].includes(a.transport))return;let b=(a.rootPath||"").trim();if(!b)return;let c=h().resolve((0,j.getDataDir)(),b);if(h().dirname(c)===c)return;await f().mkdir(c,{recursive:!0}),ax.debug(`ensureRemoteServerRootDir: ensured ${c} for ${a.name}`)}catch(b){ax.warn(`ensureRemoteServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){if(ax.debug(`updateServerConfig: Entering method for server ${a}`),await this.isInternalServer(a)){let c=Object.keys(b).filter(a=>"name"!==a),d=void 0===b.name||b.name===a,e=c.length>0&&c.every(a=>"disabled"===a)&&"boolean"==typeof b.disabled&&d,f=(a===aw.K3||a===aw.PA)&&c.length>0&&c.every(a=>"roots"===a)&&Array.isArray(b.roots)&&d;if(e){await (0,aw.LV)(a,b.disabled),ax.info(`updateServerConfig: Toggled built-in server ${a} disabled=${b.disabled}`);let c=await this.loadServerConfigs();return(Array.isArray(c)?c.find(b=>b.name===a):void 0)??{success:!0}}if(f){await (0,aw.Eu)(a,b.roots),ax.info(`updateServerConfig: Set built-in ${a} roots (${b.roots.length})`);let c=await this.loadServerConfigs();return(Array.isArray(c)?c.find(b=>b.name===a):void 0)??{success:!0}}return{success:!1,error:`"${a}" is a FLUJO built-in server: only enabling/disabling it is allowed, not editing.`}}let c=await this.loadServerConfigs();if(!Array.isArray(c))return ax.warn("updateServerConfig: Failed to load configs:",c.error),c;let d=c.find(b=>b.name===a),e=!!d&&"string"==typeof b.name&&b.name!==a;if(e&&c.some(a=>a.name===b.name))return ax.warn(`updateServerConfig: Refusing to rename ${a} -> ${b.name}: name already in use`),{success:!1,error:`A server named "${b.name}" already exists`};if(!d&&b.name)ax.info(`updateServerConfig: Creating new server config for ${b.name}`),d={name:b.name,transport:"stdio",command:"",args:[],env:{},disabled:!1,autoApprove:[],_buildCommand:"",_installCommand:"",rootPath:""},c.push(d);else if(!d)return ax.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};if(b.env){ax.debug(`updateServerConfig: Resolving global variables in env for ${a}`);try{ax.debug(`Original env variables for ${a}:`,JSON.stringify(b.env,null,2)),b.env=await (0,n.resolveGlobalVars)(b.env),ax.debug(`Resolved env variables for ${a}:`,JSON.stringify(b.env,null,2)),ax.debug(`updateServerConfig: Successfully resolved global variables for ${a}`)}catch(b){ax.warn(`updateServerConfig: Error resolving global variables for ${a}:`,b)}}let f=b.oauthClientSecret;if(void 0!==f){let a=d.oauthClientSecret;b.oauthClientSecret=await this.resolveOAuthSecretForSave(f,a)}let g=b.headers;if(void 0!==g){let a=d.headers;b.headers=await this.resolveHeadersForSave(g,a)}let h={...d};h={...d,...b};let i=JSON.stringify(d.roots??[])!==JSON.stringify(h.roots??[])||(d.rootPath??"")!==(h.rootPath??""),j=c.findIndex(b=>b.name===a);-1!==j?c[j]=h:h.name&&c.push(h);let k=await (0,l.q)(new Map(c.map(a=>[a.name,a])));return k.success?(await this.ensureRemoteServerRootDir(h),e?(this.clients.has(a)?await this.disconnectServer(a):(this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a)),this.stderrLogs.delete(a),this.lastConnectionError.delete(a),await this.handleConnectionStateChange(h.name,h)):await this.handleConnectionStateChange(a,h),i&&this.notifyRootsChanged(h.name),ax.info(`updateServerConfig: Successfully updated config for ${a}${e?` (renamed to ${h.name})`:""}`),h):(ax.warn(`updateServerConfig: Failed to save config for ${a}:`,k.error),k)}async handleConnectionStateChange(a,b){ax.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){ax.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{await this.disconnectServer(a)}catch(b){ax.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(ax.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(ax.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(ax.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){ax.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ax.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(ax.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){ax.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){if(ax.debug(`deleteServerConfig: Entering method for server ${a}`),await this.isInternalServer(a))return{success:!1,error:`"${av._}" is FLUJO's built-in server and cannot be deleted.`};this.clients.has(a)&&(ax.info(`deleteServerConfig: Disconnecting server ${a} before deletion`),await this.disconnectServer(a));let b=await this.loadServerConfigs();if(!Array.isArray(b))return ax.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return ax.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),ax.debug(`deleteServerConfig: Saving updated configs after deleting ${a}`);let d=await (0,l.q)(new Map(b.map(a=>[a.name,a])));return d.success?ax.info(`deleteServerConfig: Successfully deleted server ${a}`):ax.warn(`deleteServerConfig: Error saving configs after deleting ${a}:`,d.error),d}async getServerStatus(a){if(await this.isInternalServer(a))return await this.isServerDisabled(a)?{status:"disconnected"}:{status:"connected"};let b=await this.getServerConfig(a);if(!b)return ax.warn(`getServerStatus: Server ${a} not found`),{status:"error",message:`Server ${a} configuration not found. The server may have been deleted or not properly configured.`};if(b.disabled)return ax.debug(`getServerStatus: Server ${a} is disabled`),{status:"disconnected"};if("streamable"===b.transport&&b.oauthScopes&&b.oauthScopes.length>0){if(!b.oauthTokens||!b.oauthTokens.access_token)return ax.info(`getServerStatus: Server ${a} requires OAuth authentication but has no valid tokens`),{status:"requires_authentication",message:"OAuth authentication required. Click the authenticate button to complete the OAuth flow."};if(!b.oauthTokens.refresh_token&&b.oauthTokens.expires_in&&b.oauthTokens.issued_at){let c=b.oauthTokens.issued_at,d=b.oauthTokens.expires_in;if(Math.floor(Date.now()/1e3)>=c+d)return ax.info(`getServerStatus: OAuth tokens for ${a} have expired and no refresh token is available`),{status:"requires_authentication",message:"OAuth tokens have expired. Please re-authenticate."}}}let c=(this.stderrLogs.get(a)||[]).join("\n").trim(),d=this.lastConnectionError.get(a);if(this.getClient(a))return ax.info(`getServerStatus: Server ${a} is connected`),{status:"connected",stderrOutput:c||void 0};{let b=this.isStartingUp()&&!this.lastConnectionError.has(a);if(this.connectingServers.has(a)||b)return ax.info(`getServerStatus: Server ${a} is still connecting`),{status:"connecting",message:"Server is starting up. This may take a few moments."};if(c&&(c.includes("OAuth authentication required")||c.includes("invalid_token")))return ax.info(`getServerStatus: OAuth authentication error detected for ${a}`),{status:"requires_authentication",message:"OAuth authentication required. Please complete the OAuth flow.",stderrOutput:c};let e=c||d;return e?(ax.info(`getServerStatus: Using ${c?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:e,stderrOutput:c||void 0}):(ax.info(`getServerStatus: No specific error details available for ${a}`),{status:"error",message:`Server ${a} is configured but not connected. The server process may have crashed or been terminated.`,stderrOutput:void 0})}}async startEnabledServers(){ax.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ax.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled);ax.info(`Found ${b.length} enabled servers to start`),ax.debug(`${b}`),b.forEach(a=>this.connectingServers.add(a.name));let c=Math.max(1,Number(process.env.FLUJO_MCP_BOOT_CONCURRENCY)||2);ax.info(`Connecting ${b.length} enabled servers with boot concurrency ${c}`),await k(b,c,async a=>{ax.info(`Starting server: ${a.name}`),await this.connectServer(a).catch(b=>{ax.error(`Failed to start server ${a.name}:`,b)})})}finally{this.setStartingUp(!1)}}async getAvailableClients(){try{let a=await this.loadServerConfigs();if(!a||"error"in a)return ax.warn("getAvailableClients: Failed to load server configs:",a?.error),[];return(await Promise.all(a.map(async a=>{try{let b=await this.getServerStatus(a.name);return{name:a.name,status:"string"==typeof b?b:b.status,connected:"string"==typeof b?"connected"===b:"connected"===b.status}}catch(b){return ax.warn(`getAvailableClients: Error getting status for ${a.name}:`,b),{name:a.name,status:"error",connected:!1}}}))).map(a=>`${a.name} (${a.status})`)}catch(a){return ax.error("getAvailableClients: Error getting available clients:",a),[]}}constructor(){this.stderrLogs=new Map,this.lastConnectionError=new Map,this.inFlightConnects=new Map,this.connectionRetryTimers=new Map,this.connectionRetryAttempts=new Map}}let az=new ay},34079:(a,b,c)=>{"use strict";c.d(b,{T6:()=>f,ak:()=>h,at:()=>g,uh:()=>i,x0:()=>j});var d=c(49680),e=c(1925);function f(a){return"string"==typeof a&&a.startsWith("${global:")}function g(a,b){return a&&"object"==typeof a&&"value"in a?{value:a.value??"",isSecret:!!a.metadata?.isSecret}:{value:a??"",isSecret:(0,e.Hm)(b)}}function h(a){if(!a)return a;let b={};for(let[c,e]of Object.entries(a)){if(!c)continue;let{value:a,isSecret:h}=g(e,c);h&&a&&!f(a)?b[c]={value:d.RJ,metadata:{isSecret:!0}}:e&&"object"==typeof e?b[c]={value:a,metadata:{isSecret:h}}:b[c]=e}return b}function i(a){return a===d.RJ||a===d.gF}function j(a,b){if(!a)return a;let c={};for(let[d,e]of Object.entries(a)){if(!d)continue;let{value:a,isSecret:f}=g(e,d);if(f&&i(a)){let a=b?.[d];void 0!==a&&(c[d]=a);continue}c[d]=e}return c}},39727:()=>{},40829:(a,b,c)=>{"use strict";c.d(b,{GN:()=>l,Rs:()=>j,Tt:()=>k,eS:()=>n,hO:()=>i,nB:()=>h,yg:()=>m});var d=c(50846),e=c(73456),f=c(58739);let g=(0,d.h)("backend/services/model/encryption");async function h(a){g.debug("setEncryptionKey: Entering method"),g.warn("setEncryptionKey: This function is deprecated. Use initializeDefaultEncryption or initializeEncryption from secure.ts instead.");try{return{success:await (0,f.initializeDefaultEncryption)()}}catch(a){return g.warn("setEncryptionKey: Failed to set encryption key:",a),{success:!1,error:a instanceof Error?a.message:"Failed to set encryption key"}}}async function i(){g.debug("initializeDefaultEncryption: Entering method");try{let a=await (0,f.initializeDefaultEncryption)();return a?g.info("initializeDefaultEncryption: Default encryption initialized successfully"):g.error("initializeDefaultEncryption: Failed to initialize default encryption"),a}catch(a){return g.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function j(a){g.debug("encryptApiKey: Entering method");try{if(!a||""===a.trim())return g.warn("encryptApiKey: Empty API key provided"),"";if(!await m()&&(g.warn("encryptApiKey: Encryption is not configured, initializing default encryption"),!await i()))return g.error("encryptApiKey: Failed to initialize default encryption"),`encrypted_failed:${a}`;let b=await (0,f.encryptWithPassword)(a);if(!b)return g.error("encryptApiKey: encryptWithPassword returned null"),`encrypted_failed:${a}`;return`encrypted:${b}`}catch(b){return g.error("encryptApiKey: Failed to encrypt API key:",b),`encrypted_failed:${a}`}}async function k(a){g.debug("decryptApiKey: Entering method");try{if(a&&a.startsWith("${global:"))return(await (0,e.resolveGlobalVars)({key:a})).key;if(a&&a.startsWith("encrypted_failed:"))return a.substring(17);return await (0,f.decryptWithPassword)(a)}catch(a){return g.warn("decryptApiKey: Failed to decrypt API key:",a),null}}async function l(a){g.debug("resolveAndDecryptApiKey: Entering method");try{return await (0,e.G)(a)}catch(a){return g.warn("resolveAndDecryptApiKey: Failed to resolve or decrypt API key:",a),null}}async function m(){g.debug("isEncryptionConfigured: Entering method");try{return await (0,f.isEncryptionInitialized)()}catch(a){return g.warn("isEncryptionConfigured: Failed to check encryption status:",a),!1}}async function n(){g.debug("isUserEncryptionEnabled: Entering method");try{return await (0,f.isUserEncryptionEnabled)()}catch(a){return g.warn("isUserEncryptionEnabled: Failed to check user encryption status:",a),!1}}},41561:(a,b,c)=>{"use strict";c.d(b,{c:()=>e,m:()=>d});let d=50;function e(a){return"number"==typeof a&&Number.isFinite(a)&&a>0?Math.floor(a):void 0}},47990:()=>{},49680:(a,b,c)=>{"use strict";c.d(b,{RJ:()=>e,gF:()=>d});let d="masked:********",e="********"},54042:(a,b,c)=>{"use strict";c.d(b,{normalizeMaxTokens:()=>d.c});var d=c(41561)},62101:(a,b,c)=>{"use strict";c.d(b,{getCompletionAdapter:()=>Y});var d=c(50846),e=c(7573);let f=(0,d.h)("backend/utils/transientRetry"),g=["econnreset","invalid response body","socket hang up","premature close","etimedout"];async function h(a,b={}){let c,{maxAttempts:d=3,baseDelayMs:e=500,signal:i}=b;for(let b=1;b<=d;b++){if(i?.aborted)throw c??new DOMException("Aborted","AbortError");try{return await a()}catch(h){if(!function(a){if(!(a instanceof Error)||"AbortError"===a.name)return!1;let b=a.message.toLowerCase();return g.some(a=>b.includes(a))}(h)||b>=d)throw h;c=h;let a=e*Math.pow(2,b-1);f.warn(`Transient transport error on attempt ${b}/${d}; retrying in ${a} ms`,{message:h instanceof Error?h.message:String(h)}),await new Promise((b,d)=>{let e=setTimeout(b,a);i?.addEventListener("abort",()=>{clearTimeout(e),d(c)},{once:!0})})}}throw c}let i=(0,d.h)("backend/services/model/adapters/openaiAdapter");class j{async createCompletion({model:a,apiKey:b,messages:c,tools:d,temperature:f,maxTokens:g,signal:j}){let k=(0,e.s)({apiKey:b,baseURL:a.baseUrl,defaultHeaders:(0,e.l)(a.provider)}),l={model:a.name,messages:c,temperature:f};return"number"==typeof g&&(l.max_tokens=g),d&&d.length>0&&(l.tools=d),i.debug("createCompletion via OpenAI-compatible API",{model:a.name,baseUrl:a.baseUrl,toolCount:d?.length||0}),{completion:await h(()=>k.chat.completions.create(l,j?{signal:j}:void 0),{signal:j})}}}var k=c(23514);function l(a){return"string"==typeof a?a:Array.isArray(a)?a.filter(a=>!!a&&"text"===a.type).map(a=>a.text).join(""):""}let m=/^data:([^;,]+)(?:;[^,]*)?,([\s\S]*)$/;function n(a){if(!Array.isArray(a))return[];let b=[];for(let c of a){if(!c||"image_url"!==c.type)continue;let a=c.image_url?.url;if(!a)continue;let d=m.exec(a);d&&/;base64/i.test(a)?b.push({url:a,mimeType:d[1],base64:d[2]}):b.push({url:a})}return b}function o(a){switch((a||"").toLowerCase()){case"image/jpeg":case"image/jpg":return"image/jpeg";case"image/gif":return"image/gif";case"image/webp":return"image/webp";default:return"image/png"}}function p(a,b){return"string"!=typeof a||a.length<=b?a??"":`${a.slice(0,b)}…[truncated ${a.length-b} chars]`}function q(a){if(!a)return{};try{let b=JSON.parse(a);return b&&"object"==typeof b?b:{}}catch{return{}}}var r=c(81251);let s=(0,d.h)("backend/services/model/adapters/anthropicAdapter"),t=new Map,u=["claude-opus-4-7","claude-opus-4-8","claude-opus-4-9","claude-fable-4","claude-fable-5","claude-sonnet-5","claude-haiku-5"];async function v(a,b){try{let c=(await a.models.retrieve(b)).capabilities,d=c?.thinking,e=d?.types,f=e?.adaptive;if("boolean"==typeof f?.supported)return!f.supported;return null}catch{return null}}async function w(a,b){let c=a.toLowerCase(),d=t.get(c);if(d&&d.expiresAt>Date.now())return d.supportsTemperature;if(b){let d=await v(b,a);if(null!==d)return t.set(c,{supportsTemperature:d,expiresAt:Date.now()+3e5}),d;s.debug("Anthropic Models API returned no temperature capability info; using static denylist",{model:a})}let e=!u.some(a=>c.includes(a));return b&&t.set(c,{supportsTemperature:e,expiresAt:Date.now()+3e5}),e}function x(a){let b=[],c=[],d=(a,b)=>{let d={type:"tool_result",tool_use_id:a,content:b},e=c[c.length-1];e&&"user"===e.role&&Array.isArray(e.content)&&e.content.every(a=>"tool_result"===a.type)?e.content.push(d):c.push({role:"user",content:[d]})};for(let e of a){if("system"===e.role){let a=l(e.content);a&&b.push(a);continue}if("tool"===e.role){d(e.tool_call_id,l(e.content));continue}if("user"===e.role){let a=l(e.content),b=n(e.content);if(0===b.length){c.push({role:"user",content:a});continue}let d=[];for(let c of(a&&d.push({type:"text",text:a}),b))c.base64?d.push({type:"image",source:{type:"base64",media_type:o(c.mimeType),data:c.base64}}):d.push({type:"image",source:{type:"url",url:c.url}});c.push({role:"user",content:d});continue}if("assistant"===e.role){let a=[],b=l(e.content??"");for(let c of(b&&a.push({type:"text",text:b}),e.tool_calls??[]))"function"===c.type&&a.push({type:"tool_use",id:c.id,name:c.function.name,input:q(c.function.arguments)});c.push({role:"assistant",content:a.length>0?a:b});continue}}return{system:b.length>0?b.join("\n\n"):void 0,messages:c}}function y(a){if(a&&0!==a.length)return a.filter(a=>"function"===a.type).map(a=>({name:a.function.name,description:a.function.description,input_schema:a.function.parameters??{type:"object",properties:{}}}))}function z(a,b){let c="",d=[];for(let a of b.content)"text"===a.type?c+=a.text:"tool_use"===a.type&&d.push({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input??{})}});let e="tool_use"===b.stop_reason?"tool_calls":"max_tokens"===b.stop_reason?"length":"stop";return{id:b.id,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:b.model||a,choices:[{index:0,finish_reason:e,logprobs:null,message:{role:"assistant",content:c||null,refusal:null,...d.length>0?{tool_calls:d}:{}}}],usage:{prompt_tokens:b.usage.input_tokens,completion_tokens:b.usage.output_tokens,total_tokens:b.usage.input_tokens+b.usage.output_tokens}}}class A{async createCompletion({model:a,apiKey:b,messages:c,tools:d,temperature:e,maxTokens:f,signal:g}){let h,i=new k.Ay({apiKey:b,...a.baseUrl?{baseURL:a.baseUrl}:{},timeout:r.l}),{system:j,messages:l}=x(c),m=y(d),n=await w(a.name,i),o={model:a.name,max_tokens:f??8192,...n?{temperature:e}:{},messages:l,...j?{system:j}:{},...m?{tools:m}:{}};s.debug("createCompletion via Anthropic SDK",{model:a.name,toolCount:m?.length||0,hasSystem:!!j});try{h=await i.messages.create(o,g?{signal:g}:void 0)}catch(b){if(b instanceof k.Ay.BadRequestError&&b.message.includes("temperature")&&b.message.toLowerCase().includes("deprecated")&&"temperature"in o){s.warn("Anthropic API rejected temperature for model; retrying without it. Consider adding this model to TEMPERATURE_DEPRECATED_SUBSTRINGS.",{model:a.name});let b={...o};delete b.temperature,h=await i.messages.create(b,g?{signal:g}:void 0)}else throw b}return{completion:z(a.name,h)}}async createStreamCompletion({model:a,apiKey:b,messages:c,tools:d,temperature:e,maxTokens:f,signal:g}){let h,i=new k.Ay({apiKey:b,...a.baseUrl?{baseURL:a.baseUrl}:{},timeout:r.l}),{system:j,messages:l}=x(c),m=y(d),n=await w(a.name,i),o={model:a.name,max_tokens:f??8192,...n?{temperature:e}:{},messages:l,...j?{system:j}:{},...m?{tools:m}:{}};s.debug("createStreamCompletion via Anthropic SDK",{model:a.name,toolCount:m?.length??0,hasSystem:!!j});try{let a=i.messages.stream(o,g?{signal:g}:void 0);h=await a.finalMessage()}catch(b){if(b instanceof k.Ay.BadRequestError&&b.message.includes("temperature")&&b.message.toLowerCase().includes("deprecated")&&"temperature"in o){s.warn("Anthropic API (streaming) rejected temperature for model; retrying without it. Consider adding this model to TEMPERATURE_DEPRECATED_SUBSTRINGS.",{model:a.name});let b={...o};delete b.temperature;let c=i.messages.stream(b,g?{signal:g}:void 0);h=await c.finalMessage()}else throw b}return{completion:z(a.name,h)}}}var B=c(13344),C=c(32524);let D=(0,d.h)("backend/services/model/adapters/geminiAdapter"),E=new Set(["image/png","image/jpeg","image/gif","image/webp"]);async function F(a,b){let c;try{c=new URL(a)}catch{throw Error("invalid URL")}if("http:"!==c.protocol&&"https:"!==c.protocol)throw Error(`unsupported protocol "${c.protocol}"`);if(function(a){let b=a.toLowerCase().replace(/^\[|\]$/g,"");if("localhost"===b||b.endsWith(".localhost")||"::1"===b||"0.0.0.0"===b)return!0;let c=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(b);if(c){let a=Number(c[1]),b=Number(c[2]);if(0===a||127===a||10===a||169===a&&254===b||192===a&&168===b||172===a&&b>=16&&b<=31)return!0}return!!(b.startsWith("fc")||b.startsWith("fd")||b.startsWith("fe80"))}(c.hostname))throw Error("blocked host (private/loopback)");let d=new AbortController,e=setTimeout(()=>d.abort(),3e4),f=()=>d.abort();b&&(b.aborted?d.abort():b.addEventListener("abort",f,{once:!0}));try{let b=await fetch(a,{signal:d.signal,cache:"no-store"});if(!b.ok)throw Error(`HTTP ${b.status}`);let c=b.headers.get("content-type")||"",e=function(a){let b=a.split(";")[0].trim().toLowerCase();return"image/jpg"===b?"image/jpeg":E.has(b)?b:null}(c);if(!e)throw Error(`non-image content-type "${c}"`);let f=b.headers.get("content-length");if(f&&Number(f)>0xa00000)throw Error(`image too large (${f} bytes > 10485760)`);let g=Buffer.from(await b.arrayBuffer());if(g.length>0xa00000)throw Error(`image too large (${g.length} bytes > 10485760)`);return{mimeType:e,data:g.toString("base64")}}finally{clearTimeout(e),b&&b.removeEventListener("abort",f)}}async function G(a,b){let c=[],d=[],e=new Map;for(let f of a){if("system"===f.role){let a=l(f.content);a&&c.push(a);continue}if("user"===f.role){let a=l(f.content),c=[];for(let d of(a&&c.push({text:a}),n(f.content)))if(d.base64&&d.mimeType)c.push({inlineData:{mimeType:d.mimeType,data:d.base64}});else if(d.url)try{let a=await F(d.url,b);c.push({inlineData:a})}catch(a){D.warn("Skipping remote image for Gemini (fetch failed / not an image / too large)",{url:d.url,reason:a instanceof Error?a.message:String(a)})}d.push({role:"user",parts:c.length>0?c:[{text:""}]});continue}if("assistant"===f.role){let a=[],b=l(f.content??"");for(let c of(b&&a.push({text:b}),f.tool_calls??[]))"function"===c.type&&(e.set(c.id,c.function.name),a.push({functionCall:{name:c.function.name,args:q(c.function.arguments)}}));d.push({role:"model",parts:a.length>0?a:[{text:""}]});continue}if("tool"===f.role){let a,b=e.get(f.tool_call_id)||f.tool_call_id,c=l(f.content);try{let b=JSON.parse(c);a=b&&"object"==typeof b&&!Array.isArray(b)?b:{result:b}}catch{a={result:c}}let g={functionResponse:{name:b,response:a}},h=d[d.length-1];h&&"user"===h.role&&Array.isArray(h.parts)&&h.parts.every(a=>"functionResponse"in a)?h.parts.push(g):d.push({role:"user",parts:[g]});continue}}return{systemInstruction:c.length>0?c.join("\n\n"):void 0,contents:d}}class H{async createCompletion({model:a,apiKey:b,messages:c,tools:d,temperature:e,maxTokens:f,signal:g}){let h=new B.M4({apiKey:b,httpOptions:{timeout:r.l}}),{systemInstruction:i,contents:j}=await G(c,g),k=function(a){if(a&&0!==a.length)return a.filter(a=>"function"===a.type).map(a=>({name:a.function.name,description:a.function.description,parametersJsonSchema:a.function.parameters??{type:"object",properties:{}}}))}(d);D.debug("createCompletion via Gemini GenAI SDK",{model:a.name,toolCount:k?.length||0,hasSystem:!!i});let l=await h.models.generateContent({model:a.name,contents:j,config:{temperature:e,..."number"==typeof f?{maxOutputTokens:f}:{},...i?{systemInstruction:i}:{},...k?{tools:[{functionDeclarations:k}]}:{},...g?{abortSignal:g}:{}}});return{completion:function(a,b){let c=b.candidates?.[0],d=c?.content?.parts??[],e="",f=[];for(let a of d)"string"==typeof a.text?e+=a.text:a.functionCall&&f.push({id:`call_${(0,C.A)()}`,type:"function",function:{name:a.functionCall.name??"",arguments:JSON.stringify(a.functionCall.args??{})}});let g=f.length>0?"tool_calls":"stop",h=b.usageMetadata;return{id:`gemini_${(0,C.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a,choices:[{index:0,finish_reason:g,logprobs:null,message:{role:"assistant",content:e||null,refusal:null,...f.length>0?{tool_calls:f}:{}}}],usage:h?{prompt_tokens:h.promptTokenCount??0,completion_tokens:h.candidatesTokenCount??0,total_tokens:h.totalTokenCount??0}:void 0}}(a.name,l)}}}var I=c(24463),J=c(77213),K=c(10522);function L(a,b){return"string"==typeof b&&b?a.describe(b):a}var M=c(55511);let N=new Map;function O(a,b,c){let d=N.get(a);if(d&&d.prefixHash===b&&!(c<d.seenMessageCount))return d}var P=c(41561);let Q=(0,d.h)("backend/services/model/adapters/claudeSubscriptionAdapter"),R=P.m,S="flujo",T=["Bash","BashOutput","KillShell","KillBash","Read","Write","Edit","MultiEdit","NotebookRead","NotebookEdit","Glob","Grep","LS","WebFetch","WebSearch","Task","Agent","TodoWrite","ExitPlanMode"];function U(a){return a.replace(/[^a-zA-Z0-9_-]/g,"_")}function V(a){return a.startsWith("handoff_to_")||"handoff"===a}function W(a,b){let c=[],d=[],e=[],f=!1,g=0,h="",i=new Map;for(let b of a)if("assistant"===b.role&&Array.isArray(b.tool_calls))for(let a of b.tool_calls)"function"===a.type&&i.set(a.id,a.function.name);for(let j of a){if("system"===j.role){let a=l(j.content);a&&c.push(a);continue}if("tool"===j.role){f=!0;let a=i.get(j.tool_call_id)??j.tool_call_id,c=l(j.content??""),e=b?.get(j.tool_call_id)?.result;e&&c.length>4e3?d.push(`Tool result [${a}]: ${c.slice(0,4e3)}
18
+ …
19
+ [full content stored as run resource ${e.uri} — call read_resource with this uri to read it]`):d.push(`Tool result [${a}]: ${p(c,4e3)}`);continue}if("user"!==j.role&&"assistant"!==j.role)continue;let a=l(j.content??"");if(a&&(1==++g&&(h=a),d.push(`${"assistant"===j.role?"Assistant":"Human"}: ${a}`)),"assistant"===j.role&&Array.isArray(j.tool_calls))for(let a of j.tool_calls){if("function"!==a.type)continue;f=!0;let c=a.function.arguments??"",e=b?.get(a.id)?.args;if(e&&c.length>2e3)d.push(`Assistant [tool call] ${a.function.name}(${c.slice(0,2e3)}
20
+ …
21
+ [full arguments stored as run resource ${e.uri} — call read_resource with this uri to read them])`);else{let b=p(c,2e3);d.push(`Assistant [tool call] ${a.function.name}(${b})`)}}"user"===j.role&&e.push(...n(j.content))}let j=!f&&g<=1?h:d.join("\n\n"),k=c.length>0?c.join("\n\n"):void 0;if(0===e.length)return{systemPrompt:k,content:j};let m=[];for(let a of(j&&m.push({type:"text",text:j}),e))a.base64?m.push({type:"image",source:{type:"base64",media_type:o(a.mimeType),data:a.base64}}):m.push({type:"image",source:{type:"url",url:a.url}});return{systemPrompt:k,content:m}}class X{async createCompletion({model:a,apiKey:b,messages:d,tools:e,toolNameMap:f,localToolExecutors:g,maxTurns:h,requestToolApproval:i,onTranscriptMessage:j,signal:k,conversationId:l,nodeId:m,runResourceMarkers:n,sessionResume:o}){var p,q,r,s;let t,u,v,w,x,{query:y,createSdkMcpServer:z,tool:A}=await c.e(2695).then(c.bind(c,32695)),{systemPrompt:B,content:D}=W(d,n),E=l&&m?{key:`${l}::${m}`,prefixHash:function(a,b){let c=(0,M.createHash)("sha256");for(let d of(c.update("sys\0"),c.update(a??""),c.update("\0tools\0"),[...b].sort()))c.update(d),c.update("\0");return c.digest("hex")}(B,(e??[]).filter(a=>"function"===a.type).map(a=>a.function.name))}:void 0,F=D;if(o&&E){let a=O(E.key,E.prefixHash,d.length);if(a&&d.length>a.seenMessageCount){let b=W(d.slice(a.seenMessageCount),n);b.content.length>0&&(u=a.sessionId,F=b.content,Q.debug("Claude subscription resuming session (#154)",{key:E.key,resumeSessionId:u,seenMessageCount:a.seenMessageCount,deltaMessages:d.length-a.seenMessageCount}))}}let G=new Set,H=[],P=!1,X=new AbortController,Y=()=>X.abort();k?.aborted?X.abort():k?.addEventListener("abort",Y,{once:!0});let Z=[],$=Date.now(),_=0,aa=a=>{let b={...a,id:`m_${(0,C.A)()}`,timestamp:$+_++};Z.push(b),j?.(b)},ab=a=>{aa({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.argsJson}}]}),aa({role:"tool",tool_call_id:a.id,content:a.resultContent})},ac=(e??[]).filter(a=>"function"===a.type).map(a=>{var b;let c=a.function.name,d=V(c),e=f?.[c],h=g?.[c];if(!d&&!e&&!h)return null;let i=a.function.description??"",j=(b=a.function.parameters)&&"object"==typeof b?function a(b){let c=b.properties&&"object"==typeof b.properties?b.properties:{},d=new Set(Array.isArray(b.required)?b.required:[]),e={};for(let[b,f]of Object.entries(c)){let c=function b(c){let d;if(!c||"object"!=typeof c)return K.bz();if(Array.isArray(c.enum)&&c.enum.length>0)return c.enum.every(a=>"string"==typeof a)?L(K.k5(c.enum),c.description):L(K.bz(),c.description);let e=c.type;switch(Array.isArray(e)?e.find(a=>"null"!==a):e){case"string":d=K.Yj();break;case"number":d=K.ai();break;case"integer":d=K.ai().int();break;case"boolean":d=K.zM();break;case"array":d=K.YO(b(c.items));break;case"object":d=c.properties&&"object"==typeof c.properties&&Object.keys(c.properties).length>0?K.Ik(a(c)).passthrough():K.g1(K.Yj(),K.bz());break;default:d=K.bz()}return Array.isArray(e)&&e.includes("null")&&(d=d.nullable()),L(d,c.description)}(f);d.has(b)||(c=c.optional()),e[b]=c}return e}(b):{};if(d){let b=!!a.function.parameters?.properties?.task;return A(c,i,j,async a=>(H.push({name:c,args:a??{}}),Q.debug("Claude subscription requested handoff",{tool:c,callIndex:H.length,spawnable:b}),b)?{content:[{type:"text",text:"Worker spawned for this task. Call this tool again right now to spawn another parallel worker (one call per task). When you stop calling it, all spawned workers run concurrently and their merged results come back."}]}:(P=!0,{content:[{type:"text",text:"Handing off."}]}))}if(h)return A(c,i,j,async a=>{let b;Q.debug("Claude subscription local tool call",{tool:c});let d=!1;try{b=JSON.stringify(await h(a??{}))}catch(a){b=`Error: ${a instanceof Error?a.message:String(a)}`,d=!0}return ab({id:`call_${(0,C.A)()}`,name:c,argsJson:JSON.stringify(a??{}),resultContent:b}),d?{content:[{type:"text",text:b}],isError:!0}:{content:[{type:"text",text:b}]}});let{server:k,tool:l,timeout:m}=e,n=function(a,b,c){let d=`${U(a)}__${U(b)}`;d.length>110&&(d=d.slice(0,110));let e=d,f=2;for(;c.has(e);){let a=`_${f++}`;e=d.slice(0,110-a.length)+a}return c.add(e),e}(k,l,G);return A(n,i,j,async a=>{let b,c;Q.debug("Claude subscription tool call",{server:k,tool:l,exposedAs:n});let d=await I.mcpService.callTool(k,l,a??{},m??J.aI);return d.success?(b=d.data,c=JSON.stringify(d.data)):b={content:[{type:"text",text:c=`Error: ${d.error??"Unknown error"}`}],isError:!0},ab({id:`call_${(0,C.A)()}`,name:n,argsJson:JSON.stringify(a??{}),resultContent:c}),b})}).filter(a=>null!==a),ad=ac.length>0?{[S]:z({name:S,version:"1.0.0",tools:ac})}:void 0,ae={...process.env};ae.CLAUDE_CODE_OAUTH_TOKEN=b,delete ae.ANTHROPIC_API_KEY;let af="string"!=typeof F;Q.debug("createCompletion via Claude Agent SDK",{model:a.name,toolCount:ac.length,hasSystem:!!B,hasImages:af,maxTurns:h&&h>0?h:R});let ag=y({prompt:async function*(){yield{type:"user",parent_tool_use_id:null,message:{role:"user",content:F}}}(),options:{model:a.name,env:ae,abortController:X,maxTurns:h&&h>0?h:R,...u?{resume:u}:{},...B?{systemPrompt:B}:{},tools:[],disallowedTools:T,...ad?{mcpServers:ad}:{},canUseTool:async(a,b,c)=>{if(!a.startsWith(`mcp__${S}__`))return{behavior:"deny",message:`Tool ${a} is not permitted for this node.`};if(i){let d=a.replace(`mcp__${S}__`,"");return await i({id:c.toolUseID,name:d,args:b??{}})?{behavior:"allow",updatedInput:b}:(ab({id:c.toolUseID,name:d,argsJson:JSON.stringify(b??{}),resultContent:"Tool call rejected by the user."}),{behavior:"deny",message:"Tool call rejected by the user."})}return{behavior:"allow",updatedInput:b}}}}),ah="",ai="",aj=0,ak=!1,al=async()=>{for await(let a of ag){let b=a.session_id;if("string"==typeof b&&b&&(t=b),k?.aborted)break;if(H.length>0&&(P||H.length>=32)){X.abort();break}if("assistant"===a.type){let b=a.message,c=b?.content,d="",e=0;if(Array.isArray(c)){for(let a of c)if(a?.type==="text"&&"string"==typeof a.text&&(d+=a.text),a?.type==="tool_use"&&"string"==typeof a.name){let b=a.name;V(b.includes("__")?b.slice(b.lastIndexOf("__")+2):b)&&e++}}if(H.length>0&&0===e){X.abort();break}d&&0===H.length&&(ai+=d,aa({role:"assistant",content:d}),ak=!0),b?.usage&&(w=b.usage,aj+=b.usage.output_tokens??0)}else if("result"===a.type){if(v=a.usage,"success"===a.subtype)ah=a.result??"";else if(0===H.length){let b=a.errors,c=Array.isArray(b)&&b.length?b.join("; "):a.subtype;throw Error(`Claude subscription run failed: ${c}`)}}}};try{if(k){let a,b=new Promise((b,c)=>{a=()=>c(Error("Claude subscription run cancelled by user.")),k.addEventListener("abort",a,{once:!0})}),c=al();try{await Promise.race([c,b])}finally{a&&k.removeEventListener("abort",a),c.catch(()=>{})}if(k.aborted&&0===H.length)throw Error("Claude subscription run cancelled by user.")}else await al()}catch(a){if(0===H.length)throw E&&(p=E.key,N.delete(p)),a}finally{k?.removeEventListener("abort",Y)}let am=ah||ai,{promptTokens:an,completionTokens:ao,cacheReadTokens:ap}=function(a,b){let c=a??b?.lastTurnUsage,d=c?.input_tokens??0,e=c?.cache_creation_input_tokens??0,f=c?.cache_read_input_tokens??0;return{promptTokens:d+e+f,completionTokens:a?a.output_tokens??0:b?.totalOutputTokens??0,cacheReadTokens:f}}(v,{lastTurnUsage:w,totalOutputTokens:aj});if(H.length>0&&(x=H.map(a=>({id:`call_${(0,C.A)()}`,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args)}}))),x?aa({role:"assistant",content:null,tool_calls:x}):ak||aa({role:"assistant",content:am||""}),E){let a=!!O(E.key,E.prefixHash,d.length);H.length>0||!t?(q=E.key,N.delete(q)):(r=E.key,s={sessionId:t,prefixHash:E.prefixHash,seenMessageCount:d.length+Z.length},N.set(r,{...s,updatedAt:Date.now()})),Q.debug("Claude session usage (#154)",{conversationId:l,nodeId:m,sessionResume:!!o,resumedThisTurn:!!u,reusableSessionAvailable:a,capturedSession:!!t,inputMessages:d.length,transcriptMessages:Z.length,watermark:d.length+Z.length,promptTokens:an,cacheReadTokens:ap,completionTokens:ao,endedByHandoff:H.length>0})}return{completion:{id:`claude_sub_${(0,C.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.name,choices:[{index:0,finish_reason:x?"tool_calls":"stop",logprobs:null,message:{role:"assistant",content:am||null,refusal:null,...x?{tool_calls:x}:{}}}],usage:{prompt_tokens:an,completion_tokens:ao,total_tokens:an+ao,...ap>0?{prompt_tokens_details:{cached_tokens:ap}}:{}}},transcript:Z}}}function Y(a){switch(a.adapter){case"anthropic":return new A;case"gemini":return new H;case"claude-cli":return new X;default:return new j}}},62850:(a,b,c)=>{"use strict";c.d(b,{FP:()=>p,eS:()=>j,getNodeRoots:()=>k,sG:()=>o});var d=c(79551),e=c(68780),f=c(50846),g=c(73456);let h=(0,f.h)("backend/services/mcp/roots");function i(){return global.__mcp_node_roots}function j(a,b,c){let d=(c??[]).filter(a=>"string"==typeof a&&a.trim().length>0),e=i().get(b),f=new Set([a]);e&&f.add(e.serverName);let g=new Map;for(let a of f)g.set(a,k(a));0===d.length?i().delete(b)&&h.debug(`Cleared node roots for node ${b}`):(i().set(b,{serverName:a,roots:d}),h.debug(`Registered ${d.length} node root(s) for node ${b} on server ${a}`));let j=[];for(let a of f){let b=k(a),c=g.get(a)??[];(b.length!==c.length||b.some((a,b)=>a!==c[b]))&&j.push(a)}return j}function k(a){let b=[];for(let c of i().values())if(c.serverName===a)for(let a of c.roots)b.includes(a)||b.push(a);return b}async function l(a){let b=function(a){let b=a.trim();if(!b)return null;if(b.startsWith("file://"))return b;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(b))return h.warn(`Ignoring non-file root URI: ${b}`),null;try{return(0,d.pathToFileURL)(b).href}catch(a){return h.warn(`Could not convert root "${b}" to a file URI:`,a),null}}(await (0,g.resolveGlobalVars)(a));return b?{uri:b,name:function(a){try{let b=new URL(a).pathname.replace(/\/+$/,"").split("/").pop();return b?decodeURIComponent(b):void 0}catch{return}}(b)}:null}async function m(a){let b=a.roots,c=[...Array.isArray(b)?b:[],...k(a.name)],d=[],e=new Set;for(let a of c){if("string"!=typeof a||!a.trim())continue;let b=await l(a);b&&!e.has(b.uri)&&(e.add(b.uri),d.push(b))}if(0===d.length&&"string"==typeof a.rootPath&&a.rootPath.trim()){let b=await l(a.rootPath);if(b)return[b]}return d}async function n(a){try{let{loadServerConfigs:b}=await Promise.resolve().then(c.bind(c,74186)),d=await b();if(Array.isArray(d)){let b=d.find(b=>b.name===a.name);if(b)return b}}catch(b){h.warn(`Could not re-load config for ${a.name}, using connect-time config:`,b)}return a}function o(a){return async()=>{let b=await m(await n(a));return h.debug(`roots/list for ${a.name}: ${b.length} root(s)`),{roots:b}}}function p(a,b){a.setRequestHandler(e.WQ,o(b))}void 0===global.__mcp_node_roots&&(global.__mcp_node_roots=new Map)},76054:(a,b,c)=>{"use strict";c.d(b,{n:()=>g});let d=(0,c(50846).h)("utils/mcp/oauthProbe");async function e(a){let b=(await fetch(a,{method:"POST",headers:{"content-type":"application/json",accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:0,method:"initialize",params:{}}),signal:AbortSignal.timeout(5e3)})).headers.get("www-authenticate")||"",c=/\bbearer\b/i.test(b),d=b.match(/resource_metadata\s*=\s*"([^"]+)"/i);return{bearer:c,resourceMetadataUrl:d?.[1]}}async function f(a){let b=await fetch(a,{headers:{accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!b.ok)return;let c=await b.json(),d=Array.isArray(c.authorization_servers);if(d||"string"==typeof c.resource)return{authorizationServers:d?c.authorization_servers.filter(a=>"string"==typeof a):void 0}}async function g(a){try{let b=new URL(a).origin,c=await e(a).catch(b=>(d.debug(`readAuthChallenge failed for ${a}: ${b instanceof Error?b.message:String(b)}`),{bearer:!1,resourceMetadataUrl:void 0})),g=[];for(let e of(c.resourceMetadataUrl&&g.push(c.resourceMetadataUrl),g.push(new URL("/.well-known/oauth-protected-resource",b).toString()),g)){let b=await f(e).catch(()=>void 0);if(b)return d.info(`OAuth capability confirmed for ${a} via ${e}`),{oauthCapable:!0,resourceMetadataUrl:e,authorizationServers:b.authorizationServers}}if(c.bearer)return d.info(`OAuth capability inferred for ${a} from a Bearer challenge (no resource metadata)`),{oauthCapable:!0,resourceMetadataUrl:c.resourceMetadataUrl};return d.debug(`No OAuth capability detected for ${a}`),{oauthCapable:!1}}catch(b){return d.debug(`probeOAuthSupport failed for ${a}: ${b instanceof Error?b.message:String(b)}`),{oauthCapable:!1}}}},77213:(a,b,c)=>{"use strict";c.d(b,{VL:()=>d,aI:()=>e});let d="mcp-servers",e=300},81251:(a,b,c)=>{"use strict";c.d(b,{l:()=>d});let d=18e6},81495:(a,b,c)=>{"use strict";c.d(b,{_:()=>d,z:()=>e});let d="flujo";function e(){return{name:d,transport:"stdio",command:"",args:[],env:{},disabled:!1,autoApprove:[],rootPath:"",_buildCommand:"",_installCommand:"",builtIn:!0,exposeAsMcpServer:!0}}}};