flujo-ai 3.26.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (706) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +470 -306
  3. package/.next/app-path-routes-manifest.json +28 -8
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +24 -0
  6. package/.next/react-loadable-manifest.json +31 -18
  7. package/.next/routes-manifest.json +29 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_not-found.html +1 -1
  10. package/.next/server/app/_not-found.rsc +2 -2
  11. package/.next/server/app/api/approvals/[id]/route.js +1 -1
  12. package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
  13. package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/approvals/route.js +2 -2
  15. package/.next/server/app/api/approvals/route.js.nft.json +1 -1
  16. package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/backup/route.js +1 -1
  18. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  19. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/bugs/enhance/route.js +3 -3
  22. package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
  23. package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/cwd/route.js +1 -1
  25. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/encryption/secure/route.js +1 -1
  27. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  28. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/env/route.js +2 -2
  30. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/flow/[id]/route.js +1 -1
  32. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js +1 -0
  35. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -0
  36. package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -0
  37. package/.next/server/app/api/flow/[id]/versions/route.js +1 -0
  38. package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -0
  39. package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -0
  40. package/.next/server/app/api/flow/compile/route.js +1 -1
  41. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  42. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/flow/generate/route.js +1 -1
  44. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  45. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/flow/improve/route.js +1 -1
  47. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  48. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
  50. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  51. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/flow/quick-chat/route.js +1 -1
  53. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  54. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/flow/repair/route.js +1 -1
  56. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  57. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/flow/route.js +1 -1
  59. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  60. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/git/route.js +2 -2
  62. package/.next/server/app/api/git/route.js.nft.json +1 -1
  63. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/init/route.js +1 -1
  65. package/.next/server/app/api/init/route.js.nft.json +1 -1
  66. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/mcp/app-sandbox/route.js +1 -0
  71. package/.next/server/app/api/mcp/app-sandbox/route.js.nft.json +1 -0
  72. package/.next/server/app/api/mcp/app-sandbox/route_client-reference-manifest.js +1 -0
  73. package/.next/server/app/api/mcp/cancel/route.js +2 -2
  74. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  75. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/mcp/oauth-capability/route.js +1 -0
  77. package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -0
  78. package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -0
  79. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  81. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
  83. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
  86. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  87. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
  89. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  90. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
  92. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  93. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
  95. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  96. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
  98. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
  101. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  102. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/mcp/servers/route.js +1 -1
  104. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  105. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  107. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  108. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  110. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  111. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/mcp-registry/route.js +2 -2
  113. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  114. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  116. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/model/[id]/route.js +1 -1
  118. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  119. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/model/provider/route.js +2 -2
  121. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  122. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/model/route.js +1 -1
  124. package/.next/server/app/api/model/route.js.nft.json +1 -1
  125. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/model/test/route.js +2 -2
  127. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  128. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/oauth/callback/route.js +2 -2
  130. package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
  131. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/oauth/initiate/route.js +2 -2
  133. package/.next/server/app/api/oauth/initiate/route.js.nft.json +1 -1
  134. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/oauth/reset/route.js +2 -2
  136. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  137. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/packages/build/route.js +1 -0
  139. package/.next/server/app/api/packages/build/route.js.nft.json +1 -0
  140. package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -0
  141. package/.next/server/app/api/packages/derive-secrets/route.js +1 -0
  142. package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -0
  143. package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -0
  144. package/.next/server/app/api/packages/install/route.js +1 -0
  145. package/.next/server/app/api/packages/install/route.js.nft.json +1 -0
  146. package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -0
  147. package/.next/server/app/api/packages/install/status/route.js +1 -0
  148. package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -0
  149. package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -0
  150. package/.next/server/app/api/packages/installed/route.js +1 -0
  151. package/.next/server/app/api/packages/installed/route.js.nft.json +1 -0
  152. package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -0
  153. package/.next/server/app/api/packages/resolve/route.js +1 -0
  154. package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -0
  155. package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -0
  156. package/.next/server/app/api/packages/uninstall/route.js +1 -0
  157. package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -0
  158. package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -0
  159. package/.next/server/app/api/planned-executions/[id]/route.js +2 -2
  160. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/planned-executions/[id]/run/route.js +2 -2
  163. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  164. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/planned-executions/[id]/runs/route.js +2 -2
  166. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  167. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
  170. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  171. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/planned-executions/route.js +1 -1
  173. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  174. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/registry/auth/resend/route.js +1 -0
  176. package/.next/server/app/api/registry/auth/resend/route.js.nft.json +1 -0
  177. package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app/api/registry/auth/reset/route.js +1 -0
  179. package/.next/server/app/api/registry/auth/reset/route.js.nft.json +1 -0
  180. package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -0
  181. package/.next/server/app/api/registry/auth/route.js +1 -0
  182. package/.next/server/app/api/registry/auth/route.js.nft.json +1 -0
  183. package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -0
  184. package/.next/server/app/api/registry/oauth/callback/route.js +1 -0
  185. package/.next/server/app/api/registry/oauth/callback/route.js.nft.json +1 -0
  186. package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -0
  187. package/.next/server/app/api/registry/oauth/initiate/route.js +1 -0
  188. package/.next/server/app/api/registry/oauth/initiate/route.js.nft.json +1 -0
  189. package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -0
  190. package/.next/server/app/api/registry/publish/route.js +1 -0
  191. package/.next/server/app/api/registry/publish/route.js.nft.json +1 -0
  192. package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -0
  193. package/.next/server/app/api/registry/settings/route.js +1 -0
  194. package/.next/server/app/api/registry/settings/route.js.nft.json +1 -0
  195. package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -0
  196. package/.next/server/app/api/restore/route.js +1 -1
  197. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  198. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/runs/active/route.js +2 -2
  200. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  201. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/storage/route.js +1 -1
  203. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/update/route.js +1 -1
  205. package/.next/server/app/api/update/route.js.nft.json +1 -1
  206. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/waves/route.js +1 -1
  208. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  209. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  211. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  212. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/chat/page.js +9 -10
  214. package/.next/server/app/chat/page.js.nft.json +1 -1
  215. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/chat.html +1 -1
  217. package/.next/server/app/chat.rsc +3 -3
  218. package/.next/server/app/docs/page.js +7 -6
  219. package/.next/server/app/docs/page.js.nft.json +1 -1
  220. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/docs.html +1 -1
  222. package/.next/server/app/docs.rsc +3 -3
  223. package/.next/server/app/executions/page.js +39 -3
  224. package/.next/server/app/executions/page.js.nft.json +1 -1
  225. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/executions.html +1 -1
  227. package/.next/server/app/executions.rsc +3 -3
  228. package/.next/server/app/flows/page.js +3 -3
  229. package/.next/server/app/flows/page.js.nft.json +1 -1
  230. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/flows.html +1 -1
  232. package/.next/server/app/flows.rsc +4 -4
  233. package/.next/server/app/index.html +1 -1
  234. package/.next/server/app/index.rsc +3 -3
  235. package/.next/server/app/mcp/page.js +14 -14
  236. package/.next/server/app/mcp/page.js.nft.json +1 -1
  237. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/mcp-flows/route.js +1 -1
  239. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  240. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  242. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  243. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/mcp.html +1 -1
  245. package/.next/server/app/mcp.rsc +3 -3
  246. package/.next/server/app/models/page.js +2 -2
  247. package/.next/server/app/models/page.js.nft.json +1 -1
  248. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/packages/page.js +2 -0
  250. package/.next/server/app/packages/page.js.nft.json +1 -0
  251. package/.next/server/app/packages/page_client-reference-manifest.js +1 -0
  252. package/.next/server/app/packages.html +1 -0
  253. package/.next/server/app/packages.meta +7 -0
  254. package/.next/server/app/packages.rsc +22 -0
  255. package/.next/server/app/page.js +1 -1
  256. package/.next/server/app/page.js.nft.json +1 -1
  257. package/.next/server/app/page_client-reference-manifest.js +1 -1
  258. package/.next/server/app/settings/page.js +2 -2
  259. package/.next/server/app/settings/page.js.nft.json +1 -1
  260. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  261. package/.next/server/app/settings.html +1 -1
  262. package/.next/server/app/settings.rsc +3 -3
  263. package/.next/server/app/v1/chat/completions/route.js +1 -1
  264. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  265. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  267. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  268. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  270. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  271. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  273. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  274. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  276. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  277. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  279. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  280. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +3 -3
  282. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  283. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
  285. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  287. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  288. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
  290. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  291. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/v1/chat/conversations/route.js +2 -2
  293. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  294. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/v1/chat/events/route.js +11 -0
  296. package/.next/server/app/v1/chat/events/route.js.nft.json +1 -0
  297. package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -0
  298. package/.next/server/app/v1/models/route.js +2 -2
  299. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  300. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  301. package/.next/server/app/waves/page.js +4 -4
  302. package/.next/server/app/waves/page.js.nft.json +1 -1
  303. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  304. package/.next/server/app/waves.html +1 -1
  305. package/.next/server/app/waves.rsc +3 -3
  306. package/.next/server/app-paths-manifest.json +28 -8
  307. package/.next/server/chunks/1083.js +1 -1
  308. package/.next/server/chunks/1114.js +1 -1
  309. package/.next/server/chunks/1197.js +1 -1
  310. package/.next/server/chunks/1226.js +1 -1
  311. package/.next/server/chunks/1314.js +1 -0
  312. package/.next/server/chunks/1604.js +70 -0
  313. package/.next/server/chunks/1615.js +1 -0
  314. package/.next/server/chunks/1659.js +1 -1
  315. package/.next/server/chunks/166.js +5 -5
  316. package/.next/server/chunks/1805.js +1 -0
  317. package/.next/server/chunks/1819.js +2 -0
  318. package/.next/server/chunks/1925.js +1 -0
  319. package/.next/server/chunks/2388.js +1 -0
  320. package/.next/server/chunks/2434.js +2 -0
  321. package/.next/server/chunks/2666.js +1 -0
  322. package/.next/server/chunks/2859.js +1 -1
  323. package/.next/server/chunks/2940.js +46 -0
  324. package/.next/server/chunks/2985.js +1 -0
  325. package/.next/server/chunks/3128.js +62 -0
  326. package/.next/server/chunks/3273.js +1 -0
  327. package/.next/server/chunks/3298.js +1 -1
  328. package/.next/server/chunks/{8445.js → 3392.js} +2 -2
  329. package/.next/server/chunks/346.js +1 -0
  330. package/.next/server/chunks/3570.js +249 -0
  331. package/.next/server/chunks/3629.js +1 -0
  332. package/.next/server/chunks/38.js +2 -2
  333. package/.next/server/chunks/3951.js +151 -0
  334. package/.next/server/chunks/4042.js +1 -0
  335. package/.next/server/chunks/4265.js +1 -1
  336. package/.next/server/chunks/4306.js +1 -0
  337. package/.next/server/chunks/4322.js +1 -0
  338. package/.next/server/chunks/4426.js +6 -0
  339. package/.next/server/chunks/{6745.js → 4661.js} +1 -1
  340. package/.next/server/chunks/4671.js +1 -1
  341. package/.next/server/chunks/4681.js +1 -0
  342. package/.next/server/chunks/4765.js +1 -0
  343. package/.next/server/chunks/4771.js +2 -2
  344. package/.next/server/chunks/5067.js +1 -0
  345. package/.next/server/chunks/5096.js +1 -0
  346. package/.next/server/chunks/510.js +1 -0
  347. package/.next/server/chunks/5148.js +1 -1
  348. package/.next/server/chunks/{4578.js → 5150.js} +1 -1
  349. package/.next/server/chunks/5200.js +1 -0
  350. package/.next/server/chunks/5463.js +1 -1
  351. package/.next/server/chunks/5471.js +1 -0
  352. package/.next/server/chunks/5544.js +5 -5
  353. package/.next/server/chunks/5708.js +6 -5
  354. package/.next/server/chunks/5880.js +1 -0
  355. package/.next/server/chunks/5958.js +2 -0
  356. package/.next/server/chunks/6005.js +1 -0
  357. package/.next/server/chunks/6126.js +53 -0
  358. package/.next/server/chunks/6529.js +5 -0
  359. package/.next/server/chunks/6537.js +1 -1
  360. package/.next/server/chunks/6826.js +1 -1
  361. package/.next/server/chunks/6849.js +66 -0
  362. package/.next/server/chunks/688.js +3 -0
  363. package/.next/server/chunks/701.js +1 -1
  364. package/.next/server/chunks/7032.js +1 -1
  365. package/.next/server/chunks/7214.js +4 -4
  366. package/.next/server/chunks/724.js +1 -1
  367. package/.next/server/chunks/7463.js +4 -4
  368. package/.next/server/chunks/7506.js +1 -1
  369. package/.next/server/chunks/7538.js +21 -0
  370. package/.next/server/chunks/7579.js +8 -7
  371. package/.next/server/chunks/{3030.js → 7674.js} +1 -1
  372. package/.next/server/chunks/7821.js +1 -1
  373. package/.next/server/chunks/793.js +393 -0
  374. package/.next/server/chunks/8037.js +1 -0
  375. package/.next/server/chunks/8165.js +3 -0
  376. package/.next/server/chunks/8339.js +1 -0
  377. package/.next/server/chunks/8387.js +1 -1
  378. package/.next/server/chunks/8522.js +2 -0
  379. package/.next/server/chunks/8568.js +12 -0
  380. package/.next/server/chunks/8667.js +1 -0
  381. package/.next/server/chunks/869.js +2 -0
  382. package/.next/server/chunks/{3489.js → 8730.js} +1 -1
  383. package/.next/server/chunks/8739.js +2 -2
  384. package/.next/server/chunks/8745.js +1 -1
  385. package/.next/server/chunks/8979.js +37 -0
  386. package/.next/server/chunks/8994.js +1 -1
  387. package/.next/server/chunks/9165.js +1 -1
  388. package/.next/server/chunks/9285.js +1 -1
  389. package/.next/server/chunks/94.js +1 -1
  390. package/.next/server/chunks/9400.js +2 -0
  391. package/.next/server/chunks/{4456.js → 9472.js} +2 -2
  392. package/.next/server/chunks/9583.js +1 -0
  393. package/.next/server/chunks/9671.js +1 -0
  394. package/.next/server/chunks/9724.js +393 -0
  395. package/.next/server/chunks/991.js +2 -0
  396. package/.next/server/functions-config-manifest.json +1 -0
  397. package/.next/server/instrumentation.js +1 -1
  398. package/.next/server/instrumentation.js.nft.json +1 -1
  399. package/.next/server/middleware-build-manifest.js +1 -1
  400. package/.next/server/middleware-manifest.json +1 -1
  401. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  402. package/.next/server/pages/404.html +1 -1
  403. package/.next/server/pages/500.html +1 -1
  404. package/.next/server/server-reference-manifest.js +1 -1
  405. package/.next/server/server-reference-manifest.json +1 -1
  406. package/.next/server/src/middleware.js +1 -1
  407. package/.next/server/src/middleware.js.map +1 -1
  408. package/.next/static/Q6ITx_bZyoEOnKdZu_C7j/_buildManifest.js +1 -0
  409. package/.next/static/chunks/1594-309fa6363f215d76.js +1 -0
  410. package/.next/static/chunks/1809-e56cf3c476261e34.js +1 -0
  411. package/.next/static/chunks/1937-6bbdcdc660db562c.js +1 -0
  412. package/.next/static/chunks/1988-1b651d581fc44a36.js +1 -0
  413. package/.next/static/chunks/{2003-7710c23acaef11c9.js → 2003-f826c607d609d1fa.js} +1 -1
  414. package/.next/static/chunks/2164-7d6451e88a447de7.js +1 -0
  415. package/.next/static/chunks/218-6cbe09820faa3272.js +1 -0
  416. package/.next/static/chunks/2566-60acd5838abd9f3f.js +1 -0
  417. package/.next/static/chunks/{2403-5c26e0abd76095b1.js → 2800-4fa29a3eeb693593.js} +1 -1
  418. package/.next/static/chunks/289-98f50bfcf833d661.js +1 -0
  419. package/.next/static/chunks/3089.9e15df4ffd0fe4e8.js +1 -0
  420. package/.next/static/chunks/{3217.f728df99ab5da33c.js → 3217.260785c2198d1e9d.js} +1 -1
  421. package/.next/static/chunks/3392-6dd9ad3be66a7ce9.js +1 -0
  422. package/.next/static/chunks/3418-a2f5d0c4f29ee2fb.js +1 -0
  423. package/.next/static/chunks/{3556-3b6f7c99b015b752.js → 3556-b9855146c7506696.js} +1 -1
  424. package/.next/static/chunks/3827-9e9a6e11ef808d90.js +1 -0
  425. package/.next/static/chunks/3910.5c6885d7a5bd753e.js +1 -0
  426. package/.next/static/chunks/3948-1cb8fc7a64805254.js +1 -0
  427. package/.next/static/chunks/3958-5641a828b320f2fe.js +100 -0
  428. package/.next/static/chunks/{488-623d07c3fbc21e28.js → 488-7ab54d8ae2b4b550.js} +1 -1
  429. package/.next/static/chunks/5328-4e556503b70e72b4.js +1 -0
  430. package/.next/static/chunks/{5512.d01d565f73109a1a.js → 5512.682bef7fd3a7c286.js} +1 -1
  431. package/.next/static/chunks/6195-8c4c57628e9013d5.js +1 -0
  432. package/.next/static/chunks/6669-a949326b30ea1d39.js +1 -0
  433. package/.next/static/chunks/6777-4b0d05731a089de4.js +1 -0
  434. package/.next/static/chunks/6947-0ff3545efb53e959.js +1 -0
  435. package/.next/static/chunks/7111-44538f8a64241b74.js +1 -0
  436. package/.next/static/chunks/7304-e7cd725083617b81.js +8 -0
  437. package/.next/static/chunks/7445-2802e158c9093556.js +1 -0
  438. package/.next/static/chunks/795-704a0e742ecc2ef6.js +1 -0
  439. package/.next/static/chunks/812-3ceea0da38ad2891.js +1 -0
  440. package/.next/static/chunks/{8345.fbc0af16acce7256.js → 8345.bc5534ec13abc9ee.js} +1 -1
  441. package/.next/static/chunks/8401-0f39d91810180a88.js +1 -0
  442. package/.next/static/chunks/{8405.e728bc83a7c9fed6.js → 8405.73e8be2c8e5b55c5.js} +1 -1
  443. package/.next/static/chunks/8551-a28272acfda62ac9.js +1 -0
  444. package/.next/static/chunks/8855-02889c9ab4bf0bcf.js +1 -0
  445. package/.next/static/chunks/{8989-401559d9f3bc80a0.js → 8989-5fa9c7c670eb9a1a.js} +1 -1
  446. package/.next/static/chunks/{9164-829ab5b085ec06d6.js → 9164-840f056a0e11d979.js} +1 -1
  447. package/.next/static/chunks/9562-ef0ddd4e6b9023cf.js +1 -0
  448. package/.next/static/chunks/app/api/approvals/[id]/route-c745e5b53b81491a.js +1 -0
  449. package/.next/static/chunks/app/api/approvals/route-c745e5b53b81491a.js +1 -0
  450. package/.next/static/chunks/app/api/backup/route-c745e5b53b81491a.js +1 -0
  451. package/.next/static/chunks/app/api/browse/route-c745e5b53b81491a.js +1 -0
  452. package/.next/static/chunks/app/api/bugs/enhance/route-c745e5b53b81491a.js +1 -0
  453. package/.next/static/chunks/app/api/cwd/route-c745e5b53b81491a.js +1 -0
  454. package/.next/static/chunks/app/api/encryption/secure/route-c745e5b53b81491a.js +1 -0
  455. package/.next/static/chunks/app/api/env/route-c745e5b53b81491a.js +1 -0
  456. package/.next/static/chunks/app/api/flow/[id]/route-c745e5b53b81491a.js +1 -0
  457. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-c745e5b53b81491a.js +1 -0
  458. package/.next/static/chunks/app/api/flow/[id]/versions/route-c745e5b53b81491a.js +1 -0
  459. package/.next/static/chunks/app/api/flow/compile/route-c745e5b53b81491a.js +1 -0
  460. package/.next/static/chunks/app/api/flow/generate/route-c745e5b53b81491a.js +1 -0
  461. package/.next/static/chunks/app/api/flow/improve/route-c745e5b53b81491a.js +1 -0
  462. package/.next/static/chunks/app/api/flow/prompt-renderer/route-c745e5b53b81491a.js +1 -0
  463. package/.next/static/chunks/app/api/flow/quick-chat/route-c745e5b53b81491a.js +1 -0
  464. package/.next/static/chunks/app/api/flow/repair/route-c745e5b53b81491a.js +1 -0
  465. package/.next/static/chunks/app/api/flow/route-c745e5b53b81491a.js +1 -0
  466. package/.next/static/chunks/app/api/git/route-c745e5b53b81491a.js +1 -0
  467. package/.next/static/chunks/app/api/init/route-c745e5b53b81491a.js +1 -0
  468. package/.next/static/chunks/app/api/local-models/capability/route-c745e5b53b81491a.js +1 -0
  469. package/.next/static/chunks/app/api/local-models/pull/route-c745e5b53b81491a.js +1 -0
  470. package/.next/static/chunks/app/api/local-models/suggest/route-c745e5b53b81491a.js +1 -0
  471. package/.next/static/chunks/app/api/mcp/app-sandbox/route-c745e5b53b81491a.js +1 -0
  472. package/.next/static/chunks/app/api/mcp/cancel/route-c745e5b53b81491a.js +1 -0
  473. package/.next/static/chunks/app/api/mcp/oauth-capability/route-c745e5b53b81491a.js +1 -0
  474. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-c745e5b53b81491a.js +1 -0
  475. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-c745e5b53b81491a.js +1 -0
  476. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-c745e5b53b81491a.js +1 -0
  477. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-c745e5b53b81491a.js +1 -0
  478. package/.next/static/chunks/app/api/mcp/servers/[name]/route-c745e5b53b81491a.js +1 -0
  479. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-c745e5b53b81491a.js +1 -0
  480. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-c745e5b53b81491a.js +1 -0
  481. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-c745e5b53b81491a.js +1 -0
  482. package/.next/static/chunks/app/api/mcp/servers/route-c745e5b53b81491a.js +1 -0
  483. package/.next/static/chunks/app/api/mcp/test-connection/route-c745e5b53b81491a.js +1 -0
  484. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-c745e5b53b81491a.js +1 -0
  485. package/.next/static/chunks/app/api/mcp-registry/route-c745e5b53b81491a.js +1 -0
  486. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-c745e5b53b81491a.js +1 -0
  487. package/.next/static/chunks/app/api/model/[id]/route-c745e5b53b81491a.js +1 -0
  488. package/.next/static/chunks/app/api/model/provider/route-c745e5b53b81491a.js +1 -0
  489. package/.next/static/chunks/app/api/model/route-c745e5b53b81491a.js +1 -0
  490. package/.next/static/chunks/app/api/model/test/route-c745e5b53b81491a.js +1 -0
  491. package/.next/static/chunks/app/api/oauth/callback/route-c745e5b53b81491a.js +1 -0
  492. package/.next/static/chunks/app/api/oauth/initiate/route-c745e5b53b81491a.js +1 -0
  493. package/.next/static/chunks/app/api/oauth/reset/route-c745e5b53b81491a.js +1 -0
  494. package/.next/static/chunks/app/api/packages/build/route-c745e5b53b81491a.js +1 -0
  495. package/.next/static/chunks/app/api/packages/derive-secrets/route-c745e5b53b81491a.js +1 -0
  496. package/.next/static/chunks/app/api/packages/install/route-c745e5b53b81491a.js +1 -0
  497. package/.next/static/chunks/app/api/packages/install/status/route-c745e5b53b81491a.js +1 -0
  498. package/.next/static/chunks/app/api/packages/installed/route-c745e5b53b81491a.js +1 -0
  499. package/.next/static/chunks/app/api/packages/resolve/route-c745e5b53b81491a.js +1 -0
  500. package/.next/static/chunks/app/api/packages/uninstall/route-c745e5b53b81491a.js +1 -0
  501. package/.next/static/chunks/app/api/planned-executions/[id]/route-c745e5b53b81491a.js +1 -0
  502. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-c745e5b53b81491a.js +1 -0
  503. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-c745e5b53b81491a.js +1 -0
  504. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-c745e5b53b81491a.js +1 -0
  505. package/.next/static/chunks/app/api/planned-executions/reconcile/route-c745e5b53b81491a.js +1 -0
  506. package/.next/static/chunks/app/api/planned-executions/route-c745e5b53b81491a.js +1 -0
  507. package/.next/static/chunks/app/api/registry/auth/resend/route-c745e5b53b81491a.js +1 -0
  508. package/.next/static/chunks/app/api/registry/auth/reset/route-c745e5b53b81491a.js +1 -0
  509. package/.next/static/chunks/app/api/registry/auth/route-c745e5b53b81491a.js +1 -0
  510. package/.next/static/chunks/app/api/registry/oauth/callback/route-c745e5b53b81491a.js +1 -0
  511. package/.next/static/chunks/app/api/registry/oauth/initiate/route-c745e5b53b81491a.js +1 -0
  512. package/.next/static/chunks/app/api/registry/publish/route-c745e5b53b81491a.js +1 -0
  513. package/.next/static/chunks/app/api/registry/settings/route-c745e5b53b81491a.js +1 -0
  514. package/.next/static/chunks/app/api/restore/route-c745e5b53b81491a.js +1 -0
  515. package/.next/static/chunks/app/api/runs/active/route-c745e5b53b81491a.js +1 -0
  516. package/.next/static/chunks/app/api/storage/route-c745e5b53b81491a.js +1 -0
  517. package/.next/static/chunks/app/api/update/route-c745e5b53b81491a.js +1 -0
  518. package/.next/static/chunks/app/api/waves/route-c745e5b53b81491a.js +1 -0
  519. package/.next/static/chunks/app/api/webhooks/[id]/route-c745e5b53b81491a.js +1 -0
  520. package/.next/static/chunks/app/chat/page-c39160ddf90bbae9.js +1 -0
  521. package/.next/static/chunks/app/docs/page-250523af44e96120.js +1 -0
  522. package/.next/static/chunks/app/executions/page-10d09f36de30939f.js +1 -0
  523. package/.next/static/chunks/app/flows/page-0d8fb471adfc2981.js +1 -0
  524. package/.next/static/chunks/app/layout-eea7078d7553c21a.js +1 -0
  525. package/.next/static/chunks/app/mcp/page-8ad71bf5801bfe5f.js +1 -0
  526. package/.next/static/chunks/app/mcp-flows/route-c745e5b53b81491a.js +1 -0
  527. package/.next/static/chunks/app/mcp-proxy/[server]/route-c745e5b53b81491a.js +1 -0
  528. package/.next/static/chunks/app/models/page-17e8e6668f92f58d.js +1 -0
  529. package/.next/static/chunks/app/packages/page-9f61751e98134f3d.js +1 -0
  530. package/.next/static/chunks/app/{page-0a95c40a65dbd2eb.js → page-d3ea90b065b95d1e.js} +1 -1
  531. package/.next/static/chunks/app/settings/page-afbf8790e99fecaf.js +1 -0
  532. package/.next/static/chunks/app/v1/chat/completions/route-c745e5b53b81491a.js +1 -0
  533. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-c745e5b53b81491a.js +1 -0
  534. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-c745e5b53b81491a.js +1 -0
  535. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-c745e5b53b81491a.js +1 -0
  536. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-c745e5b53b81491a.js +1 -0
  537. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-c745e5b53b81491a.js +1 -0
  538. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-c745e5b53b81491a.js +1 -0
  539. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-c745e5b53b81491a.js +1 -0
  540. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-c745e5b53b81491a.js +1 -0
  541. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-c745e5b53b81491a.js +1 -0
  542. package/.next/static/chunks/app/v1/chat/conversations/route-c745e5b53b81491a.js +1 -0
  543. package/.next/static/chunks/app/v1/chat/events/route-c745e5b53b81491a.js +1 -0
  544. package/.next/static/chunks/app/v1/models/route-c745e5b53b81491a.js +1 -0
  545. package/.next/static/chunks/app/waves/page-97ad6b51c9cae4b3.js +1 -0
  546. package/.next/static/chunks/webpack-0d4a4e773990ac44.js +1 -0
  547. package/.next/static/css/{64cb1f185b52a623.css → 69ab44eb350e0b6c.css} +1 -1
  548. package/.next/trace +10 -10
  549. package/.next/types/app/api/flow/[id]/versions/[versionId]/route.ts +347 -0
  550. package/.next/types/app/api/flow/[id]/versions/route.ts +347 -0
  551. package/.next/types/app/api/mcp/app-sandbox/route.ts +347 -0
  552. package/.next/types/app/api/mcp/oauth-capability/route.ts +347 -0
  553. package/.next/types/app/api/packages/build/route.ts +347 -0
  554. package/.next/types/app/api/packages/derive-secrets/route.ts +347 -0
  555. package/.next/types/app/api/packages/install/route.ts +347 -0
  556. package/.next/types/app/api/packages/install/status/route.ts +347 -0
  557. package/.next/types/app/api/packages/installed/route.ts +347 -0
  558. package/.next/types/app/api/packages/resolve/route.ts +347 -0
  559. package/.next/types/app/api/packages/uninstall/route.ts +347 -0
  560. package/.next/types/app/api/registry/auth/resend/route.ts +347 -0
  561. package/.next/types/app/api/registry/auth/reset/route.ts +347 -0
  562. package/.next/types/app/api/registry/auth/route.ts +347 -0
  563. package/.next/types/app/api/registry/oauth/callback/route.ts +347 -0
  564. package/.next/types/app/api/registry/oauth/initiate/route.ts +347 -0
  565. package/.next/types/app/api/registry/publish/route.ts +347 -0
  566. package/.next/types/app/api/registry/settings/route.ts +347 -0
  567. package/.next/types/app/packages/page.ts +84 -0
  568. package/.next/types/app/v1/chat/events/route.ts +347 -0
  569. package/.next/types/routes.d.ts +22 -2
  570. package/.next/types/validator.ts +180 -0
  571. package/README.md +1 -1
  572. package/package.json +97 -90
  573. package/.next/server/chunks/1152.js +0 -2
  574. package/.next/server/chunks/1223.js +0 -1
  575. package/.next/server/chunks/1377.js +0 -1
  576. package/.next/server/chunks/2373.js +0 -1
  577. package/.next/server/chunks/289.js +0 -1
  578. package/.next/server/chunks/3774.js +0 -6
  579. package/.next/server/chunks/3823.js +0 -41
  580. package/.next/server/chunks/3855.js +0 -1
  581. package/.next/server/chunks/3924.js +0 -52
  582. package/.next/server/chunks/4372.js +0 -1
  583. package/.next/server/chunks/4545.js +0 -21
  584. package/.next/server/chunks/4561.js +0 -65
  585. package/.next/server/chunks/4677.js +0 -37
  586. package/.next/server/chunks/472.js +0 -1
  587. package/.next/server/chunks/4793.js +0 -2
  588. package/.next/server/chunks/4836.js +0 -1
  589. package/.next/server/chunks/5311.js +0 -1
  590. package/.next/server/chunks/5662.js +0 -2
  591. package/.next/server/chunks/5734.js +0 -60
  592. package/.next/server/chunks/584.js +0 -1
  593. package/.next/server/chunks/62.js +0 -1
  594. package/.next/server/chunks/6240.js +0 -1
  595. package/.next/server/chunks/6306.js +0 -1
  596. package/.next/server/chunks/6793.js +0 -1
  597. package/.next/server/chunks/6908.js +0 -12
  598. package/.next/server/chunks/6996.js +0 -62
  599. package/.next/server/chunks/7362.js +0 -158
  600. package/.next/server/chunks/8216.js +0 -1
  601. package/.next/server/chunks/856.js +0 -5
  602. package/.next/server/chunks/8652.js +0 -42
  603. package/.next/server/chunks/9427.js +0 -1
  604. package/.next/static/Il6IDWxf3CN0dv-P6QQrp/_buildManifest.js +0 -1
  605. package/.next/static/chunks/1675-773454288de4309d.js +0 -1
  606. package/.next/static/chunks/1731-6e45fb529f9044a3.js +0 -1
  607. package/.next/static/chunks/2318-76fcb6c769b1a569.js +0 -1
  608. package/.next/static/chunks/2566-6e2b9d9349814789.js +0 -1
  609. package/.next/static/chunks/2734-59fbe2f62a59df86.js +0 -1
  610. package/.next/static/chunks/3089.6b4e21e1faa304e2.js +0 -1
  611. package/.next/static/chunks/3109-11bdec9bdfd996c3.js +0 -1
  612. package/.next/static/chunks/333-5f3c5be57c80c48c.js +0 -1
  613. package/.next/static/chunks/3333-b7b3e5758a568013.js +0 -1
  614. package/.next/static/chunks/4003-3b3768446ae333df.js +0 -1
  615. package/.next/static/chunks/4635-0fe310d3be64e71e.js +0 -1
  616. package/.next/static/chunks/4690-ec7d397cfacedac3.js +0 -1
  617. package/.next/static/chunks/4775-cb9c0be621363a08.js +0 -8
  618. package/.next/static/chunks/5336-81da1080de29ebfc.js +0 -1
  619. package/.next/static/chunks/6691-117567b2b40cd9f4.js +0 -1
  620. package/.next/static/chunks/7274-1184563607f2b5f5.js +0 -1
  621. package/.next/static/chunks/812-624e93f4c0f671c7.js +0 -1
  622. package/.next/static/chunks/8166-e75acdc559b34fcd.js +0 -1
  623. package/.next/static/chunks/8607-5787e42775fc3acb.js +0 -1
  624. package/.next/static/chunks/8610-660d5088bc1dd7a7.js +0 -1
  625. package/.next/static/chunks/9240-d0a51f4d504f34b1.js +0 -1
  626. package/.next/static/chunks/9562-b7922ceb400ec536.js +0 -1
  627. package/.next/static/chunks/9704-6b7415964d7c042a.js +0 -1
  628. package/.next/static/chunks/app/api/approvals/[id]/route-6b442f97c5062f2c.js +0 -1
  629. package/.next/static/chunks/app/api/approvals/route-6b442f97c5062f2c.js +0 -1
  630. package/.next/static/chunks/app/api/backup/route-6b442f97c5062f2c.js +0 -1
  631. package/.next/static/chunks/app/api/browse/route-6b442f97c5062f2c.js +0 -1
  632. package/.next/static/chunks/app/api/bugs/enhance/route-6b442f97c5062f2c.js +0 -1
  633. package/.next/static/chunks/app/api/cwd/route-6b442f97c5062f2c.js +0 -1
  634. package/.next/static/chunks/app/api/encryption/secure/route-6b442f97c5062f2c.js +0 -1
  635. package/.next/static/chunks/app/api/env/route-6b442f97c5062f2c.js +0 -1
  636. package/.next/static/chunks/app/api/flow/[id]/route-6b442f97c5062f2c.js +0 -1
  637. package/.next/static/chunks/app/api/flow/compile/route-6b442f97c5062f2c.js +0 -1
  638. package/.next/static/chunks/app/api/flow/generate/route-6b442f97c5062f2c.js +0 -1
  639. package/.next/static/chunks/app/api/flow/improve/route-6b442f97c5062f2c.js +0 -1
  640. package/.next/static/chunks/app/api/flow/prompt-renderer/route-6b442f97c5062f2c.js +0 -1
  641. package/.next/static/chunks/app/api/flow/quick-chat/route-6b442f97c5062f2c.js +0 -1
  642. package/.next/static/chunks/app/api/flow/repair/route-6b442f97c5062f2c.js +0 -1
  643. package/.next/static/chunks/app/api/flow/route-6b442f97c5062f2c.js +0 -1
  644. package/.next/static/chunks/app/api/git/route-6b442f97c5062f2c.js +0 -1
  645. package/.next/static/chunks/app/api/init/route-6b442f97c5062f2c.js +0 -1
  646. package/.next/static/chunks/app/api/local-models/capability/route-6b442f97c5062f2c.js +0 -1
  647. package/.next/static/chunks/app/api/local-models/pull/route-6b442f97c5062f2c.js +0 -1
  648. package/.next/static/chunks/app/api/local-models/suggest/route-6b442f97c5062f2c.js +0 -1
  649. package/.next/static/chunks/app/api/mcp/cancel/route-6b442f97c5062f2c.js +0 -1
  650. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-6b442f97c5062f2c.js +0 -1
  651. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-6b442f97c5062f2c.js +0 -1
  652. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-6b442f97c5062f2c.js +0 -1
  653. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-6b442f97c5062f2c.js +0 -1
  654. package/.next/static/chunks/app/api/mcp/servers/[name]/route-6b442f97c5062f2c.js +0 -1
  655. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-6b442f97c5062f2c.js +0 -1
  656. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-6b442f97c5062f2c.js +0 -1
  657. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-6b442f97c5062f2c.js +0 -1
  658. package/.next/static/chunks/app/api/mcp/servers/route-6b442f97c5062f2c.js +0 -1
  659. package/.next/static/chunks/app/api/mcp/test-connection/route-6b442f97c5062f2c.js +0 -1
  660. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-6b442f97c5062f2c.js +0 -1
  661. package/.next/static/chunks/app/api/mcp-registry/route-6b442f97c5062f2c.js +0 -1
  662. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-6b442f97c5062f2c.js +0 -1
  663. package/.next/static/chunks/app/api/model/[id]/route-6b442f97c5062f2c.js +0 -1
  664. package/.next/static/chunks/app/api/model/provider/route-6b442f97c5062f2c.js +0 -1
  665. package/.next/static/chunks/app/api/model/route-6b442f97c5062f2c.js +0 -1
  666. package/.next/static/chunks/app/api/model/test/route-6b442f97c5062f2c.js +0 -1
  667. package/.next/static/chunks/app/api/oauth/callback/route-6b442f97c5062f2c.js +0 -1
  668. package/.next/static/chunks/app/api/oauth/initiate/route-6b442f97c5062f2c.js +0 -1
  669. package/.next/static/chunks/app/api/oauth/reset/route-6b442f97c5062f2c.js +0 -1
  670. package/.next/static/chunks/app/api/planned-executions/[id]/route-6b442f97c5062f2c.js +0 -1
  671. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-6b442f97c5062f2c.js +0 -1
  672. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-6b442f97c5062f2c.js +0 -1
  673. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-6b442f97c5062f2c.js +0 -1
  674. package/.next/static/chunks/app/api/planned-executions/reconcile/route-6b442f97c5062f2c.js +0 -1
  675. package/.next/static/chunks/app/api/planned-executions/route-6b442f97c5062f2c.js +0 -1
  676. package/.next/static/chunks/app/api/restore/route-6b442f97c5062f2c.js +0 -1
  677. package/.next/static/chunks/app/api/runs/active/route-6b442f97c5062f2c.js +0 -1
  678. package/.next/static/chunks/app/api/storage/route-6b442f97c5062f2c.js +0 -1
  679. package/.next/static/chunks/app/api/update/route-6b442f97c5062f2c.js +0 -1
  680. package/.next/static/chunks/app/api/waves/route-6b442f97c5062f2c.js +0 -1
  681. package/.next/static/chunks/app/api/webhooks/[id]/route-6b442f97c5062f2c.js +0 -1
  682. package/.next/static/chunks/app/chat/page-04ad1fad78048afb.js +0 -1
  683. package/.next/static/chunks/app/docs/page-5475c616764dbb18.js +0 -1
  684. package/.next/static/chunks/app/executions/page-c18708ed96d228ec.js +0 -1
  685. package/.next/static/chunks/app/flows/page-f7e44aa545bcc56e.js +0 -1
  686. package/.next/static/chunks/app/layout-e6fbae80e0f456a6.js +0 -1
  687. package/.next/static/chunks/app/mcp/page-3638fbee04a3a6ea.js +0 -1
  688. package/.next/static/chunks/app/mcp-flows/route-6b442f97c5062f2c.js +0 -1
  689. package/.next/static/chunks/app/mcp-proxy/[server]/route-6b442f97c5062f2c.js +0 -1
  690. package/.next/static/chunks/app/models/page-e690a986047b1e62.js +0 -1
  691. package/.next/static/chunks/app/settings/page-3ef9b95187e18a5a.js +0 -1
  692. package/.next/static/chunks/app/v1/chat/completions/route-6b442f97c5062f2c.js +0 -1
  693. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-6b442f97c5062f2c.js +0 -1
  694. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-6b442f97c5062f2c.js +0 -1
  695. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-6b442f97c5062f2c.js +0 -1
  696. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-6b442f97c5062f2c.js +0 -1
  697. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-6b442f97c5062f2c.js +0 -1
  698. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-6b442f97c5062f2c.js +0 -1
  699. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-6b442f97c5062f2c.js +0 -1
  700. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-6b442f97c5062f2c.js +0 -1
  701. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-6b442f97c5062f2c.js +0 -1
  702. package/.next/static/chunks/app/v1/chat/conversations/route-6b442f97c5062f2c.js +0 -1
  703. package/.next/static/chunks/app/v1/models/route-6b442f97c5062f2c.js +0 -1
  704. package/.next/static/chunks/app/waves/page-c9a307e2236423a4.js +0 -1
  705. package/.next/static/chunks/webpack-a6844e1074885c2f.js +0 -1
  706. /package/.next/static/{Il6IDWxf3CN0dv-P6QQrp → Q6ITx_bZyoEOnKdZu_C7j}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
- "use strict";exports.id=5544,exports.ids=[5544],exports.modules={3233:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(79646);let e=(0,c(50846).h)("utils/process/killProcessTree");function f(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,d.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>e.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){e.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let g=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return g.unref?.(),()=>clearTimeout(g)}},35544:(a,b,c)=>{c.d(b,{bashCallTool:()=>w,bashToolDefinitions:()=>q});var d=c(33873),e=c.n(d),f=c(79646),g=c(3233),h=c(50846),i=c(43326);let j=(0,h.h)("backend/services/mcp/internal/bashTools");function k(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function l(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function m(a){let b=(0,i.ok)(),c="string"==typeof a?a.trim():"";return c?e().isAbsolute(c)?c:e().join(b,c):b}function n(a){return"pwsh"===a||"bash"===a?a:"default"}function o(a,b,c){let{file:d,args:e,useShell:g}="pwsh"===c?{file:"win32"===process.platform?"pwsh.exe":"pwsh",args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1}:"bash"===c?{file:"bash",args:["-c",a],useShell:!1}:{file:a,args:[],useShell:!0},h="win32"!==process.platform;try{return{child:(0,f.spawn)(d,e,{cwd:b,shell:g,env:process.env,detached:h})}}catch(a){return{child:void 0,startError:a instanceof Error?a.message:String(a)}}}function p(a,b){return c=>{let d=a();if(d.length>=1e5)return;let e=!1;(d+=c).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0),b(d,e)}}function q(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Falls back to the default shell if the requested one is unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function r(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function s(a){let b=String(a?.command??"").trim();if(!b)return l({error:'Provide "command": a shell command line to run.'},!0);let c=m(a.cwd),d=n(a.shell),e=!0===a.normalizeNewlines,f=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let h,i="",j=!1,k=!1,m=!1,n=p(()=>i,(a,b)=>{i=a,j=b||j}),{child:q,startError:s}=o(b,c,d);if(s||!q)return void a(l({error:`Failed to start command (${d}): ${s??"unknown error"}`,cwd:c,shell:d},!0));let t=setTimeout(()=>{m=!0,h=(0,g.g)(q)},f),u=b=>{k||(k=!0,clearTimeout(t),h?.(),a(b))};q.stdout?.on("data",a=>n(a.toString())),q.stderr?.on("data",a=>n(a.toString())),q.on("error",a=>{n(`
2
- ${a.message}`),u(l({error:`Command failed to start (${d}): ${a.message}`,cwd:c,shell:d,output:r(i,e)},!0))}),q.on("close",a=>{let b=r(i,e);if(m)return void u(l({timedOut:!0,cwd:c,shell:d,exitCode:a,truncated:j,output:`${b}
3
- [killed after ${f/1e3}s timeout]`},!0));u(l({exitCode:a,cwd:c,shell:d,truncated:j,output:b},0!==a))})})}function t(a){a.reapTimer=setTimeout(()=>{k().delete(a.id)},6e5),a.reapTimer.unref?.()}function u(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function v(a){let b=String(a?.sessionId??""),c=k().get(b);if(!c)return l({error:`No background session with id "${b}".`},!0);if(!c.running)return l(u(c,{timedOut:!1}));let d=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5),e=await new Promise(a=>{let b=Date.now(),e=()=>c.running?Date.now()-b>=d?a(!0):void setTimeout(e,100):a(!1);e()});return l(u(c,{timedOut:e}))}async function w(a,b){try{switch(a){case"run":return await s(b);case"start":return function(a){let b=String(a?.command??"").trim();if(!b)return l({error:'Provide "command": a shell command line to run.'},!0);let c=k();if(c.size>=25)for(let[a,b]of c)b.running||c.delete(a);if(c.size>=25)return l({error:"Too many active background sessions (max 25). Kill some first."},!0);!function(){if(global.__flujo_bash_cleanup_registered)return;global.__flujo_bash_cleanup_registered=!0;let a=()=>(function(){for(let a of k().values()){if(a.running)try{(0,g.g)(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let d=m(a.cwd),e=n(a.shell),{child:f,startError:h}=o(b,d,e);if(h||!f)return l({error:`Failed to start command (${e}): ${h??"unknown error"}`,cwd:d,shell:e},!0);let i=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,j={id:i,command:b,cwd:d,child:f,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};c.set(i,j);let q=p(()=>j.output,(a,b)=>{j.output=a,j.truncated=b||j.truncated});return f.stdout?.on("data",a=>q(a.toString())),f.stderr?.on("data",a=>q(a.toString())),f.on("error",a=>{q(`
4
- ${a.message}`),j.running=!1,j.endedAt=Date.now(),t(j)}),f.on("close",a=>{j.running=!1,j.exitCode=a,j.endedAt=Date.now(),t(j)}),l({sessionId:i,cwd:d,shell:e})}(b);case"status":let c=String(b?.sessionId??""),d=k().get(c);return d?l(u(d)):l({error:`No background session with id "${c}".`},!0);case"wait":return await v(b);case"write_stdin":let e=String(b?.sessionId??""),f=k().get(e);if(!f)return l({error:`No background session with id "${e}".`},!0);if(!f.running)return l({error:`Session "${e}" has already exited.`},!0);let h="string"==typeof b.data?b.data:"",i=!1===b.newline?h:`${h}
5
- `;try{f.child.stdin?.write(i)}catch(a){return l({error:`Failed to write to stdin: ${a instanceof Error?a.message:String(a)}`},!0)}return l({sessionId:e,written:Buffer.byteLength(i,"utf8")});case"kill":let j=String(b?.sessionId??""),q=k().get(j);return q?(q.running&&(q.cancelEscalation=(0,g.g)(q.child)),l({sessionId:j,killed:!0})):l({error:`No background session with id "${j}".`},!0);case"list_sessions":return l({sessions:Array.from(k().values()).map(a=>({sessionId:a.id,command:a.command,running:a.running,exitCode:a.exitCode,startedAt:new Date(a.startedAt).toISOString(),endedAt:a.endedAt?new Date(a.endedAt).toISOString():void 0}))});default:return l({error:`Unknown tool on the built-in bash server: ${a}`},!0)}}catch(b){return j.warn("bashCallTool failed",{toolName:a,err:b}),l({error:`Tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}}};
1
+ "use strict";exports.id=5544,exports.ids=[5544],exports.modules={3233:(a,b,c)=>{c.d(b,{g:()=>f});var d=c(79646);let e=(0,c(50846).h)("utils/process/killProcessTree");function f(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,d.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>e.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){e.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let g=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return g.unref?.(),()=>clearTimeout(g)}},7969:(a,b,c)=>{c.d(b,{FK:()=>j,FN:()=>l});var d=c(33873),e=c.n(d),f=c(79551),g=c(50846),h=c(7658);let i=(0,g.h)("backend/services/mcp/internal/confinement");function j(a,b){let c=e().relative(a,b);return""===c||!c.startsWith("..")&&!e().isAbsolute(c)}async function k(a,b){let{resolveGlobalVars:d}=await Promise.resolve().then(c.bind(c,73456)),g=(await d(a)).trim();if(!g)return null;if(g.startsWith("file://"))try{return e().resolve((0,f.fileURLToPath)(g))}catch(a){return i.warn(`resolveRootToPath: could not parse file URI "${g}"`,a),null}return e().isAbsolute(g)?e().resolve(g):e().resolve(b,g)}async function l(a,b){let{getDataDir:d}=await Promise.resolve().then(c.bind(c,43326)),f=d(),g=function(a){for(let b of Array.isArray(a)?a:[a]){let a=process.env[b];if(!a||!a.trim())continue;let c=a.split(e().delimiter).map(a=>a.trim()).filter(Boolean).map(a=>e().resolve(a));if(c.length)return c}return null}(b),l=[];try{for(let b of(await (0,h.AC)(a)))l.push(e().isAbsolute(b)?e().resolve(b):e().resolve(f,b))}catch(a){i.warn("loadEffectiveRoots: could not read persisted roots",a)}try{let{getNodeRoots:b}=await Promise.resolve().then(c.bind(c,62850));for(let c of b(a)){let a=await k(c,f);a&&l.push(a)}}catch(a){i.warn("loadEffectiveRoots: could not read node roots",a)}let m=Array.from(new Set(l));if(!g)return m;let n=m.filter(a=>g.some(b=>j(b,a)));return n.length?n:g}},35544:(a,b,c)=>{let d,e;c.d(b,{bashCallTool:()=>F,bashToolDefinitions:()=>z});var f=c(33873),g=c.n(f),h=c(29021),i=c.n(h),j=c(79646),k=c(3233),l=c(50846),m=c(43326),n=c(7658),o=c(7969);let p=(0,l.h)("backend/services/mcp/internal/bashTools");function q(a){let b=(process.env.PATH??process.env.Path??"").split(g().delimiter).filter(Boolean),c="win32"===process.platform?(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let d of b)for(let b of c){let c=g().join(d,`${a}${b}`);try{if(i().statSync(c).isFile())return c}catch{}}return null}function r(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function s(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}let t=["FLUJO_BASH_ROOTS","FLUJO_FS_ROOTS"];function u(a,b){let c=(0,m.getDataDir)(),d="string"==typeof a?a.trim():"",e=d?g().isAbsolute(d)?g().resolve(d):g().resolve(c,d):c;if(0===b.length||!b.some(a=>(0,o.FK)(a,e)))throw Error(`cwd "${e}" is outside the configured bash roots.`);return e}let v=new Set(["PATH","Path","HOME","USERPROFILE","TMP","TEMP","TMPDIR","LANG","LC_ALL","SystemRoot","windir","ComSpec","PATHEXT","SystemDrive","NUMBER_OF_PROCESSORS","PROCESSOR_ARCHITECTURE"]);function w(a){return"pwsh"===a||"bash"===a?a:"default"}function x(a,b,c){let{file:f,args:h,useShell:k,effectiveShell:l,fallbackFrom:m}=function(a,b){if("pwsh"===b){let b=void 0!==e?e:e=q("pwsh");return b?{file:b,args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1,effectiveShell:"pwsh"}:{file:a,args:[],useShell:!0,effectiveShell:"default",fallbackFrom:"pwsh"}}if("bash"===b){let b=function(){if(void 0!==d)return d;let a=q("bash");return a||"win32"!==process.platform||(a=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData].filter(a=>!!a).flatMap(a=>[g().join(a,"Git","bin","bash.exe"),g().join(a,"Git","usr","bin","bash.exe"),g().join(a,"Programs","Git","bin","bash.exe"),g().join(a,"Programs","Git","usr","bin","bash.exe")]).find(a=>{try{return i().statSync(a).isFile()}catch{return!1}})??null),d=a,a}();return b?{file:b,args:["-c",a],useShell:!1,effectiveShell:"bash"}:{file:a,args:[],useShell:!0,effectiveShell:"default",fallbackFrom:"bash"}}return{file:a,args:[],useShell:!0,effectiveShell:"default"}}(a,c),n="win32"!==process.platform;try{return{child:(0,j.spawn)(f,h,{cwd:b,shell:k,env:function(){var a;if("string"==typeof(a=process.env.FLUJO_BASH_INHERIT_ENV)&&/^(1|true|yes|on)$/i.test(a.trim()))return process.env;let b={};for(let a of Object.keys(process.env))(v.has(a)||/^LC_/.test(a))&&(b[a]=process.env[a]);return b}(),detached:n}),effectiveShell:l,fallbackFrom:m}}catch(a){return{child:void 0,startError:a instanceof Error?a.message:String(a),effectiveShell:l,fallbackFrom:m}}}function y(a,b){return c=>{let d=a();if(d.length>=1e5)return;let e=!1;(d+=c).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0),b(d,e)}}function z(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Falls back to the default shell if the requested one is unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory. When bash roots are configured (via the MCP manager, or the FLUJO_BASH_ROOTS / FLUJO_FS_ROOTS env hard ceiling) a cwd outside them is rejected."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function A(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function B(a,b){let c=String(a?.command??"").trim();if(!c)return s({error:'Provide "command": a shell command line to run.'},!0);let d=u(a.cwd,b),e=w(a.shell),f=!0===a.normalizeNewlines,g=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let b,h="",i=!1,j=!1,l=!1,m=y(()=>h,(a,b)=>{h=a,i=b||i}),{child:n,startError:o,effectiveShell:p,fallbackFrom:q}=x(c,d,e),r=q?{requestedShell:q,usedShell:p}:void 0;if(o||!n)return void a(s({error:`Failed to start command (${p}): ${o??"unknown error"}`,cwd:d,shell:p,shellFallback:r},!0));let t=setTimeout(()=>{l=!0,b=(0,k.g)(n)},g),u=c=>{j||(j=!0,clearTimeout(t),b?.(),a(c))};n.stdout?.on("data",a=>m(a.toString())),n.stderr?.on("data",a=>m(a.toString())),n.on("error",a=>{m(`
2
+ ${a.message}`),u(s({error:`Command failed to start (${p}): ${a.message}`,cwd:d,shell:p,shellFallback:r,output:A(h,f)},!0))}),n.on("close",a=>{let b=A(h,f);if(l)return void u(s({timedOut:!0,cwd:d,shell:p,shellFallback:r,exitCode:a,truncated:i,output:`${b}
3
+ [killed after ${g/1e3}s timeout]`},!0));u(s({exitCode:a,cwd:d,shell:p,shellFallback:r,truncated:i,output:b},0!==a))})})}function C(a){a.reapTimer=setTimeout(()=>{r().delete(a.id)},6e5),a.reapTimer.unref?.()}function D(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function E(a){let b=String(a?.sessionId??""),c=r().get(b);if(!c)return s({error:`No background session with id "${b}".`},!0);if(!c.running)return s(D(c,{timedOut:!1}));let d=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5),e=await new Promise(a=>{let b=Date.now(),e=()=>c.running?Date.now()-b>=d?a(!0):void setTimeout(e,100):a(!1);e()});return s(D(c,{timedOut:e}))}async function F(a,b){try{switch(a){case"run":{let a=await (0,o.FN)(n.PA,t);return await B(b,a)}case"start":{let a=await (0,o.FN)(n.PA,t);return function(a,b){let c=String(a?.command??"").trim();if(!c)return s({error:'Provide "command": a shell command line to run.'},!0);let d=r();if(d.size>=25)for(let[a,b]of d)b.running||d.delete(a);if(d.size>=25)return s({error:"Too many active background sessions (max 25). Kill some first."},!0);!function(){if(global.__flujo_bash_cleanup_registered)return;global.__flujo_bash_cleanup_registered=!0;let a=()=>(function(){for(let a of r().values()){if(a.running)try{(0,k.g)(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let e=u(a.cwd,b),{child:f,startError:g,effectiveShell:h,fallbackFrom:i}=x(c,e,w(a.shell)),j=i?{requestedShell:i,usedShell:h}:void 0;if(g||!f)return s({error:`Failed to start command (${h}): ${g??"unknown error"}`,cwd:e,shell:h,shellFallback:j},!0);let l=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,m={id:l,command:c,cwd:e,child:f,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};d.set(l,m);let n=y(()=>m.output,(a,b)=>{m.output=a,m.truncated=b||m.truncated});return f.stdout?.on("data",a=>n(a.toString())),f.stderr?.on("data",a=>n(a.toString())),f.on("error",a=>{n(`
4
+ ${a.message}`),m.running=!1,m.endedAt=Date.now(),C(m)}),f.on("close",a=>{m.running=!1,m.exitCode=a,m.endedAt=Date.now(),C(m)}),s({sessionId:l,cwd:e,shell:h,shellFallback:j})}(b,a)}case"status":let c=String(b?.sessionId??""),d=r().get(c);return d?s(D(d)):s({error:`No background session with id "${c}".`},!0);case"wait":return await E(b);case"write_stdin":let e=String(b?.sessionId??""),f=r().get(e);if(!f)return s({error:`No background session with id "${e}".`},!0);if(!f.running)return s({error:`Session "${e}" has already exited.`},!0);let g="string"==typeof b.data?b.data:"",h=!1===b.newline?g:`${g}
5
+ `;try{f.child.stdin?.write(h)}catch(a){return s({error:`Failed to write to stdin: ${a instanceof Error?a.message:String(a)}`},!0)}return s({sessionId:e,written:Buffer.byteLength(h,"utf8")});case"kill":let i=String(b?.sessionId??""),j=r().get(i);return j?(j.running&&(j.cancelEscalation=(0,k.g)(j.child)),s({sessionId:i,killed:!0})):s({error:`No background session with id "${i}".`},!0);case"list_sessions":return s({sessions:Array.from(r().values()).map(a=>({sessionId:a.id,command:a.command,running:a.running,exitCode:a.exitCode,startedAt:new Date(a.startedAt).toISOString(),endedAt:a.endedAt?new Date(a.endedAt).toISOString():void 0}))});default:return s({error:`Unknown tool on the built-in bash server: ${a}`},!0)}}catch(b){return p.warn("bashCallTool failed",{toolName:a,err:b}),s({error:`Tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=5708,exports.ids=[5708],exports.modules={1905:(a,b,c)=>{c.d(b,{Ej:()=>i,NB:()=>m});var d=c(92372),e=c(46480),f=c(50846),g=c(33233);let h=(0,f.h)("backend/services/mcp/autoInstall");async function i(){try{let a=await (0,d.YM)(e.Z.MCP_AUTO_INSTALL_SETTINGS,g.je);return(0,g.zg)(a)}catch(a){return h.warn("Failed to load mcpAutoInstall settings; using safe defaults",a),{...g.je}}}let j="mcp-install-audit",k=Promise.resolve();async function l(){try{return await (0,d.YM)(j,[])}catch(a){return h.error("Failed to load MCP install audit log",a),[]}}async function m(a){let b=k.catch(()=>{}).then(async()=>{let b=await l();b.push(a);let c=b.slice(-300);await (0,d.VH)(j,c)}).catch(a=>{h.error("Failed to append MCP install audit entry",a)});k=b,await b}},9312:(a,b,c)=>{c.d(b,{RB:()=>k,jY:()=>j});var d=c(50846),e=c(20433),f=c(61397),g=c(87821);let h=(0,d.h)("backend/services/flow/generationContext");function i(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function j(){let a=await e.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:i(a.description,100)}:{}})),c=[],d={};try{let a=await f.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await f.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){h.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await f.mcpService.listServerTools(b.name),g=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:i(a.description,100)}:{}}));d[b.name]=g.map(a=>a.name),c.push({name:b.name,connected:!0,tools:g})}}catch(a){h.warn("Could not load MCP servers for the authoring context",a)}let j=[];try{j=await g.flowService.loadFlows()}catch(a){h.warn("Could not load flows for the authoring context",a)}let k={models:b,servers:c,flows:j.map(a=>({id:a.id,name:a.name,...a.description?{description:i(a.description,300)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:k,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:j.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(k),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}function k(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}},33233:(a,b,c)=>{c.d(b,{UM:()=>g,e5:()=>f,je:()=>d,zg:()=>e});let d={requireConsent:!0,namespaceAllowlist:[],trustBrainStem:!0};function e(a){let b=a??{};return{requireConsent:"boolean"==typeof b.requireConsent?b.requireConsent:d.requireConsent,namespaceAllowlist:Array.isArray(b.namespaceAllowlist)?b.namespaceAllowlist.filter(a=>"string"==typeof a&&a.length>0):[],trustBrainStem:"boolean"==typeof b.trustBrainStem?b.trustBrainStem:d.trustBrainStem}}function f(a){let{caller:b,settings:c,registryName:d,allowInstall:e}=a;if("generator"===b)return!0===e?{allowed:!0,reason:"generator-allowinstall",message:"Approved by the per-generation allowInstall opt-in."}:{allowed:!1,reason:"generator-not-allowed",message:"Installing is not allowed in this generation (allowInstall is off)."};if("authoring-tool"===b&&c.trustBrainStem)return{allowed:!0,reason:"brainstem-trusted",message:"Approved: the /mcp-flows authoring tool is trusted (mcpAutoInstall.trustBrainStem)."};if(!c.requireConsent)return{allowed:!0,reason:"consent-disabled",message:"Approved: consent is not required (mcpAutoInstall.requireConsent is off)."};let f=function(a){if("string"!=typeof a)return"";let b=a.indexOf("/");return b>0?a.slice(0,b):""}(d);return""!==f&&c.namespaceAllowlist.includes(f)?{allowed:!0,reason:"namespace-allowlisted",message:`Approved: namespace "${f}" is allowlisted.`}:{allowed:!1,reason:"consent-required",message:"Consent required: review the exact command and arguments, then approve this install (SEP-1024)."}}function g(a,b,c,d,e){return{at:new Date().toISOString(),caller:b,registryName:a.registryName,resolvedName:a.resolvedName,serverName:a.serverName,transport:a.transport,...a.command?{command:a.command}:{},...a.args?{args:a.args}:{},...a.serverUrl?{serverUrl:a.serverUrl}:{},requiredEnvNames:a.requiredEnvNames,verificationStatus:a.verificationStatus,consent:{allowed:c.allowed,reason:c.reason},installed:d,...e?{error:e}:{}}}},88185:(a,b,c)=>{c.d(b,{R:()=>d});let d=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
1
+ "use strict";exports.id=5708,exports.ids=[5708],exports.modules={1905:(a,b,c)=>{c.d(b,{Ej:()=>i,NB:()=>m});var d=c(92372),e=c(38844),f=c(50846),g=c(33233);let h=(0,f.h)("backend/services/mcp/autoInstall");async function i(){try{let a=await (0,d.YM)(e.Z.MCP_AUTO_INSTALL_SETTINGS,g.je);return(0,g.zg)(a)}catch(a){return h.warn("Failed to load mcpAutoInstall settings; using safe defaults",a),{...g.je}}}let j="mcp-install-audit",k=Promise.resolve();async function l(){try{return await (0,d.YM)(j,[])}catch(a){return h.error("Failed to load MCP install audit log",a),[]}}async function m(a){let b=k.catch(()=>{}).then(async()=>{let b=await l();b.push(a);let c=b.slice(-300);await (0,d.VH)(j,c)}).catch(a=>{h.error("Failed to append MCP install audit entry",a)});k=b,await b}},9312:(a,b,c)=>{c.d(b,{RB:()=>l,bD:()=>i,jY:()=>k,xv:()=>j});var d=c(50846),e=c(20433),f=c(24463),g=c(87821);let h=(0,d.h)("backend/services/flow/generationContext"),i=300;function j(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function k(){let a=await e.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:j(a.description,100)}:{}})),c=[],d={};try{let a=await f.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await f.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){h.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await f.mcpService.listServerTools(b.name),g=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:j(a.description,100)}:{}}));d[b.name]=g.map(a=>a.name),c.push({name:b.name,connected:!0,tools:g})}}catch(a){h.warn("Could not load MCP servers for the authoring context",a)}let k=[];try{k=await g.flowService.loadFlows()}catch(a){h.warn("Could not load flows for the authoring context",a)}let l={models:b,servers:c,flows:k.map(a=>({id:a.id,name:a.name,...a.description?{description:j(a.description,i)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:l,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:k.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(l),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}function l(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}},33233:(a,b,c)=>{c.d(b,{UM:()=>g,e5:()=>f,je:()=>d,zg:()=>e});let d={requireConsent:!0,namespaceAllowlist:[],trustBrainStem:!0};function e(a){let b=a??{};return{requireConsent:"boolean"==typeof b.requireConsent?b.requireConsent:d.requireConsent,namespaceAllowlist:Array.isArray(b.namespaceAllowlist)?b.namespaceAllowlist.filter(a=>"string"==typeof a&&a.length>0):[],trustBrainStem:"boolean"==typeof b.trustBrainStem?b.trustBrainStem:d.trustBrainStem}}function f(a){let{caller:b,settings:c,registryName:d,allowInstall:e}=a;if("generator"===b)return!0===e?{allowed:!0,reason:"generator-allowinstall",message:"Approved by the per-generation allowInstall opt-in."}:{allowed:!1,reason:"generator-not-allowed",message:"Installing is not allowed in this generation (allowInstall is off)."};if("authoring-tool"===b&&c.trustBrainStem)return{allowed:!0,reason:"brainstem-trusted",message:"Approved: the /mcp-flows authoring tool is trusted (mcpAutoInstall.trustBrainStem)."};if(!c.requireConsent)return{allowed:!0,reason:"consent-disabled",message:"Approved: consent is not required (mcpAutoInstall.requireConsent is off)."};let f=function(a){if("string"!=typeof a)return"";let b=a.indexOf("/");return b>0?a.slice(0,b):""}(d);return""!==f&&c.namespaceAllowlist.includes(f)?{allowed:!0,reason:"namespace-allowlisted",message:`Approved: namespace "${f}" is allowlisted.`}:{allowed:!1,reason:"consent-required",message:"Consent required: review the exact command and arguments, then approve this install (SEP-1024)."}}function g(a,b,c,d,e){return{at:new Date().toISOString(),caller:b,registryName:a.registryName,resolvedName:a.resolvedName,serverName:a.serverName,transport:a.transport,...a.command?{command:a.command}:{},...a.args?{args:a.args}:{},...a.serverUrl?{serverUrl:a.serverUrl}:{},requiredEnvNames:a.requiredEnvNames,verificationStatus:a.verificationStatus,consent:{allowed:c.allowed,reason:c.reason},installed:d,...e?{error:e}:{}}}},88185:(a,b,c)=>{c.d(b,{R:()=>d});let d=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
2
2
  {
3
3
  "name": "short_flow_name", // letters/digits/_/- only
4
4
  "description": "what the flow does",
@@ -12,8 +12,9 @@ NODE TYPES:
12
12
  "model": "<model id or name from the catalog>",
13
13
  "prompt": "instructions for this step",
14
14
  "servers": [ { "name": "<server name>", "tools": ["tool_a"] } ], // optional; omit "tools" to enable all
15
- "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history. Reshapes ONLY the wire view the model sees (persisted history stays lossless): full-history = the whole assembled context; latest-message = leading system prompt(s) + everything FROM the most recent user message ONWARD (NOT "last user + last assistant"), INCLUDING this turn's in-flight tool calls/results; isolated = system prompt(s) + isolatedPrompt as a synthetic user message, prior conversation dropped. NOTE: for Claude-subscription models the whole wire history (incl. prior tool calls/results under full-history) is flattened into one text prompt rather than sent as native tool turns
15
+ "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history. Reshapes ONLY the wire view the model sees (persisted history stays lossless): full-history = the whole assembled context; latest-message = leading system prompt(s) + the most recent EXCHANGE (the last user message + the last assistant response, intermediate turns since the last user message dropped) + this turn's in-flight tool calls/results; isolated = system prompt(s) + isolatedPrompt as a synthetic user message, prior conversation dropped. NOTE: for Claude-subscription models the whole wire history (incl. prior tool calls/results under full-history) is flattened into one text prompt rather than sent as native tool turns
16
16
  "isolatedPrompt": "...", // only with inputMode "isolated"
17
+ "allowCallerPrompt": true | false, // optional, only with inputMode "isolated"; default true — a step that hands off to this isolated step may pass a "prompt" via its handoff tool that overrides "isolatedPrompt". Set false to forbid it
17
18
  "outputMode": "full-conversation" | "latest-message", // optional, default full-conversation; latest-message hides this step's tool calls/results from later steps (they see only its final response)
18
19
  "maxTurns": 20, // optional; per-step cap on agentic tool-loop turns (retry-until-done in ONE node). Unset = model/system default (50)
19
20
  "allowedTools": ["tool_a"], // optional; step-level tool allowlist (independent of servers[].tools)
@@ -36,14 +37,14 @@ NODE TYPES:
36
37
  "concurrencyLimit": 4, // optional (parallel / mapOverList / spawn), default 4
37
38
  "joinSeparator": "\\n\\n---\\n\\n", // optional (parallel / mapOverList / spawn), string between joined lane outputs, default "\\n\\n"
38
39
  "errorStrategy": "collect-all" | "fail-fast", // optional (parallel / mapOverList / spawn), default collect-all
39
- "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history. DIFFERS from a process node: history modes ALWAYS sanitize the parent transcript first — system messages, tool-result messages, and ANY assistant turn that made tool calls are dropped (only user + prose-only assistant messages survive). full-history = the full sanitized transcript; latest-message = the sanitized transcript FROM the most recent user message ONWARD (NOT "last user + last assistant"); isolated = ignore the parent conversation and send "prompt" as the child's single user message
40
- "allowCallerPrompt": true | false, // optional, only with inputMode "isolated"; when true a routing step may pass a "prompt" via its handoff tool that overrides the subflow's "prompt" (default)
40
+ "inputMode": "full-history" | "latest-message" | "isolated", // optional, default full-history. DIFFERS from a process node: history modes ALWAYS sanitize the parent transcript first — system messages, tool-result messages, and ANY assistant turn that made tool calls are dropped (only user + prose-only assistant messages survive). full-history = the full sanitized transcript; latest-message = the most recent EXCHANGE of the sanitized transcript (the last user message + the last assistant response after it, intermediate turns dropped); isolated = ignore the parent conversation and send "prompt" as the child's single user message
41
+ "allowCallerPrompt": true | false, // optional, only with inputMode "isolated"; default true — a routing step may pass a "prompt" via its handoff tool that overrides the subflow's "prompt". Set false to forbid it
41
42
  "allowCallerFanout": true | false, // optional (subflow); makes this a SPAWNABLE sub-agent: the routing step may call its handoff tool SEVERAL TIMES in one turn, each call with a "task" brief spawning one parallel instance of the child flow (rule 7c)
42
43
  "captureVariable": "NAME", // optional; save the subflow's output into a run variable other steps inject with \${var:NAME}
43
44
  "captureResource": "NAME", // optional; ALSO save the subflow's output as a tracked run resource (\${res:NAME}, rule 9b)
44
45
  "captureKv": "NAME", // optional; ALSO save the subflow's output to a PERSISTENT cross-run key (\${kv:NAME}, rule 9d)
45
46
  "outputMode": "steps" | "final-only" }
46
- - { "key": "...", "type": "finish", "label": "..." }
47
+ - { "key": "...", "type": "finish" } // a finish node is ALWAYS named "Finish Node"; omit "label" (any label you supply is ignored)
47
48
  - { "key": "...", "type": "signal", "label": "...", // fire-and-forget event (rule 11): emits {topic, payload} then passes through unchanged
48
49
  "topic": "<event topic other flows' triggers listen for>", // REQUIRED — a signal with no topic emits nothing
49
50
  "payloadTemplate": "event body, may use \${var:NAME}" } // optional; defaults to the node prompt
@@ -0,0 +1 @@
1
+ exports.id=5880,exports.ids=[5880],exports.modules={8188:(a,b,c)=>{"use strict";c.d(b,{A:()=>O});var d=c(21124),e=c(38301),f=c(60839),g=c(43312),h=c(44079),i=c(37489),j=c(27114),k=c(79515),l=c(81637),m=c(41893),n=c(30818),o=c(423),p=c(98463),q=c(12033),r=c(91034),s=c(56667),t=c(96955),u=c(18467),v=c(5501),w=c(99587),x=c(76133),y=c(83434),z=c(19815),A=c(40512),B=c(83899),C=c(52327),D=c(8521),E=c(88745),F=c(91059),G=c(19925),H=c(68730),I=c(8165),J=c(65343);let K=({title:a,attempt:b})=>(0,d.jsxs)(l.default,{sx:{mb:2},children:[(0,d.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:.5},children:[b.ok?(0,d.jsx)(I.A,{color:"success",fontSize:"small"}):(0,d.jsx)(J.A,{color:"error",fontSize:"small"}),(0,d.jsx)(k.default,{variant:"subtitle2",children:a}),"number"==typeof b.status&&(0,d.jsx)(m.A,{size:"small",label:`HTTP ${b.status}`}),(0,d.jsx)(m.A,{size:"small",variant:"outlined",label:`${b.durationMs} ms`})]}),b.ok?(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",sx:{pl:3},children:["Response: ",b.content?`"${b.content}"`:"(empty)"]}):(0,d.jsxs)(l.default,{sx:{pl:3},children:[(0,d.jsx)(k.default,{variant:"body2",color:"error.main",children:b.error?.message}),(b.error?.code||b.error?.type)&&(0,d.jsxs)(k.default,{variant:"caption",color:"text.secondary",display:"block",children:[b.error?.type?`type: ${b.error.type}`:"",b.error?.type&&b.error?.code?" \xb7 ":"",b.error?.code?`code: ${b.error.code}`:""]}),b.error?.retryAfter&&(0,d.jsxs)(k.default,{variant:"caption",color:"text.secondary",display:"block",children:["retry-after: ",b.error.retryAfter,"s"]}),b.error?.body!==void 0&&(0,d.jsx)(l.default,{component:"pre",sx:{mt:.5,p:1,bgcolor:"action.hover",borderRadius:1,fontSize:"0.7rem",overflowX:"auto",maxHeight:160},children:JSON.stringify(b.error.body,null,2)})]})]}),L=({open:a,modelLabel:b,loading:c,result:e,error:f,onClose:g,onRetry:h})=>(0,d.jsxs)(A.A,{open:a,onClose:g,maxWidth:"sm",fullWidth:!0,children:[(0,d.jsxs)(B.A,{children:["Test model: ",b]}),(0,d.jsx)(C.A,{dividers:!0,children:c?(0,d.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:2,py:3},children:[(0,d.jsx)(D.default,{size:24}),(0,d.jsx)(k.default,{variant:"body2",children:"Sending a direct test request (SDK + axios)…"})]}):f?(0,d.jsx)(E.A,{severity:"error",children:f}):e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(E.A,{severity:e.ok?"success":"warning",sx:{mb:2},children:e.diagnosis}),(0,d.jsxs)(k.default,{variant:"caption",color:"text.secondary",display:"block",sx:{mb:2},children:["model: ",e.model,e.baseUrl?` \xb7 ${e.baseUrl}`:"",e.provider?` \xb7 ${e.provider}`:""]}),(0,d.jsx)(F.A,{sx:{mb:2}}),(0,d.jsx)(K,{title:"OpenAI SDK (used by flows)",attempt:e.sdk}),(0,d.jsx)(K,{title:"axios (independent cross-check)",attempt:e.axios})]}):null}),(0,d.jsxs)(G.A,{children:[(0,d.jsx)(H.A,{onClick:h,disabled:c,children:"Run again"}),(0,d.jsx)(H.A,{onClick:g,variant:"contained",children:"Close"})]})]});var M=c(78352);let N=(0,z.h)("frontend/components/models/list/ModelCard"),O=({model:a,onEdit:b,onDelete:c,folder:z,folders:A=[],onSetFolder:B,selectable:C=!1,selected:D=!1,onSelect:E,onToggleFavorite:F})=>{let G=(0,f.A)(),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(!1),[O,P]=(0,e.useState)(null),[Q,R]=(0,e.useState)(null),[S,T]=(0,e.useState)(null),U=async()=>{K(!0),R(null),P(null);try{let b=await (0,y.X)().testModel({modelId:a.id});P(b)}catch(b){N.error("Model test failed",{modelId:a.id,error:b}),R(b instanceof Error?b.message:"Failed to run test")}finally{K(!1)}},V=F?(0,d.jsx)(g.A,{title:a.favorite?"Remove from favorites":"Add to favorites",arrow:!0,placement:"top",children:(0,d.jsx)(h.A,{size:"small","aria-label":a.favorite?"remove from favorites":"add to favorites",onClick:b=>{b.stopPropagation(),F?.(a.id)},sx:{position:"absolute",top:4,left:4,zIndex:2,color:a.favorite?G.palette.warning.main:G.palette.text.secondary,backgroundColor:(0,i.X4)(G.palette.background.paper,.6),"&:hover":{backgroundColor:(0,i.X4)(G.palette.background.paper,.9)}},children:a.favorite?(0,d.jsx)(v.A,{fontSize:"small"}):(0,d.jsx)(w.A,{fontSize:"small"})})}):null,W=(0,d.jsx)(d.Fragment,{children:(0,d.jsxs)(j.A,{sx:{flexGrow:1},children:[(0,d.jsx)(k.default,{variant:"h6",gutterBottom:!0,children:a.displayName||a.name}),(0,d.jsx)(k.default,{variant:"body2",color:"text.secondary",sx:{mb:2},style:{display:"-webkit-box",WebkitLineClamp:3,WebkitBoxOrient:"vertical",overflow:"hidden",textOverflow:"ellipsis"},children:a.description}),(0,d.jsxs)(l.default,{sx:{mb:1},children:[(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",children:["Provider: ",(0,x.T_)(a.provider,a.adapter).label]}),a.displayName&&(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",noWrap:!0,children:["Model: ",a.name]}),"number"==typeof a.contextWindow&&(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",children:["Context: ",a.contextWindow.toLocaleString()," tokens"]})]}),a.baseUrl&&(0,d.jsx)(g.A,{title:a.baseUrl,arrow:!0,placement:"top",children:(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",noWrap:!0,children:["Base URL: ",a.baseUrl]})}),z&&(0,d.jsx)(m.A,{icon:(0,d.jsx)(u.A,{}),label:z,size:"small",variant:"outlined",sx:{mt:1,maxWidth:"100%"}})]})});return C?(0,d.jsxs)(n.A,{elevation:D?4:2,role:"radio","aria-checked":D,sx:{height:"100%",display:"flex",flexDirection:"column",position:"relative",border:a=>D?`2px solid ${a.palette.primary.main}`:"2px solid transparent",transition:"border-color 120ms, box-shadow 120ms"},children:[V,(0,d.jsx)(o.A,{onClick:()=>E?.(a.id),sx:{height:"100%",display:"flex",flexDirection:"column",alignItems:"stretch"},children:W})]}):(0,d.jsxs)(n.A,{elevation:2,sx:{height:"100%",display:"flex",flexDirection:"column",position:"relative"},children:[V,W,(0,d.jsxs)(p.A,{disableSpacing:!0,children:[(0,d.jsx)(g.A,{title:"Test model (direct SDK call, no flow)",arrow:!0,children:(0,d.jsx)(h.A,{"aria-label":"test",onClick:()=>{I(!0),U()},children:(0,d.jsx)(s.A,{})})}),(0,d.jsx)(h.A,{"aria-label":"edit",onClick:b,children:(0,d.jsx)(q.A,{})}),(0,d.jsx)(h.A,{"aria-label":"delete",onClick:c,children:(0,d.jsx)(r.A,{})}),B&&(0,d.jsx)(g.A,{title:"Move to folder…",arrow:!0,children:(0,d.jsx)(h.A,{"aria-label":"move to folder",onClick:a=>T(a.currentTarget),sx:{ml:"auto"},children:(0,d.jsx)(t.A,{})})})]}),B&&(0,d.jsx)(M.A,{anchorEl:S,open:!!S,currentFolder:z,folders:A,onClose:()=>T(null),onAssign:B}),(0,d.jsx)(L,{open:H,modelLabel:a.displayName||a.name,loading:J,result:O,error:Q,onClose:()=>I(!1),onRetry:U})]})}},43010:()=>{},49351:(a,b,c)=>{"use strict";c.d(b,{A:()=>h});var d=c(21124);c(38301);var e=c(49565),f=c(51100),g=c(73198);function h({show:a,onClick:b,sx:c}){return(0,d.jsx)(e.A,{in:a,unmountOnExit:!0,children:(0,d.jsx)(f.A,{size:"small",color:"primary","aria-label":"Back to top",onClick:b,sx:{position:"fixed",bottom:24,right:24,zIndex:1200,...c},children:(0,d.jsx)(g.A,{})})})}},61560:(a,b,c)=>{"use strict";c.d(b,{R:()=>e});var d=c(38301);function e(a,b={}){let{threshold:c=200,deps:f=[]}=b,g=(0,d.useRef)(null),[h,i]=(0,d.useState)(!1);(0,d.useRef)(!1);let j=(0,d.useCallback)(()=>{let a=g.current;return a&&a.scrollHeight>a.clientHeight+1?a:null},[]);return(0,d.useCallback)(()=>{let a=j();return a?a.scrollTop:0},[j]),(0,d.useCallback)(a=>{let b=j();b&&(b.scrollTop=a)},[j]),{ref:g,showBackToTop:h,scrollToTop:(0,d.useCallback)(()=>{let a=j();a&&a.scrollTo({top:0,behavior:"smooth"}),i(!1)},[j])}}c(2560)},64535:(a,b,c)=>{"use strict";c.d(b,{A$:()=>j,X8:()=>g,YP:()=>k,js:()=>i});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a,b,c){return`\${${a}:${b}__${c}}`}function h(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}function i(a){return a.startsWith("${")&&a.endsWith("}")?h(a.slice(2,-1)):null}function j(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=h(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}function k(a){var b,c;return"tool"===a.kind&&"handoff"===a.server?`handoff:${a.name}`:`${a.kind}:${b=a.server,c=a.name,`${b}__${c}`}`}},80518:(a,b,c)=>{"use strict";c.d(b,{CN:()=>i,Pj:()=>h,jX:()=>j,sE:()=>f,y4:()=>g});var d=c(64535);let e=/\$\{res:([^}]+)\}/g;function f(a){let b,c=(0,d.A$)(a).map(a=>({kind:a.kind,server:a.server,name:a.name,fullMatch:a.fullMatch,index:a.index}));for(e.lastIndex=0;null!==(b=e.exec(a));)c.push({kind:"runres",server:"",name:b[1],fullMatch:b[0],index:b.index});return c.sort((a,b)=>a.index-b.index)}function g(a){if(a.startsWith("${res:")&&a.endsWith("}")){let b=a.slice(6,-1);return b?{kind:"runres",server:"",name:b}:null}let b=(0,d.js)(a);return b?{kind:b.kind,server:b.server,name:b.name}:null}function h(a,b,c){return"runres"===a?`\${res:${c}}`:(0,d.X8)(a,b,c)}function i(a){return"runres"===a.kind?`res:${a.name}`:(0,d.YP)({kind:a.kind,server:a.server,name:a.name})}function j(a){let b=new Set;for(let c of a){let a;if("string"==typeof c&&0!==c.length)for(e.lastIndex=0;null!==(a=e.exec(c));){let c=a[1].trim();c&&b.add(c)}}return[...b].sort((a,b)=>a.localeCompare(b))}},85838:(a,b,c)=>{"use strict";c.d(b,{A:()=>D});var d=c(21124),e=c(38301),f=c(19815),g=c(90647),h=c(49257),i=c(74576),j=c(81637),k=c(79515),l=c(48317),m=c(7499),n=c(54573),o=c(9604),p=c(22813),q=c(28055);c(43010);var r=c(80518);let s=(0,f.h)("frontend/components/shared/PromptBuilder"),t=a=>{s.debug("Deserializing markdown to Slate value");let b=a.split("\n").map(a=>({type:"paragraph",children:(a=>{let b=(0,r.sE)(a);if(0===b.length)return[{text:a}];let c=[],d=0;for(let e of b)e.index>d&&c.push({text:a.slice(d,e.index)}),c.push({type:"binding-reference",kind:e.kind,server:e.server,name:e.name,children:[{text:""}]}),d=e.index+e.fullMatch.length;return d<a.length&&c.push({text:a.slice(d)}),c})(a)}));return b.length>0?b:[{type:"paragraph",children:[{text:""}]}]},u=a=>{s.debug("Serializing Slate value to markdown");let b=0,c=a.map(a=>a.children?a.children.map(a=>g.EY.isText(a)?a.text:"binding-reference"===a.type?(b++,(0,r.Pj)(a.kind,a.server,a.name)):"").join(""):"").join("\n");return b>0&&s.debug(`Serialized ${b} binding references`),c},v=a=>{let{attributes:b,children:c,element:e}=a;return"binding-reference"===e.type?(0,d.jsxs)("span",{...b,className:"tool-reference-wrapper",children:[(0,d.jsx)(()=>{let a=(0,h.Zi)(),b=(a=>"tool"===a.kind&&"handoff"===a.server)(e),c="runres"===e.kind?"runres":"resource"===e.kind?"resource":b?"handoff":"",f=()=>{let b=h.rL.findPath(a,e);s.debug(`Removing binding reference: ${e.kind}:${e.server}:${e.name}`),g.gB.removeNodes(a,{at:b})};return(0,d.jsxs)("span",{contentEditable:!1,className:`tool-reference-container ${c}`,children:[(0,d.jsx)("span",{className:`tool-reference ${c}`,children:(0,r.CN)(e)}),(0,d.jsx)("span",{className:`tool-reference-delete ${c}`,role:"button",tabIndex:0,onClick:a=>{a.preventDefault(),a.stopPropagation(),f()},onKeyDown:a=>{("Enter"===a.key||" "===a.key)&&(a.preventDefault(),a.stopPropagation(),f())},children:"\xd7"})]})},{}),c," "]}):(0,d.jsx)("p",{...b,children:c})},w=a=>{let{attributes:b,children:c,leaf:e}=a,f=c;return e.bold&&(f=(0,d.jsx)("strong",{children:f})),e.italic&&(f=(0,d.jsx)("em",{children:f})),e.code&&(f=(0,d.jsx)("code",{children:f})),(0,d.jsx)("span",{...b,children:f})},x=({server:a,name:b})=>{let c="handoff"===a,[f,g]=(0,e.useState)(null),[h,i]=(0,e.useState)(!0);return((0,e.useEffect)(()=>{let c=!1;return(async()=>{try{i(!0);let d=await q.S.listServerTools(a),e=d.tools?.find(a=>a.name===b);c||g(e||null)}catch(c){s.error(`Failed to fetch tool info for ${a}:${b}`,c)}finally{c||i(!1)}})(),()=>{c=!0}},[a,b]),h)?(0,d.jsx)("span",{className:`tool-reference-preview loading ${c?"handoff":""}`,children:`tool:${a}__${b}`}):f?(0,d.jsxs)("span",{className:`tool-reference-preview ${c?"handoff":""}`,children:["[The user is referencing a ",c?"handoff":"tool"," `tool:",a,"__",b,"` (",f.description||"No description",")]"]}):(0,d.jsx)("span",{className:`tool-reference-preview not-found ${c?"handoff":""}`,children:`tool:${a}__${b} (Tool not found)`})},y=({server:a,name:b})=>{let[c,f]=(0,e.useState)(null),[g,h]=(0,e.useState)(!0);return((0,e.useEffect)(()=>{let c=!1;return(async()=>{try{h(!0);let d=await q.S.listServerResources(a),e=[...d.resources||[],...d.resourceTemplates||[]].find(a=>a.uri===b||a.uriTemplate===b);c||f(e?.description||e?.name||null)}catch(c){s.error(`Failed to fetch resource info for ${a}:${b}`,c)}finally{c||h(!1)}})(),()=>{c=!0}},[a,b]),g)?(0,d.jsx)("span",{className:"tool-reference-preview loading resource",children:`resource:${a}__${b}`}):(0,d.jsxs)("span",{className:"tool-reference-preview resource",children:["[The contents of resource `",b,"` from `",a,"`",c?` (${c})`:""," will be inserted here]"]})},z=({name:a})=>(0,d.jsxs)("span",{className:"tool-reference-preview runres",children:["[The contents of the Temporary Data `",a,"` will be inserted here at run time]"]}),A=({binding:a})=>"runres"===a.kind?(0,d.jsx)(z,{name:a.name}):"resource"===a.kind?(0,d.jsx)(y,{server:a.server,name:a.name}):(0,d.jsx)(x,{server:a.server,name:a.name}),B=({value:a})=>{s.debug("Rendering preview");let b=[],c=0;for(let d of(0,r.sE)(a))d.index>c&&b.push({type:"text",value:a.slice(c,d.index)}),b.push({type:"binding",binding:d,key:d.index}),c=d.index+d.fullMatch.length;c<a.length&&b.push({type:"text",value:a.slice(c)});let e=[],f=[],g=()=>{e.push((0,d.jsx)("p",{children:f},`p-${e.length}`)),f=[]};for(let a of b)if("text"===a.type){let b=a.value.split("\n");for(let a=0;a<b.length;a++)f.push(b[a]),a<b.length-1&&g()}else f.push((0,d.jsx)(A,{binding:a.binding},`binding-${a.key}`));return f.length>0&&g(),(0,d.jsx)("div",{className:"preview-content",children:e})},C=(0,e.forwardRef)(({value:a,onChange:b,label:c="Prompt Builder",height:f=300,onModeChange:q,customPreviewRenderer:x},y)=>{s.info("PromptBuilder initialized");let z=(0,e.useMemo)(()=>{let a=(0,i.$k)((0,h.o$)((0,g.ie)())),{isInline:b,isVoid:c}=a;return a.isInline=a=>"binding-reference"===a.type||b(a),a.isVoid=a=>"binding-reference"===a.type||c(a),a},[]),[A,C]=(0,e.useState)("raw"),[D,E]=(0,e.useState)(()=>t(a||"")),F=(0,e.useRef)(!1),[,G]=(0,e.useState)(0);(0,e.useImperativeHandle)(y,()=>({insertText:a=>{s.info(`insertText called with text length: ${a.length}`);let c=(0,r.y4)(a);if(c){s.info(`Inserting ${c.kind} reference: ${c.server}:${c.name}`);let a={type:"binding-reference",kind:c.kind,server:c.server,name:c.name,children:[{text:""}]};z.selection||g.gB.select(z,g.KE.end(z,[])),g.gB.insertNodes(z,a),g.gB.move(z),G(a=>a+1),E([...z.children])}else z.selection||g.gB.select(z,g.KE.end(z,[])),g.gB.insertText(z,a);b(u(z.children)),s.info("insertText completed successfully")},getMode:()=>A})),(0,e.useEffect)(()=>{u(D)!==u(t(a||""))&&(s.debug("External value change detected"),F.current=!0,E(t(a||"")))},[a,D]);let H=(0,e.useCallback)(a=>{if(F.current){F.current=!1;return}E(a),b(u(a))},[b]);return(0,d.jsxs)(j.default,{sx:{width:"100%",height:"100%",display:"flex",flexDirection:"column"},children:[c&&(0,d.jsx)(k.default,{variant:"subtitle1",gutterBottom:!0,sx:{fontWeight:"medium",mb:1},children:c}),(0,d.jsx)(j.default,{sx:{mb:1},children:(0,d.jsxs)(l.A,{value:A,exclusive:!0,onChange:(a,b)=>{null!==b&&(s.info(`Mode changed from ${A} to ${b}`),C(b),q&&q(b))},size:"small",children:[(0,d.jsxs)(m.A,{value:"raw",children:[(0,d.jsx)(o.A,{fontSize:"small",sx:{mr:.5}}),"Raw"]}),(0,d.jsxs)(m.A,{value:"preview",children:[(0,d.jsx)(p.A,{fontSize:"small",sx:{mr:.5}}),"Preview"]})]})}),(0,d.jsx)(n.A,{elevation:0,sx:{border:"1px solid rgba(0, 0, 0, 0.12)",borderRadius:1,overflow:"hidden",flexGrow:1,display:"flex",flexDirection:"column"},children:"raw"===A?(0,d.jsx)(j.default,{className:"slate-editor-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto",p:2},children:(0,d.jsx)(h.A,{editor:z,initialValue:D,onChange:H,children:(0,d.jsx)(h.Fo,{className:"slate-editor",renderElement:v,renderLeaf:w,placeholder:"Write your prompt here..."})})}):x?(0,d.jsx)(j.default,{className:"custom-preview-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto"},children:x()}):(0,d.jsx)(j.default,{className:"preview-container",sx:{height:"number"==typeof f?f:"100%",overflow:"auto",p:2},children:(0,d.jsx)(B,{value:a})})})]})});C.displayName="PromptBuilder";let D=C}};
@@ -0,0 +1,2 @@
1
+ "use strict";exports.id=5958,exports.ids=[5958],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
+ ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},55561:(a,b,c)=>{c.d(b,{A:()=>s});var d=c(21124),e=c(38301),f=c(81637),g=c(8521),h=c(79515),i=c(88745),j=c(53773),k=c(41893),l=c(68730),m=c(22042),n=c(34304),o=c(37674),p=c(91059),q=c(75550);let r=(0,c(19815).h)("frontend/components/Settings/RegistryAccountSettings");function s(){let[a,b]=(0,e.useState)(null),[c,s]=(0,e.useState)(!0),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)("login"),[z,A]=(0,e.useState)(""),[B,C]=(0,e.useState)(""),[D,E]=(0,e.useState)(""),[F,G]=(0,e.useState)(""),H=(0,e.useCallback)(async()=>{try{let[a,c]=await Promise.all([q.f.getStatus(),q.f.getSettings()]);b(a),G(c.defaultUrl),E(c.usingDefault?"":c.baseUrl)}catch(a){r.warn("Failed to load registry account status",a)}finally{s(!1)}},[]),I=async()=>{u(!0),w(null);try{let a="signup"===x?await q.f.signup(z.trim(),B):await q.f.login(z.trim(),B);"authenticated"===a.status?(w({type:"success",text:"Signed in to the package registry."}),C("")):"confirmation_required"===a.status?(w({type:"info",text:a.message||"Check your inbox to confirm your email."}),C("")):w({type:"error",text:a.message||"Authentication failed."}),a.account?b(a.account):await H()}catch(a){w({type:"error",text:a instanceof Error?a.message:"Authentication failed."})}finally{u(!1)}},J=async()=>{u(!0),w(null);try{await q.f.logout(),await H(),w({type:"success",text:"Logged out."})}catch(a){w({type:"error",text:a instanceof Error?a.message:"Failed to log out."})}finally{u(!1)}},K=async a=>{u(!0),w(null);try{let{authorizationUrl:b}=await q.f.beginOAuth(a);window.location.assign(b)}catch(a){w({type:"error",text:a instanceof Error?a.message:"Failed to start OAuth sign-in."}),u(!1)}},L=async()=>{u(!0),w(null);try{let a=await q.f.resendConfirmation();w(a.success?{type:"success",text:"Confirmation email sent."}:{type:"error",text:a.message||"Failed to resend confirmation."})}finally{u(!1)}},M=async()=>{let a=z.trim();if(!a)return void w({type:"info",text:"Enter your account email above, then tap “Forgot password?”."});u(!0),w(null);try{await q.f.requestPasswordReset(a),w({type:"info",text:"If an account exists for that email, a password-reset link is on its way. Follow the link to set a new password."})}catch(a){w({type:"error",text:a instanceof Error?a.message:"Failed to request a password reset."})}finally{u(!1)}},N=async()=>{u(!0),w(null);try{let a=await q.f.saveSettings(D.trim());w(a.success?{type:"success",text:"Registry URL saved."}:{type:"error",text:a.message||"Invalid registry URL."})}finally{u(!1)}};if(c)return(0,d.jsx)(f.default,{sx:{display:"flex",justifyContent:"center",p:3},children:(0,d.jsx)(g.default,{size:28})});let O=!!a?.signedIn,P=!!(a?.email&&!O&&a&&!a.isConfirmed);return(0,d.jsxs)(f.default,{sx:{width:"100%"},children:[(0,d.jsx)(h.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Sign in to the FLUJO package registry to publish packages. Browsing and installing packages does not require an account — only publishing does, and your email must be confirmed first. Your registry tokens are encrypted at rest and never shown here."}),v&&(0,d.jsx)(i.A,{severity:v.type,sx:{mb:2},onClose:()=>w(null),children:v.text}),O?(0,d.jsxs)(j.A,{spacing:2,children:[(0,d.jsxs)(j.A,{direction:"row",spacing:1,alignItems:"center",flexWrap:"wrap",useFlexGap:!0,children:[(0,d.jsx)(h.default,{variant:"subtitle1",children:a?.email}),a?.publisherHandle&&(0,d.jsx)(k.A,{size:"small",label:`@${a.publisherHandle}`}),a?.isConfirmed?(0,d.jsx)(k.A,{size:"small",color:"success",label:"Confirmed"}):(0,d.jsx)(k.A,{size:"small",color:"warning",label:"Unconfirmed"})]}),(0,d.jsx)(f.default,{children:(0,d.jsx)(l.A,{variant:"outlined",onClick:J,disabled:t,children:"Log out"})})]}):P?(0,d.jsxs)(j.A,{spacing:2,children:[(0,d.jsxs)(i.A,{severity:"info",children:["We sent a confirmation link to ",(0,d.jsx)("strong",{children:a?.email}),". Confirm your email, then log in to start publishing."]}),(0,d.jsxs)(j.A,{direction:"row",spacing:1,children:[(0,d.jsx)(l.A,{variant:"outlined",onClick:L,disabled:t,children:"Resend confirmation email"}),(0,d.jsx)(l.A,{onClick:J,disabled:t,children:"Use a different account"})]})]}):(0,d.jsxs)(j.A,{spacing:2,children:[(0,d.jsxs)(m.A,{value:x,onChange:(a,b)=>y(b),children:[(0,d.jsx)(n.A,{value:"login",label:"Log in"}),(0,d.jsx)(n.A,{value:"signup",label:"Sign up"})]}),(0,d.jsx)(o.A,{label:"Email",type:"email",value:z,onChange:a=>A(a.target.value),fullWidth:!0,autoComplete:"username"}),(0,d.jsx)(o.A,{label:"Password",type:"password",value:B,onChange:a=>C(a.target.value),fullWidth:!0,autoComplete:"signup"===x?"new-password":"current-password"}),(0,d.jsx)(f.default,{children:(0,d.jsx)(l.A,{variant:"contained",onClick:I,disabled:t||!z.trim()||!B,children:"signup"===x?"Sign up":"Log in"})}),"login"===x&&(0,d.jsx)(f.default,{children:(0,d.jsx)(l.A,{variant:"text",size:"small",onClick:M,disabled:t,sx:{textTransform:"none",px:0},children:"Forgot password?"})}),(0,d.jsx)(p.A,{children:"or"}),(0,d.jsxs)(j.A,{direction:"row",spacing:1,flexWrap:"wrap",useFlexGap:!0,children:[(0,d.jsx)(l.A,{variant:"outlined",onClick:()=>K("github"),disabled:t,children:"Continue with GitHub"}),(0,d.jsx)(l.A,{variant:"outlined",onClick:()=>K("google"),disabled:t,children:"Continue with Google"})]})]}),(0,d.jsx)(p.A,{sx:{my:3}}),(0,d.jsx)(h.default,{variant:"subtitle2",gutterBottom:!0,children:"Registry URL"}),(0,d.jsxs)(h.default,{variant:"body2",color:"text.secondary",sx:{mb:1},children:["Leave blank to use the default (",F,")."]}),(0,d.jsxs)(j.A,{direction:"row",spacing:1,alignItems:"center",flexWrap:"wrap",useFlexGap:!0,children:[(0,d.jsx)(o.A,{size:"small",placeholder:F,value:D,onChange:a=>E(a.target.value),sx:{minWidth:320}}),(0,d.jsx)(l.A,{variant:"outlined",onClick:N,disabled:t,children:"Save"})]})]})}},75550:(a,b,c)=>{c.d(b,{f:()=>e,p:()=>d}),(0,c(19815).h)("frontend/services/registry");let d=()=>{throw Error("RegistryService can only be used in browser environment")},e=new Proxy({},{get(a,b){let c=d(),e=c[b];return"function"==typeof e?e.bind(c):e}})}};
@@ -0,0 +1 @@
1
+ exports.id=6005,exports.ids=[1925,4306,6005],exports.modules={1925:(a,b,c)=>{"use strict";c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},37426:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"40ec842092ea232b6d4aa599a380d422184da5e1ca":()=>d.resolveGlobalVars,"602ea7ca289a8eaa1000fb321a71e292e6c766b6bb":()=>d.G});var d=c(73456)},41115:(a,b,c)=>{"use strict";c.d(b,{$:()=>h,v5:()=>g});var d=c(10641);let e=new Set(["localhost","127.0.0.1","::1"]);function f(a){let b=a.toLowerCase();return!!e.has(b)||(function(){let a=process.env.FLUJO_EXTRA_LOCAL_HOSTS;return a?a.split(",").map(a=>a.trim().toLowerCase()).filter(a=>a.length>0&&"."!==a):[]})().some(a=>a.startsWith(".")?b.endsWith(a):b===a)}function g(a,b){let c=function(a){if(!a)return null;let b=a.trim();if(b.startsWith("[")){let a=b.indexOf("]");return a>0?b.slice(1,a):null}return b.split(":")[0]||null}(a);if(!c||!f(c))return!1;if(b)try{if(!f(new URL(b).hostname))return!1}catch{return!1}return!0}function h(a){return g(a.headers.get("host"),a.headers.get("origin"))?null:d.NextResponse.json({error:"Forbidden: this endpoint only accepts local requests."},{status:403})}},42398:(a,b,c)=>{"use strict";c.d(b,{QE:()=>k,_u:()=>m,aZ:()=>j,qf:()=>n,v5:()=>g.v5,xK:()=>l,xV:()=>o});var d=c(50846),e=c(24463),f=c(3676),g=c(41115);let h=(0,d.h)("backend/services/mcp/proxyForward"),i="FLUJO encryption is locked (encryption_locked). Unlock FLUJO to continue.";async function j(a){let b=await e.mcpService.loadServerConfigs();if(!Array.isArray(b))return h.warn("isServerExposed: failed to load server configs",{error:b.error}),!1;let c=b.find(b=>b.name===a);return!!c&&!c.disabled&&!0===c.exposeAsMcpServer}async function k(a){if(await (0,f.ln)())throw Error(i);let b=await e.mcpService.connectServer(a);if(!b.success)throw Error(`Failed to connect to MCP server '${a}': ${b.error}`);let c=await e.mcpService.listServerTools(a);if(c.error)throw Error(`Failed to list tools for '${a}': ${c.error}`);return{tools:c.tools??[]}}async function l(a,b,c){if(await (0,f.ln)())return{content:[{type:"text",text:i}],isError:!0};let d=await e.mcpService.connectServer(a);if(!d.success)return{content:[{type:"text",text:`Error connecting to '${a}': ${d.error}`}],isError:!0};let g=await e.mcpService.callTool(a,b,c);return g.success?g.data:{content:[{type:"text",text:`Error: ${g.error??"Unknown error"}`}],isError:!0}}async function m(a){if(await (0,f.ln)())throw Error(i);let b=await e.mcpService.connectServer(a);if(!b.success)throw Error(`Failed to connect to MCP server '${a}': ${b.error}`);let c=await e.mcpService.listServerResources(a);if(c.error)throw Error(`Failed to list resources for '${a}': ${c.error}`);return{resources:c.resources??[]}}async function n(a){if(await (0,f.ln)())throw Error(i);let b=await e.mcpService.connectServer(a);if(!b.success)throw Error(`Failed to connect to MCP server '${a}': ${b.error}`);let c=await e.mcpService.listServerResourceTemplates(a);if(c.error)throw Error(`Failed to list resource templates for '${a}': ${c.error}`);return{resourceTemplates:c.resourceTemplates??[]}}async function o(a,b){if(await (0,f.ln)())throw Error(i);let c=await e.mcpService.connectServer(a);if(!c.success)throw Error(`Failed to connect to MCP server '${a}': ${c.error}`);let d=await e.mcpService.readResource(a,b);if(!d.success||!d.data)throw Error(`Failed to read resource '${b}' from '${a}': ${d.error??"unknown error"}`);return d.data}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a){j.debug("Entering resolveGlobalVars method");let b=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);j.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=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(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return c},i=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>i(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await i(d);return b}return a},k=await i(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(k,null,2)),j.debug("Completed global variable resolution"),k}async function l(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) for value: ${a}`),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.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),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(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),l(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]),(0,d.A)(k,"40ec842092ea232b6d4aa599a380d422184da5e1ca",null),(0,d.A)(l,"602ea7ca289a8eaa1000fb321a71e292e6c766b6bb",null)},78335:()=>{},96487:()=>{}};
@@ -0,0 +1,53 @@
1
+ "use strict";exports.id=6126,exports.ids=[1925,4306,6126],exports.modules={1925:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},5248:(a,b,c)=>{c.d(b,{P:()=>m,p:()=>k});var d=c(32524),e=c(81226);function f(a){return!!a&&a.includes("mcp")}function g(a){return!!a&&a.includes("resource")}let h=a=>({source:`${a}-bottom`,target:`${a}-top`});function i(a,b){let c=a.filter(a=>"mcp"!==a.type&&"resource"!==a.type&&"string"==typeof a.id),d=new Map(c.map(a=>[a.id,a])),e=new Map,i=new Map,j=new Set;for(let a of c)e.set(a.id,0),i.set(a.id,0);let k=(a,b)=>{j.add(`${a}->${b}`),i.set(a,(i.get(a)??0)+1),e.set(b,(e.get(b)??0)+1)};for(let a of b)d.has(a.from)&&d.has(a.to)&&a.from!==a.to&&(k(a.from,a.to),a.bidirectional&&k(a.to,a.from));let l=[];for(let a of[...c].sort((a,b)=>a.y-b.y||a.x-b.x)){let b=l[l.length-1];b&&70>=Math.abs(a.y-b[0].y)?b.push(a):l.push([a])}let m=new Map;l.forEach((a,b)=>a.forEach(a=>m.set(a.id,b)));let n=new Map;for(let a=1;a<l.length;a++){let b=l[a],c=b.filter(a=>"subflow"===a.type);if(c.length>=2&&c.length===b.length){let b=l[a-1];if(1===b.length&&"process"===b[0].type)for(let a of c)n.set(a.id,b[0].id)}}let o=[],p=(a,b)=>{if(a===b||j.has(`${a}->${b}`))return!1;let c=d.get(a),e=d.get(b);return!(!c||!e||null!==function(a,b,c,d){if("start"===c)return"Start nodes cannot have incoming connections";if("finish"===a)return"Finish nodes cannot have outgoing connections";if("mcp"===a||"mcp"===c||f(b)||f(d))return("mcp"!==a||"process"!==c)&&("process"!==a||"mcp"!==c)?"MCP connections must link an MCP node to a Process node via MCP handles":"process"!==a||f(b)?null:"Connect MCP nodes from the Process node's left/right MCP handles";if("resource"===a||"resource"===c||g(b)||g(d)){if(("resource"!==a||"process"!==c)&&("process"!==a||"resource"!==c))return"Resource connections must link a Resource node to a Process node via resource handles";if("process"===a&&!g(b))return"Connect Resource nodes from the Process node's left/right resource handles"}return null}(c.type,h(c.type).source,e.type,h(e.type).target)||"subflow"===c.type&&(i.get(a)??0)>=1)},q=(a,b,c,d)=>{o.push({from:a,to:b,bidirectional:c,reason:d}),k(a,b),c&&k(b,a)},r=a=>{let b=m.get(a.id)??0;for(let c=b-1;c>=0;c--){let b=l[c].filter(b=>b.id!==a.id&&"finish"!==b.type&&!n.has(b.id));if(0!==b.length){if(1===b.length)return b[0];return b.reduce((b,c)=>Math.abs(c.x-a.x)<Math.abs(b.x-a.x)?c:b)}}return null};for(let a of l)for(let b of a){if("start"===b.type||(e.get(b.id)??0)>0)continue;let a=n.get(b.id);if(a){p(a,b.id)&&q(a,b.id,!0,"auto-bidirectional-subflow");continue}let c=r(b);c&&p(c.id,b.id)&&q(c.id,b.id,!1,"auto-connected")}let s=c.filter(a=>"start"===a.type),t=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(e.get(a.id)??0)===0),u=null;if(0===s.length){let a=t();if(a.length>0)u={targets:a.map(a=>a.id)};else{let a=c.filter(a=>"finish"!==a.type).sort((a,b)=>a.y-b.y)[0];a&&(u={targets:[a.id]})}}else{let a=s[0];for(let b of t())p(a.id,b.id)&&q(a.id,b.id,!1,"auto-connected")}let v=c.filter(a=>"finish"===a.type),w=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(i.get(a.id)??0)===0),x=null;if(0===v.length){let a=w();a.length>0&&(x={sources:a.map(a=>a.id)})}else{let a=v[0];for(let b of w())p(b.id,a.id)&&q(b.id,a.id,!1,"auto-connected")}return{addEdges:o,addStart:u,addFinish:x}}function j(a,b){if(!b.has(a))return a;for(let c=2;;c++){let d=`${a}_${c}`;if(!b.has(d))return d}}function k(a){let b=[];return{spec:function a(b,c){let d=Array.isArray(b?.nodes)?b.nodes.map(a=>({...a})):[],e=Array.isArray(b?.edges)?b.edges.map(a=>({...a})):[];for(let b of d)b?.type==="subflow"&&b.subflowSpec&&(b.subflowSpec=a(b.subflowSpec,c));let f=d.filter(a=>a&&"string"==typeof a.key&&!!a.key&&"mcp"!==a.type);if(0===f.length)return{...b,nodes:d,edges:e};let g=i(f.map((a,b)=>({id:a.key,type:a.type,x:0,y:1e3*b})),e.filter(a=>a&&"string"==typeof a.from&&"string"==typeof a.to).map(a=>({from:a.from,to:a.to,bidirectional:!0===a.bidirectional})));for(let a of g.addEdges)e.push({from:a.from,to:a.to,...a.bidirectional?{bidirectional:!0}:{}}),c.push({code:a.reason,message:n(a.reason),nodeId:a.to});let h=new Set(d.map(a=>a.key).filter(Boolean));if(g.addStart){let a=j("start",h);for(let b of(h.add(a),d.unshift({key:a,type:"start"}),g.addStart.targets))e.push({from:a,to:b});c.push({code:"auto-added-start",message:`Added a Start node connected to ${g.addStart.targets.length} entry step(s).`})}if(g.addFinish){let a=j("finish",h);for(let b of(h.add(a),d.push({key:a,type:"finish"}),g.addFinish.sources))e.push({from:b,to:a});c.push({code:"auto-added-finish",message:`Added a Finish node connected from ${g.addFinish.sources.length} final step(s).`})}return{...b,nodes:d,edges:e}}(a,b),changes:b}}function l(a){return a.data?.type??a.type??"unknown"}function m(a){var b,c;let f=(a?.nodes??[]).map(a=>({...a,position:{...a.position??{x:0,y:0}},data:{...a.data}})),g=[...a?.edges??[]],h={...a,nodes:f,edges:g},j=[],k=i(f.filter(a=>"mcp"!==l(a)&&"resource"!==l(a)).map(a=>({id:a.id,type:l(a),x:a.position?.x??0,y:a.position?.y??0})),g.filter(a=>!function(a){let b=a.data?.edgeType;return"mcp"===b||"resource"===b}(a)).map(a=>({from:a.source,to:a.target,bidirectional:a.data?.bidirectional===!0}))),m=new Map(f.map(a=>[a.id,a])),o=(a,b,c)=>{let d=m.get(a),f=m.get(b);d&&f&&g.push((0,e.pX)(d,f,c))};for(let a of k.addEdges)o(a.from,a.to,a.bidirectional),j.push({code:a.reason,message:n(a.reason),nodeId:a.to});if(k.addStart){let a=k.addStart.targets.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y<a.position.y?b:a,null),c=(b={x:a?.position.x??250,y:(a?.position.y??150)-150},{id:(0,d.A)(),type:"start",position:b,data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}});for(let a of(f.unshift(c),m.set(c.id,c),k.addStart.targets))o(c.id,a,!1);j.push({code:"auto-added-start",message:`Added a Start node connected to ${k.addStart.targets.length} entry step(s).`,nodeId:c.id})}if(k.addFinish){let a=k.addFinish.sources.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y>a.position.y?b:a,null),b=(c={x:a?.position.x??250,y:(a?.position.y??0)+150},{id:(0,d.A)(),type:"finish",position:c,data:{label:"Finish Node",type:"finish",properties:{}}});for(let a of(f.push(b),m.set(b.id,b),k.addFinish.sources))o(a,b.id,!1);j.push({code:"auto-added-finish",message:`Added a Finish node connected from ${k.addFinish.sources.length} final step(s).`,nodeId:b.id})}return{flow:h,changes:j}}function n(a){switch(a){case"auto-connected":return"Connected a disconnected step into the flow.";case"auto-bidirectional-subflow":return"Wired a parallel subflow with a two-way handoff to its orchestrator.";case"auto-added-start":return"Added a Start node.";case"auto-added-finish":return"Added a Finish node."}}},71994:(a,b,c)=>{c.d(b,{GN:()=>B,Xg:()=>C,UC:()=>D});var d=c(50846),e=c(20433),f=c(62101),g=c(54042),h=c(81226),i=c(84671),j=c(5248),k=c(88185),l=c(14265),m=c(1905),n=c(33233),o=c(9312),p=c(41527);let q=["prompt","isolatedPrompt","payloadTemplate"];function r(a){return RegExp("\\$\\{var:\\s*"+a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"\\s*\\}","g")}function s(a,b){for(let c of q){let d=a[c];"string"==typeof d&&(a[c]=b(d))}Array.isArray(a.spawnBriefs)&&(a.spawnBriefs=a.spawnBriefs.map(a=>"string"==typeof a?b(a):a))}function t(a){return a.replace(/[ \t]{2,}/g," ").replace(/[ \t]+([.,;:!?])/g,"$1").replace(/[ \t]+\n/g,"\n")}let u=(0,d.h)("backend/services/flow/generateFlow");function v(a,b,c,d){let e=c?`MULTI-LEVEL FLOWS — you MAY design subflows that are themselves brand-new flows:
2
+ - A subflow node normally references an EXISTING flow via "flow". To instead create a NEW child flow, use ONE of these on the subflow node (not "flow"):
3
+ - "subflowSpec": an inline nested FlowSpec (you author the whole child now), or
4
+ - "generateSubflow": a short natural-language description of the child — FLUJO will generate that child flow for you.
5
+ - Nest only when a self-contained sub-task genuinely deserves its own flow. Nesting is bounded: at most ${d} level(s) deep and ${h.lk} flows total. Keep it minimal.`:`SUBFLOWS: a subflow node's "flow" must reference an EXISTING flow (by name or id). Do NOT use "subflowSpec" or "generateSubflow" — multi-level generation is off for this run.`,f=b?`CAPABILITY ACQUISITION — you are allowed to EXPAND this FLUJO instance:
6
+ - If the task needs a capability none of the configured servers provides (voice, vision, browsing, email, code execution, …), use search_mcp_marketplace to find a server for it, then install_mcp_server to install the best match. Prefer servers that need no API keys (empty requiredEnv); if the best option needs keys, install a keyless alternative or note the requirement in the flow description.
7
+ - After a successful install, reference the returned server name in a process node's "servers" list and enable the tools it reported.
8
+ - Be ambitious: an actual capability (real audio, real browsing, real files) beats a text approximation. Search with several short terms ("voice", "tts", "speech") — the registry matches server NAMES only.`:`CAPABILITY DISCOVERY — you may search but NOT install:
9
+ - If the task needs a capability none of the configured servers provides, you may use search_mcp_marketplace to see what exists. Do NOT reference unconfigured servers in the spec; instead mention the recommended server (its registry name) in the flow "description" so the user can install it.`;return`You design workflows for FLUJO, an MCP-first workflow builder. The user describes what they want; you emit a flow specification as JSON.
10
+
11
+ OUTPUT FORMAT — when you are done (after any tool use), respond with ONLY one JSON object, no prose, no code fences.
12
+
13
+ ${k.R}
14
+
15
+ GENERATED-FLOW DEFAULTS (context saving): process nodes you leave without an explicit inputMode/outputMode are compiled with inputMode "latest-message" and outputMode "latest-message" — each step sees only the current task and later steps see only its final response, not its tool calls/results. When a step genuinely needs the whole conversation or later steps need its intermediate work, set "full-history" / "full-conversation" explicitly.
16
+
17
+ GENERATED-FLOW DATA-FLOW POLICY (IMPORTANT — carry data through the conversation, NOT scratchpad variables):
18
+ 1. PREFER CONVERSATION HISTORY. For a later step to use an earlier step's output, keep that output in the thread: give the earlier (producer) step outputMode "full-conversation" (or leave "latest-message" when only its final text matters) and give the later (consumer) step inputMode "full-history" so it actually sees the producer's turn. This is the default, robust way to move data forward.
19
+ 2. DO NOT emit \${var:NAME} in generated prompts. The scratchpad variable feature (captureVariable + \${var:NAME}) is a valid HAND-AUTHORING tool, but for AUTO-GENERATED flows it is a footgun: a missing/late capture silently bakes an EMPTY string into the reading step's prompt and breaks the run. Do not use \${var:NAME} just to shuttle ordinary text one step forward — use history (rule 1).
20
+ 3. WHEN HISTORY IS INSUFFICIENT (the consumer is "isolated"/"latest-message" and still needs an earlier step's data, or the artifact is large/structured/binary), use a RUN RESOURCE instead of a scratchpad variable: the producer step sets "captureResource": "NAME" and the consumer step injects \${res:NAME} in its prompt. A run resource survives isolated/latest-message scoping and is tracked with lineage. Example:
21
+ { "key": "writer", "type": "process", "model": "...", "prompt": "Draft the full report.", "captureResource": "report" }
22
+ { "key": "critic", "type": "process", "model": "...", "inputMode": "isolated", "isolatedPrompt": "Critique this report:
23
+
24
+ \${res:report}" }
25
+ (edge writer -> critic). Use \${res:NAME}, never \${var:NAME}, in generated flows.
26
+ 4. Any \${var:NAME} you emit anyway will be automatically rewritten to history or a run resource (or removed if nothing captures it), so emit history/\${res:...} directly to keep control of the design.
27
+
28
+ ${f}
29
+
30
+ ${e}
31
+
32
+ ${a}`}function w(a){return a.map(a=>`- [${a.severity}] ${a.message}`).join("\n")}function x(a){let b=[{type:"function",function:{name:"search_mcp_marketplace",description:'Search the public MCP server registry. The registry matches the query against server NAMES only (substring), so use short single terms ("voice", "tts", "browser") and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it requires.',parameters:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}}}];return a&&b.push({type:"function",function:{name:"install_mcp_server",description:"Install an MCP server from the registry (by the exact name returned by search) and connect it. Returns the server name to reference in the spec and the tools it provides — or needsEnv when required keys are missing (then pick an alternative or note it for the user). Installing can take a while (package download).",parameters:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'}},required:["name"]}}}),b}async function y(a,b,c,d){if("search_mcp_marketplace"===a){let a="string"==typeof b.query?b.query:"";try{return await (0,l.e3)(a)}catch(a){return{error:`Registry search failed: ${a instanceof Error?a.message:String(a)}`}}}if("install_mcp_server"===a){if(!c)return{error:"Installing is not allowed in this generation (allowInstall is off)."};let a="string"==typeof b.name?b.name:"",e=await (0,l.aM)(a,void 0,{resolveOnly:!0}),f=await (0,m.Ej)(),g=(0,n.e5)({caller:"generator",settings:f,registryName:a,allowInstall:c});e.plan&&await (0,m.NB)((0,n.UM)(e.plan,"generator",g,!1));let h=await (0,l.aM)(a);return h.plan&&await (0,m.NB)((0,n.UM)(h.plan,"generator",g,h.installed,h.error)),h.installed&&h.serverName&&(d.contextDirty=!0,d.installedServers.push({name:h.serverName,tools:(h.tools??[]).map(a=>a.name),...h.alreadyExisted?{alreadyExisted:!0}:{},...h.plan?.command?{command:h.plan.command}:{},...h.plan?.args?{args:h.plan.args}:{},...h.plan?.verificationStatus?{verificationStatus:h.plan.verificationStatus}:{}})),h}return{error:`Unknown tool: ${a}`}}async function z(a,b,c,d,e,f,h){let i={};for(let a of e){if("function"!==a.type)continue;let b=a.function.name;i[b]=a=>y(b,a,f,h)}for(let j=0;j<=8;j++){let k=e.length>0&&j<8,{completion:l}=await a.createCompletion({model:b,apiKey:c,messages:d,temperature:0,maxTokens:(0,g.normalizeMaxTokens)(b.maxTokens),...k?{tools:e,localToolExecutors:i}:{}}),m=l.choices?.[0]?.message,n=m?.tool_calls??[];if(0===n.length)return"string"==typeof m?.content?m.content:"";for(let a of(d.push({role:"assistant",content:m?.content??null,tool_calls:n}),n)){if("function"!==a.type)continue;let b={};try{b=JSON.parse(a.function.arguments||"{}")}catch{}u.info(`Generator tool call: ${a.function.name}(${a.function.arguments})`);let c=await y(a.function.name,b,f,h);d.push({role:"tool",tool_call_id:a.id,content:JSON.stringify(c)})}7===j&&d.push({role:"user",content:"Tool budget exhausted. Emit the COMPLETE flow specification now as a single JSON object using what you have."})}return""}function A(a){let b=a.indexOf("{");if(-1===b)return null;let c=0,d=!1,e=!1;for(let f=b;f<a.length;f++){let g=a[f];if(d){e?e=!1:"\\"===g?e=!0:'"'===g&&(d=!1);continue}if('"'===g)d=!0;else if("{"===g)c++;else if("}"===g&&0==--c)try{return JSON.parse(a.slice(b,f+1))}catch{break}}return null}async function B(a){var b;let c="string"==typeof a?.description?a.description.trim():"";if(!c)return{success:!1,error:"A flow description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let d=!0===a.allowInstall,g=!0===a.allowSubflows,k=g?"number"!=typeof(b=a.maxDepth)||Number.isNaN(b)?2:Math.max(0,Math.min(h.A_,Math.floor(b))):0,l=await e.modelService.getModel(a.modelId);if(!l)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let m=await e.modelService.resolveAndDecryptApiKey(l.ApiKey);if(!m)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let n=await (0,o.jY)(),y=(0,f.getCompletionAdapter)(l),B=x(d),C={installedServers:[],contextDirty:!1},D=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),E=1;async function F(a,b){let c,e=[{role:"system",content:v(n.catalog,d,g&&b<k,k)},{role:"user",content:a}];try{c=await z(y,l,m,e,B,d,C)}catch(a){return u.warn("A child subflow generation call failed; leaving the subflow unresolved",a),null}let f=A(c);return f&&"object"==typeof f?f:null}async function G(a,b){if(a&&Array.isArray(a.nodes))for(let c of a.nodes){if(c?.type!=="subflow"||c.flow)continue;if(c.subflowSpec){await G(c.subflowSpec,b+1);continue}let a="string"==typeof c.generateSubflow?c.generateSubflow.trim():"";if(!a)continue;if(b+1>k||E>=h.lk){u.info(`Not expanding generateSubflow (depth ${b+1}, ${E} flows so far): budget/depth reached`);continue}let d=await F(a,b+1);d?(E++,c.subflowSpec=d,delete c.generateSubflow,await G(d,b+1)):delete c.generateSubflow}}let H=[{role:"system",content:v(n.catalog,d,g,k)},{role:"user",content:c}],I=null,J=0;for(let a=0;a<=D;a++){let b;J++,E=1;try{b=await z(y,l,m,H,B,d,C)}catch(a){if(u.error("Generator model call failed",a),I)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}let c=A(b);if(!c){if(u.warn(`Attempt ${J}: model output contained no parseable JSON object`),C.contextDirty){try{n=await (0,o.jY)()}catch(a){u.warn("Re-gathering context after install failed; keeping the stale catalog",a)}C.contextDirty=!1}H.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}if(g)try{await G(c,0)}catch(a){u.warn("Subflow expansion failed; compiling the root spec as-is",a)}if(C.contextDirty){try{n=await (0,o.jY)()}catch(a){u.warn("Re-gathering context after install failed; validating with the stale catalog",a)}C.contextDirty=!1}let e=[];try{let a=function(a){let b=[];try{!function a(b,c){if(b&&Array.isArray(b.nodes)){for(let d of(!function(a,b){let c=Array.isArray(a?.nodes)?a.nodes.filter(a=>a&&"string"==typeof a.key):[];if(0===c.length)return;let d=Array.isArray(a?.edges)?a.edges:[],e=new Map;for(let a of c)e.set(a.key,new Set);for(let a of d)a&&"string"==typeof a.from&&"string"==typeof a.to&&(e.has(a.to)&&e.get(a.to).add(a.from),a.bidirectional&&e.has(a.from)&&e.get(a.from).add(a.to));let f=a=>{let b=new Set,c=[...e.get(a)??[]];for(;c.length;){let d=c.pop();if(!b.has(d)&&d!==a)for(let a of(b.add(d),e.get(d)??[]))c.push(a)}return b},g=new Set;for(let a of c)"string"==typeof a.parallelFlowsVariable&&a.parallelFlowsVariable.trim()&&g.add(a.parallelFlowsVariable.trim());let h=new Map;for(let a of c){let b="string"==typeof a.captureVariable?a.captureVariable.trim():"";b&&(h.has(b)||h.set(b,[]),h.get(b).push(a))}let i=new Map;for(let a of c)for(let b of function(a){let b=new Set;for(let c of q){let d=a[c];if("string"==typeof d)for(let a of(0,p.T9)(d))b.add(a)}if(Array.isArray(a.spawnBriefs)){for(let c of a.spawnBriefs)if("string"==typeof c)for(let a of(0,p.T9)(c))b.add(a)}return[...b]}(a))i.has(b)||i.set(b,[]),i.get(b).push(a);for(let[a,d]of i){if(g.has(a))continue;let e=h.get(a)??[],i=d.filter(a=>{let b=f(a.key);return e.some(c=>c.key!==a.key&&b.has(c.key))});if(0===i.length){let d=r(a);for(let a of c)s(a,a=>t(a.replace(d,"")));b.push({code:"var-dangling",message:`Removed \${var:${a}} — no earlier step captures it (it would resolve to an empty string at run time).`});continue}if(i.some(a=>"isolated"===a.inputMode)){if(e.some(b=>"string"==typeof b.captureResource&&b.captureResource.trim()&&b.captureResource.trim()!==a))continue;for(let b of e)b.captureResource=a,delete b.captureVariable;let d=r(a);for(let b of c)s(b,b=>b.replace(d,"${res:"+a+"}"));b.push({code:"var-resource",message:`Converted scratchpad \${var:${a}} to a tracked run resource \${res:${a}} (a consumer is isolated, so conversation history cannot carry it).`});continue}let j=r(a);for(let a of c)s(a,a=>t(a.replace(j,"")));for(let a of i)a.inputMode="full-history";for(let b of e)b.captureVariable===a&&delete b.captureVariable;b.push({code:"var-history",message:`Removed scratchpad \${var:${a}} and set the reading step(s) to full-history so the value flows through the conversation instead.`})}}(b,c),b.nodes))if(d&&(d.subflowSpec&&a(d.subflowSpec,c),Array.isArray(d.parallelSubflowSpecs)))for(let b of d.parallelSubflowSpecs)a(b,c)}}(a,b)}catch{}return{spec:a,changes:b}}(c);a.changes.length>0&&(u.info(`Attempt ${J}: scratchpad-var guard rewrote ${a.changes.length} reference(s)`),e=a.changes.map(a=>({severity:"warning",code:a.code,message:a.message})))}catch(a){u.warn("Scratchpad-var guard failed; compiling the spec as-is",a)}let f=c,v=[];try{let a=(0,j.p)(c);a.changes.length>0&&(f=a.spec,v=a.changes,u.info(`Attempt ${J}: auto-repair adjusted the spec (${v.length} change(s))`))}catch(a){u.warn("Auto-repair of the generated spec failed; compiling the spec as-is",a)}let x=v.map(a=>({severity:"warning",code:a.code,message:a.message})),F=(0,h.dM)(f,n.compile,{maxDepth:k,maxFlows:h.lk});if(!F.flow){H.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
33
+ ${w(F.issues)}
34
+ Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}for(let a of F.flows)(0,h.Zn)(a);let K=F.flows.map(a=>({flow:a,validation:(0,i.nC)(a,{models:n.compile.models,servers:n.validatorServers,serverTools:n.compile.serverTools})})),L=(0,o.RB)([...e,...x,...F.issues],{issues:K.flatMap(a=>a.validation.issues),errorCount:0,warningCount:0,isRunnable:!0});if(I={flows:K,rootFlow:F.flow,validation:L},0===L.errorCount)break;u.info(`Attempt ${J}: bundle has ${L.errorCount} error(s)`+(a<D?"; asking the model to repair":"; repair budget exhausted")),a<D&&H.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
35
+ ${w(L.issues)}
36
+ Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return I?(u.info(`Generated draft bundle rooted at "${I.rootFlow.name}" (${I.flows.length} flow(s)) in ${J} attempt(s): ${I.validation.errorCount} error(s), ${I.validation.warningCount} warning(s), ${C.installedServers.length} server(s) installed`),{success:!0,flow:I.rootFlow,validation:I.validation,flows:I.flows,rootFlowId:I.rootFlow.id,attempts:J,installedServers:C.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the description or a different generator model.",statusCode:422}}async function C(a){let b="string"==typeof a?.description?a.description.trim():"";if(!b)return{success:!1,error:"A change description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let c=a?.flow;if(!c||"object"!=typeof c||!Array.isArray(c.nodes)||!Array.isArray(c.edges))return{success:!1,error:"A valid flow to improve is required",statusCode:400};let d=await e.modelService.getModel(a.modelId);if(!d)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let g=await e.modelService.resolveAndDecryptApiKey(d.ApiKey);if(!g)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let j=!0===a.allowInstall,k=await (0,o.jY)(),l=(0,f.getCompletionAdapter)(d),m=x(j),n={installedServers:[],contextDirty:!1},p=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),q=(0,h.FH)(c),r={};for(let a of c.nodes)a?.id&&a.position&&"number"==typeof a.position.x&&"number"==typeof a.position.y&&(r[a.id]={x:a.position.x,y:a.position.y});let s=a=>({models:a.compile.models,servers:a.compile.servers,serverTools:a.compile.serverTools,flows:(a.compile.flows??[]).filter(a=>a.id!==c.id)}),t=`EXISTING FLOW (modify this — keep unchanged parts intact, and KEEP each node's "key" for any node you do NOT restructure so its canvas position is preserved):
37
+ ${JSON.stringify(q)}
38
+
39
+ CHANGE REQUEST:
40
+ ${b}
41
+
42
+ Re-emit the COMPLETE flow specification as a single JSON object (only the JSON), including the nodes you did not change.`,y=[{role:"system",content:v(k.catalog,j,!1,0)},{role:"user",content:t}],B=null,C=0;for(let a=0;a<=p;a++){let b;C++;try{b=await z(l,d,g,y,m,j,n)}catch(a){if(u.error("Improver model call failed",a),B)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}if(n.contextDirty){try{k=await (0,o.jY)()}catch(a){u.warn("Re-gathering context after install failed; using the stale catalog",a)}n.contextDirty=!1}let e=A(b);if(!e){u.warn(`Improve attempt ${C}: model output contained no parseable JSON object`),y.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}let f=(0,h.dM)(e,s(k),{maxDepth:0,maxFlows:1,positions:r});if(!f.flow){y.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
43
+ ${w(f.issues)}
44
+ Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}f.flow.id=c.id,"string"==typeof e.name&&e.name.trim()||(f.flow.name=c.name),(0,h.Zn)(f.flow);let q=(0,i.nC)(f.flow,{models:k.compile.models,servers:k.validatorServers,serverTools:k.compile.serverTools}),t=(0,o.RB)(f.issues,q);if(B={flows:[{flow:f.flow,validation:q}],rootFlow:f.flow,validation:t},0===t.errorCount)break;u.info(`Improve attempt ${C}: flow has ${t.errorCount} error(s)`+(a<p?"; asking the model to repair":"; repair budget exhausted")),a<p&&y.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
45
+ ${w(t.issues)}
46
+ Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return B?(u.info(`Improved draft "${B.rootFlow.name}" in ${C} attempt(s): ${B.validation.errorCount} error(s), ${B.validation.warningCount} warning(s), ${n.installedServers.length} server(s) installed`),{success:!0,flow:B.rootFlow,validation:B.validation,flows:B.flows,rootFlowId:B.rootFlow.id,attempts:C,installedServers:n.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the change request or a different generator model.",statusCode:422}}async function D(a){let b=a?.flow;if(!b||"object"!=typeof b||!Array.isArray(b.nodes)||!Array.isArray(b.edges))return{success:!1,error:"A valid flow to repair is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A repair model id is required",statusCode:400};let c=(0,i.nC)(b),d=c.issues.length>0?`
47
+
48
+ Known problems to fix:
49
+ ${w(c.issues)}`:"";return C({flow:b,description:`Repair this flow's wiring so it is runnable, WITHOUT changing any node's prompt, model, or servers:
50
+ - add a Start node if one is missing, connected to the first step;
51
+ - add a Finish node if one is missing, connected from the last step;
52
+ - connect any disconnected process/subflow nodes.
53
+ Read node placement as intent: nodes stacked top-to-bottom are sequential steps, and nodes on the same horizontal line are parallel branches under a shared parent above them.${d}`,modelId:a.modelId,...void 0!==a.allowInstall?{allowInstall:a.allowInstall}:{},...void 0!==a.maxRepairs?{maxRepairs:a.maxRepairs}:{}})}}};
@@ -0,0 +1,5 @@
1
+ "use strict";exports.id=6529,exports.ids=[6529],exports.modules={32631:(a,b,c)=>{c.d(b,{D:()=>h}),c(21124);var d=c(38301),e=c(19815);c(48748),c(9718);let f=(0,e.h)("frontend/contexts/ThemeContext"),g=(0,d.createContext)(void 0),h=()=>{let a=(0,d.useContext)(g);if(!a)throw f.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return f.debug("useTheme hook accessed"),a}},32720:(a,b,c)=>{c.d(b,{A:()=>B});var d=c(21124),e=c(38301),f=c(40512),g=c(83899),h=c(52327),i=c(81637),j=c(43312),k=c(44079),l=c(37674),m=c(41893),n=c(88745),o=c(8521),p=c(79515),q=c(89490),r=c(75983),s=c(50553),t=c(84233),u=c(19925),v=c(68730),w=c(30717),x=c(98810),y=c(52399),z=c(91314);let A=(0,c(19815).h)("frontend/components/shared/FolderPickerDialog"),B=({open:a,title:b="Choose a folder",selectFiles:c=!1,initialPath:B,onClose:C,onSelect:D})=>{let[E,F]=(0,e.useState)(null),[G,H]=(0,e.useState)(""),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(null),M=(0,e.useCallback)(async a=>{J(!0),L(null);try{let b=a?`?path=${encodeURIComponent(a)}`:"",c=await fetch(`/api/browse${b}`),d=await c.json();if(!c.ok||d.error)return void L(d.error||`HTTP ${c.status}`);F(d),H(d.path)}catch(a){A.warn("Browse failed",a),L("Could not reach the backend to browse folders.")}finally{J(!1)}},[]);(0,e.useEffect)(()=>{a?M(B||void 0):(F(null),L(null))},[a,B,M]);let N=a=>{D(a),C()};return(0,d.jsxs)(f.A,{open:a,onClose:C,maxWidth:"sm",fullWidth:!0,children:[(0,d.jsx)(g.A,{children:b}),(0,d.jsxs)(h.A,{dividers:!0,sx:{display:"flex",flexDirection:"column",gap:1.5},children:[(0,d.jsxs)(i.default,{sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(j.A,{title:"Up one folder",children:(0,d.jsx)("span",{children:(0,d.jsx)(k.A,{size:"small",disabled:!E?.parent||I,onClick:()=>E?.parent&&void M(E.parent),children:(0,d.jsx)(y.A,{fontSize:"small"})})})}),(0,d.jsx)(j.A,{title:"Home folder",children:(0,d.jsx)("span",{children:(0,d.jsx)(k.A,{size:"small",disabled:I,onClick:()=>void M(),children:(0,d.jsx)(z.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{fullWidth:!0,size:"small",value:G,onChange:a=>H(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),M(G))},placeholder:"Type a path and press Enter"})]}),E&&E.drives.length>0&&(0,d.jsx)(i.default,{sx:{display:"flex",gap:.75,flexWrap:"wrap"},children:E.drives.map(a=>(0,d.jsx)(m.A,{label:a,size:"small",variant:E.path.toLowerCase().startsWith(a.toLowerCase())?"filled":"outlined",onClick:()=>void M(a)},a))}),K&&(0,d.jsx)(n.A,{severity:"error",children:K}),(0,d.jsxs)(i.default,{sx:{minHeight:240,maxHeight:"45vh",overflow:"auto",border:1,borderColor:"divider",borderRadius:1},children:[I&&(0,d.jsx)(i.default,{sx:{display:"flex",justifyContent:"center",py:4},children:(0,d.jsx)(o.default,{size:24})}),!I&&E&&0===E.entries.length&&(0,d.jsx)(p.default,{variant:"body2",color:"text.secondary",sx:{p:2},children:"This folder is empty."}),!I&&(0,d.jsx)(q.A,{dense:!0,disablePadding:!0,children:E?.entries.map(a=>(0,d.jsxs)(r.A,{disabled:!a.isDirectory&&!c,onClick:()=>a.isDirectory?void M(a.path):N(a.path),children:[(0,d.jsx)(s.A,{sx:{minWidth:34},children:a.isDirectory?(0,d.jsx)(w.A,{fontSize:"small",color:"primary"}):(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(t.A,{primary:a.name,primaryTypographyProps:{noWrap:!0}})]},a.path))})]})]}),(0,d.jsxs)(u.A,{children:[(0,d.jsx)(v.A,{onClick:C,children:"Cancel"}),(0,d.jsx)(v.A,{variant:"contained",disabled:!E||I,onClick:()=>E&&N(E.path),children:"Select this folder"})]})]})}},33799:(a,b,c)=>{c.d(b,{b:()=>f,c:()=>g});var d=c(50648);async function e(a,b){try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!c.ok||!c.body)return null;let e=null;return await (0,d.z)(c,a=>{"stdout"===a.type||"stderr"===a.type?b(a.data):"result"===a.type&&(e={success:a.success,output:a.commandOutput??""})}),e}catch(a){return console.error("Error streaming git command:",a),null}}let f=async(a,b,c)=>{if(c){let d=await e({action:"installStream",savePath:a,installCommand:b},c);if(d)return{success:d.success,message:d.success?{type:"success",text:"Dependencies installed successfully. You can now build the server."}:{type:"error",text:"Error installing dependencies. You can still try to build the server."},output:d.output||"No output was returned from the installation process."}}try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"install",savePath:a,installCommand:b})}),d=await c.json();if(!c.ok)throw Error(d.error||"Failed to install dependencies");return{success:!0,message:{type:"success",text:"Dependencies installed successfully. You can now build the server."},output:d.commandOutput||"No output was returned from the installation process."}}catch(a){return console.error("Error installing dependencies:",a),{success:!1,message:{type:"error",text:`Error installing dependencies: ${a.message||"Unknown error"}. You can still try to build the server.`},output:a instanceof Response?await a.text():a?.message||"Unknown error"}}},g=async(a,b,c)=>{if(c){let d=await e({action:"buildStream",savePath:a,buildCommand:b},c);if(d)return{success:d.success,message:d.success?{type:"success",text:"Server built successfully."}:{type:"error",text:"Error building server."},output:d.output||"No output was returned from the build process."}}try{let c=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"build",savePath:a,buildCommand:b})}),d=await c.json();if(!c.ok)throw Error(d.error||"Failed to build repository");return{success:!0,message:{type:"success",text:"Server built successfully."},output:d.commandOutput||"No output was returned from the build process."}}catch(a){return console.error("Error building server:",a),{success:!1,message:{type:"error",text:`Error building server: ${a.message||"Unknown error"}.`},output:a instanceof Response?await a.text():a?.message||"Unknown error"}}}},35070:(a,b,c)=>{c.d(b,{A:()=>ao});var d=c(21124),e=c(38301),f=c(19815),g=c(48748),h=c(8165),i=c(93083),j=c(65343),k=c(53222),l=c(12033),m=c(91034),n=c(95786),o=c(64956),p=c(55641),q=c(29320),r=c(5748),s=c(38941),t=c(51694),u=c(1312),v=c(25750),w=c(5501),x=c(99587),y=c(61615),z=c(78352),A=c(28055),B=c(44920),C=c(46410),D=c(41893),E=c(56685),F=c(71756),G=c(91901),H=c(83013);let I=({transport:a,size:b="small"})=>{let{colors:c}=(0,g.Ic)(),e=c.domain.transport,f=(()=>{switch(a){case"stdio":return{label:"STDIO",icon:(0,d.jsx)(E.A,{fontSize:"small"}),color:e.stdio.fg,bgColor:e.stdio.bg};case"websocket":return{label:"WebSocket",icon:(0,d.jsx)(F.A,{fontSize:"small"}),color:e.websocket.fg,bgColor:e.websocket.bg};case"sse":return{label:"SSE",icon:(0,d.jsx)(G.A,{fontSize:"small"}),color:e.sse.fg,bgColor:e.sse.bg};case"streamable":return{label:"HTTP Stream",icon:(0,d.jsx)(H.A,{fontSize:"small"}),color:e.streamable.fg,bgColor:e.streamable.bg};default:return{label:"UNKNOWN",icon:(0,d.jsx)(E.A,{fontSize:"small"}),color:e.default.fg,bgColor:e.default.bg}}})();return(0,d.jsx)(D.A,{icon:f.icon,label:f.label,size:b,sx:{backgroundColor:f.bgColor,color:f.color,fontWeight:500,fontSize:"small"===b?"0.75rem":"0.875rem",height:"small"===b?24:32,"& .MuiChip-icon":{color:f.color}}})};var J=c(40512),K=c(83899),L=c(52327),M=c(19925),N=c(68730),O=c(81637),P=c(79515),Q=c(88745),R=c(95587),S=c(77028),T=c(89490),U=c(71439),V=c(50553),W=c(84233),X=c(72264),Y=c(53455),Z=c(33799);let $=(0,f.h)("frontend/components/mcp/MCPServerManager/ServerUpdateDialog"),_=({open:a,onClose:b,serverName:c,rootPath:f,installCommand:g,buildCommand:i,enabled:k,updateInfo:l,onToggle:m,onUpdated:n})=>{let[o,p]=(0,e.useState)(null),[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(!1),[u,w]=(0,e.useState)(!1),[x,z]=(0,e.useState)(null),[A,B]=(0,e.useState)({}),[C,E]=(0,e.useState)(""),F=!!(g&&g.trim()),G=!!(i&&i.trim()),H=[{key:"stop",label:"Stop server",active:k},{key:"pull",label:"Pull latest changes",active:!0},{key:"install",label:`Install dependencies (${g})`,active:F},{key:"build",label:`Build (${i})`,active:G},{key:"restart",label:"Restart server",active:k}];(0,e.useEffect)(()=>{a&&(r(!1),t(!1),w(!1),z(null),B({}),E(""))},[a,c]),(0,e.useEffect)(()=>{if(a&&l.remoteUrl&&l.localSha&&l.remoteSha){let a=!1;return(0,Y.Qz)(l.remoteUrl,l.localSha,l.remoteSha).then(b=>{a||p(b)}),()=>{a=!0}}p(null)},[a,l.remoteUrl,l.localSha,l.remoteSha]);let I=(0,e.useCallback)((a,b)=>{B(c=>({...c,[a]:b}))},[]),_=(0,e.useCallback)((a,b)=>{E(c=>c+(c?"\n":"")+`--- ${a} ---
2
+ `+(b||"").trim()+"\n")},[]),aa=async()=>{t(!0),z(null),$.info(`Starting update for server ${c}`);let a=(a,b)=>{I(a,"error"),z(b),t(!1)};try{k&&(I("stop","running"),await Promise.resolve(m(!1)),I("stop","done")),I("pull","running");let b=await (0,Y.Qv)(f);if(!b.success)return void a("pull",b.error||"Failed to pull updates");if(_("Pull",`Updated ${(0,Y.Fu)(b.oldSha)} -> ${(0,Y.Fu)(b.newSha)}`),I("pull","done"),F){I("install","running");let b=await (0,Z.b)(f,g.trim());if(_("Install",b.output),!b.success)return void a("install",b.message.text);I("install","done")}if(G){I("build","running");let b=await (0,Z.c)(f,i.trim());if(_("Build",b.output),!b.success)return void a("build",b.message.text);I("build","done")}k&&(I("restart","running"),await Promise.resolve(m(!0)),I("restart","done")),$.info(`Update completed for server ${c}`),w(!0),t(!1),n?.()}catch(a){$.error(`Update failed for server ${c}`,a),z(a.message||"Update failed"),t(!1)}},ab=s||u||Object.keys(A).length>0,ac=l.hasLocalChanges&&!q;return(0,d.jsxs)(J.A,{open:a,onClose:s?void 0:b,maxWidth:"sm",fullWidth:!0,onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(K.A,{component:"div",sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(v.A,{color:"primary"}),"Update ",c]}),(0,d.jsxs)(L.A,{children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:1,flexWrap:"wrap"},children:[(0,d.jsx)(D.A,{size:"small",label:(0,Y.Fu)(l.localSha),sx:{fontFamily:"monospace"}}),(0,d.jsx)(P.default,{variant:"body2",color:"text.secondary",children:"→"}),(0,d.jsx)(D.A,{size:"small",color:"primary",label:(0,Y.Fu)(l.remoteSha),sx:{fontFamily:"monospace"}}),l.branch&&"HEAD"!==l.branch&&(0,d.jsxs)(P.default,{variant:"body2",color:"text.secondary",children:["on ",(0,d.jsx)("code",{children:l.branch})]}),o?.behindBy!=null&&(0,d.jsxs)(P.default,{variant:"body2",color:"text.secondary",children:["(",o.behindBy," commit",1===o.behindBy?"":"s"," behind)"]})]}),l.repoRoot&&l.repoRoot.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()!==f.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()&&(0,d.jsxs)(P.default,{variant:"body2",color:"text.secondary",sx:{mb:1},children:["This server lives inside a larger repository — the update pulls"," ",(0,d.jsx)("code",{children:l.repoRoot})," as a whole (other servers from the same repository are updated along with it)."]}),o&&o.commits.length>0&&!ab&&(0,d.jsx)(O.default,{sx:{mb:2,p:1,borderRadius:1,border:"1px solid",borderColor:"divider",maxHeight:160,overflow:"auto"},children:o.commits.map(a=>(0,d.jsxs)(P.default,{variant:"body2",sx:{fontSize:"0.8rem"},noWrap:!0,title:a.message,children:[(0,d.jsx)("code",{children:a.sha})," ",a.message]},a.sha))}),l.hasLocalChanges&&!ab&&(0,d.jsxs)(Q.A,{severity:"warning",sx:{mb:2},children:[(0,d.jsxs)(P.default,{variant:"body2",sx:{mb:1},children:["This repository has local changes to tracked files. Updating will ",(0,d.jsx)("strong",{children:"discard"})," them. Untracked files (e.g. a ",(0,d.jsx)("code",{children:".env"})," you created) and all FLUJO settings for this server are kept."]}),(0,d.jsx)(O.default,{component:"ul",sx:{m:0,pl:3,maxHeight:100,overflow:"auto"},children:l.dirtyFiles.map(a=>(0,d.jsx)("li",{children:(0,d.jsx)(P.default,{variant:"body2",component:"span",sx:{fontFamily:"monospace",fontSize:"0.8rem"},children:a})},a))}),(0,d.jsx)(R.A,{sx:{mt:1},control:(0,d.jsx)(S.A,{size:"small",checked:q,onChange:a=>r(a.target.checked)}),label:(0,d.jsx)(P.default,{variant:"body2",children:"Discard my local changes and update"})})]}),(0,d.jsx)(T.A,{dense:!0,disablePadding:!0,children:H.filter(a=>a.active).map(a=>(0,d.jsxs)(U.Ay,{disableGutters:!0,sx:{py:.25},children:[(0,d.jsx)(V.A,{sx:{minWidth:32},children:(a=>{switch(a){case"running":return(0,d.jsx)(y.default,{size:"small",color:"primary"});case"done":return(0,d.jsx)(h.A,{color:"success",fontSize:"small"});case"error":return(0,d.jsx)(j.A,{color:"error",fontSize:"small"});default:return(0,d.jsx)(X.A,{color:"disabled",fontSize:"small"})}})(A[a.key])}),(0,d.jsx)(W.A,{primary:a.label,primaryTypographyProps:{variant:"body2",noWrap:!0,title:a.label}})]},a.key))}),x&&(0,d.jsxs)(Q.A,{severity:"error",sx:{mt:2,whiteSpace:"pre-wrap"},children:[x,k&&(0,d.jsx)(P.default,{variant:"body2",sx:{mt:1},children:"The server was left stopped. Adjust the install/build commands via Edit, then re-enable it."})]}),u&&(0,d.jsxs)(Q.A,{severity:"success",sx:{mt:2},children:["Server updated successfully",k?" and restarted":"","."]}),C&&(0,d.jsx)(O.default,{sx:{mt:2,p:1,borderRadius:1,bgcolor:"background.paper",border:"1px solid",borderColor:"divider",fontFamily:"monospace",fontSize:"0.75rem",whiteSpace:"pre-wrap",overflow:"auto",maxHeight:200},children:C})]}),(0,d.jsxs)(M.A,{children:[(0,d.jsx)(N.A,{onClick:b,disabled:s,children:u?"Close":"Cancel"}),!u&&(0,d.jsx)(N.A,{variant:"contained",color:"primary",startIcon:(0,d.jsx)(v.A,{}),onClick:aa,disabled:s||ac,children:s?"Updating…":x?"Retry Update":"Update"})]})]})};var aa=c(37674),ab=c(44079),ac=c(47902);let ad=(0,f.h)("frontend/components/mcp/MCPServerManager/FilesystemRootsModal"),ae=({open:a,serverName:b,initialRoots:c,onClose:f,onSaved:g})=>{let[h,i]=(0,e.useState)([]),[j,k]=(0,e.useState)(""),[l,n]=(0,e.useState)(!1),[o,p]=(0,e.useState)(null),q="bash"===b;(0,e.useEffect)(()=>{a&&(i(Array.isArray(c)?[...c]:[]),k(""),p(null))},[a,c]);let r=()=>{let a=j.trim();if(a){if(h.includes(a))return void p("That root is already in the list.");i(b=>[...b,a]),k(""),p(null)}},s=async()=>{n(!0),p(null);try{let a=await A.S.updateServerConfig(b,{roots:h});if(a&&"error"in a&&a.error)return void p("string"==typeof a.error?a.error:"Failed to save roots.");ad.info(`Saved ${h.length} root(s) for ${b}`),g?.(h),f()}catch(a){ad.warn("Failed to save filesystem roots",a),p(a instanceof Error?a.message:"Failed to save roots.")}finally{n(!1)}};return(0,d.jsxs)(J.A,{open:a,onClose:f,maxWidth:"sm",fullWidth:!0,onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(K.A,{children:["Configure ",b," roots"]}),(0,d.jsxs)(L.A,{children:[(0,d.jsxs)(P.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:["Confine the built-in ",(0,d.jsx)("b",{children:b})," server to these folders. Leave the list empty for full host access (unless the ",(0,d.jsx)("code",{children:q?"FLUJO_BASH_ROOTS":"FLUJO_FS_ROOTS"})," environment variable is set, which always acts as a hard ceiling)."]}),q&&(0,d.jsxs)(Q.A,{severity:"info",sx:{mb:2},children:["The bash ",(0,d.jsx)("code",{children:"cwd"})," fence is best-effort: a shell can still ",(0,d.jsx)("code",{children:"cd"})," elsewhere or use absolute paths, so ",(0,d.jsx)("code",{children:"FLUJO_FS_ROOTS"}),"/",(0,d.jsx)("code",{children:"FLUJO_BASH_ROOTS"})," and OS permissions remain the real boundary."]}),o&&(0,d.jsx)(Q.A,{severity:"error",sx:{mb:2},onClose:()=>p(null),children:o}),(0,d.jsxs)(O.default,{sx:{display:"flex",gap:1,mb:1},children:[(0,d.jsx)(aa.A,{fullWidth:!0,size:"small",label:"Add a root folder (absolute path)",value:j,onChange:a=>k(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.preventDefault(),r())},placeholder:"e.g. C:\\\\Users\\\\me\\\\project or /home/me/project"}),(0,d.jsx)(N.A,{variant:"outlined",startIcon:(0,d.jsx)(ac.A,{}),onClick:r,disabled:!j.trim(),children:"Add"})]}),0===h.length?(0,d.jsx)(P.default,{variant:"body2",color:"text.secondary",sx:{mt:1},children:"No roots configured — the server has full host access."}):(0,d.jsx)(T.A,{dense:!0,children:h.map((a,b)=>(0,d.jsx)(U.Ay,{secondaryAction:(0,d.jsx)(ab.A,{edge:"end","aria-label":"remove root",onClick:()=>{i(a=>a.filter((a,c)=>c!==b))},children:(0,d.jsx)(m.A,{fontSize:"small"})}),children:(0,d.jsx)(P.default,{variant:"body2",sx:{wordBreak:"break-all"},children:a})},`${a}-${b}`))})]}),(0,d.jsxs)(M.A,{children:[(0,d.jsx)(N.A,{onClick:f,disabled:l,children:"Cancel"}),(0,d.jsx)(N.A,{onClick:s,variant:"contained",disabled:l,children:l?"Saving…":"Save"})]})]})};var af=c(30873),ag=c(60839),ah=c(30818),ai=c(43312),aj=c(37489),ak=c(27114),al=c(67191),am=c(98463);let an=(0,f.h)("frontend/components/mcp/MCPServerManager/ServerCard"),ao=({name:a,status:b,path:f,enabled:E,transport:F,onToggle:G=()=>{},onRetry:H=()=>{},onDelete:R=()=>{},onClick:T,onEdit:U=()=>{},onAuthenticate:V,pickerMode:W=!1,error:X,stderrOutput:Z,authorizationUrl:$,selected:aa=!1,onSelect:ac,selectionMode:ad=!1,hasOAuthTokens:ao=!1,exposeAsMcpServer:ap=!1,enableMcpApps:aq=!1,updateInfo:ar,installCommand:as,buildCommand:at,onUpdated:au,folder:av,folders:aw=[],onSetFolder:ax,favorite:ay=!1,onToggleFavorite:az,builtIn:aA=!1,serverConfig:aB})=>{let[aC,aD]=(0,e.useState)(!1),[aE,aF]=(0,e.useState)(null),[aG,aH]=(0,e.useState)(!1),[aI,aJ]=(0,e.useState)(!1),[aK,aL]=(0,e.useState)(""),[aM,aN]=(0,e.useState)("success"),[aO,aP]=(0,e.useState)(!1),[aQ,aR]=(0,e.useState)(!1),[aS,aT]=(0,e.useState)(!1),[aU,aV]=(0,e.useState)(aB?.roots);(0,e.useEffect)(()=>{aV(aB?.roots)},[aB?.roots]);let[aW,aX]=(0,e.useState)(ap),[aY,aZ]=(0,e.useState)(aq),a$=(0,ag.A)();(0,e.useEffect)(()=>{aX(ap)},[ap]),(0,e.useEffect)(()=>{aZ(aq)},[aq]);let a_=async b=>{aX(b);let c=await A.S.updateServerConfig(a,{exposeAsMcpServer:b});"success"in c&&c.success?(aL(b?"Server is now exposed to external apps.":"Server is no longer exposed."),aN("success")):(aX(!b),aL("Failed to update exposure setting."),aN("error")),aJ(!0)},a0=async b=>{aZ(b);let c=await A.S.updateServerConfig(a,{enableMcpApps:b});"success"in c&&c.success?(aL(b?"This server may now render interactive apps in chat (sandboxed).":"Interactive apps disabled for this server."),aN("success")):(aZ(!b),aL("Failed to update the MCP Apps setting."),aN("error")),aJ(!0)},a1=()=>{navigator.clipboard.writeText(""),aL("Endpoint URL copied to clipboard."),aN("success"),aJ(!0)},a2=()=>{navigator.clipboard.writeText((0,B.CZ)(a,aB,"")),aL("Server JSON copied to clipboard."),aN("success"),aJ(!0)},a3={connected:"success.main",disconnected:"text.secondary",error:"error.main",connecting:"info.main",initialization:"info.main",requires_authentication:"warning.main"}[b];(0,e.useEffect)(()=>{if(("connecting"===b||"initialization"===b)&&E&&!W){aP(!0);let b=setTimeout(()=>{an.debug(`Polling status for server: ${a}`),H()},2e3);return()=>{clearTimeout(b),aP(!1)}}"connecting"!==b&&"initialization"!==b&&aP(!1)},[b,E,a,H]);let[a4,a5]=(0,e.useState)(null);(0,e.useEffect)(()=>()=>{a4&&clearTimeout(a4)},[a4]);let a6=async b=>{b.stopPropagation(),an.debug(`Reset OAuth tokens button clicked for server: ${a}`),aR(!0);try{let b=await fetch("/api/oauth/reset",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:a})});if(!b.ok){let a=await b.json();throw Error(a.error||"Failed to reset OAuth tokens")}let c=await b.json();an.info(`OAuth tokens reset successfully for ${a}`,c),aL("OAuth tokens reset successfully. Server will require re-authentication."),aN("success"),aJ(!0),setTimeout(()=>{H()},500)}catch(b){an.error(`Failed to reset OAuth tokens for ${a}`,b),aL(`Failed to reset OAuth tokens: ${b instanceof Error?b.message:"Unknown error"}`),aN("error"),aJ(!0)}finally{aR(!1)}},{getThemeValue:a7,getThemeColor:a8,colors:a9}=(0,g.Ic)(),ba=()=>{an.debug(`Server restart initiated for: ${a}`),G(!1),setTimeout(()=>{G(!0),an.info(`Server ${a} restarted`)},1e3)};return(0,d.jsxs)(ah.A,{role:W?"button":void 0,"aria-pressed":W?aa:void 0,sx:{cursor:"pointer",position:"relative",height:W?"100%":void 0,transition:"box-shadow 0.3s ease, border-color 0.12s ease",border:a=>W&&aa?`2px solid ${a.palette.primary.main}`:"2px solid transparent","&:hover":{boxShadow:3}},onClick:()=>{an.debug(`Server card clicked: ${a}`),T()},children:[az&&!aA&&(0,d.jsx)(ai.A,{title:ay?"Remove from favorites":"Add to favorites",arrow:!0,placement:"top",children:(0,d.jsx)(ab.A,{size:"small","aria-label":ay?"remove from favorites":"add to favorites",onClick:a=>{a.stopPropagation(),az()},sx:{position:"absolute",top:4,left:4,zIndex:2,color:ay?a$.palette.warning.main:a$.palette.text.secondary,backgroundColor:(0,aj.X4)(a$.palette.background.paper,.6),"&:hover":{backgroundColor:(0,aj.X4)(a$.palette.background.paper,.9)}},children:ay?(0,d.jsx)(w.A,{fontSize:"small"}):(0,d.jsx)(x.A,{fontSize:"small"})})}),(0,d.jsxs)(ak.A,{sx:{pb:1},children:[(0,d.jsxs)(O.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",mb:1},children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center",flex:1},children:[ad&&ac&&(0,d.jsx)(S.A,{checked:aa,onClick:a=>a.stopPropagation(),onChange:a=>ac(a.target.checked),size:"small",sx:{mr:1,p:.5}}),(0,d.jsx)(P.default,{variant:"h6",component:"h3",sx:{flex:1},children:a})]}),(0,d.jsxs)(O.default,{sx:{display:"flex",flexDirection:"column",alignItems:"flex-end",gap:.5},children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center",gap:.5},children:[ar?.updateAvailable&&(0,d.jsx)(ai.A,{title:`Update available: ${(0,Y.Fu)(ar.localSha)} → ${(0,Y.Fu)(ar.remoteSha)}. Click to update.`,children:(0,d.jsx)(D.A,{icon:(0,d.jsx)(v.A,{}),label:"Update",color:"warning",size:"small",onClick:b=>{b.stopPropagation(),an.debug(`Update badge clicked for server: ${a}`),aH(!0)}})}),aA?(0,d.jsx)(ai.A,{title:"FLUJO's built-in server — can be enabled or disabled below, but not edited or removed.",children:(0,d.jsx)(D.A,{label:"Built-in",color:"primary",size:"small"})}):(0,d.jsx)(I,{transport:F,size:"small"})]}),(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:["connected"===b&&(0,d.jsx)(h.A,{color:"success",sx:{mr:.5},fontSize:"small"}),"disconnected"===b&&(0,d.jsx)(i.A,{color:"action",sx:{mr:.5},fontSize:"small"}),"error"===b&&(0,d.jsx)(j.A,{color:"error",sx:{mr:.5},fontSize:"small"}),"requires_authentication"===b&&(0,d.jsx)(n.A,{color:"warning",sx:{mr:.5},fontSize:"small"}),("connecting"===b||"initialization"===b)&&(0,d.jsx)(y.default,{size:"small",color:"primary",sx:{mr:.5}}),(0,d.jsx)(P.default,{variant:"body2",color:a3,children:"requires_authentication"===b?"Requires Authentication":b})]})]})]}),(0,d.jsx)(P.default,{variant:"body2",color:"text.secondary",sx:{mb:1,fontSize:"0.875rem"},noWrap:!0,title:aA?void 0:f,children:aA?"FLUJO's own backend API — flow authoring, execution and server management as MCP tools.":f}),aA&&!W&&(0,d.jsxs)(O.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(q.A,{fontSize:"small",sx:{mr:.5,color:"primary.main"}}),(0,d.jsx)(ai.A,{title:"External MCP clients (Claude Code, Claude Desktop, Cursor, …) can drive FLUJO through this local endpoint.",children:(0,d.jsx)(P.default,{variant:"body2",sx:{fontWeight:500},children:"Exposed to external apps"})})]}),(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(P.default,{variant:"caption",sx:{flex:1,fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:"",children:""}),(0,d.jsx)(ai.A,{title:"Copy endpoint URL",children:(0,d.jsx)(ab.A,{size:"small",onClick:a1,children:(0,d.jsx)(s.A,{fontSize:"small"})})}),(0,d.jsx)(ai.A,{title:"Copy MCP server JSON",children:(0,d.jsx)(ab.A,{size:"small",onClick:a2,children:(0,d.jsx)(t.A,{fontSize:"small"})})})]})]}),!aA&&!W&&(0,d.jsxs)(O.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(q.A,{fontSize:"small",sx:{mr:.5,color:aW?"primary.main":"text.disabled"}}),(0,d.jsx)(al.A,{checked:aW,onChange:a=>a_(a.target.checked),size:"small"}),(0,d.jsx)(ai.A,{title:"Re-expose this server's tools to external MCP clients (Claude Desktop, Cursor, …) at a local URL.",children:(0,d.jsx)(P.default,{variant:"body2",sx:{fontWeight:500},children:"Expose to external apps"})})]}),aW&&(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(P.default,{variant:"caption",sx:{flex:1,fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:"",children:""}),(0,d.jsx)(ai.A,{title:"Copy endpoint URL",children:(0,d.jsx)(ab.A,{size:"small",onClick:a1,children:(0,d.jsx)(s.A,{fontSize:"small"})})}),(0,d.jsx)(ai.A,{title:"Copy MCP server JSON",children:(0,d.jsx)(ab.A,{size:"small",onClick:a2,children:(0,d.jsx)(t.A,{fontSize:"small"})})})]})]}),!aA&&!W&&(0,d.jsx)(O.default,{sx:{mt:1,mb:1,p:1,borderRadius:1,border:"1px solid",borderColor:"divider"},onClick:a=>a.stopPropagation(),children:(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(r.A,{fontSize:"small",sx:{mr:.5,color:aY?"primary.main":"text.disabled"}}),(0,d.jsx)(al.A,{checked:aY,onChange:a=>a0(a.target.checked),size:"small"}),(0,d.jsx)(ai.A,{title:"Allow this server's tools to render interactive apps (MCP Apps / ui:// resources) in chat. Rendered read-only in a strict sandbox. Only enable for servers you trust.",children:(0,d.jsx)(P.default,{variant:"body2",sx:{fontWeight:500},children:"Render interactive apps"})})]})}),"error"===b&&(0,d.jsxs)(O.default,{sx:{mt:1,mb:1},children:[(0,d.jsxs)(O.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:.5},children:[(0,d.jsx)(P.default,{variant:"body2",fontWeight:"medium",color:"error",children:"Error:"}),(0,d.jsx)(N.A,{size:"small",color:"primary",onClick:b=>{b.stopPropagation(),an.debug(`View full error clicked for server: ${a}`),aD(!0)},children:"View Full Error"})]}),(0,d.jsx)(O.default,{sx:{maxHeight:"80px",overflow:"auto",p:1,borderRadius:1,bgcolor:a=>a8("error.background"),color:a=>a8("error.text"),border:"1px solid",borderColor:a=>a8("error.border"),fontSize:"0.75rem",fontWeight:500,whiteSpace:"pre-wrap"},children:X||"Unknown error"})]}),"requires_authentication"===b&&!W&&(0,d.jsxs)(O.default,{sx:{mt:1,mb:1},children:[(0,d.jsx)(O.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:1},children:(0,d.jsx)(P.default,{variant:"body2",fontWeight:"medium",color:"warning.main",children:"Authentication Required"})}),(0,d.jsxs)(N.A,{variant:"contained",color:"warning",size:"small",startIcon:(0,d.jsx)(o.A,{}),onClick:async b=>{if(b.stopPropagation(),an.debug(`Authenticate button clicked for server: ${a}`),V)V();else try{let b=await fetch("/api/oauth/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:a})});if(!b.ok){let a=await b.json();throw Error(a.error||"Failed to initiate OAuth")}let{authorizationUrl:d,alreadyAuthorized:e}=await b.json();if(e||!d){an.info(`Server ${a} already authorized, no popup needed`),ba();return}let{openOAuthPopup:f}=await c.e(558).then(c.bind(c,60558));await f({url:d,windowName:`oauth_${a}`,onSuccess:b=>{an.info(`OAuth authentication successful for ${a}`,b),an.info(`Automatically restarting server ${a} after OAuth completion`),ba()},onError:b=>{an.error(`OAuth authentication failed for ${a}`,b),aL("OAuth authentication failed"),aN("error"),aJ(!0)}})}catch(b){an.error(`Failed to start OAuth authentication for ${a}`,b),aL("Failed to start OAuth authentication"),aN("error"),aJ(!0)}},sx:{width:"100%"},children:["Authenticate with ",a]})]})]}),aA&&!W&&G&&(0,d.jsx)(am.A,{sx:{justifyContent:"flex-start",px:2,py:1},onClick:a=>a.stopPropagation(),children:(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(al.A,{checked:E,onClick:a=>a.stopPropagation(),onChange:b=>{an.debug(`Built-in server ${a} toggle changed to: ${b.target.checked}`),G(b.target.checked)},color:"primary",size:"small"}),(0,d.jsx)(P.default,{variant:"body2",sx:{ml:.5,fontWeight:500,color:E?"primary.main":"text.secondary"},children:E?"Enabled":"Disabled"}),("filesystem"===a||"bash"===a)&&(0,d.jsx)(ai.A,{title:`Configure ${a} roots`,children:(0,d.jsxs)(N.A,{size:"small",variant:"text",startIcon:(0,d.jsx)(C.A,{fontSize:"small"}),sx:{ml:1.5,textTransform:"none"},onClick:a=>{a.stopPropagation(),aT(!0)},children:["Configure roots",aU&&aU.length?` (${aU.length})`:""]})})]})}),("filesystem"===a||"bash"===a)&&(0,d.jsx)(ae,{open:aS,serverName:a,initialRoots:aU,onClose:()=>aT(!1),onSaved:a=>aV(a)}),!aA&&!W&&(0,d.jsxs)(am.A,{sx:{justifyContent:"space-between",px:2,py:1},children:[(0,d.jsxs)(O.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(al.A,{checked:E,onClick:a=>a.stopPropagation(),onChange:b=>{an.debug(`Server ${a} toggle changed to: ${b.target.checked}`),G(b.target.checked)},color:"primary",size:"small"}),(0,d.jsx)(P.default,{variant:"body2",sx:{ml:.5,fontWeight:500,color:E?"primary.main":"text.secondary"},children:E?"Enabled":"Disabled"}),E&&(0,d.jsx)(ai.A,{title:"Restart server",children:(0,d.jsx)(ab.A,{size:"small",onClick:b=>{b.stopPropagation(),an.debug(`Restart button clicked for server: ${a}`),ba()},sx:{ml:1},children:(0,d.jsx)(k.A,{fontSize:"small"})})})]}),(0,d.jsxs)(O.default,{children:[(0,d.jsx)(ai.A,{title:"Retry connection",children:(0,d.jsx)(ab.A,{color:"primary",onClick:c=>{c.stopPropagation(),an.debug(`Retry button clicked for server: ${a}`),a4&&clearTimeout(a4),aP(!0),H();let d=setTimeout(()=>{"connecting"!==b&&"initialization"!==b&&aP(!1),a5(null)},1e4);a5(d)},disabled:aO,size:"small",children:aO?(0,d.jsx)(y.default,{size:"small",color:"primary"}):(0,d.jsx)(k.A,{})})}),"streamable"===F&&ao&&(0,d.jsx)(ai.A,{title:"Reset OAuth tokens",children:(0,d.jsx)(ab.A,{color:"warning",onClick:a6,disabled:aQ,size:"small",children:aQ?(0,d.jsx)(y.default,{size:"small",color:"primary"}):(0,d.jsx)(p.A,{})})}),ax&&(0,d.jsx)(ai.A,{title:av?`Folder: ${av}`:"Move to folder",children:(0,d.jsx)(ab.A,{color:av?"primary":"default",onClick:a=>{a.stopPropagation(),aF(a.currentTarget)},size:"small",children:(0,d.jsx)(u.A,{})})}),(0,d.jsx)(ai.A,{title:"Edit server",children:(0,d.jsx)(ab.A,{color:"primary",onClick:a=>{a.stopPropagation(),U()},size:"small",children:(0,d.jsx)(l.A,{})})}),(0,d.jsx)(ai.A,{title:"Delete server",children:(0,d.jsx)(ab.A,{color:"error",onClick:a=>{a.stopPropagation(),R()},size:"small",children:(0,d.jsx)(m.A,{})})})]})]}),ax&&(0,d.jsx)(z.A,{anchorEl:aE,open:!!aE,currentFolder:av,folders:aw,onClose:()=>aF(null),onAssign:a=>ax(a)}),(0,d.jsxs)(J.A,{open:aC,onClose:()=>{an.debug(`Error modal closed for server: ${a}`),aD(!1)},maxWidth:"md",fullWidth:!0,onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)(K.A,{component:"div",children:["Error Details for ",a]}),(0,d.jsxs)(L.A,{children:[(0,d.jsx)(O.default,{sx:{p:2,borderRadius:1,bgcolor:a=>a8("error.background"),color:a=>a8("error.text"),border:"1px solid",borderColor:a=>a8("error.border"),fontFamily:"monospace",fontSize:"0.875rem",fontWeight:500,whiteSpace:"pre-wrap",overflow:"auto",maxHeight:"300px",mb:2},children:X||"Unknown error"}),Z&&(0,d.jsxs)(O.default,{sx:{mt:2},children:[(0,d.jsx)(P.default,{variant:"h6",gutterBottom:!0,children:"Stderr Output:"}),(0,d.jsx)(O.default,{sx:{p:2,borderRadius:1,bgcolor:"background.paper",border:"1px solid",borderColor:"divider",fontFamily:"monospace",fontSize:"0.875rem",whiteSpace:"pre-wrap",overflow:"auto",maxHeight:"300px"},children:Z})]})]}),(0,d.jsxs)(M.A,{children:[(0,d.jsx)(N.A,{onClick:()=>aD(!1),children:"Close"}),(0,d.jsx)(N.A,{onClick:()=>{let b=[X||"Unknown error",Z?`
3
+
4
+ Stderr Output:
5
+ ${Z}`:""].join("");navigator.clipboard.writeText(b),an.debug(`Error copied to clipboard for server: ${a}`),aL("Error message copied to clipboard"),aN("success"),aJ(!0)},color:"primary",children:"Copy to Clipboard"})]})]}),ar&&(0,d.jsx)(_,{open:aG,onClose:()=>aH(!1),serverName:a,rootPath:f,installCommand:as,buildCommand:at,enabled:E,updateInfo:ar,onToggle:G,onUpdated:au}),(0,d.jsx)(af.A,{open:aI,autoHideDuration:3e3,onClose:()=>aJ(!1),anchorOrigin:{vertical:"bottom",horizontal:"center"},children:(0,d.jsx)(Q.A,{onClose:()=>aJ(!1),severity:aM,sx:{width:"100%"},children:aK||"Error message copied to clipboard"})})]})}},44920:(a,b,c)=>{function d(a){let b={};if(!a)return b;for(let[c,d]of Object.entries(a))b[c]=d&&"object"==typeof d&&"value"in d?d.value:"string"==typeof d?d:"";return b}function e(a){let b,c=[],d=[];if("string"==typeof a)try{b=JSON.parse(a)}catch(a){return{servers:d,errors:[`Invalid JSON: ${a.message}`]}}else b=a;if(!b||"object"!=typeof b)return{servers:d,errors:["Expected a JSON object."]};let e=b,f=e.mcpServers&&"object"==typeof e.mcpServers?e.mcpServers:e;if(0===Object.keys(f).length)return{servers:d,errors:['No servers found. Expected an "mcpServers" object.']};for(let[a,b]of Object.entries(f)){if(!b||"object"!=typeof b){c.push(`"${a}": entry is not an object.`);continue}let e=function(a){let b=(a.transport||a.type||"").toString().toLowerCase().trim();if(!b)return"stdio";switch(b){case"stdio":return"stdio";case"http":case"streamable-http":case"streamable":case"streamablehttp":return"streamable";case"sse":return"sse";case"ws":case"websocket":return"websocket";default:return null}}(b);if(!e){c.push(`"${a}": unknown transport type "${b.type||b.transport}".`);continue}let f={};if(b.env&&"object"==typeof b.env)for(let[a,c]of Object.entries(b.env))f[a]="string"==typeof c?c:String(c??"");let g={name:a,env:f,disabled:b.disabled??!1,autoApprove:Array.isArray(b.autoApprove)?b.autoApprove:[],rootPath:"",_buildCommand:"",_installCommand:""};if("stdio"===e){if(!b.command||"string"!=typeof b.command){c.push(`"${a}": stdio server is missing a "command".`);continue}d.push({...g,transport:"stdio",command:b.command,args:Array.isArray(b.args)?b.args:[]})}else if("websocket"===e){let e=b.url||b.websocketUrl;if(!e){c.push(`"${a}": websocket server is missing a "url".`);continue}d.push({...g,transport:"websocket",websocketUrl:e})}else{let f=b.url||b.serverUrl;if(!f){c.push(`"${a}": ${e} server is missing a "url".`);continue}let h=b.headers&&"object"==typeof b.headers?b.headers:void 0;d.push({...g,transport:e,serverUrl:f,...h?{headers:h}:{}})}}return{servers:d,errors:c}}c.d(b,{_i:()=>f,CZ:()=>h,Kt:()=>g});let f=[{id:"claude",label:"Claude",fileName:"mcp_config.json",export:function(a,b={}){let c=(b.proxyBaseUrl||"").replace(/\/$/,""),e={};for(let b of a){if(b.exposeAsMcpServer){e[b.name]={type:"http",url:`${c}/mcp-proxy/${b.name}`};continue}let a={},f=d(b.env);switch(b.transport){case"stdio":a.command=b.command,a.args=b.args||[],Object.keys(f).length>0&&(a.env=f);break;case"streamable":a.type="http",a.url=b.serverUrl,b.headers&&Object.keys(b.headers).length>0&&(a.headers=d(b.headers)),Object.keys(f).length>0&&(a.env=f);break;case"sse":a.type="sse",a.url=b.serverUrl,b.headers&&Object.keys(b.headers).length>0&&(a.headers=d(b.headers)),Object.keys(f).length>0&&(a.env=f);break;case"websocket":a.type="ws",a.url=b.websocketUrl,Object.keys(f).length>0&&(a.env=f);break;default:Object.keys(f).length>0&&(a.env=f)}e[b.name]=a}return{mcpServers:e}},import:e},{id:"cline",label:"Cline",fileName:"cline_mcp_settings.json",export:function(a,b={}){let c=(b.proxyBaseUrl||"").replace(/\/$/,""),e={};for(let b of a){let a={disabled:b.disabled??!1,autoApprove:b.autoApprove??[],timeout:60};if(b.exposeAsMcpServer){e[b.name]={...a,type:"streamableHttp",url:`${c}/mcp-proxy/${b.name}`};continue}let f=d(b.env),g={...a};switch(b.transport){case"stdio":g.command=b.command,g.args=b.args||[],Object.keys(f).length>0&&(g.env=f);break;case"streamable":g.type="streamableHttp",g.url=b.serverUrl,b.headers&&Object.keys(b.headers).length>0&&(g.headers=d(b.headers));break;case"sse":g.type="sse",g.url=b.serverUrl,b.headers&&Object.keys(b.headers).length>0&&(g.headers=d(b.headers));break;case"websocket":g.type="ws",g.url=b.websocketUrl;break;default:Object.keys(f).length>0&&(g.env=f)}e[b.name]=g}return{mcpServers:e}},import:function(a){return e(a)}}];function g(a){return f.find(b=>b.id===a)??f[0]}function h(a,b,c,d="claude"){let e=(c||"").replace(/\/$/,"");return JSON.stringify(b?g(d).export([b],{proxyBaseUrl:e}):{mcpServers:{[a]:{type:"http",url:`${e}/mcp-proxy/${a}`}}},null,2)}},48748:(a,b,c)=>{c.d(b,{Ic:()=>h});var d=c(32631),e=c(19815);let f={light:{background:"#FFFFFF",foreground:"#2C3E50",surface:"#F5F6FA",surfaceRaised:"#FFFFFF",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",textDisabled:"#9CA3AF",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"},domain:{resource:"#009688",resourceSoft:"#4DB6AC",signal:"#7E57C2",startNode:"#795548",codeBackground:"#f5f5f5",http:{get:"#2e7d32",post:"#1565c0",put:"#e65100",patch:"#6a1b9a",delete:"#c62828"},transport:{stdio:{fg:"#1976d2",bg:"#e3f2fd"},websocket:{fg:"#2e7d32",bg:"#e8f5e8"},sse:{fg:"#f57c00",bg:"#fff3e0"},streamable:{fg:"#00796b",bg:"#e0f2f1"},default:{fg:"#757575",bg:"#f5f5f5"}}}},dark:{background:"#0f1319",foreground:"#eef1f5",surface:"#1a212b",surfaceRaised:"#242d3a",paperBackground:"#1a212b",textSecondary:"#b4bdca",textDisabled:"#6b7280",border:"#37404e",heading:"#f5f7fa",text:"#eef1f5",secondaryText:"#b4bdca",error:{background:"#2a1618",border:"#5a2a2e",text:"#ff6b6b"},domain:{resource:"#26a69a",resourceSoft:"#4DB6AC",signal:"#9575CD",startNode:"#a1887f",codeBackground:"#242d3a",http:{get:"#66bb6a",post:"#5b9dff",put:"#ffa726",patch:"#ba68c8",delete:"#ef5350"},transport:{stdio:{fg:"#90caf9",bg:"#1e2a3a"},websocket:{fg:"#a5d6a7",bg:"#1e2e22"},sse:{fg:"#ffcc80",bg:"#33281a"},streamable:{fg:"#80cbc4",bg:"#17322e"},default:{fg:"#b4bdca",bg:"#242d3a"}}}}},g=(0,e.h)("frontend/utils/theme");function h(){let{isDarkMode:a}=(0,d.D)();return g.debug(`useThemeUtils called with isDarkMode: ${a}`),{getThemeValue:(b,c)=>a?c:b,getThemeColor:b=>{let c=b.split("."),d=f[a?"dark":"light"];for(let a of c)if(!d||"object"!=typeof d||!(a in d))return g.warn(`Theme color path not found: ${b}`),"";else d=d[a];return d},colors:a?f.dark:f.light,isDarkMode:a}}},53455:(a,b,c)=>{c.d(b,{Fu:()=>i,M8:()=>f,Qv:()=>g,Qz:()=>h});let d=(0,c(19815).h)("frontend/components/mcp/MCPServerManager/utils/serverUpdates"),e=new Map;async function f(a,b=!1){let c=Date.now(),g={},h=[];for(let d of new Set(a.filter(Boolean))){let a=e.get(d);!b&&a&&c-a.at<6e5?g[d]=a.info:h.push(d)}if(h.length>0)try{let a=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"checkUpdatesBatch",paths:h})}),b=await a.json();if(a.ok&&b.results)for(let[a,d]of Object.entries(b.results))e.set(a,{at:c,info:d}),g[a]=d;else d.warn("Batch update check failed",b.error)}catch(a){d.warn("Batch update check request failed",a)}return g}async function g(a){try{let b=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"pullUpdates",savePath:a})}),c=await b.json();if(!b.ok)return{success:!1,error:c.error||"Failed to pull updates"};return{success:!0,oldSha:c.oldSha,newSha:c.newSha,updated:c.updated}}catch(a){return{success:!1,error:a.message||"Failed to pull updates"}}}async function h(a,b,c){let e=a.match(/github\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);if(!e)return null;try{let a=await fetch(`https://api.github.com/repos/${e[1]}/${e[2]}/compare/${b}...${c}`);if(!a.ok)return null;let d=await a.json(),f=Array.isArray(d.commits)?d.commits:[];return{behindBy:"number"==typeof d.total_commits?d.total_commits:null,commits:f.slice(-10).reverse().map(a=>({sha:(a.sha||"").slice(0,7),message:(a.commit?.message||"").split("\n")[0]}))}}catch(a){return d.debug("GitHub compare preview failed (non-fatal)",a),null}}function i(a){return a?a.slice(0,7):""}}};
@@ -1 +1 @@
1
- "use strict";exports.id=6537,exports.ids=[6537,6793],exports.modules={28001:(a,b,c)=>{c.d(b,{internalListResourceTemplates:()=>k,internalListResources:()=>j,internalReadResource:()=>l});var d=c(50846),e=c(2826),f=c(61539),g=c(14214),h=c(81495);let i=(0,d.h)("backend/services/mcp/internalResources");async function j(){try{return{resources:(await (0,f.yP)(200)).map(a=>({uri:a.uri,name:a.name??`${a.kind}-${a.id.slice(0,8)}`,mimeType:a.mimeType,description:function(a){let b=a.producedBy;switch(b.source){case"tool-result":return`Tool result of ${b.server??"?"}/${b.toolName??"?"}${b.nodeId?` (node ${b.nodeId})`:""}`;case"capture":return`Captured output of node ${b.nodeName??b.nodeId??"?"}`;case"mcp-link":return`Resource link from ${b.server??"?"}/${b.toolName??"?"}`;default:return"Run resource"}}(a),size:a.size}))}}catch(a){return i.error("internalListResources failed",a),{resources:[],error:a instanceof Error?a.message:String(a)}}}function k(){return{resourceTemplates:[{uriTemplate:`${e.j}{conversationId}/{resourceId}`,name:"Run-scoped resource",description:"A data artifact captured during a flow run (tool result, node output). List concrete URIs via resources/list."}]}}async function l(a){let b=(0,f.Ns)(a);if(!b)return{success:!1,error:`Not a run-resource URI: ${a}`,statusCode:400};try{let c=await (0,f.gy)(a,{at:Date.now(),source:"mcp-read"});if(!c)return{success:!1,error:`Run resource not found: ${a}`,statusCode:404};try{g.$.emitterFor(b.conversationId)({type:"resource:read",server:h._,uri:a,name:c.entry.name,mimeType:c.entry.mimeType,size:c.entry.size,source:"mcp-read"})}catch{}return{success:!0,data:c.contents}}catch(b){return i.error(`internalReadResource failed for ${a}`,b),{success:!1,error:b instanceof Error?b.message:String(b),statusCode:500}}}},56793:(a,b,c)=>{c.d(b,{eh:()=>g,ru:()=>e});let d=(0,c(50846).h)("backend/services/scheduler/flowRunEventBus");function e(a){return"signal"===a.kind}class f{publish(a){if(0===this.listeners.size)return;let b=e(a)?`signal topic=${a.topic} emitter=${a.emitterFlowId}`:`flow=${a.flowId} status=${a.status}`;for(let c of(d.debug(`Publishing flow event: ${b} firedBy=${a.firedBy} depth=${a.chainDepth} listeners=${this.listeners.size}`),[...this.listeners]))try{c(a)}catch(a){d.warn("A flow-run event listener threw:",a)}}subscribe(a){return this.listeners.add(a),()=>{this.listeners.delete(a)}}get listenerCount(){return this.listeners.size}constructor(){this.listeners=new Set}}function g(){return global.__flujo_flow_run_event_bus||(global.__flujo_flow_run_event_bus=new f),global.__flujo_flow_run_event_bus}}};
1
+ "use strict";exports.id=6537,exports.ids=[6537],exports.modules={28001:(a,b,c)=>{c.d(b,{internalListResourceTemplates:()=>k,internalListResources:()=>j,internalReadResource:()=>l});var d=c(50846),e=c(2826),f=c(61539),g=c(14214),h=c(81495);let i=(0,d.h)("backend/services/mcp/internalResources");async function j(){try{return{resources:(await (0,f.yP)(200)).map(a=>({uri:a.uri,name:a.name??`${a.kind}-${a.id.slice(0,8)}`,mimeType:a.mimeType,description:function(a){let b=a.producedBy;switch(b.source){case"tool-result":return`Tool result of ${b.server??"?"}/${b.toolName??"?"}${b.nodeId?` (node ${b.nodeId})`:""}`;case"capture":return`Captured output of node ${b.nodeName??b.nodeId??"?"}`;case"mcp-link":return`Resource link from ${b.server??"?"}/${b.toolName??"?"}`;default:return"Run resource"}}(a),size:a.size}))}}catch(a){return i.error("internalListResources failed",a),{resources:[],error:a instanceof Error?a.message:String(a)}}}function k(){return{resourceTemplates:[{uriTemplate:`${e.j}{conversationId}/{resourceId}`,name:"Run-scoped resource",description:"A data artifact captured during a flow run (tool result, node output). List concrete URIs via resources/list."}]}}async function l(a){let b=(0,f.Ns)(a);if(!b)return{success:!1,error:`Not a run-resource URI: ${a}`,statusCode:400};try{let c=await (0,f.gy)(a,{at:Date.now(),source:"mcp-read"});if(!c)return{success:!1,error:`Run resource not found: ${a}`,statusCode:404};try{g.$.emitterFor(b.conversationId)({type:"resource:read",server:h._,uri:a,name:c.entry.name,mimeType:c.entry.mimeType,size:c.entry.size,source:"mcp-read"})}catch{}return{success:!0,data:c.contents}}catch(b){return i.error(`internalReadResource failed for ${a}`,b),{success:!1,error:b instanceof Error?b.message:String(b),statusCode:500}}}},56793:(a,b,c)=>{c.d(b,{eh:()=>g,ru:()=>e});let d=(0,c(50846).h)("backend/services/scheduler/flowRunEventBus");function e(a){return"signal"===a.kind}class f{publish(a){if(0===this.listeners.size)return;let b=e(a)?`signal topic=${a.topic} emitter=${a.emitterFlowId}`:`flow=${a.flowId} status=${a.status}`;for(let c of(d.debug(`Publishing flow event: ${b} firedBy=${a.firedBy} depth=${a.chainDepth} listeners=${this.listeners.size}`),[...this.listeners]))try{c(a)}catch(a){d.warn("A flow-run event listener threw:",a)}}subscribe(a){return this.listeners.add(a),()=>{this.listeners.delete(a)}}get listenerCount(){return this.listeners.size}constructor(){this.listeners=new Set}}function g(){return global.__flujo_flow_run_event_bus||(global.__flujo_flow_run_event_bus=new f),global.__flujo_flow_run_event_bus}}};
@@ -1 +1 @@
1
- "use strict";exports.id=6826,exports.ids=[6826],exports.modules={8665:(a,b,c)=>{c.d(b,{ED:()=>i,Ws:()=>j,jD:()=>g});var d=c(73496),e=c.n(d);let f=(0,c(50846).h)("backend/utils/registryClient"),g="https://registry.modelcontextprotocol.io";async function h(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{let b=await fetch(a,{headers:{Accept:"application/json"},signal:c.signal,cache:"no-store"});return{status:b.status,body:await b.text()}}finally{clearTimeout(d)}}async function i(a,b){try{return await new Promise((c,d)=>{let f=e().connect(a.origin),g=!1,h=a=>{g||(g=!0,a(),f.close())};f.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 session timed out after ${b}ms`)))),f.on("error",a=>h(()=>d(a)));let i=f.request({":method":"GET",":path":a.pathname+a.search,accept:"application/json"});i.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 request timed out after ${b}ms`)))),i.on("error",a=>h(()=>d(a)));let j=0,k="";i.setEncoding("utf8"),i.on("response",a=>{j=Number(a[":status"]||0)}),i.on("data",a=>{k+=a}),i.on("end",()=>h(()=>c({status:j,body:k}))),i.end()})}catch(c){return f.warn("HTTP/2 request to registry failed, retrying over HTTP/1.1",c instanceof Error?c.message:c),await h(a,b)}}async function j(a,b){let c=await i(a,b);if(c.status<200||c.status>=300)throw Error(`MCP Registry responded with status ${c.status}`);return JSON.parse(c.body)}},25250:(a,b,c)=>{c.d(b,{AH:()=>f,O$:()=>p,XQ:()=>q,Yr:()=>m,cy:()=>s,jg:()=>t,nO:()=>n,vf:()=>o,zz:()=>r});let d={npm:"npx",pypi:"uvx",oci:"docker",nuget:"dnx"},e={npm:"npm",pypi:"PyPI",oci:"Docker",nuget:"NuGet",mcpb:"MCPB",cargo:"Cargo"};function f(a){var b;let c=[];for(let f of a.packages??[])(function(a){if(!a.identifier||!d[a.registryType]&&!a.runtimeHint)return!1;let b=a.transport?.type;return!b||"stdio"===b})(f)&&c.push({kind:"package",label:`${e[b=f.registryType]||b}: ${f.identifier}`,pkg:f});for(let b of a.remotes??[])b.url&&("streamable-http"===b.type||"sse"===b.type)&&c.push({kind:"remote",label:`Remote (${"sse"===b.type?"SSE":"Streamable HTTP"}): ${b.url}`,remote:b});return c}let g=new Set(["mcp","server","mcp-server","mcpserver"]);function h(a){return(function(a){let b=a.indexOf("/"),c=b>=0?a.slice(0,b):"",d=b>=0?a.slice(b+1):a;if(!g.has(d.toLowerCase())||!c)return d;let e=c.split(".").pop()||"";return e?`${e}-${d}`:d})(a).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"mcp-server"}function i(a){let b=a.value??a.default;return"named"===a.type?a.name?void 0!==b&&""!==b?[a.name,b]:a.isRequired&&a.valueHint?[a.name,`<${a.valueHint}>`]:a.isRequired?[a.name]:[]:[]:void 0!==b&&""!==b?[b]:a.isRequired?[`<${a.valueHint||"value"}>`]:[]}function j(a){return(a??[]).flatMap(i)}function k(a){return{name:h(a.name),disabled:!1,autoApprove:[],env:{},_buildCommand:"",_installCommand:""}}function l(a){return a.version?`${a.identifier}@${a.version}`:a.identifier}function m(a,b){return"package"===b.kind?function(a,b){let c,e=b.runtimeHint||d[b.registryType],f=j(b.packageArguments),g=j(b.runtimeArguments),h=function(a){let b={};for(let c of a??[]){if(!c.name)continue;let a=c.value??c.default??"";b[c.name]=c.isSecret?{value:a,metadata:{isSecret:!0}}:a}return b}(b.environmentVariables);switch(b.registryType){case"npm":c=[...g,"-y",l(b),...f];break;case"pypi":c=[...g,b.version?`${b.identifier}==${b.version}`:b.identifier,...f];break;case"oci":{let a=Object.keys(h).flatMap(a=>["-e",a]);c=[..."run"===g[0]?[]:["run","-i","--rm"],...g,...a,function(a){let b=a.identifier.split("/").pop()||a.identifier;return!(b.includes(":")||b.includes("@"))&&a.version?`${a.identifier}:${a.version}`:a.identifier}(b),...f];break}case"nuget":c=[...g,l(b),"--yes",...f];break;default:c=[...g,l(b),...f]}return{...k(a),transport:"stdio",command:e,args:c,env:h,rootPath:"."}}(a,b.pkg):function(a,b){let c={};for(let a of b.headers??[])a.name&&(c[a.name]=a.value??a.default??"");let d=k(a);return{...d,transport:"sse"===b.type?"sse":"streamable",serverUrl:b.url,headers:c,rootPath:`mcp-servers/${d.name}`}}(a,b.remote)}function n(a){return"active"===a}function o(a){let b=a?._meta?.["io.modelcontextprotocol.registry/official"]?.status;return"string"==typeof b&&b.length>0?b:"unverified"}function p(a,b,c,d){let e=m(b,c),f=e.transport??"stdio";return{registryName:a,resolvedName:b.name,serverName:e.name??h(b.name),transport:f,...e.command?{command:e.command}:{},...Array.isArray(e.args)?{args:e.args}:{},...e.serverUrl?{serverUrl:e.serverUrl}:{},requiredEnvNames:"package"===c.kind?(c.pkg.environmentVariables??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name):(c.remote.headers??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name),verificationStatus:d}}function q(a){let b;try{b=new URL(a)}catch{return null}let c=b.searchParams.get("q");if(c)return`/v0.1/servers?search=${encodeURIComponent(c)}&version=latest&limit=1`;if(/^\/v[\d.]+\/servers\/[^/]+\/versions\/[^/]+$/.test(b.pathname))return b.pathname;let d=b.pathname.match(/^\/v[\d.]+\/servers\/([^/]+)(?:\/versions)?\/?$/);if(d){let a=decodeURIComponent(d[1]);return`/v0.1/servers?search=${encodeURIComponent(a)}&version=latest&limit=1`}return null}function r(a){return a?.servers&&a.servers.length>0?a.servers[0]:a?.server?.name?a:null}function s(a,b){if(!b||0===Object.keys(b).length)return a;let c={...a.env??{}};for(let[a,d]of Object.entries(b)){let b=c[a];b&&"object"==typeof b&&b.metadata?.isSecret?c[a]={value:d,metadata:{isSecret:!0}}:c[a]=d}return{...a,env:c}}function t(a,b){return"package"===a.kind?(a.pkg.environmentVariables??[]).filter(a=>a.isRequired&&!(a.value??a.default)&&!b?.[a.name]).map(a=>a.name):(a.remote.headers??[]).filter(a=>a.isRequired&&!(a.value??a.default)).map(a=>a.name)}}};
1
+ "use strict";exports.id=6826,exports.ids=[6826],exports.modules={8665:(a,b,c)=>{c.d(b,{ED:()=>i,Ws:()=>j,jD:()=>g});var d=c(73496),e=c.n(d);let f=(0,c(50846).h)("backend/utils/registryClient"),g="https://registry.modelcontextprotocol.io";async function h(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{let b=await fetch(a,{headers:{Accept:"application/json"},signal:c.signal,cache:"no-store"});return{status:b.status,body:await b.text()}}finally{clearTimeout(d)}}async function i(a,b){try{return await new Promise((c,d)=>{let f=e().connect(a.origin),g=!1,h=a=>{g||(g=!0,a(),f.close())};f.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 session timed out after ${b}ms`)))),f.on("error",a=>h(()=>d(a)));let i=f.request({":method":"GET",":path":a.pathname+a.search,accept:"application/json"});i.setTimeout(b,()=>h(()=>d(Error(`HTTP/2 request timed out after ${b}ms`)))),i.on("error",a=>h(()=>d(a)));let j=0,k="";i.setEncoding("utf8"),i.on("response",a=>{j=Number(a[":status"]||0)}),i.on("data",a=>{k+=a}),i.on("end",()=>h(()=>c({status:j,body:k}))),i.end()})}catch(c){return f.warn("HTTP/2 request to registry failed, retrying over HTTP/1.1",c instanceof Error?c.message:c),await h(a,b)}}async function j(a,b){let c=await i(a,b);if(c.status<200||c.status>=300)throw Error(`MCP Registry responded with status ${c.status}`);return JSON.parse(c.body)}},25250:(a,b,c)=>{c.d(b,{AH:()=>f,O$:()=>p,XQ:()=>q,Yr:()=>m,cy:()=>s,jg:()=>t,nO:()=>n,vf:()=>o,zz:()=>r});let d={npm:"npx",pypi:"uvx",oci:"docker",nuget:"dnx"},e={npm:"npm",pypi:"PyPI",oci:"Docker",nuget:"NuGet",mcpb:"MCPB",cargo:"Cargo"};function f(a){var b;let c=[];for(let f of a.packages??[])(function(a){if(!a.identifier||!d[a.registryType]&&!a.runtimeHint)return!1;let b=a.transport?.type;return!b||"stdio"===b})(f)&&c.push({kind:"package",label:`${e[b=f.registryType]||b}: ${f.identifier}`,pkg:f});for(let b of a.remotes??[])b.url&&("streamable-http"===b.type||"sse"===b.type)&&c.push({kind:"remote",label:`Remote (${"sse"===b.type?"SSE":"Streamable HTTP"}): ${b.url}`,remote:b});return c}let g=new Set(["mcp","server","mcp-server","mcpserver"]);function h(a){return(function(a){let b=a.indexOf("/"),c=b>=0?a.slice(0,b):"",d=b>=0?a.slice(b+1):a;if(!g.has(d.toLowerCase())||!c)return d;let e=c.split(".").pop()||"";return e?`${e}-${d}`:d})(a).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"mcp-server"}function i(a){let b=a.value??a.default;return"named"===a.type?a.name?void 0!==b&&""!==b?[a.name,b]:a.isRequired&&a.valueHint?[a.name,`<${a.valueHint}>`]:a.isRequired?[a.name]:[]:[]:void 0!==b&&""!==b?[b]:a.isRequired?[`<${a.valueHint||"value"}>`]:[]}function j(a){return(a??[]).flatMap(i)}function k(a){return{name:h(a.name),disabled:!1,autoApprove:[],env:{},_buildCommand:"",_installCommand:""}}function l(a){return a.version?`${a.identifier}@${a.version}`:a.identifier}function m(a,b){let c="package"===b.kind?function(a,b){let c,e=b.runtimeHint||d[b.registryType],f=j(b.packageArguments),g=j(b.runtimeArguments),h=function(a){let b={};for(let c of a??[]){if(!c.name)continue;let a=c.value??c.default??"";b[c.name]=c.isSecret?{value:a,metadata:{isSecret:!0}}:a}return b}(b.environmentVariables);switch(b.registryType){case"npm":c=[...g,"-y",l(b),...f];break;case"pypi":c=[...g,b.version?`${b.identifier}==${b.version}`:b.identifier,...f];break;case"oci":{let a=Object.keys(h).flatMap(a=>["-e",a]);c=[..."run"===g[0]?[]:["run","-i","--rm"],...g,...a,function(a){let b=a.identifier.split("/").pop()||a.identifier;return!(b.includes(":")||b.includes("@"))&&a.version?`${a.identifier}:${a.version}`:a.identifier}(b),...f];break}case"nuget":c=[...g,l(b),"--yes",...f];break;default:c=[...g,l(b),...f]}return{...k(a),transport:"stdio",command:e,args:c,env:h,rootPath:"."}}(a,b.pkg):function(a,b){let c={};for(let a of b.headers??[])a.name&&(c[a.name]=a.value??a.default??"");let d=k(a);return{...d,transport:"sse"===b.type?"sse":"streamable",serverUrl:b.url,headers:c,rootPath:`mcp-servers/${d.name}`}}(a,b.remote),e="package"===b.kind?b.pkg.version??a.version:a.version,f={type:"registry",registryName:a.name,...e?{version:e}:{}};return{...c,source:f}}function n(a){return"active"===a}function o(a){let b=a?._meta?.["io.modelcontextprotocol.registry/official"]?.status;return"string"==typeof b&&b.length>0?b:"unverified"}function p(a,b,c,d){let e=m(b,c),f=e.transport??"stdio";return{registryName:a,resolvedName:b.name,serverName:e.name??h(b.name),transport:f,...e.command?{command:e.command}:{},...Array.isArray(e.args)?{args:e.args}:{},...e.serverUrl?{serverUrl:e.serverUrl}:{},requiredEnvNames:"package"===c.kind?(c.pkg.environmentVariables??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name):(c.remote.headers??[]).filter(a=>a.isRequired&&a.name).map(a=>a.name),verificationStatus:d}}function q(a){let b;try{b=new URL(a)}catch{return null}let c=b.searchParams.get("q");if(c)return`/v0.1/servers?search=${encodeURIComponent(c)}&version=latest&limit=1`;if(/^\/v[\d.]+\/servers\/[^/]+\/versions\/[^/]+$/.test(b.pathname))return b.pathname;let d=b.pathname.match(/^\/v[\d.]+\/servers\/([^/]+)(?:\/versions)?\/?$/);if(d){let a=decodeURIComponent(d[1]);return`/v0.1/servers?search=${encodeURIComponent(a)}&version=latest&limit=1`}return null}function r(a){return a?.servers&&a.servers.length>0?a.servers[0]:a?.server?.name?a:null}function s(a,b){if(!b||0===Object.keys(b).length)return a;let c={...a.env??{}};for(let[a,d]of Object.entries(b)){let b=c[a];b&&"object"==typeof b&&b.metadata?.isSecret?c[a]={value:d,metadata:{isSecret:!0}}:c[a]=d}return{...a,env:c}}function t(a,b){return"package"===a.kind?(a.pkg.environmentVariables??[]).filter(a=>a.isRequired&&!(a.value??a.default)&&!b?.[a.name]).map(a=>a.name):(a.remote.headers??[]).filter(a=>a.isRequired&&!(a.value??a.default)).map(a=>a.name)}}};