flujo-ai 3.33.0 → 3.34.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 (298) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +240 -240
  3. package/.next/app-path-routes-manifest.json +14 -14
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +21 -21
  6. package/.next/react-loadable-manifest.json +3 -3
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_not-found.html +1 -1
  9. package/.next/server/app/_not-found.rsc +2 -2
  10. package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
  11. package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/approvals/route.js.nft.json +1 -1
  13. package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  15. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
  18. package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/encryption/secure/route.js +1 -1
  21. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  22. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  25. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
  29. package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/flow/compile/route.js +1 -1
  31. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  32. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/flow/generate/route.js +1 -1
  34. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  35. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/flow/generator/route.js +25 -4
  37. package/.next/server/app/api/flow/generator/route.js.nft.json +1 -1
  38. package/.next/server/app/api/flow/generator/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/flow/improve/route.js +1 -1
  40. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  41. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  43. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  45. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/flow/repair/route.js +1 -1
  47. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  48. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  50. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/init/route.js +1 -1
  53. package/.next/server/app/api/init/route.js.nft.json +1 -1
  54. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/mcp/app-sandbox/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  60. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -1
  62. package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  74. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  80. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  82. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  91. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/model/route.js.nft.json +1 -1
  93. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  95. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  99. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/packages/build/route.js +1 -1
  101. package/.next/server/app/api/packages/build/route.js.nft.json +1 -1
  102. package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
  104. package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
  106. package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
  108. package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
  110. package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/packages/resolve/route.js +1 -1
  112. package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
  113. package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
  115. package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/packages/search/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
  118. package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  120. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  122. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  124. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
  127. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  128. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/planned-executions/route.js +1 -1
  130. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  131. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/registry/feedback/route.js +1 -1
  136. package/.next/server/app/api/registry/feedback/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/registry/packages/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  143. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  145. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
  148. package/.next/server/app/api/telemetry/daily-active/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/waves/route.js +1 -1
  151. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  152. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  154. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  155. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/chat/page.js +1 -1
  157. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  158. package/.next/server/app/chat.html +1 -1
  159. package/.next/server/app/chat.rsc +3 -3
  160. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  161. package/.next/server/app/docs.html +1 -1
  162. package/.next/server/app/docs.rsc +2 -2
  163. package/.next/server/app/executions/page.js +2 -2
  164. package/.next/server/app/executions/page.js.nft.json +1 -1
  165. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  166. package/.next/server/app/executions.html +1 -1
  167. package/.next/server/app/executions.rsc +3 -3
  168. package/.next/server/app/flows/page.js +3 -3
  169. package/.next/server/app/flows/page.js.nft.json +1 -1
  170. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  171. package/.next/server/app/flows.html +1 -1
  172. package/.next/server/app/flows.rsc +3 -3
  173. package/.next/server/app/index.html +1 -1
  174. package/.next/server/app/index.rsc +3 -3
  175. package/.next/server/app/mcp/page.js +1 -1
  176. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  177. package/.next/server/app/mcp-flows/route.js +1 -1
  178. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  179. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  181. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  182. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/mcp.html +1 -1
  184. package/.next/server/app/mcp.rsc +3 -3
  185. package/.next/server/app/models/page.js +1 -1
  186. package/.next/server/app/models/page.js.nft.json +1 -1
  187. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  188. package/.next/server/app/packages/page.js +1 -1
  189. package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/packages.html +1 -1
  191. package/.next/server/app/packages.rsc +3 -3
  192. package/.next/server/app/page.js +4 -2
  193. package/.next/server/app/page_client-reference-manifest.js +1 -1
  194. package/.next/server/app/settings/page.js +1 -1
  195. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  196. package/.next/server/app/settings.html +1 -1
  197. package/.next/server/app/settings.rsc +3 -3
  198. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  199. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  201. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  203. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  205. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  207. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  209. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  211. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -1
  213. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  216. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  218. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  220. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
  222. package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  224. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/waves.html +1 -1
  227. package/.next/server/app/waves.rsc +2 -2
  228. package/.next/server/app-paths-manifest.json +14 -14
  229. package/.next/server/chunks/1114.js +1 -1
  230. package/.next/server/chunks/1226.js +1 -1
  231. package/.next/server/chunks/1227.js +1 -1
  232. package/.next/server/chunks/166.js +5 -5
  233. package/.next/server/chunks/1664.js +1 -1
  234. package/.next/server/chunks/227.js +1 -1
  235. package/.next/server/chunks/2273.js +1 -1
  236. package/.next/server/chunks/3717.js +1 -0
  237. package/.next/server/chunks/4466.js +1 -1
  238. package/.next/server/chunks/4551.js +1 -1
  239. package/.next/server/chunks/4771.js +1 -1
  240. package/.next/server/chunks/519.js +2 -0
  241. package/.next/server/chunks/5285.js +1 -0
  242. package/.next/server/chunks/5309.js +78 -0
  243. package/.next/server/chunks/544.js +4 -4
  244. package/.next/server/chunks/5463.js +1 -1
  245. package/.next/server/chunks/5544.js +4 -4
  246. package/.next/server/chunks/{5708.js → 6041.js} +1 -1
  247. package/.next/server/chunks/6747.js +42 -13
  248. package/.next/server/chunks/7628.js +1 -1
  249. package/.next/server/chunks/7630.js +11 -0
  250. package/.next/server/chunks/8284.js +42 -0
  251. package/.next/server/chunks/8645.js +1 -1
  252. package/.next/server/chunks/9235.js +25 -4
  253. package/.next/server/instrumentation.js.nft.json +1 -1
  254. package/.next/server/middleware-build-manifest.js +1 -1
  255. package/.next/server/middleware-manifest.json +1 -1
  256. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  257. package/.next/server/pages/404.html +1 -1
  258. package/.next/server/pages/500.html +1 -1
  259. package/.next/server/server-reference-manifest.js +1 -1
  260. package/.next/server/server-reference-manifest.json +1 -1
  261. package/.next/static/chunks/2005.4eea65c00d9a29cd.js +1 -0
  262. package/.next/static/chunks/3429-34fb1a84aed96703.js +1 -0
  263. package/.next/static/chunks/{2005-f9d38c39f10c321f.js → 4386-e9621d3c94969a68.js} +1 -1
  264. package/.next/static/chunks/4919-6c8a48e3cc642349.js +1 -0
  265. package/.next/static/chunks/7561-2b366ddcbc3cc0ec.js +1 -0
  266. package/.next/static/chunks/8404-5aa8ea49197b98b8.js +1 -0
  267. package/.next/static/chunks/{8650-41c2afc0eba37fb8.js → 8650-5294c6ed1173b014.js} +1 -1
  268. package/.next/static/chunks/app/chat/{page-1d100e5d974c919e.js → page-bc7807593b8b7394.js} +1 -1
  269. package/.next/static/chunks/app/executions/page-8296fd69c439ccee.js +1 -0
  270. package/.next/static/chunks/app/flows/page-87fb466e491fc068.js +1 -0
  271. package/.next/static/chunks/app/{layout-38b88f3b057f4852.js → layout-abed1f211e03152f.js} +1 -1
  272. package/.next/static/chunks/app/mcp/page-1648e6fde0c41461.js +1 -0
  273. package/.next/static/chunks/app/models/{page-808c0568ebc5e2c7.js → page-a5e2437356b06db8.js} +1 -1
  274. package/.next/static/chunks/app/packages/page-fba5696f33d9cdfb.js +1 -0
  275. package/.next/static/chunks/app/page-2f9da78a4891731a.js +1 -0
  276. package/.next/static/chunks/app/settings/page-2fc3a70bfd25c48b.js +1 -0
  277. package/.next/static/chunks/{webpack-dccb4f149ebdedcc.js → webpack-d5d737ff6a86674f.js} +1 -1
  278. package/.next/trace +10 -10
  279. package/README.md +16 -15
  280. package/package.json +5 -5
  281. package/.next/server/chunks/2985.js +0 -1
  282. package/.next/server/chunks/4366.js +0 -2
  283. package/.next/server/chunks/5040.js +0 -48
  284. package/.next/server/chunks/8187.js +0 -78
  285. package/.next/server/chunks/8851.js +0 -1
  286. package/.next/static/chunks/289-98f50bfcf833d661.js +0 -1
  287. package/.next/static/chunks/3089.df88f3b16898aad7.js +0 -1
  288. package/.next/static/chunks/8041-05830e887c133085.js +0 -1
  289. package/.next/static/chunks/8404-bfa9203e4296f3fb.js +0 -1
  290. package/.next/static/chunks/95-b9691d3cb15556dc.js +0 -1
  291. package/.next/static/chunks/app/executions/page-10ec7d58c7fbdd6f.js +0 -1
  292. package/.next/static/chunks/app/flows/page-9a78a2915268b2f8.js +0 -1
  293. package/.next/static/chunks/app/mcp/page-56b43b2f8752e9a5.js +0 -1
  294. package/.next/static/chunks/app/packages/page-af6ec89522915206.js +0 -1
  295. package/.next/static/chunks/app/page-30bf4293efa47a47.js +0 -1
  296. package/.next/static/chunks/app/settings/page-59ae1b658838f0bc.js +0 -1
  297. /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → Zz_Vh59XdtLIPcf-PxCpo}/_buildManifest.js +0 -0
  298. /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → Zz_Vh59XdtLIPcf-PxCpo}/_ssgManifest.js +0 -0
@@ -69,10 +69,10 @@ ${c}
69
69
  </conversation_history>`):h<=1?i:e.join("\n\n"),l=d.length>0?d.join("\n\n"):void 0;if(0===f.length)return{systemPrompt:l,content:k};let m=[];for(let a of(k&&m.push({type:"text",text:k}),f))a.base64?m.push({type:"image",source:{type:"base64",media_type:G(a.mimeType),data:a.base64}}):m.push({type:"image",source:{type:"url",url:a.url}});return{systemPrompt:l,content:m}}class av{async createCompletion({model:a,apiKey:b,messages:d,tools:e,toolNameMap:f,localToolExecutors:g,maxTurns:h,requestToolApproval:j,onTranscriptMessage:k,onModelDelta:l,signal:m,conversationId:n,nodeId:o,runResourceMarkers:p,sessionResume:q}){var r,s,t,u;let v,w,x,y,z,{query:A,createSdkMcpServer:B,tool:C}=await c.e(2695).then(c.bind(c,32695)),{systemPrompt:D,content:E}=au(d,p),F=function(a){let b=0;for(let c of a){if("system"!==c.role)break;b++}return b}(d),G=n&&o?{key:`${n}::${o}`,prefixHash:function(a,b){let c=(0,aj.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")}(D,(e??[]).filter(a=>"function"===a.type).map(a=>a.function.name))}:void 0,H=E;if(q&&G){let a=al(G.key,G.prefixHash,d.length,F);if(a&&d.length>a.seenMessageCount){let b=au(d.slice(a.seenMessageCount),p);b.content.length>0&&(w=a.sessionId,H=b.content,an.debug("Claude subscription resuming session (#154)",{key:G.key,resumeSessionId:w,seenMessageCount:a.seenMessageCount,deltaMessages:d.length-a.seenMessageCount}))}}let I=new Set,J=new Map,K=[],L=!1,M=new AbortController,N=()=>M.abort();m?.aborted?M.abort():m?.addEventListener("abort",N,{once:!0});let O=[],P=Date.now(),Q=0,R=(a,b=`m_${(0,i.A)()}`)=>{let c={...a,id:b,timestamp:P+Q++};O.push(c),k?.(c)},S=(a,b)=>{R({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.argsJson}}]},b)},T=a=>{R({role:"tool",tool_call_id:a.id,content:a.resultContent,...a.ui?{ui:a.ui}:{}})},U=new Map,V=new Set,W=new Map,X=(a,b)=>{let c=U.get(a),d=JSON.stringify(b??{}),e=c?.findIndex(a=>a.argsJson===d)??-1,[f]=e>=0?c.splice(e,1):[],g=f?.id??c?.shift()?.id??`call_${(0,i.A)()}`;return c?.length===0&&U.delete(a),V.has(g)||(S({id:g,name:a,argsJson:d},W.get(g)),V.add(g)),g},Y=(e??[]).filter(a=>"function"===a.type).map(a=>{let b=a.function.name,c=at(b),d=f?.[b],e=g?.[b];if(!c&&!d&&!e)return null;let{shape:h,fallbackSchema:i}=function(a){if(!ae(a))return{shape:{}};let b=af(a);if(ae(a.properties)&&Object.keys(a.properties).length>0)return{shape:ai(a,b)};if(!("string"==typeof a.$ref||Array.isArray(a.allOf)||Array.isArray(a.anyOf)||Array.isArray(a.oneOf)||"if"in a))return{shape:{}};let c=ah(a,b);return c instanceof ad.bv?{shape:c.shape,fallbackSchema:b.fallback.hit?a:void 0}:{shape:{value:c},fallbackSchema:a}}(a.function.parameters),j=function(a,b){if(!b)return a;let c=JSON.stringify(b),d=`The parameters follow this JSON Schema (a composed/conditional schema that cannot be fully expressed as simple parameters) — follow it exactly:
70
70
  ${c}`;return a?`${a}
71
71
 
72
- ${d}`:d}(a.function.description??"",i);if(c){let c=!!a.function.parameters?.properties?.task;return C(b,j,h,async a=>(K.push({name:b,args:a??{}}),an.debug("Claude subscription requested handoff",{tool:b,callIndex:K.length,spawnable:c}),c)?{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."}]}:(L=!0,{content:[{type:"text",text:"Handing off."}]}))}if(e)return C(b,j,h,async a=>{let c;an.debug("Claude subscription local tool call",{tool:b});let d=X(b,a),f=!1;try{c=JSON.stringify(await e(a??{}))}catch(a){c=`Error: ${a instanceof Error?a.message:String(a)}`,f=!0}return T({id:d,resultContent:c}),f?{content:[{type:"text",text:c}],isError:!0}:{content:[{type:"text",text:c}]}});let{server:k,tool:l,timeout:m,nodeId:o,uiResourceUri:p}=d,q=function(a,b,c){let d=`${as(a)}__${as(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,I);return J.set(q,{serverName:k,toolName:l,advertisedUri:p}),C(q,j,h,async a=>{let b,c;an.debug("Claude subscription tool call",{server:k,tool:l,exposedAs:q});let d=X(q,a),e=await $.mcpService.callTool(k,l,a??{},m??ac.aI,void 0,o,M.signal,"model");if(e.success){if(b=e.data,c=JSON.stringify(e.data),n)try{let a=await (0,_.jR)(),e=await (0,aa.S)({conversationId:n,toolCallId:d,server:k,toolName:l,nodeId:o,content:c,settings:a});e.spilled&&(c=e.content,b={content:[{type:"text",text:e.content}]})}catch(a){an.warn("boundToolResult failed on subscription path; keeping full result",a)}}else b={content:[{type:"text",text:c=`Error: ${e.error??"Unknown error"}`}],isError:!0};let f=await (0,ab.K)(k,l,p,e.data),g=(0,ab.A)(e),h=f?{...f,...!e.success?{isError:!0}:{},...g?{cancelledReason:g}:{}}:void 0;return T({id:d,resultContent:c,...h?{ui:h}:{}}),b})}).filter(a=>null!==a),Z=Y.length>0?{[ap]:B({name:ap,version:"1.0.0",tools:Y})}:void 0,ag={...process.env};ag.CLAUDE_CODE_OAUTH_TOKEN=b,delete ag.ANTHROPIC_API_KEY;let am="string"!=typeof H;an.debug("createCompletion via Claude Agent SDK",{model:a.name,toolCount:Y.length,hasSystem:!!D,hasImages:am,maxTurns:h&&h>0?h:ao});let av=A({prompt:async function*(){yield{type:"user",parent_tool_use_id:null,message:{role:"user",content:H}}}(),options:{model:a.name,env:ag,abortController:M,maxTurns:h&&h>0?h:ao,includePartialMessages:!0,...a.reasoningEffort&&"minimal"!==a.reasoningEffort&&"ultra"!==a.reasoningEffort?{effort:a.reasoningEffort}:{},...w?{resume:w}:{},...D?{systemPrompt:D}:{},tools:[],disallowedTools:aq,...Z?{mcpServers:Z}:{},canUseTool:async(a,b,c)=>{if(!a.startsWith(`mcp__${ap}__`))return{behavior:"deny",message:`Tool ${a} is not permitted for this node.`};let d=a.replace(`mcp__${ap}__`,""),e=b??{};if(at(d)||V.has(c.toolUseID)||(S({id:c.toolUseID,name:d,argsJson:JSON.stringify(e)},W.get(c.toolUseID)),V.add(c.toolUseID),((a,b,c)=>{let d=U.get(a)??[];d.push({id:b,argsJson:c}),U.set(a,d)})(d,c.toolUseID,JSON.stringify(e))),j){let{approved:a,feedback:f}=await j({id:c.toolUseID,name:d,args:e});if(a)return{behavior:"allow",updatedInput:b};let g=f?`User rejected this tool call: ${f}`:"Tool call rejected by the user.",h=U.get(d);if(h){let a=h.findIndex(a=>a.id===c.toolUseID);a>=0&&h.splice(a,1),0===h.length&&U.delete(d)}let i=J.get(d),k=i?await (0,ab.K)(i.serverName,i.toolName,i.advertisedUri):void 0;return T({id:c.toolUseID,resultContent:g,...k?{ui:{...k,cancelledReason:g,isError:!0}}:{}}),{behavior:"deny",message:g}}return{behavior:"allow",updatedInput:b}}}}),aw="",ax="",ay=0,az=!1,aA=new Map,aB=async()=>{for await(let a of av){let b=a.session_id;if("string"==typeof b&&b&&(v=b),m?.aborted)break;if(K.length>0&&(L||K.length>=32)){M.abort();break}if("stream_event"===a.type){let b=a.event;if("content_block_start"===b.type&&"tool_use"===b.content_block.type){let c=`stream_claude_${a.uuid}_tool_${b.index}`;aA.set(`${a.uuid}:${b.index}`,{messageId:c,toolUseId:b.content_block.id}),W.set(b.content_block.id,c),l?.({messageId:c,toolCallDelta:{index:0,id:b.content_block.id,nameDelta:b.content_block.name}})}else if("content_block_delta"===b.type){if("text_delta"===b.delta.type&&b.delta.text)l?.({messageId:`stream_claude_${a.uuid}`,contentDelta:b.delta.text});else if("input_json_delta"===b.delta.type&&b.delta.partial_json){let c=aA.get(`${a.uuid}:${b.index}`);c&&l?.({messageId:c.messageId,toolCallDelta:{index:0,argumentsDelta:b.delta.partial_json}})}}}else 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;at(b.includes("__")?b.slice(b.lastIndexOf("__")+2):b)&&e++}}if(K.length>0&&0===e){M.abort();break}d&&0===K.length&&(ar(d)?an.warn("Quarantined malformed Claude tool-call prose (#298)"):(ax+=d,R({role:"assistant",content:d},`stream_claude_${a.uuid}`),az=!0)),b?.usage&&(y=b.usage,ay+=b.usage.output_tokens??0)}else if("result"===a.type){if(x=a.usage,"success"===a.subtype)aw=a.result??"";else if(0===K.length){let b=a.errors,c=Array.isArray(b)&&b.length?b.join("; "):a.subtype;throw Error(`Claude subscription run failed: ${c}`)}}}};try{if(m){let a,b=new Promise((b,c)=>{a=()=>c(Error("Claude subscription run cancelled by user.")),m.addEventListener("abort",a,{once:!0})}),c=aB();try{await Promise.race([c,b])}finally{a&&m.removeEventListener("abort",a),c.catch(()=>{})}if(m.aborted&&0===K.length)throw Error("Claude subscription run cancelled by user.")}else await aB()}catch(a){if(0===K.length)throw G&&(r=G.key,ak.delete(r)),a}finally{m?.removeEventListener("abort",N)}let aC=aw||ax,{promptTokens:aD,completionTokens:aE,cacheReadTokens:aF}=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}}(x,{lastTurnUsage:y,totalOutputTokens:ay});if(K.length>0&&(z=K.map(a=>({id:`call_${(0,i.A)()}`,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args)}}))),z?R({role:"assistant",content:null,tool_calls:z}):az||R({role:"assistant",content:aC||""}),G){let a=!!al(G.key,G.prefixHash,d.length,F);K.length>0||!v?(s=G.key,ak.delete(s)):(t=G.key,u={sessionId:v,prefixHash:G.prefixHash,seenMessageCount:d.length+O.length,leadingSystemMessageCount:F},ak.set(t,{...u,updatedAt:Date.now()})),an.debug("Claude session usage (#154)",{conversationId:n,nodeId:o,sessionResume:!!q,resumedThisTurn:!!w,reusableSessionAvailable:a,capturedSession:!!v,inputMessages:d.length,leadingSystemMessageCount:F,transcriptMessages:O.length,watermark:d.length+O.length,promptTokens:aD,cacheReadTokens:aF,completionTokens:aE,endedByHandoff:K.length>0})}return{completion:{id:`claude_sub_${(0,i.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.name,choices:[{index:0,finish_reason:z?"tool_calls":"stop",logprobs:null,message:{role:"assistant",content:aC||null,refusal:null,...z?{tool_calls:z}:{}}}],usage:{prompt_tokens:aD,completion_tokens:aE,total_tokens:aD+aE,...aF>0?{prompt_tokens_details:{cached_tokens:aF}}:{}}},transcript:O}}}var aw=c(21820),ax=c.n(aw),ay=c(33873),az=c.n(ay),aA=c(29021),aB=c(81630),aC=c.n(aB),aD=c(85853),aE=c(37464),aF=c(68780);let aG=(0,d.h)("backend/services/model/adapters/codexToolBridge");async function aH(a,b){let c=(0,aj.randomBytes)(16).toString("hex"),d=`/mcp/${c}`,e=aC().createServer(async(c,e)=>{if(!c.url||!c.url.startsWith(d))return void e.writeHead(404).end();let f=(()=>{let c=new aD.g({name:"flujo",version:"1.0.0"},{capabilities:{tools:{}},...b?{instructions:b}:{}});return c.setRequestHandler(aF.gW,async()=>({tools:a.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema??{type:"object",properties:{}},...a.annotations?{annotations:a.annotations}:{}}))})),c.setRequestHandler(aF.FT,async b=>{let c=a.find(a=>a.name===b.params.name);if(!c)return{content:[{type:"text",text:`Unknown tool: ${b.params.name}`}],isError:!0};try{return await c.handler(b.params.arguments??{})}catch(a){return{content:[{type:"text",text:`Error: ${a instanceof Error?a.message:String(a)}`}],isError:!0}}}),c})(),g=new aE.D({sessionIdGenerator:void 0,enableJsonResponse:!0});try{await f.connect(g),await g.handleRequest(c,e)}catch(a){aG.error("Codex tool-bridge request failed",a),e.headersSent||(e.writeHead(500,{"content-type":"application/json"}),e.end(JSON.stringify({error:"Internal bridge error."})))}finally{try{await g.close()}catch{}try{await f.close()}catch{}}});await new Promise((a,b)=>{e.once("error",b),e.listen(0,"127.0.0.1",()=>a())});let f=e.address();if(!f||"string"==typeof f)throw e.close(),Error("Codex tool bridge failed to bind a loopback port.");let g=`http://127.0.0.1:${f.port}${d}`;return aG.debug("Codex tool bridge started",{port:f.port,toolCount:a.length}),{url:g,close:()=>new Promise(a=>{e.closeAllConnections?.(),e.close(()=>a())})}}async function aI(){let a=process.env.CODEX_HOME?.trim()||az().join(ax().homedir(),".codex"),b=az().join(a,"models_cache.json");try{return(await aA.promises.stat(b)).isFile()?b:void 0}catch{return}}var aJ=c(43326);let aK="auth.json";async function aL(a){let b=az().join((0,aJ.getDataDir)(),"db","codex-runtime");await aA.promises.mkdir(b,{recursive:!0,mode:448});let c=az().join(b,"workspace");if(await aA.promises.mkdir(c,{recursive:!0,mode:448}),await aA.promises.writeFile(az().join(b,"config.toml"),"# Managed by FLUJO. Codex runtime settings are supplied per invocation.\n",{encoding:"utf8",mode:384}),a){let a=az().join(process.env.CODEX_HOME?.trim()||az().join(ax().homedir(),".codex"),aK),c=az().join(b,aK);if(az().resolve(a)!==az().resolve(c))try{await aA.promises.copyFile(a,c),await aA.promises.chmod(c,384).catch(()=>void 0)}catch(a){if("ENOENT"===a.code)await aA.promises.rm(c,{force:!0}).catch(()=>void 0);else throw a}}return{home:b,workingDirectory:c,env:{...Object.fromEntries(Object.entries(process.env).filter(a=>void 0!==a[1])),CODEX_HOME:b}}}let aM=new Map;function aN(a){return null===a||"object"!=typeof a?JSON.stringify(a)??"null":Array.isArray(a)?`[${a.map(aN).join(",")}]`:`{${Object.keys(a).sort().map(b=>`${JSON.stringify(b)}:${aN(a[b])}`).join(",")}}`}function aO(a){if(!a||"object"!=typeof a)return{value:a};let b={};for(let c of["role","content","name","tool_call_id","tool_calls","function_call","refusal"])void 0!==a[c]&&(b[c]=a[c]);return b}function aP(a){return(0,aj.createHash)("sha256").update(aN(a.map(aO))).digest("hex")}function aQ(a){aM.delete(a)}let aR=(0,d.h)("backend/services/model/adapters/codexAdapter"),aS="FLUJO MCP tools are the authoritative interface for the operations they expose. When filesystem__ tools are available, use them for all file operations; they run outside the Codex sandbox under FLUJO-managed roots and approvals, so a path may be valid even when it is outside the Codex working directory. Call filesystem__get_allowed_directories before guessing roots, and do not inspect the Codex runtime working directory unless the user explicitly asks.";function aT(a){return a.replace(/[^a-zA-Z0-9_-]/g,"_")}class aU{async createCompletion({model:a,apiKey:b,messages:d,tools:e,toolNameMap:f,localToolExecutors:g,requestToolApproval:h,onTranscriptMessage:j,onModelDelta:k,signal:l,conversationId:m,nodeId:n,runResourceMarkers:o,sessionResume:p}){var q;let r,s,t,u,v,w,{Codex:x}=await c.e(8321).then(c.bind(c,88321)),{systemPrompt:y,content:z}=au(d,o),A=new AbortController,B=()=>A.abort();l?.aborted?A.abort():l?.addEventListener("abort",B,{once:!0});let C=[],D=Date.now(),E=0,F=(a,b=`m_${(0,i.A)()}`)=>{let c={...a,id:b,timestamp:D+E++};C.push(c),j?.(c)},G=a=>{F({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.argsJson}}]})},H=a=>{F({role:"tool",tool_call_id:a.id,content:a.resultContent,...a.ui?{ui:a.ui}:{}})},I=a=>{G(a),H(a)},J=[],K=!1,L=async(a,b,c,d)=>{if(!h)return null;let{approved:e,feedback:f}=await h({id:a,name:b,args:c});if(e)return null;let g=f?`User rejected this tool call: ${f}`:"Tool call rejected by the user.",i=await d?.(g);return H({id:a,resultContent:g,...i?{ui:i}:{}}),{content:[{type:"text",text:g}],isError:!0}},M=new Set,N=(e??[]).filter(a=>"function"===a.type).map(a=>{let b=a.function.name,c=b.startsWith("handoff_to_")||"handoff"===b,d=f?.[b],e=g?.[b];if(!c&&!d&&!e)return null;let h=a.function.parameters,j=a.function.description??"";if(c){let a=!!h?.properties?.task;return{name:b,description:j,inputSchema:h,handler:async c=>(J.push({name:b,args:c??{}}),aR.debug("Codex requested handoff",{tool:b,callIndex:J.length,spawnable:a}),a)?{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."}]}:(K=!0,{content:[{type:"text",text:"Handing off."}]})}}if(e)return{name:b,description:j,inputSchema:h,handler:async a=>{let c,d=`call_${(0,i.A)()}`;G({id:d,name:b,argsJson:JSON.stringify(a??{})});let f=await L(d,b,a??{});if(f)return f;aR.debug("Codex local tool call",{tool:b});let g=!1;try{c=JSON.stringify(await e(a??{}))}catch(a){c=`Error: ${a instanceof Error?a.message:String(a)}`,g=!0}return H({id:d,resultContent:c}),g?{content:[{type:"text",text:c}],isError:!0}:{content:[{type:"text",text:c}]}}};let{server:k,tool:l,timeout:n,nodeId:o,annotations:p,uiResourceUri:q}=d,r=function(a,b,c){let d=`${aT(a)}__${aT(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,M);return{name:r,description:j,inputSchema:h,...p?{annotations:p}:{},handler:async a=>{let b,c,d=`call_${(0,i.A)()}`;G({id:d,name:r,argsJson:JSON.stringify(a??{})});let e=await L(d,r,a??{},async a=>{let b=await (0,ab.K)(k,l,q);return b?{...b,cancelledReason:a,isError:!0}:void 0});if(e)return e;aR.debug("Codex tool call",{server:k,tool:l,exposedAs:r});let f=await $.mcpService.callTool(k,l,a??{},n??ac.aI,void 0,o,A.signal,"model");if(f.success){if(b=f.data,c=JSON.stringify(f.data),m)try{let a=await (0,_.jR)(),e=await (0,aa.S)({conversationId:m,toolCallId:d,server:k,toolName:l,nodeId:o,content:c,settings:a});e.spilled&&(c=e.content,b={content:[{type:"text",text:e.content}]})}catch(a){aR.warn("boundToolResult failed on Codex path; keeping full result",a)}}else b={content:[{type:"text",text:c=`Error: ${f.error??"Unknown error"}`}],isError:!0};let g=await (0,ab.K)(k,l,q,f.data),h=(0,ab.A)(f),j=g?{...g,...!f.success?{isError:!0}:{},...h?{cancelledReason:h}:{}}:void 0;return H({id:d,resultContent:c,...j?{ui:j}:{}}),b}}}).filter(a=>null!==a),O=m&&n?`${m}::${n}`:void 0;!p&&O&&aQ(O);let P=p&&m&&n?{key:O,prefixHash:function(a,b,c){let d=(0,aj.createHash)("sha256");return d.update(aN({model:a,systemPrompt:b??"",tools:[...c].sort((a,b)=>a.name.localeCompare(b.name)).map(({name:a,description:b,inputSchema:c,annotations:d})=>({name:a,description:b,inputSchema:c??null,annotations:d??null}))})),d.digest("hex")}(a.name,y,N)}:void 0,Q=z,R=y;if(P){let a=function(a,b,c){let d=aM.get(a);if(d&&d.prefixHash===b&&!(c.length<d.seenMessageCount)&&aP(c.slice(0,d.seenMessageCount))===d.historyHash)return d}(P.key,P.prefixHash,d);if(a&&d.length>a.seenMessageCount){let b=au(d.slice(a.seenMessageCount),o);b.content.length>0&&(r=a.threadId,Q=b.content,R=void 0,aR.debug("Codex resuming SDK thread",{conversationId:m,nodeId:n,threadId:r,seenMessageCount:a.seenMessageCount,deltaMessages:d.length-a.seenMessageCount}))}}let S=[],T=async()=>(s||(s=await aA.promises.mkdtemp(az().join(ax().tmpdir(),"flujo-codex-"))),s),U=[];if(R&&U.push({type:"text",text:`<system_instructions>
73
- ${R}
74
- </system_instructions>`}),"string"==typeof Q)U.push({type:"text",text:Q});else for(let a of Q)if("text"===a.type)U.push({type:"text",text:a.text});else if("image"===a.type)if("base64"===a.source.type){let b=await T(),c=a.source.media_type.split("/")[1]??"png",d=az().join(b,`img_${S.length}.${c}`);await aA.promises.writeFile(d,Buffer.from(a.source.data,"base64")),S.push(d),U.push({type:"local_image",path:d})}else U.push({type:"text",text:`[image: ${a.source.url}]`});let V="",W=!1,X=!1,Y=r;try{N.length>0&&(t=await aH(N,aS));let c=await aI(),d=await aL(!b),e={service_tier:a.serviceTier??"default",developer_instructions:aS,features:{shell_tool:!1},...c?{model_catalog_json:c}:{},...t?{mcp_servers:{flujo:{url:t.url,default_tools_approval_mode:"approve"}}}:{}},f=new x({...b?{apiKey:b}:{},env:d.env,...Object.keys(e).length>0?{config:e}:{}}),g={model:a.name,...a.reasoningEffort?{modelReasoningEffort:a.reasoningEffort}:{},workingDirectory:d.workingDirectory,skipGitRepoCheck:!0,approvalPolicy:"never"},h=r?f.resumeThread(r,g):f.startThread(g);aR.debug("createCompletion via Codex SDK",{model:a.name,toolCount:N.length,hasSystem:!!y,bridged:!!t,resumed:!!r,workingDirectory:d.workingDirectory,usingLocalModelCatalog:!!c});let j=1===U.length&&"text"===U[0].type?U[0].text:U,m=new Map;for(let a=0;a<2;a+=1){let b;try{let{events:c}=await h.runStreamed(0===a?j:"Continue the interrupted response from exactly where it stopped. Do not repeat content or tool calls already completed.",{signal:A.signal});for await(let a of c){if(l?.aborted)break;if("thread.started"===a.type){Y=a.thread_id;continue}if(J.length>0&&(K||J.length>=32)){A.abort();break}if("item.started"===a.type||"item.updated"===a.type||"item.completed"===a.type){let b=a.item;if("agent_message"===b.type){let a=m.get(b.id)??"",c=b.text.startsWith(a)?b.text.slice(a.length):b.text;c&&k?.({messageId:`stream_codex_${b.id}`,contentDelta:c}),m.set(b.id,b.text)}}if("item.completed"===a.type){let b=a.item;if("agent_message"===b.type){if(J.length>0){A.abort();break}b.text&&(V+=(V?"\n\n":"")+b.text,F({role:"assistant",content:b.text},`stream_codex_${b.id}`),W=!0)}else"command_execution"===b.type?I({id:`call_${(0,i.A)()}`,name:"shell",argsJson:JSON.stringify({command:b.command}),resultContent:b.aggregated_output??""}):"error"===b.type&&aR.warn("Codex reported a non-fatal item",{message:b.message})}else"turn.completed"===a.type?(u=a.usage,X=!0):"turn.failed"===a.type&&(b=Error(a.error?.message??"unknown error"))}}catch(a){b=a instanceof Error?a:Error(String(a))}if(l?.aborted&&0===J.length)throw Error("Codex run cancelled by user.");if(!b||J.length>0)break;if(0===a&&!A.signal.aborted&&(!((q=b)instanceof Error)||"AbortError"!==q.name)&&(q instanceof Error?q.message:String(q??"")).includes("Connection closed mid-response. The response above may be incomplete.")){aR.warn("Codex connection closed mid-response; continuing the same thread once");continue}v=b.message;break}if(v&&0===J.length)throw Error(`Codex run failed: ${v}`)}catch(a){if(P&&aQ(P.key),0===J.length)throw a}finally{l?.removeEventListener("abort",B),await t?.close().catch(()=>void 0),s&&await aA.promises.rm(s,{recursive:!0,force:!0}).catch(()=>void 0)}J.length>0&&(w=J.map(a=>({id:`call_${(0,i.A)()}`,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args)}}))),w?F({role:"assistant",content:null,tool_calls:w}):W||F({role:"assistant",content:V||""}),P&&(X&&!v&&!l?.aborted&&0===J.length&&Y?function(a,b){if(aM.delete(a),aM.size>=200){let a=aM.keys().next();a.done||aM.delete(a.value)}aM.set(a,{...b,updatedAt:Date.now()})}(P.key,{threadId:Y,prefixHash:P.prefixHash,seenMessageCount:d.length+C.length,historyHash:aP([...d,...C])}):aQ(P.key),aR.debug("Codex SDK thread usage",{conversationId:m,nodeId:n,sessionResume:!!p,resumedThisTurn:!!r,capturedThread:!!Y,completedTurn:X,inputMessages:d.length,transcriptMessages:C.length,watermark:d.length+C.length,endedByHandoff:J.length>0}));let Z=u?.input_tokens??0,ad=u?.output_tokens??0,ae=u?.cached_input_tokens??0;return{completion:{id:`codex_${(0,i.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.name,choices:[{index:0,finish_reason:w?"tool_calls":"stop",logprobs:null,message:{role:"assistant",content:V||null,refusal:null,...w?{tool_calls:w}:{}}}],usage:{prompt_tokens:Z,completion_tokens:ad,total_tokens:Z+ad,...ae>0?{prompt_tokens_details:{cached_tokens:ae}}:{}}},transcript:C}}}function aV(a){switch(a.adapter){case"openai-responses":return new B;case"anthropic":return new S;case"gemini":return new Z;case"claude-cli":return new av;case"codex-cli":return new aU;default:return new o}}},60184:(a,b,c)=>{"use strict";c.r(b),c.d(b,{INTERRUPTED_TOOL_RESULT_CONTENT:()=>E,_setConversationLogDirForTests:()=>n,allocateSeq:()=>s,appendFromBus:()=>w,appendRawForState:()=>x,deleteConversationLog:()=>A,flushConversationLog:()=>y,hasConversationLog:()=>I,latestSequence:()=>t,projectMessages:()=>B,readConversationLog:()=>z,reconcileConversationLog:()=>D,recoverMessagesFromLog:()=>G,repairDanglingToolCalls:()=>F,repairTruncatedConversationLog:()=>H});var d=c(29021),e=c(33873),f=c.n(e),g=c(75028),h=c(50846),i=c(43326);let j=(0,h.h)("backend/execution/flow/conversationLog"),k=new Set(["run:start","run:done","node:enter","node:exit","node:snapshot","node:changed-files","handoff","message","message:removed","tool:call","tool:result","usage","subflow:start","subflow:done","resource:read","resource:write","error"]),l=/^[A-Za-z0-9_-]+$/,m=f().join((0,i.getDataDir)(),"db","conversation-logs");function n(a){let b=m;return m=a,q.clear(),b}function o(a){return f().join(m,`${a}.jsonl`)}let p=new Map,q=new Map;function r(a){if(q.has(a))return;let b=-1;try{for(let c of(0,d.readFileSync)(o(a),"utf-8").split("\n"))if(0!==c.trim().length)try{let a=JSON.parse(c).seq;"number"==typeof a&&Number.isFinite(a)&&a>b&&(b=a)}catch{}}catch(b){"ENOENT"!==b.code&&j.warn(`Could not read conversation log ${a} to seed seq; starting at 0.`,{err:b})}q.set(a,b+1)}function s(a){r(a);let b=q.get(a);return q.set(a,b+1),b}async function t(a){return l.test(a)?(r(a),q.get(a)-1):-1}function u(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(m,{recursive:!0}),await d.promises.appendFile(o(a),b)});return p.set(a,c),c.finally(()=>{p.get(a)===c&&p.delete(a)})}function v(a){return`${JSON.stringify(a)}
75
- `}function w(a){if(k.has(a.type)){if(!l.test(a.conversationId))return void j.warn("Refusing to log event for unsafe conversation id",{conversationId:a.conversationId});(function(a){try{if((0,g.isConversationDeleted)(a))return!1;let{FlowExecutor:b}=c(95708),d=b.conversationStates.get(a);if(!d)return!1;return!d.ephemeral}catch(b){return j.warn(`Could not resolve persistence policy for ${a}; not persisting.`,{err:b}),!1}})(a.conversationId)&&u(a.conversationId,v(a)).catch(b=>j.warn(`Failed to append event to conversation log ${a.conversationId}`,{err:b}))}}async function x(a,b){if(0===b.length||a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c)||(0,g.isConversationDeleted)(c))return;let d=b.map(a=>v({...a,conversationId:c,seq:s(c),timestamp:Date.now()})).join("");try{await u(c,d)}catch(a){j.warn(`Failed to append ${b.length} event(s) to conversation log ${c}`,{err:a})}}function y(a){let b=p.get(a);return b?b.then(()=>void 0,()=>void 0):Promise.resolve()}async function z(a){let b;if(!l.test(a))return;try{b=await d.promises.readFile(o(a),"utf-8")}catch(b){if("ENOENT"===b.code)return;j.error(`Error reading conversation log ${a}:`,b);return}let c=[],e=0;for(let a of b.split("\n"))if(0!==a.trim().length)try{c.push(JSON.parse(a))}catch{e++}return e>0&&j.warn(`Skipped ${e} unparseable line(s) in conversation log ${a} (truncated append?)`),c}async function A(a){if(l.test(a))try{await d.promises.unlink(o(a))}catch(b){"ENOENT"!==b.code&&j.warn(`Error deleting conversation log ${a}:`,b)}}function B(a){let b=[],c=new Map;for(let d of a)if("message"===d.type){let a=d.message;if(!a||!a.id||"system"===a.role)continue;let e=d.depth??0,f=e>0?{...a,depth:e}:{...a},g=c.get(a.id);void 0!==g?b[g]=f:(c.set(a.id,b.length),b.push(f))}else if("message:removed"===d.type){let a=c.get(d.messageId);if(void 0===a)continue;for(let[e,f]of(b.splice(a,1),c.delete(d.messageId),c))f>a&&c.set(e,f-1)}return b}function C(a){return JSON.stringify([a.role,a.content,a.tool_calls??null,a.disabled??!1,a.processNodeId??null])}async function D(a,b){if(a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c))return;let d=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id),e=await I(c)?b.filter(a=>"system"!==a.role&&!!a.id):[],f=new Map(e.map(a=>[a.id,a])),g=new Set(d.map(a=>a.id)),h=[];for(let a of d){let b=f.get(a.id);b&&C(b)===C(a)||h.push({type:"message",message:a})}for(let a of e)g.has(a.id)||h.push({type:"message:removed",messageId:a.id});await x(a,h)}let E="Tool execution interrupted (FLUJO restarted before this tool finished)";function F(a,b=E){let c=a.messages??[];if(0===c.length)return[];let d=new Set;for(let a of c)if("tool"===a.role){let b=a.tool_call_id;b&&d.add(b)}let e=[],f=[];for(let a=0;a<c.length;a++){let g=c[a];f.push(g);let h=g.tool_calls;if("assistant"!==g.role||!Array.isArray(h)||0===h.length)continue;let i=h.filter(a=>!!a.id&&!d.has(a.id));if(0===i.length)continue;let j=a+1;for(;j<c.length&&"tool"===c[j].role;)f.push(c[j]),j++;for(let a of i){let c={id:crypto.randomUUID(),role:"tool",tool_call_id:a.id,content:b,timestamp:Date.now(),...void 0!==g.processNodeId?{processNodeId:g.processNodeId}:{},...void 0!==g.depth?{depth:g.depth}:{}};f.push(c),e.push(c),d.add(a.id)}a=j-1}return 0===e.length?[]:(a.messages=f,e)}async function G(a){if(a.ephemeral)return!1;let b=a.conversationId;if(!b||!l.test(b))return!1;let c=await z(b);if(!c)return!1;let d=B(c).filter(a=>!((a.depth??0)>0)),e=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id).map(a=>a.id);if(d.length<=e.length)return!1;let f=new Set(d.map(a=>a.id));return!!e.every(a=>f.has(a))&&(j.info(`Recovered ${d.length-e.length} message(s) from the conversation log for ${b} (snapshot was behind).`),a.messages=d,!0)}async function H(a){if(a.ephemeral)return;let b=a.conversationId;if(!b||!l.test(b))return;let c=await z(b);if(!c)return;let e=B(c).filter(a=>!((a.depth??0)>0)),f=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id);if(e.length>=f.length)return;let g=new Set(f.map(a=>a.id));if(!e.every(a=>g.has(a.id)))return;let h=0,i=f.map(a=>v({type:"message",message:a,conversationId:b,seq:h++,timestamp:Date.now()})).join("");q.set(b,h);try{await function(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(m,{recursive:!0}),await d.promises.writeFile(o(a),b)});return p.set(a,c),c.finally(()=>{p.get(a)===c&&p.delete(a)})}(b,i),j.info(`Rebuilt truncated conversation log for ${b} from snapshot (${e.length} → ${f.length} message(s)); issue #49 self-heal.`)}catch(a){j.warn(`Failed to rebuild truncated conversation log ${b}`,{err:a})}return f}async function I(a){if(!l.test(a))return!1;try{return await d.promises.access(o(a)),!0}catch{return!1}}},60453:(a,b,c)=>{"use strict";c.r(b),c.d(b,{MCPService:()=>aI,mcpService:()=>aJ});var d=c(32524),e=c(79748),f=c.n(e),g=c(33873),h=c.n(g),i=c(50846),j=c(43326),k=c(36445),l=c(74186),m=c(68780),n=c(73456),o=c(77213),p=c(68383),q=c(72904),r=c(92372),s=c(38844),t=c(4231),u=c(37601),v=c(58302),w=c(51605),x=c(3712),y=c(29021),z=c(21820),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(58858),K=c(46496);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=[];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),o=d.maxTokens??(0,K.normalizeMaxTokens)(h.maxTokens),{completion:p}=await n.createCompletion({model:h,apiKey:i,messages:k,temperature:l,maxTokens:o}),q=p.choices?.[0]?.message?.content;return{role:"assistant",content:{type:"text",text:"string"==typeof q?q:""},model:h.name,stopReason:"endTurn"}}}var P=c(14214),Q=c(30767),R=c(97701);let S=(0,i.h)("backend/services/mcp/elicitation");function T(a){return a.elicitation}function U(a){let b=T(a);return!!b?.enabled}function V(a){return async b=>{if(!U(a))throw new m.Nh(m.O4.MethodNotFound,"Elicitation is not enabled for this server");let c=(0,Q.lx)(a.name);if(!c)return S.warn(`Elicitation request from ${a.name} outside an active run; auto-cancelling`),{action:"cancel"};if(c.getUnattended())return S.warn(`Elicitation request from ${a.name} in unattended run ${c.conversationId}; auto-cancelling`),{action:"cancel"};let d=b.params;if(d?.mode==="url")return S.warn(`Elicitation URL mode is not supported in V1 (server: ${a.name}); auto-cancelling`),{action:"cancel"};let e=d?.message??"Additional information required",f=d?.requestedSchema??{type:"object",properties:{}},g=crypto.randomUUID();S.info(`Suspending for elicitation ${g} from ${a.name} in conv ${c.conversationId}`),P.$.emitterFor(c.conversationId)({type:"run:awaiting_elicitation",elicitationId:g,message:e,requestedSchema:f});let h=await (0,R.gV)(g);return S.info(`Elicitation ${g} resolved with action=${h.action}`),h}}var W=c(34079),X=c(31659);function Y(a){return[function(a){let b=M(a);return b?.enabled?JSON.stringify({m:b.modelId,t:b.maxTokens,r:b.maxCallsPerMinute}):""}(a),function(a){let b=T(a);return b?.enabled?"e:1":""}(a),!0===a.enableMcpApps?"mcp-apps:on":"mcp-apps:off"].join("|")}let Z=(0,i.h)("backend/services/mcp/connection");async function $(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,W.at)(d,c);if(!a||(0,W.uh)(a))continue;let e=await (0,n.G)(a);e&&(b[c]=e)}return{...a,headers:b}}function _(a){let b={};for(let[c,d]of Object.entries(a)){if(!c)continue;let{value:a}=(0,W.at)(d,c);"string"==typeof a&&a.length>0&&(b[c]=a)}return b}function aa(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 ab(a){return JSON.stringify({command:a.command,args:a.args??[],env:aa(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??""})}function ac(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 ad(a){Z.debug("Entering createNewClient method");let b=N(a),c=U(a),d=!0===a.enableMcpApps,e=new t.K({name:`flujo-${a.name}-client`,version:"3.33.0"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{},...c?{elicitation:{}}:{},...d?{extensions:{[X.OF]:{mimeTypes:[X.cM]}}}:{}}});return(0,H.FP)(e,a),b&&e.setRequestHandler(m.u9,O(a)),c&&e.setRequestHandler(m.$9,V(a)),e.__flujoCapKey=Y(a),e}function ae(a){if(Z.debug("Entering createTransport method"),"streamable"===a.transport){Z.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=_(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},Z.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}a.oauthClientId||a.oauthClientInformation?(Z.info(`Setting up OAuth authentication for ${a.name}`),b.authProvider=(0,A.C)(a),a.oauthTokens?.access_token?(Z.debug(`OAuth provider configured for ${a.name} with existing tokens`),Z.debug(`Token expires in: ${a.oauthTokens.expires_in} seconds`)):Z.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)):Z.debug(`No OAuth configuration found for ${a.name}`);let c=new w.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ac(a),c}if("sse"===a.transport){Z.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=_(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},Z.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new x.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ac(a),c}if("websocket"===a.transport)return Z.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new v.I(new URL(a.websocketUrl));{var b=a;if(Z.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}=af(b);Z.info(`Creating StdioClientTransport for ${b.name} with stderr: 'pipe'`);let g=new u.oQ({command:c,args:d,env:e,cwd:f,stderr:"pipe"});return g.__flujoStdioKey=ab(b),g.stderr?Z.info(`Stderr stream is available for ${b.name}`):Z.warn(`Stderr stream is NOT available for ${b.name}`),g}}function af(a){let b=a.command,c=a.args?[...a.args]:[],d=`${o.VL}/${a.name}`;Z.info(`Creating stdio transport for server ${a.name}`),Z.debug(`Original command: ${b}`),Z.debug(`Original args: ${JSON.stringify(c)}`),Z.debug(`Server directory: ${d}`);let e=!g.isAbsolute(b)&&(b.includes("/")||b.includes("\\")),f=!b.includes("/")&&!b.includes("\\");if(Z.debug(`Is relative path: ${e}`),Z.debug(`Is just filename: ${f}`),"win32"===z.platform()&&b.toLowerCase().endsWith(".bat"))if(Z.debug(`Detected .bat file on Windows: ${b}`),f){let a=g.join((0,j.getDataDir)(),d,b);Z.debug(`Checking if file exists at: ${a}`);let e=y.existsSync(a);Z.debug(`File exists: ${e}`),e?(Z.debug(`Using full path to .bat file: ${a}`),c=["/c",a,...c]):(Z.warn(`WARNING: .bat file not found at ${a}`),c=["/c",b,...c]),b="cmd.exe"}else Z.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:z.platform(),dirname:g.dirname,joinPath:g.join,fileExists:y.existsSync});h!==b&&(Z.debug(`Resolved Node toolchain command "${b}" to absolute path: ${h}`),b=h),Z.debug(`Final command: ${b}`),Z.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:`${o.VL}/${a.name}`}),k=g.isAbsolute(i)?i:g.join((0,j.getDataDir)(),i);Z.debug(`cwd: ${k}`),Z.debug(`env: ${JSON.stringify(a.env)}`);let l=aa(a.env);return Z.verbose("Transformed environment variables",JSON.stringify(l)),{command:b,args:c,env:l,cwd:k}}function ag(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 ah(a,b,c,d){Z.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(),Z.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){Z.warn(`Error closing stdin for ${b}:`,a)}let a=await ag(c,e);if(!a){Z.warn(`Process did not exit within ${e}ms after stdin close, sending SIGTERM for ${b}`);try{c.kill("SIGTERM")}catch(a){Z.error(`Error sending SIGTERM for ${b}:`,a)}a=await ag(c,f)}if(a)Z.info(`Process exited gracefully for ${b}`);else{Z.warn(`Process did not respond to SIGTERM, sending SIGKILL for ${b}`);try{c.kill("SIGKILL")}catch(a){Z.error(`Error sending SIGKILL for ${b}:`,a)}}}await a.close(),Z.info(`Client closed successfully for ${b}`)}catch(a){Z.warn(`Error closing client for ${b}:`,a)}}let ai=(0,i.h)("backend/services/mcp/betaClient");async function aj(){try{let a=await (0,r.YM)(s.Z.SPEECH_SETTINGS,void 0);return!!a?.experimental?.mcpBetaProtocol}catch(a){return ai.warn("Failed to read mcpBetaProtocol setting; defaulting to disabled",{err:a}),!1}}function ak(a){return!0===a.__flujoBeta}function al(a){let b=N(a),c=U(a),d=!0===a.enableMcpApps,e=new p.Kj({name:`flujo-${a.name}-client`,version:"3.27.0"},{capabilities:{roots:{listChanged:!0},...b?{sampling:{}}:{},...c?{elicitation:{}}:{},...d?{extensions:{[X.OF]:{mimeTypes:[X.cM]}}}:{}},versionNegotiation:{mode:"auto"}});if(e.setRequestHandler("roots/list",(0,H.sG)(a)),b){let b=O(a);e.setRequestHandler("sampling/createMessage",async a=>b(a))}if(c){let b=V(a);e.setRequestHandler("elicitation/create",async a=>b(a))}return e.__flujoBeta=!0,e.__flujoCapKey=Y(a),ai.info(`Created v2-beta MCP client for ${a.name} (version negotiation: auto)`),e}function am(a){let b=a.requestInit&&"object"==typeof a.requestInit?a.requestInit:void 0;if(a.headers&&"object"==typeof a.headers){let c=_(a.headers);Object.keys(c).length>0&&(b={...b||{},headers:{...b?.headers||{},...c}})}return b}function an(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=am(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 p.jS(new URL(a.serverUrl),b);return d.__flujoHttpKey=ac(a),d.__flujoKind="streamable",ai.info(`Created v2-beta streamable transport for ${a.name}`),d}if("sse"===a.transport){let b={},c=am(a);c&&(b.requestInit=c),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit);let d=new p.Am(new URL(a.serverUrl),b);return d.__flujoHttpKey=ac(a),d.__flujoKind="sse",ai.info(`Created v2-beta SSE transport for ${a.name}`),d}let{command:b,args:c,env:d,cwd:e}=af(a),f=new q.oQ({command:b,args:c,env:d,cwd:e,stderr:"pipe"});return f.__flujoStdioKey=ab(a),f.__flujoKind="stdio",ai.info(`Created v2-beta stdio transport for ${a.name}`),f}let ao=a=>new Promise(b=>setTimeout(b,a)),ap=(0,i.h)("backend/services/mcp/tools"),aq=0x80000000-1;async function ar(a,b,c="model"){if(ap.debug("Entering listServerTools method"),!a)return ap.warn(`Server ${b} not connected`),{tools:[],error:"Server not connected"};try{ap.info(`Listing tools for server ${b}`);let d=await a.listTools();ap.verbose("Raw response from MCP server:",d);let e=(d.tools||[]).map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema||{},...a.annotations?{annotations:a.annotations}:{},...a._meta?{_meta:a._meta}:{}})),f=(0,X.zm)(e,c);return ap.verbose(`Processed tools for ${c} audience:`,f),{tools:f}}catch(c){ap.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 as(a,b,c,d,e,f,g,h="host"){if(ap.debug("Entering callTool method"),!a)return ap.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};let i=void 0!==e&&e>0?Math.min(1e3*e,aq):aq;try{if("app"===h||"model"===h){let d=await ar(a,b,"all");if(d.error)return{success:!1,error:`Could not verify MCP App access to tool '${c}' on '${b}': ${d.error}`,errorType:"tool-authorization-list",statusCode:502};let e=(0,X.F)(d.tools,b,c,h);if(!e.allowed)return ap.warn(`Rejected ${h} tool call: ${e.error}`),{success:!1,error:e.error,statusCode:e.statusCode}}ap.debug(`Original args for tool ${c}:`,d);let e=await (0,n.resolveGlobalVars)(d),j=function(a,b){if(!a)return{};let c={};for(let d in a){let e=a[d];null==e?(ap.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,ap.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,ap.debug(`Using default value false for likely boolean parameter: ${d}`)):d.includes("array")||d.endsWith("s")||d.endsWith("List")||d.endsWith("Items")?(c[d]=[],ap.debug(`Using empty array for likely array parameter: ${d}`)):d.includes("object")||d.endsWith("Options")||d.endsWith("Config")||d.endsWith("Settings")?(c[d]={},ap.debug(`Using empty object for likely object parameter: ${d}`)):(c[d]="",ap.debug(`Using empty string for parameter with unknown type: ${d}`))):c[d]=e}return c}("object"==typeof e&&null!==e?e:{},c);ap.debug(`Normalized args for tool ${c}:`,j),ap.debug(`Calling tool ${c} with SDK timeout ${i}ms`);let k={timeout:i,resetTimeoutOnProgress:!0,...g?{signal:g}:{},onprogress:a=>{ap.debug(`Progress for tool ${c}: ${a.progress}${void 0!==a.total?`/${a.total}`:""}${a.message?` — ${a.message}`:""}`),f?.(a)}},l=ak(a)?await a.callTool.call(a,{name:c,arguments:j},k):await a.callTool({name:c,arguments:j},void 0,k);if((0,o.h$)(l)){let d,e=l.task;ap.info(`Tool ${c} on ${b} returned task handle ${e.taskId} (status: ${e.status})`),f?.({progress:0,message:`Task ${e.taskId} created (${e.status})`});let h=Math.min(Math.max(e.pollInterval??5e3,1e3),3e4),j=new Set(["completed","failed","cancelled"]),k=e.status,m=0,n=j.has(k);if("completed"===k)return{success:!0,data:e.result,progressToken:e.taskId};if("failed"===k)return{success:!1,error:e.error??`Task ${e.taskId} failed`,progressToken:e.taskId};let o=()=>(d||(d=(async()=>{try{await a.request({method:"tasks/cancel",params:{taskId:e.taskId}},void 0,{timeout:1e4})}catch(a){ap.warn(`Best-effort cancellation failed for task ${e.taskId}:`,a)}})()),d),p=()=>{o()};g?.addEventListener("abort",p,{once:!0});try{for(;!j.has(k);){if(g?.aborted||(await ao(h),m+=h,g?.aborted))throw await o(),Error(`Tool call cancelled (task ${e.taskId})`);let b=await a.request({method:"tasks/get",params:{taskId:e.taskId}},void 0,{signal:g,timeout:i});if(g?.aborted)throw await o(),Error(`Tool call cancelled (task ${e.taskId})`);let c=b.task;if(k=c.status,n=j.has(k),ap.debug(`Task ${e.taskId} poll: status=${c.status}, elapsed=${m}ms`),f?.({progress:"completed"===c.status?100:Math.min(99,Math.round(m/1e3)),message:`Task ${e.taskId}: ${c.status}`}),"completed"===c.status)return{success:!0,data:c.result,progressToken:e.taskId};if("failed"===c.status)return{success:!1,error:c.error??`Task ${e.taskId} failed`,progressToken:e.taskId}}return{success:!1,error:`Tool '${c}' task ${e.taskId} was cancelled by the server.`,errorType:"cancelled",progressToken:e.taskId}}catch(a){throw n||await o(),a}finally{g?.removeEventListener("abort",p)}}return{success:!0,data:l}}catch(e){ap.warn(`Failed to call tool ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;if(g?.aborted)return{success:!1,error:`Tool '${c}' call was cancelled.`,errorType:"cancelled",toolName:c};if(e instanceof m.Nh&&e.code===m.O4.RequestTimeout){let a=Math.round(i/1e3);return ap.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 ap.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"))&&(ap.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 at=(0,i.h)("backend/services/mcp/resources");async function au(a,b){if(at.debug("Entering listServerResources method"),!a)return at.warn(`Server ${b} not connected`),{resources:[],error:"Server not connected"};try{at.info(`Listing resources for server ${b}`);let c=(await a.listResources()).resources||[];return at.verbose("Processed resources:",c),{resources:c}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return at.debug(`Server ${b} does not support resources/list`),{resources:[]};at.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 av(a,b){if(at.debug("Entering listServerResourceTemplates method"),!a)return at.warn(`Server ${b} not connected`),{resourceTemplates:[],error:"Server not connected"};try{return at.info(`Listing resource templates for server ${b}`),{resourceTemplates:(await a.listResourceTemplates()).resourceTemplates||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return at.debug(`Server ${b} does not support resources/templates/list`),{resourceTemplates:[]};at.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 aw(a,b,c){if(at.debug("Entering readResource method"),!a)return at.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let d=await (0,n.resolveGlobalVars)(c);at.info(`Reading resource ${d} from server ${b}`);let e=await a.readResource({uri:d});return{success:!0,data:e}}catch(e){at.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 ax=(0,i.h)("backend/services/mcp/prompts");async function ay(a,b){if(ax.debug("Entering listServerPrompts method"),!a)return ax.warn(`Server ${b} not connected`),{prompts:[],error:"Server not connected"};try{return ax.info(`Listing prompts for server ${b}`),{prompts:(await a.listPrompts()).prompts||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return ax.debug(`Server ${b} does not support prompts/list`),{prompts:[]};ax.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 az(a,b,c,d){if(ax.debug("Entering getPrompt method"),!a)return ax.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}ax.info(`Getting prompt ${c} from server ${b}`);let f=await a.getPrompt({name:c,arguments:e});return{success:!0,data:f}}catch(e){ax.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 aA=c(40829),aB=c(49680);function aC(a){return"stdio"===a.transport&&F(a.command,a.args??[])}var aD=c(76054);let aE=(0,i.h)("backend/services/mcp/resourceNotifications");var aF=c(81495),aG=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),void 0===global.__mcp_client_generation&&(global.__mcp_client_generation=new Map),void 0===global.__mcp_tool_schema_hash&&(global.__mcp_tool_schema_hash=new Map);let aH=(0,i.h)("backend/services/mcp/index");class aI{get clients(){return global.__mcp_clients}get connectingServers(){return global.__mcp_connecting}get activeTransports(){return global.__mcp_active_transports}get clientGenerations(){return global.__mcp_client_generation}get toolSchemaHashes(){return global.__mcp_tool_schema_hash}static{this.MAX_STDERR_LOG_ENTRIES=200}appendStderrLog(a,b){let c=this.stderrLogs.get(a)||[];c.push(b),c.length>aI.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-aI.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){this.clients.delete(a),this.activeTransports.delete(a)}onResourceListChanged(a){let b=this.resourceListVersion.get(a)??0;this.resourceListVersion.set(a,b+1),aH.debug(`onResourceListChanged: server=${a} version=${b+1}`)}onResourceUpdated(a,b){let c=this.pendingResourceUpdates.get(a)??new Set;c.add(b),this.pendingResourceUpdates.set(a,c),aH.debug(`onResourceUpdated: server=${a} uri=${b}`)}getResourceListVersion(a){return this.resourceListVersion.get(a)??0}async subscribeToResource(a,b){try{let c=this.getClient(a);if(!c)return;let d=c.getServerCapabilities?.();if(!d?.resources?.subscribe)return;await c.subscribeResource({uri:b}),aH.debug(`subscribeToResource: server=${a} uri=${b}`)}catch(c){aH.debug(`subscribeToResource: ignored error for ${a}/${b}:`,c)}}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),aH.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){aH.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);aH.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout(async()=>{aH.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){aH.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){aH.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}),aH.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){aH.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)aH.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(aH.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication){aH.info(`Server ${a} requires authentication, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){aH.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,aH.info(`Backend startup state set to: ${a?"starting":"complete"}`)}getClientGeneration(a){return this.clientGenerations.get(a)??0}setToolSchemaHash(a,b,c){this.toolSchemaHashes.set(`${a}\0${b}`,c)}getToolSchemaHash(a,b){return this.toolSchemaHashes.get(`${a}\0${b}`)}getClient(a){let b=this.clients.get(a);if(b&&(0,B.wk)(b)){aH.warn(`getClient: client for ${a} has a closed/aborted connection — evicting it`),this.clients.delete(a);return}return aH.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){aH.debug("loadServerConfigs: Entering method");try{let a=await (0,l.loadServerConfigs)();if(!Array.isArray(a))return aH.warn("loadServerConfigs: Received non-array response",a),a;for(let b of(await (0,aG.XS)())){if(a.some(a=>a.name===b.name)){aH.warn(`loadServerConfigs: A stored server is named "${b.name}" — it shadows FLUJO's built-in server`);continue}a.push(b)}return aH.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){return aH.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){aH.debug(`getServerConfig: Looking up config for server ${a}`);let b=await this.loadServerConfigs();if(!Array.isArray(b))return aH.warn(`getServerConfig: Failed to load configs for ${a}:`,b.error),null;let c=b.find(b=>b.name===a);return c||(aH.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,aG.Co)(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,aG.Co)(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 aH.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){aH.info(`connectServer: Looking up config for server ${a}`);let c=await this.getServerConfig(a);if(!c)return aH.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 aH.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)();aH.info(`connectServer: Starting connection for server ${b.name} [RequestID: ${c}]`),this.connectingServers.add(b.name);try{this.stderrLogs.set(b.name,[]),b=await $(b);let a=await aj()&&"websocket"!==b.transport,c=this.clients.get(b.name);if(c){let{needsNewClient:d,reason:e}=function(a,b,c=!1){if(Z.debug("Entering shouldRecreateClient method"),(0,B.wk)(a))return{needsNewClient:!0,reason:"Existing connection is closed"};if((a.__flujoCapKey??"")!==Y(b))return{needsNewClient:!0,reason:"Client capabilities (sampling/elicitation/MCP Apps) 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!==ab(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}else if(c.__flujoHttpKey!==ac(b))return{needsNewClient:!0,reason:`${b.transport} auth/connection parameters changed`};return{needsNewClient:!1}}if("websocket"===b.transport){if(!(a.transport instanceof v.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof w.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!==ac(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof x.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!==ac(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof u.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!==ab(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}(c,b,a);if(!d)return aH.info(`connectServer: Server ${b.name} is already connected`),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!0};aH.info(`connectServer: Existing client for ${b.name} is stale (${e}), recreating`),this.deregisterClient(b.name);try{await ah(c,b.name,b)}catch(a){aH.debug(`connectServer: error closing stale client for ${b.name}: ${a instanceof Error?a.message:String(a)}`)}c=void 0}c=a?al(b):ad(b);let d=a?an(b):ae(b);if(a){let a=c.setNotificationHandler?.bind(c);a&&(a("notifications/resources/list_changed",()=>{this.onResourceListChanged(b.name)}),a("notifications/resources/updated",a=>{let c=a?.params?.uri;c&&this.onResourceUpdated(b.name,c)}))}else!function(a,b,c,d){try{a.setNotificationHandler(m.hh,a=>{aE.debug(`resourceListChanged notification received for ${b}`),c(b)})}catch(a){aE.warn(`registerResourceNotificationHandlers: failed to register list_changed for ${b}`,a)}if(d)try{a.setNotificationHandler(m.cL,a=>{let c=a.params?.uri;c&&(aE.debug(`resourceUpdated notification received for ${b} uri=${c}`),d(b,c))})}catch(a){aE.warn(`registerResourceNotificationHandlers: failed to register resource_updated for ${b}`,a)}}(c,b.name,a=>this.onResourceListChanged(a),(a,b)=>this.onResourceUpdated(a,b));let e=d.stderr;if(e&&"function"==typeof e.on){let a=b.name;e.on("data",b=>{let c=b.toString();aH.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)})}d.onclose=()=>{if(this.activeTransports.get(b.name)!==d)return void aH.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${b.name}`);aH.warn(`connectServer: Connection closed for server ${b.name}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void aH.info(`Server ${b.name} is now disabled, skipping reconnection logic`);aH.info(`Connection closed for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{aH.warn(`Error checking server config for ${b.name} during onclose:`,a)})},d.onerror=a=>{if((0,B.lO)(a))return void aH.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 aH.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${b.name}`);if(aH.error(`connectServer: Transport error for server ${b.name}:`),a instanceof Error){aH.error(`Error name: ${a.name}`),aH.error(`Error message: ${a.message}`),aH.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&aH.error(`Error code: ${b}`),aH.error(`Error chain: ${(0,B.jf)(a)}`)}else if(a&&"object"==typeof a){aH.error(`Error type: ${typeof a}`),aH.error(`Error constructor: ${a.constructor?.name||"Unknown"}`);let b=Object.getOwnPropertyNames(a);b.length>0?(aH.error(`Error properties: ${b.join(", ")}`),b.forEach(b=>{try{let c=a[b];aH.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){aH.error(` ${b}: [Unable to serialize: ${a}]`)}})):aH.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);aH.error(`JSON stringified error: ${b}`)}catch(a){aH.error(`Cannot JSON stringify error: ${a}`)}}else aH.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 aH.info(`Server ${b.name} is now disabled, skipping reconnection after transport error`);aH.info(`Transport error for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{aH.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.clientGenerations.set(b.name,this.getClientGeneration(b.name)+1),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name);let f=function(a){if(ak(a))try{return a.getNegotiatedProtocolVersion()}catch{return}}(c);return aH.info(`connectServer: Successfully connected to ${b.name}`+(f?` (beta SDK, negotiated MCP protocol ${f})`:"")),{success:!0}}catch(h){let a;aH.error(`connectServer: Failed to connect to server ${b.name}:`,h);let c=h instanceof Error?h.message:String(h),d=(0,B.uP)(h),e=(0,B.Ah)(h);if(e&&("streamable"===b.transport||"sse"===b.transport)){let c=b.serverUrl;c&&(a=(await (0,aD.n)(c)).oauthCapable)}if(d||a){if(aH.info(`OAuth authentication error detected for server ${b.name}: ${c}`),"streamable"===b.transport&&a){let a=b;if(!a.oauthScopes||0===a.oauthScopes.length){aH.info(`Dynamically enabling OAuth for server ${b.name} after capability confirmation`);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]))),aH.info(`Updated config for ${b.name} to enable OAuth`))}}catch(a){aH.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,oauthCapable:!0}}if(e)return{success:!1,error:c,requiresAuthentication:!0,oauthCapable:a};let f=this.stderrLogs.get(b.name)||[],g=(0,B.ox)(h,b,f);return this.lastConnectionError.set(b.name,g),{success:!1,error:g}}finally{this.connectingServers.delete(b.name)}}async testConnection(a,b,c){aH.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,W.x0)(e,d)}}let j=await $(h),k=await aj()&&"websocket"!==j.transport;f=k?al(j):ad(j);let l=(g=k?an(j):ae(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=aC(a)?9e4:15e3,n=aC(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){aH.debug(`testConnection: connected to ${a.name} but listTools failed: ${b instanceof Error?b.message:String(b)}`)}return aH.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;aH.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,aD.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 ah(f,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){aH.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 aH.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{aH.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),aH.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){aH.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}async disconnectServer(a){if(aH.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 aH.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 ah(b,a,c||void 0),aH.info(`disconnectServer: Disconnected server ${a}`),{success:!0}}catch(b){return aH.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(aH.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 ah(b,a,c||void 0)}catch(b){aH.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a,b="model"){if(aH.debug(`listServerTools: Entering method for server ${a}, audience ${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 aH.warn(`listServerTools: ${b}`),{tools:[],error:b}}let{internalToolDefinitionsFor:d}=await c.e(5463).then(c.bind(c,25463)),e=await d(a);return{tools:(0,X.zm)(e,b)}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return aH.warn(`listServerTools: ${b}`),{tools:[],error:b}}let d=this.getClient(a);d||aH.warn(`listServerTools: Client not found for ${a}`);let e=await ar(d,a,b);if(e.error){aH.warn(`listServerTools: Listing tools for ${a} failed (${e.error}); forcing reconnect and retrying once`);let c=await this.forceReconnect(a);if(!c.success)return aH.warn(`listServerTools: Reconnect for ${a} failed: ${c.error}`),{tools:[],error:c.error||e.error};d=this.clients.get(a),(e=await ar(d,a,b)).error?aH.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,e.error):aH.info(`listServerTools: Recovered after reconnect for ${a}; listed ${e.tools.length} tools`)}else aH.info(`listServerTools: Listed ${e.tools.length} tools for ${a}`);return e}async callTool(a,b,d,e,f,g,h,i="host"){if(aH.debug(`callTool: Entering method for server ${a}, tool ${b}, source ${i}`),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 aH.warn(`callTool: ${b}`),{success:!1,error:b}}let{internalCallToolFor:e,internalToolDefinitionsFor:f}=await c.e(5463).then(c.bind(c,25463));if("app"===i||"model"===i){let c=await f(a),d=(0,X.F)(c,a,b,i);if(!d.allowed)return aH.warn(`callTool: Rejected ${i} call to built-in tool: ${d.error}`),{success:!1,error:d.error,statusCode:d.statusCode}}let h=await e(this,a,b,d,g,i);return aH.info(`callTool: Dispatched internal tool ${b} on ${a}`),{success:!0,data:h}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return aH.warn(`callTool: ${b}`),{success:!1,error:b}}let j=this.getClient(a);if(!j){aH.warn(`callTool: No client for ${a}; forcing reconnect before calling ${b}`);let c=await this.forceReconnect(a);c.success?j=this.clients.get(a):aH.warn(`callTool: Reconnect for ${a} failed: ${c.error}`)}let k=await as(j,a,b,d,e,f,h,i);return aH.info(`callTool: Called tool ${b} on ${a}`),k}async callToolFromApp(a,b,c,d,e){let f=await this.checkMcpAppAccess(a);if(f)return f;let g=await this.callTool(a,b,c,d,void 0,void 0,e,"app");if("tool-authorization-list"!==g.errorType)return g;aH.warn(`callToolFromApp: visibility lookup failed for ${a}/${b}; reconnecting and retrying once before dispatch`);let h=await this.forceReconnect(a);return h.success?g=await this.callTool(a,b,c,d,void 0,void 0,e,"app"):{success:!1,error:h.error||g.error,statusCode:g.statusCode}}async isMcpAppAccessEnabled(a){let b=await this.isInternalServer(a),c=await this.getServerConfig(a);return c?.disabled!==!0&&(!!b||c?.enableMcpApps===!0)}async checkMcpAppAccess(a){if(await this.isMcpAppAccessEnabled(a))return null;let b=`MCP Apps are not enabled for server '${a}'. Enable them on the MCP page before opening or using this app.`;return aH.warn(`MCP App access denied: ${b}`),{success:!1,error:b,statusCode:403}}async readResourceFromApp(a,b){let c=await this.checkMcpAppAccess(a);return c||this.readResource(a,b)}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 aH.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=this.getClient(a);d||aH.warn(`listWithReconnect: Client not found for ${a}`);let e=await b(d,a);if(!e.error)return e;aH.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?aH.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,e.error):aH.info(`listWithReconnect: Recovered after reconnect for ${a}`),e):(aH.warn(`listWithReconnect: Reconnect for ${a} failed: ${f.error}`),{...c,error:f.error||e.error})}async listServerResources(a){if(aH.debug(`listServerResources: Entering method for server ${a}`),a===aF._&&await this.isInternalServer(a)){let{internalListResources:a}=await c.e(8001).then(c.bind(c,28001));return a()}if(a===aG.K3){let{filesystemListResources:a}=await c.e(793).then(c.bind(c,10793));return a()}return this.listWithReconnect(a,au,{resources:[]})}async listServerResourceTemplates(a){if(aH.debug(`listServerResourceTemplates: Entering method for server ${a}`),a===aF._&&await this.isInternalServer(a)){let{internalListResourceTemplates:a}=await c.e(8001).then(c.bind(c,28001));return a()}return this.listWithReconnect(a,av,{resourceTemplates:[]})}async readResource(a,b){if(aH.debug(`readResource: Entering method for server ${a}, uri ${b}`),a===aF._&&await this.isInternalServer(a)){let{internalReadResource:a}=await c.e(8001).then(c.bind(c,28001));return a(b)}if(a===aG.K3){let{filesystemReadResource:a,isFilesystemAppUri:d,isTouchedFileUri:e,readTouchedFileResource:f}=await c.e(793).then(c.bind(c,10793));if(d(b))return a(b);if(e(b))return f(b)}let d=this.getClient(a);d||aH.warn(`readResource: Client not found for ${a}`);let e=await aw(d,a,b);return aH.info(`readResource: Read resource ${b} on ${a}`),e}async listServerPrompts(a){return aH.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,ay,{prompts:[]})}async getPrompt(a,b,c){aH.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=this.getClient(a);d||aH.warn(`getPrompt: Client not found for ${a}`);let e=await az(d,a,b,c);return aH.info(`getPrompt: Got prompt ${b} on ${a}`),e}async resolveOAuthSecretForSave(a,b){return a===aB.RJ?b??"":a?a.startsWith("${global:")||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")?a:await (0,aA.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,W.at)(e,d);if(!f){""!==a&&(c[d]={value:a,metadata:{isSecret:!1}});continue}if((0,W.uh)(a)){let a=b?.[d];void 0!==a&&(c[d]=a);continue}if(a){if((0,W.T6)(a)||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")){c[d]={value:a,metadata:{isSecret:!0}};continue}c[d]={value:await (0,aA.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}),aH.debug(`ensureRemoteServerRootDir: ensured ${c} for ${a.name}`)}catch(b){aH.warn(`ensureRemoteServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){if(aH.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===aG.K3||a===aG.PA)&&c.length>0&&c.every(a=>"roots"===a)&&Array.isArray(b.roots)&&d;if(e){await (0,aG.LV)(a,b.disabled),aH.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,aG.Eu)(a,b.roots),aH.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 aH.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 aH.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)aH.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 aH.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};if(b.env){aH.debug(`updateServerConfig: Resolving global variables in env for ${a}`);try{aH.debug(`Original env variables for ${a}:`,JSON.stringify(b.env,null,2)),b.env=await (0,n.resolveGlobalVars)(b.env),aH.debug(`Resolved env variables for ${a}:`,JSON.stringify(b.env,null,2)),aH.debug(`updateServerConfig: Successfully resolved global variables for ${a}`)}catch(b){aH.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),aH.info(`updateServerConfig: Successfully updated config for ${a}${e?` (renamed to ${h.name})`:""}`),h):(aH.warn(`updateServerConfig: Failed to save config for ${a}:`,k.error),k)}async handleConnectionStateChange(a,b){aH.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){aH.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{await this.disconnectServer(a)}catch(b){aH.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(aH.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(aH.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(aH.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){aH.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void aH.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(aH.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){aH.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){if(aH.debug(`deleteServerConfig: Entering method for server ${a}`),await this.isInternalServer(a))return{success:!1,error:`"${aF._}" is FLUJO's built-in server and cannot be deleted.`};this.clients.has(a)&&(aH.info(`deleteServerConfig: Disconnecting server ${a} before deletion`),await this.disconnectServer(a));let b=await this.loadServerConfigs();if(!Array.isArray(b))return aH.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return aH.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),aH.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?aH.info(`deleteServerConfig: Successfully deleted server ${a}`):aH.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 aH.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 aH.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 aH.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 aH.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 aH.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 aH.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 aH.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?(aH.info(`getServerStatus: Using ${c?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:e,stderrOutput:c||void 0}):(aH.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(){aH.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void aH.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled);aH.info(`Found ${b.length} enabled servers to start`),aH.debug(`${b}`),b.forEach(a=>this.connectingServers.add(a.name));let c=Math.max(1,Number(process.env.FLUJO_MCP_BOOT_CONCURRENCY)||2);aH.info(`Connecting ${b.length} enabled servers with boot concurrency ${c}`),await (0,k.P)(b,c,async a=>{aH.info(`Starting server: ${a.name}`),await this.connectServer(a).catch(b=>{aH.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 aH.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 aH.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 aH.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,this.resourceListVersion=new Map,this.pendingResourceUpdates=new Map}}let aJ=new aI},60724:(a,b,c)=>{"use strict";c.d(b,{h:()=>k});var d=c(87821),e=c(20433),f=c(60453),g=c(50846),h=c(65007);let i=(0,g.h)("backend/utils/PromptRenderer");class j{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;i.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:j}=await this.findNodePrompt(b,a),k=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,l=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,m=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:j;i.debug("Exclusion settings",{excludeModelPrompt:k,excludeStartNodePrompt:l,excludeSystemPrompt:m,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let n="",o=null;if(!l){let b=await this.findStartNodePrompt(a);b&&(i.debug("Adding start node prompt",{length:b.length}),n+=b+"\n\n")}if(!k){let c=await this.findModelPrompt(b,a);c.prompt&&(i.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),n+=c.prompt+"\n\n"),o=c.functionCallingSchema,c.reasoningSchema&&(n+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
72
+ ${d}`:d}(a.function.description??"",i);if(c){let c=!!a.function.parameters?.properties?.task;return C(b,j,h,async a=>(K.push({name:b,args:a??{}}),an.debug("Claude subscription requested handoff",{tool:b,callIndex:K.length,spawnable:c}),c)?{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."}]}:(L=!0,{content:[{type:"text",text:"Handing off."}]}))}if(e)return C(b,j,h,async a=>{let c;an.debug("Claude subscription local tool call",{tool:b});let d=X(b,a),f=!1;try{c=JSON.stringify(await e(a??{}))}catch(a){c=`Error: ${a instanceof Error?a.message:String(a)}`,f=!0}return T({id:d,resultContent:c}),f?{content:[{type:"text",text:c}],isError:!0}:{content:[{type:"text",text:c}]}});let{server:k,tool:l,timeout:m,nodeId:o,uiResourceUri:p}=d,q=function(a,b,c){let d=`${as(a)}__${as(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,I);return J.set(q,{serverName:k,toolName:l,advertisedUri:p}),C(q,j,h,async a=>{let b,c;an.debug("Claude subscription tool call",{server:k,tool:l,exposedAs:q});let d=X(q,a),e=await $.mcpService.callTool(k,l,a??{},m??ac.aI,void 0,o,M.signal,"model");if(e.success){if(b=e.data,c=JSON.stringify(e.data),n)try{let a=await (0,_.jR)(),e=await (0,aa.S)({conversationId:n,toolCallId:d,server:k,toolName:l,nodeId:o,content:c,settings:a});e.spilled&&(c=e.content,b={content:[{type:"text",text:e.content}]})}catch(a){an.warn("boundToolResult failed on subscription path; keeping full result",a)}}else b={content:[{type:"text",text:c=`Error: ${e.error??"Unknown error"}`}],isError:!0};let f=await (0,ab.K)(k,l,p,e.data),g=(0,ab.A)(e),h=f?{...f,...!e.success?{isError:!0}:{},...g?{cancelledReason:g}:{}}:void 0;return T({id:d,resultContent:c,...h?{ui:h}:{}}),b})}).filter(a=>null!==a),Z=Y.length>0?{[ap]:B({name:ap,version:"1.0.0",tools:Y})}:void 0,ag={...process.env};ag.CLAUDE_CODE_OAUTH_TOKEN=b,delete ag.ANTHROPIC_API_KEY;let am="string"!=typeof H;an.debug("createCompletion via Claude Agent SDK",{model:a.name,toolCount:Y.length,hasSystem:!!D,hasImages:am,maxTurns:h&&h>0?h:ao});let av=A({prompt:async function*(){yield{type:"user",parent_tool_use_id:null,message:{role:"user",content:H}}}(),options:{model:a.name,env:ag,abortController:M,maxTurns:h&&h>0?h:ao,includePartialMessages:!0,...a.reasoningEffort&&"minimal"!==a.reasoningEffort&&"ultra"!==a.reasoningEffort?{effort:a.reasoningEffort}:{},...w?{resume:w}:{},...D?{systemPrompt:D}:{},tools:[],disallowedTools:aq,...Z?{mcpServers:Z}:{},canUseTool:async(a,b,c)=>{if(!a.startsWith(`mcp__${ap}__`))return{behavior:"deny",message:`Tool ${a} is not permitted for this node.`};let d=a.replace(`mcp__${ap}__`,""),e=b??{};if(at(d)||V.has(c.toolUseID)||(S({id:c.toolUseID,name:d,argsJson:JSON.stringify(e)},W.get(c.toolUseID)),V.add(c.toolUseID),((a,b,c)=>{let d=U.get(a)??[];d.push({id:b,argsJson:c}),U.set(a,d)})(d,c.toolUseID,JSON.stringify(e))),j){let{approved:a,feedback:f}=await j({id:c.toolUseID,name:d,args:e});if(a)return{behavior:"allow",updatedInput:b};let g=f?`User rejected this tool call: ${f}`:"Tool call rejected by the user.",h=U.get(d);if(h){let a=h.findIndex(a=>a.id===c.toolUseID);a>=0&&h.splice(a,1),0===h.length&&U.delete(d)}let i=J.get(d),k=i?await (0,ab.K)(i.serverName,i.toolName,i.advertisedUri):void 0;return T({id:c.toolUseID,resultContent:g,...k?{ui:{...k,cancelledReason:g,isError:!0}}:{}}),{behavior:"deny",message:g}}return{behavior:"allow",updatedInput:b}}}}),aw="",ax="",ay=0,az=!1,aA=new Map,aB=async()=>{for await(let a of av){let b=a.session_id;if("string"==typeof b&&b&&(v=b),m?.aborted)break;if(K.length>0&&(L||K.length>=32)){M.abort();break}if("stream_event"===a.type){let b=a.event;if("content_block_start"===b.type&&"tool_use"===b.content_block.type){let c=`stream_claude_${a.uuid}_tool_${b.index}`;aA.set(`${a.uuid}:${b.index}`,{messageId:c,toolUseId:b.content_block.id}),W.set(b.content_block.id,c),l?.({messageId:c,toolCallDelta:{index:0,id:b.content_block.id,nameDelta:b.content_block.name}})}else if("content_block_delta"===b.type){if("text_delta"===b.delta.type&&b.delta.text)l?.({messageId:`stream_claude_${a.uuid}`,contentDelta:b.delta.text});else if("input_json_delta"===b.delta.type&&b.delta.partial_json){let c=aA.get(`${a.uuid}:${b.index}`);c&&l?.({messageId:c.messageId,toolCallDelta:{index:0,argumentsDelta:b.delta.partial_json}})}}}else 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;at(b.includes("__")?b.slice(b.lastIndexOf("__")+2):b)&&e++}}if(K.length>0&&0===e){M.abort();break}d&&0===K.length&&(ar(d)?an.warn("Quarantined malformed Claude tool-call prose (#298)"):(ax+=d,R({role:"assistant",content:d},`stream_claude_${a.uuid}`),az=!0)),b?.usage&&(y=b.usage,ay+=b.usage.output_tokens??0)}else if("result"===a.type){if(x=a.usage,"success"===a.subtype)aw=a.result??"";else if(0===K.length){let b=a.errors,c=Array.isArray(b)&&b.length?b.join("; "):a.subtype;throw Error(`Claude subscription run failed: ${c}`)}}}};try{if(m){let a,b=new Promise((b,c)=>{a=()=>c(Error("Claude subscription run cancelled by user.")),m.addEventListener("abort",a,{once:!0})}),c=aB();try{await Promise.race([c,b])}finally{a&&m.removeEventListener("abort",a),c.catch(()=>{})}if(m.aborted&&0===K.length)throw Error("Claude subscription run cancelled by user.")}else await aB()}catch(a){if(0===K.length)throw G&&(r=G.key,ak.delete(r)),a}finally{m?.removeEventListener("abort",N)}let aC=aw||ax,{promptTokens:aD,completionTokens:aE,cacheReadTokens:aF}=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}}(x,{lastTurnUsage:y,totalOutputTokens:ay});if(K.length>0&&(z=K.map(a=>({id:`call_${(0,i.A)()}`,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args)}}))),z?R({role:"assistant",content:null,tool_calls:z}):az||R({role:"assistant",content:aC||""}),G){let a=!!al(G.key,G.prefixHash,d.length,F);K.length>0||!v?(s=G.key,ak.delete(s)):(t=G.key,u={sessionId:v,prefixHash:G.prefixHash,seenMessageCount:d.length+O.length,leadingSystemMessageCount:F},ak.set(t,{...u,updatedAt:Date.now()})),an.debug("Claude session usage (#154)",{conversationId:n,nodeId:o,sessionResume:!!q,resumedThisTurn:!!w,reusableSessionAvailable:a,capturedSession:!!v,inputMessages:d.length,leadingSystemMessageCount:F,transcriptMessages:O.length,watermark:d.length+O.length,promptTokens:aD,cacheReadTokens:aF,completionTokens:aE,endedByHandoff:K.length>0})}return{completion:{id:`claude_sub_${(0,i.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.name,choices:[{index:0,finish_reason:z?"tool_calls":"stop",logprobs:null,message:{role:"assistant",content:aC||null,refusal:null,...z?{tool_calls:z}:{}}}],usage:{prompt_tokens:aD,completion_tokens:aE,total_tokens:aD+aE,...aF>0?{prompt_tokens_details:{cached_tokens:aF}}:{}}},transcript:O}}}var aw=c(21820),ax=c.n(aw),ay=c(33873),az=c.n(ay),aA=c(29021),aB=c(81630),aC=c.n(aB),aD=c(85853),aE=c(37464),aF=c(68780);let aG=(0,d.h)("backend/services/model/adapters/codexToolBridge");async function aH(a,b){let c=(0,aj.randomBytes)(16).toString("hex"),d=`/mcp/${c}`,e=aC().createServer(async(c,e)=>{if(!c.url||!c.url.startsWith(d))return void e.writeHead(404).end();let f=(()=>{let c=new aD.g({name:"flujo",version:"1.0.0"},{capabilities:{tools:{}},...b?{instructions:b}:{}});return c.setRequestHandler(aF.gW,async()=>({tools:a.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema??{type:"object",properties:{}},...a.annotations?{annotations:a.annotations}:{}}))})),c.setRequestHandler(aF.FT,async b=>{let c=a.find(a=>a.name===b.params.name);if(!c)return{content:[{type:"text",text:`Unknown tool: ${b.params.name}`}],isError:!0};try{return await c.handler(b.params.arguments??{})}catch(a){return{content:[{type:"text",text:`Error: ${a instanceof Error?a.message:String(a)}`}],isError:!0}}}),c})(),g=new aE.D({sessionIdGenerator:void 0,enableJsonResponse:!0});try{await f.connect(g),await g.handleRequest(c,e)}catch(a){aG.error("Codex tool-bridge request failed",a),e.headersSent||(e.writeHead(500,{"content-type":"application/json"}),e.end(JSON.stringify({error:"Internal bridge error."})))}finally{try{await g.close()}catch{}try{await f.close()}catch{}}});await new Promise((a,b)=>{e.once("error",b),e.listen(0,"127.0.0.1",()=>a())});let f=e.address();if(!f||"string"==typeof f)throw e.close(),Error("Codex tool bridge failed to bind a loopback port.");let g=`http://127.0.0.1:${f.port}${d}`;return aG.debug("Codex tool bridge started",{port:f.port,toolCount:a.length}),{url:g,close:()=>new Promise(a=>{e.closeAllConnections?.(),e.close(()=>a())})}}async function aI(){let a=process.env.CODEX_HOME?.trim()||az().join(ax().homedir(),".codex"),b=az().join(a,"models_cache.json");try{return(await aA.promises.stat(b)).isFile()?b:void 0}catch{return}}var aJ=c(43326);let aK="auth.json";async function aL(a){let b=az().join((0,aJ.getDataDir)(),"db","codex-runtime");await aA.promises.mkdir(b,{recursive:!0,mode:448});let c=az().join(b,"workspace");if(await aA.promises.mkdir(c,{recursive:!0,mode:448}),await aA.promises.writeFile(az().join(b,"config.toml"),"# Managed by FLUJO. Codex runtime settings are supplied per invocation.\n",{encoding:"utf8",mode:384}),a){let a=az().join(process.env.CODEX_HOME?.trim()||az().join(ax().homedir(),".codex"),aK),c=az().join(b,aK);if(az().resolve(a)!==az().resolve(c))try{await aA.promises.copyFile(a,c),await aA.promises.chmod(c,384).catch(()=>void 0)}catch(a){if("ENOENT"===a.code)await aA.promises.rm(c,{force:!0}).catch(()=>void 0);else throw a}}return{home:b,workingDirectory:c,env:{...Object.fromEntries(Object.entries(process.env).filter(a=>void 0!==a[1])),CODEX_HOME:b}}}let aM=new Map;function aN(a){return null===a||"object"!=typeof a?JSON.stringify(a)??"null":Array.isArray(a)?`[${a.map(aN).join(",")}]`:`{${Object.keys(a).sort().map(b=>`${JSON.stringify(b)}:${aN(a[b])}`).join(",")}}`}function aO(a){if(!a||"object"!=typeof a)return{value:a};let b={};for(let c of["role","content","name","tool_call_id","tool_calls","function_call","refusal"])void 0!==a[c]&&(b[c]=a[c]);return b}function aP(a){return(0,aj.createHash)("sha256").update(aN(a.map(aO))).digest("hex")}function aQ(a){aM.delete(a)}let aR=(0,d.h)("backend/services/model/adapters/codexAdapter"),aS="FLUJO MCP tools are the authoritative interface for the operations they expose. When filesystem__ tools are available, use them for all file operations; they run outside the Codex sandbox under FLUJO-managed roots and approvals, so a path may be valid even when it is outside the Codex working directory. Call filesystem__get_allowed_directories before guessing roots, and do not inspect the Codex runtime working directory unless the user explicitly asks.";function aT(a){return a.replace(/[^a-zA-Z0-9_-]/g,"_")}class aU{async createCompletion({model:a,apiKey:b,messages:d,tools:e,toolNameMap:f,localToolExecutors:g,requestToolApproval:h,onTranscriptMessage:j,onModelDelta:k,signal:l,conversationId:m,nodeId:n,runResourceMarkers:o,sessionResume:p}){var q;let r,s,t,u,v,w,{Codex:x}=await c.e(8321).then(c.bind(c,88321)),{systemPrompt:y,content:z}=au(d,o),A=new AbortController,B=()=>A.abort();l?.aborted?A.abort():l?.addEventListener("abort",B,{once:!0});let C=[],D=Date.now(),E=0,F=`${D}_${(0,i.A)()}`,G=a=>`stream_codex_${F}_${a}`,H=(a,b=`m_${(0,i.A)()}`)=>{let c={...a,id:b,timestamp:D+E++};C.push(c),j?.(c)},I=a=>{H({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.argsJson}}]})},J=a=>{H({role:"tool",tool_call_id:a.id,content:a.resultContent,...a.ui?{ui:a.ui}:{}})},K=a=>{I(a),J(a)},L=[],M=!1,N=async(a,b,c,d)=>{if(!h)return null;let{approved:e,feedback:f}=await h({id:a,name:b,args:c});if(e)return null;let g=f?`User rejected this tool call: ${f}`:"Tool call rejected by the user.",i=await d?.(g);return J({id:a,resultContent:g,...i?{ui:i}:{}}),{content:[{type:"text",text:g}],isError:!0}},O=new Set,P=(e??[]).filter(a=>"function"===a.type).map(a=>{let b=a.function.name,c=b.startsWith("handoff_to_")||"handoff"===b,d=f?.[b],e=g?.[b];if(!c&&!d&&!e)return null;let h=a.function.parameters,j=a.function.description??"";if(c){let a=!!h?.properties?.task;return{name:b,description:j,inputSchema:h,handler:async c=>(L.push({name:b,args:c??{}}),aR.debug("Codex requested handoff",{tool:b,callIndex:L.length,spawnable:a}),a)?{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."}]}:(M=!0,{content:[{type:"text",text:"Handing off."}]})}}if(e)return{name:b,description:j,inputSchema:h,handler:async a=>{let c,d=`call_${(0,i.A)()}`;I({id:d,name:b,argsJson:JSON.stringify(a??{})});let f=await N(d,b,a??{});if(f)return f;aR.debug("Codex local tool call",{tool:b});let g=!1;try{c=JSON.stringify(await e(a??{}))}catch(a){c=`Error: ${a instanceof Error?a.message:String(a)}`,g=!0}return J({id:d,resultContent:c}),g?{content:[{type:"text",text:c}],isError:!0}:{content:[{type:"text",text:c}]}}};let{server:k,tool:l,timeout:n,nodeId:o,annotations:p,uiResourceUri:q}=d,r=function(a,b,c){let d=`${aT(a)}__${aT(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,O);return{name:r,description:j,inputSchema:h,...p?{annotations:p}:{},handler:async a=>{let b,c,d=`call_${(0,i.A)()}`;I({id:d,name:r,argsJson:JSON.stringify(a??{})});let e=await N(d,r,a??{},async a=>{let b=await (0,ab.K)(k,l,q);return b?{...b,cancelledReason:a,isError:!0}:void 0});if(e)return e;aR.debug("Codex tool call",{server:k,tool:l,exposedAs:r});let f=await $.mcpService.callTool(k,l,a??{},n??ac.aI,void 0,o,A.signal,"model");if(f.success){if(b=f.data,c=JSON.stringify(f.data),m)try{let a=await (0,_.jR)(),e=await (0,aa.S)({conversationId:m,toolCallId:d,server:k,toolName:l,nodeId:o,content:c,settings:a});e.spilled&&(c=e.content,b={content:[{type:"text",text:e.content}]})}catch(a){aR.warn("boundToolResult failed on Codex path; keeping full result",a)}}else b={content:[{type:"text",text:c=`Error: ${f.error??"Unknown error"}`}],isError:!0};let g=await (0,ab.K)(k,l,q,f.data),h=(0,ab.A)(f),j=g?{...g,...!f.success?{isError:!0}:{},...h?{cancelledReason:h}:{}}:void 0;return J({id:d,resultContent:c,...j?{ui:j}:{}}),b}}}).filter(a=>null!==a),Q=m&&n?`${m}::${n}`:void 0;!p&&Q&&aQ(Q);let R=p&&m&&n?{key:Q,prefixHash:function(a,b,c){let d=(0,aj.createHash)("sha256");return d.update(aN({model:a,systemPrompt:b??"",tools:[...c].sort((a,b)=>a.name.localeCompare(b.name)).map(({name:a,description:b,inputSchema:c,annotations:d})=>({name:a,description:b,inputSchema:c??null,annotations:d??null}))})),d.digest("hex")}(a.name,y,P)}:void 0,S=z,T=y;if(R){let a=function(a,b,c){let d=aM.get(a);if(d&&d.prefixHash===b&&!(c.length<d.seenMessageCount)&&aP(c.slice(0,d.seenMessageCount))===d.historyHash)return d}(R.key,R.prefixHash,d);if(a&&d.length>a.seenMessageCount){let b=au(d.slice(a.seenMessageCount),o);b.content.length>0&&(r=a.threadId,S=b.content,T=void 0,aR.debug("Codex resuming SDK thread",{conversationId:m,nodeId:n,threadId:r,seenMessageCount:a.seenMessageCount,deltaMessages:d.length-a.seenMessageCount}))}}let U=[],V=async()=>(s||(s=await aA.promises.mkdtemp(az().join(ax().tmpdir(),"flujo-codex-"))),s),W=[];if(T&&W.push({type:"text",text:`<system_instructions>
73
+ ${T}
74
+ </system_instructions>`}),"string"==typeof S)W.push({type:"text",text:S});else for(let a of S)if("text"===a.type)W.push({type:"text",text:a.text});else if("image"===a.type)if("base64"===a.source.type){let b=await V(),c=a.source.media_type.split("/")[1]??"png",d=az().join(b,`img_${U.length}.${c}`);await aA.promises.writeFile(d,Buffer.from(a.source.data,"base64")),U.push(d),W.push({type:"local_image",path:d})}else W.push({type:"text",text:`[image: ${a.source.url}]`});let X="",Y=!1,Z=!1,ad=r;try{P.length>0&&(t=await aH(P,aS));let c=await aI(),d=await aL(!b),e={service_tier:a.serviceTier??"default",developer_instructions:aS,features:{shell_tool:!1},...c?{model_catalog_json:c}:{},...t?{mcp_servers:{flujo:{url:t.url,default_tools_approval_mode:"approve"}}}:{}},f=new x({...b?{apiKey:b}:{},env:d.env,...Object.keys(e).length>0?{config:e}:{}}),g={model:a.name,...a.reasoningEffort?{modelReasoningEffort:a.reasoningEffort}:{},workingDirectory:d.workingDirectory,skipGitRepoCheck:!0,approvalPolicy:"never"},h=r?f.resumeThread(r,g):f.startThread(g);aR.debug("createCompletion via Codex SDK",{model:a.name,toolCount:P.length,hasSystem:!!y,bridged:!!t,resumed:!!r,workingDirectory:d.workingDirectory,usingLocalModelCatalog:!!c});let j=1===W.length&&"text"===W[0].type?W[0].text:W,m=new Map;for(let a=0;a<2;a+=1){let b;try{let{events:c}=await h.runStreamed(0===a?j:"Continue the interrupted response from exactly where it stopped. Do not repeat content or tool calls already completed.",{signal:A.signal});for await(let a of c){if(l?.aborted)break;if("thread.started"===a.type){ad=a.thread_id;continue}if(L.length>0&&(M||L.length>=32)){A.abort();break}if("item.started"===a.type||"item.updated"===a.type||"item.completed"===a.type){let b=a.item;if("agent_message"===b.type){let a=m.get(b.id)??"",c=b.text.startsWith(a)?b.text.slice(a.length):b.text;c&&k?.({messageId:G(b.id),contentDelta:c}),m.set(b.id,b.text)}}if("item.completed"===a.type){let b=a.item;if("agent_message"===b.type){if(L.length>0){A.abort();break}b.text&&(X+=(X?"\n\n":"")+b.text,H({role:"assistant",content:b.text},G(b.id)),Y=!0)}else"command_execution"===b.type?K({id:`call_${(0,i.A)()}`,name:"shell",argsJson:JSON.stringify({command:b.command}),resultContent:b.aggregated_output??""}):"error"===b.type&&aR.warn("Codex reported a non-fatal item",{message:b.message})}else"turn.completed"===a.type?(u=a.usage,Z=!0):"turn.failed"===a.type&&(b=Error(a.error?.message??"unknown error"))}}catch(a){b=a instanceof Error?a:Error(String(a))}if(l?.aborted&&0===L.length)throw Error("Codex run cancelled by user.");if(!b||L.length>0)break;if(0===a&&!A.signal.aborted&&(!((q=b)instanceof Error)||"AbortError"!==q.name)&&(q instanceof Error?q.message:String(q??"")).includes("Connection closed mid-response. The response above may be incomplete.")){aR.warn("Codex connection closed mid-response; continuing the same thread once");continue}v=b.message;break}if(v&&0===L.length)throw Error(`Codex run failed: ${v}`)}catch(a){if(R&&aQ(R.key),0===L.length)throw a}finally{l?.removeEventListener("abort",B),await t?.close().catch(()=>void 0),s&&await aA.promises.rm(s,{recursive:!0,force:!0}).catch(()=>void 0)}L.length>0&&(w=L.map(a=>({id:`call_${(0,i.A)()}`,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args)}}))),w?H({role:"assistant",content:null,tool_calls:w}):Y||H({role:"assistant",content:X||""}),R&&(Z&&!v&&!l?.aborted&&0===L.length&&ad?function(a,b){if(aM.delete(a),aM.size>=200){let a=aM.keys().next();a.done||aM.delete(a.value)}aM.set(a,{...b,updatedAt:Date.now()})}(R.key,{threadId:ad,prefixHash:R.prefixHash,seenMessageCount:d.length+C.length,historyHash:aP([...d,...C])}):aQ(R.key),aR.debug("Codex SDK thread usage",{conversationId:m,nodeId:n,sessionResume:!!p,resumedThisTurn:!!r,capturedThread:!!ad,completedTurn:Z,inputMessages:d.length,transcriptMessages:C.length,watermark:d.length+C.length,endedByHandoff:L.length>0}));let ae=u?.input_tokens??0,af=u?.output_tokens??0,ag=u?.cached_input_tokens??0;return{completion:{id:`codex_${(0,i.A)()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.name,choices:[{index:0,finish_reason:w?"tool_calls":"stop",logprobs:null,message:{role:"assistant",content:X||null,refusal:null,...w?{tool_calls:w}:{}}}],usage:{prompt_tokens:ae,completion_tokens:af,total_tokens:ae+af,...ag>0?{prompt_tokens_details:{cached_tokens:ag}}:{}}},transcript:C}}}function aV(a){switch(a.adapter){case"openai-responses":return new B;case"anthropic":return new S;case"gemini":return new Z;case"claude-cli":return new av;case"codex-cli":return new aU;default:return new o}}},60184:(a,b,c)=>{"use strict";c.r(b),c.d(b,{INTERRUPTED_TOOL_RESULT_CONTENT:()=>E,_setConversationLogDirForTests:()=>n,allocateSeq:()=>s,appendFromBus:()=>w,appendRawForState:()=>x,deleteConversationLog:()=>A,flushConversationLog:()=>y,hasConversationLog:()=>I,latestSequence:()=>t,projectMessages:()=>B,readConversationLog:()=>z,reconcileConversationLog:()=>D,recoverMessagesFromLog:()=>G,repairDanglingToolCalls:()=>F,repairTruncatedConversationLog:()=>H});var d=c(29021),e=c(33873),f=c.n(e),g=c(75028),h=c(50846),i=c(43326);let j=(0,h.h)("backend/execution/flow/conversationLog"),k=new Set(["run:start","run:done","node:enter","node:exit","node:snapshot","node:changed-files","handoff","message","message:removed","tool:call","tool:result","usage","subflow:start","subflow:done","resource:read","resource:write","error"]),l=/^[A-Za-z0-9_-]+$/,m=f().join((0,i.getDataDir)(),"db","conversation-logs");function n(a){let b=m;return m=a,q.clear(),b}function o(a){return f().join(m,`${a}.jsonl`)}let p=new Map,q=new Map;function r(a){if(q.has(a))return;let b=-1;try{for(let c of(0,d.readFileSync)(o(a),"utf-8").split("\n"))if(0!==c.trim().length)try{let a=JSON.parse(c).seq;"number"==typeof a&&Number.isFinite(a)&&a>b&&(b=a)}catch{}}catch(b){"ENOENT"!==b.code&&j.warn(`Could not read conversation log ${a} to seed seq; starting at 0.`,{err:b})}q.set(a,b+1)}function s(a){r(a);let b=q.get(a);return q.set(a,b+1),b}async function t(a){return l.test(a)?(r(a),q.get(a)-1):-1}function u(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(m,{recursive:!0}),await d.promises.appendFile(o(a),b)});return p.set(a,c),c.finally(()=>{p.get(a)===c&&p.delete(a)})}function v(a){return`${JSON.stringify(a)}
75
+ `}function w(a){if(k.has(a.type)){if(!l.test(a.conversationId))return void j.warn("Refusing to log event for unsafe conversation id",{conversationId:a.conversationId});(function(a){try{if((0,g.isConversationDeleted)(a))return!1;let{FlowExecutor:b}=c(95708),d=b.conversationStates.get(a);if(!d)return!1;return!d.ephemeral}catch(b){return j.warn(`Could not resolve persistence policy for ${a}; not persisting.`,{err:b}),!1}})(a.conversationId)&&u(a.conversationId,v(a)).catch(b=>j.warn(`Failed to append event to conversation log ${a.conversationId}`,{err:b}))}}async function x(a,b){if(0===b.length||a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c)||(0,g.isConversationDeleted)(c))return;let d=b.map(a=>v({...a,conversationId:c,seq:s(c),timestamp:Date.now()})).join("");try{await u(c,d)}catch(a){j.warn(`Failed to append ${b.length} event(s) to conversation log ${c}`,{err:a})}}function y(a){let b=p.get(a);return b?b.then(()=>void 0,()=>void 0):Promise.resolve()}async function z(a){let b;if(!l.test(a))return;try{b=await d.promises.readFile(o(a),"utf-8")}catch(b){if("ENOENT"===b.code)return;j.error(`Error reading conversation log ${a}:`,b);return}let c=[],e=0;for(let a of b.split("\n"))if(0!==a.trim().length)try{c.push(JSON.parse(a))}catch{e++}return e>0&&j.warn(`Skipped ${e} unparseable line(s) in conversation log ${a} (truncated append?)`),c}async function A(a){if(l.test(a))try{await d.promises.unlink(o(a))}catch(b){"ENOENT"!==b.code&&j.warn(`Error deleting conversation log ${a}:`,b)}}function B(a){let b=[],c=new Map,d=new Map;for(let e of a)if("message"===e.type){let a=e.message;if(!a||!a.id||"system"===a.role)continue;let f=e.depth??0,g=a.id,h=c.get(g);if(void 0!==h&&/^stream_codex_item_/.test(g)){let a=(d.get(g)??1)+1;d.set(g,a),g=`${g}_legacy_${a}`,h=void 0}else d.has(g)||d.set(g,1);let i=g===a.id?a:{...a,id:g},j=f>0?{...i,depth:f}:{...i};void 0!==h?b[h]=j:(c.set(g,b.length),b.push(j))}else if("message:removed"===e.type){let a=c.get(e.messageId);if(void 0===a)continue;for(let[d,f]of(b.splice(a,1),c.delete(e.messageId),c))f>a&&c.set(d,f-1)}return b}function C(a){return JSON.stringify([a.role,a.content,a.tool_calls??null,a.disabled??!1,a.processNodeId??null])}async function D(a,b){if(a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c))return;let d=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id),e=await I(c)?b.filter(a=>"system"!==a.role&&!!a.id):[],f=new Map(e.map(a=>[a.id,a])),g=new Set(d.map(a=>a.id)),h=[];for(let a of d){let b=f.get(a.id);b&&C(b)===C(a)||h.push({type:"message",message:a})}for(let a of e)g.has(a.id)||h.push({type:"message:removed",messageId:a.id});await x(a,h)}let E="Tool execution interrupted (FLUJO restarted before this tool finished)";function F(a,b=E){let c=a.messages??[];if(0===c.length)return[];let d=new Set;for(let a of c)if("tool"===a.role){let b=a.tool_call_id;b&&d.add(b)}let e=[],f=[];for(let a=0;a<c.length;a++){let g=c[a];f.push(g);let h=g.tool_calls;if("assistant"!==g.role||!Array.isArray(h)||0===h.length)continue;let i=h.filter(a=>!!a.id&&!d.has(a.id));if(0===i.length)continue;let j=a+1;for(;j<c.length&&"tool"===c[j].role;)f.push(c[j]),j++;for(let a of i){let c={id:crypto.randomUUID(),role:"tool",tool_call_id:a.id,content:b,timestamp:Date.now(),...void 0!==g.processNodeId?{processNodeId:g.processNodeId}:{},...void 0!==g.depth?{depth:g.depth}:{}};f.push(c),e.push(c),d.add(a.id)}a=j-1}return 0===e.length?[]:(a.messages=f,e)}async function G(a){if(a.ephemeral)return!1;let b=a.conversationId;if(!b||!l.test(b))return!1;let c=await z(b);if(!c)return!1;let d=B(c).filter(a=>!((a.depth??0)>0)),e=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id).map(a=>a.id);if(d.length<=e.length)return!1;let f=new Set(d.map(a=>a.id));return!!e.every(a=>f.has(a))&&(j.info(`Recovered ${d.length-e.length} message(s) from the conversation log for ${b} (snapshot was behind).`),a.messages=d,!0)}async function H(a){if(a.ephemeral)return;let b=a.conversationId;if(!b||!l.test(b))return;let c=await z(b);if(!c)return;let e=B(c).filter(a=>!((a.depth??0)>0)),f=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id);if(e.length>=f.length)return;let g=new Set(f.map(a=>a.id));if(!e.every(a=>g.has(a.id)))return;let h=0,i=f.map(a=>v({type:"message",message:a,conversationId:b,seq:h++,timestamp:Date.now()})).join("");q.set(b,h);try{await function(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(m,{recursive:!0}),await d.promises.writeFile(o(a),b)});return p.set(a,c),c.finally(()=>{p.get(a)===c&&p.delete(a)})}(b,i),j.info(`Rebuilt truncated conversation log for ${b} from snapshot (${e.length} → ${f.length} message(s)); issue #49 self-heal.`)}catch(a){j.warn(`Failed to rebuild truncated conversation log ${b}`,{err:a})}return f}async function I(a){if(!l.test(a))return!1;try{return await d.promises.access(o(a)),!0}catch{return!1}}},60453:(a,b,c)=>{"use strict";c.r(b),c.d(b,{MCPService:()=>aI,mcpService:()=>aJ});var d=c(32524),e=c(79748),f=c.n(e),g=c(33873),h=c.n(g),i=c(50846),j=c(43326),k=c(36445),l=c(74186),m=c(68780),n=c(73456),o=c(77213),p=c(68383),q=c(72904),r=c(92372),s=c(38844),t=c(4231),u=c(37601),v=c(58302),w=c(51605),x=c(3712),y=c(29021),z=c(21820),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(58858),K=c(46496);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=[];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),o=d.maxTokens??(0,K.normalizeMaxTokens)(h.maxTokens),{completion:p}=await n.createCompletion({model:h,apiKey:i,messages:k,temperature:l,maxTokens:o}),q=p.choices?.[0]?.message?.content;return{role:"assistant",content:{type:"text",text:"string"==typeof q?q:""},model:h.name,stopReason:"endTurn"}}}var P=c(14214),Q=c(30767),R=c(97701);let S=(0,i.h)("backend/services/mcp/elicitation");function T(a){return a.elicitation}function U(a){let b=T(a);return!!b?.enabled}function V(a){return async b=>{if(!U(a))throw new m.Nh(m.O4.MethodNotFound,"Elicitation is not enabled for this server");let c=(0,Q.lx)(a.name);if(!c)return S.warn(`Elicitation request from ${a.name} outside an active run; auto-cancelling`),{action:"cancel"};if(c.getUnattended())return S.warn(`Elicitation request from ${a.name} in unattended run ${c.conversationId}; auto-cancelling`),{action:"cancel"};let d=b.params;if(d?.mode==="url")return S.warn(`Elicitation URL mode is not supported in V1 (server: ${a.name}); auto-cancelling`),{action:"cancel"};let e=d?.message??"Additional information required",f=d?.requestedSchema??{type:"object",properties:{}},g=crypto.randomUUID();S.info(`Suspending for elicitation ${g} from ${a.name} in conv ${c.conversationId}`),P.$.emitterFor(c.conversationId)({type:"run:awaiting_elicitation",elicitationId:g,message:e,requestedSchema:f});let h=await (0,R.gV)(g);return S.info(`Elicitation ${g} resolved with action=${h.action}`),h}}var W=c(34079),X=c(31659);function Y(a){return[function(a){let b=M(a);return b?.enabled?JSON.stringify({m:b.modelId,t:b.maxTokens,r:b.maxCallsPerMinute}):""}(a),function(a){let b=T(a);return b?.enabled?"e:1":""}(a),!0===a.enableMcpApps?"mcp-apps:on":"mcp-apps:off"].join("|")}let Z=(0,i.h)("backend/services/mcp/connection");async function $(a){let b=a;if(a.env&&"object"==typeof a.env){let c={};for(let[b,d]of Object.entries(a.env)){if(!b)continue;let a=d&&"object"==typeof d&&"value"in d?d.value??"":d??"";if(!a||(0,W.uh)(a))continue;let e=await (0,n.G)(a);e&&(c[b]=e)}b={...b,env:c}}if("streamable"!==a.transport&&"sse"!==a.transport||!a.headers||"object"!=typeof a.headers)return b;let c={};for(let[b,d]of Object.entries(a.headers)){if(!b)continue;let{value:a}=(0,W.at)(d,b);if(!a||(0,W.uh)(a))continue;let e=await (0,n.G)(a);e&&(c[b]=e)}return{...b,headers:c}}function _(a){let b={};for(let[c,d]of Object.entries(a)){if(!c)continue;let{value:a}=(0,W.at)(d,c);"string"==typeof a&&a.length>0&&(b[c]=a)}return b}function aa(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 ab(a){return JSON.stringify({command:a.command,args:a.args??[],env:aa(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??""})}function ac(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 ad(a){Z.debug("Entering createNewClient method");let b=N(a),c=U(a),d=!0===a.enableMcpApps,e=new t.K({name:`flujo-${a.name}-client`,version:"3.34.0"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{},...c?{elicitation:{}}:{},...d?{extensions:{[X.OF]:{mimeTypes:[X.cM]}}}:{}}});return(0,H.FP)(e,a),b&&e.setRequestHandler(m.u9,O(a)),c&&e.setRequestHandler(m.$9,V(a)),e.__flujoCapKey=Y(a),e}function ae(a){if(Z.debug("Entering createTransport method"),"streamable"===a.transport){Z.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=_(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},Z.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}a.oauthClientId||a.oauthClientInformation?(Z.info(`Setting up OAuth authentication for ${a.name}`),b.authProvider=(0,A.C)(a),a.oauthTokens?.access_token?(Z.debug(`OAuth provider configured for ${a.name} with existing tokens`),Z.debug(`Token expires in: ${a.oauthTokens.expires_in} seconds`)):Z.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)):Z.debug(`No OAuth configuration found for ${a.name}`);let c=new w.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ac(a),c}if("sse"===a.transport){Z.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=_(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},Z.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new x.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ac(a),c}if("websocket"===a.transport)return Z.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new v.I(new URL(a.websocketUrl));{var b=a;if(Z.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}=af(b);Z.info(`Creating StdioClientTransport for ${b.name} with stderr: 'pipe'`);let g=new u.oQ({command:c,args:d,env:e,cwd:f,stderr:"pipe"});return g.__flujoStdioKey=ab(b),g.stderr?Z.info(`Stderr stream is available for ${b.name}`):Z.warn(`Stderr stream is NOT available for ${b.name}`),g}}function af(a){let b=a.command,c=a.args?[...a.args]:[],d=`${o.VL}/${a.name}`;Z.info(`Creating stdio transport for server ${a.name}`),Z.debug(`Original command: ${b}`),Z.debug(`Original args: ${JSON.stringify(c)}`),Z.debug(`Server directory: ${d}`);let e=!g.isAbsolute(b)&&(b.includes("/")||b.includes("\\")),f=!b.includes("/")&&!b.includes("\\");if(Z.debug(`Is relative path: ${e}`),Z.debug(`Is just filename: ${f}`),"win32"===z.platform()&&b.toLowerCase().endsWith(".bat"))if(Z.debug(`Detected .bat file on Windows: ${b}`),f){let a=g.join((0,j.getDataDir)(),d,b);Z.debug(`Checking if file exists at: ${a}`);let e=y.existsSync(a);Z.debug(`File exists: ${e}`),e?(Z.debug(`Using full path to .bat file: ${a}`),c=["/c",a,...c]):(Z.warn(`WARNING: .bat file not found at ${a}`),c=["/c",b,...c]),b="cmd.exe"}else Z.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:z.platform(),dirname:g.dirname,joinPath:g.join,fileExists:y.existsSync});h!==b&&(Z.debug(`Resolved Node toolchain command "${b}" to absolute path: ${h}`),b=h),Z.debug(`Final command: ${b}`),Z.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:`${o.VL}/${a.name}`}),k=g.isAbsolute(i)?i:g.join((0,j.getDataDir)(),i);Z.debug(`cwd: ${k}`),Z.debug(`env: ${JSON.stringify(a.env)}`);let l=aa(a.env);return Z.verbose("Transformed environment variables",JSON.stringify(l)),{command:b,args:c,env:l,cwd:k}}function ag(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 ah(a,b,c,d){Z.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(),Z.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){Z.warn(`Error closing stdin for ${b}:`,a)}let a=await ag(c,e);if(!a){Z.warn(`Process did not exit within ${e}ms after stdin close, sending SIGTERM for ${b}`);try{c.kill("SIGTERM")}catch(a){Z.error(`Error sending SIGTERM for ${b}:`,a)}a=await ag(c,f)}if(a)Z.info(`Process exited gracefully for ${b}`);else{Z.warn(`Process did not respond to SIGTERM, sending SIGKILL for ${b}`);try{c.kill("SIGKILL")}catch(a){Z.error(`Error sending SIGKILL for ${b}:`,a)}}}await a.close(),Z.info(`Client closed successfully for ${b}`)}catch(a){Z.warn(`Error closing client for ${b}:`,a)}}let ai=(0,i.h)("backend/services/mcp/betaClient");async function aj(){try{let a=await (0,r.YM)(s.Z.SPEECH_SETTINGS,void 0);return!!a?.experimental?.mcpBetaProtocol}catch(a){return ai.warn("Failed to read mcpBetaProtocol setting; defaulting to disabled",{err:a}),!1}}function ak(a){return!0===a.__flujoBeta}function al(a){let b=N(a),c=U(a),d=!0===a.enableMcpApps,e=new p.Kj({name:`flujo-${a.name}-client`,version:"3.27.0"},{capabilities:{roots:{listChanged:!0},...b?{sampling:{}}:{},...c?{elicitation:{}}:{},...d?{extensions:{[X.OF]:{mimeTypes:[X.cM]}}}:{}},versionNegotiation:{mode:"auto"}});if(e.setRequestHandler("roots/list",(0,H.sG)(a)),b){let b=O(a);e.setRequestHandler("sampling/createMessage",async a=>b(a))}if(c){let b=V(a);e.setRequestHandler("elicitation/create",async a=>b(a))}return e.__flujoBeta=!0,e.__flujoCapKey=Y(a),ai.info(`Created v2-beta MCP client for ${a.name} (version negotiation: auto)`),e}function am(a){let b=a.requestInit&&"object"==typeof a.requestInit?a.requestInit:void 0;if(a.headers&&"object"==typeof a.headers){let c=_(a.headers);Object.keys(c).length>0&&(b={...b||{},headers:{...b?.headers||{},...c}})}return b}function an(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=am(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 p.jS(new URL(a.serverUrl),b);return d.__flujoHttpKey=ac(a),d.__flujoKind="streamable",ai.info(`Created v2-beta streamable transport for ${a.name}`),d}if("sse"===a.transport){let b={},c=am(a);c&&(b.requestInit=c),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit);let d=new p.Am(new URL(a.serverUrl),b);return d.__flujoHttpKey=ac(a),d.__flujoKind="sse",ai.info(`Created v2-beta SSE transport for ${a.name}`),d}let{command:b,args:c,env:d,cwd:e}=af(a),f=new q.oQ({command:b,args:c,env:d,cwd:e,stderr:"pipe"});return f.__flujoStdioKey=ab(a),f.__flujoKind="stdio",ai.info(`Created v2-beta stdio transport for ${a.name}`),f}let ao=a=>new Promise(b=>setTimeout(b,a)),ap=(0,i.h)("backend/services/mcp/tools"),aq=0x80000000-1;async function ar(a,b,c="model"){if(ap.debug("Entering listServerTools method"),!a)return ap.warn(`Server ${b} not connected`),{tools:[],error:"Server not connected"};try{ap.info(`Listing tools for server ${b}`);let d=await a.listTools();ap.verbose("Raw response from MCP server:",d);let e=(d.tools||[]).map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema||{},...a.annotations?{annotations:a.annotations}:{},...a._meta?{_meta:a._meta}:{}})),f=(0,X.zm)(e,c);return ap.verbose(`Processed tools for ${c} audience:`,f),{tools:f}}catch(c){ap.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 as(a,b,c,d,e,f,g,h="host"){if(ap.debug("Entering callTool method"),!a)return ap.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};let i=void 0!==e&&e>0?Math.min(1e3*e,aq):aq;try{if("app"===h||"model"===h){let d=await ar(a,b,"all");if(d.error)return{success:!1,error:`Could not verify MCP App access to tool '${c}' on '${b}': ${d.error}`,errorType:"tool-authorization-list",statusCode:502};let e=(0,X.F)(d.tools,b,c,h);if(!e.allowed)return ap.warn(`Rejected ${h} tool call: ${e.error}`),{success:!1,error:e.error,statusCode:e.statusCode}}ap.debug(`Original args for tool ${c}:`,d);let e=await (0,n.resolveGlobalVars)(d),j=function(a,b){if(!a)return{};let c={};for(let d in a){let e=a[d];null==e?(ap.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,ap.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,ap.debug(`Using default value false for likely boolean parameter: ${d}`)):d.includes("array")||d.endsWith("s")||d.endsWith("List")||d.endsWith("Items")?(c[d]=[],ap.debug(`Using empty array for likely array parameter: ${d}`)):d.includes("object")||d.endsWith("Options")||d.endsWith("Config")||d.endsWith("Settings")?(c[d]={},ap.debug(`Using empty object for likely object parameter: ${d}`)):(c[d]="",ap.debug(`Using empty string for parameter with unknown type: ${d}`))):c[d]=e}return c}("object"==typeof e&&null!==e?e:{},c);ap.debug(`Normalized args for tool ${c}:`,j),ap.debug(`Calling tool ${c} with SDK timeout ${i}ms`);let k={timeout:i,resetTimeoutOnProgress:!0,...g?{signal:g}:{},onprogress:a=>{ap.debug(`Progress for tool ${c}: ${a.progress}${void 0!==a.total?`/${a.total}`:""}${a.message?` — ${a.message}`:""}`),f?.(a)}},l=ak(a)?await a.callTool.call(a,{name:c,arguments:j},k):await a.callTool({name:c,arguments:j},void 0,k);if((0,o.h$)(l)){let d,e=l.task;ap.info(`Tool ${c} on ${b} returned task handle ${e.taskId} (status: ${e.status})`),f?.({progress:0,message:`Task ${e.taskId} created (${e.status})`});let h=Math.min(Math.max(e.pollInterval??5e3,1e3),3e4),j=new Set(["completed","failed","cancelled"]),k=e.status,m=0,n=j.has(k);if("completed"===k)return{success:!0,data:e.result,progressToken:e.taskId};if("failed"===k)return{success:!1,error:e.error??`Task ${e.taskId} failed`,progressToken:e.taskId};let o=()=>(d||(d=(async()=>{try{await a.request({method:"tasks/cancel",params:{taskId:e.taskId}},void 0,{timeout:1e4})}catch(a){ap.warn(`Best-effort cancellation failed for task ${e.taskId}:`,a)}})()),d),p=()=>{o()};g?.addEventListener("abort",p,{once:!0});try{for(;!j.has(k);){if(g?.aborted||(await ao(h),m+=h,g?.aborted))throw await o(),Error(`Tool call cancelled (task ${e.taskId})`);let b=await a.request({method:"tasks/get",params:{taskId:e.taskId}},void 0,{signal:g,timeout:i});if(g?.aborted)throw await o(),Error(`Tool call cancelled (task ${e.taskId})`);let c=b.task;if(k=c.status,n=j.has(k),ap.debug(`Task ${e.taskId} poll: status=${c.status}, elapsed=${m}ms`),f?.({progress:"completed"===c.status?100:Math.min(99,Math.round(m/1e3)),message:`Task ${e.taskId}: ${c.status}`}),"completed"===c.status)return{success:!0,data:c.result,progressToken:e.taskId};if("failed"===c.status)return{success:!1,error:c.error??`Task ${e.taskId} failed`,progressToken:e.taskId}}return{success:!1,error:`Tool '${c}' task ${e.taskId} was cancelled by the server.`,errorType:"cancelled",progressToken:e.taskId}}catch(a){throw n||await o(),a}finally{g?.removeEventListener("abort",p)}}return{success:!0,data:l}}catch(e){ap.warn(`Failed to call tool ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;if(g?.aborted)return{success:!1,error:`Tool '${c}' call was cancelled.`,errorType:"cancelled",toolName:c};if(e instanceof m.Nh&&e.code===m.O4.RequestTimeout){let a=Math.round(i/1e3);return ap.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 ap.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"))&&(ap.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 at=(0,i.h)("backend/services/mcp/resources");async function au(a,b){if(at.debug("Entering listServerResources method"),!a)return at.warn(`Server ${b} not connected`),{resources:[],error:"Server not connected"};try{at.info(`Listing resources for server ${b}`);let c=(await a.listResources()).resources||[];return at.verbose("Processed resources:",c),{resources:c}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return at.debug(`Server ${b} does not support resources/list`),{resources:[]};at.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 av(a,b){if(at.debug("Entering listServerResourceTemplates method"),!a)return at.warn(`Server ${b} not connected`),{resourceTemplates:[],error:"Server not connected"};try{return at.info(`Listing resource templates for server ${b}`),{resourceTemplates:(await a.listResourceTemplates()).resourceTemplates||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return at.debug(`Server ${b} does not support resources/templates/list`),{resourceTemplates:[]};at.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 aw(a,b,c){if(at.debug("Entering readResource method"),!a)return at.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let d=await (0,n.resolveGlobalVars)(c);at.info(`Reading resource ${d} from server ${b}`);let e=await a.readResource({uri:d});return{success:!0,data:e}}catch(e){at.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 ax=(0,i.h)("backend/services/mcp/prompts");async function ay(a,b){if(ax.debug("Entering listServerPrompts method"),!a)return ax.warn(`Server ${b} not connected`),{prompts:[],error:"Server not connected"};try{return ax.info(`Listing prompts for server ${b}`),{prompts:(await a.listPrompts()).prompts||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return ax.debug(`Server ${b} does not support prompts/list`),{prompts:[]};ax.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 az(a,b,c,d){if(ax.debug("Entering getPrompt method"),!a)return ax.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}ax.info(`Getting prompt ${c} from server ${b}`);let f=await a.getPrompt({name:c,arguments:e});return{success:!0,data:f}}catch(e){ax.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 aA=c(40829),aB=c(49680);function aC(a){return"stdio"===a.transport&&F(a.command,a.args??[])}var aD=c(76054);let aE=(0,i.h)("backend/services/mcp/resourceNotifications");var aF=c(81495),aG=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),void 0===global.__mcp_client_generation&&(global.__mcp_client_generation=new Map),void 0===global.__mcp_tool_schema_hash&&(global.__mcp_tool_schema_hash=new Map);let aH=(0,i.h)("backend/services/mcp/index");class aI{get clients(){return global.__mcp_clients}get connectingServers(){return global.__mcp_connecting}get activeTransports(){return global.__mcp_active_transports}get clientGenerations(){return global.__mcp_client_generation}get toolSchemaHashes(){return global.__mcp_tool_schema_hash}static{this.MAX_STDERR_LOG_ENTRIES=200}appendStderrLog(a,b){let c=this.stderrLogs.get(a)||[];c.push(b),c.length>aI.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-aI.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){this.clients.delete(a),this.activeTransports.delete(a)}onResourceListChanged(a){let b=this.resourceListVersion.get(a)??0;this.resourceListVersion.set(a,b+1),aH.debug(`onResourceListChanged: server=${a} version=${b+1}`)}onResourceUpdated(a,b){let c=this.pendingResourceUpdates.get(a)??new Set;c.add(b),this.pendingResourceUpdates.set(a,c),aH.debug(`onResourceUpdated: server=${a} uri=${b}`)}getResourceListVersion(a){return this.resourceListVersion.get(a)??0}async subscribeToResource(a,b){try{let c=this.getClient(a);if(!c)return;let d=c.getServerCapabilities?.();if(!d?.resources?.subscribe)return;await c.subscribeResource({uri:b}),aH.debug(`subscribeToResource: server=${a} uri=${b}`)}catch(c){aH.debug(`subscribeToResource: ignored error for ${a}/${b}:`,c)}}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),aH.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){aH.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);aH.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout(async()=>{aH.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){aH.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){aH.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}),aH.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){aH.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)aH.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(aH.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication){aH.info(`Server ${a} requires authentication, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){aH.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,aH.info(`Backend startup state set to: ${a?"starting":"complete"}`)}getClientGeneration(a){return this.clientGenerations.get(a)??0}setToolSchemaHash(a,b,c){this.toolSchemaHashes.set(`${a}\0${b}`,c)}getToolSchemaHash(a,b){return this.toolSchemaHashes.get(`${a}\0${b}`)}getClient(a){let b=this.clients.get(a);if(b&&(0,B.wk)(b)){aH.warn(`getClient: client for ${a} has a closed/aborted connection — evicting it`),this.clients.delete(a);return}return aH.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){aH.debug("loadServerConfigs: Entering method");try{let a=await (0,l.loadServerConfigs)();if(!Array.isArray(a))return aH.warn("loadServerConfigs: Received non-array response",a),a;for(let b of(await (0,aG.XS)())){if(a.some(a=>a.name===b.name)){aH.warn(`loadServerConfigs: A stored server is named "${b.name}" — it shadows FLUJO's built-in server`);continue}a.push(b)}return aH.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){return aH.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){aH.debug(`getServerConfig: Looking up config for server ${a}`);let b=await this.loadServerConfigs();if(!Array.isArray(b))return aH.warn(`getServerConfig: Failed to load configs for ${a}:`,b.error),null;let c=b.find(b=>b.name===a);return c||(aH.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,aG.Co)(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,aG.Co)(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 aH.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){aH.info(`connectServer: Looking up config for server ${a}`);let c=await this.getServerConfig(a);if(!c)return aH.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 aH.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)();aH.info(`connectServer: Starting connection for server ${b.name} [RequestID: ${c}]`),this.connectingServers.add(b.name);try{this.stderrLogs.set(b.name,[]),b=await $(b);let a=await aj()&&"websocket"!==b.transport,c=this.clients.get(b.name);if(c){let{needsNewClient:d,reason:e}=function(a,b,c=!1){if(Z.debug("Entering shouldRecreateClient method"),(0,B.wk)(a))return{needsNewClient:!0,reason:"Existing connection is closed"};if((a.__flujoCapKey??"")!==Y(b))return{needsNewClient:!0,reason:"Client capabilities (sampling/elicitation/MCP Apps) 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!==ab(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}else if(c.__flujoHttpKey!==ac(b))return{needsNewClient:!0,reason:`${b.transport} auth/connection parameters changed`};return{needsNewClient:!1}}if("websocket"===b.transport){if(!(a.transport instanceof v.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof w.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!==ac(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof x.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!==ac(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof u.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!==ab(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}(c,b,a);if(!d)return aH.info(`connectServer: Server ${b.name} is already connected`),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!0};aH.info(`connectServer: Existing client for ${b.name} is stale (${e}), recreating`),this.deregisterClient(b.name);try{await ah(c,b.name,b)}catch(a){aH.debug(`connectServer: error closing stale client for ${b.name}: ${a instanceof Error?a.message:String(a)}`)}c=void 0}c=a?al(b):ad(b);let d=a?an(b):ae(b);if(a){let a=c.setNotificationHandler?.bind(c);a&&(a("notifications/resources/list_changed",()=>{this.onResourceListChanged(b.name)}),a("notifications/resources/updated",a=>{let c=a?.params?.uri;c&&this.onResourceUpdated(b.name,c)}))}else!function(a,b,c,d){try{a.setNotificationHandler(m.hh,a=>{aE.debug(`resourceListChanged notification received for ${b}`),c(b)})}catch(a){aE.warn(`registerResourceNotificationHandlers: failed to register list_changed for ${b}`,a)}if(d)try{a.setNotificationHandler(m.cL,a=>{let c=a.params?.uri;c&&(aE.debug(`resourceUpdated notification received for ${b} uri=${c}`),d(b,c))})}catch(a){aE.warn(`registerResourceNotificationHandlers: failed to register resource_updated for ${b}`,a)}}(c,b.name,a=>this.onResourceListChanged(a),(a,b)=>this.onResourceUpdated(a,b));let e=d.stderr;if(e&&"function"==typeof e.on){let a=b.name;e.on("data",b=>{let c=b.toString();aH.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)})}d.onclose=()=>{if(this.activeTransports.get(b.name)!==d)return void aH.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${b.name}`);aH.warn(`connectServer: Connection closed for server ${b.name}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void aH.info(`Server ${b.name} is now disabled, skipping reconnection logic`);aH.info(`Connection closed for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{aH.warn(`Error checking server config for ${b.name} during onclose:`,a)})},d.onerror=a=>{if((0,B.lO)(a))return void aH.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 aH.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${b.name}`);if(aH.error(`connectServer: Transport error for server ${b.name}:`),a instanceof Error){aH.error(`Error name: ${a.name}`),aH.error(`Error message: ${a.message}`),aH.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&aH.error(`Error code: ${b}`),aH.error(`Error chain: ${(0,B.jf)(a)}`)}else if(a&&"object"==typeof a){aH.error(`Error type: ${typeof a}`),aH.error(`Error constructor: ${a.constructor?.name||"Unknown"}`);let b=Object.getOwnPropertyNames(a);b.length>0?(aH.error(`Error properties: ${b.join(", ")}`),b.forEach(b=>{try{let c=a[b];aH.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){aH.error(` ${b}: [Unable to serialize: ${a}]`)}})):aH.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);aH.error(`JSON stringified error: ${b}`)}catch(a){aH.error(`Cannot JSON stringify error: ${a}`)}}else aH.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 aH.info(`Server ${b.name} is now disabled, skipping reconnection after transport error`);aH.info(`Transport error for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{aH.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.clientGenerations.set(b.name,this.getClientGeneration(b.name)+1),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name);let f=function(a){if(ak(a))try{return a.getNegotiatedProtocolVersion()}catch{return}}(c);return aH.info(`connectServer: Successfully connected to ${b.name}`+(f?` (beta SDK, negotiated MCP protocol ${f})`:"")),{success:!0}}catch(h){let a;aH.error(`connectServer: Failed to connect to server ${b.name}:`,h);let c=h instanceof Error?h.message:String(h),d=(0,B.uP)(h),e=(0,B.Ah)(h);if(e&&("streamable"===b.transport||"sse"===b.transport)){let c=b.serverUrl;c&&(a=(await (0,aD.n)(c)).oauthCapable)}if(d||a){if(aH.info(`OAuth authentication error detected for server ${b.name}: ${c}`),"streamable"===b.transport&&a){let a=b;if(!a.oauthScopes||0===a.oauthScopes.length){aH.info(`Dynamically enabling OAuth for server ${b.name} after capability confirmation`);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]))),aH.info(`Updated config for ${b.name} to enable OAuth`))}}catch(a){aH.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,oauthCapable:!0}}if(e)return{success:!1,error:c,requiresAuthentication:!0,oauthCapable:a};let f=this.stderrLogs.get(b.name)||[],g=(0,B.ox)(h,b,f);return this.lastConnectionError.set(b.name,g),{success:!1,error:g}}finally{this.connectingServers.delete(b.name)}}async testConnection(a,b,c){aH.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,W.x0)(e,d)}}let j=await $(h),k=await aj()&&"websocket"!==j.transport;f=k?al(j):ad(j);let l=(g=k?an(j):ae(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=aC(a)?9e4:15e3,n=aC(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){aH.debug(`testConnection: connected to ${a.name} but listTools failed: ${b instanceof Error?b.message:String(b)}`)}return aH.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;aH.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,aD.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 ah(f,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){aH.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 aH.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{aH.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),aH.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){aH.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}async disconnectServer(a){if(aH.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 aH.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 ah(b,a,c||void 0),aH.info(`disconnectServer: Disconnected server ${a}`),{success:!0}}catch(b){return aH.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(aH.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 ah(b,a,c||void 0)}catch(b){aH.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a,b="model"){if(aH.debug(`listServerTools: Entering method for server ${a}, audience ${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 aH.warn(`listServerTools: ${b}`),{tools:[],error:b}}let{internalToolDefinitionsFor:d}=await c.e(5463).then(c.bind(c,25463)),e=await d(a);return{tools:(0,X.zm)(e,b)}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return aH.warn(`listServerTools: ${b}`),{tools:[],error:b}}let d=this.getClient(a);d||aH.warn(`listServerTools: Client not found for ${a}`);let e=await ar(d,a,b);if(e.error){aH.warn(`listServerTools: Listing tools for ${a} failed (${e.error}); forcing reconnect and retrying once`);let c=await this.forceReconnect(a);if(!c.success)return aH.warn(`listServerTools: Reconnect for ${a} failed: ${c.error}`),{tools:[],error:c.error||e.error};d=this.clients.get(a),(e=await ar(d,a,b)).error?aH.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,e.error):aH.info(`listServerTools: Recovered after reconnect for ${a}; listed ${e.tools.length} tools`)}else aH.info(`listServerTools: Listed ${e.tools.length} tools for ${a}`);return e}async callTool(a,b,d,e,f,g,h,i="host"){if(aH.debug(`callTool: Entering method for server ${a}, tool ${b}, source ${i}`),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 aH.warn(`callTool: ${b}`),{success:!1,error:b}}let{internalCallToolFor:e,internalToolDefinitionsFor:f}=await c.e(5463).then(c.bind(c,25463));if("app"===i||"model"===i){let c=await f(a),d=(0,X.F)(c,a,b,i);if(!d.allowed)return aH.warn(`callTool: Rejected ${i} call to built-in tool: ${d.error}`),{success:!1,error:d.error,statusCode:d.statusCode}}let h=await e(this,a,b,d,g,i);return aH.info(`callTool: Dispatched internal tool ${b} on ${a}`),{success:!0,data:h}}if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return aH.warn(`callTool: ${b}`),{success:!1,error:b}}let j=this.getClient(a);if(!j){aH.warn(`callTool: No client for ${a}; forcing reconnect before calling ${b}`);let c=await this.forceReconnect(a);c.success?j=this.clients.get(a):aH.warn(`callTool: Reconnect for ${a} failed: ${c.error}`)}let k=await as(j,a,b,d,e,f,h,i);return aH.info(`callTool: Called tool ${b} on ${a}`),k}async callToolFromApp(a,b,c,d,e){let f=await this.checkMcpAppAccess(a);if(f)return f;let g=await this.callTool(a,b,c,d,void 0,void 0,e,"app");if("tool-authorization-list"!==g.errorType)return g;aH.warn(`callToolFromApp: visibility lookup failed for ${a}/${b}; reconnecting and retrying once before dispatch`);let h=await this.forceReconnect(a);return h.success?g=await this.callTool(a,b,c,d,void 0,void 0,e,"app"):{success:!1,error:h.error||g.error,statusCode:g.statusCode}}async isMcpAppAccessEnabled(a){let b=await this.isInternalServer(a),c=await this.getServerConfig(a);return c?.disabled!==!0&&(!!b||c?.enableMcpApps===!0)}async checkMcpAppAccess(a){if(await this.isMcpAppAccessEnabled(a))return null;let b=`MCP Apps are not enabled for server '${a}'. Enable them on the MCP page before opening or using this app.`;return aH.warn(`MCP App access denied: ${b}`),{success:!1,error:b,statusCode:403}}async readResourceFromApp(a,b){let c=await this.checkMcpAppAccess(a);return c||this.readResource(a,b)}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 aH.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=this.getClient(a);d||aH.warn(`listWithReconnect: Client not found for ${a}`);let e=await b(d,a);if(!e.error)return e;aH.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?aH.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,e.error):aH.info(`listWithReconnect: Recovered after reconnect for ${a}`),e):(aH.warn(`listWithReconnect: Reconnect for ${a} failed: ${f.error}`),{...c,error:f.error||e.error})}async listServerResources(a){if(aH.debug(`listServerResources: Entering method for server ${a}`),a===aF._&&await this.isInternalServer(a)){let{internalListResources:a}=await c.e(8001).then(c.bind(c,28001));return a()}if(a===aG.K3){let{filesystemListResources:a}=await c.e(793).then(c.bind(c,10793));return a()}return this.listWithReconnect(a,au,{resources:[]})}async listServerResourceTemplates(a){if(aH.debug(`listServerResourceTemplates: Entering method for server ${a}`),a===aF._&&await this.isInternalServer(a)){let{internalListResourceTemplates:a}=await c.e(8001).then(c.bind(c,28001));return a()}return this.listWithReconnect(a,av,{resourceTemplates:[]})}async readResource(a,b){if(aH.debug(`readResource: Entering method for server ${a}, uri ${b}`),a===aF._&&await this.isInternalServer(a)){let{internalReadResource:a}=await c.e(8001).then(c.bind(c,28001));return a(b)}if(a===aG.K3){let{filesystemReadResource:a,isFilesystemAppUri:d,isTouchedFileUri:e,readTouchedFileResource:f}=await c.e(793).then(c.bind(c,10793));if(d(b))return a(b);if(e(b))return f(b)}let d=this.getClient(a);d||aH.warn(`readResource: Client not found for ${a}`);let e=await aw(d,a,b);return aH.info(`readResource: Read resource ${b} on ${a}`),e}async listServerPrompts(a){return aH.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,ay,{prompts:[]})}async getPrompt(a,b,c){aH.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=this.getClient(a);d||aH.warn(`getPrompt: Client not found for ${a}`);let e=await az(d,a,b,c);return aH.info(`getPrompt: Got prompt ${b} on ${a}`),e}async resolveOAuthSecretForSave(a,b){return a===aB.RJ?b??"":a?a.startsWith("${global:")||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")?a:await (0,aA.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,W.at)(e,d);if(!f){""!==a&&(c[d]={value:a,metadata:{isSecret:!1}});continue}if((0,W.uh)(a)){let a=b?.[d];void 0!==a&&(c[d]=a);continue}if(a){if((0,W.T6)(a)||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")){c[d]={value:a,metadata:{isSecret:!0}};continue}c[d]={value:await (0,aA.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}),aH.debug(`ensureRemoteServerRootDir: ensured ${c} for ${a.name}`)}catch(b){aH.warn(`ensureRemoteServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){if(aH.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===aG.K3||a===aG.PA)&&c.length>0&&c.every(a=>"roots"===a)&&Array.isArray(b.roots)&&d;if(e){await (0,aG.LV)(a,b.disabled),aH.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,aG.Eu)(a,b.roots),aH.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 aH.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 aH.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)aH.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 aH.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};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),aH.info(`updateServerConfig: Successfully updated config for ${a}${e?` (renamed to ${h.name})`:""}`),h):(aH.warn(`updateServerConfig: Failed to save config for ${a}:`,k.error),k)}async handleConnectionStateChange(a,b){aH.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){aH.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{await this.disconnectServer(a)}catch(b){aH.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(aH.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(aH.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(aH.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){aH.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void aH.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(aH.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){aH.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){if(aH.debug(`deleteServerConfig: Entering method for server ${a}`),await this.isInternalServer(a))return{success:!1,error:`"${aF._}" is FLUJO's built-in server and cannot be deleted.`};this.clients.has(a)&&(aH.info(`deleteServerConfig: Disconnecting server ${a} before deletion`),await this.disconnectServer(a));let b=await this.loadServerConfigs();if(!Array.isArray(b))return aH.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return aH.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),aH.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?aH.info(`deleteServerConfig: Successfully deleted server ${a}`):aH.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 aH.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 aH.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 aH.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 aH.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 aH.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 aH.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 aH.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?(aH.info(`getServerStatus: Using ${c?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:e,stderrOutput:c||void 0}):(aH.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(){aH.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void aH.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled);aH.info(`Found ${b.length} enabled servers to start`),aH.debug(`${b}`),b.forEach(a=>this.connectingServers.add(a.name));let c=Math.max(1,Number(process.env.FLUJO_MCP_BOOT_CONCURRENCY)||2);aH.info(`Connecting ${b.length} enabled servers with boot concurrency ${c}`),await (0,k.P)(b,c,async a=>{aH.info(`Starting server: ${a.name}`),await this.connectServer(a).catch(b=>{aH.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 aH.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 aH.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 aH.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,this.resourceListVersion=new Map,this.pendingResourceUpdates=new Map}}let aJ=new aI},60724:(a,b,c)=>{"use strict";c.d(b,{h:()=>k});var d=c(87821),e=c(20433),f=c(60453),g=c(50846),h=c(65007);let i=(0,g.h)("backend/utils/PromptRenderer");class j{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;i.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:j}=await this.findNodePrompt(b,a),k=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,l=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,m=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:j;i.debug("Exclusion settings",{excludeModelPrompt:k,excludeStartNodePrompt:l,excludeSystemPrompt:m,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let n="",o=null;if(!l){let b=await this.findStartNodePrompt(a);b&&(i.debug("Adding start node prompt",{length:b.length}),n+=b+"\n\n")}if(!k){let c=await this.findModelPrompt(b,a);c.prompt&&(i.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),n+=c.prompt+"\n\n"),o=c.functionCallingSchema,c.reasoningSchema&&(n+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
76
76
 
77
77
  `),o&&(n+=`Please use the following pattern to use a tool: ${o}
78
78
 
@@ -1 +1 @@
1
- "use strict";exports.id=5463,exports.ids=[5463],exports.modules={25463:(a,b,c)=>{c.d(b,{internalCallToolFor:()=>g,internalToolDefinitionsFor:()=>f});var d=c(81495),e=c(7658);async function f(a){switch(a){case d._:{let{internalToolDefinitions:a}=await Promise.all([c.e(3736),c.e(9794),c.e(6826),c.e(1226),c.e(4771),c.e(4671),c.e(4265),c.e(6226),c.e(5708),c.e(227),c.e(2859)]).then(c.bind(c,42859));return a()}case e.K3:{let{filesystemToolDefinitions:a}=await Promise.all([c.e(793),c.e(8387)]).then(c.bind(c,18387));return a()}case e.PA:{let{bashToolDefinitions:a}=await c.e(5544).then(c.bind(c,35544));return a()}default:return[]}}async function g(a,b,f,h,i,j="host"){switch(b){case d._:{let{internalCallTool:b}=await Promise.all([c.e(3736),c.e(9794),c.e(6826),c.e(1226),c.e(4771),c.e(4671),c.e(4265),c.e(6226),c.e(5708),c.e(227),c.e(2859)]).then(c.bind(c,42859));return b(a,f,h,j)}case e.K3:{let{filesystemCallTool:a}=await Promise.all([c.e(793),c.e(8387)]).then(c.bind(c,18387));return a(f,h,i)}case e.PA:{let{bashCallTool:a}=await c.e(5544).then(c.bind(c,35544));return a(f,h,i)}default:return{content:[{type:"text",text:`Unknown built-in server: ${b}`}],isError:!0}}}}};
1
+ "use strict";exports.id=5463,exports.ids=[5463],exports.modules={25463:(a,b,c)=>{c.d(b,{internalCallToolFor:()=>g,internalToolDefinitionsFor:()=>f});var d=c(81495),e=c(7658);async function f(a){switch(a){case d._:{let{internalToolDefinitions:a}=await Promise.all([c.e(3736),c.e(9794),c.e(4671),c.e(6826),c.e(1226),c.e(4771),c.e(7630),c.e(4265),c.e(6226),c.e(6041),c.e(227),c.e(2859)]).then(c.bind(c,42859));return a()}case e.K3:{let{filesystemToolDefinitions:a}=await Promise.all([c.e(793),c.e(8387)]).then(c.bind(c,18387));return a()}case e.PA:{let{bashToolDefinitions:a}=await c.e(5544).then(c.bind(c,35544));return a()}default:return[]}}async function g(a,b,f,h,i,j="host"){switch(b){case d._:{let{internalCallTool:b}=await Promise.all([c.e(3736),c.e(9794),c.e(4671),c.e(6826),c.e(1226),c.e(4771),c.e(7630),c.e(4265),c.e(6226),c.e(6041),c.e(227),c.e(2859)]).then(c.bind(c,42859));return b(a,f,h,j)}case e.K3:{let{filesystemCallTool:a}=await Promise.all([c.e(793),c.e(8387)]).then(c.bind(c,18387));return a(f,h,i)}case e.PA:{let{bashCallTool:a}=await c.e(5544).then(c.bind(c,35544));return a(f,h,i)}default:return{content:[{type:"text",text:`Unknown built-in server: ${b}`}],isError:!0}}}}};
@@ -1,5 +1,5 @@
1
- "use strict";exports.id=5544,exports.ids=[5544,7969],exports.modules={3233:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(79646);let e=(0,c(50846).h)("utils/process/killProcessTree");function f(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,d.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>e.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){e.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let g=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return g.unref?.(),()=>clearTimeout(g)}},5591:(a,b,c)=>{c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(43326),i=c(92372),j=c(84653),k=c(7969);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.YM)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}},7969:(a,b,c)=>{c.d(b,{F:()=>j,loadEffectiveRoots:()=>l});var d=c(33873),e=c.n(d),f=c(79551),g=c(50846),h=c(7658);let i=(0,g.h)("backend/services/mcp/internal/confinement");function j(a,b){let c=e().relative(a,b);return""===c||!c.startsWith("..")&&!e().isAbsolute(c)}async function k(a,b){let{resolveGlobalVars:d}=await Promise.resolve().then(c.bind(c,73456)),g=(await d(a)).trim();if(!g)return null;if(g.startsWith("file://"))try{return e().resolve((0,f.fileURLToPath)(g))}catch(a){return i.warn(`resolveRootToPath: could not parse file URI "${g}"`,a),null}return e().isAbsolute(g)?e().resolve(g):e().resolve(b,g)}async function l(a,b,d){let{getDataDir:f}=await Promise.resolve().then(c.bind(c,43326)),g=f(),l=function(a){for(let b of Array.isArray(a)?a:[a]){let a=process.env[b];if(!a||!a.trim())continue;let c=a.split(e().delimiter).map(a=>a.trim()).filter(Boolean).map(a=>e().resolve(a));if(c.length)return c}return null}(b),m=[];try{for(let b of(await (0,h.AC)(a)))m.push(e().isAbsolute(b)?e().resolve(b):e().resolve(g,b))}catch(a){i.warn("loadEffectiveRoots: could not read persisted roots",a)}try{let{getNodeRoots:b,getNodeRootsForId:e}=await Promise.resolve().then(c.bind(c,62850));for(let c of void 0!==d?(()=>{let c=e(a,d);return c.length>0?c:b(a)})():b(a)){let a=await k(c,g);a&&m.push(a)}}catch(a){i.warn("loadEffectiveRoots: could not read node roots",a)}let n=Array.from(new Set(m));if(!l)return 0===n.length?[g]:n;let o=n.filter(a=>l.some(b=>j(b,a)));return o.length?o:l}},35544:(a,b,c)=>{let d,e;c.d(b,{bashCallTool:()=>J,bashToolDefinitions:()=>C});var f=c(33873),g=c.n(f),h=c(29021),i=c.n(h),j=c(79646),k=c(3233),l=c(50846),m=c(43326),n=c(7658),o=c(7969),p=c(5591);let q=(0,l.h)("backend/services/mcp/internal/bashTools");function r(a){let b=process.env[a];if(void 0!==b)return b;let c=Object.keys(process.env).find(b=>b.toLowerCase()===a.toLowerCase());return c?process.env[c]:void 0}function s(a){let b=(r("PATH")??"").split(g().delimiter).filter(Boolean),c="win32"===process.platform?(r("PATHEXT")??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let d of b)for(let b of c){let c=g().join(d,`${a}${b}`);try{if(i().statSync(c).isFile())return c}catch{}}return null}function t(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function u(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}let v=["FLUJO_BASH_ROOTS","FLUJO_FS_ROOTS"];async function w(a,b){let c=(0,m.getDataDir)(),d="string"==typeof a?a.trim():"",e=d?g().isAbsolute(d)?g().resolve(d):g().resolve(c,d):c;if(await (0,p.cd)()){let a=(0,p.bz)(e);if(a.denied)throw Error(`cwd "${e}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${p.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,o.F)(a,e)))throw Error(`cwd "${e}" is outside the configured bash roots.`);return e}async function x(a,b,c){let d=[],e=await (0,p.cd)(),f=new Set,h=(a.match(/(?:[A-Za-z]:[\\/][^\s"']*|\\\\[^\s"']+|~\/[^\s"']*|(?<![\w.])\/[^\s"']+)/g)??[]).filter(a=>!("win32"===process.platform&&/^\/[A-Za-z]$/.test(a))),i=(()=>{try{return(0,m.getHomeDir)()}catch{return""}})();for(let a of h){let h,j=a;j.startsWith("~/")&&i&&(j=g().join(i,j.slice(2)));try{h=g().isAbsolute(j)?g().resolve(j):g().resolve(b,j)}catch{continue}if(f.has(h))continue;f.add(h);let k=e?(0,p.bz)(h):{denied:!1};k.denied?d.push(`Command references "${a}", which is inside a protected location (${k.matchedRoot}).`):c.length>0&&!c.some(a=>(0,o.F)(a,h))&&d.push(`Command references "${a}", which is outside the configured working roots.`)}return d}let y=new Set(["PATH","Path","HOME","USERPROFILE","TMP","TEMP","TMPDIR","LANG","LC_ALL","SystemRoot","windir","ComSpec","PATHEXT","SystemDrive","NUMBER_OF_PROCESSORS","PROCESSOR_ARCHITECTURE"]);function z(a){return"pwsh"===a||"bash"===a?a:"default"}function A(a,b,c){let{file:f,args:h,useShell:k,effectiveShell:l,unavailableShell:m}=function(a,b){if("pwsh"===b){let b=void 0!==e?e:e=s("pwsh");return b?{file:b,args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1,effectiveShell:"pwsh"}:{file:"",args:[],useShell:!1,effectiveShell:"pwsh",unavailableShell:"pwsh"}}if("bash"===b){let b=function(){if(void 0!==d)return d;let a=s("bash");return a||"win32"!==process.platform||(a=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData].filter(a=>!!a).flatMap(a=>[g().join(a,"Git","bin","bash.exe"),g().join(a,"Git","usr","bin","bash.exe"),g().join(a,"Programs","Git","bin","bash.exe"),g().join(a,"Programs","Git","usr","bin","bash.exe")]).find(a=>{try{return i().statSync(a).isFile()}catch{return!1}})??null),d=a,a}();return b?{file:b,args:["-c",a],useShell:!1,effectiveShell:"bash"}:{file:"",args:[],useShell:!1,effectiveShell:"bash",unavailableShell:"bash"}}return{file:a,args:[],useShell:!0,effectiveShell:"default"}}(a,c);if(m)return{effectiveShell:l,unavailableShell:m};let n="win32"!==process.platform;try{return{child:(0,j.spawn)(f,h,{cwd:b,shell:k,env:function(){var a;if("string"==typeof(a=process.env.FLUJO_BASH_INHERIT_ENV)&&/^(1|true|yes|on)$/i.test(a.trim()))return process.env;let b={};for(let a of Object.keys(process.env))(y.has(a)||/^LC_/.test(a))&&(b[a]=process.env[a]);return b}(),detached:n}),effectiveShell:l}}catch(a){return{startError:a instanceof Error?a.message:String(a),effectiveShell:l}}}function B(a,b){return c=>{let d=a();if(d.length>=1e5)return;let e=!1;(d+=c).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0),b(d,e)}}function C(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Explicit shells return an error if unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory. When bash roots are configured (via the MCP manager, or the FLUJO_BASH_ROOTS / FLUJO_FS_ROOTS env hard ceiling) a cwd outside them is rejected."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function D(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function E(a,b){let c=String(a?.command??"").trim();if(!c)return u({error:'Provide "command": a shell command line to run.'},!0);let d=await w(a.cwd,b),e=await x(c,d,b),f=e.length?{warnings:e}:{},g=z(a.shell),h=!0===a.normalizeNewlines,i=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let b,e="",j=!1,l=!1,m=!1,n=B(()=>e,(a,b)=>{e=a,j=b||j}),{child:o,startError:p,effectiveShell:q,unavailableShell:r}=A(c,d,g);if(r)return void a(u({error:`Requested shell "${r}" is unavailable or could not be resolved.`,cwd:d,shell:r},!0));if(p||!o)return void a(u({error:`Failed to start command (${q}): ${p??"unknown error"}`,cwd:d,shell:q},!0));let s=setTimeout(()=>{m=!0,b=(0,k.g)(o)},i),t=c=>{l||(l=!0,clearTimeout(s),b?.(),a(c))};o.stdout?.on("data",a=>n(a.toString())),o.stderr?.on("data",a=>n(a.toString())),o.on("error",a=>{n(`
2
- ${a.message}`),t(u({error:`Command failed to start (${q}): ${a.message}`,cwd:d,shell:q,output:D(e,h)},!0))}),o.on("close",a=>{let b=D(e,h);if(m)return void t(u({timedOut:!0,cwd:d,shell:q,exitCode:a,truncated:j,output:`${b}
3
- [killed after ${i/1e3}s timeout]`,...f},!0));t(u({exitCode:a,cwd:d,shell:q,truncated:j,output:b,...f},0!==a))})})}function F(a){a.reapTimer=setTimeout(()=>{t().delete(a.id)},6e5),a.reapTimer.unref?.()}async function G(a,b){let c=String(a?.command??"").trim();if(!c)return u({error:'Provide "command": a shell command line to run.'},!0);let d=t();if(d.size>=25)for(let[a,b]of d)b.running||d.delete(a);if(d.size>=25)return u({error:"Too many active background sessions (max 25). Kill some first."},!0);!function(){if(global.__flujo_bash_cleanup_registered)return;global.__flujo_bash_cleanup_registered=!0;let a=()=>(function(){for(let a of t().values()){if(a.running)try{(0,k.g)(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let e=await w(a.cwd,b),f=await x(c,e,b),g=f.length?{warnings:f}:{},{child:h,startError:i,effectiveShell:j,unavailableShell:l}=A(c,e,z(a.shell));if(l)return u({error:`Requested shell "${l}" is unavailable or could not be resolved.`,cwd:e,shell:l},!0);if(i||!h)return u({error:`Failed to start command (${j}): ${i??"unknown error"}`,cwd:e,shell:j},!0);let m=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={id:m,command:c,cwd:e,child:h,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};d.set(m,n);let o=B(()=>n.output,(a,b)=>{n.output=a,n.truncated=b||n.truncated});return h.stdout?.on("data",a=>o(a.toString())),h.stderr?.on("data",a=>o(a.toString())),h.on("error",a=>{o(`
4
- ${a.message}`),n.running=!1,n.endedAt=Date.now(),F(n)}),h.on("close",a=>{n.running=!1,n.exitCode=a,n.endedAt=Date.now(),F(n)}),u({sessionId:m,cwd:e,shell:j,...g})}function H(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function I(a){let b=String(a?.sessionId??""),c=t().get(b);if(!c)return u({error:`No background session with id "${b}".`},!0);if(!c.running)return u(H(c,{timedOut:!1}));let d=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5),e=await new Promise(a=>{let b=Date.now(),e=()=>c.running?Date.now()-b>=d?a(!0):void setTimeout(e,100):a(!1);e()});return u(H(c,{timedOut:e}))}async function J(a,b,c){try{switch(a){case"run":{let a=await (0,o.loadEffectiveRoots)(n.PA,v,c);return await E(b,a)}case"start":{let a=await (0,o.loadEffectiveRoots)(n.PA,v,c);return await G(b,a)}case"status":let d=String(b?.sessionId??""),e=t().get(d);return e?u(H(e)):u({error:`No background session with id "${d}".`},!0);case"wait":return await I(b);case"write_stdin":let f=String(b?.sessionId??""),g=t().get(f);if(!g)return u({error:`No background session with id "${f}".`},!0);if(!g.running)return u({error:`Session "${f}" has already exited.`},!0);let h="string"==typeof b.data?b.data:"",i=!1===b.newline?h:`${h}
1
+ exports.id=5544,exports.ids=[5544,7969],exports.modules={3233:(a,b,c)=>{"use strict";c.d(b,{g:()=>f});var d=c(79646);let e=(0,c(50846).h)("utils/process/killProcessTree");function f(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,d.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>e.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){e.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let g=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return g.unref?.(),()=>clearTimeout(g)}},5591:(a,b,c)=>{"use strict";c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(43326),i=c(92372),j=c(84653),k=c(7969);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.YM)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}},7969:(a,b,c)=>{"use strict";c.d(b,{F:()=>j,loadEffectiveRoots:()=>l});var d=c(33873),e=c.n(d),f=c(79551),g=c(50846),h=c(7658);let i=(0,g.h)("backend/services/mcp/internal/confinement");function j(a,b){let c=e().relative(a,b);return""===c||!c.startsWith("..")&&!e().isAbsolute(c)}async function k(a,b){let{resolveGlobalVars:d}=await Promise.resolve().then(c.bind(c,73456)),g=(await d(a)).trim();if(!g)return null;if(g.startsWith("file://"))try{return e().resolve((0,f.fileURLToPath)(g))}catch(a){return i.warn(`resolveRootToPath: could not parse file URI "${g}"`,a),null}return e().isAbsolute(g)?e().resolve(g):e().resolve(b,g)}async function l(a,b,d){let{getDataDir:f}=await Promise.resolve().then(c.bind(c,43326)),g=f(),l=function(a){for(let b of Array.isArray(a)?a:[a]){let a=process.env[b];if(!a||!a.trim())continue;let c=a.split(e().delimiter).map(a=>a.trim()).filter(Boolean).map(a=>e().resolve(a));if(c.length)return c}return null}(b),m=[];try{for(let b of(await (0,h.AC)(a)))m.push(e().isAbsolute(b)?e().resolve(b):e().resolve(g,b))}catch(a){i.warn("loadEffectiveRoots: could not read persisted roots",a)}try{let{getNodeRoots:b,getNodeRootsForId:e}=await Promise.resolve().then(c.bind(c,62850));for(let c of void 0!==d?(()=>{let c=e(a,d);return c.length>0?c:b(a)})():b(a)){let a=await k(c,g);a&&m.push(a)}}catch(a){i.warn("loadEffectiveRoots: could not read node roots",a)}let n=Array.from(new Set(m));if(!l)return 0===n.length?[g]:n;let o=n.filter(a=>l.some(b=>j(b,a)));return o.length?o:l}},29998:a=>{function b(a){var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b}b.keys=()=>[],b.resolve=b,b.id=29998,a.exports=b},35544:(a,b,c)=>{"use strict";let d,e;c.d(b,{bashCallTool:()=>K,bashToolDefinitions:()=>D});var f=c(33873),g=c.n(f),h=c(29021),i=c.n(h),j=c(79646),k=c(3233),l=c(50846),m=c(43326),n=c(7658),o=c(7969),p=c(5591);let q=(0,l.h)("backend/services/mcp/internal/bashTools");function r(a){let b=process.env[a];if(void 0!==b)return b;let c=Object.keys(process.env).find(b=>b.toLowerCase()===a.toLowerCase());return c?process.env[c]:void 0}function s(a){let b=(r("PATH")??"").split(g().delimiter).filter(Boolean),c="win32"===process.platform?(r("PATHEXT")??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let d of b)for(let b of c){let c=g().join(d,`${a}${b}`);try{if(i().statSync(c).isFile())return c}catch{}}return null}function t(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function u(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}let v=["FLUJO_BASH_ROOTS","FLUJO_FS_ROOTS"];async function w(a,b){let c=(0,m.getDataDir)(),d="string"==typeof a?a.trim():"",e=d?g().isAbsolute(d)?g().resolve(d):g().resolve(c,d):c;if(await (0,p.cd)()){let a=(0,p.bz)(e);if(a.denied)throw Error(`cwd "${e}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${p.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,o.F)(a,e)))throw Error(`cwd "${e}" is outside the configured bash roots.`);return e}async function x(a,b,c){let d=[],e=await (0,p.cd)(),f=new Set,h=((function(a){let b=[...a],c=[...a.matchAll(/"(?:\\.|[^"\\])*"|'[^']*'|[^\s]+/g)],d=!1;for(let a of c){let c=a[0],e=a.index??0,f=c.length>=2&&(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))?c.slice(1,-1):c,g=0;if(d)d=!1;else if("-g"===f||"--glob"===f||"--iglob"===f){d=!0;continue}else{if(!/^(?:--glob|--iglob)=/.test(f))continue;g=c.indexOf("=")+1}for(let a=e+g;a<e+c.length;a+=1)b[a]=" "}return b.join("")})(a).match(/(?:[A-Za-z]:[\\/][^\s"']*|\\\\[^\s"']+|~\/[^\s"']*|(?<![\w.])\/[^\s"']+)/g)??[]).filter(a=>!("win32"===process.platform&&/^\/[A-Za-z]$/.test(a))),i=(()=>{try{return(0,m.getHomeDir)()}catch{return""}})();for(let a of h){let h,j=a;j.startsWith("~/")&&i&&(j=g().join(i,j.slice(2)));try{h=g().isAbsolute(j)?g().resolve(j):g().resolve(b,j)}catch{continue}if(f.has(h))continue;f.add(h);let k=e?(0,p.bz)(h):{denied:!1};k.denied?d.push(`Command references "${a}", which is inside a protected location (${k.matchedRoot}).`):c.length>0&&!c.some(a=>(0,o.F)(a,h))&&d.push(`Command references "${a}", which is outside the configured working roots.`)}return d}let y=new Set(["PATH","Path","HOME","USERPROFILE","TMP","TEMP","TMPDIR","LANG","LC_ALL","SystemRoot","windir","ComSpec","PATHEXT","SystemDrive","NUMBER_OF_PROCESSORS","PROCESSOR_ARCHITECTURE"]),z={win32:{x64:["@openai/codex-win32-x64","x86_64-pc-windows-msvc"],arm64:["@openai/codex-win32-arm64","aarch64-pc-windows-msvc"]},darwin:{x64:["@openai/codex-darwin-x64","x86_64-apple-darwin"],arm64:["@openai/codex-darwin-arm64","aarch64-apple-darwin"]},linux:{x64:["@openai/codex-linux-x64","x86_64-unknown-linux-musl"],arm64:["@openai/codex-linux-arm64","aarch64-unknown-linux-musl"]}};function A(a){return"pwsh"===a||"bash"===a?a:"default"}function B(a,b,f){let{file:h,args:k,useShell:l,effectiveShell:n,unavailableShell:o}=function(a,b){if("pwsh"===b){let b=void 0!==e?e:e=s("pwsh");return b?{file:b,args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1,effectiveShell:"pwsh"}:{file:"",args:[],useShell:!1,effectiveShell:"pwsh",unavailableShell:"pwsh"}}if("bash"===b){let b=function(){if(void 0!==d)return d;let a=s("bash");return a||"win32"!==process.platform||(a=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData].filter(a=>!!a).flatMap(a=>[g().join(a,"Git","bin","bash.exe"),g().join(a,"Git","usr","bin","bash.exe"),g().join(a,"Programs","Git","bin","bash.exe"),g().join(a,"Programs","Git","usr","bin","bash.exe")]).find(a=>{try{return i().statSync(a).isFile()}catch{return!1}})??null),d=a,a}();return b?{file:b,args:["-c",a],useShell:!1,effectiveShell:"bash"}:{file:"",args:[],useShell:!1,effectiveShell:"bash",unavailableShell:"bash"}}return{file:a,args:[],useShell:!0,effectiveShell:"default"}}(a,f);if(o)return{effectiveShell:n,unavailableShell:o};let p="win32"!==process.platform;try{return{child:(0,j.spawn)(h,k,{cwd:b,shell:l,env:function(){var a;let b="string"==typeof(a=process.env.FLUJO_BASH_INHERIT_ENV)&&/^(1|true|yes|on)$/i.test(a.trim())?{...process.env}:Object.fromEntries(Object.entries(process.env).filter(([a])=>y.has(a)||/^LC_/.test(a))),d=r("PATH")??"";if(b.PATH=[...[g().join((0,m.getDataDir)(),"bash-utils"),function(){let a=z[process.platform]?.[process.arch];if(!a)return null;try{let b=c(29998).resolve(`${a[0]}/package.json`),d=g().join(g().dirname(b),"vendor",a[1],"codex-path"),e=g().join(d,"win32"===process.platform?"rg.exe":"rg");return i().statSync(e).isFile()?d:null}catch{return null}}()].filter(a=>!!a).filter(a=>{try{return i().statSync(a).isDirectory()}catch{return!1}}),d].filter(Boolean).join(g().delimiter),"win32"===process.platform)for(let a of Object.keys(b))"PATH"!==a&&"path"===a.toLowerCase()&&delete b[a];return b}(),detached:p}),effectiveShell:n}}catch(a){return{startError:a instanceof Error?a.message:String(a),effectiveShell:n}}}function C(a,b){return c=>{let d=a();if(d.length>=1e5)return;let e=!1;(d+=c).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0),b(d,e)}}function D(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Explicit shells return an error if unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory. When bash roots are configured (via the MCP manager, or the FLUJO_BASH_ROOTS / FLUJO_FS_ROOTS env hard ceiling) a cwd outside them is rejected."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function E(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function F(a,b){let c=String(a?.command??"").trim();if(!c)return u({error:'Provide "command": a shell command line to run.'},!0);let d=await w(a.cwd,b),e=await x(c,d,b),f=e.length?{warnings:e}:{},g=A(a.shell),h=!0===a.normalizeNewlines,i=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let b,e="",j=!1,l=!1,m=!1,n=C(()=>e,(a,b)=>{e=a,j=b||j}),{child:o,startError:p,effectiveShell:q,unavailableShell:r}=B(c,d,g);if(r)return void a(u({error:`Requested shell "${r}" is unavailable or could not be resolved.`,cwd:d,shell:r},!0));if(p||!o)return void a(u({error:`Failed to start command (${q}): ${p??"unknown error"}`,cwd:d,shell:q},!0));let s=setTimeout(()=>{m=!0,b=(0,k.g)(o)},i),t=c=>{l||(l=!0,clearTimeout(s),b?.(),a(c))};o.stdout?.on("data",a=>n(a.toString())),o.stderr?.on("data",a=>n(a.toString())),o.on("error",a=>{n(`
2
+ ${a.message}`),t(u({error:`Command failed to start (${q}): ${a.message}`,cwd:d,shell:q,output:E(e,h)},!0))}),o.on("close",a=>{let b=E(e,h);if(m)return void t(u({timedOut:!0,cwd:d,shell:q,exitCode:a,truncated:j,output:`${b}
3
+ [killed after ${i/1e3}s timeout]`,...f},!0));t(u({exitCode:a,cwd:d,shell:q,truncated:j,output:b,...f},0!==a))})})}function G(a){a.reapTimer=setTimeout(()=>{t().delete(a.id)},6e5),a.reapTimer.unref?.()}async function H(a,b){let c=String(a?.command??"").trim();if(!c)return u({error:'Provide "command": a shell command line to run.'},!0);let d=t();if(d.size>=25)for(let[a,b]of d)b.running||d.delete(a);if(d.size>=25)return u({error:"Too many active background sessions (max 25). Kill some first."},!0);!function(){if(global.__flujo_bash_cleanup_registered)return;global.__flujo_bash_cleanup_registered=!0;let a=()=>(function(){for(let a of t().values()){if(a.running)try{(0,k.g)(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let e=await w(a.cwd,b),f=await x(c,e,b),g=f.length?{warnings:f}:{},{child:h,startError:i,effectiveShell:j,unavailableShell:l}=B(c,e,A(a.shell));if(l)return u({error:`Requested shell "${l}" is unavailable or could not be resolved.`,cwd:e,shell:l},!0);if(i||!h)return u({error:`Failed to start command (${j}): ${i??"unknown error"}`,cwd:e,shell:j},!0);let m=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={id:m,command:c,cwd:e,child:h,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};d.set(m,n);let o=C(()=>n.output,(a,b)=>{n.output=a,n.truncated=b||n.truncated});return h.stdout?.on("data",a=>o(a.toString())),h.stderr?.on("data",a=>o(a.toString())),h.on("error",a=>{o(`
4
+ ${a.message}`),n.running=!1,n.endedAt=Date.now(),G(n)}),h.on("close",a=>{n.running=!1,n.exitCode=a,n.endedAt=Date.now(),G(n)}),u({sessionId:m,cwd:e,shell:j,...g})}function I(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function J(a){let b=String(a?.sessionId??""),c=t().get(b);if(!c)return u({error:`No background session with id "${b}".`},!0);if(!c.running)return u(I(c,{timedOut:!1}));let d=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5),e=await new Promise(a=>{let b=Date.now(),e=()=>c.running?Date.now()-b>=d?a(!0):void setTimeout(e,100):a(!1);e()});return u(I(c,{timedOut:e}))}async function K(a,b,c){try{switch(a){case"run":{let a=await (0,o.loadEffectiveRoots)(n.PA,v,c);return await F(b,a)}case"start":{let a=await (0,o.loadEffectiveRoots)(n.PA,v,c);return await H(b,a)}case"status":let d=String(b?.sessionId??""),e=t().get(d);return e?u(I(e)):u({error:`No background session with id "${d}".`},!0);case"wait":return await J(b);case"write_stdin":let f=String(b?.sessionId??""),g=t().get(f);if(!g)return u({error:`No background session with id "${f}".`},!0);if(!g.running)return u({error:`Session "${f}" has already exited.`},!0);let h="string"==typeof b.data?b.data:"",i=!1===b.newline?h:`${h}
5
5
  `;try{g.child.stdin?.write(i)}catch(a){return u({error:`Failed to write to stdin: ${a instanceof Error?a.message:String(a)}`},!0)}return u({sessionId:f,written:Buffer.byteLength(i,"utf8")});case"kill":let j=String(b?.sessionId??""),l=t().get(j);return l?(l.running&&(l.cancelEscalation=(0,k.g)(l.child)),u({sessionId:j,killed:!0})):u({error:`No background session with id "${j}".`},!0);case"list_sessions":return u({sessions:Array.from(t().values()).map(a=>({sessionId:a.id,command:a.command,running:a.running,exitCode:a.exitCode,startedAt:new Date(a.startedAt).toISOString(),endedAt:a.endedAt?new Date(a.endedAt).toISOString():void 0}))});default:return u({error:`Unknown tool on the built-in bash server: ${a}`},!0)}}catch(b){return q.warn("bashCallTool failed",{toolName:a,err:b}),u({error:`Tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}}};