flujo-ai 3.48.6 → 3.48.7

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 (510) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +60 -60
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/react-loadable-manifest.json +2 -2
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/server/app/api/approvals/[id]/route.js +1 -1
  12. package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
  13. package/.next/server/app/api/approvals/route.js +1 -1
  14. package/.next/server/app/api/approvals/route.js.nft.json +1 -1
  15. package/.next/server/app/api/automation-map/route.js +1 -1
  16. package/.next/server/app/api/automation-map/route.js.nft.json +1 -1
  17. package/.next/server/app/api/avatar/[voiceAction]/route.js +1 -1
  18. package/.next/server/app/api/avatar/[voiceAction]/route.js.nft.json +1 -1
  19. package/.next/server/app/api/avatar/connections/route.js +1 -1
  20. package/.next/server/app/api/avatar/connections/route.js.nft.json +1 -1
  21. package/.next/server/app/api/avatar/local-speech/route.js +1 -1
  22. package/.next/server/app/api/avatar/local-speech/route.js.nft.json +1 -1
  23. package/.next/server/app/api/avatar/remote/[voiceAction]/route.js +1 -1
  24. package/.next/server/app/api/avatar/remote/[voiceAction]/route.js.nft.json +1 -1
  25. package/.next/server/app/api/avatar/remote/availability/route.js +1 -1
  26. package/.next/server/app/api/avatar/remote/availability/route.js.nft.json +1 -1
  27. package/.next/server/app/api/avatar/voice/route.js +1 -1
  28. package/.next/server/app/api/avatar/voice/route.js.nft.json +1 -1
  29. package/.next/server/app/api/avatar/work-model/route.js +1 -1
  30. package/.next/server/app/api/avatar/work-model/route.js.nft.json +1 -1
  31. package/.next/server/app/api/avatar/world/route.js +1 -1
  32. package/.next/server/app/api/avatar/world/route.js.nft.json +1 -1
  33. package/.next/server/app/api/backup/route.js +1 -1
  34. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  35. package/.next/server/app/api/browse/route.js +1 -1
  36. package/.next/server/app/api/browse/route.js.nft.json +1 -1
  37. package/.next/server/app/api/bugs/enhance/route.js +1 -1
  38. package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
  39. package/.next/server/app/api/credential-migration/route.js +1 -1
  40. package/.next/server/app/api/credential-migration/route.js.nft.json +1 -1
  41. package/.next/server/app/api/credential-transfer/restore/route.js +1 -1
  42. package/.next/server/app/api/credential-transfer/restore/route.js.nft.json +1 -1
  43. package/.next/server/app/api/credential-transfer/route.js +1 -1
  44. package/.next/server/app/api/credential-transfer/route.js.nft.json +1 -1
  45. package/.next/server/app/api/cwd/route.js +1 -1
  46. package/.next/server/app/api/cwd/route.js.nft.json +1 -1
  47. package/.next/server/app/api/encryption/secure/route.js +1 -1
  48. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  49. package/.next/server/app/api/env/route.js +1 -1
  50. package/.next/server/app/api/env/route.js.nft.json +1 -1
  51. package/.next/server/app/api/factory-observatory/route.js +1 -1
  52. package/.next/server/app/api/factory-observatory/route.js.nft.json +1 -1
  53. package/.next/server/app/api/flow/[id]/convert-process-to-subflow/route.js +1 -1
  54. package/.next/server/app/api/flow/[id]/convert-process-to-subflow/route.js.nft.json +1 -1
  55. package/.next/server/app/api/flow/[id]/models/route.js +1 -1
  56. package/.next/server/app/api/flow/[id]/models/route.js.nft.json +1 -1
  57. package/.next/server/app/api/flow/[id]/route.js +1 -1
  58. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js +1 -1
  60. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -1
  61. package/.next/server/app/api/flow/[id]/versions/route.js +1 -1
  62. package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
  63. package/.next/server/app/api/flow/assist/route.js +1 -1
  64. package/.next/server/app/api/flow/assist/route.js.nft.json +1 -1
  65. package/.next/server/app/api/flow/compile/route.js +1 -1
  66. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  67. package/.next/server/app/api/flow/generate/route.js +1 -1
  68. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  69. package/.next/server/app/api/flow/generate/visual/route.js +1 -1
  70. package/.next/server/app/api/flow/generate/visual/route.js.nft.json +1 -1
  71. package/.next/server/app/api/flow/generator/route.js +1 -1
  72. package/.next/server/app/api/flow/generator/route.js.nft.json +1 -1
  73. package/.next/server/app/api/flow/improve/route.js +1 -1
  74. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  75. package/.next/server/app/api/flow/model-agent/route.js +1 -1
  76. package/.next/server/app/api/flow/model-agent/route.js.nft.json +1 -1
  77. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  78. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  79. package/.next/server/app/api/flow/quick-chat/route.js +1 -1
  80. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  81. package/.next/server/app/api/flow/repair/route.js +1 -1
  82. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  83. package/.next/server/app/api/flow/route.js +1 -1
  84. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  85. package/.next/server/app/api/git/route.js +1 -1
  86. package/.next/server/app/api/git/route.js.nft.json +1 -1
  87. package/.next/server/app/api/harness/[id]/route.js +1 -1
  88. package/.next/server/app/api/harness/[id]/route.js.nft.json +1 -1
  89. package/.next/server/app/api/harness/comparisons/[id]/route.js +1 -1
  90. package/.next/server/app/api/harness/comparisons/[id]/route.js.nft.json +1 -1
  91. package/.next/server/app/api/harness/comparisons/route.js +1 -1
  92. package/.next/server/app/api/harness/comparisons/route.js.nft.json +1 -1
  93. package/.next/server/app/api/harness/profiles/route.js +1 -1
  94. package/.next/server/app/api/harness/profiles/route.js.nft.json +1 -1
  95. package/.next/server/app/api/harness/route.js +1 -1
  96. package/.next/server/app/api/harness/route.js.nft.json +1 -1
  97. package/.next/server/app/api/init/route.js +1 -1
  98. package/.next/server/app/api/init/route.js.nft.json +1 -1
  99. package/.next/server/app/api/local-models/capability/route.js +1 -1
  100. package/.next/server/app/api/local-models/capability/route.js.nft.json +1 -1
  101. package/.next/server/app/api/local-models/pull/route.js +1 -1
  102. package/.next/server/app/api/local-models/pull/route.js.nft.json +1 -1
  103. package/.next/server/app/api/local-models/suggest/route.js +1 -1
  104. package/.next/server/app/api/local-models/suggest/route.js.nft.json +1 -1
  105. package/.next/server/app/api/mcp/app-consent/route.js +1 -1
  106. package/.next/server/app/api/mcp/app-consent/route.js.nft.json +1 -1
  107. package/.next/server/app/api/mcp/app-sandbox/route.js +1 -1
  108. package/.next/server/app/api/mcp/app-sandbox/route.js.nft.json +1 -1
  109. package/.next/server/app/api/mcp/assistant/route.js +1 -1
  110. package/.next/server/app/api/mcp/assistant/route.js.nft.json +1 -1
  111. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  112. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  113. package/.next/server/app/api/mcp/flujo/authoring/route.js +1 -1
  114. package/.next/server/app/api/mcp/flujo/authoring/route.js.nft.json +1 -1
  115. package/.next/server/app/api/mcp/flujo/automation/route.js +1 -1
  116. package/.next/server/app/api/mcp/flujo/automation/route.js.nft.json +1 -1
  117. package/.next/server/app/api/mcp/flujo/flows/route.js +1 -1
  118. package/.next/server/app/api/mcp/flujo/flows/route.js.nft.json +1 -1
  119. package/.next/server/app/api/mcp/flujo/resources/read/route.js +1 -1
  120. package/.next/server/app/api/mcp/flujo/resources/read/route.js.nft.json +1 -1
  121. package/.next/server/app/api/mcp/flujo/resources/route.js +1 -1
  122. package/.next/server/app/api/mcp/flujo/resources/route.js.nft.json +1 -1
  123. package/.next/server/app/api/mcp/flujo/servers/route.js +1 -1
  124. package/.next/server/app/api/mcp/flujo/servers/route.js.nft.json +1 -1
  125. package/.next/server/app/api/mcp/flujo/skills/route.js +1 -1
  126. package/.next/server/app/api/mcp/flujo/skills/route.js.nft.json +1 -1
  127. package/.next/server/app/api/mcp/flujo/state/route.js +1 -1
  128. package/.next/server/app/api/mcp/flujo/state/route.js.nft.json +1 -1
  129. package/.next/server/app/api/mcp/flujo/tools/route.js +1 -1
  130. package/.next/server/app/api/mcp/flujo/tools/route.js.nft.json +1 -1
  131. package/.next/server/app/api/mcp/model-risk-assessment/route.js +1 -1
  132. package/.next/server/app/api/mcp/model-risk-assessment/route.js.nft.json +1 -1
  133. package/.next/server/app/api/mcp/oauth-capability/route.js +1 -1
  134. package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -1
  135. package/.next/server/app/api/mcp/security-review/route.js +1 -1
  136. package/.next/server/app/api/mcp/security-review/route.js.nft.json +1 -1
  137. package/.next/server/app/api/mcp/servers/[name]/host-consent/route.js +1 -1
  138. package/.next/server/app/api/mcp/servers/[name]/host-consent/route.js.nft.json +1 -1
  139. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  140. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  141. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  142. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  143. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  144. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  145. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  146. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  147. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  148. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  149. package/.next/server/app/api/mcp/servers/[name]/skills/approve/route.js +1 -1
  150. package/.next/server/app/api/mcp/servers/[name]/skills/approve/route.js.nft.json +1 -1
  151. package/.next/server/app/api/mcp/servers/[name]/skills/get/route.js +1 -1
  152. package/.next/server/app/api/mcp/servers/[name]/skills/get/route.js.nft.json +1 -1
  153. package/.next/server/app/api/mcp/servers/[name]/skills/load/route.js +1 -1
  154. package/.next/server/app/api/mcp/servers/[name]/skills/load/route.js.nft.json +1 -1
  155. package/.next/server/app/api/mcp/servers/[name]/skills/route.js +1 -1
  156. package/.next/server/app/api/mcp/servers/[name]/skills/route.js.nft.json +1 -1
  157. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  158. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  159. package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/confirm/route.js +1 -1
  160. package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/confirm/route.js.nft.json +1 -1
  161. package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/start/route.js +1 -1
  162. package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/start/route.js.nft.json +1 -1
  163. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  164. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  165. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/stream/route.js +1 -1
  166. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/stream/route.js.nft.json +1 -1
  167. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  168. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  169. package/.next/server/app/api/mcp/servers/route.js +1 -1
  170. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  171. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  172. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  173. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  174. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  175. package/.next/server/app/api/mcp-registry/route.js +1 -1
  176. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  177. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  178. package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
  179. package/.next/server/app/api/model/[id]/route.js +1 -1
  180. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  181. package/.next/server/app/api/model/allowance/route.js +1 -1
  182. package/.next/server/app/api/model/allowance/route.js.nft.json +1 -1
  183. package/.next/server/app/api/model/provider/route.js +1 -1
  184. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  185. package/.next/server/app/api/model/route.js +1 -1
  186. package/.next/server/app/api/model/route.js.nft.json +1 -1
  187. package/.next/server/app/api/model/test/route.js +1 -1
  188. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  189. package/.next/server/app/api/network-exposure/route.js +1 -1
  190. package/.next/server/app/api/network-exposure/route.js.nft.json +1 -1
  191. package/.next/server/app/api/oauth/callback/route.js +1 -1
  192. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  193. package/.next/server/app/api/oauth/initiate/route.js +1 -1
  194. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  195. package/.next/server/app/api/oauth/reset/route.js +1 -1
  196. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  197. package/.next/server/app/api/operations/status/route.js +1 -1
  198. package/.next/server/app/api/operations/status/route.js.nft.json +1 -1
  199. package/.next/server/app/api/original-owner/route.js +1 -1
  200. package/.next/server/app/api/original-owner/route.js.nft.json +1 -1
  201. package/.next/server/app/api/packages/build/route.js +1 -1
  202. package/.next/server/app/api/packages/build/route.js.nft.json +1 -1
  203. package/.next/server/app/api/packages/derive-secrets/route.js +1 -1
  204. package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
  205. package/.next/server/app/api/packages/install/route.js +1 -1
  206. package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
  207. package/.next/server/app/api/packages/install/status/route.js +1 -1
  208. package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
  209. package/.next/server/app/api/packages/installed/route.js +1 -1
  210. package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
  211. package/.next/server/app/api/packages/resolve/route.js +1 -1
  212. package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
  213. package/.next/server/app/api/packages/scan-targets/route.js +1 -1
  214. package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
  215. package/.next/server/app/api/packages/search/route.js +1 -1
  216. package/.next/server/app/api/packages/search/route.js.nft.json +1 -1
  217. package/.next/server/app/api/packages/uninstall/route.js +1 -1
  218. package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
  219. package/.next/server/app/api/persona-recovery/route.js +2 -2
  220. package/.next/server/app/api/persona-recovery/route.js.nft.json +1 -1
  221. package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
  222. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  223. package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
  224. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  225. package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
  226. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  227. package/.next/server/app/api/planned-executions/[id]/worker-recovery/route.js +1 -1
  228. package/.next/server/app/api/planned-executions/[id]/worker-recovery/route.js.nft.json +1 -1
  229. package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -1
  230. package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +1 -1
  231. package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
  232. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  233. package/.next/server/app/api/planned-executions/route.js +1 -1
  234. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  235. package/.next/server/app/api/projects/route.js +1 -1
  236. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  237. package/.next/server/app/api/reference-search/files/route.js +1 -1
  238. package/.next/server/app/api/reference-search/files/route.js.nft.json +1 -1
  239. package/.next/server/app/api/registry/auth/resend/route.js +1 -1
  240. package/.next/server/app/api/registry/auth/resend/route.js.nft.json +1 -1
  241. package/.next/server/app/api/registry/auth/reset/route.js +1 -1
  242. package/.next/server/app/api/registry/auth/reset/route.js.nft.json +1 -1
  243. package/.next/server/app/api/registry/auth/route.js +1 -1
  244. package/.next/server/app/api/registry/auth/route.js.nft.json +1 -1
  245. package/.next/server/app/api/registry/feedback/route.js +1 -1
  246. package/.next/server/app/api/registry/feedback/route.js.nft.json +1 -1
  247. package/.next/server/app/api/registry/oauth/callback/route.js +1 -1
  248. package/.next/server/app/api/registry/oauth/callback/route.js.nft.json +1 -1
  249. package/.next/server/app/api/registry/oauth/initiate/route.js +1 -1
  250. package/.next/server/app/api/registry/oauth/initiate/route.js.nft.json +1 -1
  251. package/.next/server/app/api/registry/packages/route.js +1 -1
  252. package/.next/server/app/api/registry/packages/route.js.nft.json +1 -1
  253. package/.next/server/app/api/registry/publish/route.js +1 -1
  254. package/.next/server/app/api/registry/publish/route.js.nft.json +1 -1
  255. package/.next/server/app/api/registry/settings/route.js +1 -1
  256. package/.next/server/app/api/registry/settings/route.js.nft.json +1 -1
  257. package/.next/server/app/api/restore/route.js +1 -1
  258. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  259. package/.next/server/app/api/runs/active/route.js +1 -1
  260. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  261. package/.next/server/app/api/runtime-environment/route.js +1 -1
  262. package/.next/server/app/api/runtime-environment/route.js.nft.json +1 -1
  263. package/.next/server/app/api/setup/ai-cli/route.js +1 -1
  264. package/.next/server/app/api/setup/ai-cli/route.js.nft.json +1 -1
  265. package/.next/server/app/api/snapshot/abort/route.js +1 -1
  266. package/.next/server/app/api/snapshot/abort/route.js.nft.json +1 -1
  267. package/.next/server/app/api/snapshot/begin/route.js +1 -1
  268. package/.next/server/app/api/snapshot/begin/route.js.nft.json +1 -1
  269. package/.next/server/app/api/snapshot/download/route.js +1 -1
  270. package/.next/server/app/api/snapshot/download/route.js.nft.json +1 -1
  271. package/.next/server/app/api/snapshot/finalize/route.js +1 -1
  272. package/.next/server/app/api/snapshot/finalize/route.js.nft.json +1 -1
  273. package/.next/server/app/api/snapshot/info/route.js +1 -1
  274. package/.next/server/app/api/snapshot/info/route.js.nft.json +1 -1
  275. package/.next/server/app/api/snapshot/status/route.js +1 -1
  276. package/.next/server/app/api/snapshot/status/route.js.nft.json +1 -1
  277. package/.next/server/app/api/snapshots/cleanup/route.js +1 -1
  278. package/.next/server/app/api/snapshots/cleanup/route.js.nft.json +1 -1
  279. package/.next/server/app/api/snapshots/open-folder/route.js +1 -1
  280. package/.next/server/app/api/snapshots/open-folder/route.js.nft.json +1 -1
  281. package/.next/server/app/api/snapshots/route.js +1 -1
  282. package/.next/server/app/api/snapshots/route.js.nft.json +1 -1
  283. package/.next/server/app/api/statistics/route.js +1 -1
  284. package/.next/server/app/api/statistics/route.js.nft.json +1 -1
  285. package/.next/server/app/api/storage/route.js +1 -1
  286. package/.next/server/app/api/storage/route.js.nft.json +1 -1
  287. package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
  288. package/.next/server/app/api/telemetry/daily-active/route.js.nft.json +1 -1
  289. package/.next/server/app/api/tickets/[id]/route.js +1 -1
  290. package/.next/server/app/api/tickets/[id]/route.js.nft.json +1 -1
  291. package/.next/server/app/api/tickets/route.js +1 -1
  292. package/.next/server/app/api/tickets/route.js.nft.json +1 -1
  293. package/.next/server/app/api/transcription/route.js +1 -1
  294. package/.next/server/app/api/transcription/route.js.nft.json +1 -1
  295. package/.next/server/app/api/update/route.js +1 -1
  296. package/.next/server/app/api/update/route.js.nft.json +1 -1
  297. package/.next/server/app/api/waves/route.js +1 -1
  298. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  299. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  300. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  301. package/.next/server/app/api/workspaces/route.js +1 -1
  302. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  303. package/.next/server/app/chat/page.js +1 -1
  304. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  305. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  306. package/.next/server/app/mcp/page.js +1 -1
  307. package/.next/server/app/mcp/page.js.nft.json +1 -1
  308. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  309. package/.next/server/app/mcp-flows/route.js +1 -1
  310. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  311. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  312. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  313. package/.next/server/app/settings/page.js +1 -1
  314. package/.next/server/app/settings/page.js.nft.json +1 -1
  315. package/.next/server/app/v1/chat/completions/route.js +1 -1
  316. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  317. package/.next/server/app/v1/chat/conversation-chains/route.js +1 -1
  318. package/.next/server/app/v1/chat/conversation-chains/route.js.nft.json +1 -1
  319. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +1 -1
  320. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  321. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +1 -1
  322. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  323. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/attach/route.js +1 -1
  324. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/attach/route.js.nft.json +1 -1
  325. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  326. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  327. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/state/route.js +1 -1
  328. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/state/route.js.nft.json +1 -1
  329. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  330. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  331. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +1 -1
  332. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  333. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  334. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  335. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js +1 -1
  336. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -1
  337. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/media/[mediaId]/route.js +1 -1
  338. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/media/[mediaId]/route.js.nft.json +1 -1
  339. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/route.js +1 -1
  340. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/route.js.nft.json +1 -1
  341. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/route.js +1 -1
  342. package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/route.js.nft.json +1 -1
  343. package/.next/server/app/v1/chat/conversations/[conversationId]/recovery/route.js +1 -1
  344. package/.next/server/app/v1/chat/conversations/[conversationId]/recovery/route.js.nft.json +1 -1
  345. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js +1 -1
  346. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js.nft.json +1 -1
  347. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
  348. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js.nft.json +1 -1
  349. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  350. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  351. package/.next/server/app/v1/chat/conversations/[conversationId]/revert/route.js +1 -1
  352. package/.next/server/app/v1/chat/conversations/[conversationId]/revert/route.js.nft.json +1 -1
  353. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  354. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  355. package/.next/server/app/v1/chat/conversations/[conversationId]/wire-preview/route.js +1 -1
  356. package/.next/server/app/v1/chat/conversations/[conversationId]/wire-preview/route.js.nft.json +1 -1
  357. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  358. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  359. package/.next/server/app/v1/chat/events/route.js +1 -1
  360. package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
  361. package/.next/server/app/v1/flows/[flowRef]/readiness/route.js +1 -1
  362. package/.next/server/app/v1/flows/[flowRef]/readiness/route.js.nft.json +1 -1
  363. package/.next/server/app/v1/meetings/[meetingId]/cancel/route.js +1 -1
  364. package/.next/server/app/v1/meetings/[meetingId]/cancel/route.js.nft.json +1 -1
  365. package/.next/server/app/v1/meetings/[meetingId]/events/route.js +1 -1
  366. package/.next/server/app/v1/meetings/[meetingId]/events/route.js.nft.json +1 -1
  367. package/.next/server/app/v1/meetings/[meetingId]/interventions/route.js +1 -1
  368. package/.next/server/app/v1/meetings/[meetingId]/interventions/route.js.nft.json +1 -1
  369. package/.next/server/app/v1/meetings/[meetingId]/private-notes/route.js +1 -1
  370. package/.next/server/app/v1/meetings/[meetingId]/private-notes/route.js.nft.json +1 -1
  371. package/.next/server/app/v1/meetings/[meetingId]/resume/route.js +1 -1
  372. package/.next/server/app/v1/meetings/[meetingId]/resume/route.js.nft.json +1 -1
  373. package/.next/server/app/v1/meetings/[meetingId]/route.js +1 -1
  374. package/.next/server/app/v1/meetings/[meetingId]/route.js.nft.json +1 -1
  375. package/.next/server/app/v1/meetings/[meetingId]/start/route.js +1 -1
  376. package/.next/server/app/v1/meetings/[meetingId]/start/route.js.nft.json +1 -1
  377. package/.next/server/app/v1/meetings/route.js +1 -1
  378. package/.next/server/app/v1/meetings/route.js.nft.json +1 -1
  379. package/.next/server/app/v1/models/route.js +1 -1
  380. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  381. package/.next/server/app/v1/persona-drafts/[draftId]/route.js +1 -1
  382. package/.next/server/app/v1/persona-drafts/[draftId]/route.js.nft.json +1 -1
  383. package/.next/server/app/v1/persona-drafts/route.js +1 -1
  384. package/.next/server/app/v1/persona-drafts/route.js.nft.json +1 -1
  385. package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/launch/route.js +1 -1
  386. package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/launch/route.js.nft.json +1 -1
  387. package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/route.js +1 -1
  388. package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/route.js.nft.json +1 -1
  389. package/.next/server/app/v1/personas/[personaId]/app-grants/route.js +1 -1
  390. package/.next/server/app/v1/personas/[personaId]/app-grants/route.js.nft.json +1 -1
  391. package/.next/server/app/v1/personas/[personaId]/behaviors/[behaviorId]/activate/route.js +1 -1
  392. package/.next/server/app/v1/personas/[personaId]/behaviors/[behaviorId]/activate/route.js.nft.json +1 -1
  393. package/.next/server/app/v1/personas/[personaId]/composition/behaviors/route.js +1 -1
  394. package/.next/server/app/v1/personas/[personaId]/composition/behaviors/route.js.nft.json +1 -1
  395. package/.next/server/app/v1/personas/[personaId]/composition/copy/route.js +1 -1
  396. package/.next/server/app/v1/personas/[personaId]/composition/copy/route.js.nft.json +1 -1
  397. package/.next/server/app/v1/personas/[personaId]/composition/route.js +1 -1
  398. package/.next/server/app/v1/personas/[personaId]/composition/route.js.nft.json +1 -1
  399. package/.next/server/app/v1/personas/[personaId]/core/reconcile/route.js +1 -1
  400. package/.next/server/app/v1/personas/[personaId]/core/reconcile/route.js.nft.json +1 -1
  401. package/.next/server/app/v1/personas/[personaId]/deletion-preview/route.js +1 -1
  402. package/.next/server/app/v1/personas/[personaId]/deletion-preview/route.js.nft.json +1 -1
  403. package/.next/server/app/v1/personas/[personaId]/execution-preview/route.js +1 -1
  404. package/.next/server/app/v1/personas/[personaId]/execution-preview/route.js.nft.json +1 -1
  405. package/.next/server/app/v1/personas/[personaId]/export/route.js +1 -1
  406. package/.next/server/app/v1/personas/[personaId]/export/route.js.nft.json +1 -1
  407. package/.next/server/app/v1/personas/[personaId]/export-preview/route.js +1 -1
  408. package/.next/server/app/v1/personas/[personaId]/export-preview/route.js.nft.json +1 -1
  409. package/.next/server/app/v1/personas/[personaId]/goal-admissions/[admissionKey]/route.js +1 -1
  410. package/.next/server/app/v1/personas/[personaId]/goal-admissions/[admissionKey]/route.js.nft.json +1 -1
  411. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/apply/route.js +1 -1
  412. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/apply/route.js.nft.json +1 -1
  413. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/promote/route.js +1 -1
  414. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/promote/route.js.nft.json +1 -1
  415. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/reject/route.js +1 -1
  416. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/reject/route.js.nft.json +1 -1
  417. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/undo/route.js +1 -1
  418. package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/undo/route.js.nft.json +1 -1
  419. package/.next/server/app/v1/personas/[personaId]/improvements/route.js +1 -1
  420. package/.next/server/app/v1/personas/[personaId]/improvements/route.js.nft.json +1 -1
  421. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/activate/route.js +1 -1
  422. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/activate/route.js.nft.json +1 -1
  423. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/correct/route.js +1 -1
  424. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/correct/route.js.nft.json +1 -1
  425. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/pin/route.js +1 -1
  426. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/pin/route.js.nft.json +1 -1
  427. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/resolve-conflict/route.js +1 -1
  428. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/resolve-conflict/route.js.nft.json +1 -1
  429. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/route.js +1 -1
  430. package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/route.js.nft.json +1 -1
  431. package/.next/server/app/v1/personas/[personaId]/memories/route.js +1 -1
  432. package/.next/server/app/v1/personas/[personaId]/memories/route.js.nft.json +1 -1
  433. package/.next/server/app/v1/personas/[personaId]/route.js +1 -1
  434. package/.next/server/app/v1/personas/[personaId]/route.js.nft.json +1 -1
  435. package/.next/server/app/v1/personas/[personaId]/runtime-recovery/route.js +1 -1
  436. package/.next/server/app/v1/personas/[personaId]/runtime-recovery/route.js.nft.json +1 -1
  437. package/.next/server/app/v1/personas/[personaId]/storage-stats/route.js +1 -1
  438. package/.next/server/app/v1/personas/[personaId]/storage-stats/route.js.nft.json +1 -1
  439. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/assign/route.js +1 -1
  440. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/assign/route.js.nft.json +1 -1
  441. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/control/route.js +1 -1
  442. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/control/route.js.nft.json +1 -1
  443. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/route.js +1 -1
  444. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/route.js.nft.json +1 -1
  445. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/runtime/route.js +1 -1
  446. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/runtime/route.js.nft.json +1 -1
  447. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/source/route.js +1 -1
  448. package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/source/route.js.nft.json +1 -1
  449. package/.next/server/app/v1/personas/[personaId]/work-items/promote-todo/route.js +1 -1
  450. package/.next/server/app/v1/personas/[personaId]/work-items/promote-todo/route.js.nft.json +1 -1
  451. package/.next/server/app/v1/personas/[personaId]/work-items/route.js +1 -1
  452. package/.next/server/app/v1/personas/[personaId]/work-items/route.js.nft.json +1 -1
  453. package/.next/server/app/v1/personas/readiness/route.js +1 -1
  454. package/.next/server/app/v1/personas/readiness/route.js.nft.json +1 -1
  455. package/.next/server/app/v1/personas/route.js +1 -1
  456. package/.next/server/app/v1/personas/route.js.nft.json +1 -1
  457. package/.next/server/app/v1/personas/settings-options/route.js +1 -1
  458. package/.next/server/app/v1/personas/settings-options/route.js.nft.json +1 -1
  459. package/.next/server/app/v1/personas/summary/route.js +1 -1
  460. package/.next/server/app/v1/personas/summary/route.js.nft.json +1 -1
  461. package/.next/server/app/v1/roles/[roleId]/duplicate/route.js +1 -1
  462. package/.next/server/app/v1/roles/[roleId]/duplicate/route.js.nft.json +1 -1
  463. package/.next/server/app/v1/roles/[roleId]/impact/route.js +1 -1
  464. package/.next/server/app/v1/roles/[roleId]/impact/route.js.nft.json +1 -1
  465. package/.next/server/app/v1/roles/[roleId]/restore/route.js +1 -1
  466. package/.next/server/app/v1/roles/[roleId]/restore/route.js.nft.json +1 -1
  467. package/.next/server/app/v1/roles/[roleId]/rollback/route.js +1 -1
  468. package/.next/server/app/v1/roles/[roleId]/rollback/route.js.nft.json +1 -1
  469. package/.next/server/app/v1/roles/[roleId]/route.js +1 -1
  470. package/.next/server/app/v1/roles/[roleId]/route.js.nft.json +1 -1
  471. package/.next/server/app/v1/roles/[roleId]/versions/route.js +1 -1
  472. package/.next/server/app/v1/roles/[roleId]/versions/route.js.nft.json +1 -1
  473. package/.next/server/app/v1/roles/route.js +1 -1
  474. package/.next/server/app/v1/roles/route.js.nft.json +1 -1
  475. package/.next/server/app/v1/tasks/[taskId]/route.js +1 -1
  476. package/.next/server/app/v1/tasks/[taskId]/route.js.nft.json +1 -1
  477. package/.next/server/app-paths-manifest.json +60 -60
  478. package/.next/server/chunks/14645.js +1 -1
  479. package/.next/server/chunks/21392.js +3 -3
  480. package/.next/server/chunks/{83503.js → 25847.js} +3 -3
  481. package/.next/server/chunks/31519.js +3 -3
  482. package/.next/server/chunks/34679.js +1 -1
  483. package/.next/server/chunks/52152.js +3 -3
  484. package/.next/server/chunks/73633.js +1 -1
  485. package/.next/server/chunks/81306.js +1 -1
  486. package/.next/server/chunks/82300.js +3 -3
  487. package/.next/server/chunks/83718.js +1 -1
  488. package/.next/server/chunks/8464.js +1 -1
  489. package/.next/server/chunks/{78608.js → 87864.js} +3 -3
  490. package/.next/server/chunks/89031.js +1 -1
  491. package/.next/server/chunks/97235.js +1 -1
  492. package/.next/server/middleware-build-manifest.js +1 -1
  493. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  494. package/.next/server/pages/500.html +1 -1
  495. package/.next/server/preview-props.json +3 -3
  496. package/.next/server/server-reference-manifest.js +1 -1
  497. package/.next/server/server-reference-manifest.json +1 -1
  498. package/.next/static/chunks/{2103-5f61569b0629e957.js → 2103-be5e06316fbab625.js} +1 -1
  499. package/.next/static/chunks/app/chat/{page-569fe5a097bb2c06.js → page-314d31c432c2d88b.js} +1 -1
  500. package/.next/static/chunks/webpack-1449ea081feba501.js +1 -0
  501. package/.next/trace-build +1 -1
  502. package/README.md +1 -1
  503. package/mcp-servers/bash/package.json +1 -1
  504. package/mcp-servers/browser/package.json +1 -1
  505. package/mcp-servers/filesystem/package.json +1 -1
  506. package/mcp-servers/flujo/package.json +1 -1
  507. package/package.json +5 -5
  508. package/.next/static/chunks/webpack-d7e41a6b1b459ed1.js +0 -1
  509. /package/.next/static/{QzwOWTB7GKoP7AaFNpYr5 → dA-lF06zcBoG4LavbX9MD}/_buildManifest.js +0 -0
  510. /package/.next/static/{QzwOWTB7GKoP7AaFNpYr5 → dA-lF06zcBoG4LavbX9MD}/_ssgManifest.js +0 -0
@@ -62,7 +62,7 @@ ${c}`;continue}let d=/^data:([^;,]+);base64,([\s\S]*)$/.exec(b.content??"");d&&c
62
62
 
63
63
  CALLABLE SUBFLOW TOOL (not a handoff): calling this runs the "${b.label}" subflow right now and returns its result as structured JSON (success/output/error per lane) — you stay on the current step and can keep working with the answer. Saved child conversation memory applies when configured. An interrupted call has no checkpointed graph join and must be retried.`,inputSchema:{type:"object",properties:{task:{type:"string",description:d?"REQUIRED task/instruction for this subflow call. It has no default input configured.":"Task/instruction for this subflow call. Optional; omitted falls back to the subflow's configured input."},..."per-key"===e?{sessionKey:{type:"string",minLength:1,maxLength:128,description:"Stable child-conversation handle. Equal keys resume the same child; this overrides the saved key template."}}:{}},required:d?["task"]:[]}}}async function r(a,b,d){let e,{conversationId:q,emit:r}=d,s=(0,i.PL)(),t=(a,b)=>{if(!e)return;let c=e;e=void 0;try{let d=Math.max(0,s.elapsedMs()-c.waitMs);(0,h.z9)((0,h.k)({type:"subflow.invocation",runId:c.parentRunId,node:c.node,subflow:c.subflow,mode:"inline",invocationId:c.invocationId,childRunId:b?.childRunId,outcome:a,durationMs:d,waitMs:c.waitMs,phases:{subflowWait:c.waitMs,subflowExecution:d},errorClass:"error"===a?(0,h.Ys)(b?.error):void 0}))}catch{}};try{let d;if(!q)return{success:!1,error:"No active conversation to run the subflow tool call in."};let h=(0,o.C)().get(q);if(!h)return{success:!1,error:"Live conversation state not found for the subflow tool call."};if(h.executionExtensionContext||(0,l.isExecutionProtectedState)(h))return{success:!1,error:"execution_subflow_child_authority_required"};let u=h.subflowToolNameMap?.[a];if(!u)return{success:!1,error:`Unknown call_subflow tool "${a}" — no matching target node.`};let v=h.flowSnapshot??await g.flowService.getFlow(h.flowId),w=v?.nodes.find(a=>a.id===u),x=w?.data?.properties,y=x?.subflowId;if(!y)return{success:!1,error:"Target subflow node has no configured subflowId."};let z=(0,j.i)({personaAttribution:h.personaAttribution,parentFlowSnapshot:h.flowSnapshot,nodeId:u},y);try{d=z.flowDefinition?.name??(await g.flowService.getFlow(y))?.name}catch(a){p.warn("Could not resolve subflow display name; continuing without it",{err:a})}let A="string"==typeof b?.task?b.task.trim():"",B=(A.length>0?A:void 0)??x?.promptTemplate,C={subflowId:y,subflowName:d,...B?{input:{prompt:B}}:{},laneTitle:(0,f.oO)(B??d??"Subflow call"),callerSessionKey:(0,m.dd)(b?.sessionKey)},D=(h.runDepth??0)+1,E={nodeId:u,nodeName:w?.data?.label,nodeType:"subflow"},F={nodeId:u,nodeType:"subflow",subflowId:y,subflowName:d,nodeName:w?.data?.label,depth:D,chainDepth:h.chainDepth,parentRunId:h.conversationId,plannedExecutionId:h.plannedExecutionId,personaAttribution:h.personaAttribution,executionAuthority:(0,k.c4)(h.executionAuthority),parentFlowSnapshot:h.flowSnapshot,persistConversation:!1,sessionScope:x?.sessionScope,sessionKeyTemplate:x?.sessionKey,sessionInputMode:x?.sessionInputMode??"resume",sessionTurnCap:(0,m.p)(x?.sessionTurnCap),showSteps:!0,emit:r,lanes:[C],concurrencyLimit:1,joinSeparator:"\n\n",errorStrategy:"collect-all"},{runFlow:G}=await Promise.all([c.e(71084),c.e(79137)]).then(c.bind(c,271084)),{runSubflowLanes:H,resolveSubflowSessionKeys:I}=await Promise.resolve().then(c.bind(c,538739));"per-key"===F.sessionScope&&await I(F,h,u),F.persistConversation=!h.ephemeral&&x?.saveConversation!==!1&&(x?.sessionScope==="per-run"||x?.sessionScope==="per-key"&&!!F.lanes?.[0]?.sessionKey),h.logicalRunId&&(e={parentRunId:h.logicalRunId,node:{id:u,...w?.data?.label?{name:w.data.label}:{}},subflow:{id:y,...d?{name:d}:{}},invocationId:(0,i.Lf)(),waitMs:s.elapsedMs()});let J=await H(F,G,E,B?{prompt:B}:{prompt:""});return(0,n.F)(J),t(h.isCancelled?"cancelled":J.success?"completed":"error",{error:J.error,childRunId:function(a){let b=a?.lanes;if(!Array.isArray(b)||0===b.length)return;let c=b[0];for(let a of["runId","conversationId","childConversationId"]){let b=c?.[a];if("string"==typeof b&&b.length>0)return b}}(J)}),{success:J.success,data:{success:J.success,outputText:J.outputText,error:J.error,lanes:J.lanes},error:J.success?void 0:J.error}}catch(c){let b=c instanceof Error?c.message:String(c);return t("error",{error:c}),p.warn("call_subflow tool execution failed",{toolName:a,err:b}),{success:!1,error:b,...(0,n.Z7)(c)?{errorDetails:c.details}:{}}}}},340653:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{z:()=>j});var e=c(482964),f=c(392281),g=c(373327),h=a([g]);g=(h.then?(await h)():h)[0];let i=(0,e.h)("backend/flow/execution/handlers/MCPHandler");class j{static async executeMCP(a){let{mcpServer:b,enabledTools:c,nodeId:d,nodeRoots:e}=a;i.verbose("executeMCP input",JSON.stringify(a));try{d&&g.mcpService.setNodeRoots(b,d,e);let a=await g.mcpService.getServerStatus(b);if("connected"!==a.status){let a=await g.mcpService.connectServer(b);if(!a.success){let c={success:!1,error:(0,f.Fp)("server_connection_failed",`Failed to connect to MCP server: ${a.error}`,b,"connect")};return i.verbose("executeMCP connection error",JSON.stringify(c)),c}}let h=await g.mcpService.listServerTools(b);if(h.error){let a={success:!1,error:(0,f.Fp)("list_tools_failed",`Failed to list tools for server: ${h.error}`,b,"listTools")};return i.verbose("executeMCP list tools error",JSON.stringify(a)),a}let j={success:!0,value:{server:b,tools:h.tools||[],enabledTools:c}};return i.verbose("executeMCP success result",JSON.stringify(j)),j}catch(c){let a={success:!1,error:(0,f.Fp)("mcp_execution_failed",c instanceof Error?c.message:String(c),b,"executeMCP")};return i.verbose("executeMCP execution error",JSON.stringify(a)),a}}}d()}catch(a){d(a)}})},345451:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{p:()=>r});var e=c(502910),f=c(160684),g=c(373327),h=c(482964),i=c(898284),j=c(305035),k=c(454464),l=a([f,g]);[f,g]=l.then?(await l)():l;let s=(0,h.h)("backend/execution/flow/buildHandoffDescription");async function m(a,b){if(!a)return;if(b.modelNames.has(a))return b.modelNames.get(a);let c=a;try{let b=await f.modelService.getModel(a);b&&(c=b.displayName&&b.displayName.trim()||b.name||a)}catch(b){s.debug("resolveModelName failed; using raw id",{modelId:a,err:b})}return b.modelNames.set(a,c),c}async function n(a,b){if(b.serverConnected.has(a))return b.serverConnected.get(a);let c=!1;try{let b=await g.mcpService.getServerStatus(a);c=b?.status==="connected"}catch(b){s.debug("getServerStatus failed; treating server as offline",{server:a,err:b})}return b.serverConnected.set(a,c),c}async function o(a,b){if(b.flows.has(a))return b.flows.get(a);if(b.immutableFlows)return null;let c=null;try{c=await e.flowService.getFlow(a)}catch(b){s.debug("getFlow failed while summarising subflow",{flowId:a,err:b})}return b.flows.set(a,c),c}async function p(a,b){let c=Array.isArray(a.mcpNodes)?a.mcpNodes:[],d=[],e=new Set;for(let a of c){if(!a||"object"!=typeof a)continue;let c="properties"in a&&a.properties&&"object"==typeof a.properties?a.properties:{},f="string"==typeof c.boundServer?c.boundServer:void 0;if(!f||e.has(f))continue;e.add(f);let g=await n(f,b),h=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a):[];d.push({name:f,connected:g,tools:g?h:void 0})}return d}async function q(a,b,c,d){let e=a.data?.type||a.type||"unknown",f=a.data?.label||"Unknown Node",g=a.data?.properties||{},h=a.data?.description,j={label:f,type:e,userDescription:h};if(h&&h.trim())return j;if("subflow"===e){let a="string"==typeof g.subflowId?g.subflowId:void 0;if(!a)return j.subflowMissing=!0,j;if(b+1>i.A||d.has(a)){j.depthCapReached=!0;let b=await o(a,c);return j.subflowName=b?.name,j}let e=await o(a,c);if(!e)return j.subflowMissing=!0,j;j.subflowName=e.name;let f=new Set(d);f.add(a);let h=(e.nodes||[]).filter(a=>a.data?.type==="process"||a.data?.type==="subflow"||"process"===a.type||"subflow"===a.type);for(let a of(j.children=[],h))j.children.push(await q(a,b+1,c,f));return j}let k="string"==typeof g.boundModel?g.boundModel:void 0;j.modelName=await m(k,c);let l=g.promptTemplate;return"string"==typeof l&&l.trim()&&(j.promptSummary=l),j.servers=await p(g,c),j}async function r(a,b){try{let c=await q(a,0,function(a){let b=new Map;if(a)for(let c of(a.executionDependencies&&(0,j.DQ)(a),b.set(a.id,a),a.executionDependencies?.flows??[]))b.set(c.flowId,c.flowSnapshot);return{modelNames:new Map,serverConnected:new Map,flows:b,immutableFlows:!!a}}(b),new Set);return(0,k.iB)(c)}catch(d){let b=a.data?.label||"Unknown Node",c=a.data?.type||a.type||"unknown";return s.warn("buildHandoffDescription failed; falling back to basic description",{label:b,type:c,err:d}),`Hand off execution to ${b} (${c})`}}d()}catch(a){d(a)}})},361784:(a,b,c)=>{"use strict";c.d(b,{Mb:()=>n,Wk:()=>p,ZH:()=>C,ih:()=>w,kp:()=>t,t8:()=>v});var d=c(977598),e=c(591657),f=c(700862),g=c(759538),h=c(84169),i=c(894581),j=c(405674),k=c(134129),l=c(964870),m=c(205896);class n extends g.V${constructor(){super("MCP Tasks request timed out"),this.name="TasksExtensionRequestTimeoutError"}}let o=new WeakMap;function p(a,b){if(o.has(a))throw Error("MCP Tasks identity is already registered");if(!b.endpointId)throw TypeError("MCP Tasks endpoint identity must not be empty");o.set(a,{identity:b})}class q{constructor(a,b,c,e,f){this.client=a,this.transport=b,this.onLateCreation=c,this.checkAuthority=e,this.onRetired=f,this.prefix=`flujo-tasks:${(0,d.randomUUID)()}:`,this.sequence=0,this.pending=new Map,this.lateCreations=new Map,this.retired=!1,this.onmessage=(a,b)=>{if("id"in a&&!("method"in a)&&"string"==typeof a.id&&a.id.startsWith(this.prefix)){let b=this.pending.get(a.id);if(b)if("result"in a&&y(a.result)&&(0,k.Wi)(a.result))b.finish({kind:"result",result:a.result});else if("error"in a&&y(a.error)&&(0,k.Wi)(a.error)){let c=l.W7.safeParse(a.error);c.success?b.finish({kind:"error",error:c.data}):b.finish(void 0,new g.V$("MCP Tasks response error is malformed"))}else b.finish(void 0,new g.V$("MCP Tasks response is not bounded JSON"));else if(!this.retired&&(this.lateCreations.get(a.id)??0)>Date.now()){this.lateCreations.delete(a.id);let b="result"in a&&y(a.result)?l._N.safeParse(a.result):void 0;b?.success&&this.onLateCreation(b.data.taskId).catch(()=>{})}return}if("method"in a&&"notifications/progress"===a.method){let b=a.params?.progressToken;if("string"==typeof b&&b.startsWith(this.prefix))return void this.pending.get(b)?.progress(a.params)}this.previousMessage?.call(this.transport,a,b)},this.onclose=()=>{this.retire(new g.V$("MCP Tasks transport closed")),this.previousClose?.call(this.transport)},this.dispatch=async(a,b={})=>{var c,d;if(await this.checkAuthority(),this.retired||this.client.transport!==this.transport||this.transport.onmessage!==this.onmessage)return this.retire(),Promise.reject(new g.V$("MCP Tasks connection is no longer active"));if(b.signal?.aborted)return Promise.reject(r(b.signal));if(!s(a)||"string"!=typeof a.method)return Promise.reject(new g.V$("MCP Tasks request must be an object with a method"));let e=b.context?.requestTimeoutMs??6e4;if(!Number.isSafeInteger(e)||e<=0||e>0x7fffffff)return Promise.reject(RangeError("MCP Tasks request timeout must be a positive 32-bit integer"));let f=`${this.prefix}${this.sequence++}`,h=s(c=a.params)?c:{},i={...a,jsonrpc:"2.0",id:f,params:{...h,_meta:{...s(d=h._meta)?d:{},progressToken:f}}};return new Promise((c,d)=>{let h,j=new AbortController,k=setTimeout(()=>o(void 0,new n),e),l=()=>{clearTimeout(h),h=setTimeout(()=>o(void 0,new n),e)},m=()=>o(void 0,r(b.signal)),o=(e,i)=>{if(this.pending.delete(f)){if(clearTimeout(h),clearTimeout(k),b.signal?.removeEventListener("abort",m),j.abort(),!e&&!this.retired&&"tools/call"===a.method){for(let[a,b]of this.lateCreations)b<=Date.now()&&this.lateCreations.delete(a);for(;this.lateCreations.size>=32;)this.lateCreations.delete(this.lateCreations.keys().next().value);this.lateCreations.set(f,Date.now()+3e4)}e?this.checkAuthority().then(()=>{if(b.signal?.aborted)throw r(b.signal);if(this.retired||this.client.transport!==this.transport||this.transport.onmessage!==this.onmessage)throw new g.V$("MCP Tasks connection retired before result delivery");c(e)}).catch(d):d(i)}};this.pending.set(f,{finish:o,progress:a=>{if(b.context?.resetTimeoutOnProgress&&l(),a&&"number"==typeof a.progress&&Number.isFinite(a.progress))try{b.context?.onprogress?.({progress:a.progress,..."number"==typeof a.total&&Number.isFinite(a.total)?{total:a.total}:{},..."string"==typeof a.message?{message:a.message}:{}})}catch(a){o(void 0,a)}}}),b.signal?.addEventListener("abort",m,{once:!0}),l(),this.transport.send(i,{headers:b.context?.headers,requestSignal:j.signal,onRequestStreamEnd:()=>o(void 0,new g.V$("MCP Tasks response stream ended before a reply"))}).catch(a=>o(void 0,a))})},this.previousMessage=b.onmessage,this.previousClose=b.onclose,b.onmessage=this.onmessage,b.onclose=this.onclose}retire(a=new g.V$("MCP Tasks session retired")){if(!this.retired){for(let b of(this.retired=!0,this.lateCreations.clear(),[...this.pending.values()]))b.finish(void 0,a);this.onRetired()}}}function r(a){return a.reason instanceof Error?a.reason:new DOMException("The operation was aborted","AbortError")}function s(a){return null!=a&&"object"==typeof a&&!Array.isArray(a)}function t(a){let b,c=o.get(a);if(!c||c.retired)return;if(c.bundle)return c.bundle;if(a.getProtocolEra?.()==="modern"&&(c.negotiatedModern=!0),a.getProtocolEra?.()!=="modern"||a.getNegotiatedProtocolVersion?.()!=="2026-07-28"||!(0,m.BD)(a.getServerCapabilities?.())||!a.transport)return;let d=a.transport,f=new AbortController,k=async()=>{if(c.retired||c.identity.isAuthorityCurrent&&!await c.identity.isAuthorityCurrent())throw c.retired=!0,c.close?.().catch(()=>{}),new g.V$("MCP Tasks connection authority is no longer current")},p=new q(a,d,async b=>{let e=c.identity.authorizeLateTaskCancellation;e&&!c.retired&&a.transport===d&&await e(b)&&(c.retired||a.transport!==d||await c.bundle?.cancelTask(b))},k,()=>{f.abort(),c.retired=!0,c.close?.().catch(()=>{})});try{b=(0,i.Vj)(a,c.identity.endpointId,{rawDispatch:p.dispatch,v2RequestFraming:{...c.identity,protocolVersion:"2026-07-28"}})}catch(a){throw p.retire(),a}let s=(0,j.v)(b,{}),t=async(a,c,d)=>{try{var e=await b.dispatch({method:a,params:c},d);if("error"===e.kind)throw new h.xe(e.error);return e.result}catch(b){if(d?.signal?.aborted&&!f.signal.aborted)throw r(d.signal);let a=function(a){let b=a;for(let a=0;a<5&&b instanceof Error;a++){if(b instanceof n)return b;b=Object.getOwnPropertyDescriptor(b,"cause")?.value}}(b);if(a)throw a;throw b}},u=(a,b)=>({...b,context:{...b?.context,headers:{...Object.fromEntries(Object.entries(b?.context?.headers??{}).filter(([a])=>"mcp-name"!==a.toLowerCase())),"Mcp-Name":a}}}),v=new Map;return c.bundle={session:s,signal:f.signal,async callTool(b,c){let d=new AbortController,h=c?.context?.requestTimeoutMs??6e4,i=setTimeout(()=>d.abort(new n),h),j=AbortSignal.any([f.signal,d.signal,...c?.signal?[c.signal]:[]]);try{var m,o;let d,f,i,n,p,q;if(await k(),v.size>=1e3)throw new g.V$("MCP Tasks output validation capacity exceeded");let r=(await a.listTools(void 0,{signal:j,timeout:h,maxTotalTimeout:h})).tools.find(a=>a.name===b.name),s=C(r),u={...Object.fromEntries(Object.entries(c?.context?.headers??{}).filter(([a])=>!a.toLowerCase().startsWith("mcp-param-"))),...(m=r,o=b.arguments,f={},i=new Set,n=0,p=()=>{throw new e.bd(e.qu.InvalidParams,"Invalid MCP parameter header declaration")},q=(a,b,c,d)=>{if((++n>1e4||d>32)&&p(),null!==a&&"object"==typeof a){if(Object.hasOwn(a,"x-mcp-header")){let d=a["x-mcp-header"];(!c||!b.length||"string"!=typeof d||!A.test(d)||!["string","integer","boolean"].includes(String(a.type))||i.has(d.toLowerCase()))&&p(),i.add(d.toLowerCase());let e=o;for(let a of b)e=null!==e&&"object"==typeof e&&Object.hasOwn(e,a)?e[a]:void 0;if(null!=e){("string"!==a.type||"string"==typeof e)&&("boolean"!==a.type||"boolean"==typeof e)&&("integer"!==a.type||Number.isSafeInteger(e))||p();let b=String(e),c=b.length>0&&b===b.trim()&&/^[\x09\x20-\x7e]*$/.test(b)&&!(b.startsWith("=?base64?")&&b.endsWith("?="));f["Mcp-Param-"+d]=c?b:"=?base64?"+Buffer.from(b,"utf8").toString("base64")+"?="}}if(a.properties&&"object"==typeof a.properties)for(let[e,f]of Object.entries(a.properties))q(f,[...b,e],c,d+1);for(let c of B){let e=a[c];Array.isArray(e)?e.forEach(a=>q(a,b,!1,d+1)):e&&"object"==typeof e&&(["patternProperties","dependentSchemas","$defs","definitions"].includes(c)?Object.values(e).forEach(a=>q(a,b,!1,d+1)):q(e,b,!1,d+1))}}},m&&q(m.inputSchema,[],!0,0),f)},x=b;for(let e=0;e<=32;e++){j.throwIfAborted();let f=await t("tools/call",{...x},{...c,signal:j,context:{...c?.context,headers:u}}),h=l.ss.safeParse(f);if(h.success){if(32===e||!h.data.inputRequests&&h.data.requestState===d)throw new g.V$("MCP Tasks initial input did not converge");d=h.data.inputRequests?void 0:h.data.requestState;let f=Object.fromEntries(await Promise.all(Object.entries(h.data.inputRequests??{}).map(async([b,d])=>[b,await w(a,d,j,c?.expectedConversationId)])));x={...b,...void 0===h.data.requestState?{}:{requestState:h.data.requestState},...Object.keys(f).length?{inputResponses:l.uD.parse(f)}:{}};continue}let i=l._N.safeParse(f);if(i.success)return v.set(i.data.taskId,s),i.data;let k=l.xu.parse(f);if("complete"!==k.resultType)throw new g.V$("MCP Tasks completion is not a completed tool result");return s(k),k}throw new g.V$("MCP Tasks initial input did not converge")}finally{clearTimeout(i)}},async getTask(a,b){let c=l.Y$.parse(await t("tasks/get",{taskId:a},u(a,b)));if(c.taskId!==a)throw new g.V$("MCP Tasks response identity mismatch");return["failed","cancelled"].includes(c.status)&&v.delete(a),c},validateToolResult(a,b){let c=v.get(a);if(!c)return!1;try{c(b)}finally{v.delete(a)}return!0},async cancelTask(a,b){l.U$.parse(await t("tasks/cancel",{taskId:a},u(a,b)))},async updateTask(a,b,c){let d=l.uD.parse(b);l.RX.parse(await t("tasks/update",{taskId:a,inputResponses:d},u(a,c)))}},c.close=async()=>{c.retired=!0,f.abort(),p.retire(),v.clear();try{await s.close()}finally{b[Symbol.dispose]()}},b.onInvalidated(()=>{c.close?.().catch(()=>{})}),c.bundle}async function u(a){let b=o.get(a);b&&(b.retired=!0,await b.close?.())}function v(a){let b=o.get(a);return b?.negotiatedModern===!0||b?.bundle!==void 0}async function w(a,b,c,d){let e=o.get(a);if(!e||e.retired||!e.identity.handleInputRequest)throw new g.V$("MCP Tasks input handling is not available");if(c?.aborted)throw r(c);if(e.identity.isAuthorityCurrent&&!await e.identity.isAuthorityCurrent())throw await u(a),new g.V$("MCP Tasks input authority is no longer current");let f=l.d7.parse(b),h=e.identity.handleInputRequest(f,c,d),i=await x(h,c);if(c?.aborted)throw r(c);if(e.retired||e.identity.isAuthorityCurrent&&!await e.identity.isAuthorityCurrent())throw await u(a),new g.V$("MCP Tasks input authority changed before result delivery");return"elicitation/create"===f.method?l.Rz.parse(i):"sampling/createMessage"===f.method?l.KB.parse(i):l.q6.parse(i)}async function x(a,b){if(!b)return a;let c=()=>{},d=new Promise((a,d)=>{c=()=>d(r(b)),b.addEventListener("abort",c,{once:!0}),b.aborted&&c()});try{return await Promise.race([a,d])}finally{b.removeEventListener("abort",c)}}function y(a){let b=0,c=0,d=new Set,e=(a,f)=>{if(++b>1e4||f>32)return!1;if("string"==typeof a)return(c+=a.length)<=1048576;if(null===a||"boolean"==typeof a)return!0;if("number"==typeof a)return Number.isFinite(a);if("object"!=typeof a||d.has(a))return!1;d.add(a);let g=Object.keys(a);if(g.length>1e4)return!1;for(let b of g){c+=b.length;let d=Object.getOwnPropertyDescriptor(a,b);if(c>1048576||!d||!("value"in d)||!e(d.value,f+1))return!1}return d.delete(a),!0};return e(a,0)}let z=new f.p4,A=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,B=new Set(["items","prefixItems","contains","additionalProperties","unevaluatedProperties","unevaluatedItems","propertyNames","patternProperties","dependentSchemas","oneOf","anyOf","allOf","not","if","then","else","$defs","definitions"]);function C(a){let b;if(!a?.outputSchema)return()=>{};try{b=z.getValidator(a.outputSchema)}catch{throw new e.bd(e.qu.InvalidParams,"MCP tool output schema is invalid")}return a=>{if(!a.isError){if(void 0===a.structuredContent)throw new e.bd(e.qu.InvalidRequest,"MCP tool did not return required structured content");if(!b(a.structuredContent).valid)throw new e.bd(e.qu.InvalidParams,"MCP tool output does not match its schema")}}}},365705:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{J3:()=>A,Jb:()=>C,Zp:()=>v,iq:()=>x,mm:()=>E});var e=c(482964),f=c(53769),g=c(732423),h=c(502910),i=c(901689),j=c(771795),k=c(117429),l=c(328461),m=c(624788),n=c(927739),o=c(874930),p=c(862888),q=c(529547),r=c(200797),s=c(727582),t=a([q]);q=(t.then?(await t)():t)[0];let D=(0,e.h)("backend/flow/execution/handlers/subflowDetachedInvocation"),E="start_subflow_",F=globalThis,G=F.__flujoDetachedJobs??=new Map,H="subflow-task-runtime-timeout";function u(a){return(0,l.getCurrentWorkspace)()===l.DEFAULT_WORKSPACE?a:(0,l.workspaceCacheKey)(a)}function v(a,b,c,d){return{name:a,description:`${c}
64
64
 
65
- DETACHED SUBFLOW: starts "${b.label}" in the background and returns a durable task handle immediately. Keep working while it runs. Use subflow_send_message for steering/replies and subflow_wait to wait for updates. subflow_task_get reads its result; subflow_task_cancel stops it.`,inputSchema:{type:"object",properties:{task:{type:"string",description:d?"Required task for the detached subflow.":"Optional task; defaults to the subflow configuration."}},required:d?["task"]:[]}}}async function w(a,b,d,e,h,i,l){let m=(0,k.PL)(),n=!1,o=(a,b)=>{if(l?.parentRunId&&!n){n=!0;try{let c=m.elapsedMs();(0,j.z9)((0,j.k)({type:"subflow.invocation",runId:l.parentRunId,node:l.node,subflow:l.subflow,mode:"detached",invocationId:l.invocationId,childRunId:l.childRunId,outcome:a,durationMs:c,waitMs:0,phases:{subflowExecution:c},errorClass:"error"===a?(0,j.Ys)(b):void 0}))}catch{}}},r=Number.isFinite(i)&&i>0?setTimeout(()=>h.abort(H),i):void 0;r?.unref?.();let t=async b=>{let c=await (0,g.mQ)(a.taskId,b,{ifStatus:"working"});if(c&&["completed","failed","cancelled"].includes(c.status))try{await (0,q.ac)(c)}catch(b){D.warn("Could not notify the parent of a completed subflow task",{taskId:a.taskId,error:b})}},v=async()=>h.signal.aborted||!!b.executionAuthority?.signal.aborted||(0,p._K)(a.originConversationId,(0,s.C)()),w=async()=>{let a=h.signal.reason===H;o(a?"error":"cancelled",a?Error("Detached subflow timed out."):void 0),await t(a?{status:"failed",failureReason:"timeout",error:"Detached subflow exceeded its maximum runtime."}:{status:"cancelled",failureReason:"cancelled",cancelRequestedAt:Date.now()})};try{let{runFlow:h}=await Promise.all([c.e(71084),c.e(79137)]).then(c.bind(c,271084)),{runSubflowLanes:i}=await Promise.resolve().then(c.bind(c,538739)),j=await i(b,h,d,e);try{let b=await (0,g.gg)(a.taskId);if(await v()||b?.status==="cancelled")return void await w();o(j.success?"completed":"error",j.error),await t(j.success?{status:"completed",outputText:j.outputText}:{status:"failed",error:j.error??"Detached subflow failed.",failureReason:"child-error"})}finally{(0,f.Tf)(j)}}catch(a){await v()?await w():(o("error",a),await t({status:"failed",error:a instanceof Error?a.message:String(a),failureReason:"child-error"}))}finally{r&&clearTimeout(r),o("incomplete"),G.delete(u(a.taskId))}}async function x(a,b,c){return(0,m.l_)((0,l.workspaceCacheKey)("subflow-task-admission"),()=>y(a,b,c))}async function y(a,b,c){let d=c.conversationId;if(!d)return{success:!1,error:"No active conversation to start a detached subflow."};try{let e,f=(0,s.C)().get(d);if(f&&(f.executionExtensionContext||(0,r.isExecutionProtectedState)(f)))return{success:!1,error:"execution_subflow_child_authority_required"};let j=f?.subflowDetachedToolNameMap?.[a];if(!f||!j)return{success:!1,error:`Unknown detached subflow tool "${a}".`};if(await (0,n.kX)(f),f.isCancelled||f.executionAuthority?.signal.aborted)return{success:!1,error:"The launching conversation was cancelled."};let[m,p]=await Promise.all([(0,g.zS)(),(0,g.Vk)({status:"working",limit:500})]);if(p.length>=m.maxConcurrentDetachedJobs)return{success:!1,error:`Detached job limit reached (${m.maxConcurrentDetachedJobs}).`};let q=f.flowSnapshot??await h.flowService.getFlow(f.flowId),t=q?.nodes.find(a=>a.id===j),v=t?.data?.properties;if(!v?.subflowId)return{success:!1,error:"Target subflow node has no configured subflowId."};let x=(0,o.i)({personaAttribution:f.personaAttribution,parentFlowSnapshot:f.flowSnapshot,nodeId:j},v.subflowId),y=("string"==typeof b.task?b.task.trim():"")||v.promptTemplate||"",z=await (0,n.Gi)(f,()=>(0,g.UT)({status:"working",pollInterval:v.detachedPollIntervalMs,originConversationId:f.conversationId??d,originNodeId:j,originLogicalRunId:f.logicalRunId,flowId:v.subflowId,childConversationId:crypto.randomUUID(),input:{prompt:y},...x.flowDefinition?{flowSnapshot:x.flowDefinition,personaAttribution:f.personaAttribution}:{}}));if(!z)return{success:!1,error:"Unable to persist detached subflow task."};f.launchedTaskIds=[...new Set([...f.launchedTaskIds??[],z.taskId])],f.subflowOrchestratorNodeId=f.currentNodeId;let A=new AbortController,B={subflowId:v.subflowId,conversationId:z.childConversationId,input:{prompt:y},laneTitle:(0,i.oO)(y||"Detached subflow")},C={nodeId:j,nodeType:"subflow",subflowId:v.subflowId,nodeName:t?.data?.label,depth:(f.runDepth??0)+1,chainDepth:f.chainDepth,plannedExecutionId:f.plannedExecutionId,parentRunId:z.originConversationId,personaAttribution:f.personaAttribution,executionAuthority:(0,n.c4)(f.executionAuthority),parentFlowSnapshot:f.flowSnapshot,abortSignal:A.signal,persistConversation:!0,showSteps:!0,emit:c.emit,lanes:[B],concurrencyLimit:1,joinSeparator:"\n\n",errorStrategy:"collect-all"};try{e=x.flowDefinition?.name??(await h.flowService.getFlow(v.subflowId))?.name}catch{}let D=(0,l.bindToCurrentWorkspace)(w)(z,C,{nodeId:j,nodeName:t?.data?.label,nodeType:"subflow"},{prompt:y},A,m.maxJobRuntimeMs,{parentRunId:f.logicalRunId,invocationId:(0,k.Lf)(),subflow:{id:v.subflowId,...e?{name:e}:{}},node:{id:j,...t?.data?.label?{name:t.data.label}:{}},childRunId:z.childConversationId});return G.set(u(z.taskId),{controller:A,promise:D}),{success:!0,data:{...(0,g.Nz)(z),childConversationId:z.childConversationId,parentConversationId:z.originConversationId}}}catch(a){return(0,n.Vj)(a),D.warn("Failed to start detached subflow",a),{success:!1,error:a instanceof Error?a.message:String(a)}}}async function z(a,b,c){if(!b.conversationId)return!1;let d=(0,s.C)().get(b.conversationId);return!!d&&(await (0,n.kX)(d),!(d.isCancelled||d.executionAuthority?.signal.aborted)&&(!!c&&a.childConversationId===b.conversationId||a.originConversationId===b.conversationId&&(!a.originLogicalRunId||a.originLogicalRunId===d.logicalRunId)))}async function A(a,b={}){let c=await (0,g.gg)(a);return c&&await z(c,b,!0)?{success:!0,data:{task:(0,g.Nz)(c),childConversationId:c.childConversationId,parentConversationId:c.originConversationId,..."completed"===c.status?{result:c.outputText}:{},...c.error?{error:c.error}:{}}}:{success:!1,error:"Task not found."}}async function B(a){let b=await (0,g.AX)(a);return b?.status==="cancelled"&&G.get(u(a))?.controller.abort(),b}async function C(a,b={}){let c=await (0,g.gg)(a);if(!c||!await z(c,b,!1))return{success:!1,error:"Task not found."};let d=await B(a);return d?{success:!0,data:(0,g.Nz)(d)}:{success:!1,error:"Task not found."}}d()}catch(a){d(a)}})},368440:(a,b,c)=>{"use strict";c.d(b,{g0:()=>m,tT:()=>l});var d=c(977598),e=c(328461);let f=Symbol.for("flujo.subscriptionAllowance"),g=globalThis,h=g[f]??={identitySecret:(0,d.randomBytes)(32),observations:new Map,failures:new Map},{identitySecret:i,observations:j}=h,k=h.failures??=new Map;function l(a,b){return(0,d.createHmac)("sha256",i).update(JSON.stringify([(0,e.getWorkspaceDataDir)(),a,b])).digest("hex")}function m(a,b){if(0===b.windows.length)return;let c=j.get(a);if(!(c&&Date.parse(c.observedAt)>Date.parse(b.observedAt)))for(j.delete(a),j.set(a,structuredClone(b)),k.delete(a);j.size>512;)j.delete(j.keys().next().value)}},369484:(a,b,c)=>{"use strict";c.d(b,{bs:()=>e,qM:()=>d,wf:()=>f});let d=1,e=1,f="summary-v8-bounded-source"},373171:(a,b,c)=>{"use strict";c.d(b,{Ek:()=>m,Ly:()=>l,_k:()=>j,w_:()=>n,y8:()=>k});var d=c(482964),e=c(328461);let f=(0,d.h)("backend/services/mcp/taskInputRegistry"),g=globalThis,h=g.__flujoMcpTaskInputRegistry??(g.__flujoMcpTaskInputRegistry=new Map);function i(a,b){return(0,e.workspaceCacheKey)(a,b)}function j(a,b,c){let d=i(a,b),e=Date.now(),g=h.get(d)??{outstanding:new Set,answered:new Set,firstRequestedAt:e,lastRequestedAt:e};g.answered.has(c)||(g.outstanding.add(c),g.lastRequestedAt=e,h.set(d,g),f.info(`Task ${b} on ${a} requested input (elicitation ${c}); outstanding=${g.outstanding.size}`))}function k(a,b,c,d){let e=i(a,b),g=h.get(e);!g||!g.outstanding.delete(c)&&g.answered.has(c)||(g.answered.add(c),h.set(e,g),f.info(`Task ${b} on ${a} input ${c} resolved with action=${d}; outstanding=${g.outstanding.size}`))}function l(a,b){return h.get(i(a,b))}function m(a,b){return[...h.get(i(a,b))?.outstanding??[]]}function n(a,b){h.delete(i(a,b))}},373327:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{MCPService:()=>ae,mcpService:()=>af});var e=c(798558),f=c(856859),g=c(275424),h=c(10336),i=c(527137),j=c(79748),k=c.n(j),l=c(333873),m=c.n(l),n=c(446193),o=c(873755),p=c(482964),q=c(328461),r=c(560767),s=c(216085),t=c(200797),u=c(405087),v=c(560921),w=c(84022),x=c(315243),y=c(296951),z=c(687161),A=c(578615),B=c(510217),C=c(772260),D=c(480327),E=c(42701),F=c(663622),G=c(397124),H=c(833578),I=c(237967),J=c(77380),K=c(185814),L=c(826652),M=c(435247),N=c(826615),O=c(800479),P=c(471533),Q=c(543354),R=c(608878),S=c(857366),T=c(584861),U=c(28639),V=c(617758),W=c(868644),X=c(252797),Y=c(471375),Z=c(378591),$=a([F,T,V]);function _(a,b){let c=(0,q.getCurrentWorkspace)();if(c===q.DEFAULT_WORKSPACE)return b;let d=global.__mcp_workspace_registries??=new Map,e=d.get(c);e||(e=new Map,d.set(c,e));let f=e.get(a);return f||(f=b instanceof Set?new Set:new Map,e.set(a,f)),f}function aa(a){return{success:!1,error:a.error,statusCode:a.statusCode,errorType:a.errorType}}[F,T,V]=$.then?(await $)():$,void 0===global.__mcp_clients&&(global.__mcp_clients=new Map),void 0===global.__mcp_connecting&&(global.__mcp_connecting=new Set),void 0===global.__mcp_approval_failures&&(global.__mcp_approval_failures=new Map),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 ad=(0,p.h)("backend/services/mcp/index");function ab(a){let b=a,c=new Set;for(;b&&"object"==typeof b&&!c.has(b);){c.add(b);let a=b.__flujoInnerTransport;if(!a)break;b=a}return b}function ac(a){if("streamable"!==a.transport&&"sse"!==a.transport)return!1;let b=a.headers;return!!b&&Object.entries(b).some(([a,b])=>"authorization"===a.toLowerCase()&&(0,P.at)(b,a).value.trim().length>0)}class ae{get stderrLogs(){return _("stderrLogs",this.stderrLogsBase)}get approvalFailures(){return _("approvalFailures",global.__mcp_approval_failures)}get lastConnectionError(){return _("lastConnectionError",this.lastConnectionErrorBase)}get inFlightConnects(){return _("inFlightConnects",this.inFlightConnectsBase)}get connectionRetryTimers(){return _("connectionRetryTimers",this.connectionRetryTimersBase)}get connectionRetryAttempts(){return _("connectionRetryAttempts",this.connectionRetryAttemptsBase)}get resourceListVersion(){return _("resourceListVersion",this.resourceListVersionBase)}get pendingResourceUpdates(){return _("pendingResourceUpdates",this.pendingResourceUpdatesBase)}async clearLegacyInferredOAuthScopesForHeaderAuth(a){try{let b=await this.loadServerConfigs();if(!Array.isArray(b))return;let c=b.findIndex(b=>b.name===a);if(-1===c||"streamable"!==b[c].transport)return;let d=b[c];if(!ac(d)||d.oauthScopes?.length!==1||"read"!==d.oauthScopes[0]||d.oauthClientId||d.oauthClientSecret||d.oauthClientMetadata||d.oauthClientInformation||d.oauthTokens||d.oauthCodeVerifier||d.oauthState||d.authorizationUrl)return;b[c]={...d,oauthScopes:void 0},await (0,g.QO)();let e=await (0,A.saveConfig)(new Map(b.map(a=>[a.name,a])));e.success?ad.info(`Removed stale inferred OAuth scopes from header-authenticated server ${a}`):ad.warn(`Failed to remove stale inferred OAuth scopes from ${a}: ${e.error}`)}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.warn(`Failed to clean inferred OAuth scopes for ${a}: ${b instanceof Error?b.message:String(b)}`)}}get clients(){return _("clients",global.__mcp_clients)}get connectingServers(){return _("connectingServers",global.__mcp_connecting)}get activeTransports(){return _("activeTransports",global.__mcp_active_transports)}get clientGenerations(){return _("clientGenerations",global.__mcp_client_generation)}get toolSchemaHashes(){return _("toolSchemaHashes",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>ae.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-ae.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){let b=this.clients.get(a);b&&(0,e.B)(b),this.clients.delete(a),this.activeTransports.delete(a),(0,Y.hj)(a),(0,Z.HW)(a)}onResourceListChanged(a){let b=this.resourceListVersion.get(a)??0;this.resourceListVersion.set(a,b+1),ad.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),ad.debug(`onResourceUpdated: server=${a} uri=${b}`)}getResourceListVersion(a){return this.resourceListVersion.get(a)??0}async subscribeToResource(a,b){if(!(0,f.VU)())try{let c=this.getClient(a);if(!c||await (0,e.o)(c,b))return;let d=c.getServerCapabilities?.();if(!d?.resources?.subscribe)return;await c.subscribeResource({uri:b}),ad.debug(`subscribeToResource: server=${a} uri=${b}`)}catch(c){if(c instanceof g.Mr)throw c;ad.debug(`subscribeToResource: ignored error for ${a}/${b}:`,c)}}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),ad.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){ad.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);ad.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout((0,q.bindToCurrentWorkspace)(async()=>{ad.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){ad.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){ad.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}),ad.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){ad.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)ad.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(ad.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication||e.requiresApproval){ad.info(`Server ${a} needs user action, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){if(c instanceof g.Mr||c instanceof T.McpRuntimeAuthorityRetirementError)throw c;if((0,h.I)(c))return void this.connectionRetryAttempts.delete(a);ad.error(`Error during retry connection for server ${a}:`,c),this.scheduleConnectionRetry(a,b)}}),d);this.connectionRetryTimers.set(a,e)}isStartingUp(){let a=(0,q.getCurrentWorkspace)();return a===q.DEFAULT_WORKSPACE?!0===global.__mcp_starting_up:global.__mcp_starting_up_by_workspace?.get(a)===!0}setStartingUp(a){let b=(0,q.getCurrentWorkspace)();b===q.DEFAULT_WORKSPACE?global.__mcp_starting_up=a:(global.__mcp_starting_up_by_workspace??=new Map).set(b,a),ad.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,L.wk)(b)){ad.warn(`getClient: client for ${a} has a closed/aborted connection — evicting it`),this.clients.delete(a);return}return ad.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){ad.debug("loadServerConfigs: Entering method");try{let a=await (0,A.loadServerConfigs)();if(!Array.isArray(a))return ad.warn("loadServerConfigs: Received non-array response",a),a;return ad.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return ad.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){let b=(0,t.executionProtectedServerConfig)(a);if(b)return b;ad.debug(`getServerConfig: Looking up config for server ${a}`);let c=await this.loadServerConfigs();if(!Array.isArray(c))return ad.warn(`getServerConfig: Failed to load configs for ${a}:`,c.error),null;let d=c.find(b=>b.name===a);return d||(ad.warn(`getServerConfig: Server ${a} not found in configs`),null)}async isServerDisabled(a){let b=await this.getServerConfig(a);return b?.disabled===!0}async connectServer(a,b){if("string"!=typeof a&&!(0,y.Mt)(a.transport))return{success:!1,error:y.ZW,statusCode:400};let c="string"==typeof a?a:a.name;try{if(b){if(await (0,t.assertExecutionExtensionCurrent)(b),c!==(0,t.executionExtensionProtectedServer)(b))throw new t.ExecutionExtensionError("execution_mcp_server_forbidden")}else if((0,t.isProtectedExecutionServer)(c))throw new t.ExecutionExtensionError("trusted_execution_context_required")}catch(a){return{success:!1,error:a instanceof t.ExecutionExtensionError?a.code:"execution_authorization_unavailable",statusCode:a instanceof t.ExecutionExtensionError?a.status:503,errorType:"execution-authorization"}}await (0,g.QO)();try{(0,T.assertMcpRuntimeAuthorityRetired)(c)}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};throw a}return(0,D.Oc)(c,async()=>{await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c);let d=this.getClient(c),e=this.connectServerInternal(a,b).finally(()=>{this.inFlightConnects.delete(c)});this.inFlightConnects.set(c,e);let f=await e;if(f.success){let b=void 0!==d&&this.getClient(c)===d;(0,D.pX)(c,this.configFingerprint(a),b)}else{let a=this.activeTransports.has(c)&&!this.clients.has(c);(0,D.Vr)(c,f.error??"unknown connection failure",a)}return f})}configFingerprint(a){if("string"!=typeof a)return[a.transport,a.command??"",(a.args??[]).join(" "),a.url??"",a.websocketUrl??"",a.rootPath??"",a.disabled?"disabled":"enabled"].join("\0")}async assertProtectedConnectionIntent(a,b){if(await (0,t.assertExecutionExtensionCurrent)(a),b.name!==(0,t.executionExtensionProtectedServer)(a))throw new t.ExecutionExtensionError("execution_mcp_server_forbidden");let c=await this.getServerConfig(b.name);if(!c)throw new t.ExecutionExtensionError("execution_mcp_server_config_missing");(0,t.assertExecutionServerConfig)(c);let d=await (0,T.resolveConfigHeaders)(c);if((0,t.assertExecutionServerConfig)(d),await (0,t.assertExecutionExtensionCurrent)(a),(0,T.protectedConfigFingerprint)(d)!==(0,T.protectedConfigFingerprint)(b))throw new t.ExecutionExtensionError("execution_mcp_server_config_changed")}async connectServerInternal(a,b){let c,d,e,f;if("string"==typeof a){ad.info(`connectServer: Looking up config for server ${a}`);let b=await this.getServerConfig(a);if(!b)return ad.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.`};c=b}else c=a;let j="string"==typeof a?c:await this.getServerConfig(c.name),k=j??c;if(!(0,y.Mt)(c.transport)||!(0,y.Mt)(k.transport))return{success:!1,error:y.ZW,statusCode:400};if((j??c).disabled)return ad.info(`connectServer: Server ${c.name} is disabled — refusing to create a client/transport`),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),{success:!1,error:`Server '${c.name}' is disabled. Enable it on the MCP page to use it.`};let l=(0,i.A)();ad.info(`connectServer: Starting connection for server ${c.name} [RequestID: ${l}]`),this.connectingServers.add(c.name);try{this.stderrLogs.set(c.name,[]),b&&await (0,t.assertExecutionExtensionCurrent)(b),c=await (0,T.resolveConfigHeaders)(c),await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c.name);let a=(0,t.isProtectedExecutionServer)(c.name);a&&(0,t.assertExecutionServerConfig)(c),b&&await this.assertProtectedConnectionIntent(b,c);let h=!a&&await (0,V.q1)()&&"websocket"!==c.transport,i=await (0,K.SZ)(c);b&&await this.assertProtectedConnectionIntent(b,c);let j={enableRuntimeBroker:!0,isolateRuntimeHome:i},k=this.clients.get(c.name);if(k){let{needsNewClient:d,reason:e}=(0,T.shouldRecreateClient)(k,c,h,j),f=a&&(0,T.clientProtectedConfigFingerprint)(k)!==(0,T.protectedConfigFingerprint)(c);if(!d&&!f)return b&&await this.assertProtectedConnectionIntent(b,c),await (0,u.HR)(k,c.name,c),ad.info(`connectServer: Server ${c.name} is already connected`),this.lastConnectionError.delete(c.name),this.approvalFailures.delete(c.name),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),await this.clearLegacyInferredOAuthScopesForHeaderAuth(c.name),{success:!0};ad.info(`connectServer: Existing client for ${c.name} is stale (${f?"protected config identity changed":e}), recreating`),this.deregisterClient(c.name);try{let a=await (0,T.safelyCloseClient)(k,c.name,c);if(a.isolation?.cleanupOutcome==="unknown")throw new v.Bk("ISOLATION_UNAVAILABLE")}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError||a instanceof g.Mr||a instanceof v.Bk)throw a;ad.debug(`connectServer: error closing stale client for ${c.name}: ${a instanceof Error?a.message:String(a)}`)}k=void 0}b&&await this.assertProtectedConnectionIntent(b,c),await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c.name),k=h?(0,V.e)(c,(0,q.bindToCurrentWorkspace)(()=>{this.getClient(c.name)===k&&this.onResourceListChanged(c.name)})):(0,T.createNewClient)(c),b&&(f=k);let l=h?(0,V.gf)(c,j):(0,T.createTransport)(c,j);if(d=k,e=l,"stdio"===c.transport&&(0,Y.hH)(k,c.name,h?(0,V.UQ)(l):void 0),h){let a=k.setNotificationHandler?.bind(k);a&&(a("notifications/resources/list_changed",(0,q.bindToCurrentWorkspace)(()=>{this.getClient(c.name)===k&&this.onResourceListChanged(c.name)})),a("notifications/resources/updated",(0,q.bindToCurrentWorkspace)(a=>{let b=a?.params?.uri;b&&this.getClient(c.name)===k&&this.onResourceUpdated(c.name,b)})))}else(0,U.U)(k,c.name,(0,q.bindToCurrentWorkspace)(a=>this.onResourceListChanged(a)),(0,q.bindToCurrentWorkspace)((a,b)=>this.onResourceUpdated(a,b)));let m=ab(l).stderr;if(m&&"function"==typeof m.on){let a=c.name;m.on("data",(0,q.bindToCurrentWorkspace)(b=>{let c=b.toString();ad.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)}))}if(l.onclose=(0,q.bindToCurrentWorkspace)(()=>{this.activeTransports.get(c.name)!==l?ad.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${c.name}`):(ad.warn(`connectServer: Connection closed for server ${c.name}`),this.deregisterClient(c.name),this.getServerConfig(c.name).then(a=>{!a||a.disabled?ad.info(`Server ${c.name} is now disabled, skipping reconnection logic`):(ad.info(`Connection closed for enabled server ${c.name}, scheduling reconnection`),this.scheduleConnectionRetry(c.name,a))}).catch(a=>{ad.warn(`Error checking server config for ${c.name} during onclose:`,a)}))}),l.onerror=(0,q.bindToCurrentWorkspace)(a=>{if((0,L.lO)(a))return void ad.debug(`connectServer: transient SSE stream disconnect for ${c.name} (self-healing, ignored): ${a instanceof Error?a.message:String(a)}`);if(this.activeTransports.get(c.name)!==l)return void ad.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${c.name}`);if(ad.error(`connectServer: Transport error for server ${c.name}:`),a instanceof Error){ad.error(`Error name: ${a.name}`),ad.error(`Error message: ${a.message}`),ad.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&ad.error(`Error code: ${b}`),ad.error(`Error chain: ${(0,L.jf)(a)}`)}else if(a&&"object"==typeof a){let b=Object.getPrototypeOf(a),c="string"==typeof b?.constructor?.name?b.constructor.name:"Unknown";ad.error(`Error type: ${typeof a}`),ad.error(`Error constructor: ${c}`);let d=Object.getOwnPropertyNames(a);d.length>0?(ad.error(`Error properties: ${d.join(", ")}`),d.forEach(b=>{try{let c=a[b];ad.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){ad.error(` ${b}: [Unable to serialize: ${a}]`)}})):ad.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);ad.error(`JSON stringified error: ${b}`)}catch(a){ad.error(`Cannot JSON stringify error: ${a}`)}}else ad.error(`Error value: ${String(a)} (type: ${typeof a})`);this.appendStderrLog(c.name,`Transport error: ${(0,L.jf)(a)}`),this.deregisterClient(c.name),this.getServerConfig(c.name).then(a=>{!a||a.disabled?ad.info(`Server ${c.name} is now disabled, skipping reconnection after transport error`):(ad.info(`Transport error for enabled server ${c.name}, scheduling reconnection`),this.scheduleConnectionRetry(c.name,a))}).catch(a=>{ad.warn(`Error checking server config for ${c.name} during onerror:`,a)})}),await (0,g.QO)(),b&&await this.assertProtectedConnectionIntent(b,c),await k.connect(l),b&&await this.assertProtectedConnectionIntent(b,c),"stdio"===c.transport&&h&&(0,V.po)(l),this.clients.set(c.name,k),this.activeTransports.set(c.name,l),this.clientGenerations.set(c.name,this.getClientGeneration(c.name)+1),b&&await this.assertProtectedConnectionIntent(b,c),(0,Y.AO)(k))try{await (0,Y.DK)(k,c.name,{force:!0})}catch(a){if(a instanceof g.Mr)throw a;ad.warn(`mcp-stdio-oauth readiness probe failed for ${c.name}:`,a)}b&&await this.assertProtectedConnectionIntent(b,c),this.lastConnectionError.delete(c.name),this.approvalFailures.delete(c.name),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),await this.clearLegacyInferredOAuthScopesForHeaderAuth(c.name),b&&await this.assertProtectedConnectionIntent(b,c);let n=(0,V.nK)(k);return ad.info(`connectServer: Successfully connected to ${c.name}`+(n?` (beta SDK, negotiated MCP protocol ${n})`:"")),{success:!0}}catch(q){let a;if(q instanceof g.Mr){let a=[];if(d&&e){this.deregisterClient(c.name);try{d.transport===e?await (0,T.safelyCloseClient)(d,c.name,c):await e.close()}catch(b){a.push(b)}let b=e.__flujoRetireRuntimeAuthority;try{b?.()}catch(b){a.push(b)}}if(a.length)throw new g.Mr(AggregateError([q,...a],"MCP denied startup cleanup failed"));throw q}if(q instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};if(b&&f){this.clients.get(c.name)===f&&this.deregisterClient(c.name);try{await (0,T.safelyCloseClient)(f,c.name,c)}catch{}}if(q instanceof t.ExecutionExtensionError)return{success:!1,error:q.code,statusCode:q.status,errorType:"execution-authorization"};if((0,t.isProtectedExecutionServer)(c.name))return{success:!1,error:"execution_mcp_connect_failed",statusCode:503,errorType:"execution-authorization"};"stdio"===c.transport&&(0,Z.HW)(c.name);let i=(0,h.I)(q);if(i){this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name);let a=this.approvalFailures.get(c.name);return a?.errorCode!==i.errorCode&&ad.warn(`MCP server ${c.name}: ${i.error}`),this.approvalFailures.set(c.name,i),this.lastConnectionError.set(c.name,i.error),i}this.approvalFailures.delete(c.name),ad.error(`connectServer: Failed to connect to server ${c.name}:`,q);let j=q instanceof Error?q.message:String(q),l=(0,L.uP)(q),m=(0,L.Ah)(q),n=ac(k);if(m&&!n&&("streamable"===c.transport||"sse"===c.transport)){let b=c.serverUrl;b&&(a=(await (0,S.n)(b)).oauthCapable)}if(l||a){if(ad.info(`OAuth authentication error detected for server ${c.name}: ${j}`),"streamable"===c.transport&&a){let a=c;if(!a.oauthScopes||0===a.oauthScopes.length){ad.info(`Dynamically enabling OAuth for server ${c.name} after capability confirmation`);try{let b={...a,oauthScopes:["read"]},d=await this.loadServerConfigs();if(Array.isArray(d)){let a=d.findIndex(a=>a.name===c.name);-1!==a&&(d[a]=b,await (0,A.saveConfig)(new Map(d.map(a=>[a.name,a]))),ad.info(`Updated config for ${c.name} to enable OAuth`))}}catch(a){if(a instanceof g.Mr)throw a;ad.warn(`Failed to update config for ${c.name} to enable OAuth:`,a)}}}return{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate.",requiresAuthentication:!0,oauthCapable:!0}}if(m)return{success:!1,error:j,requiresAuthentication:!0,oauthCapable:a};let o=this.stderrLogs.get(c.name)||[],p=(0,L.ox)(q,c,o);return this.lastConnectionError.set(c.name,p),{success:!1,error:p}}finally{this.connectingServers.delete(c.name)}}async testConnection(a,b,c){if(!(0,y.Mt)(a.transport))return{success:!1,error:y.ZW,statusCode:400};ad.info(`testConnection: Testing connection to ${a.name||"(unnamed)"} via ${a.transport} transport`);let d=a=>{try{b?.(a)}catch{}},e=[],f=(0,o.O)((0,o.P)(a,a)),i=f.stream(),j=new n.StringDecoder("utf8"),k=!1,l=a=>{a&&(e.push(a),d({type:"stderr",data:a}))},m=()=>{k||(k=!0,l(i.write(j.end())),l(i.end()))},p=null,q=null;try{let b,e=a,h=c?.storedName||a.name;if(("streamable"===a.transport||"sse"===a.transport)&&h){let b=await this.loadServerConfigs(),c=Array.isArray(b)?b.find(a=>a.name===h):void 0,f=c?.headers,g=a.headers;if((0,Q.t_)(g,f)&&!(0,Q.sd)(a,c))return d({type:"result",success:!1,error:Q.$X}),{success:!1,error:Q.$X,statusCode:400};e={...a,headers:(0,P.x0)(g,f)}}let n=await (0,T.resolveConfigHeaders)(e);await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(n.name),i=(f=(0,o.O)((0,o.P)(e,n))).stream();let r=!(0,t.isProtectedExecutionServer)(n.name)&&await (0,V.q1)()&&"websocket"!==n.transport,s={isolateRuntimeHome:await (0,K.SZ)(n)};p=r?(0,V.e)(n):(0,T.createNewClient)(n),q=r?(0,V.gf)(n,s):(0,T.createTransport)(n,s),"stdio"===n.transport&&(0,Y.hH)(p,n.name,r?(0,V.UQ)(q):void 0);let u=ab(q).stderr;u&&"function"==typeof u.on&&u.on("data",a=>{k||l(i.write(j.write(a)))}),q.onerror=a=>{k||l(f.redact(`Transport error: ${(0,L.jf)(a)}
65
+ DETACHED SUBFLOW: starts "${b.label}" in the background and returns a durable task handle immediately. Keep working while it runs. Use subflow_send_message for steering/replies and subflow_wait to wait for updates. subflow_task_get reads its result; subflow_task_cancel stops it.`,inputSchema:{type:"object",properties:{task:{type:"string",description:d?"Required task for the detached subflow.":"Optional task; defaults to the subflow configuration."}},required:d?["task"]:[]}}}async function w(a,b,d,e,h,i,l){let m=(0,k.PL)(),n=!1,o=(a,b)=>{if(l?.parentRunId&&!n){n=!0;try{let c=m.elapsedMs();(0,j.z9)((0,j.k)({type:"subflow.invocation",runId:l.parentRunId,node:l.node,subflow:l.subflow,mode:"detached",invocationId:l.invocationId,childRunId:l.childRunId,outcome:a,durationMs:c,waitMs:0,phases:{subflowExecution:c},errorClass:"error"===a?(0,j.Ys)(b):void 0}))}catch{}}},r=Number.isFinite(i)&&i>0?setTimeout(()=>h.abort(H),i):void 0;r?.unref?.();let t=async b=>{let c=await (0,g.mQ)(a.taskId,b,{ifStatus:"working"});if(c&&["completed","failed","cancelled"].includes(c.status))try{await (0,q.ac)(c)}catch(b){D.warn("Could not notify the parent of a completed subflow task",{taskId:a.taskId,error:b})}},v=async()=>h.signal.aborted||!!b.executionAuthority?.signal.aborted||(0,p._K)(a.originConversationId,(0,s.C)()),w=async()=>{let a=h.signal.reason===H;o(a?"error":"cancelled",a?Error("Detached subflow timed out."):void 0),await t(a?{status:"failed",failureReason:"timeout",error:"Detached subflow exceeded its maximum runtime."}:{status:"cancelled",failureReason:"cancelled",cancelRequestedAt:Date.now()})};try{let{runFlow:h}=await Promise.all([c.e(71084),c.e(79137)]).then(c.bind(c,271084)),{runSubflowLanes:i}=await Promise.resolve().then(c.bind(c,538739)),j=await i(b,h,d,e);try{let b=await (0,g.gg)(a.taskId);if(await v()||b?.status==="cancelled")return void await w();o(j.success?"completed":"error",j.error),await t(j.success?{status:"completed",outputText:j.outputText}:{status:"failed",error:j.error??"Detached subflow failed.",failureReason:"child-error"})}finally{(0,f.Tf)(j)}}catch(a){await v()?await w():(o("error",a),await t({status:"failed",error:a instanceof Error?a.message:String(a),failureReason:"child-error"}))}finally{r&&clearTimeout(r),o("incomplete"),G.delete(u(a.taskId))}}async function x(a,b,c){return(0,m.l_)((0,l.workspaceCacheKey)("subflow-task-admission"),()=>y(a,b,c))}async function y(a,b,c){let d=c.conversationId;if(!d)return{success:!1,error:"No active conversation to start a detached subflow."};try{let e,f=(0,s.C)().get(d);if(f&&(f.executionExtensionContext||(0,r.isExecutionProtectedState)(f)))return{success:!1,error:"execution_subflow_child_authority_required"};let j=f?.subflowDetachedToolNameMap?.[a];if(!f||!j)return{success:!1,error:`Unknown detached subflow tool "${a}".`};if(await (0,n.kX)(f),f.isCancelled||f.executionAuthority?.signal.aborted)return{success:!1,error:"The launching conversation was cancelled."};let[m,p]=await Promise.all([(0,g.zS)(),(0,g.Vk)({status:"working",limit:500})]);if(p.length>=m.maxConcurrentDetachedJobs)return{success:!1,error:`Detached job limit reached (${m.maxConcurrentDetachedJobs}).`};let q=f.flowSnapshot??await h.flowService.getFlow(f.flowId),t=q?.nodes.find(a=>a.id===j),v=t?.data?.properties;if(!v?.subflowId)return{success:!1,error:"Target subflow node has no configured subflowId."};let x=(0,o.i)({personaAttribution:f.personaAttribution,parentFlowSnapshot:f.flowSnapshot,nodeId:j},v.subflowId),y=("string"==typeof b.task?b.task.trim():"")||v.promptTemplate||"",z=await (0,n.Gi)(f,()=>(0,g.UT)({status:"working",pollInterval:v.detachedPollIntervalMs,originConversationId:f.conversationId??d,originNodeId:j,originLogicalRunId:f.logicalRunId,flowId:v.subflowId,childConversationId:crypto.randomUUID(),input:{prompt:y},...x.flowDefinition?{flowSnapshot:x.flowDefinition,personaAttribution:f.personaAttribution}:{}}));if(!z)return{success:!1,error:"Unable to persist detached subflow task."};f.launchedTaskIds=[...new Set([...f.launchedTaskIds??[],z.taskId])],f.subflowOrchestratorNodeId=f.currentNodeId;let A=new AbortController,B={subflowId:v.subflowId,conversationId:z.childConversationId,input:{prompt:y},laneTitle:(0,i.oO)(y||"Detached subflow")},C={nodeId:j,nodeType:"subflow",subflowId:v.subflowId,nodeName:t?.data?.label,depth:(f.runDepth??0)+1,chainDepth:f.chainDepth,plannedExecutionId:f.plannedExecutionId,parentRunId:z.originConversationId,personaAttribution:f.personaAttribution,executionAuthority:(0,n.c4)(f.executionAuthority),parentFlowSnapshot:f.flowSnapshot,abortSignal:A.signal,persistConversation:!0,showSteps:!0,emit:c.emit,lanes:[B],concurrencyLimit:1,joinSeparator:"\n\n",errorStrategy:"collect-all"};try{e=x.flowDefinition?.name??(await h.flowService.getFlow(v.subflowId))?.name}catch{}let D=(0,l.bindToCurrentWorkspace)(w)(z,C,{nodeId:j,nodeName:t?.data?.label,nodeType:"subflow"},{prompt:y},A,m.maxJobRuntimeMs,{parentRunId:f.logicalRunId,invocationId:(0,k.Lf)(),subflow:{id:v.subflowId,...e?{name:e}:{}},node:{id:j,...t?.data?.label?{name:t.data.label}:{}},childRunId:z.childConversationId});return G.set(u(z.taskId),{controller:A,promise:D}),{success:!0,data:{...(0,g.Nz)(z),childConversationId:z.childConversationId,parentConversationId:z.originConversationId}}}catch(a){return(0,n.Vj)(a),D.warn("Failed to start detached subflow",a),{success:!1,error:a instanceof Error?a.message:String(a)}}}async function z(a,b,c){if(!b.conversationId)return!1;let d=(0,s.C)().get(b.conversationId);return!!d&&(await (0,n.kX)(d),!(d.isCancelled||d.executionAuthority?.signal.aborted)&&(!!c&&a.childConversationId===b.conversationId||a.originConversationId===b.conversationId&&(!a.originLogicalRunId||a.originLogicalRunId===d.logicalRunId)))}async function A(a,b={}){let c=await (0,g.gg)(a);return c&&await z(c,b,!0)?{success:!0,data:{task:(0,g.Nz)(c),childConversationId:c.childConversationId,parentConversationId:c.originConversationId,..."completed"===c.status?{result:c.outputText}:{},...c.error?{error:c.error}:{}}}:{success:!1,error:"Task not found."}}async function B(a){let b=await (0,g.AX)(a);return b?.status==="cancelled"&&G.get(u(a))?.controller.abort(),b}async function C(a,b={}){let c=await (0,g.gg)(a);if(!c||!await z(c,b,!1))return{success:!1,error:"Task not found."};let d=await B(a);return d?{success:!0,data:(0,g.Nz)(d)}:{success:!1,error:"Task not found."}}d()}catch(a){d(a)}})},368440:(a,b,c)=>{"use strict";c.d(b,{g0:()=>m,tT:()=>l});var d=c(977598),e=c(328461);let f=Symbol.for("flujo.subscriptionAllowance"),g=globalThis,h=g[f]??={identitySecret:(0,d.randomBytes)(32),observations:new Map,failures:new Map},{identitySecret:i,observations:j}=h,k=h.failures??=new Map;function l(a,b){return(0,d.createHmac)("sha256",i).update(JSON.stringify([(0,e.getWorkspaceDataDir)(),a,b])).digest("hex")}function m(a,b){if(0===b.windows.length)return;let c=j.get(a);if(!(c&&Date.parse(c.observedAt)>Date.parse(b.observedAt)))for(j.delete(a),j.set(a,structuredClone(b)),k.delete(a);j.size>512;)j.delete(j.keys().next().value)}},369484:(a,b,c)=>{"use strict";c.d(b,{bs:()=>e,qM:()=>d,wf:()=>f});let d=1,e=1,f="summary-v8-bounded-source"},373171:(a,b,c)=>{"use strict";c.d(b,{Ek:()=>m,Ly:()=>l,_k:()=>j,w_:()=>n,y8:()=>k});var d=c(482964),e=c(328461);let f=(0,d.h)("backend/services/mcp/taskInputRegistry"),g=globalThis,h=g.__flujoMcpTaskInputRegistry??(g.__flujoMcpTaskInputRegistry=new Map);function i(a,b){return(0,e.workspaceCacheKey)(a,b)}function j(a,b,c){let d=i(a,b),e=Date.now(),g=h.get(d)??{outstanding:new Set,answered:new Set,firstRequestedAt:e,lastRequestedAt:e};g.answered.has(c)||(g.outstanding.add(c),g.lastRequestedAt=e,h.set(d,g),f.info(`Task ${b} on ${a} requested input (elicitation ${c}); outstanding=${g.outstanding.size}`))}function k(a,b,c,d){let e=i(a,b),g=h.get(e);!g||!g.outstanding.delete(c)&&g.answered.has(c)||(g.answered.add(c),h.set(e,g),f.info(`Task ${b} on ${a} input ${c} resolved with action=${d}; outstanding=${g.outstanding.size}`))}function l(a,b){return h.get(i(a,b))}function m(a,b){return[...h.get(i(a,b))?.outstanding??[]]}function n(a,b){h.delete(i(a,b))}},373327:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{MCPService:()=>ae,mcpService:()=>af});var e=c(798558),f=c(856859),g=c(275424),h=c(10336),i=c(527137),j=c(79748),k=c.n(j),l=c(333873),m=c.n(l),n=c(446193),o=c(873755),p=c(482964),q=c(328461),r=c(560767),s=c(216085),t=c(200797),u=c(405087),v=c(560921),w=c(84022),x=c(315243),y=c(296951),z=c(687161),A=c(578615),B=c(510217),C=c(772260),D=c(480327),E=c(42701),F=c(663622),G=c(397124),H=c(833578),I=c(237967),J=c(77380),K=c(185814),L=c(826652),M=c(435247),N=c(826615),O=c(800479),P=c(471533),Q=c(543354),R=c(608878),S=c(857366),T=c(584861),U=c(28639),V=c(617758),W=c(868644),X=c(252797),Y=c(471375),Z=c(378591),$=a([F,T,V]);function _(a,b){let c=(0,q.getCurrentWorkspace)();if(c===q.DEFAULT_WORKSPACE)return b;let d=global.__mcp_workspace_registries??=new Map,e=d.get(c);e||(e=new Map,d.set(c,e));let f=e.get(a);return f||(f=b instanceof Set?new Set:new Map,e.set(a,f)),f}function aa(a){return{success:!1,error:a.error,statusCode:a.statusCode,errorType:a.errorType}}[F,T,V]=$.then?(await $)():$,void 0===global.__mcp_clients&&(global.__mcp_clients=new Map),void 0===global.__mcp_connecting&&(global.__mcp_connecting=new Set),void 0===global.__mcp_approval_failures&&(global.__mcp_approval_failures=new Map),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 ad=(0,p.h)("backend/services/mcp/index");function ab(a){let b=a,c=new Set;for(;b&&"object"==typeof b&&!c.has(b);){c.add(b);let a=b.__flujoInnerTransport;if(!a)break;b=a}return b}function ac(a){if("streamable"!==a.transport&&"sse"!==a.transport)return!1;let b=a.headers;return!!b&&Object.entries(b).some(([a,b])=>"authorization"===a.toLowerCase()&&(0,P.at)(b,a).value.trim().length>0)}class ae{get stderrLogs(){return _("stderrLogs",this.stderrLogsBase)}get approvalFailures(){return _("approvalFailures",global.__mcp_approval_failures)}get lastConnectionError(){return _("lastConnectionError",this.lastConnectionErrorBase)}get inFlightConnects(){return _("inFlightConnects",this.inFlightConnectsBase)}get connectionRetryTimers(){return _("connectionRetryTimers",this.connectionRetryTimersBase)}get connectionRetryAttempts(){return _("connectionRetryAttempts",this.connectionRetryAttemptsBase)}get resourceListVersion(){return _("resourceListVersion",this.resourceListVersionBase)}get pendingResourceUpdates(){return _("pendingResourceUpdates",this.pendingResourceUpdatesBase)}async clearLegacyInferredOAuthScopesForHeaderAuth(a){try{let b=await this.loadServerConfigs();if(!Array.isArray(b))return;let c=b.findIndex(b=>b.name===a);if(-1===c||"streamable"!==b[c].transport)return;let d=b[c];if(!ac(d)||d.oauthScopes?.length!==1||"read"!==d.oauthScopes[0]||d.oauthClientId||d.oauthClientSecret||d.oauthClientMetadata||d.oauthClientInformation||d.oauthTokens||d.oauthCodeVerifier||d.oauthState||d.authorizationUrl)return;b[c]={...d,oauthScopes:void 0},await (0,g.QO)();let e=await (0,A.saveConfig)(new Map(b.map(a=>[a.name,a])));e.success?ad.info(`Removed stale inferred OAuth scopes from header-authenticated server ${a}`):ad.warn(`Failed to remove stale inferred OAuth scopes from ${a}: ${e.error}`)}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.warn(`Failed to clean inferred OAuth scopes for ${a}: ${b instanceof Error?b.message:String(b)}`)}}get clients(){return _("clients",global.__mcp_clients)}get connectingServers(){return _("connectingServers",global.__mcp_connecting)}get activeTransports(){return _("activeTransports",global.__mcp_active_transports)}get clientGenerations(){return _("clientGenerations",global.__mcp_client_generation)}get toolSchemaHashes(){return _("toolSchemaHashes",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>ae.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-ae.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){let b=this.clients.get(a);b&&(0,e.B)(b),this.clients.delete(a),this.activeTransports.delete(a),(0,Y.hj)(a),(0,Z.HW)(a)}onResourceListChanged(a){let b=this.resourceListVersion.get(a)??0;this.resourceListVersion.set(a,b+1),ad.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),ad.debug(`onResourceUpdated: server=${a} uri=${b}`)}getResourceListVersion(a){return this.resourceListVersion.get(a)??0}async subscribeToResource(a,b){if(!(0,f.VU)())try{let c=this.getClient(a);if(!c||await (0,e.o)(c,b))return;let d=c.getServerCapabilities?.();if(!d?.resources?.subscribe)return;await c.subscribeResource({uri:b}),ad.debug(`subscribeToResource: server=${a} uri=${b}`)}catch(c){if(c instanceof g.Mr)throw c;ad.debug(`subscribeToResource: ignored error for ${a}/${b}:`,c)}}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),ad.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){ad.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);ad.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout((0,q.bindToCurrentWorkspace)(async()=>{ad.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){ad.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){ad.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}),ad.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){ad.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)ad.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(ad.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication||e.requiresApproval){ad.info(`Server ${a} needs user action, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){if(c instanceof g.Mr||c instanceof T.McpRuntimeAuthorityRetirementError)throw c;if((0,h.I)(c))return void this.connectionRetryAttempts.delete(a);ad.error(`Error during retry connection for server ${a}:`,c),this.scheduleConnectionRetry(a,b)}}),d);this.connectionRetryTimers.set(a,e)}isStartingUp(){let a=(0,q.getCurrentWorkspace)();return a===q.DEFAULT_WORKSPACE?!0===global.__mcp_starting_up:global.__mcp_starting_up_by_workspace?.get(a)===!0}setStartingUp(a){let b=(0,q.getCurrentWorkspace)();b===q.DEFAULT_WORKSPACE?global.__mcp_starting_up=a:(global.__mcp_starting_up_by_workspace??=new Map).set(b,a),ad.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,L.wk)(b)){ad.warn(`getClient: client for ${a} has a closed/aborted connection — evicting it`),this.clients.delete(a);return}return ad.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){ad.debug("loadServerConfigs: Entering method");try{let a=await (0,A.loadServerConfigs)();if(!Array.isArray(a))return ad.warn("loadServerConfigs: Received non-array response",a),a;return ad.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return ad.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){let b=(0,t.executionProtectedServerConfig)(a);if(b)return b;ad.debug(`getServerConfig: Looking up config for server ${a}`);let c=await this.loadServerConfigs();if(!Array.isArray(c))return ad.warn(`getServerConfig: Failed to load configs for ${a}:`,c.error),null;let d=c.find(b=>b.name===a);return d||(ad.warn(`getServerConfig: Server ${a} not found in configs`),null)}async isServerDisabled(a){let b=await this.getServerConfig(a);return b?.disabled===!0}async connectServer(a,b){if("string"!=typeof a&&!(0,y.Mt)(a.transport))return{success:!1,error:y.ZW,statusCode:400};let c="string"==typeof a?a:a.name;try{if(b){if(await (0,t.assertExecutionExtensionCurrent)(b),c!==(0,t.executionExtensionProtectedServer)(b))throw new t.ExecutionExtensionError("execution_mcp_server_forbidden")}else if((0,t.isProtectedExecutionServer)(c))throw new t.ExecutionExtensionError("trusted_execution_context_required")}catch(a){return{success:!1,error:a instanceof t.ExecutionExtensionError?a.code:"execution_authorization_unavailable",statusCode:a instanceof t.ExecutionExtensionError?a.status:503,errorType:"execution-authorization"}}await (0,g.QO)();try{(0,T.assertMcpRuntimeAuthorityRetired)(c)}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};throw a}return(0,D.Oc)(c,async()=>{await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c);let d=this.getClient(c),e=this.connectServerInternal(a,b).finally(()=>{this.inFlightConnects.delete(c)});this.inFlightConnects.set(c,e);let f=await e;if(f.success){let b=void 0!==d&&this.getClient(c)===d;(0,D.pX)(c,this.configFingerprint(a),b)}else{let a=this.activeTransports.has(c)&&!this.clients.has(c);(0,D.Vr)(c,f.error??"unknown connection failure",a)}return f})}configFingerprint(a){if("string"!=typeof a)return[a.transport,a.command??"",(a.args??[]).join(" "),a.url??"",a.websocketUrl??"",a.rootPath??"",a.disabled?"disabled":"enabled"].join("\0")}async assertProtectedConnectionIntent(a,b){if(await (0,t.assertExecutionExtensionCurrent)(a),b.name!==(0,t.executionExtensionProtectedServer)(a))throw new t.ExecutionExtensionError("execution_mcp_server_forbidden");let c=await this.getServerConfig(b.name);if(!c)throw new t.ExecutionExtensionError("execution_mcp_server_config_missing");(0,t.assertExecutionServerConfig)(c);let d=await (0,T.resolveConfigHeaders)(c);if((0,t.assertExecutionServerConfig)(d),await (0,t.assertExecutionExtensionCurrent)(a),(0,T.protectedConfigFingerprint)(d)!==(0,T.protectedConfigFingerprint)(b))throw new t.ExecutionExtensionError("execution_mcp_server_config_changed")}async connectServerInternal(a,b){let c,d,e,f;if("string"==typeof a){ad.info(`connectServer: Looking up config for server ${a}`);let b=await this.getServerConfig(a);if(!b)return ad.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.`};c=b}else c=a;let j="string"==typeof a?c:await this.getServerConfig(c.name),k=j??c;if(!(0,y.Mt)(c.transport)||!(0,y.Mt)(k.transport))return{success:!1,error:y.ZW,statusCode:400};if((j??c).disabled)return ad.info(`connectServer: Server ${c.name} is disabled — refusing to create a client/transport`),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),{success:!1,error:`Server '${c.name}' is disabled. Enable it on the MCP page to use it.`};let l=(0,i.A)();ad.info(`connectServer: Starting connection for server ${c.name} [RequestID: ${l}]`),this.connectingServers.add(c.name);try{this.stderrLogs.set(c.name,[]),b&&await (0,t.assertExecutionExtensionCurrent)(b),c=await (0,T.resolveConfigHeaders)(c),await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c.name);let a=(0,t.isProtectedExecutionServer)(c.name);a&&(0,t.assertExecutionServerConfig)(c),b&&await this.assertProtectedConnectionIntent(b,c);let h=!a&&await (0,V.q1)()&&"websocket"!==c.transport,i=await (0,K.SZ)(c);b&&await this.assertProtectedConnectionIntent(b,c);let j={enableRuntimeBroker:!0,isolateRuntimeHome:i},k=this.clients.get(c.name);if(k){let{needsNewClient:d,reason:e}=(0,T.shouldRecreateClient)(k,c,h,j),f=a&&(0,T.clientProtectedConfigFingerprint)(k)!==(0,T.protectedConfigFingerprint)(c);if(!d&&!f)return b&&await this.assertProtectedConnectionIntent(b,c),await (0,u.HR)(k,c.name,c),ad.info(`connectServer: Server ${c.name} is already connected`),this.lastConnectionError.delete(c.name),this.approvalFailures.delete(c.name),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),await this.clearLegacyInferredOAuthScopesForHeaderAuth(c.name),{success:!0};ad.info(`connectServer: Existing client for ${c.name} is stale (${f?"protected config identity changed":e}), recreating`),this.deregisterClient(c.name);try{let a=await (0,T.safelyCloseClient)(k,c.name,c);if(a.isolation?.cleanupOutcome==="unknown")throw new v.Bk("ISOLATION_UNAVAILABLE")}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError||a instanceof g.Mr||a instanceof v.Bk)throw a;ad.debug(`connectServer: error closing stale client for ${c.name}: ${a instanceof Error?a.message:String(a)}`)}k=void 0}b&&await this.assertProtectedConnectionIntent(b,c),await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(c.name),k=h?(0,V.e)(c,(0,q.bindToCurrentWorkspace)(()=>{this.getClient(c.name)===k&&this.onResourceListChanged(c.name)})):(0,T.createNewClient)(c),b&&(f=k);let l=h?(0,V.gf)(c,j):(0,T.createTransport)(c,j);if(d=k,e=l,"stdio"===c.transport&&(0,Y.hH)(k,c.name,h?(0,V.UQ)(l):void 0),h){let a=k.setNotificationHandler?.bind(k);a&&(a("notifications/resources/list_changed",(0,q.bindToCurrentWorkspace)(()=>{this.getClient(c.name)===k&&this.onResourceListChanged(c.name)})),a("notifications/resources/updated",(0,q.bindToCurrentWorkspace)(a=>{let b=a?.params?.uri;b&&this.getClient(c.name)===k&&this.onResourceUpdated(c.name,b)})))}else(0,U.U)(k,c.name,(0,q.bindToCurrentWorkspace)(a=>this.onResourceListChanged(a)),(0,q.bindToCurrentWorkspace)((a,b)=>this.onResourceUpdated(a,b)));let m=ab(l).stderr;if(m&&"function"==typeof m.on){let a=c.name;m.on("data",(0,q.bindToCurrentWorkspace)(b=>{let c=b.toString();ad.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)}))}if(l.onclose=(0,q.bindToCurrentWorkspace)(()=>{this.activeTransports.get(c.name)!==l?ad.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${c.name}`):(ad.warn(`connectServer: Connection closed for server ${c.name}`),this.deregisterClient(c.name),this.getServerConfig(c.name).then(a=>{!a||a.disabled?ad.info(`Server ${c.name} is now disabled, skipping reconnection logic`):(ad.info(`Connection closed for enabled server ${c.name}, scheduling reconnection`),this.scheduleConnectionRetry(c.name,a))}).catch(a=>{ad.warn(`Error checking server config for ${c.name} during onclose:`,a)}))}),l.onerror=(0,q.bindToCurrentWorkspace)(a=>{if((0,L.lO)(a))return void ad.debug(`connectServer: transient SSE stream disconnect for ${c.name} (self-healing, ignored): ${a instanceof Error?a.message:String(a)}`);if(this.activeTransports.get(c.name)!==l)return void ad.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${c.name}`);if("stdio"===c.transport&&(a instanceof SyntaxError||a?.name==="ZodError"||a?.name==="$ZodError")){ad.warn(`connectServer: ${c.name} wrote a line on stdout that is not an MCP message; ignoring it`),this.appendStderrLog(c.name,`Ignored a stdout line that is not an MCP message: ${a.message}`);return}if(ad.error(`connectServer: Transport error for server ${c.name}:`),a instanceof Error){ad.error(`Error name: ${a.name}`),ad.error(`Error message: ${a.message}`),ad.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&ad.error(`Error code: ${b}`),ad.error(`Error chain: ${(0,L.jf)(a)}`)}else if(a&&"object"==typeof a){let b=Object.getPrototypeOf(a),c="string"==typeof b?.constructor?.name?b.constructor.name:"Unknown";ad.error(`Error type: ${typeof a}`),ad.error(`Error constructor: ${c}`);let d=Object.getOwnPropertyNames(a);d.length>0?(ad.error(`Error properties: ${d.join(", ")}`),d.forEach(b=>{try{let c=a[b];ad.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){ad.error(` ${b}: [Unable to serialize: ${a}]`)}})):ad.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);ad.error(`JSON stringified error: ${b}`)}catch(a){ad.error(`Cannot JSON stringify error: ${a}`)}}else ad.error(`Error value: ${String(a)} (type: ${typeof a})`);this.appendStderrLog(c.name,`Transport error: ${(0,L.jf)(a)}`),this.deregisterClient(c.name),l.close().catch(a=>{ad.debug(`connectServer: closing the failed transport for ${c.name} failed`,a)}),this.getServerConfig(c.name).then(a=>{!a||a.disabled?ad.info(`Server ${c.name} is now disabled, skipping reconnection after transport error`):(ad.info(`Transport error for enabled server ${c.name}, scheduling reconnection`),this.scheduleConnectionRetry(c.name,a))}).catch(a=>{ad.warn(`Error checking server config for ${c.name} during onerror:`,a)})}),await (0,g.QO)(),b&&await this.assertProtectedConnectionIntent(b,c),await k.connect(l),b&&await this.assertProtectedConnectionIntent(b,c),"stdio"===c.transport&&h&&(0,V.po)(l),this.clients.set(c.name,k),this.activeTransports.set(c.name,l),this.clientGenerations.set(c.name,this.getClientGeneration(c.name)+1),b&&await this.assertProtectedConnectionIntent(b,c),(0,Y.AO)(k))try{await (0,Y.DK)(k,c.name,{force:!0})}catch(a){if(a instanceof g.Mr)throw a;ad.warn(`mcp-stdio-oauth readiness probe failed for ${c.name}:`,a)}b&&await this.assertProtectedConnectionIntent(b,c),this.lastConnectionError.delete(c.name),this.approvalFailures.delete(c.name),this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name),await this.clearLegacyInferredOAuthScopesForHeaderAuth(c.name),b&&await this.assertProtectedConnectionIntent(b,c);let n=(0,V.nK)(k);return ad.info(`connectServer: Successfully connected to ${c.name}`+(n?` (beta SDK, negotiated MCP protocol ${n})`:"")),{success:!0}}catch(q){let a;if(q instanceof g.Mr){let a=[];if(d&&e){this.deregisterClient(c.name);try{d.transport===e?await (0,T.safelyCloseClient)(d,c.name,c):await e.close()}catch(b){a.push(b)}let b=e.__flujoRetireRuntimeAuthority;try{b?.()}catch(b){a.push(b)}}if(a.length)throw new g.Mr(AggregateError([q,...a],"MCP denied startup cleanup failed"));throw q}if(q instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};if(b&&f){this.clients.get(c.name)===f&&this.deregisterClient(c.name);try{await (0,T.safelyCloseClient)(f,c.name,c)}catch{}}if(q instanceof t.ExecutionExtensionError)return{success:!1,error:q.code,statusCode:q.status,errorType:"execution-authorization"};if((0,t.isProtectedExecutionServer)(c.name))return{success:!1,error:"execution_mcp_connect_failed",statusCode:503,errorType:"execution-authorization"};"stdio"===c.transport&&(0,Z.HW)(c.name);let i=(0,h.I)(q);if(i){this.clearRetryTimer(c.name),this.connectionRetryAttempts.delete(c.name);let a=this.approvalFailures.get(c.name);return a?.errorCode!==i.errorCode&&ad.warn(`MCP server ${c.name}: ${i.error}`),this.approvalFailures.set(c.name,i),this.lastConnectionError.set(c.name,i.error),i}this.approvalFailures.delete(c.name),ad.error(`connectServer: Failed to connect to server ${c.name}:`,q);let j=q instanceof Error?q.message:String(q),l=(0,L.uP)(q),m=(0,L.Ah)(q),n=ac(k);if(m&&!n&&("streamable"===c.transport||"sse"===c.transport)){let b=c.serverUrl;b&&(a=(await (0,S.n)(b)).oauthCapable)}if(l||a){if(ad.info(`OAuth authentication error detected for server ${c.name}: ${j}`),"streamable"===c.transport&&a){let a=c;if(!a.oauthScopes||0===a.oauthScopes.length){ad.info(`Dynamically enabling OAuth for server ${c.name} after capability confirmation`);try{let b={...a,oauthScopes:["read"]},d=await this.loadServerConfigs();if(Array.isArray(d)){let a=d.findIndex(a=>a.name===c.name);-1!==a&&(d[a]=b,await (0,A.saveConfig)(new Map(d.map(a=>[a.name,a]))),ad.info(`Updated config for ${c.name} to enable OAuth`))}}catch(a){if(a instanceof g.Mr)throw a;ad.warn(`Failed to update config for ${c.name} to enable OAuth:`,a)}}}return{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate.",requiresAuthentication:!0,oauthCapable:!0}}if(m)return{success:!1,error:j,requiresAuthentication:!0,oauthCapable:a};let o=this.stderrLogs.get(c.name)||[],p=(0,L.ox)(q,c,o);return this.lastConnectionError.set(c.name,p),{success:!1,error:p}}finally{this.connectingServers.delete(c.name)}}async testConnection(a,b,c){if(!(0,y.Mt)(a.transport))return{success:!1,error:y.ZW,statusCode:400};ad.info(`testConnection: Testing connection to ${a.name||"(unnamed)"} via ${a.transport} transport`);let d=a=>{try{b?.(a)}catch{}},e=[],f=(0,o.O)((0,o.P)(a,a)),i=f.stream(),j=new n.StringDecoder("utf8"),k=!1,l=a=>{a&&(e.push(a),d({type:"stderr",data:a}))},m=()=>{k||(k=!0,l(i.write(j.end())),l(i.end()))},p=null,q=null;try{let b,e=a,h=c?.storedName||a.name;if(("streamable"===a.transport||"sse"===a.transport)&&h){let b=await this.loadServerConfigs(),c=Array.isArray(b)?b.find(a=>a.name===h):void 0,f=c?.headers,g=a.headers;if((0,Q.t_)(g,f)&&!(0,Q.sd)(a,c))return d({type:"result",success:!1,error:Q.$X}),{success:!1,error:Q.$X,statusCode:400};e={...a,headers:(0,P.x0)(g,f)}}let n=await (0,T.resolveConfigHeaders)(e);await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(n.name),i=(f=(0,o.O)((0,o.P)(e,n))).stream();let r=!(0,t.isProtectedExecutionServer)(n.name)&&await (0,V.q1)()&&"websocket"!==n.transport,s={isolateRuntimeHome:await (0,K.SZ)(n)};p=r?(0,V.e)(n):(0,T.createNewClient)(n),q=r?(0,V.gf)(n,s):(0,T.createTransport)(n,s),"stdio"===n.transport&&(0,Y.hH)(p,n.name,r?(0,V.UQ)(q):void 0);let u=ab(q).stderr;u&&"function"==typeof u.on&&u.on("data",a=>{k||l(i.write(j.write(a)))}),q.onerror=a=>{k||l(f.redact(`Transport error: ${(0,L.jf)(a)}
66
66
  `))},d({type:"status",phase:"spawning",message:"Starting server / opening transport..."});let v=(0,R.uz)(a),w=(0,R.YA)(a),x=new Promise((a,c)=>{b=setTimeout(()=>c(Error(`Connection timeout after ${v/1e3}s`+(w?" — 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.":""))),v)});d({type:"status",phase:"handshaking",message:"Performing MCP handshake..."});try{await (0,g.QO)(),await Promise.race([p.connect(q,{timeout:v}),x])}finally{b&&clearTimeout(b)}"stdio"===n.transport&&r&&(0,V.po)(q),d({type:"status",phase:"listing-tools",message:"Handshake OK — listing tools..."});let y=0;try{let a=await p.listTools();y=Array.isArray(a?.tools)?a.tools.length:0}catch(b){if(b instanceof g.Mr)throw b;ad.debug(`testConnection: connected to ${a.name} but listTools failed: ${f.redact((0,L.jf)(b))}`)}return ad.info(`testConnection: Successfully connected to ${a.name} (${y} tools)`),m(),d({type:"result",success:!0,data:{toolCount:y}}),{success:!0,data:{toolCount:y}}}catch(k){let b;if(k instanceof g.Mr||k instanceof T.McpRuntimeAuthorityRetirementError)throw k;m();let c=(0,h.I)(k);if(c)return d({type:"result",success:!1,error:c.error}),c;ad.warn(`testConnection: Failed to connect to ${a.name}:`,f.redact((0,L.jf)(k)));let i=(0,L.Ah)(k);if(i&&("streamable"===a.transport||"sse"===a.transport)){let c=a.serverUrl;c&&(b=(await (0,S.n)(c)).oauthCapable)}let j=(0,L.ox)(k,a,e.length?[e.join("")]:[],f.redact);return d({type:"result",success:!1,error:j,requiresAuthentication:i,oauthCapable:b}),{success:!1,error:j,requiresAuthentication:i,oauthCapable:b}}finally{if(p)try{await (0,T.safelyCloseClient)(p,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){if(b instanceof T.McpRuntimeAuthorityRetirementError||b instanceof g.Mr)throw b;ad.debug(`testConnection: error closing test client for ${a.name}: ${f.redact((0,L.jf)(b))}`)}}}setNodeRoots(a,b,c){for(let d of(0,W.eS)(a,b,c))this.notifyRootsChanged(d)}notifyRootsChanged(a){let b=this.getClient(a);if(!b)return void ad.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{ad.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),ad.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}notifyAllRootsChanged(){for(let a of this.clients.keys())this.notifyRootsChanged(a)}async disconnectServer(a){let b,c;ad.debug(`disconnectServer: Entering method for server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);try{(0,T.assertMcpRuntimeAuthorityRetired)(a)}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};throw a}let d=(0,D.ih)(a);if(d?.teardownPromise){let b=await d.teardownPromise;try{(0,T.assertMcpRuntimeAuthorityRetired)(a)}catch(a){if(a instanceof T.McpRuntimeAuthorityRetirementError)return{success:!1,shutdownReceipt:b,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};throw a}return(await (0,g.QO)(),"close_failed"===b.errorClassification)?{success:!1,shutdownReceipt:b,error:"MCP_SHUTDOWN_FAILED",statusCode:503}:{success:!0,shutdownReceipt:b}}if(!this.getClient(a)&&!d?.connectPromise){let b=(0,D.Pe)(a);return b?{success:"close_failed"!==b.errorClassification,shutdownReceipt:b,..."close_failed"===b.errorClassification?{error:"MCP_SHUTDOWN_FAILED",statusCode:503}:{}}:(ad.warn(`disconnectServer: Server ${a} not found in clients map`),this.deregisterClient(a),{success:!1,error:`Server ${a} not found`})}try{await (0,g.QO)();let d=await (0,D.Qq)(a,"disconnect",async()=>{let d;try{await (0,g.QO)()}catch(a){throw c=a,a}let e=this.getClient(a);if(this.deregisterClient(a),e){try{d=await this.getServerConfig(a)||void 0}catch(a){c=a}try{let b=await (0,T.safelyCloseClient)(e,a,d);if(c)throw c;return b}catch(a){throw c=c&&c!==a?new g.Mr(AggregateError([c,a],"MCP teardown failed")):a,a instanceof T.McpRuntimeAuthorityRetirementError&&(b=a),a}}});if(b)return{success:!1,shutdownReceipt:d,error:"MCP_AUTHORITY_RETIREMENT_UNCERTAIN",errorType:"mcp-authority-retirement",statusCode:503};if(c)throw c;if(await (0,g.QO)(),"close_failed"===d.errorClassification)return{success:!1,shutdownReceipt:d,error:"MCP_SHUTDOWN_FAILED",statusCode:503};return ad.info(`disconnectServer: Disconnected server ${a}`),{success:!0,shutdownReceipt:d}}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;return ad.warn(`disconnectServer: Failed to disconnect server ${a}:`,b),{success:!1,error:`Failed to disconnect server: ${b instanceof Error?b.message:"Unknown error"}`}}}getServerShutdownReceipt(a){return(0,D.Pe)(a)}async disconnectAll(a){let b=[],c=[],d=[],e=Array.from(new Set(Array.from(this.clients.keys())));for(let f of(ad.info(`disconnectAll: tearing down ${e.length} MCP server(s) (${a})`),e)){this.clearRetryTimer(f),this.connectionRetryAttempts.delete(f);try{let a=await this.disconnectServer(f);a.shutdownReceipt&&d.push(a.shutdownReceipt),a.success?b.push(f):c.push(f)}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;ad.warn(`disconnectAll: teardown of ${f} threw: ${a instanceof Error?a.message:String(a)}`),c.push(f)}}for(let[a]of Array.from(this.connectionRetryTimers))this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);return ad.info(`disconnectAll: closed=${b.length} failed=${c.length} (${a})`),{closed:b,failed:c,shutdownReceipts:d}}getLifecycleReport(){return{runtimes:(0,D.HG)(),pool:(0,E.dx)(),liveClients:this.clients.size}}async sweepIdleMcpServers(){return[...await (0,E.xf)(this),...await (0,E.eY)(this)]}acquireServerLease(a,b){return(0,E.ZZ)(this,a,b?a=>this.connectServer(a,b):void 0)}pinServer(a,b){(0,E.hD)(a,b)}unpinServer(a,b){(0,E.Qe)(a,b)}async forceReconnect(a,b){if(await (0,g.QO)(),(0,T.assertMcpRuntimeAuthorityRetired)(a),b){let c=this.getClient(a);if(c!==b)return c?{success:!0}:this.connectServer(a);let d=(0,D.ih)(a);if(d&&(d.leases>0||d.pins.size>0))return{success:!1,error:`Server '${a}' is in use. Retry discovery when its current work finishes.`}}ad.info(`forceReconnect: Forcing fresh connection for server ${a}`);let c=this.clients.get(a);if(c){this.deregisterClient(a);let b=await this.getServerConfig(a);try{await (0,T.safelyCloseClient)(c,a,b||void 0)}catch(b){if(b instanceof T.McpRuntimeAuthorityRetirementError||b instanceof g.Mr)throw b;ad.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a,b="model",c,d){let e,f="string"==typeof c?void 0:c,g="string"==typeof c?c:d;if(ad.debug(`listServerTools: Entering method for server ${a}, audience ${b}`),!f&&(0,t.isProtectedExecutionServer)(a))throw new t.ExecutionExtensionError("trusted_execution_context_required");let h=!1;if(f){if(await (0,t.assertExecutionExtensionCurrent)(f),a!==(0,t.executionExtensionProtectedServer)(f))throw new t.ExecutionExtensionError("execution_mcp_server_forbidden");let b=await this.getServerConfig(a);if(!b)throw new t.ExecutionExtensionError("execution_mcp_server_config_missing");h=!0===b.disabled;let c=await (0,T.resolveConfigHeaders)(b);if((0,t.assertExecutionServerConfig)(c),await (0,t.assertExecutionExtensionCurrent)(f),!(e=this.getClient(a))||(0,T.clientProtectedConfigFingerprint)(e)!==(0,T.protectedConfigFingerprint)(c))throw new t.ExecutionExtensionError("execution_mcp_client_identity_changed")}if(f?h:await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ad.warn(`listServerTools: ${b}`),{tools:[],error:b}}if(f&&this.getClient(a)!==e)throw new t.ExecutionExtensionError("execution_mcp_client_identity_changed");let i=e??this.getClient(a);i||ad.warn(`listServerTools: Client not found for ${a}`);let j=await (0,F.X)(i,a,b,g);if(f&&(await (0,t.assertExecutionExtensionCurrent)(f),this.getClient(a)!==e))throw new t.ExecutionExtensionError("execution_mcp_client_identity_changed");if(j.error){if(f)return j;ad.warn(`listServerTools: Listing tools for ${a} failed (${j.error}); forcing reconnect and retrying once`);let c=await this.forceReconnect(a);if(!c.success)return ad.warn(`listServerTools: Reconnect for ${a} failed: ${c.error}`),{tools:[],error:c.error||j.error};i=this.clients.get(a),(j=await (0,F.X)(i,a,b,g)).error?ad.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,j.error):ad.info(`listServerTools: Recovered after reconnect for ${a}; listed ${j.tools.length} tools`)}else ad.info(`listServerTools: Listed ${j.tools.length} tools for ${a}`);return j}async getExternalAuthorizationStatus(a,b=!1){return(0,Y.DK)(this.getClient(a),a,{force:b})}async prepareExternalAuthorization(a,b,c={}){let d=this.getClient(a);if(!d){let b=await this.forceReconnect(a);if(!b.success)throw Error(b.error||`Could not connect to ${a}.`);d=this.getClient(a)}if(!d)throw Error(`MCP server '${a}' is not connected.`);return(0,Y.QF)(d,a,b,c)}confirmExternalAuthorization(a,b){return(0,Y.hm)(a,b)}declineExternalAuthorization(a,b){return(0,Y.x1)(a,b)}cancelExternalAuthorization(a,b){return(0,Y.d4)(a,b)}async callTool(a,b,d,e,h,i,j,k="host",l,m,n){let o=!!n||(0,t.isProtectedExecutionServer)(a);if((0,f.VU)()){let c=(0,f.qE)(`${a}::${b}`,d);try{return{success:!0,data:JSON.parse(c)}}catch{return{success:!0,data:{content:[{type:"text",text:c}]}}}}let p=o||!m?.conversationId?void 0:await (0,x.G$)(await this.getServerConfig(a).catch(()=>null),m.conversationId);try{if(o){await (0,t.assertExecutionToolDispatch)(n,a,k);let b=await this.getServerConfig(a);if(!b)throw new t.ExecutionExtensionError("execution_server_policy_mismatch");(0,t.assertExecutionServerConfig)(await (0,T.resolveConfigHeaders)(b))}}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof t.ExecutionExtensionError?a.code:"execution_authorization_unavailable",statusCode:a instanceof t.ExecutionExtensionError?a.status:503,errorType:"execution-authorization"}}if(ad.debug(`callTool: Entering method for server ${a}, tool ${b}, source ${k}`),await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ad.warn(`callTool: ${b}`),{success:!1,error:b}}let q=this.getClient(a),r=await this.acquireServerLease(a,n),s=r.lease;s?q=s.client:q||ad.warn(`callTool: Lease acquisition for ${a} failed: ${r.error}`);let w=async()=>{if(!o)return;await (0,t.assertExecutionToolDispatch)(n,a,k);let b=await this.getServerConfig(a);if(!b)throw new t.ExecutionExtensionError("execution_mcp_server_config_missing");(0,t.assertExecutionServerConfig)(b);let c=await (0,T.resolveConfigHeaders)(b);if((0,t.assertExecutionServerConfig)(c),await (0,t.assertExecutionToolDispatch)(n,a,k),!s||!q||s.isStale()||this.getClient(a)!==q||(0,T.clientProtectedConfigFingerprint)(q)!==(0,T.protectedConfigFingerprint)(c))throw new t.ExecutionExtensionError("execution_mcp_client_identity_changed")};try{if(await w(),q&&(0,Y.AO)(q))try{let c=await (0,Y.DK)(q,a,{force:!0});if(c.blockingAuthorization){let d=c.blockingAuthorization,e=d.message||`${d.label} authorization is required. Open the MCP page to authenticate before running this flow.`;return ad.warn(`callTool: blocked ${a}/${b}: ${e}`),{success:!1,error:e,errorType:"stdio-oauth-required",statusCode:428,requiresAuthentication:!0}}}catch(c){if(c instanceof g.Mr)throw c;let b=c instanceof Error?c.message:String(c);return ad.warn(`callTool: mcp-stdio-oauth readiness check failed for ${a}: ${b}`),{success:!1,error:`Could not verify account readiness for '${a}': ${b}`,errorType:"stdio-oauth-status",statusCode:503}}let f="model"===k&&"create_ticket_for_human"===b&&m?.conversationId?await this.getServerConfig(a):null,r=(0,X.uU)(f,b,k,m),s=r?(0,X.At)(f,b,d,k,m):d;await w();try{q&&await (0,u.HR)(q,a,await this.getServerConfig(a))}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof v.Bk?a.code:"ISOLATION_UNAVAILABLE",errorType:"mcp-isolation",statusCode:a instanceof v.Bk&&"ISOLATION_UNAVAILABLE"!==a.code?403:503}}await (0,g.QO)();let t=await (0,F.T)(q,a,b,s,e,h,j,k,i,l,n,o?w:void 0,m?.conversationId,p);if(t.success&&r){let a=(0,X.$S)(t.data);if(a)try{let{ticketService:b}=await c.e(40623).then(c.bind(c,440623));await b.stampPersonaAttributionFromTrustedConversation(a,r)}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.error(`callTool: Failed to stamp trusted ticket attribution for ${a}`,b)}}return ad.info(`callTool: Called tool ${b} on ${a}`),t}catch(a){if(o)return{success:!1,error:a instanceof t.ExecutionExtensionError?a.code:"execution_tool_unavailable",statusCode:a instanceof t.ExecutionExtensionError?a.status:503,errorType:"execution-call"};throw a}finally{s?.release()}}async callToolFromApp(a,b,c,d,e,f,g){let h=await this.checkMcpAppAccess(a);if(h)return h;let i=await this.callTool(a,b,c,d,g,void 0,e,"app",f);if("tool-authorization-list"!==i.errorType)return i;ad.warn(`callToolFromApp: visibility lookup failed for ${a}/${b}; reconnecting and retrying once before dispatch`);let j=await this.forceReconnect(a);return j.success?i=await this.callTool(a,b,c,d,g,void 0,e,"app",f):{success:!1,error:j.error||i.error,statusCode:i.statusCode}}async isMcpAppAccessEnabled(a){let b=await this.getServerConfig(a);return b?.disabled!==!0&&b?.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 ad.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.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ad.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=async()=>{let d=await this.acquireServerLease(a);if(!d.lease)return{result:{...c,error:d.error||"Server not connected"}};let e=d.lease;try{let d=await b(e.client,a);if(e.isStale()||this.getClient(a)!==e.client)return{client:e.client,result:{...c,error:"MCP connection changed during discovery. Try again."}};return{client:e.client,result:d}}finally{e.release()}},{client:e,result:f}=await d();if(!f.error||!e)return f;ad.warn(`listWithReconnect: Listing for ${a} failed (${f.error}); forcing reconnect and retrying once`);let g=await this.forceReconnect(a,e);return g.success?({client:e,result:f}=await d(),f.error?ad.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,f.error):ad.info(`listWithReconnect: Recovered after reconnect for ${a}`),f):(ad.warn(`listWithReconnect: Reconnect for ${a} failed: ${g.error}`),{...c,error:g.error||f.error})}async listServerResources(a,b){return(0,t.isProtectedExecutionServer)(a)?{resources:[],error:"execution_protocol_surface_forbidden"}:(ad.debug(`listServerResources: Entering method for server ${a}`),this.listWithReconnect(a,(a,c)=>(0,G.Hw)(a,c,b),{resources:[]}))}async listServerResourceTemplates(a,b){return(0,t.isProtectedExecutionServer)(a)?{resourceTemplates:[],error:"execution_protocol_surface_forbidden"}:(ad.debug(`listServerResourceTemplates: Entering method for server ${a}`),this.listWithReconnect(a,(a,c)=>(0,G.jt)(a,c,b),{resourceTemplates:[]}))}async readResource(a,b){return(0,f.bQ)(JSON.stringify([a,b]),()=>this.readResourceUncached(a,b))}async readResourceUncached(a,b){if((0,t.isProtectedExecutionServer)(a))return{success:!1,error:"execution_protocol_surface_forbidden"};ad.debug(`readResource: Entering method for server ${a}, uri ${b}`);let c=await this.acquireServerLease(a);if(!c.lease)return{success:!1,error:c.error||"Server not connected"};try{let d=await (0,G.R_)(c.lease.client,a,b);return ad.info(`readResource: Read resource ${b} on ${a}`),d}finally{c.lease.release()}}async prepareMcpSkillsClient(a){if((0,t.isProtectedExecutionServer)(a))return{success:!1,error:"execution_protocol_surface_forbidden"};let b=await this.getServerConfig(a);if(!b)return{success:!1,error:`MCP server '${a}' was not found.`,statusCode:404};if(b.disabled)return{success:!1,error:`Server '${a}' is disabled. Enable it on the MCP page to use it.`,statusCode:409,errorType:"disabled"};if(!0!==b.enableMcpSkills)return{success:!1,error:`MCP Skills are disabled for server '${a}'.`,statusCode:409,errorType:"skills_disabled"};let c=await this.connectServer(a);if(!c.success)return{success:!1,error:c.error||`Failed to connect to MCP server '${a}'.`,statusCode:c.statusCode||502};let d=this.getClient(a),e=(0,I.b3)(d,!0);return d&&e?{success:!0,data:{client:d,capability:e}}:{success:!1,error:`Server '${a}' does not advertise ${z.ET}.`,statusCode:404,errorType:"skills_unsupported"}}async getServerProxyCapabilities(a){let b=await this.getServerConfig(a);if(!b||b.disabled||!(await this.connectServer(a)).success)return{};let c=this.getClient(a),d=(0,I.b3)(c,!0===b.enableMcpSkills&&!(0,t.isProtectedExecutionServer)(a)),e=c?.getServerCapabilities(),f=e?.extensions?.[s.OF];return{skillsCapability:d,appsCapability:f&&"object"==typeof f&&!Array.isArray(f)?{...f}:void 0}}async getServerSkillsCapability(a){let b=await this.prepareMcpSkillsClient(a);return b.success?b.data?.capability:void 0}async listServerSkills(a,b){let c=await this.getServerConfig(a);if(!c||c.disabled||!0!==c.enableMcpSkills)return{resultType:"complete",skills:[],serverName:a,availability:"disabled",...!c?{error:`MCP server '${a}' was not found.`}:{}};let d=await this.prepareMcpSkillsClient(a);if(!d.success||!d.data)return{resultType:"complete",skills:[],serverName:a,availability:"skills_unsupported"===d.errorType?"unsupported":"available",..."skills_unsupported"===d.errorType?{}:{error:d.error}};let e=async a=>(0,I.TR)(a,!0,b);try{return{...await e(d.data.client),serverName:a,availability:"available",capability:d.data.capability}}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;if(b instanceof I.el)return{resultType:"complete",skills:[],serverName:a,availability:"unsupported"};if((await this.forceReconnect(a)).success){let c=this.getClient(a);try{let b=await e(c),d=(0,I.b3)(c,!0);return{...b,serverName:a,availability:"available",...d?{capability:d}:{}}}catch(a){b=a}}return{resultType:"complete",skills:[],serverName:a,availability:"available",error:b instanceof Error?b.message:"Failed to list MCP Skills."}}}async getServerSkill(a,b){let c=await this.prepareMcpSkillsClient(a);if(!c.success||!c.data)return aa(c);try{return{success:!0,data:await (0,I.Wd)(c.data.client,!0,b)}}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof Error?a.message:"Failed to get MCP Skill.",statusCode:a instanceof I.el?404:502}}}async readServerSkillDirectory(a,b,c){let d=await this.prepareMcpSkillsClient(a);if(!d.success||!d.data)return aa(d);try{return{success:!0,data:await (0,I.pp)(d.data.client,!0,b,c)}}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof Error?a.message:"Failed to read MCP Skill directory.",statusCode:a instanceof I.el?404:502}}}async readVerifiedSkillResource(a,b,c){let d=await this.prepareMcpSkillsClient(a);if(!d.success||!d.data)return aa(d);let e=await this.getServerSkill(a,b);if(!e.success||!e.data)return aa(e);try{return{success:!0,data:await (0,I.Oo)(d.data.client,!0,e.data.skill,c)}}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof Error?a.message:"Failed to verify MCP Skill resource.",statusCode:422}}}async loadVerifiedSkill(a,b,c){let d=await this.prepareMcpSkillsClient(a);if(!d.success||!d.data)return aa(d);let e=await this.getServerSkill(a,b);if(!e.success||!e.data)return aa(e);if("dynamic"===e.data.skill.resources)return{success:!1,error:"Dynamic MCP Skills cannot be integrity-verified.",statusCode:422};let f=(0,z.Bw)(e.data.skill.uri).normalizedUri,h=e.data.skill.resources.find(a=>a.uri===f);if(!h)return{success:!1,error:"MCP Skill manifest metadata is missing.",statusCode:422};if(!(0,J.f9)({conversationId:c,serverName:a,skillUri:f,manifestDigest:h.digest}))return{success:!1,error:"This MCP Skill is not approved for the current conversation and manifest digest.",statusCode:403,errorType:"skills_approval_required"};try{return{success:!0,data:await (0,I.e0)(d.data.client,!0,a,e.data.skill)}}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return{success:!1,error:a instanceof Error?a.message:"Failed to load MCP Skill.",statusCode:422}}}async listServerPrompts(a){return(0,t.isProtectedExecutionServer)(a)?{prompts:[],error:"execution_protocol_surface_forbidden"}:(ad.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,H.t,{prompts:[]}))}async getPrompt(a,b,c){if((0,t.isProtectedExecutionServer)(a))return{success:!1,error:"execution_protocol_surface_forbidden"};ad.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=await this.acquireServerLease(a);if(!d.lease)return{success:!1,error:d.error||"Server not connected"};try{let e=await (0,H.X)(d.lease.client,a,b,c);return ad.info(`getPrompt: Got prompt ${b} on ${a}`),e}finally{d.lease.release()}}async resolveOAuthSecretForSave(a,b){return((0,P.uh)(a)&&(a=b??""),a)?a.startsWith("${global:")?a:this.encryptSecretForSave(a):""}async encryptSecretForSave(a){if(a.startsWith("encrypted_failed:"))throw Error("MCP credential encryption failed");if(a.startsWith("encrypted:")&&a.length>10)return a;let b=await (0,M.Rs)(a);if(!b.startsWith("encrypted:")||b.length<=10)throw Error("MCP credential encryption failed");return b}async resolveEnvForSave(a,b){let c={};for(let[d,e]of Object.entries((0,O.ds)(a))){let a="string"==typeof e?e:e.value,f=b?.[d],g="object"==typeof f&&f.metadata.isSecret;if(!("string"==typeof e?g||(0,N.xc)(d):e.metadata.isSecret)){c[d]=e;continue}if(!((0,P.uh)(a)&&(void 0===f||(a="string"==typeof f?f:f.value,(0,P.uh)(a)))))c[d]={value:!a||(0,P.T6)(a)?a:await this.encryptSecretForSave(a),metadata:{isSecret:!0}}}return c}async resolveHeadersForSave(a,b){let c={};for(let[d,e]of Object.entries(a||{})){if(!d)continue;let{value:a}=(0,P.at)(e,d),{isSecret:f}=(0,P.at)(e,d);if(!f){""!==a&&(c[d]={value:a,metadata:{isSecret:!1}});continue}if((0,P.uh)(a)){let c=b?.[d];if(void 0===c||(a=(0,P.at)(c,d).value,(0,P.uh)(a)))continue}if(a){if((0,P.T6)(a)){c[d]={value:a,metadata:{isSecret:!0}};continue}c[d]={value:await this.encryptSecretForSave(a),metadata:{isSecret:!0}}}}return c}async ensureManagedServerRootDir(a){try{let b=(a.rootPath||"").trim();if(!b)return;let c=["streamable","sse","websocket"].includes(a.transport),d="stdio"===a.transport&&(a.source?.type==="registry"||a.source?.type==="marketplace");if(!c&&!d)return;let e=m().resolve((0,q.getWorkspaceDataDir)(),b);if(m().dirname(e)===e)return;let f="stdio"===a.transport?(0,w.AW)(a):void 0;if(f&&e===m().resolve((0,q.getWorkspaceDataDir)(),"mcp-servers",f.packageDirectory))return;if(d){let a=m().join((0,q.getWorkspaceDataDir)(),"mcp-servers"),b=m().relative(a,e);if(!b||b.startsWith("..")||m().isAbsolute(b))return}await k().mkdir(e,{recursive:!0}),ad.debug(`ensureManagedServerRootDir: ensured ${e} for ${a.name}`)}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.warn(`ensureManagedServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){if(Object.prototype.hasOwnProperty.call(b,"transport")&&!(0,y.Mt)(b.transport))return{success:!1,error:y.ZW,statusCode:400};ad.debug(`updateServerConfig: Entering method for server ${a}`);let d=await this.loadServerConfigs();if(!Array.isArray(d))return ad.warn("updateServerConfig: Failed to load configs:",d.error),d;let e=d.find(b=>b.name===a),f=!!e&&"string"==typeof b.name&&b.name!==a;if(f&&d.some(a=>a.name===b.name))return ad.warn(`updateServerConfig: Refusing to rename ${a} -> ${b.name}: name already in use`),{success:!1,error:`A server named "${b.name}" already exists`};if(!e&&b.name){ad.info(`updateServerConfig: Creating new server config for ${b.name}`);let a="streamable"===b.transport||"sse"===b.transport,c={name:b.name,...a?{transport:b.transport,serverUrl:b.serverUrl??""}:{transport:"stdio",command:"",args:[],_buildCommand:"",_installCommand:""},env:{},disabled:!1,_buildCommand:"",_installCommand:"",rootPath:""};d.push(c),e=c}else if(!e)return ad.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};if(!e)return{success:!1,error:`Server ${a} not found`};let h=b.headers,i=e.headers,j=void 0===h?(0,Q.Wl)(i):(0,Q.t_)(h,i),k={...e,...b};if(j&&((0,Q.bC)(e)||(0,Q.bC)(k))&&!(0,Q.sd)(k,e))return{success:!1,error:Q.$X,statusCode:400};b={...b};try{void 0!==b.env&&(b.env=await this.resolveEnvForSave(b.env,e.env));let a=b.oauthClientSecret;if(void 0!==a){let c=e.oauthClientSecret;b.oauthClientSecret=await this.resolveOAuthSecretForSave(a,c)}void 0!==h&&(b.headers=await this.resolveHeadersForSave(h,i))}catch{return{success:!1,error:"Failed to encrypt MCP credentials; configuration was not saved"}}let l={...e};l={...e,...b};let m=JSON.stringify(e.roots??[])!==JSON.stringify(l.roots??[])||(e.rootPath??"")!==(l.rootPath??""),n=d.findIndex(b=>b.name===a);-1!==n?d[n]=l:l.name&&d.push(l),await (0,g.QO)();let o=await (0,A.saveConfig)(new Map(d.map(a=>[a.name,a])));if(!o.success)return ad.warn(`updateServerConfig: Failed to save config for ${a}:`,o.error),o;if(await this.ensureManagedServerRootDir(l),f)try{let{flowService:b}=await Promise.resolve().then(c.bind(c,502910)),d=await b.migrateMcpServerReferences(a,l.name);d.success?d.migratedReferences>0&&ad.info(`updateServerConfig: Migrated ${d.migratedReferences} MCP reference(s) across ${d.migratedFlows} flow(s)`):ad.warn("updateServerConfig: Server rename succeeded, but some flow references could not be migrated",d)}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;ad.warn("updateServerConfig: Server rename succeeded, but flow-reference migration failed",a)}if(f){if(this.clients.has(a)){let b=await this.disconnectServer(a);if(!b.success&&"mcp-authority-retirement"===b.errorType)throw new T.McpRuntimeAuthorityRetirementError([],"MCP authority retirement remains uncertain.")}else this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);this.stderrLogs.delete(a),this.lastConnectionError.delete(a),this.approvalFailures.delete(a),await this.handleConnectionStateChange(l.name,l)}else await this.handleConnectionStateChange(a,l);return m&&this.notifyRootsChanged(l.name),ad.info(`updateServerConfig: Successfully updated config for ${a}${f?` (renamed to ${l.name})`:""}`),l}async handleConnectionStateChange(a,b){ad.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){ad.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{let b=await this.disconnectServer(a);if(!b.success&&"mcp-authority-retirement"===b.errorType)throw new T.McpRuntimeAuthorityRetirementError([],"MCP authority retirement remains uncertain.")}catch(b){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;ad.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(ad.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(ad.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(ad.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){ad.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ad.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(ad.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;ad.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){if(ad.debug(`deleteServerConfig: Entering method for server ${a}`),this.clients.has(a)){ad.info(`deleteServerConfig: Disconnecting server ${a} before deletion`);let b=await this.disconnectServer(a);if(!b.success&&"mcp-authority-retirement"===b.errorType)return b}let b=await this.loadServerConfigs();if(!Array.isArray(b))return ad.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return ad.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),ad.debug(`deleteServerConfig: Saving updated configs after deleting ${a}`),await (0,g.QO)();let d=await (0,A.saveConfig)(new Map(b.map(a=>[a.name,a])));return d.success?ad.info(`deleteServerConfig: Successfully deleted server ${a}`):ad.warn(`deleteServerConfig: Error saving configs after deleting ${a}:`,d.error),d}async getServerStatus(a){let b,c=await this.getServerConfig(a);if(!c)return ad.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(c.disabled)return ad.debug(`getServerStatus: Server ${a} is disabled`),{status:"disconnected"};let d=!!this.getClient(a),e=this.approvalFailures.get(a);if(!d&&e)return{status:"requires_approval",message:e.error,errorCode:e.errorCode,requiresApproval:!0};if("streamable"===c.transport&&!d&&c.oauthScopes&&c.oauthScopes.length>0){let b=await (0,C.y$)(c);if(!b||!(0,B.HV)(b)||!b.access_token)return ad.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."};let d=b.issued_at;if(!b.refresh_token&&b.expires_in&&d){let c=b.expires_in;if(Math.floor(Date.now()/1e3)>=d+c)return ad.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 f=(this.stderrLogs.get(a)||[]).join("\n").trim(),h=this.lastConnectionError.get(a);if(d){let c=this.getClient(a);if((0,Y.AO)(c))try{if((b=await (0,Y.DK)(c,a)).blockingAuthorization){let a=b.blockingAuthorization;return{status:"requires_authentication",message:a.message||`${a.label} authorization is required before this server can be used by unattended flows.`,stderrOutput:f||void 0,stdioOAuth:b}}}catch(b){if(b instanceof g.Mr)throw b;let a=b instanceof Error?b.message:String(b);return{status:"error",message:`Connected, but the mcp-stdio-oauth readiness check failed: ${a}`,stderrOutput:f||void 0}}}if(d||this.getClient(a))return ad.info(`getServerStatus: Server ${a} is connected`),{status:"connected",stderrOutput:f||void 0,...b?{stdioOAuth:b}:{}};{let b=this.isStartingUp()&&!this.lastConnectionError.has(a);if(this.connectingServers.has(a)||b)return ad.info(`getServerStatus: Server ${a} is still connecting`),{status:"connecting",message:"Server is starting up. This may take a few moments."};if(f&&(f.includes("OAuth authentication required")||f.includes("invalid_token")))return ad.info(`getServerStatus: OAuth authentication error detected for ${a}`),{status:"requires_authentication",message:"OAuth authentication required. Please complete the OAuth flow.",stderrOutput:f};let c=f||h;return c?(ad.info(`getServerStatus: Using ${f?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:c,stderrOutput:f||void 0}):(ad.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(){ad.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ad.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled),c=/^(1|true|yes)$/i.test(process.env.FLUJO_MCP_LAZY_START??""),d=b.filter(a=>!0===a.alwaysOn);for(let a of d)(0,E.hD)(a.name,"always-on");let e=c?d:b;c?ad.info(`Lazy MCP start: ${b.length} enabled server(s) discovered, warming only ${d.length} always-on server(s)`):(ad.info(`Found ${e.length} enabled servers to start`),ad.debug(`${e}`)),e.forEach(a=>this.connectingServers.add(a.name));let f=Math.max(1,Number(process.env.FLUJO_MCP_BOOT_CONCURRENCY)||2);ad.info(`Connecting ${e.length} enabled servers with boot concurrency ${f}`),await (0,r.P)(e,f,async a=>{ad.info(`Starting server: ${a.name}`),await this.connectServer(a).catch(b=>{ad.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 ad.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){if(b instanceof g.Mr||b instanceof T.McpRuntimeAuthorityRetirementError)throw b;return ad.warn(`getAvailableClients: Error getting status for ${a.name}:`,b),{name:a.name,status:"error",connected:!1}}}))).map(a=>`${a.name} (${a.status})`)}catch(a){if(a instanceof g.Mr||a instanceof T.McpRuntimeAuthorityRetirementError)throw a;return ad.error("getAvailableClients: Error getting available clients:",a),[]}}constructor(){this.stderrLogsBase=new Map,this.lastConnectionErrorBase=new Map,this.inFlightConnectsBase=new Map,this.connectionRetryTimersBase=new Map,this.connectionRetryAttemptsBase=new Map,this.resourceListVersionBase=new Map,this.pendingResourceUpdatesBase=new Map}}let af=new ae;d()}catch(a){d(a)}})},376084:(a,b,c)=>{"use strict";c.d(b,{C8:()=>l,Kc:()=>k});var d=c(927739),e=c(328461),f=c(200797),g=c(600916);let h=new WeakSet;class i extends Error{constructor(){super("Unsupported native held-read admission."),h.add(this)}}let j=new WeakSet;function k(a){if(!j.has(a))throw Error("A live native held reader is required.")}async function l(a,b,c,d,e){try{return await m(a,b,c,d)}catch(a){if(!("object"==typeof a&&null!==a&&h.has(a)))throw a}return e()}async function m(a,b,h,l){let m=(0,d.j)(a),n=await Promise.all([c.e(58419),c.e(71084),c.e(83794),c.e(36260),c.e(46280)]).then(c.bind(c,836260));if(!n.supportsPersonaHeldReadIssuer(m))throw new i;n.assertPersonaHeldReadIssuer(m);let o=globalThis.__flujoNativeOriginalAuthorities,p=o?.get(m);if(!p||o?.get(a)!==p)throw new i;let q=(0,e.getCurrentWorkspace)();if((0,f.hasExecutionReadGuards)())throw new i;let{loadConversationStateReadOnly:r}=await Promise.resolve().then(c.bind(c,164599)),s=new Set,t=b,u=a=>{if((0,f.hasExecutionReadGuards)()||a&&"object"==typeof a&&(a.executionExtensionOwned||a.executionExtensionContext))throw Error("Native held-read admission guard shape changed.")};for(;t;){if(s.has(t)||s.size>=256)throw Error("Native held-read admission lineage is invalid.");s.add(t);let a=await r(t,u);if(!a)throw Error("Native held-read admission state is unavailable.");let b=a?.executionAuthority;if(!b||a?.executionExtensionOwned||a?.executionExtensionContext||(0,d.j)(b)!==m||o?.get(b)!==p||(0,f.hasExecutionReadGuards)())throw Error("Native held-read admission authority shape changed.");if(t===h)break;t=a.parentRunId}if(!s.has(h))throw Error("Native held-read admission root is unavailable.");return n.readWithPersonaFlowAuthority(m,async a=>{let b=(0,g.K)(),c=c=>b.run(async()=>{if((0,e.getCurrentWorkspace)()!==q)throw Error("Native held read workspace changed.");if(await a(c),b.assertActive(),o?.get(m)!==p)throw Error("Native held read binding changed.")}),h=Object.freeze({assertCurrent:c,assertGuardEligibility:()=>{if(k(h),(0,f.hasExecutionReadGuards)())throw Error("Native held-read guard shape changed.")},assertFlowCurrent:a=>b.run(async()=>{k(h);let b=a.executionAuthority;if(a.executionExtensionContext||!b||(0,d.j)(b)!==m||o?.get(b)!==p)throw Error("Native held-read authority shape changed.");b.signal.throwIfAborted(),await c(),b.signal.throwIfAborted()})});j.add(h);try{await c();let a=await l(h);return await c(),a}finally{j.delete(h),await b.close()}})}},380506:(a,b,c)=>{"use strict";c.d(b,{X:()=>h});var d=c(176760),e=c.n(d),f=c(973024),g=c(328461);async function h(){let a=e().join((0,g.getWorkspaceDataDir)(),"db","claude-runtime");await f.promises.mkdir(a,{recursive:!0,mode:448});let b=e().join(a,"workspace"),c=e().join(a,"AppData","Roaming"),d=e().join(a,"AppData","Local"),h=e().join(a,".config"),i=e().join(a,".cache"),j=e().join(a,".local","share"),k=e().join(a,".local","state"),l=e().join(a,".runtime"),m=e().join(a,"tmp");await Promise.all([b,c,d,h,i,j,k,l,m].map(a=>f.promises.mkdir(a,{recursive:!0,mode:448})));let n={...Object.fromEntries(Object.entries(process.env).filter(a=>void 0!==a[1])),HOME:a,USERPROFILE:a,APPDATA:c,LOCALAPPDATA:d,XDG_CONFIG_HOME:h,XDG_CACHE_HOME:i,XDG_DATA_HOME:j,XDG_STATE_HOME:k,XDG_RUNTIME_DIR:l,TMPDIR:m,TMP:m,TEMP:m,CLAUDE_CONFIG_DIR:a,CLAUDE_SECURESTORAGE_CONFIG_DIR:a};if("win32"===process.platform){let b=e().parse(a);n.HOMEDRIVE=b.root.replace(/[\\/]$/,""),n.HOMEPATH=a.slice(b.root.length-1)}return{home:a,workingDirectory:b,env:n}}},387714:(a,b,c)=>{"use strict";function d(a){if(!a)return;let b=a.prompt_tokens_details?.cached_tokens,c=a.prompt_tokens_details?.cache_write_tokens;return{promptTokens:a.prompt_tokens??0,completionTokens:a.completion_tokens??0,totalTokens:a.total_tokens??(a.prompt_tokens??0)+(a.completion_tokens??0),...null!=b?{cacheReadTokens:b}:{},...null!=c?{cacheWriteTokens:c}:{}}}c.d(b,{u:()=>d})},390385:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{j:()=>Z});var e=c(620936),f=c(856859),g=c(527137),h=c(321820),i=c.n(h),j=c(333873),k=c.n(j),l=c(629021),m=c(482964),n=c(927739),o=c(836779),p=c(778347),q=c(328461),r=c(3924),s=c(373327),t=c(165566),u=c(943990),v=c(37456),w=c(600950),x=c(730584),y=c(687161),z=c(181360),A=c(100383),B=c(282791),C=c(561709),D=c(84189),E=c(247371),F=c(110687),G=c(400731),H=c(986648),I=c(221952),J=c(179157),K=c(773755),L=c(916264),M=c(955007),N=c(265649),O=c(700198),P=c(828755),Q=c(709499),R=c(771795),S=c(233948),T=c(200797),U=c(648286),V=a([s,x,D,E,G,S]);[s,x,D,E,G,S]=V.then?(await V)():V;let X=(0,m.h)("backend/services/model/adapters/codexAdapter"),Y="FLUJO MCP tools are the authoritative interface for the operations they expose. Read flujo://run/ archive and image references using the FLUJO read_resource tool when offered; these are tool-managed resources, not MCP resources/list or read_mcp_resource entries. 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 W(a){return a.replace(/[^a-zA-Z0-9_-]/g,"_")}class Z{async createCompletion(a){let b,d,h,j,m,V,Z,$,_,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak=(0,f.VU)();if((0,T.assertOwnerCredentialAdapterRoute)(a.model,"codex-cli"),a.harnessTextOnly&&(a.apiKey||a.model.ApiKey?.trim()||a.model.baseUrl?.trim()||!a.signal||a.tools?.length||a.localToolExecutors||a.nativeToolPort||a.nativeOriginalProcessHost||a.executionExtensionContext||a.conversationId||a.nodeId||a.codexSession||a.sessionResume||a.steering||"0"===process.env.FLUJO_CODEX_APP_SERVER))throw Error("Harness text inference requires a fresh, tool-free Codex subscription request.");let al=Date.now(),{model:am,apiKey:an,messages:ao,tools:ap,toolNameMap:aq,localToolExecutors:ar,shouldEndAgenticTurn:as,requestToolApproval:at,onTranscriptMessage:au,onModelDelta:av,onToolProgress:aw,signal:ax,beforeToolDispatch:ay,executionExtensionContext:az,authorizePersonaCoreMcp:aA,afterToolDispatch:aB,commitDurableMutation:aC,conversationId:aD,runId:aE,nodeId:aF,runResourceMarkers:aG,sessionResume:aH,codexSession:aI,onCodexSessionChange:aJ,onSdkRequest:aK,onSdkRequestResult:aL,onNativeSdkLive:aM,onNativeSdkFinished:aN,nativeToolPort:aO,nativeOriginalProcessHost:aP}=a,aQ=an&&am.baseUrl?.trim()||void 0;if(aP&&((0,E.Cb)(aP),(0,E.M6)(aP,az),az)){if(!aO||an)throw Error("Native Codex Worker Original requires its keyless owned broker.");(0,F.g)(aP.codexProfile)}if(aO){if((0,D.NW)(aO),!aK||!aL)throw Error("Native Codex broker requires a durable SDK dispatch receipt.");if(az&&!aP||aq||ar||at||aH||a.steering||a.consumeSteeringMessages||aI||aJ)throw Error("Native Codex broker cannot use host tool facilities or session resume.")}if(az||aP?.codexProfile){if(az&&await (0,T.assertExecutionExtensionCurrent)(az,{conversationId:aD,runId:aE}),void 0!==ar)throw new T.ExecutionExtensionError("execution_local_tools_forbidden");let a=aP?.codexProfile??(az?await (0,T.executionExtensionCodexProfile)(az):void 0);if(!a||an||at)throw new T.ExecutionExtensionError("execution_model_adapter_forbidden");if(d=Object.freeze({...a}),b=await (0,U.assertRestrictedCodexProfile)(d,am.name),az&&aO)await (0,D.p0)(aO,az);else for(let a of ap??[])"function"===a.type&&az&&await (0,T.assertExecutionModelTool)(az,a.function.name,aq?.[a.function.name])}let aR=(0,A.Jm)(ao,aG),{systemPrompt:aS}=aR,aT=new AbortController,aU=!1,aV=()=>({content:[{type:"text",text:"This agentic turn has ended; no further tools may run."}],isError:!0}),aW=()=>aT.abort();ax?.aborted?aT.abort():ax?.addEventListener("abort",aW,{once:!0});let aX=[],aY=new Set,aZ=Date.now(),a$=0,a_=`${aZ}_${(0,g.A)()}`,a0=a=>`stream_codex_${a_}_${a}`,a1=(a,b=`m_${(0,g.A)()}`)=>{let c={...a,id:b,timestamp:aZ+a$++};aX.push(c),au?.(c)},a2=a=>{aX.push(a),au?.(a)},a3=(a,b)=>{aY.add(a.id),a1({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.argsJson}}]},b)},a4=async(a,b)=>{b?.throwIfAborted(),aY.add(a.id);let c=a0(`toolcall_${a.id}`);try{await (0,H.qy)({messageId:c,callId:a.id,name:a.name,argsJson:a.argsJson,onModelDelta:av,signal:b})}finally{a3(a,c)}},a5=a=>{a1({role:"tool",tool_call_id:a.id,content:a.resultContent,...a.media?.length?{media:a.media}:{},...a.ui?{ui:a.ui}:{}}),aY.delete(a.id)},a6=a=>{a3(a),a5(a)},a7=[],a8=!1,a9=async(a,b,c,d,e)=>{let f;if(e?.throwIfAborted(),!at)return null;let g=(0,q.bindToCurrentWorkspace)(()=>{aD&&(0,o.J)(aD,a,!1)&&p.$e.emitterFor(aD)({type:"run:awaiting_approval",pendingToolCalls:(0,o.Rt)(aD)})});e?.addEventListener("abort",g,{once:!0});try{let d=at({id:a,name:b,args:c});e?.aborted&&g(),f=await d,e?.throwIfAborted()}catch(b){throw e?.aborted&&a5({id:a,resultContent:"The user input request ended before approval; no answer was submitted."}),b}finally{e?.removeEventListener("abort",g)}if(f)return null;let h="tool denied",i=await d?.(h);return a5({id:a,resultContent:h,...i?{ui:i}:{}}),{content:[{type:"text",text:h}],isError:!0}},ba=new Set,bb=(ap??[]).filter(a=>"function"===a.type).map(a=>{let b=a.function.name,c=b.startsWith("handoff_to_")||"handoff"===b,d=aq?.[b],e=ar?.[b];if(!c&&!d&&!e)return null;let f=a.function.parameters,h=a.function.description??"";if(c){let a=!!f?.properties?.task;return{name:b,description:h,inputSchema:f,handler:async c=>{if(as?.())return aV();az&&await (0,T.assertExecutionModelTool)(az,b,d),await ay?.();let e=Date.now();return(a7.push({name:b,args:c??{}}),aE&&(0,R.z9)((0,R.k)({type:"tool.invocation",runId:aE,node:aF?{id:aF}:void 0,tool:{id:b,name:b,kind:"handoff"},outcome:"completed",durationMs:Math.max(0,Date.now()-e)})),X.debug("Codex requested handoff",{tool:b,callIndex:a7.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."}]}:(a8=!0,{content:[{type:"text",text:"Handing off."}]})}}}if(e)return{name:b,description:h,inputSchema:f,handler:async(a,c,f)=>{if(f?.throwIfAborted(),as?.())return aV();az&&await (0,T.assertExecutionModelTool)(az,b,d);let h=`call_${(0,g.A)()}`,i=JSON.stringify(a??{});try{let c;await a4({id:h,name:b,argsJson:i},f);let d=await a9(h,b,a??{},void 0,f);if(d)return d;await ay?.(),f?.throwIfAborted(),X.debug("Codex local tool call",{tool:b});let g=Date.now(),j=[],k=!1;try{let b=await e(a??{}),d=(0,w.UR)(b);j=d.mediaItems,c=ak&&"string"==typeof b?b:JSON.stringify(d.textResult)}catch(a){if(a?.code==="flow_execution_authority_lost")throw a;c=`Error: ${a instanceof Error?a.message:String(a)}`,k=!0}return f?.throwIfAborted(),a5({id:h,resultContent:c,media:(0,Q.pt)(j)}),aE&&(0,R.z9)((0,R.k)({type:"tool.invocation",runId:aE,node:aF?{id:aF}:void 0,tool:{id:b,name:b,kind:"synthetic"},outcome:k?"error":"completed",durationMs:Math.max(0,Date.now()-g),errorClass:k?(0,R.Ys)({type:"tool"}):void 0})),k?{content:[{type:"text",text:c}],isError:!0}:{content:[{type:"text",text:c},...j]}}catch(a){throw f?.aborted&&aY.has(h)&&a5({id:h,resultContent:"The user input request ended before completion; no answer was submitted."}),a}}};let{server:i,tool:j,timeout:k,nodeId:l,annotations:m,uiResourceUri:n,presetArgs:o,context:p}=d,q=function(a,b,c){let d=`${W(a)}__${W(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}(i,j,ba);return{name:q,description:h,inputSchema:f,...m?{annotations:m}:{},handler:async a=>{let c,e;if(as?.())return aV();az&&await (0,T.assertExecutionModelTool)(az,b,d);let f=`call_${(0,g.A)()}`,h=JSON.stringify(a??{});await a4({id:f,name:q,argsJson:h});let m=await (0,S.sz)(a??{},o,p),z=await a9(f,q,a??{},async b=>{let c=await (0,x.JG)(i,j,n,void 0,a??{});return c?{...c,cancelledReason:b,isError:!0}:void 0});if(z)return z;await ay?.(),await aA?.(i,l);let A=(0,r.j1)(b,d,s.mcpService);if(!A.ok)return a5({id:f,resultContent:A.reason}),{content:[{type:"text",text:A.reason}],isError:!0};X.debug("Codex tool call",{server:i,tool:j,exposedAs:q});let B=Date.now(),C=await s.mcpService.callTool(i,j,m,k??y.aI,aw?a=>aw({toolCallId:f,name:q,progress:a.progress,total:a.total,message:a.message}):void 0,l,aT.signal,"model",(0,t.S)({runId:aE,conversationId:aD}),aD?{conversationId:aD}:void 0,...az?[az]:[]);if(az&&await (0,T.assertExecutionExtensionCurrent)(az,{conversationId:aD,runId:aE}),await aB?.(),aE){let a=!!(aT.signal.aborted||(0,x.AP)(C));(0,R.z9)((0,R.k)({type:"tool.invocation",runId:aE,node:{id:l??aF??"unknown"},tool:{id:j,name:j,kind:"mcp"},provider:{id:i},outcome:a?"cancelled":C.success?"completed":"error",durationMs:Math.max(0,Date.now()-B),errorClass:C.success?void 0:(0,R.Ys)(a?{type:"cancelled"}:C.error)}))}if(C.success){c=C.data;let{mediaItems:a,textResult:b}=(0,w.UR)(c);if(e=JSON.stringify(b),aD&&!az){let b=async()=>{try{let a=await (0,u.jR)();return await (0,v.S)({conversationId:aD,toolCallId:f,server:i,toolName:j,nodeId:l,content:e,settings:a})}catch(a){return X.warn("boundToolResult failed on Codex path; keeping full result",a),null}},d=aC?await aC(b):await b();d?.spilled&&(e=d.content,c={...c,content:[...a,{type:"text",text:d.content}]})}}else c={content:[{type:"text",text:e=`Error: ${C.error??"Unknown error"}`}],isError:!0};let D=await (0,x.JG)(i,j,n,C.data,a??{}),E=(0,x.AP)(C),F=D?{...D,...!C.success?{isError:!0}:{},...E?{cancelledReason:E}:{}}:void 0;return a5({id:f,resultContent:e,...F?{ui:F}:{}}),c}}}).filter(a=>null!==a),bc=new Set,bd=new Set,be=aO?aO.advertised.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,annotations:a.annotations,handler:async(b,c)=>{try{if(!c)throw Error("Native Codex tool lacks a stable model callback identity.");let d=JSON.parse(JSON.stringify(b));bc.has(c)||(a3({id:c,name:a.name,argsJson:JSON.stringify(d)}),bc.add(c));let e=await aO.dispatch({toolInvocationId:c,name:a.name,args:d,signal:aT.signal});return!bd.has(c)&&("handoff"===e.kind&&!e.result.isError&&(a7.push({id:c,name:a.name,args:d}),a.inputSchema?.properties?.task||(a8=!0)),a5({id:c,resultContent:e.transcriptText}),bd.add(c),"handoff"!==e.kind||e.result.isError||await aP.requestHandoffTermination(aO.invocationId)),e.result}catch(a){throw aO.cancel(),aT.abort(),a}}})):bb,bf=!aO&&!az&&aD&&aF?(0,P.jU)(aD,aF):void 0;!aH&&bf&&((0,P.jF)(bf),aJ?.(void 0));let bg={adapter:am.adapter??"codex-cli",provider:am.provider??"openai",model:am.name,reasoningEffort:am.reasoningEffort,...an?{baseUrl:aQ??"https://api.openai.com/v1"}:{},accountScope:"",runtimeIdentity:"",serviceTier:am.serviceTier??"default",workingDirectory:"",developerInstructions:Y},bh=aR,bi=aS,bj=!aO&&!az&&!aP&&!an&&"0"!==process.env.FLUJO_CODEX_APP_SERVER,bk=!aO&&!az&&!aP&&!bj;bj&&(bg.developerInstructions+="\nWhen calling FLUJO MCP tools from code-mode exec, capture the result and emit the relevant returned content with text(...) or image(...) for image blocks. Put that emission after await in the same exec script, including calls that yield and resume with wait. Use the emitted result to produce the requested final response.");let bl=bj?bb.find(a=>"question"===a.name):void 0;bl&&(bg.developerInstructions+="\nFLUJO enables request_user_input and request_user_input_async for short user questions through the same flow question policy and approval gate as the question tool. After asking, end your turn; FLUJO will deliver the actual user response. Do not use clock or collaboration tools to wait for an answer.");let bm=[],bn=async()=>(m||(m=await l.promises.mkdtemp(k().join(i().tmpdir(),"flujo-codex-"))),m),bo=[],bp="",bq=!!(bk&&j),br=!1,bs=!1,bt=j,bu=!1,bv=!0,bw=null;try{let i,m;be.length>0&&(V=await (0,C.t)(be,Y,!!aO,!!aP));let o=az||aP||aO?void 0:await (0,K.wl)();ai=o?.release;let p=b??o?.executable,q=az||aP?.codexProfile?void 0:await (0,I.b)(aT.signal,p);ah=q?.cleanup;let r=az?await (0,U.Hd)(d):void 0,s=r??await (0,J.u)(!an);ag=r?.cleanup,_=s.home;let t=az?r?.modelCatalogPath:q?.path;if(az&&!t)throw new T.ExecutionExtensionError("execution_model_catalog_required");if(aH&&bf&&(bg.accountScope=await (0,P.dE)(an),bg.runtimeIdentity=JSON.stringify({transport:bj?"app-server":"sdk-exec",...bj?{toolPolicy:"flujo-ordinary-tools-v3"}:{},...await (0,K.kf)(p)}),bg.workingDirectory=s.workingDirectory),h=bf&&aH?{key:bf,configuration:bg,prefixHash:(0,P.ft)(bg,aS,be)}:void 0){let a=(0,P.ES)(h.key,h.prefixHash,ao,aI);if(a&&(!bj||a.totalUsage)&&ao.length>a.seenMessageCount){let b=(0,A.Jm)(ao.slice(a.seenMessageCount),aG);(b.text.length>0||b.images.length>0)&&(ae=a,j=a.threadId,bh=b,bi=void 0,X.debug("Codex resuming compatible thread",{conversationId:aD,nodeId:aF,threadId:j,seenMessageCount:a.seenMessageCount,deltaMessages:ao.length-a.seenMessageCount}))}if(!j&&bj){let a=(0,P.HA)(h.key,h.prefixHash,ao,aI);if(a){let b=(0,A.Jm)(ao.slice(a.checkpoint.seenMessageCount),aG);(b.text.length||b.images.length)&&(ad=a,ae=a.session,ab=a.checkpoint.totalUsage,bu=!0,bh=b,bi=void 0)}}}for(let a of(bi&&!bj&&bo.push({type:"text",text:`<system_instructions>
67
67
  ${bi}
68
68
  </system_instructions>`}),bh.text&&bo.push({type:"text",text:bh.text}),bh.images))if(a.base64){let b=await bn(),c=function(a){switch((a||"").toLowerCase()){case"image/jpeg":case"image/jpg":return"jpeg";case"image/gif":return"gif";case"image/webp":return"webp";default:return"png"}}(a.mimeType),d=k().join(b,`img_${bm.length}.${c}`);await l.promises.writeFile(d,Buffer.from(a.base64,"base64")),bm.push(d),bo.push({type:"local_image",path:d})}else bo.push({type:"text",text:`[image: ${a.url}]`});for(let a of ao)if("user"===a.role)for(let b of(0,Q.IB)(a.content))"file"===b.type&&"application/pdf"===b.mimeType&&bo.push({type:"text",text:"[PDF document attachment supplied; this Codex SDK version cannot attach non-image files.]"});bt=j,(0,B.nL)([...bo.map(a=>"text"===a.type?a.text:a.path),...bj?[bg.developerInstructions,aS??""]:[]]),j&&(bj?ab=aI?.totalUsage??(0,P.ES)(h.key,h.prefixHash,ao)?.totalUsage:aa=await (0,O.l)(s.home,j));let u={...aQ?{model_provider:"flujo_api",model_providers:{flujo_api:{name:"FLUJO API",base_url:aQ,env_key:"CODEX_API_KEY",wire_api:"responses",requires_openai_auth:!1,supports_websockets:!1}}}:{},service_tier:am.serviceTier??"default",developer_instructions:Y,...bj?{web_search:"disabled"}:{},...bj?{tools:{view_image:!1,experimental_request_user_input:{enabled:!!bl}}}:{},features:{shell_tool:!1,...bj?{...U.Hg.features,code_mode_host:!0,default_mode_request_user_input:!!bl}:{}},...az||aO||a.harnessTextOnly||(0,f.VU)()?U.Hg:{},...ak&&bj?{features:{...U.Hg.features,code_mode_host:!0}}:{},...t?{model_catalog_json:t}:{},...V?{mcp_servers:{flujo:{url:V.url,default_tools_approval_mode:"approve"}}}:{}};if(aT.signal.aborted)throw Error("Codex run cancelled by user.");let v=aP||bj?void 0:new(await Promise.resolve().then(c.bind(c,276153))).Codex({...an?{apiKey:an}:{},...aQ?{baseUrl:aQ}:{},...p?{codexPathOverride:p}:{},...r?{configOverrides:r.configOverrides}:{},env:s.env,...Object.keys(u).length>0?{config:u}:{}}),w={model:am.name,...am.reasoningEffort?{modelReasoningEffort:am.reasoningEffort}:{},workingDirectory:s.workingDirectory,skipGitRepoCheck:!0,approvalPolicy:"never",...az||aO||a.harnessTextOnly||(0,f.VU)()?U.Wk:{}},x=aP?(0,G.d)({host:aP,env:(0,G.Q)(s.env,an),config:u,options:w,maxTurns:a.maxTurns,executable:b,onThreadStarted:a=>V?.bindNativeThread(a)}):void 0;af=bj?(0,L.Q)({executable:p,env:(0,G.Q)(s.env),config:u,options:w,resumeThreadId:j,outputSchema:a.outputSchema,maxTurns:a.maxTurns,...ad?{fork:{threadId:ad.session.threadId,lastTurnId:ad.checkpoint.turnId,...ad.session.nativeSessionId?{sessionId:ad.session.nativeSessionId}:{}}}:{},beforeContinuation:a.beforeModelDispatch,developerInstructions:[bg.developerInstructions,aS].filter(Boolean).join("\n\n"),...bl?{onQuestion:(a,b)=>(0,M.l)(a,b,a=>bl.handler(a,void 0,b)),onAsyncQuestion:async(a,b)=>{let c=await (0,M.R)(a,b,a=>bl.handler(a,void 0,b));return"decline"===c.action&&(bv=!1),c}}:{},onUsage:(a,b)=>{ac=a,Z=ad?(0,N.AK)(a,ab):ab?(0,N.l3)(a,ab):a,bu=!!(ad&&!Z),bw=b}}):void 0;let y=x??af??(j?v.resumeThread(j,w):v.startThread(w));X.debug("createCompletion via Codex SDK",{model:am.name,toolCount:be.length,hasSystem:!!aS,bridged:!!V,resumed:!!j,workingDirectory:s.workingDirectory,usingLocalModelCatalog:!!t});let D=1===bo.length&&"text"===bo[0].type?bo[0].text:bo,E="Continue the interrupted response from exactly where it stopped. Do not repeat content or tool calls already completed.",F=D,H=!1,R=0,S=!1,W=!1,aj=(0,z.Ho)(a);for(;;){var bx;let b,c,d,h,k=!1,l=new Map,o=R++,p=a=>0===o?a0(a):a0(`turn_${o}_${a}`),q=new AbortController,r=()=>q.abort();aT.signal.aborted?q.abort():aT.signal.addEventListener("abort",r,{once:!0});let s=(0,z.j6)({source:aj,canDeliver:()=>!ax?.aborted&&!c&&!m&&0===a7.length&&0===aY.size,deliver:async a=>{if(af){if(!af.canSteer())return void a.requeue();for(let b of a.messages)a2(b);await a.beforeSend();let b=a.messages.map(a=>"string"==typeof a.content?a.content:JSON.stringify(a.content)).join("\n\n");try{await af.steer(b)?await a.acknowledge():(bv=!1,a.requeue())}catch(a){throw new z.zU(a)}return}c=a,q.abort()},onError:a=>{d=a,q.abort()}});try{if(m){for(let a of m.messages)a2(a);await m.beforeSend()}try{if(h=await aK?.({adapter:"codex-cli",operation:x||af?"app-server.turn/start":"thread.runStreamed",request:{input:F,options:{signal:"[AbortSignal]",...a.outputSchema?{outputSchema:a.outputSchema}:{}},thread:{resumed:!!j,id:bt,options:w}},...i?{wireMessages:structuredClone(i)}:{}}),aO&&h!==aO.invocationId)throw Error("Native Codex SDK dispatch receipt differs from its broker origin.")}catch(a){if(aO||(0,e.Hd)(a))throw a;(0,n.Vj)(a),X.warn("Could not archive Codex SDK request",a)}if(az&&await (0,T.assertExecutionExtensionCurrent)(az,{conversationId:aD,runId:aE}),aT.signal.aborted)throw Error("Codex run cancelled by user.");let{events:f}=await y.runStreamed(F,{signal:q.signal,...a.outputSchema?{outputSchema:a.outputSchema}:{}});for await(let a of f){if(await aP?.assertOutputCurrent(),ax?.aborted||c||d)break;let e="turn.started"===a.type||("item.started"===a.type||"item.updated"===a.type||"item.completed"===a.type)&&("agent_message"===a.item.type||"mcp_tool_call"===a.item.type&&"failed"!==a.item.status);if(aO&&!S&&e&&(await aM?.(),S=!0),az&&await (0,T.assertExecutionExtensionCurrent)(az,{conversationId:aD,runId:aE}),W=!0,m&&"thread.started"!==a.type&&"turn.failed"!==a.type&&"error"!==a.type){let a=m;m=void 0,await a.acknowledge()}if(as?.()){aU=!0,q.abort();break}if("thread.started"===a.type){bt=a.thread_id;continue}if(a7.length>0&&(a8||a7.length>=32)){aO?q.abort():aT.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=l.get(b.id)??"",c=b.text.startsWith(a)?b.text.slice(a.length):b.text;c&&av?.({messageId:p(b.id),contentDelta:c}),l.set(b.id,b.text)}}if("item.completed"===a.type){let b=a.item;if("mcp_tool_call"===b.type&&"failed"===b.status){let a="flujo"===b.server?bb.find(a=>a.name===b.tool)?.name:void 0;X.error("Codex native MCP tool call failed",{code:"codex_native_mcp_tool_failed",category:function(a){let b=("string"==typeof a?a:"").slice(0,4096).toLowerCase();return/\btimeout\b|\btimed out\b/.test(b)?"timeout":/\b401\b|\bunauthorized\b/.test(b)?"authentication":/\b403\b|\bforbidden\b/.test(b)?"authorization":/\b429\b|\brate limit\b/.test(b)?"rate_limit":/\bconnection (?:closed|refused|reset)\b|\btransport error\b/.test(b)?"network":/\bmcp error:\s*-3260[02]\b|\binvalid (?:arguments|params)\b/.test(b)?"validation":"unknown"}(b.error?.message),...aE?{runId:aE}:{},...aF?{nodeId:aF}:{},tool:a??"unknown"})}let c=(0,Q.pt)(b);if(c.length>0&&"agent_message"!==b.type)a1({role:"assistant",content:"",media:c},p(b.id)),br=!0;else if("agent_message"===b.type){let a=(0,Q.pt)(b.content);if(a7.length>0){aO?q.abort():aT.abort();break}if(b.text||a.length>0){let c=b.phase;"final_answer"===c?bp=b.text:"commentary"!==c&&(bp+=(bp?"\n\n":"")+b.text),a1({role:"assistant",content:b.text,...a.length?{media:a}:{}},p(b.id)),br=!0}l.delete(b.id)}else"command_execution"===b.type?a6({id:`call_${(0,g.A)()}`,name:"shell",argsJson:JSON.stringify({command:b.command}),resultContent:b.aggregated_output??""}):"error"===b.type&&X.warn("Codex reported a non-fatal item",{message:b.message})}else"turn.completed"===a.type?(await aP?.observeSdkUsage(a),af||(Z=a.usage),bs=!0):"turn.failed"===a.type&&(b=Error(a.error?.message??"unknown error"));if(await s.poll(),c)break}}catch(a){if(k=!0,(0,e.Hd)(a))throw a;(0,n.Vj)(a),b??=a instanceof Error?a:Error(String(a))}finally{if(b||ax?.aborted){for(let[a,b]of l)b&&a1({role:"assistant",content:b},p(a));l.clear()}if(x?.closureConfirmed()&&(await aP.waitForExit(),a7.length&&aO&&!ax?.aborted)){if(!aO.confirmHandoffTermination)throw Error("Native handoff terminal confirmation is unavailable.");await aO.confirmHandoffTermination(a7.map(a=>a.id)),b=void 0,bs=!0}if(h&&aO&&aN?.(),await s.stop(),aT.signal.removeEventListener("abort",r),h&&aL){let a=aO&&(b||aT.signal.aborted)?ax?.aborted||aT.signal.aborted?"cancelled":"error":aU||a7.length>0?"completed":c||ax?.aborted?"cancelled":b?"error":"completed";try{await aL({dispatchId:h,outcome:a})}catch(a){if((0,e.Hd)(a)&&(k||b));else{if(aO||(0,e.Hd)(a))throw a;(0,n.Vj)(a),X.warn("Could not update Codex SDK request archive",a)}}}}if(d)throw d;if(ax?.aborted&&0===a7.length&&!aU)throw c?.requeue(),m?.requeue(),Error("Codex run cancelled by user.");if(m)throw m.requeue(),m=void 0,b??Error("Codex did not accept the steering input.");if(c){for(let[a,b]of l)b&&a1({role:"assistant",content:b},p(a));let a=c.messages,b=a.map(a=>"string"==typeof a.content?a.content:JSON.stringify(a.content)).join("\n\n");F=W?b:"string"==typeof D?`${D}
@@ -117,10 +117,10 @@ ${m}`:m}function o(a){return l.has(a)}function p(){return[{name:g,description:'C
117
117
  `).join("")),g().writeFileSync(e,c),h(),{filename:d,dispose:i}}catch(a){throw i(),a}}(B,l):void 0;x&&u.push("--env-file",x.filename),u.push(f.Id,...j.command);try{H=!0,a=(0,e.execFileSync)(j.dockerExecutable,[...D,...u],{env:z(),windowsHide:!0,timeout:5e3,maxBuffer:65536,stdio:["ignore","pipe","pipe"],encoding:"utf8"}).trim()}finally{x?.dispose()}if(!/^[a-f0-9]{64}$/.test(a)||F(`id=${a}`).join("\n")!==`${a} ${n}`)throw new w("ISOLATION_UNAVAILABLE");return!function(a,b){o(/^[a-f0-9]{64}$/.test(b.containerId)),o(/^sha256:[a-f0-9]{64}$/.test(b.imageId)),o(b.generation.length>0&&b.name.length>0),Array.isArray(a)&&o(1===a.length);let c=p(Array.isArray(a)?a[0]:a);o(c.Id===b.containerId&&c.Name===`/${b.name}`),o(c.Image===b.imageId&&0===c.RestartCount);let d=p(c.State);o("created"===d.Status&&!1===d.Running&&0===d.Pid&&!1===d.Paused&&!1===d.Restarting&&!1===d.Dead),o("0001-01-01T00:00:00Z"===d.StartedAt&&"0001-01-01T00:00:00Z"===d.FinishedAt);let e=p(c.Config);o(e.Image===b.imageId&&"65534:65534"===e.User),o(s(e.Cmd,b.policy.command));let f=p(e.Labels);o(f["co.flujo.mcp-generation"]===b.generation),o(f["co.flujo.mcp-ownership"]===b.ownershipKey),o(r(e.Volumes)),o(s(p(e.Healthcheck).Test,["NONE"]));let g=p(c.HostConfig);o(!0===g.ReadonlyRootfs&&!1===g.Privileged&&!0===g.Init),o("none"===g.NetworkMode&&!1===g.PublishAllPorts&&r(g.PortBindings));let h=p(c.NetworkSettings);for(let a of(o(Object.keys(p(h.Networks)).every(a=>"none"===a)),o(Object.values(null===h.Ports?{}:p(h.Ports)).every(a=>null===a)),o(q(g.CapAdd)),o(s(g.CapDrop,["ALL"])||s(g.CapDrop,["CAP_ALL"])),o(s(g.SecurityOpt,["no-new-privileges:true"])||s(g.SecurityOpt,["no-new-privileges"])),o(g.Memory===1024*b.policy.memoryMiB*1024&&g.MemorySwap===1024*b.policy.memoryMiB*1024),o(g.NanoCpus===Math.round(1e9*b.policy.cpus)&&g.PidsLimit===b.policy.pidsLimit),o(!1===g.OomKillDisable||null===g.OomKillDisable),o(0===g.CpuPeriod&&0===g.CpuQuota&&0===g.CpuRealtimePeriod&&0===g.CpuRealtimeRuntime),["PidMode","UTSMode","UsernsMode"]))o(""===g[a]||"private"===g[a]);for(let a of(o("private"===g.IpcMode&&"private"===g.CgroupnsMode),o(""===g.CgroupParent&&"runc"===g.Runtime),["Devices","DeviceCgroupRules","DeviceRequests","GroupAdd","Links","ExtraHosts"]))o(q(g[a]));o(r(g.Sysctls)&&r(g.Annotations)),o("none"===p(g.LogConfig).Type);let i=p(g.RestartPolicy);o("no"===i.Name&&0===i.MaximumRetryCount&&!1===g.AutoRemove),function(a,b,c){o(q(b.Binds)&&q(b.VolumesFrom));let d=void 0===b.Mounts&&0===c.mounts.length?[]:b.Mounts;o(Array.isArray(d)&&d.length===c.mounts.length),o(Array.isArray(a.Mounts)&&a.Mounts.length===c.mounts.length);let e=new Set(c.mounts.map(a=>a.target));o(e.size===c.mounts.length);let f=new Set;for(let a of d){let b=p(a),d=c.mounts.find(a=>a.target===b.Target);o(d&&"string"==typeof d.source&&d.source.length>0),o("bind"===b.Type&&b.Source===d.source&&!0===b.ReadOnly),o(!f.has(d.target)),f.add(d.target);let e=p(b.BindOptions);for(let a of(o(!0===e.NonRecursive),o(void 0===e.Propagation||""===e.Propagation||"rprivate"===e.Propagation),o(!0!==e.CreateMountpoint),["VolumeOptions","TmpfsOptions","ClusterOptions","ImageOptions"]))o(r(b[a]))}let g=new Set;for(let b of a.Mounts){let a=p(b);o("string"==typeof a.Destination&&e.has(a.Destination)),o(!g.has(a.Destination)),g.add(a.Destination),o("bind"===a.Type&&!1===a.RW),o("string"==typeof a.Source&&a.Source.length>0),o("rprivate"===a.Propagation)}let h=p(b.Tmpfs);o(1===Object.keys(h).length&&"string"==typeof h["/tmp"]);let i=h["/tmp"].split(","),j=["rw","noexec","nosuid","nodev","size=16m","mode=1777"];o(i.length===j.length&&new Set(i).size===j.length&&j.every(a=>i.includes(a))),o(1048576===b.ShmSize)}(c,g,b)}(JSON.parse(E(["container","inspect",a,"--format",'{"Id":{{json .Id}},"Name":{{json .Name}},"Image":{{json .Image}},"State":{{json .State}},"RestartCount":{{json .RestartCount}},"HostConfig":{{json .HostConfig}},"Mounts":{{json .Mounts}},"NetworkSettings":{{json .NetworkSettings}},"Config":{"Image":{{json .Config.Image}},"User":{{json .Config.User}},"Cmd":{{json .Config.Cmd}},"Labels":{{json .Config.Labels}},"Volumes":{{json .Config.Volumes}},"Healthcheck":{{json .Config.Healthcheck}}}}'])),{containerId:a,generation:n,name:t,imageId:f.Id,policy:j,mounts:v,ownershipKey:h?.key}),Object.freeze({command:j.dockerExecutable,args:Object.freeze([...D,"container","start","--attach","--interactive",a]),env:Object.freeze(z()),cwd:B,generation:n,containerId:a,...h?{ownershipKey:h.key}:{},close:()=>{if(b)return b;let c=G(a);return"unknown"!==c.outcome&&(b={outcome:c.outcome}),c}})}catch(a){if(H)try{let a=F(`name=^/${t}$`);1===a.length&&RegExp(`^[a-f0-9]{64} ${n}$`).test(a[0])&&G(a[0].split(" ")[0])}catch{}else C();if(a instanceof w)throw a;throw new w("ISOLATION_UNAVAILABLE")}}},561709:(a,b,c)=>{"use strict";c.d(b,{t:()=>k});var d=c(781630),e=c.n(d),f=c(455511),g=c(109035),h=c(402471),i=c(809676);let j=(0,c(482964).h)("backend/services/model/adapters/codexToolBridge");async function k(a,b,c=!1,d=!1){let l,m=(0,f.randomBytes)(16).toString("hex"),n=`/mcp/${m}`,o=e().createServer(async(e,f)=>{let k;if(!e.url||!e.url.startsWith(n))return void f.writeHead(404).end();let m=((k=new g.g({name:"flujo",version:"1.0.0"},{capabilities:{tools:{}},...b?{instructions:b}:{}})).setRequestHandler(i.gW,async()=>({tools:a.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema??{type:"object",properties:{}},...a.annotations?{annotations:a.annotations}:{}}))})),k.setRequestHandler(i.FT,async b=>{let e=a.find(a=>a.name===b.params.name);if(!e)return{content:[{type:"text",text:`Unknown tool: ${b.params.name}`}],isError:!0};try{let a=b.params._meta,f="string"==typeof a?.callId&&a.callId.trim()&&"string"==typeof a.threadId&&a.threadId.trim()?a.callId:void 0;return c&&f&&(d&&!l||l&&l!==a.threadId?f=void 0:l=a.threadId),await e.handler(b.params.arguments??{},c?f:void 0)}catch(a){return{content:[{type:"text",text:`Error: ${a instanceof Error?a.message:String(a)}`}],isError:!0}}}),k),o=new h.D({sessionIdGenerator:void 0,enableJsonResponse:!0});try{if(await m.connect(o),c&&"POST"===e.method){let a=[],b=0;for await(let c of e){let d=Buffer.isBuffer(c)?c:Buffer.from(c);if((b+=d.byteLength)>1048576)throw Error("Native tool request exceeds the bridge bound.");a.push(d)}let c=JSON.parse(Buffer.concat(a).toString("utf8"));if(!c||"object"!=typeof c||Array.isArray(c))throw Error("Invalid native tool request.");await o.handleRequest(e,f,c)}else await o.handleRequest(e,f)}catch(a){j.error("Codex tool-bridge request failed",a),f.headersSent||(f.writeHead(500,{"content-type":"application/json"}),f.end(JSON.stringify({error:"Internal bridge error."})))}finally{try{await o.close()}catch{}try{await m.close()}catch{}}});await new Promise((a,b)=>{o.once("error",b),o.listen(0,"127.0.0.1",()=>a())});let p=o.address();if(!p||"string"==typeof p)throw o.close(),Error("Codex tool bridge failed to bind a loopback port.");let q=`http://127.0.0.1:${p.port}${n}`;return j.debug("Codex tool bridge started",{port:p.port,toolCount:a.length}),{url:q,bindNativeThread:a=>{if(!c||"string"!=typeof a||!a.trim()||a.length>256||l&&l!==a)throw Error("Native Codex thread binding is unavailable.");l=a},close:()=>new Promise(a=>{o.closeAllConnections?.(),o.close(()=>a())})}}},566272:(a,b,c)=>{"use strict";c.d(b,{PF:()=>o,Qv:()=>k,Ui:()=>m,ae:()=>q,ij:()=>i,oH:()=>t});var d=c(130214),e=c(940110);function f(a){return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0}function g(a){let b=a.length-1;for(;b>=0;b--){let c=a[b];if(!("tool"===c.role||f(c)))break}let c=a.slice(b+1);return c.some(f)?c:[]}function h(a){let b=a.length;for(;b>0&&a[b-1].injected;)b--;return b===a.length?{base:a,injectedTail:[]}:{base:a.slice(0,b),injectedTail:a.slice(b)}}function i(a,b,c){let d;if(!b||"full-history"===b)return a;let{base:e,injectedTail:i}=h(a),j=e.filter(a=>"system"===a.role);if("isolated"===b)return[...j,{role:"user",content:c??"",id:"isolated-input",timestamp:0},...g(e),...i];let k=g(e),l=e.length-k.length,m=-1;for(let a=l-1;a>=0;a--)if("user"===e[a].role){m=a;break}if(-1===m)return a;for(let a=l-1;a>m;a--){let b=e[a];if("assistant"===b.role&&!f(b)){d=b;break}}return[...j,e[m],...d?[d]:[],...k,...i]}function j(a){return a.tool_calls.some(a=>"function"===a.type&&l(a.function.name))}function k(a,b){if(0===b.size)return a;let{base:c}=h(a),d=c.length-g(c).length,e=Array(d).fill(!1);for(let b=0;b<d;){let c=a[b].processNodeId,g=b;for(;g<d&&a[g].processNodeId===c;)g++;let h=!1;if(c)for(let c=b;c<g;c++){let b=a[c];if("assistant"===b.role&&n(b)&&(!f(b)||j(b))){h=!0;break}}for(let a=b;a<g;a++)e[a]=h;b=g}let i=new Set,k=[],l=!1;for(let c=0;c<a.length;c++){let g=a[c];if(c<d){if(f(g)&&g.processNodeId&&b.has(g.processNodeId)&&e[c]){for(let a of g.tool_calls)i.add(a.id);if(l=!0,j(g)&&n(g)){let{tool_calls:a,...b}=g;k.push(b)}continue}if("tool"===g.role&&g.tool_call_id&&i.has(g.tool_call_id)){l=!0;continue}}k.push(g)}return l?k:a}function l(a){return"handoff"===a||a.startsWith("handoff_to_")}function m(a,b){return[b,...a.filter(a=>"system"!==a.role)]}function n(a){return"string"==typeof a.content?a.content.trim().length>0:!!Array.isArray(a.content)&&a.content.length>0}function o(a,b){let c=new Set;for(let b of a)if("assistant"===b.role&&Array.isArray(b.tool_calls))for(let a of b.tool_calls)"function"===a.type&&l(a.function.name)&&c.add(a.id);let d=[];for(let f=0;f<a.length;f++){let g=a[f];if(("user"!==g.role||"string"!=typeof g.content||"The handoff was successful. Continue"!==g.content.trim())&&!("tool"===g.role&&g.tool_call_id&&c.has(g.tool_call_id))){if("assistant"===g.role&&Array.isArray(g.tool_calls)&&g.tool_calls.some(a=>"function"===a.type&&l(a.function.name))){let a=(0,e.n_)(g.tool_calls).filter(a=>!("function"===a.type&&l(a.function.name)));if(a.length>0)d.push({...g,tool_calls:a}),b?.push(f);else if(n(g)){let{tool_calls:a,...c}=g;d.push(c),b?.push(f)}continue}d.push(g),b?.push(f)}}return d}function p(a,b){let c=Array.isArray(a)?a.map(a=>({...a})):a?[{type:"text",text:a}]:[],e=new Set(c.map(a=>{let b=a.image_url??a.audio_url??a.video_url??a.file;return`${String(a.type??"")}|${JSON.stringify(b??"")}`})),f=["[Available generated artifacts]",...b.map((a,b)=>{let c=a.name?.trim()||`${a.type} ${b+1}`,d=a.mimeType?` (${a.mimeType})`:"";return a.localPath?`- ${c}${d}: ${a.localPath}`:a.resourceUri?`- ${c}${d}: ${a.resourceUri} (use read_resource to obtain a host-local path)`:a.url&&!a.url.startsWith("data:")?`- ${c}${d}: ${a.url}`:`- ${c}${d}: attached media`})].join("\n"),g=[...c].reverse().find(a=>"text"===a.type&&"string"==typeof a.text),h="string"==typeof g?.text?g.text:void 0;for(let a of(g&&h&&!h.includes(f)?g.text=`${h}
118
118
 
119
119
  ${f}`:g||c.push({type:"text",text:f}),b)){let b=function(a){let b=a.resourceUri??(0,d.C)(a);if(b)return"image"===a.type?{type:"image_url",image_url:{url:b}}:"audio"===a.type?{type:"audio_url",audio_url:{url:b,...a.mimeType?{mime_type:a.mimeType}:{}}}:"video"===a.type?{type:"video_url",video_url:{url:b,...a.mimeType?{mime_type:a.mimeType}:{}}}:{type:"file",file:{file_data:b,...a.name?{filename:a.name}:{},...a.mimeType?{mime_type:a.mimeType}:{}}}}(a);if(!b)continue;let f=b.image_url??b.audio_url??b.video_url??b.file,g=`${String(b.type??"")}|${JSON.stringify(f??"")}`;e.has(g)||(e.add(g),c.push(b))}return c}function q(a,b=!1,c){let d=[],e=[],f=(a,b)=>{d.push(a),c?.push(b)},g=()=>{0!==e.length&&(f({role:"user",content:p("[Media produced in the preceding turn]",e)}),e=[])},h=c?[]:void 0,i=o(a,h);for(let a=0;a<i.length;a++){let c=i[a],d=h?.[a],{id:j,timestamp:k,disabled:l,processNodeId:m,depth:n,usage:o,contextUsage:q,injected:r,agentMessage:s,media:t,providerMetadata:u,...v}=c,w=b&&u?{...v,providerMetadata:u}:v;if("tool"===w.role){t?.length&&e.push(...t),f(w,d);continue}if("assistant"===w.role){if(g(),Array.isArray(w.content)){let a=w.content.filter(a=>!!a&&"text"===a.type).map(a=>a.text).join("");f({...w,content:a||null},d)}else f(w,d);t?.length&&e.push(...t);continue}if("user"===w.role&&e.length>0){f({...w,content:p(w.content,e)},d),e=[];continue}f(w,d)}return g(),d}function r(a){return"string"==typeof a.content&&a.content.length>4e3?{...a,content:`${a.content.slice(0,4e3)}
120
- …[truncated ${a.content.length-4e3} chars]`}:a}function s(a){let b=new Set;for(let c of a)c.id&&b.add(c.id);return b}function t(a){let{threaded:b,foldedView:c,scopedView:d,systemContent:e,inputMode:f}=a,g=o(d),h=s(c),i=s(d),j=s(g),k=[],l=0,m=0,n=0,p=0;for(let a of b){let b={id:a.id,role:a.role,status:"sent",preview:function(a){if("string"==typeof a.content)return a.content.slice(0,300);if(Array.isArray(a.content))try{return JSON.stringify(a.content).slice(0,300)}catch{}return""}(a),toolCallNames:function(a){if("assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let b=a.tool_calls.map(a=>"function"===a.type?a.function.name:void 0).filter(a=>!!a);return b.length>0?b:void 0}}(a)};"system"===a.role?b.status="system":a.id&&j.has(a.id)?(b.status="sent",l++):a.id&&i.has(a.id)?(b.status="handoff-stripped",b.reason='Removed as FLUJO handoff plumbing (handoff tool-call / result, or synthetic "Continue").',p++):a.id&&h.has(a.id)?(b.status="scoped-out",b.reason=`Outside this node's input scope (inputMode: ${f??"full-history"}).`,n++):(b.status="folded",b.reason="Settled tool exchange folded away (a node with outputMode: latest-message).",m++),k.push(b)}return{systemMessage:null!=e?{content:e}:null,wireMessages:g.map(r),provenance:k,counts:{threaded:b.length,sent:l,folded:m,scopedOut:n,handoffStripped:p},inputMode:f}}},578615:(a,b,c)=>{"use strict";c.r(b),c.d(b,{loadServerConfigs:()=>q,loadServerRoots:()=>r,saveConfig:()=>t});var d=c(333873),e=c.n(d),f=c(881951),g=c(624788),h=c(621030),i=c(482964),j=c(328461),k=c(296951);let l=(0,i.h)("backend/services/mcp/config"),m=new Set(["streamable","sse","websocket"]),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Lp)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;let c;if(m.has(a.transport))return{type:"remote"};let d="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getWorkspaceDataDir)(),b);if(d&&""!==(c=e().relative(e().join((0,j.getWorkspaceDataDir)(),"mcp-servers"),d))&&!c.startsWith("..")&&!e().isAbsolute(c)){let a=await o(d);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){l.debug("Entering loadServerConfigs method");try{let a=await (0,g.loadItem)(h.Zg.MCP_SERVERS,{}),b=Object.entries(a).map(([a,b])=>{let c=(0,k.H6)(b.transport),d=a=>"string"==typeof a?(0,j.remapLegacyDefaultWorkspaceReference)(a,"mcp-servers"):void 0,e=a=>Array.isArray(a)?a.map(d).filter(a=>void 0!==a):void 0,f=a=>{if(!a||"object"!=typeof a||Array.isArray(a))return;let b={};for(let[c,e]of Object.entries(a)){if("string"==typeof e){b[c]=d(e)??e;continue}e&&"object"==typeof e&&"value"in e&&"string"==typeof e.value&&"metadata"in e&&e.metadata&&"object"==typeof e.metadata&&"isSecret"in e.metadata&&"boolean"==typeof e.metadata.isSecret&&(b[c]={value:d(e.value)??e.value,metadata:{isSecret:e.metadata.isSecret}})}return b},g=b.launch,h=g&&"object"==typeof g?{...g,command:d(g.command),cwd:d(g.cwd),args:e(g.args),env:f(g.env)}:void 0;b={...b,transport:c,rootPath:d(b.rootPath),cwd:d(b.cwd),command:d(b.command),args:e(b.args),roots:e(b.roots),env:f(b.env),...Object.prototype.hasOwnProperty.call(b,"launch")?{launch:h}:{}},m.has(c)&&function(a){if("string"!=typeof a)return!1;let b=a.trim();return"/"===b||"\\"===b||/^[A-Za-z]:[\\/]?$/.test(b)}(b.rootPath)&&(l.info(`Normalizing filesystem-root rootPath "${b.rootPath}" of remote server ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let i=b.source?.type;"stdio"===c&&"string"==typeof b.rootPath&&"."===b.rootPath.trim()&&("registry"===i||"marketplace"===i)&&/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(a)&&(l.info(`Normalizing shared Registry rootPath "." of ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let n={name:a,disabled:!1,rootPath:"",env:{},_buildCommand:"",_installCommand:""};return"streamable"===c?{...n,...b,name:a,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0,reconnectionOptions:b.reconnectionOptions&&"object"==typeof b.reconnectionOptions?b.reconnectionOptions:void 0,sessionId:b.sessionId||void 0,oauthClientId:b.oauthClientId||"",oauthClientSecret:b.oauthClientSecret||"",oauthScopes:b.oauthScopes||(b.oauthClientId||b.oauthClientInformation?["read"]:void 0),oauthClientMetadata:b.oauthClientMetadata,oauthClientInformation:b.oauthClientInformation,oauthTokens:b.oauthTokens,oauthCodeVerifier:b.oauthCodeVerifier}:"sse"===c?{...n,...b,name:a,eventSourceInit:b.eventSourceInit&&"object"==typeof b.eventSourceInit?b.eventSourceInit:void 0,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0}:"websocket"===c?{...n,...b,name:a,websocketUrl:b.websocketUrl||""}:{...n,...b,name:a,command:b.command||"",args:b.args||[],stderr:b.stderr||"pipe"}});return await Promise.all(b.map(async a=>{a.source||(a.source=await p(a))})),b}catch(a){if(a instanceof k.UQ)return l.warn("Stored MCP transport is invalid"),{success:!1,error:a.message,statusCode:400};return l.warn("Failed to load server configs",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async function r(a){let b=await q();if(!Array.isArray(b))return[];let c=b.find(b=>b.name===a)?.roots;return Array.isArray(c)?c.filter(a=>"string"==typeof a):[]}let s=["_buildCommand","_installCommand","oauthClientId","oauthClientSecret"];async function t(a){l.debug("Entering saveConfig method");try{for(let b of a.values())(0,k.SL)(b);let b=Object.fromEntries(Array.from(a.entries()).map(([a,b])=>[a,function(a){let{name:b,...c}=a,d={};for(let[a,b]of Object.entries(c))void 0!==b&&(""===b&&s.includes(a)||(d[a]=b));return d}(b)]));return await (0,g.VH)(h.Zg.MCP_SERVERS,b),{success:!0}}catch(a){if(a instanceof k.UQ)return l.warn("MCP transport is invalid"),{success:!1,error:a.message,statusCode:400};return l.warn("Failed to save config",a),{success:!1,error:`Failed to save config: ${a instanceof Error?a.message:"Unknown error"}`}}}},580118:(a,b,c)=>{"use strict";c.d(b,{$Y:()=>h,Rn:()=>i,b4:()=>j});var d=c(482964),e=c(943990);let f=(0,d.h)("backend/services/model/mediaHandoff");function g(a){return null===a||"object"!=typeof a||Array.isArray(a)?void 0:a}async function h(a,b){let c=!1,d=await Promise.all(a.map(async a=>{if(!a.resourceUri?.startsWith("flujo://run/"))return a;let d=()=>(0,e.QT)(a.resourceUri),f=b?await b(d):await d();if(f===a.localPath)return a;c=!0;let{localPath:g,...h}=a;return f?{...h,localPath:f}:h}));return c?d:a}function i(a,b){if(!b?.length)return a;let c=new Set(b.map(a=>a.toLowerCase()));return c.has("vision")&&c.add("image"),(c.has("document")||c.has("pdf"))&&c.add("file"),a.map(a=>{if(!Array.isArray(a.content))return a;let b=a.content.filter(a=>{let b="image_url"===a.type||"input_image"===a.type?"image":"audio_url"===a.type||"input_audio"===a.type?"audio":"video_url"===a.type||"input_video"===a.type?"video":"file"===a.type||"input_file"===a.type?"file":void 0;return!b||c.has(b)});return b.length===a.content.length?a:{...a,content:b}})}async function j(a,b,c={}){return Promise.all(a.map(async a=>{if(!Array.isArray(a.content))return a;let d=await Promise.all(a.content.map(async a=>{let d=function(a){if("image_url"===a.type){let b=g(a.image_url)?.url;return"string"==typeof b?b:void 0}if("audio_url"===a.type){let b=g(a.audio_url)?.url;return"string"==typeof b?b:void 0}if("video_url"===a.type){let b=g(a.video_url)?.url;return"string"==typeof b?b:void 0}if("file"===a.type||"input_file"===a.type){let b=g(a.file)??a,c=b.file_data??b.file_url??b.url;return"string"==typeof c?c:void 0}}(a);if(!d?.startsWith("flujo://run/"))return a;let h=null;try{let a=()=>(0,e.gy)(d,{at:Date.now(),source:"node",nodeId:b});h=c.commitDurableMutation?await c.commitDurableMutation(a):await a()}catch(a){if(a?.code==="flow_execution_authority_lost")throw a;f.warn(`Failed to read media run resource ${d}; sending a placeholder instead`,a)}let i=h?.contents.contents[0],j=i&&"string"==typeof i.blob?i.blob:void 0;if(!h||!j)return f.warn(`Media run resource is unavailable, degrading to a text note: ${d}`),{type:"text",text:`[media attachment unavailable — its stored payload (${d}) could not be read; it may have passed the run-resource retention window]`};let k=i.mimeType??h.entry.mimeType??"application/octet-stream";return function(a,b,c,d,e){if("image_url"===a.type)return{...a,image_url:{...g(a.image_url),url:b}};if("video_url"===a.type)return{...a,video_url:{...g(a.video_url),url:b,mime_type:c}};if("audio_url"===a.type){let f="audio/mpeg"===c?"mp3":"audio/wav"===c||"audio/x-wav"===c?"wav":void 0;return f?{type:"input_audio",input_audio:{data:d,format:f}}:e?{type:"text",text:`[${c} audio attachment is available as an artifact but this OpenAI input channel accepts only MP3 or WAV]`}:{...a,audio_url:{...g(a.audio_url),url:b,mime_type:c}}}return"file"===a.type||"input_file"===a.type?{type:"file",file:{...g(a.file)??a,file_data:b,mime_type:c}}:a}(a,`data:${k};base64,${j}`,k,j,!0===c.strictOpenAiAudioFormats)}));return{...a,content:d}}))}},584861:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{McpRuntimeAuthorityRetirementError:()=>as,assertMcpRuntimeAuthorityRetired:()=>X,attachShippedWorkspaceReadiness:()=>aj,capabilityKey:()=>U,clientProtectedConfigFingerprint:()=>T,createNewClient:()=>af,createStdioTransport:()=>ak,createTransport:()=>ag,flattenCustomHeaders:()=>aa,getUnderlyingTransport:()=>$,httpConfigKey:()=>ae,isolatedStdioRuntime:()=>ah,protectedConfigFingerprint:()=>S,resolveConfigHeaders:()=>_,resolveStdioLaunch:()=>ai,retireMcpRuntimeAuthority:()=>Z,safelyCloseClient:()=>am,shouldRecreateClient:()=>al,stdioConfigKey:()=>ad});var e=c(275424),f=c(894603),g=c(560921),h=c(687720),i=c(877506),j=c(646460),k=c(405087),l=c(200797),m=c(240505),n=c(302292),o=c(671675),p=c(231318),q=c(629021),r=c(333873),s=c(321820),t=c(977598),u=c(883191),v=c(482964),w=c(296951),x=c(687161),y=c(510217),z=c(826652),A=c(298683),B=c(230314),C=c(193640),D=c(533102),E=c(328461),F=c(84022),G=c(989031),H=c(868644),I=c(622838),J=c(749976),K=c(618836),L=c(471533),M=c(845157),N=c(216085),O=c(214799),P=c(378591),Q=c(589193),R=a([I]);I=(R.then?(await R)():R)[0];let an=globalThis,ao=an.__flujoProtectedConfigFingerprintKey??=(0,t.randomBytes)(32);function S(a){return(0,t.createHmac)("sha256",ao).update(JSON.stringify(a)).digest("hex")}function T(a){return a.__flujoProtectedConfigFingerprint}function U(a){return[(0,I.PP)(a),(0,J.NJ)(a),!0===a.enableMcpApps?"mcp-apps:on":"mcp-apps:off",!0===a.enableMcpSkills?"mcp-skills:on":"mcp-skills:off"].join("|")}let ap=Symbol.for("FLUJO:mcp-authority-retirement-errors:v1"),aq=Object.getOwnPropertyDescriptor(globalThis,ap);if(aq&&(!("value"in aq)||aq.configurable||aq.writable||!(aq.value instanceof WeakSet)))throw Error("MCP retirement error provenance refused.");let ar=aq?.value??new WeakSet;aq||Object.defineProperty(globalThis,ap,{value:ar,writable:!1,configurable:!1,enumerable:!1});class as extends AggregateError{constructor(a,b,c){super(a,b,c),WeakSet.prototype.add.call(ar,this)}static[Symbol.hasInstance](a){return!!a&&"object"==typeof a&&WeakSet.prototype.has.call(ar,a)}}function V(){return globalThis.__flujo_mcp_authority_retirement_quarantines??=new Map}function W(a,b=(0,E.getCurrentWorkspace)()){return`${b}\0${a}`}function X(a){let b=V().get(W(a));if(b)throw b.error}function Y(a,b,c,d){let e=V(),f=W(a,b);d?e.set(f,{owner:c,error:d}):e.get(f)?.owner===c&&e.delete(f)}function Z(a,b,c,d){let f=[];try{c&&(0,e.p9)(c)}catch(a){f.push(a)}try{(0,P.tS)(d?.leaseId)}catch(a){f.push(a)}if(f.length){let e=new as(f,"MCP runtime authority retirement failed.",{cause:f[0]});throw Y(a,b,c??d,e),e}Y(a,b,c??d)}function $(a){let b=a,c=new Set;for(;b&&"object"==typeof b&&!c.has(b);){c.add(b);let a=b.__flujoInnerTransport;if(!a)break;b=a}return b}let at=(0,v.h)("backend/services/mcp/connection");async function _(a){let b=a;if(a.env&&"object"==typeof a.env){let c=new Map;for(let[b,d]of Object.entries(a.env)){if(!(0,M.dR)(b))continue;let a=(0,M.ff)(d);if(!a||(0,L.uh)(a))continue;let e=await (0,K.G)(a);e&&c.set(b,e)}b={...b,env:(0,M.ln)(c)}}if("streamable"!==a.transport&&"sse"!==a.transport||!a.headers||"object"!=typeof a.headers)return b;let c=new Map;for(let[b,d]of Object.entries(a.headers)){if(!(0,M.pI)(b))continue;let a=(0,M.ff)(d);if(!a||(0,L.uh)(a))continue;let e=await (0,K.G)(a);e&&c.set(b,e)}return{...b,headers:(0,M.ln)(c)}}function aa(a){let b=new Map;for(let[c,d]of Object.entries(a)){if(!(0,M.pI)(c))continue;let a=(0,M.ff)(d);"string"==typeof a&&a.length>0&&b.set(c,a)}return(0,M.ln)(b)}function ab(a){let b=new Map;if(a)for(let[c,d]of Object.entries(a)){if(!(0,M.dR)(c))continue;let a=(0,M.ff)(d);void 0!==a&&b.set(c,a)}return(0,M.ln)(b)}let au=new Set(["path","pathext","home","userprofile","homedrive","homepath","appdata","localappdata","programdata","xdg_config_home","xdg_cache_home","xdg_data_home","xdg_state_home","xdg_runtime_dir","tmp","temp","tmpdir","shell","comspec","systemroot","windir","systemdrive","programfiles","programfiles(x86)","gh_config_dir"]);function ac(a,b,c){for(let c of Object.keys(a))c.toLowerCase()===b.toLowerCase()&&delete a[c];void 0!==c&&(a[b]=c)}function ad(a,b=!1){return JSON.stringify({command:a.command,args:a.args??[],env:ab(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??"",isolateRuntimeHome:b,isolation:a.isolation,trustedHost:a.trustedHost})}function ae(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??"",oauthIssuer:a.oauthIssuer??"",oauthClientInformation:a.oauthClientInformation??{},oauthClientSecret:a.oauthClientSecret??"",oauthTokens:a.oauthTokens??{}})}function af(a){if(at.debug("Entering createNewClient method"),(0,l.isProtectedExecutionServer)(a.name)){(0,l.assertExecutionServerConfig)(a);let b=new f.tI({name:`flujo-${a.name}-client`,version:"3.48.6"},{capabilities:{}});return b.__flujoCapKey=U(a),Object.defineProperty(b,"__flujoProtectedConfigFingerprint",{value:S(a),enumerable:!1}),b}let b=(0,I.jV)(a),c=(0,J.fy)(a),d=!0===a.enableMcpApps,e="stdio"===a.transport&&void 0===a.isolation,g=new f.tI({name:`flujo-${a.name}-client`,version:"3.48.6"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{},...e||c?{elicitation:{...e?{url:{}}:{},...c?{form:{}}:{}}}:{},extensions:{...!0===a.enableMcpSkills?{[x.ET]:{}}:{},...e?{[O.OM]:O.XC}:{},...d?{[N.OF]:{mimeTypes:[N.cM]}}:{}}}});return(0,H.FP)(g,a),b&&(0,I.LE)(g,a),(e||c)&&(0,J.n4)(g,a),g.__flujoCapKey=U(a),g}function ag(a,b){if((0,w.SL)(a),at.debug("Entering createTransport method"),(void 0!==a.isolation||void 0!==a.trustedHost)&&"stdio"!==a.transport)throw new g.Bk("ISOLATION_POLICY_INVALID");if("streamable"===a.transport){at.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=aa(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},at.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}if(a.oauthClientId||a.oauthClientInformation){at.info(`Setting up OAuth authentication for ${a.name}`);let c=(0,y.Cl)(a);b.authProvider=c,b.fetch=c.oauthFetch,a.oauthTokens?at.debug(`OAuth provider configured for ${a.name} with existing tokens`):at.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)}else at.debug(`No OAuth configuration found for ${a.name}`);let c=new o.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ae(a),c}if("sse"===a.transport){at.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=aa(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},at.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new p.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ae(a),c}return"websocket"===a.transport?(at.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new n.I(new URL(a.websocketUrl))):ak(a,b)}function ah(a){let b=(0,E.getWorkspaceDataDir)(),c=(0,t.createHash)("sha256").update(a,"utf8").digest("hex").slice(0,24),d=new u.V(b),e=b;for(let a of["userdata","mcp-runtime",c])e=r.join(e,a),d.admit(e,a===c);let f=e,g=r.join(f,"home"),h=r.join(f,"cwd");d.admit(g),d.admit(h);let i={appData:r.join(g,"AppData","Roaming"),localAppData:r.join(g,"AppData","Local"),config:r.join(g,".config"),cache:r.join(g,".cache"),data:r.join(g,".local","share"),state:r.join(g,".local","state"),runtime:r.join(g,".runtime"),temp:r.join(g,"tmp"),npm:r.join(g,".npm"),pip:r.join(g,".cache","pip"),uv:r.join(g,".cache","uv")};for(let a of Object.values(i)){let b=r.relative(g,a),c=g;for(let a of b.split(r.sep).filter(Boolean))c=r.join(c,a),d.admit(c)}let j={HOME:g,USERPROFILE:g,APPDATA:i.appData,LOCALAPPDATA:i.localAppData,XDG_CONFIG_HOME:i.config,XDG_CACHE_HOME:i.cache,XDG_DATA_HOME:i.data,XDG_STATE_HOME:i.state,XDG_RUNTIME_DIR:i.runtime,TMPDIR:i.temp,TMP:i.temp,TEMP:i.temp,NPM_CONFIG_CACHE:i.npm,PIP_CACHE_DIR:i.pip,UV_CACHE_DIR:i.uv,FLUJO_PARENT_DATA_DIR:(0,B.ok)(),FLUJO_DATA_DIR:b,FLUJO_WORKSPACE:(0,E.getCurrentWorkspace)()};if("win32"===process.platform){let a=r.parse(g);j.HOMEDRIVE=a.root.replace(/[\\/]$/,""),j.HOMEPATH=g.slice(a.root.length-1)}return d.verify(),{cwd:h,env:j}}function ai(a,b){if("stdio"!==a.transport)throw new w.UQ;if(void 0!==a.isolation){if(void 0!==a.trustedHost)throw new g.Bk("ISOLATION_POLICY_INVALID");let b=(0,k.O0)(a,ab(a.env)),{launch:c}=b;return{command:c.command,args:[...c.args],env:(0,k.H2)(c),cwd:c.cwd,isolation:b}}if((0,k.iw)(a),void 0!==a.trustedHost){let c=(0,h.FN)(a),d=(0,i.vb)(a),e=b?.isolateRuntimeHome===!0;if(e!==("isolated"===d.policy.runtimeHome))throw new i.Kq("HOST_POLICY_INVALID");if(e){let b=ah(a.name);if(d.policy.packageRunner&&r.resolve(a.cwd)!==r.resolve(b.cwd))throw new i.Kq("HOST_POLICY_INVALID");for(let[a,e]of Object.entries(b.env)){if(!d.policy.environmentNames.includes(a))throw new i.Kq("HOST_POLICY_INVALID");if(d.policy.packageRunner){let b=Object.entries(c.env).find(([b])=>b.toUpperCase()===a.toUpperCase())?.[1];if(b&&b!==e)throw new i.Kq("HOST_POLICY_INVALID")}c.env[a]=e}if(d.policy.packageRunner){let a=c.args.findIndex(a=>a.startsWith("--cache="));if(a<0)throw new i.Kq("HOST_POLICY_INVALID");c.args[a]=`--cache=${b.env.NPM_CONFIG_CACHE}`}}return at.debug("Transformed environment variable names",Object.keys(c.env)),c}let c=(0,F.AW)(a),d=!!c,e=c?.defaultName==="bash",f=a=>d?a:(0,E.remapLegacyDefaultWorkspaceReference)(a,"mcp-servers"),j=f(a.command),l=a.args?a.args.map(f):[],m=`${x.VL}/${a.name}`;at.info(`Creating stdio transport for server ${a.name}`),at.debug(`Original command: ${j}`),at.debug(`Original args: ${JSON.stringify(l)}`),at.debug(`Server directory: ${m}`);let n=!r.isAbsolute(j)&&(j.includes("/")||j.includes("\\")),o=!j.includes("/")&&!j.includes("\\");if(at.debug(`Is relative path: ${n}`),at.debug(`Is just filename: ${o}`),"win32"===s.platform()&&j.toLowerCase().endsWith(".bat"))if(at.debug(`Detected .bat file on Windows: ${j}`),o){let a=r.join((0,E.getWorkspaceDataDir)(),m,j);at.debug(`Checking if file exists at: ${a}`);let b=q.existsSync(a);at.debug(`File exists: ${b}`),b?(at.debug(`Using full path to .bat file: ${a}`),l=["/c",a,...l]):(at.warn(`WARNING: .bat file not found at ${a}`),l=["/c",j,...l]),j="cmd.exe"}else at.debug(`Using cmd.exe with path as provided: ${j}`),l=["/c",j,...l],j="cmd.exe";let p=(0,D.u)(j,{execPath:process.execPath,platform:s.platform(),dirname:r.dirname,joinPath:r.join,fileExists:q.existsSync});p!==j&&(at.debug(`Resolved Node toolchain command "${j}" to absolute path: ${p}`),j=p),at.debug(`Final command: ${j}`),at.debug(`Final args: ${JSON.stringify(l)}`);let t=e||b?.isolateRuntimeHome!==!0?void 0:ah(a.name),u=f((0,C.u)({command:a.command,args:a.args,rootPath:a.rootPath,cwd:a.cwd,serverName:a.name,defaultCwd:`${x.VL}/${a.name}`,packageRunnerCwd:t?.cwd})),v=r.isAbsolute(u)?u:r.join((0,E.getWorkspaceDataDir)(),u);at.debug(`cwd: ${v}`);let y=ab(a.env),z=e?function(a){let b={...a},c=Object.entries(process.env).filter(a=>"string"==typeof a[1]);for(let[a,d]of c)ac(b,a,d);for(let a of au)c.find(([b])=>b.toLowerCase()===a)||ac(b,a,void 0);return b}(y):y;if(!d)for(let[a,b]of Object.entries(z))z[a]=f(b);t&&Object.assign(z,t.env),function(a){if("win32"!==process.platform)return;let b=(a,b)=>Object.entries(a).find(([a,c])=>a.toLowerCase()===b.toLowerCase()&&""!==(c??"").trim())?.[1],c=b(process.env,"SystemRoot")??b(process.env,"windir")??"C:\\Windows";for(let[d,e]of Object.entries({SystemRoot:c,windir:c,ComSpec:b(process.env,"ComSpec")??r.join(c,"System32","cmd.exe"),PATHEXT:b(process.env,"PATHEXT")??".COM;.EXE;.BAT;.CMD"}))if(void 0===b(a,d)){for(let b of Object.keys(a))b.toLowerCase()===d.toLowerCase()&&delete a[b];a[d]=e}}(z);let A=(0,B.ok)(),G=(0,E.getWorkspaceDataDir)();if(z.FLUJO_PARENT_DATA_DIR=A,z.FLUJO_DATA_DIR=G,z.FLUJO_WORKSPACE=(0,E.getCurrentWorkspace)(),c?.defaultName==="browser"){if(!z.PLAYWRIGHT_BROWSERS_PATH?.trim()){let a=(0,F.AI)(process.env);a&&(z.PLAYWRIGHT_BROWSERS_PATH=a)}z.FLUJO_BROWSER_PROFILE_DIR=r.join(G,"browser-profile","trusted"),z.FLUJO_BROWSER_SCREENSHOT_DIR=r.join(G,"screenshots","browser"),z.FLUJO_BROWSER_RECORD_DIR=r.join(G,"recordings","browser")}for(let a of Object.keys(z))a.toUpperCase()===Q.wd&&delete z[a];at.verbose("Transformed environment variable names",JSON.stringify(Object.keys(z)));let H=(0,Q.hz)(a);return H&&(z[Q.wd]=H),"1"===process.env.FLUJO_WORKER_MODE&&c?.defaultName==="flujo"&&(z.FLUJO_WORKER_MODE="1",process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN&&(z.FLUJO_SNAPSHOT_CONTROL_TOKEN=process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN)),{command:j,args:l,env:z,cwd:v}}function aj(a,b,c){let d=(0,F.AW)(b),e=(0,E.getWorkspaceDataDir)();if(!d||r.resolve(c)!==r.resolve(e,"mcp-servers",d.packageDirectory))return;let f=a.start.bind(a);a.start=async()=>{await (0,G._F)(e,void 0,[d.packageDirectory]),await f()}}function ak(a,b){let c,d,f;if(at.debug("Entering createStdioTransport method"),"stdio"!==a.transport)throw Error("Cannot create stdio transport for non-stdio config");let{command:g,args:i,env:l,cwd:n,isolation:o}=ai(a,b),p=(0,E.getCurrentWorkspace)(),q=()=>Z(a.name,p,d,c);at.info(`Creating StdioClientTransport for ${a.name} with stderr: 'pipe'`);try{X(a.name),d=(0,e.bG)(a),c=b?.enableRuntimeBroker&&!0===a.enableMcpApps?(0,P.D9)(a.name):void 0;let p=d?(0,e.Uf)(a,d):{},r={command:g,args:i,env:{...l,...c?a.trustedHost?(0,h.s7)(a,c.env):c.env:{},...p},cwd:n,stderr:o?"ignore":"pipe",...o?{maxBufferSize:262144}:{}};o||(Object.freeze(r.args),Object.freeze(r.env),Object.freeze(r)),f=new m.oQ(r),o?(0,k.We)(f,a,o,q):a.trustedHost?(0,h.Zu)(f,a,q,d):(aj(f,a,n),(0,j.uR)(f,a,a=>JSON.stringify([ad(a,b?.isolateRuntimeHome===!0),U(a)])))}catch(b){let a=[];try{o?.close()}catch(b){a.push(b)}try{q()}catch(b){a.push(b)}if(a.length)throw new as([b,...a],"MCP transport creation and authority retirement failed.",{cause:b});throw b}return c&&(f.__flujoRuntimeBrokerLeaseId=c.leaseId),f.__flujoBundledWorkload=d,f.__flujoRetireRuntimeAuthority=q,f.__flujoStdioKey=ad(a,b?.isolateRuntimeHome===!0),f.stderr?at.info(`Stderr stream is available for ${a.name}`):at.warn(`Stderr stream is NOT available for ${a.name}`),f}function al(a,b,c=!1,d){if(at.debug("Entering shouldRecreateClient method"),(0,z.wk)(a))return{needsNewClient:!0,reason:"Existing connection is closed"};if((a.__flujoCapKey??"")!==U(b))return{needsNewClient:!0,reason:"Client capabilities (sampling/elicitation/MCP Apps/Skills) changed"};let e=!0===a.__flujoBeta,f=c&&"websocket"!==b.transport;if(e!==f)return{needsNewClient:!0,reason:f?"Beta MCP protocol enabled":"Beta MCP protocol disabled"};if(e){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!==ad(b,d?.isolateRuntimeHome===!0))return{needsNewClient:!0,reason:"Connection parameters changed"}}else if(c.__flujoHttpKey!==ae(b))return{needsNewClient:!0,reason:`${b.transport} auth/connection parameters changed`};return{needsNewClient:!1}}if("websocket"===b.transport){if(!(a.transport instanceof n.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof o.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!==ae(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof p.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!==ae(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof m.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!==ad(b,d?.isolateRuntimeHome===!0))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}async function am(a,b,c,d){let f,g;at.debug("Entering safelyCloseClient method");let h=Date.now(),i=d?.gracePeriodMs??15e3,j=d?.killEscalationMs??5e3,l=!1,m=!1,n=$(a.transport),o=(0,k.Ck)(n),p=n?._process,q=p&&"function"==typeof p.kill?"owned":c&&"stdio"!==c.transport?"external":"unknown",r="none",s=[];try{if(p&&"function"==typeof p.kill&&(l=null!==p.exitCode||null!==p.signalCode,null===p.exitCode&&null===p.signalCode)){try{p.stdin&&!p.stdin.destroyed&&(p.stdin.end(),at.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){at.warn(`Error closing stdin for ${b}:`,a)}if(l=await (null!==p.exitCode||null!==p.signalCode?Promise.resolve(!0):new Promise(a=>{let b=()=>{clearTimeout(c),a(!0)},c=setTimeout(()=>{p.removeListener("exit",b),a(!1)},i);c.unref?.(),p.once("exit",b)})))at.info(`Process exited gracefully for ${b}`);else{at.warn(`Process did not exit within ${i}ms after stdin close; escalating to a tree kill for ${b}`);let a=await (0,A.U)(p,{graceMs:j,finalWaitMs:j});l=a.exited,m=a.forced,l?at.warn(`Process tree for ${b} force-terminated after ${a.durationMs}ms`):at.error(`Process tree for ${b} (pid ${a.pid??"unknown"}) did not exit after forced escalation`)}}await a.close(),at.info(`Client closed successfully for ${b}`)}catch(a){r="close_failed",g=a,at.warn(`Error closing client for ${b}:`,a)}finally{try{f=o?.close()}catch(a){s.push(a)}let a=n?.__flujoRetireRuntimeAuthority;if(a)try{a()}catch(a){s.push(a)}else{try{let a=n?.__flujoBundledWorkload;a&&(0,e.p9)(a)}catch(a){s.push(a)}try{(0,P.tS)(n?.__flujoRuntimeBrokerLeaseId)}catch(a){s.push(a)}}}"owned"===q&&p&&(l||=null!==p.exitCode||null!==p.signalCode),f?.outcome==="unknown"&&(l=!1);let t="external"===q?"not_applicable":l?"observed_exit":"unknown";"unknown"===t&&"none"===r&&(r="exit_unobserved");let u={exited:l,forced:m,durationMs:Date.now()-h,processOwnership:q,exitOutcome:t,errorClassification:r,...o&&f?{isolation:{schemaVersion:1,generation:o.launch.generation,cleanupOutcome:f.outcome}}:{}};if(s.length){let a=void 0===g?s:[g,...s];throw Object.assign(new as(a,"MCP shutdown authority retirement failed.",{cause:a[0]}),{shutdownObservation:u})}return u}d()}catch(a){d(a)}})},585029:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{v:()=>o});var e=c(787951),f=c(482964),g=c(340653),h=c(3924),i=c(373327),j=c(146188),k=c(768680),l=c(748633),m=a([g,i]);[g,i]=m.then?(await m)():m;let n=(0,f.h)("backend/flow/execution/nodes/MCPNode");class o extends e.Yp{async prep(a,b){n.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw n.error("Missing bound server"),Error("MCP node requires a bound server");return n.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){n.info("execCore() started",{mcpServer:a.mcpServer}),n.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await g.z.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw n.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return n.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),n.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return n.error("execCore() failed",{error:a.error}),n.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(n.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),n.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),k.Gv.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),n.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a,e=d?.properties?.toolTimeout;try{let c=await i.mcpService.loadServerConfigs?.();a=Array.isArray(c)?c.find(a=>a.name===b.server):void 0}catch(a){n.warn("Could not load server-wide tool parameter presets",a)}let f=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>{let f=(0,l.Ge)(a?.toolParameterPresets,d?.properties?.toolParameterPresets,c.name),g=(0,h.az)(c.inputSchema);return i.mcpService.setToolSchemaHash(b.server,c.name,g),{...c,inputSchema:(0,l.Qm)(c.inputSchema,f),originalName:c.name,server:b.server,nodeId:d?.id,name:(0,h.Y6)(b.server,c.name),timeout:e,clientGeneration:i.mcpService.getClientGeneration(b.server),schemaHash:g,uiResourceUri:(0,j.Gt)(c._meta),...Object.keys(f).length>0?{presetArgs:f}:{}}});if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of f)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:f};for(let a of(c.toolNameMap=c.toolNameMap||{},f))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout,nodeId:d?.id,clientGeneration:a.clientGeneration,schemaHash:a.schemaHash,annotations:a.annotations,uiResourceUri:a.uiResourceUri,presetArgs:a.presetArgs};let g=f.map(a=>a.name);n.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:f.length,availableToolNames:g.length>10?g.slice(0,10).join(", ")+"...":g.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}n.info("post() completed"),n.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(n.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return n.info(`Returning action: ${a}`),a}return"default"}_clone(){return new o}}d()}catch(a){d(a)}})},586278:(a,b,c)=>{"use strict";function d(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:
120
+ …[truncated ${a.content.length-4e3} chars]`}:a}function s(a){let b=new Set;for(let c of a)c.id&&b.add(c.id);return b}function t(a){let{threaded:b,foldedView:c,scopedView:d,systemContent:e,inputMode:f}=a,g=o(d),h=s(c),i=s(d),j=s(g),k=[],l=0,m=0,n=0,p=0;for(let a of b){let b={id:a.id,role:a.role,status:"sent",preview:function(a){if("string"==typeof a.content)return a.content.slice(0,300);if(Array.isArray(a.content))try{return JSON.stringify(a.content).slice(0,300)}catch{}return""}(a),toolCallNames:function(a){if("assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let b=a.tool_calls.map(a=>"function"===a.type?a.function.name:void 0).filter(a=>!!a);return b.length>0?b:void 0}}(a)};"system"===a.role?b.status="system":a.id&&j.has(a.id)?(b.status="sent",l++):a.id&&i.has(a.id)?(b.status="handoff-stripped",b.reason='Removed as FLUJO handoff plumbing (handoff tool-call / result, or synthetic "Continue").',p++):a.id&&h.has(a.id)?(b.status="scoped-out",b.reason=`Outside this node's input scope (inputMode: ${f??"full-history"}).`,n++):(b.status="folded",b.reason="Settled tool exchange folded away (a node with outputMode: latest-message).",m++),k.push(b)}return{systemMessage:null!=e?{content:e}:null,wireMessages:g.map(r),provenance:k,counts:{threaded:b.length,sent:l,folded:m,scopedOut:n,handoffStripped:p},inputMode:f}}},578615:(a,b,c)=>{"use strict";c.r(b),c.d(b,{loadServerConfigs:()=>q,loadServerRoots:()=>r,saveConfig:()=>t});var d=c(333873),e=c.n(d),f=c(881951),g=c(624788),h=c(621030),i=c(482964),j=c(328461),k=c(296951);let l=(0,i.h)("backend/services/mcp/config"),m=new Set(["streamable","sse","websocket"]),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Lp)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;let c;if(m.has(a.transport))return{type:"remote"};let d="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getWorkspaceDataDir)(),b);if(d&&""!==(c=e().relative(e().join((0,j.getWorkspaceDataDir)(),"mcp-servers"),d))&&!c.startsWith("..")&&!e().isAbsolute(c)){let a=await o(d);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){l.debug("Entering loadServerConfigs method");try{let a=await (0,g.loadItem)(h.Zg.MCP_SERVERS,{}),b=Object.entries(a).map(([a,b])=>{let c=(0,k.H6)(b.transport),d=a=>"string"==typeof a?(0,j.remapLegacyDefaultWorkspaceReference)(a,"mcp-servers"):void 0,e=a=>Array.isArray(a)?a.map(d).filter(a=>void 0!==a):void 0,f=a=>{if(!a||"object"!=typeof a||Array.isArray(a))return;let b={};for(let[c,e]of Object.entries(a)){if("string"==typeof e){b[c]=d(e)??e;continue}e&&"object"==typeof e&&"value"in e&&"string"==typeof e.value&&"metadata"in e&&e.metadata&&"object"==typeof e.metadata&&"isSecret"in e.metadata&&"boolean"==typeof e.metadata.isSecret&&(b[c]={value:d(e.value)??e.value,metadata:{isSecret:e.metadata.isSecret}})}return b},g=b.launch,h=g&&"object"==typeof g?{...g,command:d(g.command),cwd:d(g.cwd),args:e(g.args),env:f(g.env)}:void 0;b={...b,transport:c,rootPath:d(b.rootPath),cwd:d(b.cwd),command:d(b.command),args:e(b.args),roots:e(b.roots),env:f(b.env),...Object.prototype.hasOwnProperty.call(b,"launch")?{launch:h}:{}},m.has(c)&&function(a){if("string"!=typeof a)return!1;let b=a.trim();return"/"===b||"\\"===b||/^[A-Za-z]:[\\/]?$/.test(b)}(b.rootPath)&&(l.info(`Normalizing filesystem-root rootPath "${b.rootPath}" of remote server ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let i=b.source?.type;"stdio"===c&&"string"==typeof b.rootPath&&"."===b.rootPath.trim()&&("registry"===i||"marketplace"===i)&&/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(a)&&(l.info(`Normalizing shared Registry rootPath "." of ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let n={name:a,disabled:!1,rootPath:"",env:{},_buildCommand:"",_installCommand:""};return"streamable"===c?{...n,...b,name:a,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0,reconnectionOptions:b.reconnectionOptions&&"object"==typeof b.reconnectionOptions?b.reconnectionOptions:void 0,sessionId:b.sessionId||void 0,oauthClientId:b.oauthClientId||"",oauthClientSecret:b.oauthClientSecret||"",oauthScopes:b.oauthScopes||(b.oauthClientId||b.oauthClientInformation?["read"]:void 0),oauthClientMetadata:b.oauthClientMetadata,oauthClientInformation:b.oauthClientInformation,oauthTokens:b.oauthTokens,oauthCodeVerifier:b.oauthCodeVerifier}:"sse"===c?{...n,...b,name:a,eventSourceInit:b.eventSourceInit&&"object"==typeof b.eventSourceInit?b.eventSourceInit:void 0,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0}:"websocket"===c?{...n,...b,name:a,websocketUrl:b.websocketUrl||""}:{...n,...b,name:a,command:b.command||"",args:b.args||[],stderr:b.stderr||"pipe"}});return await Promise.all(b.map(async a=>{a.source||(a.source=await p(a))})),b}catch(a){if(a instanceof k.UQ)return l.warn("Stored MCP transport is invalid"),{success:!1,error:a.message,statusCode:400};return l.warn("Failed to load server configs",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async function r(a){let b=await q();if(!Array.isArray(b))return[];let c=b.find(b=>b.name===a)?.roots;return Array.isArray(c)?c.filter(a=>"string"==typeof a):[]}let s=["_buildCommand","_installCommand","oauthClientId","oauthClientSecret"];async function t(a){l.debug("Entering saveConfig method");try{for(let b of a.values())(0,k.SL)(b);let b=Object.fromEntries(Array.from(a.entries()).map(([a,b])=>[a,function(a){let{name:b,...c}=a,d={};for(let[a,b]of Object.entries(c))void 0!==b&&(""===b&&s.includes(a)||(d[a]=b));return d}(b)]));return await (0,g.VH)(h.Zg.MCP_SERVERS,b),{success:!0}}catch(a){if(a instanceof k.UQ)return l.warn("MCP transport is invalid"),{success:!1,error:a.message,statusCode:400};return l.warn("Failed to save config",a),{success:!1,error:`Failed to save config: ${a instanceof Error?a.message:"Unknown error"}`}}}},580118:(a,b,c)=>{"use strict";c.d(b,{$Y:()=>h,Rn:()=>i,b4:()=>j});var d=c(482964),e=c(943990);let f=(0,d.h)("backend/services/model/mediaHandoff");function g(a){return null===a||"object"!=typeof a||Array.isArray(a)?void 0:a}async function h(a,b){let c=!1,d=await Promise.all(a.map(async a=>{if(!a.resourceUri?.startsWith("flujo://run/"))return a;let d=()=>(0,e.QT)(a.resourceUri),f=b?await b(d):await d();if(f===a.localPath)return a;c=!0;let{localPath:g,...h}=a;return f?{...h,localPath:f}:h}));return c?d:a}function i(a,b){if(!b?.length)return a;let c=new Set(b.map(a=>a.toLowerCase()));return c.has("vision")&&c.add("image"),(c.has("document")||c.has("pdf"))&&c.add("file"),a.map(a=>{if(!Array.isArray(a.content))return a;let b=a.content.filter(a=>{let b="image_url"===a.type||"input_image"===a.type?"image":"audio_url"===a.type||"input_audio"===a.type?"audio":"video_url"===a.type||"input_video"===a.type?"video":"file"===a.type||"input_file"===a.type?"file":void 0;return!b||c.has(b)});return b.length===a.content.length?a:{...a,content:b}})}async function j(a,b,c={}){return Promise.all(a.map(async a=>{if(!Array.isArray(a.content))return a;let d=await Promise.all(a.content.map(async a=>{let d=function(a){if("image_url"===a.type){let b=g(a.image_url)?.url;return"string"==typeof b?b:void 0}if("audio_url"===a.type){let b=g(a.audio_url)?.url;return"string"==typeof b?b:void 0}if("video_url"===a.type){let b=g(a.video_url)?.url;return"string"==typeof b?b:void 0}if("file"===a.type||"input_file"===a.type){let b=g(a.file)??a,c=b.file_data??b.file_url??b.url;return"string"==typeof c?c:void 0}}(a);if(!d?.startsWith("flujo://run/"))return a;let h=null;try{let a=()=>(0,e.gy)(d,{at:Date.now(),source:"node",nodeId:b});h=c.commitDurableMutation?await c.commitDurableMutation(a):await a()}catch(a){if(a?.code==="flow_execution_authority_lost")throw a;f.warn(`Failed to read media run resource ${d}; sending a placeholder instead`,a)}let i=h?.contents.contents[0],j=i&&"string"==typeof i.blob?i.blob:void 0;if(!h||!j)return f.warn(`Media run resource is unavailable, degrading to a text note: ${d}`),{type:"text",text:`[media attachment unavailable — its stored payload (${d}) could not be read; it may have passed the run-resource retention window]`};let k=i.mimeType??h.entry.mimeType??"application/octet-stream";return function(a,b,c,d,e){if("image_url"===a.type)return{...a,image_url:{...g(a.image_url),url:b}};if("video_url"===a.type)return{...a,video_url:{...g(a.video_url),url:b,mime_type:c}};if("audio_url"===a.type){let f="audio/mpeg"===c?"mp3":"audio/wav"===c||"audio/x-wav"===c?"wav":void 0;return f?{type:"input_audio",input_audio:{data:d,format:f}}:e?{type:"text",text:`[${c} audio attachment is available as an artifact but this OpenAI input channel accepts only MP3 or WAV]`}:{...a,audio_url:{...g(a.audio_url),url:b,mime_type:c}}}return"file"===a.type||"input_file"===a.type?{type:"file",file:{...g(a.file)??a,file_data:b,mime_type:c}}:a}(a,`data:${k};base64,${j}`,k,j,!0===c.strictOpenAiAudioFormats)}));return{...a,content:d}}))}},584861:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{McpRuntimeAuthorityRetirementError:()=>as,assertMcpRuntimeAuthorityRetired:()=>X,attachShippedWorkspaceReadiness:()=>aj,capabilityKey:()=>U,clientProtectedConfigFingerprint:()=>T,createNewClient:()=>af,createStdioTransport:()=>ak,createTransport:()=>ag,flattenCustomHeaders:()=>aa,getUnderlyingTransport:()=>$,httpConfigKey:()=>ae,isolatedStdioRuntime:()=>ah,protectedConfigFingerprint:()=>S,resolveConfigHeaders:()=>_,resolveStdioLaunch:()=>ai,retireMcpRuntimeAuthority:()=>Z,safelyCloseClient:()=>am,shouldRecreateClient:()=>al,stdioConfigKey:()=>ad});var e=c(275424),f=c(894603),g=c(560921),h=c(687720),i=c(877506),j=c(646460),k=c(405087),l=c(200797),m=c(240505),n=c(302292),o=c(671675),p=c(231318),q=c(629021),r=c(333873),s=c(321820),t=c(977598),u=c(883191),v=c(482964),w=c(296951),x=c(687161),y=c(510217),z=c(826652),A=c(298683),B=c(230314),C=c(193640),D=c(533102),E=c(328461),F=c(84022),G=c(989031),H=c(868644),I=c(622838),J=c(749976),K=c(618836),L=c(471533),M=c(845157),N=c(216085),O=c(214799),P=c(378591),Q=c(589193),R=a([I]);I=(R.then?(await R)():R)[0];let an=globalThis,ao=an.__flujoProtectedConfigFingerprintKey??=(0,t.randomBytes)(32);function S(a){return(0,t.createHmac)("sha256",ao).update(JSON.stringify(a)).digest("hex")}function T(a){return a.__flujoProtectedConfigFingerprint}function U(a){return[(0,I.PP)(a),(0,J.NJ)(a),!0===a.enableMcpApps?"mcp-apps:on":"mcp-apps:off",!0===a.enableMcpSkills?"mcp-skills:on":"mcp-skills:off"].join("|")}let ap=Symbol.for("FLUJO:mcp-authority-retirement-errors:v1"),aq=Object.getOwnPropertyDescriptor(globalThis,ap);if(aq&&(!("value"in aq)||aq.configurable||aq.writable||!(aq.value instanceof WeakSet)))throw Error("MCP retirement error provenance refused.");let ar=aq?.value??new WeakSet;aq||Object.defineProperty(globalThis,ap,{value:ar,writable:!1,configurable:!1,enumerable:!1});class as extends AggregateError{constructor(a,b,c){super(a,b,c),WeakSet.prototype.add.call(ar,this)}static[Symbol.hasInstance](a){return!!a&&"object"==typeof a&&WeakSet.prototype.has.call(ar,a)}}function V(){return globalThis.__flujo_mcp_authority_retirement_quarantines??=new Map}function W(a,b=(0,E.getCurrentWorkspace)()){return`${b}\0${a}`}function X(a){let b=V().get(W(a));if(b)throw b.error}function Y(a,b,c,d){let e=V(),f=W(a,b);d?e.set(f,{owner:c,error:d}):e.get(f)?.owner===c&&e.delete(f)}function Z(a,b,c,d){let f=[];try{c&&(0,e.p9)(c)}catch(a){f.push(a)}try{(0,P.tS)(d?.leaseId)}catch(a){f.push(a)}if(f.length){let e=new as(f,"MCP runtime authority retirement failed.",{cause:f[0]});throw Y(a,b,c??d,e),e}Y(a,b,c??d)}function $(a){let b=a,c=new Set;for(;b&&"object"==typeof b&&!c.has(b);){c.add(b);let a=b.__flujoInnerTransport;if(!a)break;b=a}return b}let at=(0,v.h)("backend/services/mcp/connection");async function _(a){let b=a;if(a.env&&"object"==typeof a.env){let c=new Map;for(let[b,d]of Object.entries(a.env)){if(!(0,M.dR)(b))continue;let a=(0,M.ff)(d);if(!a||(0,L.uh)(a))continue;let e=await (0,K.G)(a);e&&c.set(b,e)}b={...b,env:(0,M.ln)(c)}}if("streamable"!==a.transport&&"sse"!==a.transport||!a.headers||"object"!=typeof a.headers)return b;let c=new Map;for(let[b,d]of Object.entries(a.headers)){if(!(0,M.pI)(b))continue;let a=(0,M.ff)(d);if(!a||(0,L.uh)(a))continue;let e=await (0,K.G)(a);e&&c.set(b,e)}return{...b,headers:(0,M.ln)(c)}}function aa(a){let b=new Map;for(let[c,d]of Object.entries(a)){if(!(0,M.pI)(c))continue;let a=(0,M.ff)(d);"string"==typeof a&&a.length>0&&b.set(c,a)}return(0,M.ln)(b)}function ab(a){let b=new Map;if(a)for(let[c,d]of Object.entries(a)){if(!(0,M.dR)(c))continue;let a=(0,M.ff)(d);void 0!==a&&b.set(c,a)}return(0,M.ln)(b)}let au=new Set(["path","pathext","home","userprofile","homedrive","homepath","appdata","localappdata","programdata","xdg_config_home","xdg_cache_home","xdg_data_home","xdg_state_home","xdg_runtime_dir","tmp","temp","tmpdir","shell","comspec","systemroot","windir","systemdrive","programfiles","programfiles(x86)","gh_config_dir"]);function ac(a,b,c){for(let c of Object.keys(a))c.toLowerCase()===b.toLowerCase()&&delete a[c];void 0!==c&&(a[b]=c)}function ad(a,b=!1){return JSON.stringify({command:a.command,args:a.args??[],env:ab(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??"",isolateRuntimeHome:b,isolation:a.isolation,trustedHost:a.trustedHost})}function ae(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??"",oauthIssuer:a.oauthIssuer??"",oauthClientInformation:a.oauthClientInformation??{},oauthClientSecret:a.oauthClientSecret??"",oauthTokens:a.oauthTokens??{}})}function af(a){if(at.debug("Entering createNewClient method"),(0,l.isProtectedExecutionServer)(a.name)){(0,l.assertExecutionServerConfig)(a);let b=new f.tI({name:`flujo-${a.name}-client`,version:"3.48.7"},{capabilities:{}});return b.__flujoCapKey=U(a),Object.defineProperty(b,"__flujoProtectedConfigFingerprint",{value:S(a),enumerable:!1}),b}let b=(0,I.jV)(a),c=(0,J.fy)(a),d=!0===a.enableMcpApps,e="stdio"===a.transport&&void 0===a.isolation,g=new f.tI({name:`flujo-${a.name}-client`,version:"3.48.7"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{},...e||c?{elicitation:{...e?{url:{}}:{},...c?{form:{}}:{}}}:{},extensions:{...!0===a.enableMcpSkills?{[x.ET]:{}}:{},...e?{[O.OM]:O.XC}:{},...d?{[N.OF]:{mimeTypes:[N.cM]}}:{}}}});return(0,H.FP)(g,a),b&&(0,I.LE)(g,a),(e||c)&&(0,J.n4)(g,a),g.__flujoCapKey=U(a),g}function ag(a,b){if((0,w.SL)(a),at.debug("Entering createTransport method"),(void 0!==a.isolation||void 0!==a.trustedHost)&&"stdio"!==a.transport)throw new g.Bk("ISOLATION_POLICY_INVALID");if("streamable"===a.transport){at.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=aa(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},at.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}if(a.oauthClientId||a.oauthClientInformation){at.info(`Setting up OAuth authentication for ${a.name}`);let c=(0,y.Cl)(a);b.authProvider=c,b.fetch=c.oauthFetch,a.oauthTokens?at.debug(`OAuth provider configured for ${a.name} with existing tokens`):at.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)}else at.debug(`No OAuth configuration found for ${a.name}`);let c=new o.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ae(a),c}if("sse"===a.transport){at.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=aa(a.headers);Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},at.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new p.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ae(a),c}return"websocket"===a.transport?(at.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new n.I(new URL(a.websocketUrl))):ak(a,b)}function ah(a){let b=(0,E.getWorkspaceDataDir)(),c=(0,t.createHash)("sha256").update(a,"utf8").digest("hex").slice(0,24),d=new u.V(b),e=b;for(let a of["userdata","mcp-runtime",c])e=r.join(e,a),d.admit(e,a===c);let f=e,g=r.join(f,"home"),h=r.join(f,"cwd");d.admit(g),d.admit(h);let i={appData:r.join(g,"AppData","Roaming"),localAppData:r.join(g,"AppData","Local"),config:r.join(g,".config"),cache:r.join(g,".cache"),data:r.join(g,".local","share"),state:r.join(g,".local","state"),runtime:r.join(g,".runtime"),temp:r.join(g,"tmp"),npm:r.join(g,".npm"),pip:r.join(g,".cache","pip"),uv:r.join(g,".cache","uv")};for(let a of Object.values(i)){let b=r.relative(g,a),c=g;for(let a of b.split(r.sep).filter(Boolean))c=r.join(c,a),d.admit(c)}let j={HOME:g,USERPROFILE:g,APPDATA:i.appData,LOCALAPPDATA:i.localAppData,XDG_CONFIG_HOME:i.config,XDG_CACHE_HOME:i.cache,XDG_DATA_HOME:i.data,XDG_STATE_HOME:i.state,XDG_RUNTIME_DIR:i.runtime,TMPDIR:i.temp,TMP:i.temp,TEMP:i.temp,NPM_CONFIG_CACHE:i.npm,PIP_CACHE_DIR:i.pip,UV_CACHE_DIR:i.uv,FLUJO_PARENT_DATA_DIR:(0,B.ok)(),FLUJO_DATA_DIR:b,FLUJO_WORKSPACE:(0,E.getCurrentWorkspace)()};if("win32"===process.platform){let a=r.parse(g);j.HOMEDRIVE=a.root.replace(/[\\/]$/,""),j.HOMEPATH=g.slice(a.root.length-1)}return d.verify(),{cwd:h,env:j}}function ai(a,b){if("stdio"!==a.transport)throw new w.UQ;if(void 0!==a.isolation){if(void 0!==a.trustedHost)throw new g.Bk("ISOLATION_POLICY_INVALID");let b=(0,k.O0)(a,ab(a.env)),{launch:c}=b;return{command:c.command,args:[...c.args],env:(0,k.H2)(c),cwd:c.cwd,isolation:b}}if((0,k.iw)(a),void 0!==a.trustedHost){let c=(0,h.FN)(a),d=(0,i.vb)(a),e=b?.isolateRuntimeHome===!0;if(e!==("isolated"===d.policy.runtimeHome))throw new i.Kq("HOST_POLICY_INVALID");if(e){let b=ah(a.name);if(d.policy.packageRunner&&r.resolve(a.cwd)!==r.resolve(b.cwd))throw new i.Kq("HOST_POLICY_INVALID");for(let[a,e]of Object.entries(b.env)){if(!d.policy.environmentNames.includes(a))throw new i.Kq("HOST_POLICY_INVALID");if(d.policy.packageRunner){let b=Object.entries(c.env).find(([b])=>b.toUpperCase()===a.toUpperCase())?.[1];if(b&&b!==e)throw new i.Kq("HOST_POLICY_INVALID")}c.env[a]=e}if(d.policy.packageRunner){let a=c.args.findIndex(a=>a.startsWith("--cache="));if(a<0)throw new i.Kq("HOST_POLICY_INVALID");c.args[a]=`--cache=${b.env.NPM_CONFIG_CACHE}`}}return at.debug("Transformed environment variable names",Object.keys(c.env)),c}let c=(0,F.AW)(a),d=!!c,e=c?.defaultName==="bash",f=a=>d?a:(0,E.remapLegacyDefaultWorkspaceReference)(a,"mcp-servers"),j=f(a.command),l=a.args?a.args.map(f):[],m=`${x.VL}/${a.name}`;at.info(`Creating stdio transport for server ${a.name}`),at.debug(`Original command: ${j}`),at.debug(`Original args: ${JSON.stringify(l)}`),at.debug(`Server directory: ${m}`);let n=!r.isAbsolute(j)&&(j.includes("/")||j.includes("\\")),o=!j.includes("/")&&!j.includes("\\");if(at.debug(`Is relative path: ${n}`),at.debug(`Is just filename: ${o}`),"win32"===s.platform()&&j.toLowerCase().endsWith(".bat"))if(at.debug(`Detected .bat file on Windows: ${j}`),o){let a=r.join((0,E.getWorkspaceDataDir)(),m,j);at.debug(`Checking if file exists at: ${a}`);let b=q.existsSync(a);at.debug(`File exists: ${b}`),b?(at.debug(`Using full path to .bat file: ${a}`),l=["/c",a,...l]):(at.warn(`WARNING: .bat file not found at ${a}`),l=["/c",j,...l]),j="cmd.exe"}else at.debug(`Using cmd.exe with path as provided: ${j}`),l=["/c",j,...l],j="cmd.exe";let p=(0,D.u)(j,{execPath:process.execPath,platform:s.platform(),dirname:r.dirname,joinPath:r.join,fileExists:q.existsSync});p!==j&&(at.debug(`Resolved Node toolchain command "${j}" to absolute path: ${p}`),j=p),at.debug(`Final command: ${j}`),at.debug(`Final args: ${JSON.stringify(l)}`);let t=e||b?.isolateRuntimeHome!==!0?void 0:ah(a.name),u=f((0,C.u)({command:a.command,args:a.args,rootPath:a.rootPath,cwd:a.cwd,serverName:a.name,defaultCwd:`${x.VL}/${a.name}`,packageRunnerCwd:t?.cwd})),v=r.isAbsolute(u)?u:r.join((0,E.getWorkspaceDataDir)(),u);at.debug(`cwd: ${v}`);let y=ab(a.env),z=e?function(a){let b={...a},c=Object.entries(process.env).filter(a=>"string"==typeof a[1]);for(let[a,d]of c)ac(b,a,d);for(let a of au)c.find(([b])=>b.toLowerCase()===a)||ac(b,a,void 0);return b}(y):y;if(!d)for(let[a,b]of Object.entries(z))z[a]=f(b);t&&Object.assign(z,t.env),function(a){if("win32"!==process.platform)return;let b=(a,b)=>Object.entries(a).find(([a,c])=>a.toLowerCase()===b.toLowerCase()&&""!==(c??"").trim())?.[1],c=b(process.env,"SystemRoot")??b(process.env,"windir")??"C:\\Windows";for(let[d,e]of Object.entries({SystemRoot:c,windir:c,ComSpec:b(process.env,"ComSpec")??r.join(c,"System32","cmd.exe"),PATHEXT:b(process.env,"PATHEXT")??".COM;.EXE;.BAT;.CMD"}))if(void 0===b(a,d)){for(let b of Object.keys(a))b.toLowerCase()===d.toLowerCase()&&delete a[b];a[d]=e}}(z);let A=(0,B.ok)(),G=(0,E.getWorkspaceDataDir)();if(z.FLUJO_PARENT_DATA_DIR=A,z.FLUJO_DATA_DIR=G,z.FLUJO_WORKSPACE=(0,E.getCurrentWorkspace)(),c?.defaultName==="browser"){if(!z.PLAYWRIGHT_BROWSERS_PATH?.trim()){let a=(0,F.AI)(process.env);a&&(z.PLAYWRIGHT_BROWSERS_PATH=a)}z.FLUJO_BROWSER_PROFILE_DIR=r.join(G,"browser-profile","trusted"),z.FLUJO_BROWSER_SCREENSHOT_DIR=r.join(G,"screenshots","browser"),z.FLUJO_BROWSER_RECORD_DIR=r.join(G,"recordings","browser")}for(let a of Object.keys(z))a.toUpperCase()===Q.wd&&delete z[a];at.verbose("Transformed environment variable names",JSON.stringify(Object.keys(z)));let H=(0,Q.hz)(a);return H&&(z[Q.wd]=H),"1"===process.env.FLUJO_WORKER_MODE&&c?.defaultName==="flujo"&&(z.FLUJO_WORKER_MODE="1",process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN&&(z.FLUJO_SNAPSHOT_CONTROL_TOKEN=process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN)),{command:j,args:l,env:z,cwd:v}}function aj(a,b,c){let d=(0,F.AW)(b),e=(0,E.getWorkspaceDataDir)();if(!d||r.resolve(c)!==r.resolve(e,"mcp-servers",d.packageDirectory))return;let f=a.start.bind(a);a.start=async()=>{await (0,G._F)(e,void 0,[d.packageDirectory]),await f()}}function ak(a,b){let c,d,f;if(at.debug("Entering createStdioTransport method"),"stdio"!==a.transport)throw Error("Cannot create stdio transport for non-stdio config");let{command:g,args:i,env:l,cwd:n,isolation:o}=ai(a,b),p=(0,E.getCurrentWorkspace)(),q=()=>Z(a.name,p,d,c);at.info(`Creating StdioClientTransport for ${a.name} with stderr: 'pipe'`);try{X(a.name),d=(0,e.bG)(a),c=b?.enableRuntimeBroker&&!0===a.enableMcpApps?(0,P.D9)(a.name):void 0;let p=d?(0,e.Uf)(a,d):{},r={command:g,args:i,env:{...l,...c?a.trustedHost?(0,h.s7)(a,c.env):c.env:{},...p},cwd:n,stderr:o?"ignore":"pipe",...o?{maxBufferSize:262144}:{}};o||(Object.freeze(r.args),Object.freeze(r.env),Object.freeze(r)),f=new m.oQ(r),o?(0,k.We)(f,a,o,q):a.trustedHost?(0,h.Zu)(f,a,q,d):(aj(f,a,n),(0,j.uR)(f,a,a=>JSON.stringify([ad(a,b?.isolateRuntimeHome===!0),U(a)])))}catch(b){let a=[];try{o?.close()}catch(b){a.push(b)}try{q()}catch(b){a.push(b)}if(a.length)throw new as([b,...a],"MCP transport creation and authority retirement failed.",{cause:b});throw b}return c&&(f.__flujoRuntimeBrokerLeaseId=c.leaseId),f.__flujoBundledWorkload=d,f.__flujoRetireRuntimeAuthority=q,f.__flujoStdioKey=ad(a,b?.isolateRuntimeHome===!0),f.stderr?at.info(`Stderr stream is available for ${a.name}`):at.warn(`Stderr stream is NOT available for ${a.name}`),f}function al(a,b,c=!1,d){if(at.debug("Entering shouldRecreateClient method"),(0,z.wk)(a))return{needsNewClient:!0,reason:"Existing connection is closed"};if((a.__flujoCapKey??"")!==U(b))return{needsNewClient:!0,reason:"Client capabilities (sampling/elicitation/MCP Apps/Skills) changed"};let e=!0===a.__flujoBeta,f=c&&"websocket"!==b.transport;if(e!==f)return{needsNewClient:!0,reason:f?"Beta MCP protocol enabled":"Beta MCP protocol disabled"};if(e){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!==ad(b,d?.isolateRuntimeHome===!0))return{needsNewClient:!0,reason:"Connection parameters changed"}}else if(c.__flujoHttpKey!==ae(b))return{needsNewClient:!0,reason:`${b.transport} auth/connection parameters changed`};return{needsNewClient:!1}}if("websocket"===b.transport){if(!(a.transport instanceof n.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof o.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!==ae(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof p.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!==ae(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof m.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!==ad(b,d?.isolateRuntimeHome===!0))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}async function am(a,b,c,d){let f,g;at.debug("Entering safelyCloseClient method");let h=Date.now(),i=d?.gracePeriodMs??15e3,j=d?.killEscalationMs??5e3,l=!1,m=!1,n=$(a.transport),o=(0,k.Ck)(n),p=n?._process,q=p&&"function"==typeof p.kill?"owned":c&&"stdio"!==c.transport?"external":"unknown",r="none",s=[];try{if(p&&"function"==typeof p.kill&&(l=null!==p.exitCode||null!==p.signalCode,null===p.exitCode&&null===p.signalCode)){try{p.stdin&&!p.stdin.destroyed&&(p.stdin.end(),at.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){at.warn(`Error closing stdin for ${b}:`,a)}if(l=await (null!==p.exitCode||null!==p.signalCode?Promise.resolve(!0):new Promise(a=>{let b=()=>{clearTimeout(c),a(!0)},c=setTimeout(()=>{p.removeListener("exit",b),a(!1)},i);c.unref?.(),p.once("exit",b)})))at.info(`Process exited gracefully for ${b}`);else{at.warn(`Process did not exit within ${i}ms after stdin close; escalating to a tree kill for ${b}`);let a=await (0,A.U)(p,{graceMs:j,finalWaitMs:j});l=a.exited,m=a.forced,l?at.warn(`Process tree for ${b} force-terminated after ${a.durationMs}ms`):at.error(`Process tree for ${b} (pid ${a.pid??"unknown"}) did not exit after forced escalation`)}}await a.close(),at.info(`Client closed successfully for ${b}`)}catch(a){r="close_failed",g=a,at.warn(`Error closing client for ${b}:`,a)}finally{try{f=o?.close()}catch(a){s.push(a)}let a=n?.__flujoRetireRuntimeAuthority;if(a)try{a()}catch(a){s.push(a)}else{try{let a=n?.__flujoBundledWorkload;a&&(0,e.p9)(a)}catch(a){s.push(a)}try{(0,P.tS)(n?.__flujoRuntimeBrokerLeaseId)}catch(a){s.push(a)}}}"owned"===q&&p&&(l||=null!==p.exitCode||null!==p.signalCode),f?.outcome==="unknown"&&(l=!1);let t="external"===q?"not_applicable":l?"observed_exit":"unknown";"unknown"===t&&"none"===r&&(r="exit_unobserved");let u={exited:l,forced:m,durationMs:Date.now()-h,processOwnership:q,exitOutcome:t,errorClassification:r,...o&&f?{isolation:{schemaVersion:1,generation:o.launch.generation,cleanupOutcome:f.outcome}}:{}};if(s.length){let a=void 0===g?s:[g,...s];throw Object.assign(new as(a,"MCP shutdown authority retirement failed.",{cause:a[0]}),{shutdownObservation:u})}return u}d()}catch(a){d(a)}})},585029:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{v:()=>o});var e=c(787951),f=c(482964),g=c(340653),h=c(3924),i=c(373327),j=c(146188),k=c(768680),l=c(748633),m=a([g,i]);[g,i]=m.then?(await m)():m;let n=(0,f.h)("backend/flow/execution/nodes/MCPNode");class o extends e.Yp{async prep(a,b){n.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw n.error("Missing bound server"),Error("MCP node requires a bound server");return n.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){n.info("execCore() started",{mcpServer:a.mcpServer}),n.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await g.z.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw n.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return n.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),n.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return n.error("execCore() failed",{error:a.error}),n.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(n.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),n.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),k.Gv.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),n.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a,e=d?.properties?.toolTimeout;try{let c=await i.mcpService.loadServerConfigs?.();a=Array.isArray(c)?c.find(a=>a.name===b.server):void 0}catch(a){n.warn("Could not load server-wide tool parameter presets",a)}let f=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>{let f=(0,l.Ge)(a?.toolParameterPresets,d?.properties?.toolParameterPresets,c.name),g=(0,h.az)(c.inputSchema);return i.mcpService.setToolSchemaHash(b.server,c.name,g),{...c,inputSchema:(0,l.Qm)(c.inputSchema,f),originalName:c.name,server:b.server,nodeId:d?.id,name:(0,h.Y6)(b.server,c.name),timeout:e,clientGeneration:i.mcpService.getClientGeneration(b.server),schemaHash:g,uiResourceUri:(0,j.Gt)(c._meta),...Object.keys(f).length>0?{presetArgs:f}:{}}});if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of f)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:f};for(let a of(c.toolNameMap=c.toolNameMap||{},f))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout,nodeId:d?.id,clientGeneration:a.clientGeneration,schemaHash:a.schemaHash,annotations:a.annotations,uiResourceUri:a.uiResourceUri,presetArgs:a.presetArgs};let g=f.map(a=>a.name);n.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:f.length,availableToolNames:g.length>10?g.slice(0,10).join(", ")+"...":g.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}n.info("post() completed"),n.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(n.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return n.info(`Returning action: ${a}`),a}return"default"}_clone(){return new o}}d()}catch(a){d(a)}})},586278:(a,b,c)=>{"use strict";function d(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:
121
121
  ${c}`;return a?`${a}
122
122
 
123
- ${d}`:d}c.d(b,{gL:()=>d}),c(880013)},588054:(a,b,c)=>{"use strict";c.d(b,{B:()=>j,_:()=>i});var d=c(977598),e=c(482964),f=c(328461);let g=(0,e.h)("backend/services/model/cache");class h{#a;credentialFingerprint(a){return(0,d.createHmac)("sha256",this.#a).update("flujo:provider-catalogue:credential:v1\0","utf8").update(a,"utf8").digest("hex")}currentCache(){let a=(0,f.getCurrentWorkspace)(),b=this.caches.get(a);return b||(b=new Map,this.caches.set(a,b)),b}normalizeTarget(a){return"string"==typeof a?{baseUrl:a}:a}getCacheKey(a){let b=this.normalizeTarget(a),c=b.baseUrl.trim().toLowerCase().replace(/\/$/,"");return JSON.stringify([b.profileId??"",b.provider??"",b.adapter??"",c,b.credentialFingerprint??""])}logIdentity(a){let b=this.normalizeTarget(a);return{baseUrl:b.baseUrl,...b.provider?{provider:b.provider}:{},...b.adapter?{adapter:b.adapter}:{},...b.profileId?{profileId:b.profileId}:{}}}isValid(a){return Date.now()-a.timestamp<a.ttl}get(a){let b=this.getCacheKey(a),c=this.currentCache(),d=c.get(b),e=this.logIdentity(a);return d?this.isValid(d)?(g.debug("Cache hit",{...e,modelCount:d.models.length}),d.models):(g.debug("Cache miss - entry expired",{...e,age:Date.now()-d.timestamp}),c.delete(b),null):(g.debug("Cache miss - no entry found",e),null)}set(a,b,c){let d=this.getCacheKey(a),e={models:b,timestamp:Date.now(),ttl:c||this.DEFAULT_TTL};this.currentCache().set(d,e),g.debug("Models cached",{...this.logIdentity(a),modelCount:b.length,ttl:e.ttl})}clear(a){let b=this.getCacheKey(a),c=this.currentCache().delete(b);g.debug("Cache cleared",{...this.logIdentity(a),deleted:c})}clearAll(){let a=this.currentCache(),b=a.size;a.clear(),g.debug("All cache cleared",{entriesCleared:b})}getStats(){let a=this.currentCache(),b=a.size,c=0,d=0;for(let b of a.values())this.isValid(b)?c++:d++;return{totalEntries:b,validEntries:c,expiredEntries:d}}cleanup(){let a=this.currentCache(),b=[];for(let[c,d]of a.entries())this.isValid(d)||b.push(c);b.forEach(b=>a.delete(b)),b.length>0&&g.debug("Cache cleanup completed",{expiredEntriesRemoved:b.length})}constructor(){this.caches=new Map,this.DEFAULT_TTL=3e5,this.#a=(0,d.randomBytes)(32)}}let i=new h;function j(a,b){if(!b||0===b.trim().length)return a;let c=b.toLowerCase().trim();return a.filter(a=>{let b=a.id.toLowerCase(),d=a.name.toLowerCase();if(b.includes(c)||d.includes(c))return!0;let e=a=>{let b=0,d=0;for(;b<a.length&&d<c.length;)a[b]===c[d]&&d++,b++;return d===c.length};return e(b)||e(d)}).sort((a,b)=>{let d=a.id.toLowerCase(),e=b.id.toLowerCase(),f=a.name.toLowerCase(),g=b.name.toLowerCase(),h=d.includes(c)||f.includes(c),i=e.includes(c)||g.includes(c);return h&&!i?-1:!h&&i?1:a.id.length-b.id.length})}},595075:(a,b,c)=>{"use strict";function d(a,b){if("low"===b)return 1024;if(a.startsWith("data:image/png;base64,")){let b=Buffer.from(a.slice(22,70),"base64");if(b.length>=24&&b.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))){let a=b.readUInt32BE(16),c=b.readUInt32BE(20);if(a&&c)return Math.ceil(a/32)*Math.ceil(c/32)*3}}if(/^data:image\/jpe?g;base64,/i.test(a.slice(0,24))){let b=a.indexOf(",")+1,c=Buffer.from(a.slice(b,b+87384),"base64");for(let a=2;a+9<c.length&&255===c[a];){let b=c[a+1],d=c.readUInt16BE(a+2);if(d<2)break;if([192,193,194].includes(b))return Math.ceil(c.readUInt16BE(a+5)/32)*Math.ceil(c.readUInt16BE(a+7)/32)*3;a+=d+2}}return 8192}function e(a,b,c){let e=0,f=JSON.stringify({messages:a.map(a=>Array.isArray(a.content)?{...a,content:a.content.map(a=>"image_url"!==a.type?a:(e+=d(a.image_url.url,a.image_url.detail),{...a,image_url:{...a.image_url,url:"[native image]"}}))}:a),tools:b??[]});return e+((c?.provider==="openrouter"||c?.adapter==="openrouter-agent")&&c?.name.startsWith("anthropic/")?Buffer.byteLength(f,"utf8"):Math.ceil(f.length/4))}c.d(b,{e:()=>d,y:()=>e})},600916:(a,b,c)=>{"use strict";function d(){let a=!0,b=new Set,c=()=>{if(!a)throw Error("Held read callback scope ended.")};return{assertActive:c,run(a){let d=(async()=>{c();let b=await a();return c(),b})();return b.add(d),d.then(()=>b.delete(d),()=>b.delete(d)),d},async close(){a=!1,await Promise.allSettled([...b])}}}c.d(b,{K:()=>d})},600950:(a,b,c)=>{"use strict";c.d(b,{Jm:()=>h,UR:()=>j,hc:()=>f,kA:()=>k,lr:()=>g,zJ:()=>i});var d=c(130214);let e=new Set(["image","audio","video"]);function f(a){if(a.type&&e.has(a.type))return a.type;if("resource"===a.type&&a.resource&&"string"==typeof a.resource.blob){let b="string"==typeof a.resource.mimeType?a.resource.mimeType:void 0,c=(0,d.X)(b);return"file"===c?void 0:c}}function g(a){let b=f(a),c=i(a);if(!b||!c)return;let d=h(a);return{type:b,data:c,...d?{mimeType:d}:{}}}function h(a){if("string"==typeof a.mimeType)return a.mimeType;let b=a.resource?.mimeType;return"string"==typeof b?b:void 0}function i(a){if("string"==typeof a.data)return a.data;let b=a.resource?.blob;return"string"==typeof b?b:void 0}function j(a){if(!a||!Array.isArray(a.content))return{mediaItems:[],textResult:a,hasMedia:!1};let b=[],c=[];for(let d of a.content){let a=f(d);a?(b.push(d),c.push(function(a,b){let c=h(a)??b,d=i(a)?.length,e=d?` ~${Math.round(3*d/4/1024)} KB`:"";return{type:"text",text:`[${c}${e} media item returned by this tool; delivered to the model as a native ${b} input rather than inline base64]`}}(d,a))):c.push(d)}return 0===b.length?{mediaItems:[],textResult:a,hasMedia:!1}:{mediaItems:b,textResult:{...a,content:c},hasMedia:!0}}function k(a,b,c){return{type:b,...a.mimeType?{mimeType:a.mimeType}:{},...a.name?{name:a.name}:{},resourceUri:a.uri,...c?{localPath:c}:{}}}},601236:(a,b,c)=>{"use strict";c.d(b,{Wn:()=>k,k$:()=>g,n7:()=>l});var d=c(176760),e=c.n(d),f=c(648286);let g="restricted-startup-policy-v1",h=()=>{throw Error("Native Codex startup configuration is unavailable.")};function i(a){let{forced_login_method:b,...c}=f.Hg;return{...c,features:{...c.features,code_mode_host:a}}}function j(a){let b,c=a.model_providers,d=c?.inventory?.base_url;if("inventory"!==a.model_provider||"string"!=typeof d)return h();try{b=new URL(d)}catch{return h()}return"http:"!==b.protocol||"127.0.0.1"!==b.hostname||!b.port||b.username||b.password||b.search||b.hash||"/"!==b.pathname?h():{model_provider:"inventory",check_for_update_on_startup:!1,analytics:{enabled:!1},features:{...f.Hg.features,enable_request_compression:!1,unbounded_connection_retries:!1},model_providers:{inventory:{name:"Source offline inventory fixture",base_url:d,wire_api:"responses",requires_openai_auth:!1,supports_websockets:!1,request_max_retries:0,stream_max_retries:0}}}}function k(a){if(!e().isAbsolute(a.cwd))return h();let b=["project_root_markers=[]",`projects.${JSON.stringify(a.cwd)}.trust_level="untrusted"`];if(a.neutralTrustOverrides&&JSON.stringify(a.neutralTrustOverrides)!==JSON.stringify(b))return h();let{forced_login_method:c}=f.Hg,d={...i(!0===a.personaTools&&"offline-inventory"!==a.authentication),..."chatgpt"===a.authentication?{forced_login_method:c}:{}},g=a.config.model_catalog_json;if(void 0!==g){if("string"!=typeof g||!e().isAbsolute(g))return h();d.model_catalog_json=g}"offline-inventory"===a.authentication&&Object.assign(d,j(a.config));let k=b.flatMap(a=>["-c",a]),l=(a,b)=>{if("string"==typeof a||"boolean"==typeof a)k.push("-c",`${b}=${JSON.stringify(a)}`);else if("number"==typeof a&&Number.isFinite(a))k.push("-c",`${b}=${a}`);else if(!a||"object"!=typeof a||Array.isArray(a))return h();else for(let[c,d]of Object.entries(a))l(d,b?`${b}.${c}`:c)};for(let[a,b]of Object.entries(d))l(b,a);return k.length>256||k.reduce((a,b)=>a+Buffer.byteLength(b),0)>32768?h():k}function l(a,b,c=!1){let{forced_login_method:d,...e}=a,{forced_login_method:g}=f.Hg;return{...e,...i(c&&"offline-inventory"!==b),..."chatgpt"===b?{forced_login_method:g}:{},..."offline-inventory"===b?j(a):{}}}},601748:(a,b,c)=>{"use strict";c.d(b,{P:()=>i,e:()=>j});var d=c(257975),e=c(200797);function f(a){if("string"!=typeof a||0===a.length)throw new e.ExecutionExtensionError("execution_model_step_run_required");return a}function g(a,b){let c=Object.getOwnPropertyDescriptor(a,"executionModelStepOrdinals"),d=c&&Object.hasOwn(c,"value")&&c.enumerable?c.value:void 0;if(!h(d))throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let f=Object.getOwnPropertyDescriptors(d);if(2!==Reflect.ownKeys(f).length||!["logicalRunId","nextByNode"].every(a=>Object.hasOwn(f,a)&&Object.hasOwn(f[a],"value")&&f[a].enumerable)||f.logicalRunId.value!==b||!h(f.nextByNode.value))throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let g=Object.getOwnPropertyDescriptors(f.nextByNode.value);for(let a of Reflect.ownKeys(g)){try{(0,e.assertExecutionModelStepNodeId)(a)}catch{throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid")}let b=g[a],c=b.value;if(!Object.hasOwn(b,"value")||!b.enumerable||!b.writable||!Number.isSafeInteger(c)||c<0||c>e.MAX_EXECUTION_MODEL_STEP_ORDINAL+1)throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid")}return d}function h(a){return!!a&&"object"==typeof a&&!d.types.isProxy(a)&&[Object.prototype,null].includes(Object.getPrototypeOf(a))}function i(a,b){let c=f(a.logicalRunId);if(b!==c){a.executionModelStepOrdinals={logicalRunId:c,nextByNode:{}};return}g(a,c)}function j(a,b,c){(0,e.assertExecutionModelStepNodeId)(b);let d=f(c);if(a.logicalRunId!==d)throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let h=g(a,d),i=Object.hasOwn(h.nextByNode,b)?h.nextByNode[b]:0;if(i>e.MAX_EXECUTION_MODEL_STEP_ORDINAL)throw new e.ExecutionExtensionError("execution_model_step_slot_exhausted");return h.nextByNode[b]=i+1,i}},603050:(a,b,c)=>{"use strict";c.d(b,{AQ:()=>h,iL:()=>g});let d="io.flujo/host-owner-scope",e=a=>null===a||"object"!=typeof a||Array.isArray(a)?void 0:a;function f(a){return"string"==typeof a&&a.length>0&&a.length<=512&&a.trim()===a}function g(a,b){let c=e(a);if(!c)return a;let g=e(c._meta),h=f(b)?b:void 0;if(void 0===h&&!Object.hasOwn(g??{},d))return a;let i={...g};return delete i[d],void 0!==h&&(i[d]=h),{...c,_meta:i}}function h(a){if(void 0!==a)try{let b="string"==typeof a?JSON.parse(a):a,c=e(e(b)?._meta),g=c?.[d];return f(g)?g:void 0}catch{return}}},603886:(a,b,c)=>{"use strict";c.d(b,{y:()=>h});var d=c(295062);let e=["input_tokens","output_tokens","cache_creation_input_tokens","cache_read_input_tokens"],f=()=>({input_tokens:0,output_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0}),g=(a,b)=>{for(let c of e)a[c]+=b[c]??0};class h{constructor(a){this.steps=new Map,this.activeSteps=new Map,this.observedAtResult=f(),this.childrenAtResult=f(),this.modelUsage={},this.anonymousId=0,this.cumulativeOffset=f(),this.cumulativeCostOffset=0,this.seenResults=new Set,this.checkpoint=a,this.baseline=this.countCheckpoint(a),this.baselineCost=a?.totalCostUsd??0}countCheckpoint(a){let b=f();for(let c of Object.values(a?.modelUsage??{}))g(b,{input_tokens:c.inputTokens,output_tokens:c.outputTokens,cache_read_input_tokens:c.cacheReadInputTokens,cache_creation_input_tokens:c.cacheCreationInputTokens});return b}observe(a){if(!a||"object"!=typeof a)return;let b=a.parent_tool_use_id??"";if("stream_event"===a.type){let c=a.event;if(c?.type==="message_start"&&c.message?.id)this.activeSteps.set(b,c.message.id),this.update(b,c.message.id,c.message.usage,c.message.model,!1);else if(c?.type==="message_delta"){let a=this.activeSteps.get(b);a&&this.update(b,a,c.usage,void 0,!0)}else c?.type==="message_stop"&&this.activeSteps.delete(b)}else if("assistant"===a.type&&a.message?.usage){let c=a.message,d=c.id??this.activeSteps.get(b)??a.uuid??`anonymous-${++this.anonymousId}`;this.update(b,d,c.usage,c.model,!1)}else if("result"===a.type){if(a.uuid&&this.seenResults.has(a.uuid)||(a.uuid&&this.seenResults.add(a.uuid),void 0!==a.result_index&&void 0!==this.lastResultIndex&&a.result_index<=this.lastResultIndex))return;void 0!==a.result_index&&(this.lastResultIndex=a.result_index);let b=Object.values(a.modelUsage??{});if((a.is_error||a.subtype?.startsWith("error"))&&!b.some(a=>(a.inputTokens??0)>0||(a.outputTokens??0)>0||(a.cacheReadInputTokens??0)>0||(a.cacheCreationInputTokens??0)>0)&&!e.some(b=>(a.usage?.[b]??0)>0))return;if(b.length){this.modelUsage=a.modelUsage;let c=f();for(let a of b)g(c,{input_tokens:a.inputTokens,output_tokens:a.outputTokens,cache_read_input_tokens:a.cacheReadInputTokens,cache_creation_input_tokens:a.cacheCreationInputTokens});let d=this.countCheckpoint(this.checkpoint);if(e.some(a=>c[a]<d[a])){for(let a of e)this.cumulativeOffset[a]+=Math.max(0,d[a]-this.baseline[a]);this.cumulativeCostOffset+=Math.max(0,(this.checkpoint?.totalCostUsd??0)-this.baselineCost),this.baseline=f(),this.baselineCost=0}for(let a of(this.reportedTotals=f(),e))this.reportedTotals[a]=this.cumulativeOffset[a]+Math.max(0,c[a]-this.baseline[a]);this.checkpoint={modelUsage:Object.fromEntries(Object.entries(a.modelUsage).map(([a,b])=>[a,{inputTokens:b.inputTokens??0,outputTokens:b.outputTokens??0,cacheReadInputTokens:b.cacheReadInputTokens??0,cacheCreationInputTokens:b.cacheCreationInputTokens??0}])),...Number.isFinite(a.total_cost_usd)?{totalCostUsd:a.total_cost_usd}:{}}}else{if(!a.usage)return;this.reportedTotals??=f(),g(this.reportedTotals,a.usage);let b=this.sumSteps(!0);for(let a of e)this.reportedTotals[a]+=Math.max(0,b[a]-this.childrenAtResult[a])}this.observedAtResult=this.sumSteps(),this.childrenAtResult=this.sumSteps(!0)}}update(a,b,c,d,f){if(!c)return;let g=`${a}\0${b}`,h=this.steps.get(g);for(let b of(!h&&(h={usage:{},hasOutput:!1,isChild:!!a},this.steps.set(g,h),a||(this.latestRootStep=h)),d&&(h.model=d),e)){if("output_tokens"===b&&!f)continue;let a=c[b];"number"==typeof a&&Number.isFinite(a)&&a>=0&&(h.usage[b]=a)}f&&null!=c.output_tokens&&(h.hasOutput=!0)}sumSteps(a=!1){let b=f();for(let c of this.steps.values())(!a||c.isChild)&&g(b,c.usage);return b}getUsage(){if(!this.reportedTotals&&!this.steps.size)return;let a=this.sumSteps();if(!this.reportedTotals)return a;let b={...this.reportedTotals};for(let c of e)b[c]+=Math.max(0,a[c]-this.observedAtResult[c]);return b}getCheckpoint(){return this.checkpoint}getAccounting(){return{scope:"completion",costBasis:"sdk-estimate",usage:this.getUsage(),...this.checkpoint?.totalCostUsd!==void 0?{estimatedCostUsd:this.cumulativeCostOffset+Math.max(0,this.checkpoint.totalCostUsd-this.baselineCost)}:{},childRequestUsage:this.sumSteps(!0)}}getContextUsage(a){let b=this.latestRootStep;if(!b||null==b.usage.input_tokens)return null;let c=(0,d.k)(b.usage),e=Object.values(this.modelUsage),f=(b.model?this.modelUsage[b.model]??e.find(a=>a.canonicalModel===b.model):1===e.length?e[0]:void 0)?.contextWindow,g="number"==typeof f&&Number.isFinite(f)&&f>0?f:void 0,h=g??a;return{promptTokens:c.promptTokens,...b.hasOutput?{completionTokens:c.completionTokens,totalTokens:c.totalTokens}:{},..."number"==typeof h&&Number.isFinite(h)&&h>0?{contextWindow:h,contextWindowSource:g?"runtime":"configured"}:{}}}}},608878:(a,b,c)=>{"use strict";c.d(b,{YA:()=>e,uz:()=>f});var d=c(193640);function e(a){return"stdio"===a.transport&&(0,d.G)(a.command,a.args??[])}function f(a){return e(a)?9e4:15e3}},617758:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{UQ:()=>L,e:()=>I,gf:()=>K,nK:()=>N,po:()=>M,q1:()=>G,s5:()=>H});var e=c(825969),f=c(328461),g=c(361784),h=c(687161),i=c(768680),j=c(964870),k=c(94917),l=c(275424),m=c(591657),n=c(116416),o=c(482964),p=c(296951),q=c(624788),r=c(621030),s=c(584861),t=c(510217),u=c(560921),v=c(405087),w=c(687720),x=c(646460),y=c(868644),z=c(622838),A=c(749976),B=c(216085),C=c(214799),D=c(157721),E=c(378591),F=a([s,z]);[s,z]=F.then?(await F)():F;let O=(0,o.h)("backend/services/mcp/betaClient");async function G(){try{let a=await (0,q.loadItem)(r.Zg.SPEECH_SETTINGS,void 0);return!!a?.experimental?.mcpBetaProtocol}catch(a){return O.warn("Failed to read mcpBetaProtocol setting; defaulting to disabled",{err:a}),!1}}function H(a){return!0===a.__flujoBeta}function I(a,b){let d=(0,z.jV)(a),l=(0,A.fy)(a),n=!0===a.enableMcpApps,o="stdio"===a.transport&&void 0===a.isolation,p={name:`flujo-${a.name}-client`,version:"3.48.6"},q={roots:{listChanged:!0},...d?{sampling:{}}:{},...o||l?{elicitation:{...o?{url:{}}:{},...l?{form:{}}:{}}}:{},extensions:{...!0===a.enableMcpSkills?{[h.ET]:{}}:{},...o?{[C.OM]:C.XC}:{},...n?{[B.OF]:{mimeTypes:[B.cM]}}:{}}},r=new m.Kj(p,{capabilities:q,listChanged:{tools:{autoRefresh:!1,onChanged:()=>{}},prompts:{autoRefresh:!1,onChanged:()=>{}},resources:{autoRefresh:!1,onChanged:()=>b?.()}},versionNegotiation:{mode:"stdio"===a.transport?"legacy":"auto"}}),t=(0,y.sG)(a,r),u=d?(0,z.c3)(a):void 0,v=o||l?(0,A.Cd)(a):void 0;if((0,e.zD)(r,"roots/list",t),u&&(0,e.zD)(r,"sampling/createMessage",u),v&&(0,e.zD)(r,"elicitation/create",v),r.setRequestHandler("roots/list",async(a,b)=>{b.mcpReq.signal.throwIfAborted();let c=await t();return b.mcpReq.signal.throwIfAborted(),c}),d&&r.setRequestHandler("sampling/createMessage",async(a,b)=>u(a,{signal:b.mcpReq.signal})),(o||l)&&r.setRequestHandler("elicitation/create",async(a,b)=>v(a,{signal:b.mcpReq.signal})),"stdio"!==a.transport&&void 0===a.isolation&&void 0===a.trustedHost){let b=(0,f.bindToCurrentWorkspace)(async()=>{if(!i.Gv.ENABLE_MCP_TASKS_CLIENT)return!1;let{mcpService:b}=await Promise.resolve().then(c.bind(c,373327));return b.getClient(a.name)===r});(0,g.Wk)(r,{endpointId:(0,f.workspaceCacheKey)(a.name),clientInfo:p,clientCapabilities:q,authorizeLateTaskCancellation:b,isAuthorityCurrent:b,handleInputRequest:(0,f.bindToCurrentWorkspace)(async(c,d,f)=>{let g=async()=>{if(d?.throwIfAborted(),!await b())throw Error("MCP Tasks input connection is no longer current");let c=(0,k.lx)(a.name);if(void 0!==f&&(!c||c.conversationId!==f||c.getUnattended()))throw Error("MCP Tasks input owner is no longer attended")};if(await g(),"elicitation/create"===c.method&&!l)throw Error("The requested MCP Tasks input capability is disabled");let h=await (0,e.jq)(r,c,{signal:d,assertCurrent:g,expectedConversationId:f});return await g(),j.t5.parse(h)})})}return r.__flujoBeta=!0,r.__flujoCapKey=(0,s.capabilityKey)(a),O.info(`Created split-SDK MCP client for ${a.name} (version negotiation: ${"stdio"===a.transport?"legacy":"auto"})`),r}function J(a){let b=a.requestInit&&"object"==typeof a.requestInit?a.requestInit:void 0;if(a.headers&&"object"==typeof a.headers){let c=(0,s.flattenCustomHeaders)(a.headers);Object.keys(c).length>0&&(b={...b||{},headers:{...b?.headers||{},...c}})}return b}function K(a,b){let c,d,e;if((0,p.SL)(a),(void 0!==a.isolation||void 0!==a.trustedHost)&&"stdio"!==a.transport)throw new u.Bk("ISOLATION_POLICY_INVALID");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=J(a);if(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){let c=(0,t.Cl)(a);b.fetch=c.oauthFetch,b.authProvider=c}let d=new m.jS(new URL(a.serverUrl),b);return d.__flujoHttpKey=(0,s.httpConfigKey)(a),d.__flujoKind="streamable",O.info(`Created v2-beta streamable transport for ${a.name}`),d}if("sse"===a.transport){let b={},c=J(a);c&&(b.requestInit=c),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit);let d=new m.Am(new URL(a.serverUrl),b);return d.__flujoHttpKey=(0,s.httpConfigKey)(a),d.__flujoKind="sse",O.info(`Created v2-beta SSE transport for ${a.name}`),d}let{command:g,args:h,env:i,cwd:j,isolation:k}=(0,s.resolveStdioLaunch)(a,b),o=(0,f.getCurrentWorkspace)(),q=()=>(0,s.retireMcpRuntimeAuthority)(a.name,o,d,c);try{(0,s.assertMcpRuntimeAuthorityRetired)(a.name),d=(0,l.bG)(a),c=b?.enableRuntimeBroker&&!0===a.enableMcpApps?(0,E.D9)(a.name):void 0;let f=d?(0,l.Uf)(a,d):{},m={command:g,args:h,env:{...i,...c?a.trustedHost?(0,w.s7)(a,c.env):c.env:{},...f},cwd:j,stderr:k?"ignore":"pipe",...k?{maxBufferSize:262144}:{}};k||(Object.freeze(m.args),Object.freeze(m.env),Object.freeze(m)),e=new n.oQ(m),k?(0,v.We)(e,a,k,q):a.trustedHost?(0,w.Zu)(e,a,q,d):((0,s.attachShippedWorkspaceReadiness)(e,a,j),(0,x.uR)(e,a,a=>JSON.stringify([(0,s.stdioConfigKey)(a,b?.isolateRuntimeHome===!0),(0,s.capabilityKey)(a)])))}catch(b){let a=[];try{k?.close()}catch(b){a.push(b)}try{q()}catch(b){a.push(b)}if(a.length)throw new s.McpRuntimeAuthorityRetirementError([b,...a],"MCP transport creation and authority retirement failed.",{cause:b});throw b}let r=e;return r.__flujoRuntimeBrokerLeaseId=c?.leaseId,r.__flujoBundledWorkload=d,r.__flujoRetireRuntimeAuthority=q,r.__flujoStdioKey=(0,s.stdioConfigKey)(a,b?.isolateRuntimeHome===!0),r.__flujoKind="stdio",P.set(e,new D.$6),O.info(`Created v2-beta stdio transport for ${a.name}`),e}let P=new WeakMap;function L(a){return P.get(a)}function M(a){P.get(a)?.attach(a)}function N(a){if(H(a))try{return a.getNegotiatedProtocolVersion()}catch{return}}d()}catch(a){d(a)}})},618836:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(204583),e=c(482964),f=c(624788),g=c(621030),h=c(4551),i=c(770059);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Zg.GLOBAL_ENV_VARS,{}),e=!!d&&"object"==typeof d&&Object.values(d).every(a=>{if(!a||"object"!=typeof a)return!1;let b=a.metadata;return"string"==typeof a.value&&null!==b&&"object"==typeof b&&"boolean"==typeof b.isSecret});j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i=new Map,l=new Set;if(e)for(let[a,b]of Object.entries(d))i.set(a,b.value),b.metadata.isSecret&&l.add(a);else for(let[a,b]of Object.entries(d))i.set(a,b);let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1),e=i.get(b);if(void 0!==e){let f=e;if(!c&&(l.has(b)||f.startsWith("encrypted:")||f.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(f.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=f.substring(10),c=await (0,h.Do)(a);if(c)f=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(f.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,f)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b=new Map;for(let[c,d]of Object.entries(a))b.set(c,await n(d));return Object.fromEntries(b)}return a},o=await n(a);return j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn("Maximum resolution depth reached (10)"),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.Do)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"60eab620425ddbd86cc239ac6b8fc50095e3a9f1ef",null),(0,d.A)(l,"40064b3bb4012d9b48afd736a05e4a27b19486d83b",null),(0,d.A)(m,"6017d1d90a84849ef08e2cd5f773e5acb98dedee0f",null)},620968:(a,b,c)=>{"use strict";c.d(b,{M4:()=>j});var d=c(482964),e=c(943990),f=c(558771),g=c(927739);let h=(0,d.h)("backend/flow/execution/resolveRunResourceRefs"),i=/\$\{res:([^}]+)\}/g;async function j(a,b,c,d,k={},l){if(!a||!a.includes("${res:")||!b)return a?a.replace(i,""):a;i.lastIndex=0;let m=new Set;for(let b=i.exec(a);b;b=i.exec(a))m.add(b[1]);let n=new Map;for(let a of m){let i="";try{let j=await (0,e.FA)(b,a.trim());if(j){let b=await (0,g.Gi)(k,async()=>{let b={at:Date.now(),source:"res-ref",nodeId:d?.nodeId},g=l?await (0,e.fg)(j.uri,{maxChars:l.maxChars,access:b}):void 0;if(g?.truncated)throw new f.X7("SUBFLOW_PREPARATION_TOO_LARGE",`resource text exceeds the ${Math.min(l.maxChars,2e5)} character inline limit; use the resource URI for larger content`);let h=l?g&&{entry:g.entry,contents:{contents:[{uri:j.uri,..."utf8"===j.encoding?{text:g.content}:{}}]}}:await (0,e.gy)(j.uri,b);return h&&c?.({type:"resource:read",node:d,server:"flujo",uri:j.uri,name:a,mimeType:j.mimeType,size:j.size,source:"res-ref"}),h});if(b){let c=b.contents.contents[0];if(c&&"string"==typeof c.text&&"link"!==j.kind)i=`
123
+ ${d}`:d}c.d(b,{gL:()=>d}),c(880013)},588054:(a,b,c)=>{"use strict";c.d(b,{B:()=>j,_:()=>i});var d=c(977598),e=c(482964),f=c(328461);let g=(0,e.h)("backend/services/model/cache");class h{#a;credentialFingerprint(a){return(0,d.createHmac)("sha256",this.#a).update("flujo:provider-catalogue:credential:v1\0","utf8").update(a,"utf8").digest("hex")}currentCache(){let a=(0,f.getCurrentWorkspace)(),b=this.caches.get(a);return b||(b=new Map,this.caches.set(a,b)),b}normalizeTarget(a){return"string"==typeof a?{baseUrl:a}:a}getCacheKey(a){let b=this.normalizeTarget(a),c=b.baseUrl.trim().toLowerCase().replace(/\/$/,"");return JSON.stringify([b.profileId??"",b.provider??"",b.adapter??"",c,b.credentialFingerprint??""])}logIdentity(a){let b=this.normalizeTarget(a);return{baseUrl:b.baseUrl,...b.provider?{provider:b.provider}:{},...b.adapter?{adapter:b.adapter}:{},...b.profileId?{profileId:b.profileId}:{}}}isValid(a){return Date.now()-a.timestamp<a.ttl}get(a){let b=this.getCacheKey(a),c=this.currentCache(),d=c.get(b),e=this.logIdentity(a);return d?this.isValid(d)?(g.debug("Cache hit",{...e,modelCount:d.models.length}),d.models):(g.debug("Cache miss - entry expired",{...e,age:Date.now()-d.timestamp}),c.delete(b),null):(g.debug("Cache miss - no entry found",e),null)}set(a,b,c){let d=this.getCacheKey(a),e={models:b,timestamp:Date.now(),ttl:c||this.DEFAULT_TTL};this.currentCache().set(d,e),g.debug("Models cached",{...this.logIdentity(a),modelCount:b.length,ttl:e.ttl})}clear(a){let b=this.getCacheKey(a),c=this.currentCache().delete(b);g.debug("Cache cleared",{...this.logIdentity(a),deleted:c})}clearAll(){let a=this.currentCache(),b=a.size;a.clear(),g.debug("All cache cleared",{entriesCleared:b})}getStats(){let a=this.currentCache(),b=a.size,c=0,d=0;for(let b of a.values())this.isValid(b)?c++:d++;return{totalEntries:b,validEntries:c,expiredEntries:d}}cleanup(){let a=this.currentCache(),b=[];for(let[c,d]of a.entries())this.isValid(d)||b.push(c);b.forEach(b=>a.delete(b)),b.length>0&&g.debug("Cache cleanup completed",{expiredEntriesRemoved:b.length})}constructor(){this.caches=new Map,this.DEFAULT_TTL=3e5,this.#a=(0,d.randomBytes)(32)}}let i=new h;function j(a,b){if(!b||0===b.trim().length)return a;let c=b.toLowerCase().trim();return a.filter(a=>{let b=a.id.toLowerCase(),d=a.name.toLowerCase();if(b.includes(c)||d.includes(c))return!0;let e=a=>{let b=0,d=0;for(;b<a.length&&d<c.length;)a[b]===c[d]&&d++,b++;return d===c.length};return e(b)||e(d)}).sort((a,b)=>{let d=a.id.toLowerCase(),e=b.id.toLowerCase(),f=a.name.toLowerCase(),g=b.name.toLowerCase(),h=d.includes(c)||f.includes(c),i=e.includes(c)||g.includes(c);return h&&!i?-1:!h&&i?1:a.id.length-b.id.length})}},595075:(a,b,c)=>{"use strict";function d(a,b){if("low"===b)return 1024;if(a.startsWith("data:image/png;base64,")){let b=Buffer.from(a.slice(22,70),"base64");if(b.length>=24&&b.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))){let a=b.readUInt32BE(16),c=b.readUInt32BE(20);if(a&&c)return Math.ceil(a/32)*Math.ceil(c/32)*3}}if(/^data:image\/jpe?g;base64,/i.test(a.slice(0,24))){let b=a.indexOf(",")+1,c=Buffer.from(a.slice(b,b+87384),"base64");for(let a=2;a+9<c.length&&255===c[a];){let b=c[a+1],d=c.readUInt16BE(a+2);if(d<2)break;if([192,193,194].includes(b))return Math.ceil(c.readUInt16BE(a+5)/32)*Math.ceil(c.readUInt16BE(a+7)/32)*3;a+=d+2}}return 8192}function e(a,b,c){let e=0,f=JSON.stringify({messages:a.map(a=>Array.isArray(a.content)?{...a,content:a.content.map(a=>"image_url"!==a.type?a:(e+=d(a.image_url.url,a.image_url.detail),{...a,image_url:{...a.image_url,url:"[native image]"}}))}:a),tools:b??[]});return e+((c?.provider==="openrouter"||c?.adapter==="openrouter-agent")&&c?.name.startsWith("anthropic/")?Buffer.byteLength(f,"utf8"):Math.ceil(f.length/4))}c.d(b,{e:()=>d,y:()=>e})},600916:(a,b,c)=>{"use strict";function d(){let a=!0,b=new Set,c=()=>{if(!a)throw Error("Held read callback scope ended.")};return{assertActive:c,run(a){let d=(async()=>{c();let b=await a();return c(),b})();return b.add(d),d.then(()=>b.delete(d),()=>b.delete(d)),d},async close(){a=!1,await Promise.allSettled([...b])}}}c.d(b,{K:()=>d})},600950:(a,b,c)=>{"use strict";c.d(b,{Jm:()=>h,UR:()=>j,hc:()=>f,kA:()=>k,lr:()=>g,zJ:()=>i});var d=c(130214);let e=new Set(["image","audio","video"]);function f(a){if(a.type&&e.has(a.type))return a.type;if("resource"===a.type&&a.resource&&"string"==typeof a.resource.blob){let b="string"==typeof a.resource.mimeType?a.resource.mimeType:void 0,c=(0,d.X)(b);return"file"===c?void 0:c}}function g(a){let b=f(a),c=i(a);if(!b||!c)return;let d=h(a);return{type:b,data:c,...d?{mimeType:d}:{}}}function h(a){if("string"==typeof a.mimeType)return a.mimeType;let b=a.resource?.mimeType;return"string"==typeof b?b:void 0}function i(a){if("string"==typeof a.data)return a.data;let b=a.resource?.blob;return"string"==typeof b?b:void 0}function j(a){if(!a||!Array.isArray(a.content))return{mediaItems:[],textResult:a,hasMedia:!1};let b=[],c=[];for(let d of a.content){let a=f(d);a?(b.push(d),c.push(function(a,b){let c=h(a)??b,d=i(a)?.length,e=d?` ~${Math.round(3*d/4/1024)} KB`:"";return{type:"text",text:`[${c}${e} media item returned by this tool; delivered to the model as a native ${b} input rather than inline base64]`}}(d,a))):c.push(d)}return 0===b.length?{mediaItems:[],textResult:a,hasMedia:!1}:{mediaItems:b,textResult:{...a,content:c},hasMedia:!0}}function k(a,b,c){return{type:b,...a.mimeType?{mimeType:a.mimeType}:{},...a.name?{name:a.name}:{},resourceUri:a.uri,...c?{localPath:c}:{}}}},601236:(a,b,c)=>{"use strict";c.d(b,{Wn:()=>k,k$:()=>g,n7:()=>l});var d=c(176760),e=c.n(d),f=c(648286);let g="restricted-startup-policy-v1",h=()=>{throw Error("Native Codex startup configuration is unavailable.")};function i(a){let{forced_login_method:b,...c}=f.Hg;return{...c,features:{...c.features,code_mode_host:a}}}function j(a){let b,c=a.model_providers,d=c?.inventory?.base_url;if("inventory"!==a.model_provider||"string"!=typeof d)return h();try{b=new URL(d)}catch{return h()}return"http:"!==b.protocol||"127.0.0.1"!==b.hostname||!b.port||b.username||b.password||b.search||b.hash||"/"!==b.pathname?h():{model_provider:"inventory",check_for_update_on_startup:!1,analytics:{enabled:!1},features:{...f.Hg.features,enable_request_compression:!1,unbounded_connection_retries:!1},model_providers:{inventory:{name:"Source offline inventory fixture",base_url:d,wire_api:"responses",requires_openai_auth:!1,supports_websockets:!1,request_max_retries:0,stream_max_retries:0}}}}function k(a){if(!e().isAbsolute(a.cwd))return h();let b=["project_root_markers=[]",`projects.${JSON.stringify(a.cwd)}.trust_level="untrusted"`];if(a.neutralTrustOverrides&&JSON.stringify(a.neutralTrustOverrides)!==JSON.stringify(b))return h();let{forced_login_method:c}=f.Hg,d={...i(!0===a.personaTools&&"offline-inventory"!==a.authentication),..."chatgpt"===a.authentication?{forced_login_method:c}:{}},g=a.config.model_catalog_json;if(void 0!==g){if("string"!=typeof g||!e().isAbsolute(g))return h();d.model_catalog_json=g}"offline-inventory"===a.authentication&&Object.assign(d,j(a.config));let k=b.flatMap(a=>["-c",a]),l=(a,b)=>{if("string"==typeof a||"boolean"==typeof a)k.push("-c",`${b}=${JSON.stringify(a)}`);else if("number"==typeof a&&Number.isFinite(a))k.push("-c",`${b}=${a}`);else if(!a||"object"!=typeof a||Array.isArray(a))return h();else for(let[c,d]of Object.entries(a))l(d,b?`${b}.${c}`:c)};for(let[a,b]of Object.entries(d))l(b,a);return k.length>256||k.reduce((a,b)=>a+Buffer.byteLength(b),0)>32768?h():k}function l(a,b,c=!1){let{forced_login_method:d,...e}=a,{forced_login_method:g}=f.Hg;return{...e,...i(c&&"offline-inventory"!==b),..."chatgpt"===b?{forced_login_method:g}:{},..."offline-inventory"===b?j(a):{}}}},601748:(a,b,c)=>{"use strict";c.d(b,{P:()=>i,e:()=>j});var d=c(257975),e=c(200797);function f(a){if("string"!=typeof a||0===a.length)throw new e.ExecutionExtensionError("execution_model_step_run_required");return a}function g(a,b){let c=Object.getOwnPropertyDescriptor(a,"executionModelStepOrdinals"),d=c&&Object.hasOwn(c,"value")&&c.enumerable?c.value:void 0;if(!h(d))throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let f=Object.getOwnPropertyDescriptors(d);if(2!==Reflect.ownKeys(f).length||!["logicalRunId","nextByNode"].every(a=>Object.hasOwn(f,a)&&Object.hasOwn(f[a],"value")&&f[a].enumerable)||f.logicalRunId.value!==b||!h(f.nextByNode.value))throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let g=Object.getOwnPropertyDescriptors(f.nextByNode.value);for(let a of Reflect.ownKeys(g)){try{(0,e.assertExecutionModelStepNodeId)(a)}catch{throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid")}let b=g[a],c=b.value;if(!Object.hasOwn(b,"value")||!b.enumerable||!b.writable||!Number.isSafeInteger(c)||c<0||c>e.MAX_EXECUTION_MODEL_STEP_ORDINAL+1)throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid")}return d}function h(a){return!!a&&"object"==typeof a&&!d.types.isProxy(a)&&[Object.prototype,null].includes(Object.getPrototypeOf(a))}function i(a,b){let c=f(a.logicalRunId);if(b!==c){a.executionModelStepOrdinals={logicalRunId:c,nextByNode:{}};return}g(a,c)}function j(a,b,c){(0,e.assertExecutionModelStepNodeId)(b);let d=f(c);if(a.logicalRunId!==d)throw new e.ExecutionExtensionError("execution_model_step_run_state_invalid");let h=g(a,d),i=Object.hasOwn(h.nextByNode,b)?h.nextByNode[b]:0;if(i>e.MAX_EXECUTION_MODEL_STEP_ORDINAL)throw new e.ExecutionExtensionError("execution_model_step_slot_exhausted");return h.nextByNode[b]=i+1,i}},603050:(a,b,c)=>{"use strict";c.d(b,{AQ:()=>h,iL:()=>g});let d="io.flujo/host-owner-scope",e=a=>null===a||"object"!=typeof a||Array.isArray(a)?void 0:a;function f(a){return"string"==typeof a&&a.length>0&&a.length<=512&&a.trim()===a}function g(a,b){let c=e(a);if(!c)return a;let g=e(c._meta),h=f(b)?b:void 0;if(void 0===h&&!Object.hasOwn(g??{},d))return a;let i={...g};return delete i[d],void 0!==h&&(i[d]=h),{...c,_meta:i}}function h(a){if(void 0!==a)try{let b="string"==typeof a?JSON.parse(a):a,c=e(e(b)?._meta),g=c?.[d];return f(g)?g:void 0}catch{return}}},603886:(a,b,c)=>{"use strict";c.d(b,{y:()=>h});var d=c(295062);let e=["input_tokens","output_tokens","cache_creation_input_tokens","cache_read_input_tokens"],f=()=>({input_tokens:0,output_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0}),g=(a,b)=>{for(let c of e)a[c]+=b[c]??0};class h{constructor(a){this.steps=new Map,this.activeSteps=new Map,this.observedAtResult=f(),this.childrenAtResult=f(),this.modelUsage={},this.anonymousId=0,this.cumulativeOffset=f(),this.cumulativeCostOffset=0,this.seenResults=new Set,this.checkpoint=a,this.baseline=this.countCheckpoint(a),this.baselineCost=a?.totalCostUsd??0}countCheckpoint(a){let b=f();for(let c of Object.values(a?.modelUsage??{}))g(b,{input_tokens:c.inputTokens,output_tokens:c.outputTokens,cache_read_input_tokens:c.cacheReadInputTokens,cache_creation_input_tokens:c.cacheCreationInputTokens});return b}observe(a){if(!a||"object"!=typeof a)return;let b=a.parent_tool_use_id??"";if("stream_event"===a.type){let c=a.event;if(c?.type==="message_start"&&c.message?.id)this.activeSteps.set(b,c.message.id),this.update(b,c.message.id,c.message.usage,c.message.model,!1);else if(c?.type==="message_delta"){let a=this.activeSteps.get(b);a&&this.update(b,a,c.usage,void 0,!0)}else c?.type==="message_stop"&&this.activeSteps.delete(b)}else if("assistant"===a.type&&a.message?.usage){let c=a.message,d=c.id??this.activeSteps.get(b)??a.uuid??`anonymous-${++this.anonymousId}`;this.update(b,d,c.usage,c.model,!1)}else if("result"===a.type){if(a.uuid&&this.seenResults.has(a.uuid)||(a.uuid&&this.seenResults.add(a.uuid),void 0!==a.result_index&&void 0!==this.lastResultIndex&&a.result_index<=this.lastResultIndex))return;void 0!==a.result_index&&(this.lastResultIndex=a.result_index);let b=Object.values(a.modelUsage??{});if((a.is_error||a.subtype?.startsWith("error"))&&!b.some(a=>(a.inputTokens??0)>0||(a.outputTokens??0)>0||(a.cacheReadInputTokens??0)>0||(a.cacheCreationInputTokens??0)>0)&&!e.some(b=>(a.usage?.[b]??0)>0))return;if(b.length){this.modelUsage=a.modelUsage;let c=f();for(let a of b)g(c,{input_tokens:a.inputTokens,output_tokens:a.outputTokens,cache_read_input_tokens:a.cacheReadInputTokens,cache_creation_input_tokens:a.cacheCreationInputTokens});let d=this.countCheckpoint(this.checkpoint);if(e.some(a=>c[a]<d[a])){for(let a of e)this.cumulativeOffset[a]+=Math.max(0,d[a]-this.baseline[a]);this.cumulativeCostOffset+=Math.max(0,(this.checkpoint?.totalCostUsd??0)-this.baselineCost),this.baseline=f(),this.baselineCost=0}for(let a of(this.reportedTotals=f(),e))this.reportedTotals[a]=this.cumulativeOffset[a]+Math.max(0,c[a]-this.baseline[a]);this.checkpoint={modelUsage:Object.fromEntries(Object.entries(a.modelUsage).map(([a,b])=>[a,{inputTokens:b.inputTokens??0,outputTokens:b.outputTokens??0,cacheReadInputTokens:b.cacheReadInputTokens??0,cacheCreationInputTokens:b.cacheCreationInputTokens??0}])),...Number.isFinite(a.total_cost_usd)?{totalCostUsd:a.total_cost_usd}:{}}}else{if(!a.usage)return;this.reportedTotals??=f(),g(this.reportedTotals,a.usage);let b=this.sumSteps(!0);for(let a of e)this.reportedTotals[a]+=Math.max(0,b[a]-this.childrenAtResult[a])}this.observedAtResult=this.sumSteps(),this.childrenAtResult=this.sumSteps(!0)}}update(a,b,c,d,f){if(!c)return;let g=`${a}\0${b}`,h=this.steps.get(g);for(let b of(!h&&(h={usage:{},hasOutput:!1,isChild:!!a},this.steps.set(g,h),a||(this.latestRootStep=h)),d&&(h.model=d),e)){if("output_tokens"===b&&!f)continue;let a=c[b];"number"==typeof a&&Number.isFinite(a)&&a>=0&&(h.usage[b]=a)}f&&null!=c.output_tokens&&(h.hasOutput=!0)}sumSteps(a=!1){let b=f();for(let c of this.steps.values())(!a||c.isChild)&&g(b,c.usage);return b}getUsage(){if(!this.reportedTotals&&!this.steps.size)return;let a=this.sumSteps();if(!this.reportedTotals)return a;let b={...this.reportedTotals};for(let c of e)b[c]+=Math.max(0,a[c]-this.observedAtResult[c]);return b}getCheckpoint(){return this.checkpoint}getAccounting(){return{scope:"completion",costBasis:"sdk-estimate",usage:this.getUsage(),...this.checkpoint?.totalCostUsd!==void 0?{estimatedCostUsd:this.cumulativeCostOffset+Math.max(0,this.checkpoint.totalCostUsd-this.baselineCost)}:{},childRequestUsage:this.sumSteps(!0)}}getContextUsage(a){let b=this.latestRootStep;if(!b||null==b.usage.input_tokens)return null;let c=(0,d.k)(b.usage),e=Object.values(this.modelUsage),f=(b.model?this.modelUsage[b.model]??e.find(a=>a.canonicalModel===b.model):1===e.length?e[0]:void 0)?.contextWindow,g="number"==typeof f&&Number.isFinite(f)&&f>0?f:void 0,h=g??a;return{promptTokens:c.promptTokens,...b.hasOutput?{completionTokens:c.completionTokens,totalTokens:c.totalTokens}:{},..."number"==typeof h&&Number.isFinite(h)&&h>0?{contextWindow:h,contextWindowSource:g?"runtime":"configured"}:{}}}}},608878:(a,b,c)=>{"use strict";c.d(b,{YA:()=>e,uz:()=>f});var d=c(193640);function e(a){return"stdio"===a.transport&&(0,d.G)(a.command,a.args??[])}function f(a){return e(a)?9e4:15e3}},617758:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{UQ:()=>L,e:()=>I,gf:()=>K,nK:()=>N,po:()=>M,q1:()=>G,s5:()=>H});var e=c(825969),f=c(328461),g=c(361784),h=c(687161),i=c(768680),j=c(964870),k=c(94917),l=c(275424),m=c(591657),n=c(116416),o=c(482964),p=c(296951),q=c(624788),r=c(621030),s=c(584861),t=c(510217),u=c(560921),v=c(405087),w=c(687720),x=c(646460),y=c(868644),z=c(622838),A=c(749976),B=c(216085),C=c(214799),D=c(157721),E=c(378591),F=a([s,z]);[s,z]=F.then?(await F)():F;let O=(0,o.h)("backend/services/mcp/betaClient");async function G(){try{let a=await (0,q.loadItem)(r.Zg.SPEECH_SETTINGS,void 0);return!!a?.experimental?.mcpBetaProtocol}catch(a){return O.warn("Failed to read mcpBetaProtocol setting; defaulting to disabled",{err:a}),!1}}function H(a){return!0===a.__flujoBeta}function I(a,b){let d=(0,z.jV)(a),l=(0,A.fy)(a),n=!0===a.enableMcpApps,o="stdio"===a.transport&&void 0===a.isolation,p={name:`flujo-${a.name}-client`,version:"3.48.7"},q={roots:{listChanged:!0},...d?{sampling:{}}:{},...o||l?{elicitation:{...o?{url:{}}:{},...l?{form:{}}:{}}}:{},extensions:{...!0===a.enableMcpSkills?{[h.ET]:{}}:{},...o?{[C.OM]:C.XC}:{},...n?{[B.OF]:{mimeTypes:[B.cM]}}:{}}},r=new m.Kj(p,{capabilities:q,listChanged:{tools:{autoRefresh:!1,onChanged:()=>{}},prompts:{autoRefresh:!1,onChanged:()=>{}},resources:{autoRefresh:!1,onChanged:()=>b?.()}},versionNegotiation:{mode:"stdio"===a.transport?"legacy":"auto"}}),t=(0,y.sG)(a,r),u=d?(0,z.c3)(a):void 0,v=o||l?(0,A.Cd)(a):void 0;if((0,e.zD)(r,"roots/list",t),u&&(0,e.zD)(r,"sampling/createMessage",u),v&&(0,e.zD)(r,"elicitation/create",v),r.setRequestHandler("roots/list",async(a,b)=>{b.mcpReq.signal.throwIfAborted();let c=await t();return b.mcpReq.signal.throwIfAborted(),c}),d&&r.setRequestHandler("sampling/createMessage",async(a,b)=>u(a,{signal:b.mcpReq.signal})),(o||l)&&r.setRequestHandler("elicitation/create",async(a,b)=>v(a,{signal:b.mcpReq.signal})),"stdio"!==a.transport&&void 0===a.isolation&&void 0===a.trustedHost){let b=(0,f.bindToCurrentWorkspace)(async()=>{if(!i.Gv.ENABLE_MCP_TASKS_CLIENT)return!1;let{mcpService:b}=await Promise.resolve().then(c.bind(c,373327));return b.getClient(a.name)===r});(0,g.Wk)(r,{endpointId:(0,f.workspaceCacheKey)(a.name),clientInfo:p,clientCapabilities:q,authorizeLateTaskCancellation:b,isAuthorityCurrent:b,handleInputRequest:(0,f.bindToCurrentWorkspace)(async(c,d,f)=>{let g=async()=>{if(d?.throwIfAborted(),!await b())throw Error("MCP Tasks input connection is no longer current");let c=(0,k.lx)(a.name);if(void 0!==f&&(!c||c.conversationId!==f||c.getUnattended()))throw Error("MCP Tasks input owner is no longer attended")};if(await g(),"elicitation/create"===c.method&&!l)throw Error("The requested MCP Tasks input capability is disabled");let h=await (0,e.jq)(r,c,{signal:d,assertCurrent:g,expectedConversationId:f});return await g(),j.t5.parse(h)})})}return r.__flujoBeta=!0,r.__flujoCapKey=(0,s.capabilityKey)(a),O.info(`Created split-SDK MCP client for ${a.name} (version negotiation: ${"stdio"===a.transport?"legacy":"auto"})`),r}function J(a){let b=a.requestInit&&"object"==typeof a.requestInit?a.requestInit:void 0;if(a.headers&&"object"==typeof a.headers){let c=(0,s.flattenCustomHeaders)(a.headers);Object.keys(c).length>0&&(b={...b||{},headers:{...b?.headers||{},...c}})}return b}function K(a,b){let c,d,e;if((0,p.SL)(a),(void 0!==a.isolation||void 0!==a.trustedHost)&&"stdio"!==a.transport)throw new u.Bk("ISOLATION_POLICY_INVALID");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=J(a);if(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){let c=(0,t.Cl)(a);b.fetch=c.oauthFetch,b.authProvider=c}let d=new m.jS(new URL(a.serverUrl),b);return d.__flujoHttpKey=(0,s.httpConfigKey)(a),d.__flujoKind="streamable",O.info(`Created v2-beta streamable transport for ${a.name}`),d}if("sse"===a.transport){let b={},c=J(a);c&&(b.requestInit=c),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit);let d=new m.Am(new URL(a.serverUrl),b);return d.__flujoHttpKey=(0,s.httpConfigKey)(a),d.__flujoKind="sse",O.info(`Created v2-beta SSE transport for ${a.name}`),d}let{command:g,args:h,env:i,cwd:j,isolation:k}=(0,s.resolveStdioLaunch)(a,b),o=(0,f.getCurrentWorkspace)(),q=()=>(0,s.retireMcpRuntimeAuthority)(a.name,o,d,c);try{(0,s.assertMcpRuntimeAuthorityRetired)(a.name),d=(0,l.bG)(a),c=b?.enableRuntimeBroker&&!0===a.enableMcpApps?(0,E.D9)(a.name):void 0;let f=d?(0,l.Uf)(a,d):{},m={command:g,args:h,env:{...i,...c?a.trustedHost?(0,w.s7)(a,c.env):c.env:{},...f},cwd:j,stderr:k?"ignore":"pipe",...k?{maxBufferSize:262144}:{}};k||(Object.freeze(m.args),Object.freeze(m.env),Object.freeze(m)),e=new n.oQ(m),k?(0,v.We)(e,a,k,q):a.trustedHost?(0,w.Zu)(e,a,q,d):((0,s.attachShippedWorkspaceReadiness)(e,a,j),(0,x.uR)(e,a,a=>JSON.stringify([(0,s.stdioConfigKey)(a,b?.isolateRuntimeHome===!0),(0,s.capabilityKey)(a)])))}catch(b){let a=[];try{k?.close()}catch(b){a.push(b)}try{q()}catch(b){a.push(b)}if(a.length)throw new s.McpRuntimeAuthorityRetirementError([b,...a],"MCP transport creation and authority retirement failed.",{cause:b});throw b}let r=e;return r.__flujoRuntimeBrokerLeaseId=c?.leaseId,r.__flujoBundledWorkload=d,r.__flujoRetireRuntimeAuthority=q,r.__flujoStdioKey=(0,s.stdioConfigKey)(a,b?.isolateRuntimeHome===!0),r.__flujoKind="stdio",P.set(e,new D.$6),O.info(`Created v2-beta stdio transport for ${a.name}`),e}let P=new WeakMap;function L(a){return P.get(a)}function M(a){P.get(a)?.attach(a)}function N(a){if(H(a))try{return a.getNegotiatedProtocolVersion()}catch{return}}d()}catch(a){d(a)}})},618836:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(204583),e=c(482964),f=c(624788),g=c(621030),h=c(4551),i=c(770059);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Zg.GLOBAL_ENV_VARS,{}),e=!!d&&"object"==typeof d&&Object.values(d).every(a=>{if(!a||"object"!=typeof a)return!1;let b=a.metadata;return"string"==typeof a.value&&null!==b&&"object"==typeof b&&"boolean"==typeof b.isSecret});j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i=new Map,l=new Set;if(e)for(let[a,b]of Object.entries(d))i.set(a,b.value),b.metadata.isSecret&&l.add(a);else for(let[a,b]of Object.entries(d))i.set(a,b);let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1),e=i.get(b);if(void 0!==e){let f=e;if(!c&&(l.has(b)||f.startsWith("encrypted:")||f.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(f.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=f.substring(10),c=await (0,h.Do)(a);if(c)f=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(f.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,f)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b=new Map;for(let[c,d]of Object.entries(a))b.set(c,await n(d));return Object.fromEntries(b)}return a},o=await n(a);return j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn("Maximum resolution depth reached (10)"),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.Do)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"600ff7d2206eae52f9d771674d5f8029e5c095bb5e",null),(0,d.A)(l,"40841aa02a531ebbf36e631e77030d97227e9d3930",null),(0,d.A)(m,"6024367037e23f118f42c473679aff2d02bbea4b67",null)},620968:(a,b,c)=>{"use strict";c.d(b,{M4:()=>j});var d=c(482964),e=c(943990),f=c(558771),g=c(927739);let h=(0,d.h)("backend/flow/execution/resolveRunResourceRefs"),i=/\$\{res:([^}]+)\}/g;async function j(a,b,c,d,k={},l){if(!a||!a.includes("${res:")||!b)return a?a.replace(i,""):a;i.lastIndex=0;let m=new Set;for(let b=i.exec(a);b;b=i.exec(a))m.add(b[1]);let n=new Map;for(let a of m){let i="";try{let j=await (0,e.FA)(b,a.trim());if(j){let b=await (0,g.Gi)(k,async()=>{let b={at:Date.now(),source:"res-ref",nodeId:d?.nodeId},g=l?await (0,e.fg)(j.uri,{maxChars:l.maxChars,access:b}):void 0;if(g?.truncated)throw new f.X7("SUBFLOW_PREPARATION_TOO_LARGE",`resource text exceeds the ${Math.min(l.maxChars,2e5)} character inline limit; use the resource URI for larger content`);let h=l?g&&{entry:g.entry,contents:{contents:[{uri:j.uri,..."utf8"===j.encoding?{text:g.content}:{}}]}}:await (0,e.gy)(j.uri,b);return h&&c?.({type:"resource:read",node:d,server:"flujo",uri:j.uri,name:a,mimeType:j.mimeType,size:j.size,source:"res-ref"}),h});if(b){let c=b.contents.contents[0];if(c&&"string"==typeof c.text&&"link"!==j.kind)i=`
124
124
  --- resource ${a} (${j.uri}) ---
125
125
  ${c.text}
126
126
  --- end resource ${a} ---