flujo-ai 3.33.0 → 3.35.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 (549) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +292 -285
  3. package/.next/app-path-routes-manifest.json +20 -19
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +21 -21
  6. package/.next/react-loadable-manifest.json +3 -3
  7. package/.next/routes-manifest.json +9 -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 +1 -1
  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_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/encryption/secure/route.js +1 -1
  26. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  27. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/env/route.js +2 -2
  29. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  31. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
  35. package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/flow/compile/route.js +1 -1
  37. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  38. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/flow/generate/route.js +1 -1
  40. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  41. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/flow/generator/route.js +25 -4
  43. package/.next/server/app/api/flow/generator/route.js.nft.json +1 -1
  44. package/.next/server/app/api/flow/generator/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/flow/improve/route.js +1 -1
  46. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  47. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  49. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  50. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  52. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/flow/repair/route.js +1 -1
  54. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  55. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  57. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/init/route.js +1 -1
  60. package/.next/server/app/api/init/route.js.nft.json +1 -1
  61. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/app-sandbox/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  67. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  72. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  74. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  80. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  82. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  84. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  86. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  88. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  90. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  92. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/mcp-registry/route.js +1 -1
  94. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  95. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  97. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  99. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/model/provider/route.js +1 -1
  101. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  102. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/model/route.js.nft.json +1 -1
  104. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/model/test/route.js +1 -1
  106. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  107. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/oauth/callback/route.js +1 -1
  109. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/oauth/initiate/route.js +1 -1
  111. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/oauth/reset/route.js +1 -1
  113. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  114. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/packages/build/route.js +1 -1
  116. package/.next/server/app/api/packages/build/route.js.nft.json +1 -1
  117. package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
  119. package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
  121. package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
  123. package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
  125. package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/packages/resolve/route.js +1 -1
  127. package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
  128. package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
  130. package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/packages/search/route.js +1 -1
  132. package/.next/server/app/api/packages/search/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
  134. package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
  136. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  137. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
  139. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  140. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
  142. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  143. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
  146. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  147. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/planned-executions/route.js +1 -1
  149. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  150. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/registry/feedback/route.js +1 -1
  155. package/.next/server/app/api/registry/feedback/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/registry/packages/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/restore/route.js +1 -1
  162. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  163. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/runs/active/route.js +1 -1
  165. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  166. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/storage/route.js +1 -1
  168. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
  170. package/.next/server/app/api/telemetry/daily-active/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/update/route.js +1 -1
  172. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/waves/route.js +1 -1
  174. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  175. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  177. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  178. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/chat/page.js +2 -2
  180. package/.next/server/app/chat/page.js.nft.json +1 -1
  181. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/chat.html +1 -1
  183. package/.next/server/app/chat.rsc +3 -3
  184. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  185. package/.next/server/app/docs.html +1 -1
  186. package/.next/server/app/docs.rsc +2 -2
  187. package/.next/server/app/executions/page.js +2 -2
  188. package/.next/server/app/executions/page.js.nft.json +1 -1
  189. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/executions.html +1 -1
  191. package/.next/server/app/executions.rsc +3 -3
  192. package/.next/server/app/flows/page.js +3 -3
  193. package/.next/server/app/flows/page.js.nft.json +1 -1
  194. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  195. package/.next/server/app/flows.html +1 -1
  196. package/.next/server/app/flows.rsc +3 -3
  197. package/.next/server/app/index.html +1 -1
  198. package/.next/server/app/index.rsc +3 -3
  199. package/.next/server/app/mcp/page.js +1 -1
  200. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  201. package/.next/server/app/mcp-flows/route.js +1 -1
  202. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  203. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  205. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  206. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/mcp.html +1 -1
  208. package/.next/server/app/mcp.rsc +3 -3
  209. package/.next/server/app/models/page.js +1 -1
  210. package/.next/server/app/models/page.js.nft.json +1 -1
  211. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  212. package/.next/server/app/packages/page.js +1 -1
  213. package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
  214. package/.next/server/app/packages.html +1 -1
  215. package/.next/server/app/packages.rsc +3 -3
  216. package/.next/server/app/page.js +4 -2
  217. package/.next/server/app/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/settings/page.js +1 -1
  219. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  220. package/.next/server/app/settings.html +1 -1
  221. package/.next/server/app/settings.rsc +3 -3
  222. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  223. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  225. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  226. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  228. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  229. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  231. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  232. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  234. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  235. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  237. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  238. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  240. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  241. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js +1 -1
  243. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -1
  244. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js +1 -0
  246. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js.nft.json +1 -0
  247. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route_client-reference-manifest.js +1 -0
  248. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
  249. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  251. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  252. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  254. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  255. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  257. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  258. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/v1/chat/events/route.js +1 -1
  260. package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
  261. package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/v1/models/route.js +1 -1
  263. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  264. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  266. package/.next/server/app/waves.html +1 -1
  267. package/.next/server/app/waves.rsc +2 -2
  268. package/.next/server/app-paths-manifest.json +20 -19
  269. package/.next/server/chunks/1114.js +1 -1
  270. package/.next/server/chunks/1226.js +1 -1
  271. package/.next/server/chunks/1227.js +1 -1
  272. package/.next/server/chunks/166.js +5 -5
  273. package/.next/server/chunks/1664.js +1 -1
  274. package/.next/server/chunks/1805.js +1 -1
  275. package/.next/server/chunks/227.js +1 -1
  276. package/.next/server/chunks/2273.js +2 -2
  277. package/.next/server/chunks/2372.js +1 -1
  278. package/.next/server/chunks/2859.js +1 -1
  279. package/.next/server/chunks/3717.js +1 -0
  280. package/.next/server/chunks/3935.js +4 -0
  281. package/.next/server/chunks/4265.js +1 -1
  282. package/.next/server/chunks/4466.js +1 -1
  283. package/.next/server/chunks/4551.js +1 -1
  284. package/.next/server/chunks/4771.js +2 -2
  285. package/.next/server/chunks/4822.js +1 -1
  286. package/.next/server/chunks/5096.js +1 -1
  287. package/.next/server/chunks/519.js +2 -0
  288. package/.next/server/chunks/5285.js +1 -0
  289. package/.next/server/chunks/5309.js +78 -0
  290. package/.next/server/chunks/544.js +16 -16
  291. package/.next/server/chunks/5463.js +1 -1
  292. package/.next/server/chunks/5544.js +4 -4
  293. package/.next/server/chunks/5703.js +2 -2
  294. package/.next/server/chunks/{5708.js → 6041.js} +1 -1
  295. package/.next/server/chunks/6226.js +1 -1
  296. package/.next/server/chunks/6747.js +72 -43
  297. package/.next/server/chunks/701.js +1 -1
  298. package/.next/server/chunks/7069.js +4 -4
  299. package/.next/server/chunks/7506.js +1 -1
  300. package/.next/server/chunks/7628.js +1 -1
  301. package/.next/server/chunks/7630.js +11 -0
  302. package/.next/server/chunks/7891.js +1 -1
  303. package/.next/server/chunks/7993.js +1 -1
  304. package/.next/server/chunks/8284.js +42 -0
  305. package/.next/server/chunks/8387.js +1 -1
  306. package/.next/server/chunks/8645.js +1 -1
  307. package/.next/server/chunks/8739.js +1 -1
  308. package/.next/server/chunks/9085.js +1 -1
  309. package/.next/server/chunks/9235.js +26 -5
  310. package/.next/server/chunks/9285.js +1 -1
  311. package/.next/server/functions-config-manifest.json +1 -1
  312. package/.next/server/instrumentation.js.nft.json +1 -1
  313. package/.next/server/middleware-build-manifest.js +1 -1
  314. package/.next/server/middleware-manifest.json +1 -1
  315. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  316. package/.next/server/pages/404.html +1 -1
  317. package/.next/server/pages/500.html +1 -1
  318. package/.next/server/server-reference-manifest.js +1 -1
  319. package/.next/server/server-reference-manifest.json +1 -1
  320. package/.next/static/chunks/2005.4eea65c00d9a29cd.js +1 -0
  321. package/.next/static/chunks/3429-34fb1a84aed96703.js +1 -0
  322. package/.next/static/chunks/{2005-f9d38c39f10c321f.js → 4386-e9621d3c94969a68.js} +1 -1
  323. package/.next/static/chunks/4919-6c8a48e3cc642349.js +1 -0
  324. package/.next/static/chunks/7561-2b366ddcbc3cc0ec.js +1 -0
  325. package/.next/static/chunks/8404-5aa8ea49197b98b8.js +1 -0
  326. package/.next/static/chunks/{8650-41c2afc0eba37fb8.js → 8650-aa22dbf7b37348f0.js} +1 -1
  327. package/.next/static/chunks/9611-9867e6e8e65172ec.js +1 -0
  328. package/.next/static/chunks/app/api/approvals/[id]/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  329. package/.next/static/chunks/app/api/approvals/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  330. package/.next/static/chunks/app/api/backup/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  331. package/.next/static/chunks/app/api/browse/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  332. package/.next/static/chunks/app/api/bugs/enhance/route-b9c783850b4c2acf.js +1 -0
  333. package/.next/static/chunks/app/api/cwd/route-b9c783850b4c2acf.js +1 -0
  334. package/.next/static/chunks/app/api/encryption/secure/route-b9c783850b4c2acf.js +1 -0
  335. package/.next/static/chunks/app/api/env/route-b9c783850b4c2acf.js +1 -0
  336. package/.next/static/chunks/app/api/flow/[id]/route-b9c783850b4c2acf.js +1 -0
  337. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-b9c783850b4c2acf.js +1 -0
  338. package/.next/static/chunks/app/api/flow/[id]/versions/route-b9c783850b4c2acf.js +1 -0
  339. package/.next/static/chunks/app/api/flow/compile/route-b9c783850b4c2acf.js +1 -0
  340. package/.next/static/chunks/app/api/flow/generate/route-b9c783850b4c2acf.js +1 -0
  341. package/.next/static/chunks/app/api/flow/generator/route-b9c783850b4c2acf.js +1 -0
  342. package/.next/static/chunks/app/api/flow/improve/route-b9c783850b4c2acf.js +1 -0
  343. package/.next/static/chunks/app/api/flow/prompt-renderer/route-b9c783850b4c2acf.js +1 -0
  344. package/.next/static/chunks/app/api/flow/quick-chat/route-b9c783850b4c2acf.js +1 -0
  345. package/.next/static/chunks/app/api/flow/repair/route-b9c783850b4c2acf.js +1 -0
  346. package/.next/static/chunks/app/api/flow/route-b9c783850b4c2acf.js +1 -0
  347. package/.next/static/chunks/app/api/git/route-b9c783850b4c2acf.js +1 -0
  348. package/.next/static/chunks/app/api/init/route-b9c783850b4c2acf.js +1 -0
  349. package/.next/static/chunks/app/api/local-models/capability/route-b9c783850b4c2acf.js +1 -0
  350. package/.next/static/chunks/app/api/local-models/pull/route-b9c783850b4c2acf.js +1 -0
  351. package/.next/static/chunks/app/api/local-models/suggest/route-b9c783850b4c2acf.js +1 -0
  352. package/.next/static/chunks/app/api/mcp/app-sandbox/route-b9c783850b4c2acf.js +1 -0
  353. package/.next/static/chunks/app/api/mcp/cancel/route-b9c783850b4c2acf.js +1 -0
  354. package/.next/static/chunks/app/api/mcp/oauth-capability/route-b9c783850b4c2acf.js +1 -0
  355. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b9c783850b4c2acf.js +1 -0
  356. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b9c783850b4c2acf.js +1 -0
  357. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b9c783850b4c2acf.js +1 -0
  358. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b9c783850b4c2acf.js +1 -0
  359. package/.next/static/chunks/app/api/mcp/servers/[name]/route-b9c783850b4c2acf.js +1 -0
  360. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b9c783850b4c2acf.js +1 -0
  361. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b9c783850b4c2acf.js +1 -0
  362. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b9c783850b4c2acf.js +1 -0
  363. package/.next/static/chunks/app/api/mcp/servers/route-b9c783850b4c2acf.js +1 -0
  364. package/.next/static/chunks/app/api/mcp/test-connection/route-b9c783850b4c2acf.js +1 -0
  365. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b9c783850b4c2acf.js +1 -0
  366. package/.next/static/chunks/app/api/mcp-registry/route-b9c783850b4c2acf.js +1 -0
  367. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b9c783850b4c2acf.js +1 -0
  368. package/.next/static/chunks/app/api/model/[id]/route-b9c783850b4c2acf.js +1 -0
  369. package/.next/static/chunks/app/api/model/provider/route-b9c783850b4c2acf.js +1 -0
  370. package/.next/static/chunks/app/api/model/route-b9c783850b4c2acf.js +1 -0
  371. package/.next/static/chunks/app/api/model/test/route-b9c783850b4c2acf.js +1 -0
  372. package/.next/static/chunks/app/api/oauth/callback/route-b9c783850b4c2acf.js +1 -0
  373. package/.next/static/chunks/app/api/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
  374. package/.next/static/chunks/app/api/oauth/reset/route-b9c783850b4c2acf.js +1 -0
  375. package/.next/static/chunks/app/api/packages/build/route-b9c783850b4c2acf.js +1 -0
  376. package/.next/static/chunks/app/api/packages/derive-secrets/route-b9c783850b4c2acf.js +1 -0
  377. package/.next/static/chunks/app/api/packages/install/route-b9c783850b4c2acf.js +1 -0
  378. package/.next/static/chunks/app/api/packages/install/status/route-b9c783850b4c2acf.js +1 -0
  379. package/.next/static/chunks/app/api/packages/installed/route-b9c783850b4c2acf.js +1 -0
  380. package/.next/static/chunks/app/api/packages/resolve/route-b9c783850b4c2acf.js +1 -0
  381. package/.next/static/chunks/app/api/packages/scan-targets/route-b9c783850b4c2acf.js +1 -0
  382. package/.next/static/chunks/app/api/packages/search/route-b9c783850b4c2acf.js +1 -0
  383. package/.next/static/chunks/app/api/packages/uninstall/route-b9c783850b4c2acf.js +1 -0
  384. package/.next/static/chunks/app/api/planned-executions/[id]/route-b9c783850b4c2acf.js +1 -0
  385. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b9c783850b4c2acf.js +1 -0
  386. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b9c783850b4c2acf.js +1 -0
  387. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b9c783850b4c2acf.js +1 -0
  388. package/.next/static/chunks/app/api/planned-executions/reconcile/route-b9c783850b4c2acf.js +1 -0
  389. package/.next/static/chunks/app/api/planned-executions/route-b9c783850b4c2acf.js +1 -0
  390. package/.next/static/chunks/app/api/registry/auth/resend/route-b9c783850b4c2acf.js +1 -0
  391. package/.next/static/chunks/app/api/registry/auth/reset/route-b9c783850b4c2acf.js +1 -0
  392. package/.next/static/chunks/app/api/registry/auth/route-b9c783850b4c2acf.js +1 -0
  393. package/.next/static/chunks/app/api/registry/feedback/route-b9c783850b4c2acf.js +1 -0
  394. package/.next/static/chunks/app/api/registry/oauth/callback/route-b9c783850b4c2acf.js +1 -0
  395. package/.next/static/chunks/app/api/registry/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
  396. package/.next/static/chunks/app/api/registry/packages/route-b9c783850b4c2acf.js +1 -0
  397. package/.next/static/chunks/app/api/registry/publish/route-b9c783850b4c2acf.js +1 -0
  398. package/.next/static/chunks/app/api/registry/settings/route-b9c783850b4c2acf.js +1 -0
  399. package/.next/static/chunks/app/api/restore/route-b9c783850b4c2acf.js +1 -0
  400. package/.next/static/chunks/app/api/runs/active/route-b9c783850b4c2acf.js +1 -0
  401. package/.next/static/chunks/app/api/storage/route-b9c783850b4c2acf.js +1 -0
  402. package/.next/static/chunks/app/api/telemetry/daily-active/route-b9c783850b4c2acf.js +1 -0
  403. package/.next/static/chunks/app/api/update/route-b9c783850b4c2acf.js +1 -0
  404. package/.next/static/chunks/app/api/waves/route-b9c783850b4c2acf.js +1 -0
  405. package/.next/static/chunks/app/api/webhooks/[id]/route-b9c783850b4c2acf.js +1 -0
  406. package/.next/static/chunks/app/chat/{page-1d100e5d974c919e.js → page-e37bbc561f40ce60.js} +1 -1
  407. package/.next/static/chunks/app/executions/page-8296fd69c439ccee.js +1 -0
  408. package/.next/static/chunks/app/flows/page-e52c8943555e38dd.js +1 -0
  409. package/.next/static/chunks/app/{layout-38b88f3b057f4852.js → layout-abed1f211e03152f.js} +1 -1
  410. package/.next/static/chunks/app/mcp/page-1648e6fde0c41461.js +1 -0
  411. package/.next/static/chunks/app/mcp-flows/route-b9c783850b4c2acf.js +1 -0
  412. package/.next/static/chunks/app/mcp-proxy/[server]/route-b9c783850b4c2acf.js +1 -0
  413. package/.next/static/chunks/app/models/page-595597042e227970.js +1 -0
  414. package/.next/static/chunks/app/packages/page-f1a22789a6c0e0b6.js +1 -0
  415. package/.next/static/chunks/app/page-2f9da78a4891731a.js +1 -0
  416. package/.next/static/chunks/app/settings/page-f35e939032b0277d.js +1 -0
  417. package/.next/static/chunks/app/v1/chat/completions/route-b9c783850b4c2acf.js +1 -0
  418. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b9c783850b4c2acf.js +1 -0
  419. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b9c783850b4c2acf.js +1 -0
  420. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b9c783850b4c2acf.js +1 -0
  421. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b9c783850b4c2acf.js +1 -0
  422. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b9c783850b4c2acf.js +1 -0
  423. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b9c783850b4c2acf.js +1 -0
  424. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-b9c783850b4c2acf.js +1 -0
  425. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route-b9c783850b4c2acf.js +1 -0
  426. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b9c783850b4c2acf.js +1 -0
  427. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b9c783850b4c2acf.js +1 -0
  428. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b9c783850b4c2acf.js +1 -0
  429. package/.next/static/chunks/app/v1/chat/conversations/route-b9c783850b4c2acf.js +1 -0
  430. package/.next/static/chunks/app/v1/chat/events/route-b9c783850b4c2acf.js +1 -0
  431. package/.next/static/chunks/app/v1/models/route-b9c783850b4c2acf.js +1 -0
  432. package/.next/static/chunks/{webpack-dccb4f149ebdedcc.js → webpack-9d09d53b271f49e2.js} +1 -1
  433. package/.next/trace +10 -10
  434. package/.next/types/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.ts +347 -0
  435. package/.next/types/routes.d.ts +2 -1
  436. package/.next/types/validator.ts +9 -0
  437. package/README.md +47 -47
  438. package/package.json +5 -5
  439. package/.next/server/chunks/2985.js +0 -1
  440. package/.next/server/chunks/4308.js +0 -4
  441. package/.next/server/chunks/4366.js +0 -2
  442. package/.next/server/chunks/5040.js +0 -48
  443. package/.next/server/chunks/8187.js +0 -78
  444. package/.next/server/chunks/8851.js +0 -1
  445. package/.next/static/chunks/289-98f50bfcf833d661.js +0 -1
  446. package/.next/static/chunks/3089.df88f3b16898aad7.js +0 -1
  447. package/.next/static/chunks/6733-c9029143901e62e9.js +0 -1
  448. package/.next/static/chunks/8041-05830e887c133085.js +0 -1
  449. package/.next/static/chunks/8404-bfa9203e4296f3fb.js +0 -1
  450. package/.next/static/chunks/95-b9691d3cb15556dc.js +0 -1
  451. package/.next/static/chunks/app/api/bugs/enhance/route-9ea2990be4b67136.js +0 -1
  452. package/.next/static/chunks/app/api/cwd/route-9ea2990be4b67136.js +0 -1
  453. package/.next/static/chunks/app/api/encryption/secure/route-9ea2990be4b67136.js +0 -1
  454. package/.next/static/chunks/app/api/env/route-9ea2990be4b67136.js +0 -1
  455. package/.next/static/chunks/app/api/flow/[id]/route-9ea2990be4b67136.js +0 -1
  456. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-9ea2990be4b67136.js +0 -1
  457. package/.next/static/chunks/app/api/flow/[id]/versions/route-9ea2990be4b67136.js +0 -1
  458. package/.next/static/chunks/app/api/flow/compile/route-9ea2990be4b67136.js +0 -1
  459. package/.next/static/chunks/app/api/flow/generate/route-9ea2990be4b67136.js +0 -1
  460. package/.next/static/chunks/app/api/flow/generator/route-9ea2990be4b67136.js +0 -1
  461. package/.next/static/chunks/app/api/flow/improve/route-9ea2990be4b67136.js +0 -1
  462. package/.next/static/chunks/app/api/flow/prompt-renderer/route-9ea2990be4b67136.js +0 -1
  463. package/.next/static/chunks/app/api/flow/quick-chat/route-9ea2990be4b67136.js +0 -1
  464. package/.next/static/chunks/app/api/flow/repair/route-9ea2990be4b67136.js +0 -1
  465. package/.next/static/chunks/app/api/flow/route-9ea2990be4b67136.js +0 -1
  466. package/.next/static/chunks/app/api/git/route-9ea2990be4b67136.js +0 -1
  467. package/.next/static/chunks/app/api/init/route-9ea2990be4b67136.js +0 -1
  468. package/.next/static/chunks/app/api/local-models/capability/route-9ea2990be4b67136.js +0 -1
  469. package/.next/static/chunks/app/api/local-models/pull/route-9ea2990be4b67136.js +0 -1
  470. package/.next/static/chunks/app/api/local-models/suggest/route-9ea2990be4b67136.js +0 -1
  471. package/.next/static/chunks/app/api/mcp/app-sandbox/route-9ea2990be4b67136.js +0 -1
  472. package/.next/static/chunks/app/api/mcp/cancel/route-9ea2990be4b67136.js +0 -1
  473. package/.next/static/chunks/app/api/mcp/oauth-capability/route-9ea2990be4b67136.js +0 -1
  474. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-9ea2990be4b67136.js +0 -1
  475. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-9ea2990be4b67136.js +0 -1
  476. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-9ea2990be4b67136.js +0 -1
  477. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-9ea2990be4b67136.js +0 -1
  478. package/.next/static/chunks/app/api/mcp/servers/[name]/route-9ea2990be4b67136.js +0 -1
  479. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-9ea2990be4b67136.js +0 -1
  480. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-9ea2990be4b67136.js +0 -1
  481. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-9ea2990be4b67136.js +0 -1
  482. package/.next/static/chunks/app/api/mcp/servers/route-9ea2990be4b67136.js +0 -1
  483. package/.next/static/chunks/app/api/mcp/test-connection/route-9ea2990be4b67136.js +0 -1
  484. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-9ea2990be4b67136.js +0 -1
  485. package/.next/static/chunks/app/api/mcp-registry/route-9ea2990be4b67136.js +0 -1
  486. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-9ea2990be4b67136.js +0 -1
  487. package/.next/static/chunks/app/api/model/[id]/route-9ea2990be4b67136.js +0 -1
  488. package/.next/static/chunks/app/api/model/provider/route-9ea2990be4b67136.js +0 -1
  489. package/.next/static/chunks/app/api/model/route-9ea2990be4b67136.js +0 -1
  490. package/.next/static/chunks/app/api/model/test/route-9ea2990be4b67136.js +0 -1
  491. package/.next/static/chunks/app/api/oauth/callback/route-9ea2990be4b67136.js +0 -1
  492. package/.next/static/chunks/app/api/oauth/initiate/route-9ea2990be4b67136.js +0 -1
  493. package/.next/static/chunks/app/api/oauth/reset/route-9ea2990be4b67136.js +0 -1
  494. package/.next/static/chunks/app/api/packages/build/route-9ea2990be4b67136.js +0 -1
  495. package/.next/static/chunks/app/api/packages/derive-secrets/route-9ea2990be4b67136.js +0 -1
  496. package/.next/static/chunks/app/api/packages/install/route-9ea2990be4b67136.js +0 -1
  497. package/.next/static/chunks/app/api/packages/install/status/route-9ea2990be4b67136.js +0 -1
  498. package/.next/static/chunks/app/api/packages/installed/route-9ea2990be4b67136.js +0 -1
  499. package/.next/static/chunks/app/api/packages/resolve/route-9ea2990be4b67136.js +0 -1
  500. package/.next/static/chunks/app/api/packages/scan-targets/route-9ea2990be4b67136.js +0 -1
  501. package/.next/static/chunks/app/api/packages/search/route-9ea2990be4b67136.js +0 -1
  502. package/.next/static/chunks/app/api/packages/uninstall/route-9ea2990be4b67136.js +0 -1
  503. package/.next/static/chunks/app/api/planned-executions/[id]/route-9ea2990be4b67136.js +0 -1
  504. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-9ea2990be4b67136.js +0 -1
  505. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-9ea2990be4b67136.js +0 -1
  506. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-9ea2990be4b67136.js +0 -1
  507. package/.next/static/chunks/app/api/planned-executions/reconcile/route-9ea2990be4b67136.js +0 -1
  508. package/.next/static/chunks/app/api/planned-executions/route-9ea2990be4b67136.js +0 -1
  509. package/.next/static/chunks/app/api/registry/auth/resend/route-9ea2990be4b67136.js +0 -1
  510. package/.next/static/chunks/app/api/registry/auth/reset/route-9ea2990be4b67136.js +0 -1
  511. package/.next/static/chunks/app/api/registry/auth/route-9ea2990be4b67136.js +0 -1
  512. package/.next/static/chunks/app/api/registry/feedback/route-9ea2990be4b67136.js +0 -1
  513. package/.next/static/chunks/app/api/registry/oauth/callback/route-9ea2990be4b67136.js +0 -1
  514. package/.next/static/chunks/app/api/registry/oauth/initiate/route-9ea2990be4b67136.js +0 -1
  515. package/.next/static/chunks/app/api/registry/packages/route-9ea2990be4b67136.js +0 -1
  516. package/.next/static/chunks/app/api/registry/publish/route-9ea2990be4b67136.js +0 -1
  517. package/.next/static/chunks/app/api/registry/settings/route-9ea2990be4b67136.js +0 -1
  518. package/.next/static/chunks/app/api/restore/route-9ea2990be4b67136.js +0 -1
  519. package/.next/static/chunks/app/api/runs/active/route-9ea2990be4b67136.js +0 -1
  520. package/.next/static/chunks/app/api/storage/route-9ea2990be4b67136.js +0 -1
  521. package/.next/static/chunks/app/api/telemetry/daily-active/route-9ea2990be4b67136.js +0 -1
  522. package/.next/static/chunks/app/api/update/route-9ea2990be4b67136.js +0 -1
  523. package/.next/static/chunks/app/api/waves/route-9ea2990be4b67136.js +0 -1
  524. package/.next/static/chunks/app/api/webhooks/[id]/route-9ea2990be4b67136.js +0 -1
  525. package/.next/static/chunks/app/executions/page-10ec7d58c7fbdd6f.js +0 -1
  526. package/.next/static/chunks/app/flows/page-9a78a2915268b2f8.js +0 -1
  527. package/.next/static/chunks/app/mcp/page-56b43b2f8752e9a5.js +0 -1
  528. package/.next/static/chunks/app/mcp-flows/route-9ea2990be4b67136.js +0 -1
  529. package/.next/static/chunks/app/mcp-proxy/[server]/route-9ea2990be4b67136.js +0 -1
  530. package/.next/static/chunks/app/models/page-808c0568ebc5e2c7.js +0 -1
  531. package/.next/static/chunks/app/packages/page-af6ec89522915206.js +0 -1
  532. package/.next/static/chunks/app/page-30bf4293efa47a47.js +0 -1
  533. package/.next/static/chunks/app/settings/page-59ae1b658838f0bc.js +0 -1
  534. package/.next/static/chunks/app/v1/chat/completions/route-9ea2990be4b67136.js +0 -1
  535. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-9ea2990be4b67136.js +0 -1
  536. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-9ea2990be4b67136.js +0 -1
  537. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-9ea2990be4b67136.js +0 -1
  538. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-9ea2990be4b67136.js +0 -1
  539. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-9ea2990be4b67136.js +0 -1
  540. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-9ea2990be4b67136.js +0 -1
  541. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-9ea2990be4b67136.js +0 -1
  542. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-9ea2990be4b67136.js +0 -1
  543. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-9ea2990be4b67136.js +0 -1
  544. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-9ea2990be4b67136.js +0 -1
  545. package/.next/static/chunks/app/v1/chat/conversations/route-9ea2990be4b67136.js +0 -1
  546. package/.next/static/chunks/app/v1/chat/events/route-9ea2990be4b67136.js +0 -1
  547. package/.next/static/chunks/app/v1/models/route-9ea2990be4b67136.js +0 -1
  548. /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → hbjnLG9RCje2AApS9TzP8}/_buildManifest.js +0 -0
  549. /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → hbjnLG9RCje2AApS9TzP8}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=1226,exports.ids=[1226],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>h,FH:()=>w,Zn:()=>x,dM:()=>v,lk:()=>i,pX:()=>u});var d=c(32524),e=c(49181),f=c(67512),g=c(89224);let h=3,i=8;function j(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let k={type:"arrowclosed",width:20,height:20,color:"#1976d2"},l={stroke:"#1976d2",strokeWidth:2},m={type:"arrowclosed",width:20,height:20,color:"#009688"},n={stroke:"#009688",strokeWidth:2},o=new Set(["full-history","latest-message","isolated"]),p=new Set(["steps","final-only"]),q=new Set(["full-conversation","latest-message"]);function r(a,b={}){let{keepPills:c=!1,wiredServers:d=new Set,validHandoffNames:f=new Set}=b,g=(0,e.A$)(a);if(0===g.length)return{text:a,stripped:!1,unresolved:[]};let h="",i=0,j=!1,k=[];for(let b of g){h+=a.slice(i,b.index),i=b.index+b.fullMatch.length;let e=!1;c&&(e="handoff"===b.server?f.has(b.name):d.has(b.server)),e?h+=b.fullMatch:(h+=b.name,j=!0,c&&k.push(b.fullMatch))}return{text:h+=a.slice(i),stripped:j,unresolved:k}}function s(a,b,c){let d=b.filter(b=>b.from===a).map(a=>c.get(a.to)).filter(Boolean).map(a=>({id:a.key??"",label:a.label,type:a.type}));return new Set((0,g.E9)(d).values())}function t(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function u(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function v(a,b={},c={}){let e=[],g=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),w=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),x=b.models??[],y=new Set((b.servers??[]).map(a=>a.name)),z=b.serverTools??{},A=j(c.maxDepth,0,h,h),B=j(c.maxFlows,1,i,i),C=[],D=[...(b.flows??[]).map(a=>a.name)],E=[],F=0;var G=function a(e,h,i){let v=Array.isArray(e?.nodes)?e.nodes:[],G=Array.isArray(e?.edges)?e.edges:[],H=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,D);D.push(H),F++;let I=(0,d.A)(),J=[...i,H],L=new Map,M=[],N=[],O=new Map(v.filter(a=>a?.key&&"string"==typeof a.key).map(a=>[a.key,a]));for(let e of v){let f=e?.key;if(!f||"string"!=typeof f){g("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(L.has(f)){g("node-duplicate-key",`Duplicate node key "${f}" — keys must be unique; the later node was dropped.`,f);continue}let i=e.type;if("mcp"===i){g("mcp-node-not-allowed",`Node "${f}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,f);continue}if("start"!==i&&"process"!==i&&"finish"!==i&&"subflow"!==i&&"resource"!==i&&"signal"!==i){g("unknown-node-type",`Node "${f}" has unknown type "${String(i)}".`,f);continue}let k={},l="string"==typeof e.prompt?e.prompt:void 0;if("start"===i){let{text:a,stripped:b,unresolved:d}=r(l??"",c.keepPills?{keepPills:!0,wiredServers:new Set((e.servers??[]).map(a=>a.name)),validHandoffNames:s(f,G,O)}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);k.promptTemplate=a}else if("process"===i){let{text:a,stripped:b,unresolved:d}=r(l??"",c.keepPills?{keepPills:!0,wiredServers:new Set((e.servers??[]).map(a=>a.name)),validHandoffNames:s(f,G,O)}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);if(k.promptTemplate=a,e.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(e.model,x);a?k.boundModel=a:(k.boundModel=e.model,w("model-unresolved",`Node "${f}": model "${e.model}" does not match any configured model (by id, display name, or name).`,f))}void 0!==e.inputMode&&(o.has(e.inputMode)?(k.inputMode=e.inputMode,"isolated"===e.inputMode&&"string"==typeof e.isolatedPrompt&&(k.isolatedPrompt=e.isolatedPrompt)):w("invalid-input-mode",`Node "${f}": inputMode "${String(e.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,f)),"boolean"==typeof e.allowCallerPrompt&&(k.allowCallerPrompt=e.allowCallerPrompt),void 0!==e.outputMode&&(q.has(e.outputMode)?k.outputMode=e.outputMode:w("invalid-output-mode",`Node "${f}": outputMode "${String(e.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,f)),void 0!==e.maxTurns&&("number"!=typeof e.maxTurns||Number.isNaN(e.maxTurns)?w("invalid-max-turns",`Node "${f}": maxTurns "${String(e.maxTurns)}" is not a number; omitted.`,f):k.maxTurns=j(e.maxTurns,1,1e3,1)),"boolean"==typeof e.excludeModelPrompt&&(k.excludeModelPrompt=e.excludeModelPrompt),"boolean"==typeof e.excludeStartNodePrompt&&(k.excludeStartNodePrompt=e.excludeStartNodePrompt),"boolean"==typeof e.excludeSystemPrompt&&(k.excludeSystemPrompt=e.excludeSystemPrompt),Array.isArray(e.allowedTools)&&(k.allowedTools=e.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof e.captureVariable&&e.captureVariable.trim()&&(k.captureVariable=e.captureVariable.trim()),"string"==typeof e.captureResource&&e.captureResource.trim()&&w("process-capture-resource-unsupported",`Node "${f}": process captureResource is not supported; connect the process to a Resource node so it can call write_resource.`,f),"string"==typeof e.captureKv&&e.captureKv.trim()&&(k.captureKv=e.captureKv.trim())}else if("subflow"===i){if(function(c,d,e,f,h){let i=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,j=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0,k="string"==typeof c.parallelFlowsVariable?c.parallelFlowsVariable.trim():"";if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,i?"parallelFlows":null,j?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&w("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(i||j)&&g("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(h.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?h.itemSplit=c.itemSplit:w("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(h.sequential=!0),K(c,h)):g("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}let l=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];if(l.length>0){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;i||j?g("subflow-spawn-and-parallel",`Node "${d}": "spawnBriefs" runs a SINGLE child once per brief and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d):!0===c.mapOverList?g("subflow-spawn-and-map",`Node "${d}": "spawnBriefs" cannot be combined with "mapOverList"; use one lane source or the other.`,d):a?(h.spawnBriefs=l,K(c,h)):g("subflow-spawn-no-child",`Node "${d}": "spawnBriefs" needs a single child ("flow" or "subflowSpec") to spawn once per brief.`,d)}if(k&&(!0===c.mapOverList?g("subflow-map-and-parallel-var",`Node "${d}": "parallelFlowsVariable" (dynamic fan-out) cannot be combined with "mapOverList".`,d):h.parallelSubflowIdsVar=k),c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return g("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=t(c.flow,[...b.flows??[],...E]);return a?h.subflowId=a:g("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>A)return g("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${A} level(s); this inline subflow was not compiled.`,d);if(F>=B)return g("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${B} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?h.subflowId=b.id:g("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(i){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){g("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){g("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=t(e,[...b.flows??[],...E]);c?a.includes(c)||a.push(c):g("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(h.parallelSubflowIds=a,K(c,h)):g("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(j){let b=[];for(let h of c.parallelSubflowSpecs){if(!h||"object"!=typeof h){g("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>A){g("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${A} level(s); a parallel inline subflow was not compiled.`,d);continue}if(F>=B){g("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${B} flows in one bundle; it was not compiled.`,d);continue}let c=a(h,e+1,f);c?b.push(c.id):g("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(h.parallelSubflowIds=b,K(c,h)):g("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}k&&h.parallelSubflowIdsVar?K(c,h):void 0!==c.generateSubflow&&null!==c.generateSubflow?g("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d):g("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(e,f,h,J,k),void 0!==e.inputMode&&(o.has(e.inputMode)?k.inputMode=e.inputMode:w("invalid-input-mode",`Node "${f}": inputMode "${String(e.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,f)),void 0!==e.outputMode&&(p.has(e.outputMode)?k.outputMode=e.outputMode:w("invalid-output-mode",`Node "${f}": outputMode "${String(e.outputMode)}" is not valid (steps | final-only); omitted.`,f)),void 0!==l){let{text:a,stripped:b,unresolved:d}=r(l,c.keepPills?{keepPills:!0}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);k.promptTemplate=a}"boolean"==typeof e.allowCallerPrompt&&(k.allowCallerPrompt=e.allowCallerPrompt),"boolean"==typeof e.allowCallerFanout&&(k.allowCallerFanout=e.allowCallerFanout),"string"==typeof e.captureVariable&&e.captureVariable.trim()&&(k.captureVariable=e.captureVariable.trim()),"string"==typeof e.captureResource&&e.captureResource.trim()&&(k.captureResource=e.captureResource.trim()),"string"==typeof e.captureKv&&e.captureKv.trim()&&(k.captureKv=e.captureKv.trim())}else if("resource"===i){let a="string"==typeof e.runName?e.runName.trim():"",b="string"==typeof e.server?e.server.trim():"",c="string"==typeof e.uri?e.uri.trim():"";a?(k.scope="run",k.runName=a,(b||c)&&w("resource-both-bindings",`Node "${f}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,f)):(k.scope="mcp",b&&(k.boundServer=b),c&&(k.uri=c),b&&c?y.has(b)||w("server-unknown",`Node "${f}": MCP server "${b}" is not configured in FLUJO.`,f):w("resource-missing-binding",`Node "${f}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,f))}else if("signal"===i){let a="string"==typeof e.topic?e.topic.trim():"";a?k.topic=a:w("signal-missing-topic",`Node "${f}": a signal node needs a "topic" to emit.`,f),"string"==typeof e.payloadTemplate&&e.payloadTemplate?k.payloadTemplate=e.payloadTemplate:void 0!==l&&(k.payloadTemplate=l)}let m={id:(0,d.A)(),type:i,position:{x:0,y:0},data:{label:"finish"===i?"Finish Node":e.label||`${i.charAt(0).toUpperCase()}${i.slice(1)} Node`,type:i,...e.description?{description:e.description}:{},properties:k}};if(L.set(f,m),M.push(m),"process"===i&&Array.isArray(e.servers)){let a=new Set;for(let b of e.servers){let c,e=b?.name;if(!e||"string"!=typeof e){w("server-missing-name",`Node "${f}": a server reference is missing its "name"; skipped.`,f);continue}if(a.has(e))continue;a.add(e),y.has(e)||w("server-unknown",`Node "${f}": MCP server "${e}" is not configured in FLUJO.`,f);let g=z[e];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&w("tool-unknown",`Node "${f}": server "${e}" does not report tool(s): ${a.join(", ")}.`,f)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:e,type:"mcp",properties:{boundServer:e,enabledTools:c}}};M.push(h),N.push({processKey:f,mcpNode:h})}}else"process"!==i&&Array.isArray(e.servers)&&e.servers.length>0&&w("servers-on-non-process",`Node "${f}": only process nodes can have "servers"; ignored.`,f)}if(0===L.size)return g("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let P=[],Q=new Set;for(let a of G){let b,c=a?.from,d=a?.to,e=c?L.get(c):void 0,h=d?L.get(d):void 0;if(!e||!h){g("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===h){g("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===e.type||"resource"===h.type){if(("resource"!==e.type||"process"!==h.type)&&("process"!==e.type||"resource"!==h.type)){g("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&w("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&w("resource-edge-bidirectional",`Edge "${c}" -> "${d}": resource wiring is directional (read vs write); "bidirectional" was ignored — add the opposite edge explicitly if the step both reads and writes.`);let b=`${c}->${d}`;if(Q.has(b)){w("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}Q.add(b),P.push(function(a,b){let c="resource"===a.type?"resource-out":"process-right-resource",d="resource"===b.type?"resource-in":"process-left-resource";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"resourceEdge",data:{edgeType:"resource"},animated:!1,markerEnd:{...m},style:{...n}}}(e,h));continue}if("start"===h.type){g("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){g("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let i=`${c}->${d}`;if(Q.has(i)){w("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}Q.add(i);let j=!0===a.bidirectional;j&&("start"===e.type||"finish"===h.type)&&(w("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),j=!1);let k=a.condition;k&&"object"==typeof k&&("process"!==e.type?w("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(k.kind)?"always"===k.kind?b={kind:"always",..."last-message"===k.target?{target:"last-message"}:{},...!0===k.negate?{negate:!0}:{}}:"string"!=typeof k.value||0===k.value.length?w("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==k.kind||(0,f.wM)(k.value)||w("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:k.kind,value:k.value,..."last-message"===k.target?{target:"last-message"}:{},...!0===k.ignoreCase?{ignoreCase:!0}:{},...!0===k.negate?{negate:!0}:{}}):w("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(k.kind)}"; the condition was dropped.`)),P.push(u(e,h,j,b))}for(let{processKey:a,mcpNode:b}of N){let c=L.get(a);P.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...k},markerStart:{...k},style:{...l}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c){let b=a.data?.edgeType;"mcp"!==b&&"resource"!==b&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target))}let g=[...b.values()],h=g.filter(a=>"resource"===a.type),i=g.filter(a=>"resource"!==a.type),j=i.filter(a=>"start"===a.type),k=j.length>0?j:i.slice(0,1),l=new Map,m=k.map(a=>({id:a.id,depth:0}));for(let a of m)l.set(a.id,0);for(;m.length;){let{id:a,depth:b}=m.shift();for(let c of f.get(a)??[])l.has(c)||(l.set(c,b+1),m.push({id:c,depth:b+1}))}let n=0;for(let a of l.values())n=Math.max(n,a);for(let a of i)l.has(a.id)||l.set(a.id,n+1);let o=new Map;for(let[a,c]of b)o.set(c.id,a);let p=new Map;for(let a of i){let b=o.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=l.get(a.id),f=p.get(d)??0;p.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let q=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=q.get(a)??0;q.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}let r=new Map(g.map(a=>[a.id,a])),s=new Map,t=0;for(let a of h){let b=o.get(a.id),d=e&&b?e[b]:void 0;if(d&&"number"==typeof d.x&&"number"==typeof d.y){a.position={x:d.x,y:d.y};continue}let f=c.find(b=>b.data?.edgeType==="resource"&&(b.source===a.id||b.target===a.id)),g=f?f.source===a.id?f.target:f.source:void 0,h=g?r.get(g):void 0;if(h){let b=s.get(h.id)??0;s.set(h.id,b+1),a.position={x:h.position.x-320,y:h.position.y+150*b}}else{let b=0;for(let a of i)b=Math.max(b,a.position.y);a.position={x:250+280*t,y:b+170},t++}}}(0,L,P,N,0===h?c.positions:void 0);let R={id:I,name:H,...e?.description?{description:e.description}:{},nodes:M,edges:P};return C.push(R),E.push({id:R.id,name:R.name}),R}(a,0,[]),H=C,I=e;let J=I.filter(a=>"error"===a.severity).length;return{flow:G,flows:H,issues:I,errorCount:J,warningCount:I.length-J};function K(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?w("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:w("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function w(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b&&"resource"!==b&&"signal"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,..."finish"!==b&&a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),!1===c.allowCallerPrompt&&(d.allowCallerPrompt=!1),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource),"string"==typeof c.captureKv&&c.captureKv&&(d.captureKv=c.captureKv);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else if("subflow"===b){if(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0)d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy);else if("string"==typeof c.subflowId&&c.subflowId){d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy));let a=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];a.length>0&&(d.spawnBriefs=a,"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))}"string"==typeof c.parallelSubflowIdsVar&&c.parallelSubflowIdsVar&&(d.parallelFlowsVariable=c.parallelSubflowIdsVar,d.parallelFlows||d.flow||("number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),!0===c.allowCallerFanout&&(d.allowCallerFanout=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource),"string"==typeof c.captureKv&&c.captureKv&&(d.captureKv=c.captureKv)}else"resource"===b?"run"===c.scope&&"string"==typeof c.runName&&c.runName?d.runName=c.runName:("string"==typeof c.boundServer&&c.boundServer&&(d.server=c.boundServer),"string"==typeof c.uri&&c.uri&&(d.uri=c.uri)):"signal"===b&&("string"==typeof c.topic&&c.topic&&(d.topic=c.topic),"string"==typeof c.payloadTemplate&&c.payloadTemplate&&(d.payloadTemplate=c.payloadTemplate));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function x(a){for(let b of a.nodes){if("finish"===b.type){b.data.label="Finish Node";continue}if("process"!==b.type)continue;let a=b.data.properties??{};void 0===a.inputMode&&(a.inputMode="latest-message"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}}};
1
+ "use strict";exports.id=1226,exports.ids=[1226],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>h,FH:()=>w,Zn:()=>x,dM:()=>v,lk:()=>i,pX:()=>u});var d=c(32524),e=c(49181),f=c(67512),g=c(89224);let h=3,i=8;function j(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let k={type:"arrowclosed",width:20,height:20,color:"#1976d2"},l={stroke:"#1976d2",strokeWidth:2},m={type:"arrowclosed",width:20,height:20,color:"#009688"},n={stroke:"#009688",strokeWidth:2},o=new Set(["full-history","latest-message","isolated"]),p=new Set(["steps","final-only"]),q=new Set(["full-conversation","latest-message"]);function r(a,b={}){let{keepPills:c=!1,wiredServers:d=new Set,validHandoffNames:f=new Set}=b,g=(0,e.A$)(a);if(0===g.length)return{text:a,stripped:!1,unresolved:[]};let h="",i=0,j=!1,k=[];for(let b of g){h+=a.slice(i,b.index),i=b.index+b.fullMatch.length;let e=!1;c&&(e="handoff"===b.server?f.has(b.name):d.has(b.server)),e?h+=b.fullMatch:(h+=b.name,j=!0,c&&k.push(b.fullMatch))}return{text:h+=a.slice(i),stripped:j,unresolved:k}}function s(a,b,c){let d=b.filter(b=>b.from===a).map(a=>c.get(a.to)).filter(Boolean).map(a=>({id:a.key??"",label:a.label,type:a.type}));return new Set((0,g.E9)(d).values())}function t(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function u(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function v(a,b={},c={}){let e=[],g=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),w=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),x=b.models??[],y=new Set((b.servers??[]).map(a=>a.name)),z=b.serverTools??{},A=j(c.maxDepth,0,h,h),B=j(c.maxFlows,1,i,i),C=[],D=[...(b.flows??[]).map(a=>a.name)],E=[],F=0;var G=function a(e,h,i){let v=Array.isArray(e?.nodes)?e.nodes:[],G=Array.isArray(e?.edges)?e.edges:[],H=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,D);D.push(H),F++;let I=(0,d.A)(),J=[...i,H],L=new Map,M=[],N=[],O=new Map(v.filter(a=>a?.key&&"string"==typeof a.key).map(a=>[a.key,a]));for(let e of v){let f=e?.key;if(!f||"string"!=typeof f){g("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(L.has(f)){g("node-duplicate-key",`Duplicate node key "${f}" — keys must be unique; the later node was dropped.`,f);continue}let i=e.type;if("mcp"===i){g("mcp-node-not-allowed",`Node "${f}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,f);continue}if("start"!==i&&"process"!==i&&"finish"!==i&&"subflow"!==i&&"resource"!==i&&"signal"!==i){g("unknown-node-type",`Node "${f}" has unknown type "${String(i)}".`,f);continue}let k={},l="string"==typeof e.prompt?e.prompt:void 0;if("start"===i){let{text:a,stripped:b,unresolved:d}=r(l??"",c.keepPills?{keepPills:!0,wiredServers:new Set((e.servers??[]).map(a=>a.name)),validHandoffNames:s(f,G,O)}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);k.promptTemplate=a}else if("process"===i){let{text:a,stripped:b,unresolved:d}=r(l??"",c.keepPills?{keepPills:!0,wiredServers:new Set((e.servers??[]).map(a=>a.name)),validHandoffNames:s(f,G,O)}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);if(k.promptTemplate=a,e.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(e.model,x);a?k.boundModel=a:(k.boundModel=e.model,w("model-unresolved",`Node "${f}": model "${e.model}" does not match any configured model (by id, display name, or name).`,f))}void 0!==e.inputMode&&(o.has(e.inputMode)?(k.inputMode=e.inputMode,"isolated"===e.inputMode&&"string"==typeof e.isolatedPrompt&&(k.isolatedPrompt=e.isolatedPrompt)):w("invalid-input-mode",`Node "${f}": inputMode "${String(e.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,f)),"boolean"==typeof e.allowCallerPrompt&&(k.allowCallerPrompt=e.allowCallerPrompt),void 0!==e.outputMode&&(q.has(e.outputMode)?k.outputMode=e.outputMode:w("invalid-output-mode",`Node "${f}": outputMode "${String(e.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,f)),void 0!==e.maxTurns&&("number"!=typeof e.maxTurns||Number.isNaN(e.maxTurns)?w("invalid-max-turns",`Node "${f}": maxTurns "${String(e.maxTurns)}" is not a number; omitted.`,f):k.maxTurns=j(e.maxTurns,1,1e3,1)),"boolean"==typeof e.excludeModelPrompt&&(k.excludeModelPrompt=e.excludeModelPrompt),"boolean"==typeof e.excludeStartNodePrompt&&(k.excludeStartNodePrompt=e.excludeStartNodePrompt),"boolean"==typeof e.excludeSystemPrompt&&(k.excludeSystemPrompt=e.excludeSystemPrompt),Array.isArray(e.allowedTools)&&(k.allowedTools=e.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof e.captureVariable&&e.captureVariable.trim()&&(k.captureVariable=e.captureVariable.trim()),"string"==typeof e.captureResource&&e.captureResource.trim()&&w("process-capture-resource-unsupported",`Node "${f}": process captureResource is not supported; connect the process to a Resource node so it can call write_resource.`,f),"string"==typeof e.captureKv&&e.captureKv.trim()&&(k.captureKv=e.captureKv.trim())}else if("subflow"===i){if(function(c,d,e,f,h){let i=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,j=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0,k="string"==typeof c.parallelFlowsVariable?c.parallelFlowsVariable.trim():"";if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,i?"parallelFlows":null,j?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&w("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(i||j)&&g("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(h.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?h.itemSplit=c.itemSplit:w("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(h.sequential=!0),K(c,h)):g("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}let l=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];if(l.length>0){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;i||j?g("subflow-spawn-and-parallel",`Node "${d}": "spawnBriefs" runs a SINGLE child once per brief and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d):!0===c.mapOverList?g("subflow-spawn-and-map",`Node "${d}": "spawnBriefs" cannot be combined with "mapOverList"; use one lane source or the other.`,d):a?(h.spawnBriefs=l,K(c,h)):g("subflow-spawn-no-child",`Node "${d}": "spawnBriefs" needs a single child ("flow" or "subflowSpec") to spawn once per brief.`,d)}if(k&&(!0===c.mapOverList?g("subflow-map-and-parallel-var",`Node "${d}": "parallelFlowsVariable" (dynamic fan-out) cannot be combined with "mapOverList".`,d):h.parallelSubflowIdsVar=k),c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return g("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=t(c.flow,[...b.flows??[],...E]);return a?h.subflowId=a:g("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>A)return g("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${A} level(s); this inline subflow was not compiled.`,d);if(F>=B)return g("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${B} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?h.subflowId=b.id:g("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(i){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){g("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){g("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=t(e,[...b.flows??[],...E]);c?a.includes(c)||a.push(c):g("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(h.parallelSubflowIds=a,K(c,h)):g("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(j){let b=[];for(let h of c.parallelSubflowSpecs){if(!h||"object"!=typeof h){g("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>A){g("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${A} level(s); a parallel inline subflow was not compiled.`,d);continue}if(F>=B){g("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${B} flows in one bundle; it was not compiled.`,d);continue}let c=a(h,e+1,f);c?b.push(c.id):g("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(h.parallelSubflowIds=b,K(c,h)):g("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}k&&h.parallelSubflowIdsVar?K(c,h):void 0!==c.generateSubflow&&null!==c.generateSubflow?g("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d):g("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(e,f,h,J,k),void 0!==e.inputMode&&(o.has(e.inputMode)?k.inputMode=e.inputMode:w("invalid-input-mode",`Node "${f}": inputMode "${String(e.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,f)),void 0!==e.outputMode&&(p.has(e.outputMode)?k.outputMode=e.outputMode:w("invalid-output-mode",`Node "${f}": outputMode "${String(e.outputMode)}" is not valid (steps | final-only); omitted.`,f)),void 0!==l){let{text:a,stripped:b,unresolved:d}=r(l,c.keepPills?{keepPills:!0}:{});for(let a of(b&&!c.keepPills&&w("pill-stripped",`Node "${f}": binding pills are not supported in generated prompts and were replaced with plain names.`,f),d))w("pill-unresolved",`Node "${f}": pill "${a}" not resolved against wired servers — stripped.`,f);k.promptTemplate=a}"boolean"==typeof e.allowCallerPrompt&&(k.allowCallerPrompt=e.allowCallerPrompt),"boolean"==typeof e.allowCallerFanout&&(k.allowCallerFanout=e.allowCallerFanout),"string"==typeof e.captureVariable&&e.captureVariable.trim()&&(k.captureVariable=e.captureVariable.trim()),"string"==typeof e.captureResource&&e.captureResource.trim()&&(k.captureResource=e.captureResource.trim()),"string"==typeof e.captureKv&&e.captureKv.trim()&&(k.captureKv=e.captureKv.trim())}else if("resource"===i){let a="string"==typeof e.runName?e.runName.trim():"",b="string"==typeof e.server?e.server.trim():"",c="string"==typeof e.uri?e.uri.trim():"";a?(k.scope="run",k.runName=a,(b||c)&&w("resource-both-bindings",`Node "${f}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,f)):(k.scope="mcp",b&&(k.boundServer=b),c&&(k.uri=c),b&&c?y.has(b)||w("server-unknown",`Node "${f}": MCP server "${b}" is not configured in FLUJO.`,f):w("resource-missing-binding",`Node "${f}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,f))}else if("signal"===i){let a="string"==typeof e.topic?e.topic.trim():"";a?k.topic=a:w("signal-missing-topic",`Node "${f}": a signal node needs a "topic" to emit.`,f),"string"==typeof e.payloadTemplate&&e.payloadTemplate?k.payloadTemplate=e.payloadTemplate:void 0!==l&&(k.payloadTemplate=l)}let m={id:(0,d.A)(),type:i,position:{x:0,y:0},data:{label:"finish"===i?"Finish Node":e.label||`${i.charAt(0).toUpperCase()}${i.slice(1)} Node`,type:i,...e.description?{description:e.description}:{},properties:k}};if(L.set(f,m),M.push(m),"process"===i&&Array.isArray(e.servers)){let a=new Set;for(let b of e.servers){let c,e=b?.name;if(!e||"string"!=typeof e){w("server-missing-name",`Node "${f}": a server reference is missing its "name"; skipped.`,f);continue}if(a.has(e))continue;a.add(e),y.has(e)||w("server-unknown",`Node "${f}": MCP server "${e}" is not configured in FLUJO.`,f);let g=z[e];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&w("tool-unknown",`Node "${f}": server "${e}" does not report tool(s): ${a.join(", ")}.`,f)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:e,type:"mcp",properties:{boundServer:e,enabledTools:c}}};M.push(h),N.push({processKey:f,mcpNode:h})}}else"process"!==i&&Array.isArray(e.servers)&&e.servers.length>0&&w("servers-on-non-process",`Node "${f}": only process nodes can have "servers"; ignored.`,f)}if(0===L.size)return g("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let P=[],Q=new Set;for(let a of G){let b,c=a?.from,d=a?.to,e=c?L.get(c):void 0,h=d?L.get(d):void 0;if(!e||!h){g("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===h){g("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===e.type||"resource"===h.type){if(("resource"!==e.type||"process"!==h.type)&&("process"!==e.type||"resource"!==h.type)){g("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&w("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&w("resource-edge-bidirectional",`Edge "${c}" -> "${d}": resource wiring is directional (read vs write); "bidirectional" was ignored — add the opposite edge explicitly if the step both reads and writes.`);let b=`${c}->${d}`;if(Q.has(b)){w("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}Q.add(b),P.push(function(a,b){let c="resource"===a.type?"resource-out":"process-right-resource",d="resource"===b.type?"resource-in":"process-left-resource";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"resourceEdge",data:{edgeType:"resource"},animated:!1,markerEnd:{...m},style:{...n}}}(e,h));continue}if("start"===h.type){g("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){g("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let i=`${c}->${d}`;if(Q.has(i)){w("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}Q.add(i);let j=!0===a.bidirectional;j&&("start"===e.type||"finish"===h.type)&&(w("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),j=!1);let k=a.condition;k&&"object"==typeof k&&("process"!==e.type?w("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(k.kind)?"always"===k.kind?b={kind:"always",..."last-message"===k.target?{target:"last-message"}:{},...!0===k.negate?{negate:!0}:{}}:"string"!=typeof k.value||0===k.value.length?w("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==k.kind||(0,f.wM)(k.value)||w("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:k.kind,value:k.value,..."last-message"===k.target?{target:"last-message"}:{},...!0===k.ignoreCase?{ignoreCase:!0}:{},...!0===k.negate?{negate:!0}:{}}):w("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(k.kind)}"; the condition was dropped.`)),P.push(u(e,h,j,b))}for(let{processKey:a,mcpNode:b}of N){let c=L.get(a);P.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...k},markerStart:{...k},style:{...l}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c){let b=a.data?.edgeType;"mcp"!==b&&"resource"!==b&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target))}let g=[...b.values()],h=g.filter(a=>"resource"===a.type),i=g.filter(a=>"resource"!==a.type),j=i.filter(a=>"start"===a.type),k=j.length>0?j:i.slice(0,1),l=new Map,m=k.map(a=>({id:a.id,depth:0}));for(let a of m)l.set(a.id,0);for(;m.length;){let{id:a,depth:b}=m.shift();for(let c of f.get(a)??[])l.has(c)||(l.set(c,b+1),m.push({id:c,depth:b+1}))}let n=0;for(let a of l.values())n=Math.max(n,a);for(let a of i)l.has(a.id)||l.set(a.id,n+1);let o=new Map;for(let[a,c]of b)o.set(c.id,a);let p=new Map;for(let a of i){let b=o.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=l.get(a.id),f=p.get(d)??0;p.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let q=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=q.get(a)??0;q.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}let r=new Map(g.map(a=>[a.id,a])),s=new Map,t=0;for(let a of h){let b=o.get(a.id),d=e&&b?e[b]:void 0;if(d&&"number"==typeof d.x&&"number"==typeof d.y){a.position={x:d.x,y:d.y};continue}let f=c.find(b=>b.data?.edgeType==="resource"&&(b.source===a.id||b.target===a.id)),g=f?f.source===a.id?f.target:f.source:void 0,h=g?r.get(g):void 0;if(h){let b=s.get(h.id)??0;s.set(h.id,b+1),a.position={x:h.position.x-320,y:h.position.y+150*b}}else{let b=0;for(let a of i)b=Math.max(b,a.position.y);a.position={x:250+280*t,y:b+170},t++}}}(0,L,P,N,0===h?c.positions:void 0);let R={id:I,name:H,...e?.description?{description:e.description}:{},nodes:M,edges:P};return C.push(R),E.push({id:R.id,name:R.name}),R}(a,0,[]),H=C,I=e;let J=I.filter(a=>"error"===a.severity).length;return{flow:G,flows:H,issues:I,errorCount:J,warningCount:I.length-J};function K(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?w("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:w("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function w(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b&&"resource"!==b&&"signal"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,..."finish"!==b&&a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),!1===c.allowCallerPrompt&&(d.allowCallerPrompt=!1),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource),"string"==typeof c.captureKv&&c.captureKv&&(d.captureKv=c.captureKv);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else if("subflow"===b){if(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0)d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy);else if("string"==typeof c.subflowId&&c.subflowId){d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy));let a=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];a.length>0&&(d.spawnBriefs=a,"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))}"string"==typeof c.parallelSubflowIdsVar&&c.parallelSubflowIdsVar&&(d.parallelFlowsVariable=c.parallelSubflowIdsVar,d.parallelFlows||d.flow||("number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),!0===c.allowCallerFanout&&(d.allowCallerFanout=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource),"string"==typeof c.captureKv&&c.captureKv&&(d.captureKv=c.captureKv)}else"resource"===b?"run"===c.scope&&"string"==typeof c.runName&&c.runName?d.runName=c.runName:("string"==typeof c.boundServer&&c.boundServer&&(d.server=c.boundServer),"string"==typeof c.uri&&c.uri&&(d.uri=c.uri)):"signal"===b&&("string"==typeof c.topic&&c.topic&&(d.topic=c.topic),"string"==typeof c.payloadTemplate&&c.payloadTemplate&&(d.payloadTemplate=c.payloadTemplate));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function x(a){for(let b of a.nodes){if("finish"===b.type){b.data.label="Finish Node";continue}if("process"!==b.type)continue;let a=b.data.properties??{};(void 0===a.inputMode||"latest-message"===a.inputMode)&&(a.inputMode="full-history"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}}};
@@ -1 +1 @@
1
- "use strict";exports.id=1227,exports.ids=[1227],exports.modules={34641:(a,b,c)=>{c.d(b,{uJ:()=>B,Ay:()=>L,Yw:()=>C});var d=c(21124),e=c(38301),f=c(60839),g=c(81637),h=c(8521),i=c(79515),j=c(88745),k=c(43312),l=c(68730),m=c(99561),n=c(5748),o=c(1994),p=c(17332),q=c(63908),r=c(36636),s=c(93516),t=c(92543),u=c(28055),v=c(59060);let w=(0,c(19815).h)("frontend/components/Chat/McpAppFrame"),x={name:"FLUJO",version:"3.33.0"},y=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],A=new Set(["text"]),B=262144;function C(a){try{return new TextEncoder().encode(JSON.stringify(a)).length}catch{return 1/0}}let D=null;async function E(){return D||(D=fetch("/api/mcp/app-sandbox").then(async a=>{if(!a.ok)throw Error(`Sandbox endpoint discovery failed (${a.status})`);return await a.json()}).catch(a=>{throw D=null,a})),function(a,b){let c;if("string"!=typeof a.token||0===a.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==a.url){if("string"!=typeof a.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{c=new URL(a.url)}catch{throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==c.protocol&&"https:"!==c.protocol||c.username||c.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===b.protocol&&"https:"!==c.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==b.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(a.port)||a.port<1||a.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(c=new URL("/sandbox.html",b.origin)).port=String(a.port)}if(c.origin===b.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return c.searchParams.set("token",a.token),c.href}(await D,window.location)}function F(a,b){let c=[],d=new Set;for(let e of a??[]){if(0===e.length||e.length>2048||/[^\x21-\x7e]/.test(e))continue;let a=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!a||!b.includes(a[1].toLowerCase()))continue;let f=a[3].split(".");if(a[3].length>253||f.some(a=>0===a.length||a.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(a)))continue;let g=a[4]?Number(a[4]):void 0;if(void 0!==g&&(!Number.isInteger(g)||g<1||g>65535))continue;let h=e.toLowerCase();if(!d.has(h)&&(d.add(h),c.push(e),c.length>=64))break}return c}function G(a){if(a)try{return JSON.parse(a)}catch{return}}async function H(a,b,c,d,e){if(await a.sendToolInput({arguments:function(a){let b=G(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:{}}(b)}),void 0!==d)return void await a.sendToolCancelled({reason:d});let f=function(a,b){if(void 0===a)return!0===b?{content:[],isError:!0}:null;let c=G(a);return c&&"object"==typeof c&&Array.isArray(c.content)?{...c,...!0===b?{isError:!0}:{}}:{content:[{type:"text",text:a}],...!0===b?{isError:!0}:{}}}(c,e);f&&await a.sendToolResult(f)}function I(a,b,c){return b.includes(a)&&c.includes(a)}function J(a,b){let c=a.getBoundingClientRect(),d=Math.max(1,Math.round(c.width||a.clientWidth||1));return b?{width:d,height:Math.max(1,Math.round(c.height||a.clientHeight||1))}:{width:d,maxHeight:6e3}}async function K(a,b,c){try{let d=await u.S.listServerTools(a),e=Array.isArray(d.tools)?d.tools:[],f=c?e.find(a=>a?.name===c):e.find(a=>(0,v.Gt)(a?._meta)===b);if(f?.name&&f?.inputSchema&&(0,v.Gt)(f._meta)===b)return{tool:f}}catch(a){w.debug("Could not resolve the full MCP App tool definition",a)}}let L=({serverName:a,uri:b,toolName:c,toolArgs:D,toolResultContent:G,toolUpdateId:L,toolCancelledReason:M,toolIsError:N,onAppMessage:O,onUpdateModelContext:P,onRequestDock:Q,onDockable:R,onAvailableDisplayModes:S,hostDisplayMode:T,onRequestDisplayMode:U,onRequestClose:V,onRegisterTeardown:W,teardownRegistrationKey:X,docked:Y=!1,visible:Z=!0})=>{let $=(0,f.A)(),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(!1),[ad,ae]=(0,e.useState)(null),[af,ag]=(0,e.useState)(Y?"pip":"inline"),[ah,ai]=(0,e.useState)([]),aj=T??af,ak=(0,e.useMemo)(()=>Y?["pip","fullscreen"]:["inline","fullscreen",...Q?["pip"]:[]],[Y,Q]),al=(0,e.useRef)(null),am=(0,e.useRef)(null),an=(0,e.useRef)(null),ao=(0,e.useRef)(!1),ap=(0,e.useRef)(0),aq=(0,e.useRef)(!1),ar=(0,e.useRef)(null),as=(0,e.useRef)(null),at=(0,e.useRef)(!1),au=(0,e.useRef)(!0),av=(0,e.useRef)([]),aw=(0,e.useRef)(aj),ax=(0,e.useRef)(ak),ay=(0,e.useRef)(Promise.resolve()),az=(0,e.useRef)(void 0),aA=(0,e.useRef)({args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L});aA.current={args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L};let aB=(0,e.useRef)(O);(0,e.useEffect)(()=>{aB.current=O},[O]);let aC=(0,e.useRef)(P);(0,e.useEffect)(()=>{aC.current=P},[P]);let aD=(0,e.useRef)(Q);(0,e.useEffect)(()=>{aD.current=Q},[Q]);let aE=(0,e.useRef)(R);(0,e.useEffect)(()=>{aE.current=R},[R]);let aF=(0,e.useRef)(S);(0,e.useEffect)(()=>{aF.current=S},[S]);let aG=(0,e.useRef)(U);(0,e.useEffect)(()=>{aG.current=U},[U]);let aH=(0,e.useRef)(V);(0,e.useEffect)(()=>{aH.current=V},[V]);let aI=(0,e.useRef)(Y);(0,e.useEffect)(()=>{aI.current=Y},[Y]),(0,e.useEffect)(()=>{aw.current=aj},[aj]),(0,e.useEffect)(()=>{ax.current=ak},[ak]);let aJ=(0,e.useCallback)(()=>{if(as.current)return as.current;ap.current+=1;let a=an.current,b=am.current,c=aq.current;an.current=null,am.current=null,aq.current=!1,ao.current=!1,av.current=[],ar.current?.disconnect(),ar.current=null;let d=(async()=>{if(a&&c){let b;try{await Promise.race([a.teardownResource({},{timeout:1e3}),new Promise(a=>{b=setTimeout(a,1e3)})])}catch(a){w.debug("MCP App did not acknowledge resource teardown",a)}finally{b&&clearTimeout(b)}}try{await a?.close()}catch{}b?.remove()})();return as.current=d,d.finally(()=>{as.current===d&&(as.current=null)}),d},[]),aK=(0,e.useCallback)(()=>{!at.current&&aD.current&&(at.current=!0,aJ().then(()=>{au.current&&(aD.current?.(),aa(!1))}).finally(()=>{at.current=!1}))},[aJ]),aL=(0,e.useCallback)((a,b,c,d,e)=>{ay.current=ay.current.catch(()=>void 0).then(async()=>{an.current===a&&aq.current&&await H(a,b,c,d,e)}).catch(a=>{w.warn("MCP App tool delivery failed",a)})},[]),aM=(0,e.useCallback)(async()=>{if(as.current&&await as.current,ao.current||!al.current)return;let d=ap.current+1;ap.current=d;let e=()=>ap.current===d&&ao.current;ao.current=!0,ai([]),ac(!0),ae(null);try{let f,[g,h]=await Promise.all([u.S.readResourceFromApp(a,b),K(a,b,c)]);if(!e())return;if(g?.httpStatus===403)throw Error(g?.error||"MCP Apps access was disabled for this server");if(!g||!1===g.success)throw Error(g?.error||"Failed to read the UI resource.");let i=function(a,b){var c;let d,e=a?.contents;if(!Array.isArray(e)||0===e.length)throw Error("Resource has no contents");let f=e.find(a=>a.uri===b&&"string"==typeof a.mimeType&&(0,v.q$)(a.mimeType)&&("string"==typeof a.text||"string"==typeof a.blob));if(!f)throw Error(`Resource ${b} did not return MCP App HTML`);try{d="string"==typeof f.text?f.text:function(a){let b=Uint8Array.from(atob(a),a=>a.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(b)}(f.blob)}catch{throw Error(`Resource ${b} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(d).length>v.Pt)throw Error(`Resource exceeds the ${Math.round(v.Pt/1024)} KiB size cap`);let g=(f._meta??f.meta)?.ui,h=t.c0.safeParse(g?.csp);if(g?.csp!==void 0&&!h.success)throw Error(`Resource ${b} declares an invalid CSP policy`);let i=t.Ml.safeParse(g?.permissions);if(g?.permissions!==void 0&&!i.success)throw Error(`Resource ${b} declares invalid sandbox permissions`);return{html:d,csp:h.success?{connectDomains:F((c=h.data).connectDomains,["https","wss"]),resourceDomains:F(c.resourceDomains,["https"]),frameDomains:F(c.frameDomains,["https"]),baseUriDomains:F(c.baseUriDomains,["https"])}:void 0,permissions:i.success&&i.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(g.data,b),j=await E();if(!e()||!al.current)return;let k=document.createElement("iframe");k.title=`MCP App: ${b}`,k.setAttribute("sandbox","allow-scripts allow-same-origin"),k.referrerPolicy="origin";let l=(0,t.Sy)(i.permissions);l&&k.setAttribute("allow",l),k.style.cssText=aI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",al.current.appendChild(k),am.current=k;let m=new URL(j);i.csp&&m.searchParams.set("csp",JSON.stringify(i.csp));let n=m.origin,o=new Promise((a,b)=>{let c=setTimeout(()=>{window.removeEventListener("message",d),b(Error("Timed out waiting for the sandbox proxy."))},1e4),d=b=>{b.source===k.contentWindow&&b.origin===n&&b.data?.jsonrpc==="2.0"&&b.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(c),window.removeEventListener("message",d),a())};window.addEventListener("message",d)});if(k.src=m.href,await o,!e()||am.current!==k)return;let p=aw.current,q="inline";aw.current=q,f=new t.T1(function(a,b){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(c,d,e)=>{let{method:f,params:g}=c;if("tools/call"===f){w.info(`MCP App tools/call: ${a}/${g?.name}`);let c=await u.S.callToolFromApp(a,g.name,g.arguments??{},void 0,e?.signal);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${g?.name}`);return c.data}if("resources/read"===f){let c=await u.S.readResourceFromApp(a,g.uri);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Resource read failed: ${g?.uri}`);return c.data}if("resources/list"===f)return{resources:[]};if("resources/templates/list"===f)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${f}`)}}}(a,a=>{ap.current===d&&an.current===f&&(ae(a),ac(!1),aJ())}),x,{openLinks:{},serverTools:{},serverResources:{},logging:{},...aB.current?{message:{text:{}}}:{},...aC.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:i.csp,permissions:i.permissions}},{hostContext:{...h?{toolInfo:h}:{},theme:"dark"===$.palette.mode?"dark":"light",platform:"web",displayMode:q,availableDisplayModes:ax.current,containerDimensions:J(al.current,aI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}}),an.current=f;let r=()=>e()&&an.current===f;if(f.onopenlink=async({url:c})=>{if(!r())return{isError:!0};let d=function(a){try{let b=new URL(a);if(!y.has(b.protocol)||b.username||b.password)return null;return b.href}catch{return null}}(c);if(!d)return w.warn("MCP App open-link rejected by URL policy",{serverName:a,uri:b}),{isError:!0};let e=window.open(d,"_blank","noopener,noreferrer");return e?(e.opener=null,{}):{isError:!0}},f.ondownloadfile=async({contents:a})=>{if(!r())return{isError:!0};try{for(let b of a??[]){let a,c=b?.resource;if(!c)continue;let d=("string"==typeof c.uri?c.uri.split("/").pop():"")||"download",e="string"==typeof c.mimeType?c.mimeType:"application/octet-stream";if("string"==typeof c.blob){let b=Uint8Array.from(atob(c.blob),a=>a.charCodeAt(0));a=new Blob([b],{type:e})}else a=new Blob([String(c.text??"")],{type:e});let f=URL.createObjectURL(a),g=document.createElement("a");g.href=f,g.download=d,document.body.appendChild(g),g.click(),g.remove(),setTimeout(()=>URL.revokeObjectURL(f),4e3)}return{}}catch(a){return w.warn("MCP App download failed",a),{isError:!0}}},f.onloggingmessage=a=>{r()&&w.debug("MCP App log",a?.data)},f.onmessage=async a=>{if(!r())return{};if(!aB.current)throw Error("This host cannot deliver ui/message in this surface");let b=function(a){if(a?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let b=a?.content,c=Array.isArray(b)?b:b&&"object"==typeof b?[b]:[];if(0===c.length||c.some(a=>a?.type!=="text"||"string"!=typeof a.text))throw Error("This host accepts text-only ui/message content");let d=c.map(a=>a.text).join("\n").trim();if(!d)throw Error("ui/message text must not be empty");return d}(a);if(!await aB.current(b))throw Error("ui/message was not delivered");return{}},f.onupdatemodelcontext=async c=>{if(!r())return{};let d=function(a){if(!a||"object"!=typeof a||Array.isArray(a))return"ui/update-model-context params must be an object";if(void 0!==a.content){if(!Array.isArray(a.content))return"Model context content must be an array";for(let b of a.content)if(!b||"object"!=typeof b||Array.isArray(b)||!A.has(b.type))return"Model context contains a modality this host did not advertise"}return void 0!==a.structuredContent&&(!a.structuredContent||"object"!=typeof a.structuredContent||Array.isArray(a.structuredContent))?"Model structuredContent must be an object":C(a)>B?`Model context exceeds ${B} bytes`:null}(c);if(d)throw Error(d);let e=`${a}::${b}`;if(!aC.current)throw Error("This host cannot preserve model context in this surface");if(!await aC.current(e,c))throw Error("MCP App model context was not stored");return{}},f.onsizechange=async({width:a,height:b})=>{if(!r()||aI.current)return;let c=al.current?.getBoundingClientRect().width||al.current?.clientWidth||0,d=function(a,b){let c={};if(Number.isFinite(a.width)&&a.width>0){let d=Number.isFinite(b)&&b>0?b:6e3;c.width=Math.min(a.width,d,6e3)}return Number.isFinite(a.height)&&a.height>0&&(c.height=Math.min(a.height,6e3)),c}({width:a,height:b},c);void 0!==d.height&&(k.style.height=`${d.height}px`),void 0!==d.width&&(k.style.width=`${d.width}px`,k.style.maxWidth="100%")},f.onrequestdisplaymode=async({mode:a})=>{if(!r())return{mode:aw.current};let b=aw.current,c=av.current;if(!I(a,ax.current,c))return{mode:b};if("pip"===a&&!aI.current&&aD.current)return setTimeout(aK,0),{mode:b};let d=b;return(d=aG.current?await aG.current(a,[...c]):a)===b||I(d,ax.current,c)||(d=b),d!==b&&(aw.current=d,ag(d),await f.sendHostContextChange({displayMode:d})),{mode:d}},f.onrequestteardown=()=>{r()&&aJ().finally(()=>{aH.current?aH.current():(aw.current="inline",ag("inline"),aa(!1))})},f.oninitialized=()=>{if(!r())return;let a=f.getAppCapabilities()?.availableDisplayModes,b=Array.isArray(a)?[...new Set(a.filter(a=>z.includes(a)))]:[];av.current=b,ai(b),aE.current?.(b.includes("pip")),aF.current?.([...b]),aq.current=!0;let c=function(a,b,c,d){return b?I("pip",c,d)?"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"pip":null:"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"inline"}(p,aI.current,ax.current,b);if(null===c){ae("This app does not declare support for the canvas (pip) display mode."),ac(!1),aJ();return}aw.current=c,ag(c),c!==q&&f.sendHostContextChange({displayMode:c});let d=al.current;if(d&&"undefined"!=typeof ResizeObserver){let a=()=>{if(!r()||!aq.current)return;let a=d.getBoundingClientRect();a.width<=0||aI.current&&a.height<=0||f.sendHostContextChange({containerDimensions:J(d,aI.current)})};ar.current?.disconnect(),ar.current=new ResizeObserver(a),ar.current.observe(d),a()}let e=aA.current;az.current=e.updateId??`${e.args??""}\u0000${e.resultContent??""}\u0000${e.cancelledReason??""}\u0000${e.isError??""}`,(void 0!==e.args||void 0!==e.resultContent||void 0!==e.cancelledReason||!0===e.isError)&&aL(f,e.args,e.resultContent,e.cancelledReason,e.isError),ac(!1)},await f.connect(function(a,b){let c=new t.hJ(a,b),d={start:async()=>{c.onmessage=(a,b)=>{d.onmessage?.("ui/message"!==a.method||!a.params||Array.isArray(a.params.content)||!a.params.content||"object"!=typeof a.params.content?a:{...a,params:{...a.params,content:[a.params.content]}},b)},c.onerror=a=>d.onerror?.(a),c.onclose=()=>d.onclose?.(),await c.start()},send:(a,b)=>c.send(a,b),close:()=>c.close(),setProtocolVersion:a=>c.setProtocolVersion?.(a)};return d}(k.contentWindow,k.contentWindow)),!r())return;await f.sendSandboxResourceReady({html:i.html,csp:i.csp,permissions:i.permissions})}catch(c){if(!e())return;w.warn(`Failed to mount MCP App ${b} from ${a}`,c),ae(c instanceof Error?c.message:"Failed to load the app."),ac(!1),aJ()}},[aK,aL,a,aJ,$.palette.mode,c,b]),aN=(0,e.useCallback)(()=>{let a=!_;a||"fullscreen"!==aw.current||(aw.current="inline",ag("inline"),an.current?.sendHostContextChange({displayMode:"inline"})),aa(a),a&&setTimeout(()=>{aM()},0)},[_,aM]);if((0,e.useEffect)(()=>{Y&&!ao.current&&aM()},[Y,aM]),(0,e.useEffect)(()=>{let a=L??`${D??""}\u0000${G??""}\u0000${M??""}\u0000${N??""}`;aq.current&&an.current&&a!==az.current&&(az.current=a,aJ().then(()=>{au.current&&(aI.current||_)&&aM()}))},[_,aM,aJ,D,M,N,G,L]),(0,e.useEffect)(()=>{T&&aq.current&&an.current&&aw.current!==T&&I(T,ax.current,av.current)&&(aw.current=T,ag(T),an.current.sendHostContextChange({displayMode:T}))},[T]),(0,e.useEffect)(()=>{aq.current&&an.current&&an.current?.sendHostContextChange({theme:"dark"===$.palette.mode?"dark":"light"})},[$.palette.mode]),(0,e.useEffect)(()=>{let c=X??`${a}::${b}`;return W?.(c,aJ),()=>W?.(c,null)},[W,a,aJ,X,b]),(0,e.useEffect)(()=>{let b=b=>{let c=b.detail;c?.serverName===a&&(c.config?.enableMcpApps===!1||c.config?.disabled===!0)&&(ae("MCP Apps access was disabled for this server."),ac(!1),aJ().finally(()=>{aI.current&&aH.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",b),()=>{window.removeEventListener("flujo:mcp-server-config-changed",b)}},[a,aJ]),(0,e.useEffect)(()=>(au.current=!0,()=>{au.current=!1,aJ()}),[aJ]),Y)return(0,d.jsxs)(g.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Z?"visible":"hidden",pointerEvents:Z?"auto":"none",flexDirection:"column"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{m:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{flex:1,minHeight:0,width:"100%",display:ad?"none":"block"}})]});let aO=ah.includes("inline")&&ah.includes("fullscreen")&&ak.includes("fullscreen"),aP=ah.includes("inline")&&ah.includes("pip")&&ak.includes("pip")&&!!Q;return(0,d.jsxs)(g.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===af?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,d.jsx)(n.A,{fontSize:"small",color:"primary"}),(0,d.jsxs)(i.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",a]}),(0,d.jsx)(k.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,d.jsx)(o.A,{fontSize:"small",color:"action"})}),(0,d.jsx)(g.default,{sx:{flex:1}}),_&&aP&&(0,d.jsx)(l.A,{size:"small",onClick:aK,children:"Canvas"}),_&&(0,d.jsx)(k.A,{title:aO?"fullscreen"===af?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{size:"small",disabled:!aO,onClick:()=>{let a="fullscreen"===af?"inline":"fullscreen";I(a,ak,ah)&&(aw.current=a,ag(a),an.current?.sendHostContextChange({displayMode:a}))},sx:{minWidth:0},children:"fullscreen"===af?(0,d.jsx)(s.A,{fontSize:"small"}):(0,d.jsx)(r.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{size:"small",onClick:aN,startIcon:_?(0,d.jsx)(q.A,{}):(0,d.jsx)(p.A,{}),children:_?"Hide":"Open app"})]}),(0,d.jsx)(m.A,{in:_,onExited:()=>{aJ()},children:(0,d.jsxs)(g.default,{sx:{p:1,height:"fullscreen"===af?"calc(100vh - 100px)":"auto"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{my:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{width:"100%",height:"fullscreen"===af?"100%":"auto",display:ad?"none":"block"}})]})})]})}},59060:(a,b,c)=>{c.d(b,{Gt:()=>h,Pt:()=>e,q$:()=>g});let d="ui://",e=2097152;function f(a){return"string"==typeof a&&a.length>d.length&&a.slice(0,d.length).toLowerCase()===d&&!/\s/.test(a)}function g(a){if("string"!=typeof a)return!1;let[b,...c]=a.toLowerCase().split(";");if("text/html"!==b.trim())return!1;let d=!1;for(let a of c){let b=a.indexOf("=");if(b<=0)return!1;let c=a.slice(0,b).trim(),e=a.slice(b+1).trim();if(!c||!e)return!1;if("profile"===c){if(d||"mcp-app"!==e)return!1;d=!0}}return d}function h(a){if(!a||"object"!=typeof a)return;let b=a["ui/resourceUri"];if(f(b))return b;for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if(f(a))return a}}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}}};
1
+ "use strict";exports.id=1227,exports.ids=[1227],exports.modules={34641:(a,b,c)=>{c.d(b,{uJ:()=>B,Ay:()=>L,Yw:()=>C});var d=c(21124),e=c(38301),f=c(60839),g=c(81637),h=c(8521),i=c(79515),j=c(88745),k=c(43312),l=c(68730),m=c(99561),n=c(5748),o=c(1994),p=c(17332),q=c(63908),r=c(36636),s=c(93516),t=c(92543),u=c(28055),v=c(59060);let w=(0,c(19815).h)("frontend/components/Chat/McpAppFrame"),x={name:"FLUJO",version:"3.35.0"},y=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],A=new Set(["text"]),B=262144;function C(a){try{return new TextEncoder().encode(JSON.stringify(a)).length}catch{return 1/0}}let D=null;async function E(){return D||(D=fetch("/api/mcp/app-sandbox").then(async a=>{if(!a.ok)throw Error(`Sandbox endpoint discovery failed (${a.status})`);return await a.json()}).catch(a=>{throw D=null,a})),function(a,b){let c;if("string"!=typeof a.token||0===a.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==a.url){if("string"!=typeof a.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{c=new URL(a.url)}catch{throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==c.protocol&&"https:"!==c.protocol||c.username||c.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===b.protocol&&"https:"!==c.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==b.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(a.port)||a.port<1||a.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(c=new URL("/sandbox.html",b.origin)).port=String(a.port)}if(c.origin===b.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return c.searchParams.set("token",a.token),c.href}(await D,window.location)}function F(a,b){let c=[],d=new Set;for(let e of a??[]){if(0===e.length||e.length>2048||/[^\x21-\x7e]/.test(e))continue;let a=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!a||!b.includes(a[1].toLowerCase()))continue;let f=a[3].split(".");if(a[3].length>253||f.some(a=>0===a.length||a.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(a)))continue;let g=a[4]?Number(a[4]):void 0;if(void 0!==g&&(!Number.isInteger(g)||g<1||g>65535))continue;let h=e.toLowerCase();if(!d.has(h)&&(d.add(h),c.push(e),c.length>=64))break}return c}function G(a){if(a)try{return JSON.parse(a)}catch{return}}async function H(a,b,c,d,e){if(await a.sendToolInput({arguments:function(a){let b=G(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:{}}(b)}),void 0!==d)return void await a.sendToolCancelled({reason:d});let f=function(a,b){if(void 0===a)return!0===b?{content:[],isError:!0}:null;let c=G(a);return c&&"object"==typeof c&&Array.isArray(c.content)?{...c,...!0===b?{isError:!0}:{}}:{content:[{type:"text",text:a}],...!0===b?{isError:!0}:{}}}(c,e);f&&await a.sendToolResult(f)}function I(a,b,c){return b.includes(a)&&c.includes(a)}function J(a,b){let c=a.getBoundingClientRect(),d=Math.max(1,Math.round(c.width||a.clientWidth||1));return b?{width:d,height:Math.max(1,Math.round(c.height||a.clientHeight||1))}:{width:d,maxHeight:6e3}}async function K(a,b,c){try{let d=await u.S.listServerTools(a),e=Array.isArray(d.tools)?d.tools:[],f=c?e.find(a=>a?.name===c):e.find(a=>(0,v.Gt)(a?._meta)===b);if(f?.name&&f?.inputSchema&&(0,v.Gt)(f._meta)===b)return{tool:f}}catch(a){w.debug("Could not resolve the full MCP App tool definition",a)}}let L=({serverName:a,uri:b,toolName:c,toolArgs:D,toolResultContent:G,toolUpdateId:L,toolCancelledReason:M,toolIsError:N,onAppMessage:O,onUpdateModelContext:P,onRequestDock:Q,onDockable:R,onAvailableDisplayModes:S,hostDisplayMode:T,onRequestDisplayMode:U,onRequestClose:V,onRegisterTeardown:W,teardownRegistrationKey:X,docked:Y=!1,visible:Z=!0})=>{let $=(0,f.A)(),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(!1),[ad,ae]=(0,e.useState)(null),[af,ag]=(0,e.useState)(Y?"pip":"inline"),[ah,ai]=(0,e.useState)([]),aj=T??af,ak=(0,e.useMemo)(()=>Y?["pip","fullscreen"]:["inline","fullscreen",...Q?["pip"]:[]],[Y,Q]),al=(0,e.useRef)(null),am=(0,e.useRef)(null),an=(0,e.useRef)(null),ao=(0,e.useRef)(!1),ap=(0,e.useRef)(0),aq=(0,e.useRef)(!1),ar=(0,e.useRef)(null),as=(0,e.useRef)(null),at=(0,e.useRef)(!1),au=(0,e.useRef)(!0),av=(0,e.useRef)([]),aw=(0,e.useRef)(aj),ax=(0,e.useRef)(ak),ay=(0,e.useRef)(Promise.resolve()),az=(0,e.useRef)(void 0),aA=(0,e.useRef)({args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L});aA.current={args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L};let aB=(0,e.useRef)(O);(0,e.useEffect)(()=>{aB.current=O},[O]);let aC=(0,e.useRef)(P);(0,e.useEffect)(()=>{aC.current=P},[P]);let aD=(0,e.useRef)(Q);(0,e.useEffect)(()=>{aD.current=Q},[Q]);let aE=(0,e.useRef)(R);(0,e.useEffect)(()=>{aE.current=R},[R]);let aF=(0,e.useRef)(S);(0,e.useEffect)(()=>{aF.current=S},[S]);let aG=(0,e.useRef)(U);(0,e.useEffect)(()=>{aG.current=U},[U]);let aH=(0,e.useRef)(V);(0,e.useEffect)(()=>{aH.current=V},[V]);let aI=(0,e.useRef)(Y);(0,e.useEffect)(()=>{aI.current=Y},[Y]),(0,e.useEffect)(()=>{aw.current=aj},[aj]),(0,e.useEffect)(()=>{ax.current=ak},[ak]);let aJ=(0,e.useCallback)(()=>{if(as.current)return as.current;ap.current+=1;let a=an.current,b=am.current,c=aq.current;an.current=null,am.current=null,aq.current=!1,ao.current=!1,av.current=[],ar.current?.disconnect(),ar.current=null;let d=(async()=>{if(a&&c){let b;try{await Promise.race([a.teardownResource({},{timeout:1e3}),new Promise(a=>{b=setTimeout(a,1e3)})])}catch(a){w.debug("MCP App did not acknowledge resource teardown",a)}finally{b&&clearTimeout(b)}}try{await a?.close()}catch{}b?.remove()})();return as.current=d,d.finally(()=>{as.current===d&&(as.current=null)}),d},[]),aK=(0,e.useCallback)(()=>{!at.current&&aD.current&&(at.current=!0,aJ().then(()=>{au.current&&(aD.current?.(),aa(!1))}).finally(()=>{at.current=!1}))},[aJ]),aL=(0,e.useCallback)((a,b,c,d,e)=>{ay.current=ay.current.catch(()=>void 0).then(async()=>{an.current===a&&aq.current&&await H(a,b,c,d,e)}).catch(a=>{w.warn("MCP App tool delivery failed",a)})},[]),aM=(0,e.useCallback)(async()=>{if(as.current&&await as.current,ao.current||!al.current)return;let d=ap.current+1;ap.current=d;let e=()=>ap.current===d&&ao.current;ao.current=!0,ai([]),ac(!0),ae(null);try{let f,[g,h]=await Promise.all([u.S.readResourceFromApp(a,b),K(a,b,c)]);if(!e())return;if(g?.httpStatus===403)throw Error(g?.error||"MCP Apps access was disabled for this server");if(!g||!1===g.success)throw Error(g?.error||"Failed to read the UI resource.");let i=function(a,b){var c;let d,e=a?.contents;if(!Array.isArray(e)||0===e.length)throw Error("Resource has no contents");let f=e.find(a=>a.uri===b&&"string"==typeof a.mimeType&&(0,v.q$)(a.mimeType)&&("string"==typeof a.text||"string"==typeof a.blob));if(!f)throw Error(`Resource ${b} did not return MCP App HTML`);try{d="string"==typeof f.text?f.text:function(a){let b=Uint8Array.from(atob(a),a=>a.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(b)}(f.blob)}catch{throw Error(`Resource ${b} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(d).length>v.Pt)throw Error(`Resource exceeds the ${Math.round(v.Pt/1024)} KiB size cap`);let g=(f._meta??f.meta)?.ui,h=t.c0.safeParse(g?.csp);if(g?.csp!==void 0&&!h.success)throw Error(`Resource ${b} declares an invalid CSP policy`);let i=t.Ml.safeParse(g?.permissions);if(g?.permissions!==void 0&&!i.success)throw Error(`Resource ${b} declares invalid sandbox permissions`);return{html:d,csp:h.success?{connectDomains:F((c=h.data).connectDomains,["https","wss"]),resourceDomains:F(c.resourceDomains,["https"]),frameDomains:F(c.frameDomains,["https"]),baseUriDomains:F(c.baseUriDomains,["https"])}:void 0,permissions:i.success&&i.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(g.data,b),j=await E();if(!e()||!al.current)return;let k=document.createElement("iframe");k.title=`MCP App: ${b}`,k.setAttribute("sandbox","allow-scripts allow-same-origin"),k.referrerPolicy="origin";let l=(0,t.Sy)(i.permissions);l&&k.setAttribute("allow",l),k.style.cssText=aI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",al.current.appendChild(k),am.current=k;let m=new URL(j);i.csp&&m.searchParams.set("csp",JSON.stringify(i.csp));let n=m.origin,o=new Promise((a,b)=>{let c=setTimeout(()=>{window.removeEventListener("message",d),b(Error("Timed out waiting for the sandbox proxy."))},1e4),d=b=>{b.source===k.contentWindow&&b.origin===n&&b.data?.jsonrpc==="2.0"&&b.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(c),window.removeEventListener("message",d),a())};window.addEventListener("message",d)});if(k.src=m.href,await o,!e()||am.current!==k)return;let p=aw.current,q="inline";aw.current=q,f=new t.T1(function(a,b){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(c,d,e)=>{let{method:f,params:g}=c;if("tools/call"===f){w.info(`MCP App tools/call: ${a}/${g?.name}`);let c=await u.S.callToolFromApp(a,g.name,g.arguments??{},void 0,e?.signal);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${g?.name}`);return c.data}if("resources/read"===f){let c=await u.S.readResourceFromApp(a,g.uri);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Resource read failed: ${g?.uri}`);return c.data}if("resources/list"===f)return{resources:[]};if("resources/templates/list"===f)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${f}`)}}}(a,a=>{ap.current===d&&an.current===f&&(ae(a),ac(!1),aJ())}),x,{openLinks:{},serverTools:{},serverResources:{},logging:{},...aB.current?{message:{text:{}}}:{},...aC.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:i.csp,permissions:i.permissions}},{hostContext:{...h?{toolInfo:h}:{},theme:"dark"===$.palette.mode?"dark":"light",platform:"web",displayMode:q,availableDisplayModes:ax.current,containerDimensions:J(al.current,aI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}}),an.current=f;let r=()=>e()&&an.current===f;if(f.onopenlink=async({url:c})=>{if(!r())return{isError:!0};let d=function(a){try{let b=new URL(a);if(!y.has(b.protocol)||b.username||b.password)return null;return b.href}catch{return null}}(c);if(!d)return w.warn("MCP App open-link rejected by URL policy",{serverName:a,uri:b}),{isError:!0};let e=window.open(d,"_blank","noopener,noreferrer");return e?(e.opener=null,{}):{isError:!0}},f.ondownloadfile=async({contents:a})=>{if(!r())return{isError:!0};try{for(let b of a??[]){let a,c=b?.resource;if(!c)continue;let d=("string"==typeof c.uri?c.uri.split("/").pop():"")||"download",e="string"==typeof c.mimeType?c.mimeType:"application/octet-stream";if("string"==typeof c.blob){let b=Uint8Array.from(atob(c.blob),a=>a.charCodeAt(0));a=new Blob([b],{type:e})}else a=new Blob([String(c.text??"")],{type:e});let f=URL.createObjectURL(a),g=document.createElement("a");g.href=f,g.download=d,document.body.appendChild(g),g.click(),g.remove(),setTimeout(()=>URL.revokeObjectURL(f),4e3)}return{}}catch(a){return w.warn("MCP App download failed",a),{isError:!0}}},f.onloggingmessage=a=>{r()&&w.debug("MCP App log",a?.data)},f.onmessage=async a=>{if(!r())return{};if(!aB.current)throw Error("This host cannot deliver ui/message in this surface");let b=function(a){if(a?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let b=a?.content,c=Array.isArray(b)?b:b&&"object"==typeof b?[b]:[];if(0===c.length||c.some(a=>a?.type!=="text"||"string"!=typeof a.text))throw Error("This host accepts text-only ui/message content");let d=c.map(a=>a.text).join("\n").trim();if(!d)throw Error("ui/message text must not be empty");return d}(a);if(!await aB.current(b))throw Error("ui/message was not delivered");return{}},f.onupdatemodelcontext=async c=>{if(!r())return{};let d=function(a){if(!a||"object"!=typeof a||Array.isArray(a))return"ui/update-model-context params must be an object";if(void 0!==a.content){if(!Array.isArray(a.content))return"Model context content must be an array";for(let b of a.content)if(!b||"object"!=typeof b||Array.isArray(b)||!A.has(b.type))return"Model context contains a modality this host did not advertise"}return void 0!==a.structuredContent&&(!a.structuredContent||"object"!=typeof a.structuredContent||Array.isArray(a.structuredContent))?"Model structuredContent must be an object":C(a)>B?`Model context exceeds ${B} bytes`:null}(c);if(d)throw Error(d);let e=`${a}::${b}`;if(!aC.current)throw Error("This host cannot preserve model context in this surface");if(!await aC.current(e,c))throw Error("MCP App model context was not stored");return{}},f.onsizechange=async({width:a,height:b})=>{if(!r()||aI.current)return;let c=al.current?.getBoundingClientRect().width||al.current?.clientWidth||0,d=function(a,b){let c={};if(Number.isFinite(a.width)&&a.width>0){let d=Number.isFinite(b)&&b>0?b:6e3;c.width=Math.min(a.width,d,6e3)}return Number.isFinite(a.height)&&a.height>0&&(c.height=Math.min(a.height,6e3)),c}({width:a,height:b},c);void 0!==d.height&&(k.style.height=`${d.height}px`),void 0!==d.width&&(k.style.width=`${d.width}px`,k.style.maxWidth="100%")},f.onrequestdisplaymode=async({mode:a})=>{if(!r())return{mode:aw.current};let b=aw.current,c=av.current;if(!I(a,ax.current,c))return{mode:b};if("pip"===a&&!aI.current&&aD.current)return setTimeout(aK,0),{mode:b};let d=b;return(d=aG.current?await aG.current(a,[...c]):a)===b||I(d,ax.current,c)||(d=b),d!==b&&(aw.current=d,ag(d),await f.sendHostContextChange({displayMode:d})),{mode:d}},f.onrequestteardown=()=>{r()&&aJ().finally(()=>{aH.current?aH.current():(aw.current="inline",ag("inline"),aa(!1))})},f.oninitialized=()=>{if(!r())return;let a=f.getAppCapabilities()?.availableDisplayModes,b=Array.isArray(a)?[...new Set(a.filter(a=>z.includes(a)))]:[];av.current=b,ai(b),aE.current?.(b.includes("pip")),aF.current?.([...b]),aq.current=!0;let c=function(a,b,c,d){return b?I("pip",c,d)?"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"pip":null:"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"inline"}(p,aI.current,ax.current,b);if(null===c){ae("This app does not declare support for the canvas (pip) display mode."),ac(!1),aJ();return}aw.current=c,ag(c),c!==q&&f.sendHostContextChange({displayMode:c});let d=al.current;if(d&&"undefined"!=typeof ResizeObserver){let a=()=>{if(!r()||!aq.current)return;let a=d.getBoundingClientRect();a.width<=0||aI.current&&a.height<=0||f.sendHostContextChange({containerDimensions:J(d,aI.current)})};ar.current?.disconnect(),ar.current=new ResizeObserver(a),ar.current.observe(d),a()}let e=aA.current;az.current=e.updateId??`${e.args??""}\u0000${e.resultContent??""}\u0000${e.cancelledReason??""}\u0000${e.isError??""}`,(void 0!==e.args||void 0!==e.resultContent||void 0!==e.cancelledReason||!0===e.isError)&&aL(f,e.args,e.resultContent,e.cancelledReason,e.isError),ac(!1)},await f.connect(function(a,b){let c=new t.hJ(a,b),d={start:async()=>{c.onmessage=(a,b)=>{d.onmessage?.("ui/message"!==a.method||!a.params||Array.isArray(a.params.content)||!a.params.content||"object"!=typeof a.params.content?a:{...a,params:{...a.params,content:[a.params.content]}},b)},c.onerror=a=>d.onerror?.(a),c.onclose=()=>d.onclose?.(),await c.start()},send:(a,b)=>c.send(a,b),close:()=>c.close(),setProtocolVersion:a=>c.setProtocolVersion?.(a)};return d}(k.contentWindow,k.contentWindow)),!r())return;await f.sendSandboxResourceReady({html:i.html,csp:i.csp,permissions:i.permissions})}catch(c){if(!e())return;w.warn(`Failed to mount MCP App ${b} from ${a}`,c),ae(c instanceof Error?c.message:"Failed to load the app."),ac(!1),aJ()}},[aK,aL,a,aJ,$.palette.mode,c,b]),aN=(0,e.useCallback)(()=>{let a=!_;a||"fullscreen"!==aw.current||(aw.current="inline",ag("inline"),an.current?.sendHostContextChange({displayMode:"inline"})),aa(a),a&&setTimeout(()=>{aM()},0)},[_,aM]);if((0,e.useEffect)(()=>{Y&&!ao.current&&aM()},[Y,aM]),(0,e.useEffect)(()=>{let a=L??`${D??""}\u0000${G??""}\u0000${M??""}\u0000${N??""}`;aq.current&&an.current&&a!==az.current&&(az.current=a,aJ().then(()=>{au.current&&(aI.current||_)&&aM()}))},[_,aM,aJ,D,M,N,G,L]),(0,e.useEffect)(()=>{T&&aq.current&&an.current&&aw.current!==T&&I(T,ax.current,av.current)&&(aw.current=T,ag(T),an.current.sendHostContextChange({displayMode:T}))},[T]),(0,e.useEffect)(()=>{aq.current&&an.current&&an.current?.sendHostContextChange({theme:"dark"===$.palette.mode?"dark":"light"})},[$.palette.mode]),(0,e.useEffect)(()=>{let c=X??`${a}::${b}`;return W?.(c,aJ),()=>W?.(c,null)},[W,a,aJ,X,b]),(0,e.useEffect)(()=>{let b=b=>{let c=b.detail;c?.serverName===a&&(c.config?.enableMcpApps===!1||c.config?.disabled===!0)&&(ae("MCP Apps access was disabled for this server."),ac(!1),aJ().finally(()=>{aI.current&&aH.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",b),()=>{window.removeEventListener("flujo:mcp-server-config-changed",b)}},[a,aJ]),(0,e.useEffect)(()=>(au.current=!0,()=>{au.current=!1,aJ()}),[aJ]),Y)return(0,d.jsxs)(g.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Z?"visible":"hidden",pointerEvents:Z?"auto":"none",flexDirection:"column"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{m:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{flex:1,minHeight:0,width:"100%",display:ad?"none":"block"}})]});let aO=ah.includes("inline")&&ah.includes("fullscreen")&&ak.includes("fullscreen"),aP=ah.includes("inline")&&ah.includes("pip")&&ak.includes("pip")&&!!Q;return(0,d.jsxs)(g.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===af?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,d.jsx)(n.A,{fontSize:"small",color:"primary"}),(0,d.jsxs)(i.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",a]}),(0,d.jsx)(k.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,d.jsx)(o.A,{fontSize:"small",color:"action"})}),(0,d.jsx)(g.default,{sx:{flex:1}}),_&&aP&&(0,d.jsx)(l.A,{size:"small",onClick:aK,children:"Canvas"}),_&&(0,d.jsx)(k.A,{title:aO?"fullscreen"===af?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{size:"small",disabled:!aO,onClick:()=>{let a="fullscreen"===af?"inline":"fullscreen";I(a,ak,ah)&&(aw.current=a,ag(a),an.current?.sendHostContextChange({displayMode:a}))},sx:{minWidth:0},children:"fullscreen"===af?(0,d.jsx)(s.A,{fontSize:"small"}):(0,d.jsx)(r.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{size:"small",onClick:aN,startIcon:_?(0,d.jsx)(q.A,{}):(0,d.jsx)(p.A,{}),children:_?"Hide":"Open app"})]}),(0,d.jsx)(m.A,{in:_,onExited:()=>{aJ()},children:(0,d.jsxs)(g.default,{sx:{p:1,height:"fullscreen"===af?"calc(100vh - 100px)":"auto"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{my:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{width:"100%",height:"fullscreen"===af?"100%":"auto",display:ad?"none":"block"}})]})})]})}},59060:(a,b,c)=>{c.d(b,{Gt:()=>h,Pt:()=>e,q$:()=>g});let d="ui://",e=2097152;function f(a){return"string"==typeof a&&a.length>d.length&&a.slice(0,d.length).toLowerCase()===d&&!/\s/.test(a)}function g(a){if("string"!=typeof a)return!1;let[b,...c]=a.toLowerCase().split(";");if("text/html"!==b.trim())return!1;let d=!1;for(let a of c){let b=a.indexOf("=");if(b<=0)return!1;let c=a.slice(0,b).trim(),e=a.slice(b+1).trim();if(!c||!e)return!1;if("profile"===c){if(d||"mcp-app"!==e)return!1;d=!0}}return d}function h(a){if(!a||"object"!=typeof a)return;let b=a["ui/resourceUri"];if(f(b))return b;for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if(f(a))return a}}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}}};
@@ -1,5 +1,5 @@
1
- "use strict";exports.id=166,exports.ids=[166,8092],exports.modules={40166:(a,b,c)=>{let d,e;c.d(b,{bashCallTool:()=>K,bashToolDefinitions:()=>D});var f=c(33873),g=c.n(f),h=c(29021),i=c.n(h),j=c(79646),k=c(18230);let l=(0,k.h)("utils/process/killProcessTree");function m(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,j.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>l.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){l.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let d=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return d.unref?.(),()=>clearTimeout(d)}var n=c(85510),o=c(94749),p=c(48092),q=c(65858);let r=(0,k.h)("backend/services/mcp/internal/bashTools");function s(a){let b=process.env[a];if(void 0!==b)return b;let c=Object.keys(process.env).find(b=>b.toLowerCase()===a.toLowerCase());return c?process.env[c]:void 0}function t(a){let b=(s("PATH")??"").split(g().delimiter).filter(Boolean),c="win32"===process.platform?(s("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 u(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function v(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}let w=["FLUJO_BASH_ROOTS","FLUJO_FS_ROOTS"];async function x(a,b){let c=(0,n.getDataDir)(),d="string"==typeof a?a.trim():"",e=d?g().isAbsolute(d)?g().resolve(d):g().resolve(c,d):c;if(await (0,q.cd)()){let a=(0,q.bz)(e);if(a.denied)throw Error(`cwd "${e}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${q.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,p.F)(a,e)))throw Error(`cwd "${e}" is outside the configured bash roots.`);return e}async function y(a,b,c){let d=[],e=await (0,q.cd)(),f=new Set,h=(a.match(/(?:[A-Za-z]:[\\/][^\s"']*|\\\\[^\s"']+|~\/[^\s"']*|(?<![\w.])\/[^\s"']+)/g)??[]).filter(a=>!("win32"===process.platform&&/^\/[A-Za-z]$/.test(a))),i=(()=>{try{return(0,n.getHomeDir)()}catch{return""}})();for(let a of h){let h,j=a;j.startsWith("~/")&&i&&(j=g().join(i,j.slice(2)));try{h=g().isAbsolute(j)?g().resolve(j):g().resolve(b,j)}catch{continue}if(f.has(h))continue;f.add(h);let k=e?(0,q.bz)(h):{denied:!1};k.denied?d.push(`Command references "${a}", which is inside a protected location (${k.matchedRoot}).`):c.length>0&&!c.some(a=>(0,p.F)(a,h))&&d.push(`Command references "${a}", which is outside the configured working roots.`)}return d}let z=new Set(["PATH","Path","HOME","USERPROFILE","TMP","TEMP","TMPDIR","LANG","LC_ALL","SystemRoot","windir","ComSpec","PATHEXT","SystemDrive","NUMBER_OF_PROCESSORS","PROCESSOR_ARCHITECTURE"]);function A(a){return"pwsh"===a||"bash"===a?a:"default"}function B(a,b,c){let{file:f,args:h,useShell:k,effectiveShell:l,unavailableShell:m}=function(a,b){if("pwsh"===b){let b=void 0!==e?e:e=t("pwsh");return b?{file:b,args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1,effectiveShell:"pwsh"}:{file:"",args:[],useShell:!1,effectiveShell:"pwsh",unavailableShell:"pwsh"}}if("bash"===b){let b=function(){if(void 0!==d)return d;let a=t("bash");return a||"win32"!==process.platform||(a=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData].filter(a=>!!a).flatMap(a=>[g().join(a,"Git","bin","bash.exe"),g().join(a,"Git","usr","bin","bash.exe"),g().join(a,"Programs","Git","bin","bash.exe"),g().join(a,"Programs","Git","usr","bin","bash.exe")]).find(a=>{try{return i().statSync(a).isFile()}catch{return!1}})??null),d=a,a}();return b?{file:b,args:["-c",a],useShell:!1,effectiveShell:"bash"}:{file:"",args:[],useShell:!1,effectiveShell:"bash",unavailableShell:"bash"}}return{file:a,args:[],useShell:!0,effectiveShell:"default"}}(a,c);if(m)return{effectiveShell:l,unavailableShell:m};let n="win32"!==process.platform;try{return{child:(0,j.spawn)(f,h,{cwd:b,shell:k,env:function(){var a;if("string"==typeof(a=process.env.FLUJO_BASH_INHERIT_ENV)&&/^(1|true|yes|on)$/i.test(a.trim()))return process.env;let b={};for(let a of Object.keys(process.env))(z.has(a)||/^LC_/.test(a))&&(b[a]=process.env[a]);return b}(),detached:n}),effectiveShell:l}}catch(a){return{startError:a instanceof Error?a.message:String(a),effectiveShell:l}}}function C(a,b){return c=>{let d=a();if(d.length>=1e5)return;let e=!1;(d+=c).length>1e5&&(d=d.slice(0,1e5)+"\n…[output truncated]",e=!0),b(d,e)}}function D(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Explicit shells return an error if unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory. When bash roots are configured (via the MCP manager, or the FLUJO_BASH_ROOTS / FLUJO_FS_ROOTS env hard ceiling) a cwd outside them is rejected."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function E(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function F(a,b){let c=String(a?.command??"").trim();if(!c)return v({error:'Provide "command": a shell command line to run.'},!0);let d=await x(a.cwd,b),e=await y(c,d,b),f=e.length?{warnings:e}:{},g=A(a.shell),h=!0===a.normalizeNewlines,i=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let b,e="",j=!1,k=!1,l=!1,n=C(()=>e,(a,b)=>{e=a,j=b||j}),{child:o,startError:p,effectiveShell:q,unavailableShell:r}=B(c,d,g);if(r)return void a(v({error:`Requested shell "${r}" is unavailable or could not be resolved.`,cwd:d,shell:r},!0));if(p||!o)return void a(v({error:`Failed to start command (${q}): ${p??"unknown error"}`,cwd:d,shell:q},!0));let s=setTimeout(()=>{l=!0,b=m(o)},i),t=c=>{k||(k=!0,clearTimeout(s),b?.(),a(c))};o.stdout?.on("data",a=>n(a.toString())),o.stderr?.on("data",a=>n(a.toString())),o.on("error",a=>{n(`
2
- ${a.message}`),t(v({error:`Command failed to start (${q}): ${a.message}`,cwd:d,shell:q,output:E(e,h)},!0))}),o.on("close",a=>{let b=E(e,h);if(l)return void t(v({timedOut:!0,cwd:d,shell:q,exitCode:a,truncated:j,output:`${b}
3
- [killed after ${i/1e3}s timeout]`,...f},!0));t(v({exitCode:a,cwd:d,shell:q,truncated:j,output:b,...f},0!==a))})})}function G(a){a.reapTimer=setTimeout(()=>{u().delete(a.id)},6e5),a.reapTimer.unref?.()}async function H(a,b){let c=String(a?.command??"").trim();if(!c)return v({error:'Provide "command": a shell command line to run.'},!0);let d=u();if(d.size>=25)for(let[a,b]of d)b.running||d.delete(a);if(d.size>=25)return v({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 u().values()){if(a.running)try{m(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let e=await x(a.cwd,b),f=await y(c,e,b),g=f.length?{warnings:f}:{},{child:h,startError:i,effectiveShell:j,unavailableShell:k}=B(c,e,A(a.shell));if(k)return v({error:`Requested shell "${k}" is unavailable or could not be resolved.`,cwd:e,shell:k},!0);if(i||!h)return v({error:`Failed to start command (${j}): ${i??"unknown error"}`,cwd:e,shell:j},!0);let l=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={id:l,command:c,cwd:e,child:h,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};d.set(l,n);let o=C(()=>n.output,(a,b)=>{n.output=a,n.truncated=b||n.truncated});return h.stdout?.on("data",a=>o(a.toString())),h.stderr?.on("data",a=>o(a.toString())),h.on("error",a=>{o(`
4
- ${a.message}`),n.running=!1,n.endedAt=Date.now(),G(n)}),h.on("close",a=>{n.running=!1,n.exitCode=a,n.endedAt=Date.now(),G(n)}),v({sessionId:l,cwd:e,shell:j,...g})}function I(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function J(a){let b=String(a?.sessionId??""),c=u().get(b);if(!c)return v({error:`No background session with id "${b}".`},!0);if(!c.running)return v(I(c,{timedOut:!1}));let d=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5),e=await new Promise(a=>{let b=Date.now(),e=()=>c.running?Date.now()-b>=d?a(!0):void setTimeout(e,100):a(!1);e()});return v(I(c,{timedOut:e}))}async function K(a,b,c){try{switch(a){case"run":{let a=await (0,p.loadEffectiveRoots)(o.PA,w,c);return await F(b,a)}case"start":{let a=await (0,p.loadEffectiveRoots)(o.PA,w,c);return await H(b,a)}case"status":let d=String(b?.sessionId??""),e=u().get(d);return e?v(I(e)):v({error:`No background session with id "${d}".`},!0);case"wait":return await J(b);case"write_stdin":let f=String(b?.sessionId??""),g=u().get(f);if(!g)return v({error:`No background session with id "${f}".`},!0);if(!g.running)return v({error:`Session "${f}" has already exited.`},!0);let h="string"==typeof b.data?b.data:"",i=!1===b.newline?h:`${h}
5
- `;try{g.child.stdin?.write(i)}catch(a){return v({error:`Failed to write to stdin: ${a instanceof Error?a.message:String(a)}`},!0)}return v({sessionId:f,written:Buffer.byteLength(i,"utf8")});case"kill":let j=String(b?.sessionId??""),k=u().get(j);return k?(k.running&&(k.cancelEscalation=m(k.child)),v({sessionId:j,killed:!0})):v({error:`No background session with id "${j}".`},!0);case"list_sessions":return v({sessions:Array.from(u().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 v({error:`Unknown tool on the built-in bash server: ${a}`},!0)}}catch(b){return r.warn("bashCallTool failed",{toolName:a,err:b}),v({error:`Tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},48092:(a,b,c)=>{c.d(b,{F:()=>j,loadEffectiveRoots:()=>l});var d=c(33873),e=c.n(d),f=c(79551),g=c(18230),h=c(94749);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,87507)),g=(await d(a)).trim();if(!g)return null;if(g.startsWith("file://"))try{return e().resolve((0,f.fileURLToPath)(g))}catch(a){return i.warn(`resolveRootToPath: could not parse file URI "${g}"`,a),null}return e().isAbsolute(g)?e().resolve(g):e().resolve(b,g)}async function l(a,b,d){let{getDataDir:f}=await Promise.resolve().then(c.bind(c,85510)),g=f(),l=function(a){for(let b of Array.isArray(a)?a:[a]){let a=process.env[b];if(!a||!a.trim())continue;let c=a.split(e().delimiter).map(a=>a.trim()).filter(Boolean).map(a=>e().resolve(a));if(c.length)return c}return null}(b),m=[];try{for(let b of(await (0,h.AC)(a)))m.push(e().isAbsolute(b)?e().resolve(b):e().resolve(g,b))}catch(a){i.warn("loadEffectiveRoots: could not read persisted roots",a)}try{let{getNodeRoots:b,getNodeRootsForId:e}=await Promise.resolve().then(c.bind(c,28181));for(let c of void 0!==d?(()=>{let c=e(a,d);return c.length>0?c:b(a)})():b(a)){let a=await k(c,g);a&&m.push(a)}}catch(a){i.warn("loadEffectiveRoots: could not read node roots",a)}let n=Array.from(new Set(m));if(!l)return 0===n.length?[g]:n;let o=n.filter(a=>l.some(b=>j(b,a)));return o.length?o:l}},65858:(a,b,c)=>{c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(85510),i=c(79111),j=c(31296),k=c(48092);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.YM)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}}};
1
+ exports.id=166,exports.ids=[166,8092],exports.modules={40166:(a,b,c)=>{"use strict";let d,e;c.d(b,{bashCallTool:()=>L,bashToolDefinitions:()=>E});var f=c(33873),g=c.n(f),h=c(29021),i=c.n(h),j=c(79646),k=c(18230);let l=(0,k.h)("utils/process/killProcessTree");function m(a,b=2e3){let c=a.pid;if(void 0===c)return()=>{};if("win32"===process.platform){try{(0,j.spawn)("taskkill",["/pid",String(c),"/T","/F"]).on("error",a=>l.debug(`taskkill failed for pid ${c}: ${a.message}`))}catch(a){l.debug(`taskkill spawn threw for pid ${c}: ${a instanceof Error?a.message:String(a)}`)}return()=>{}}try{process.kill(-c,"SIGTERM")}catch{}let d=setTimeout(()=>{try{process.kill(-c,"SIGKILL")}catch{}},b);return d.unref?.(),()=>clearTimeout(d)}var n=c(85510),o=c(94749),p=c(48092),q=c(65858);let r=(0,k.h)("backend/services/mcp/internal/bashTools");function s(a){let b=process.env[a];if(void 0!==b)return b;let c=Object.keys(process.env).find(b=>b.toLowerCase()===a.toLowerCase());return c?process.env[c]:void 0}function t(a){let b=(s("PATH")??"").split(g().delimiter).filter(Boolean),c="win32"===process.platform?(s("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 u(){return global.__flujo_bash_sessions||(global.__flujo_bash_sessions=new Map),global.__flujo_bash_sessions}function v(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}let w=["FLUJO_BASH_ROOTS","FLUJO_FS_ROOTS"];async function x(a,b){let c=(0,n.getDataDir)(),d="string"==typeof a?a.trim():"",e=d?g().isAbsolute(d)?g().resolve(d):g().resolve(c,d):c;if(await (0,q.cd)()){let a=(0,q.bz)(e);if(a.denied)throw Error(`cwd "${e}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${q.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,p.F)(a,e)))throw Error(`cwd "${e}" is outside the configured bash roots.`);return e}async function y(a,b,c){let d=[],e=await (0,q.cd)(),f=new Set,h=((function(a){let b=[...a],c=[...a.matchAll(/"(?:\\.|[^"\\])*"|'[^']*'|[^\s]+/g)],d=!1;for(let a of c){let c=a[0],e=a.index??0,f=c.length>=2&&(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))?c.slice(1,-1):c,g=0;if(d)d=!1;else if("-g"===f||"--glob"===f||"--iglob"===f){d=!0;continue}else{if(!/^(?:--glob|--iglob)=/.test(f))continue;g=c.indexOf("=")+1}for(let a=e+g;a<e+c.length;a+=1)b[a]=" "}return b.join("")})(a).match(/(?:[A-Za-z]:[\\/][^\s"']*|\\\\[^\s"']+|~\/[^\s"']*|(?<![\w.])\/[^\s"']+)/g)??[]).filter(a=>!("win32"===process.platform&&/^\/[A-Za-z]$/.test(a))),i=(()=>{try{return(0,n.getHomeDir)()}catch{return""}})();for(let a of h){let h,j=a;j.startsWith("~/")&&i&&(j=g().join(i,j.slice(2)));try{h=g().isAbsolute(j)?g().resolve(j):g().resolve(b,j)}catch{continue}if(f.has(h))continue;f.add(h);let k=e?(0,q.bz)(h):{denied:!1};k.denied?d.push(`Command references "${a}", which is inside a protected location (${k.matchedRoot}).`):c.length>0&&!c.some(a=>(0,p.F)(a,h))&&d.push(`Command references "${a}", which is outside the configured working roots.`)}return d}let z=new Set(["PATH","Path","HOME","USERPROFILE","TMP","TEMP","TMPDIR","LANG","LC_ALL","SystemRoot","windir","ComSpec","PATHEXT","SystemDrive","NUMBER_OF_PROCESSORS","PROCESSOR_ARCHITECTURE"]),A={win32:{x64:["@openai/codex-win32-x64","x86_64-pc-windows-msvc"],arm64:["@openai/codex-win32-arm64","aarch64-pc-windows-msvc"]},darwin:{x64:["@openai/codex-darwin-x64","x86_64-apple-darwin"],arm64:["@openai/codex-darwin-arm64","aarch64-apple-darwin"]},linux:{x64:["@openai/codex-linux-x64","x86_64-unknown-linux-musl"],arm64:["@openai/codex-linux-arm64","aarch64-unknown-linux-musl"]}};function B(a){return"pwsh"===a||"bash"===a?a:"default"}function C(a,b,f){let{file:h,args:k,useShell:l,effectiveShell:m,unavailableShell:o}=function(a,b){if("pwsh"===b){let b=void 0!==e?e:e=t("pwsh");return b?{file:b,args:["-NoProfile","-NonInteractive","-Command",a],useShell:!1,effectiveShell:"pwsh"}:{file:"",args:[],useShell:!1,effectiveShell:"pwsh",unavailableShell:"pwsh"}}if("bash"===b){let b=function(){if(void 0!==d)return d;let a=t("bash");return a||"win32"!==process.platform||(a=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData].filter(a=>!!a).flatMap(a=>[g().join(a,"Git","bin","bash.exe"),g().join(a,"Git","usr","bin","bash.exe"),g().join(a,"Programs","Git","bin","bash.exe"),g().join(a,"Programs","Git","usr","bin","bash.exe")]).find(a=>{try{return i().statSync(a).isFile()}catch{return!1}})??null),d=a,a}();return b?{file:b,args:["-c",a],useShell:!1,effectiveShell:"bash"}:{file:"",args:[],useShell:!1,effectiveShell:"bash",unavailableShell:"bash"}}return{file:a,args:[],useShell:!0,effectiveShell:"default"}}(a,f);if(o)return{effectiveShell:m,unavailableShell:o};let p="win32"!==process.platform;try{return{child:(0,j.spawn)(h,k,{cwd:b,shell:l,env:function(){var a;let b="string"==typeof(a=process.env.FLUJO_BASH_INHERIT_ENV)&&/^(1|true|yes|on)$/i.test(a.trim())?{...process.env}:Object.fromEntries(Object.entries(process.env).filter(([a])=>z.has(a)||/^LC_/.test(a))),d=s("PATH")??"";if(b.PATH=[...[g().join((0,n.getDataDir)(),"bash-utils"),function(){let a=A[process.platform]?.[process.arch];if(!a)return null;try{let b=c(85781).resolve(`${a[0]}/package.json`),d=g().join(g().dirname(b),"vendor",a[1],"codex-path"),e=g().join(d,"win32"===process.platform?"rg.exe":"rg");return i().statSync(e).isFile()?d:null}catch{return null}}()].filter(a=>!!a).filter(a=>{try{return i().statSync(a).isDirectory()}catch{return!1}}),d].filter(Boolean).join(g().delimiter),"win32"===process.platform)for(let a of Object.keys(b))"PATH"!==a&&"path"===a.toLowerCase()&&delete b[a];return b}(),detached:p}),effectiveShell:m}}catch(a){return{startError:a instanceof Error?a.message:String(a),effectiveShell:m}}}function D(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 E(){let a={type:"string",enum:["default","pwsh","bash"],description:'Which shell to use: "default" (the OS shell), "pwsh" (PowerShell 7+), or "bash". Explicit shells return an error if unavailable.'},b={type:"string",description:"Working directory. Relative paths resolve against the FLUJO data directory. Defaults to the data directory. When bash roots are configured (via the MCP manager, or the FLUJO_BASH_ROOTS / FLUJO_FS_ROOTS env hard ceiling) a cwd outside them is rejected."};return[{name:"run",description:"Run a shell command to completion and return combined stdout/stderr plus the exit code. Pipes and chained commands work. Killed if it exceeds the timeout; large output is truncated. Returns { exitCode, cwd, shell, output, timedOut }.",inputSchema:{type:"object",properties:{command:{type:"string",description:'The command line to execute, e.g. "grep -r foo ." or "curl -s https://…".'},cwd:b,shell:a,timeout:{type:"number",description:"Timeout in seconds (default 60, max 600)."},normalizeNewlines:{type:"boolean",description:"If true, CRLF/CR in the captured output are normalized to LF."}},required:["command"]}},{name:"start",description:"Start a command in the BACKGROUND and return immediately with a { sessionId }. Use status/wait to observe it, write_stdin to feed it input, and kill to stop it.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command line to execute in the background."},cwd:b,shell:a},required:["command"]}},{name:"status",description:"Return the current state of a background session: { sessionId, running, exitCode, output, truncated }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"wait",description:"Wait until a background session finishes (or the timeout elapses). Returns { sessionId, running, exitCode, output, truncated, timedOut }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},timeout:{type:"number",description:"Max seconds to wait (default 60, max 600)."}},required:["sessionId"]}},{name:"write_stdin",description:'Write a string to a running background session\'s stdin. Pass "newline": false to omit the trailing newline. Returns { sessionId, written }.',inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."},data:{type:"string",description:"Text to write to stdin."},newline:{type:"boolean",description:"Append a trailing newline (default true)."}},required:["sessionId","data"]}},{name:"kill",description:"Kill a background session (and its whole process tree). Returns { sessionId, killed }.",inputSchema:{type:"object",properties:{sessionId:{type:"string",description:"The id returned by start."}},required:["sessionId"]}},{name:"list_sessions",description:"List all known background sessions with their state. Returns { sessions: [{ sessionId, command, running, exitCode, startedAt, endedAt }] }.",inputSchema:{type:"object",properties:{}}}]}function F(a,b){return b?a.replace(/\r\n?/g,"\n"):a}async function G(a,b){let c=String(a?.command??"").trim();if(!c)return v({error:'Provide "command": a shell command line to run.'},!0);let d=await x(a.cwd,b),e=await y(c,d,b),f=e.length?{warnings:e}:{},g=B(a.shell),h=!0===a.normalizeNewlines,i=Math.min(1e3*("number"==typeof a.timeout&&a.timeout>0?a.timeout:60),6e5);return await new Promise(a=>{let b,e="",j=!1,k=!1,l=!1,n=D(()=>e,(a,b)=>{e=a,j=b||j}),{child:o,startError:p,effectiveShell:q,unavailableShell:r}=C(c,d,g);if(r)return void a(v({error:`Requested shell "${r}" is unavailable or could not be resolved.`,cwd:d,shell:r},!0));if(p||!o)return void a(v({error:`Failed to start command (${q}): ${p??"unknown error"}`,cwd:d,shell:q},!0));let s=setTimeout(()=>{l=!0,b=m(o)},i),t=c=>{k||(k=!0,clearTimeout(s),b?.(),a(c))};o.stdout?.on("data",a=>n(a.toString())),o.stderr?.on("data",a=>n(a.toString())),o.on("error",a=>{n(`
2
+ ${a.message}`),t(v({error:`Command failed to start (${q}): ${a.message}`,cwd:d,shell:q,output:F(e,h)},!0))}),o.on("close",a=>{let b=F(e,h);if(l)return void t(v({timedOut:!0,cwd:d,shell:q,exitCode:a,truncated:j,output:`${b}
3
+ [killed after ${i/1e3}s timeout]`,...f},!0));t(v({exitCode:a,cwd:d,shell:q,truncated:j,output:b,...f},0!==a))})})}function H(a){a.reapTimer=setTimeout(()=>{u().delete(a.id)},6e5),a.reapTimer.unref?.()}async function I(a,b){let c=String(a?.command??"").trim();if(!c)return v({error:'Provide "command": a shell command line to run.'},!0);let d=u();if(d.size>=25)for(let[a,b]of d)b.running||d.delete(a);if(d.size>=25)return v({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 u().values()){if(a.running)try{m(a.child)}catch{}a.reapTimer&&clearTimeout(a.reapTimer)}})();process.on("exit",a),process.on("SIGINT",a),process.on("SIGTERM",a)}();let e=await x(a.cwd,b),f=await y(c,e,b),g=f.length?{warnings:f}:{},{child:h,startError:i,effectiveShell:j,unavailableShell:k}=C(c,e,B(a.shell));if(k)return v({error:`Requested shell "${k}" is unavailable or could not be resolved.`,cwd:e,shell:k},!0);if(i||!h)return v({error:`Failed to start command (${j}): ${i??"unknown error"}`,cwd:e,shell:j},!0);let l=`bash-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,n={id:l,command:c,cwd:e,child:h,output:"",truncated:!1,running:!0,exitCode:null,startedAt:Date.now()};d.set(l,n);let o=D(()=>n.output,(a,b)=>{n.output=a,n.truncated=b||n.truncated});return h.stdout?.on("data",a=>o(a.toString())),h.stderr?.on("data",a=>o(a.toString())),h.on("error",a=>{o(`
4
+ ${a.message}`),n.running=!1,n.endedAt=Date.now(),H(n)}),h.on("close",a=>{n.running=!1,n.exitCode=a,n.endedAt=Date.now(),H(n)}),v({sessionId:l,cwd:e,shell:j,...g})}function J(a,b={}){return{sessionId:a.id,running:a.running,exitCode:a.exitCode,output:a.output,truncated:a.truncated,...b}}async function K(a){let b=String(a?.sessionId??""),c=u().get(b);if(!c)return v({error:`No background session with id "${b}".`},!0);if(!c.running)return v(J(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 v(J(c,{timedOut:e}))}async function L(a,b,c){try{switch(a){case"run":{let a=await (0,p.loadEffectiveRoots)(o.PA,w,c);return await G(b,a)}case"start":{let a=await (0,p.loadEffectiveRoots)(o.PA,w,c);return await I(b,a)}case"status":let d=String(b?.sessionId??""),e=u().get(d);return e?v(J(e)):v({error:`No background session with id "${d}".`},!0);case"wait":return await K(b);case"write_stdin":let f=String(b?.sessionId??""),g=u().get(f);if(!g)return v({error:`No background session with id "${f}".`},!0);if(!g.running)return v({error:`Session "${f}" has already exited.`},!0);let h="string"==typeof b.data?b.data:"",i=!1===b.newline?h:`${h}
5
+ `;try{g.child.stdin?.write(i)}catch(a){return v({error:`Failed to write to stdin: ${a instanceof Error?a.message:String(a)}`},!0)}return v({sessionId:f,written:Buffer.byteLength(i,"utf8")});case"kill":let j=String(b?.sessionId??""),k=u().get(j);return k?(k.running&&(k.cancelEscalation=m(k.child)),v({sessionId:j,killed:!0})):v({error:`No background session with id "${j}".`},!0);case"list_sessions":return v({sessions:Array.from(u().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 v({error:`Unknown tool on the built-in bash server: ${a}`},!0)}}catch(b){return r.warn("bashCallTool failed",{toolName:a,err:b}),v({error:`Tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},48092:(a,b,c)=>{"use strict";c.d(b,{F:()=>j,loadEffectiveRoots:()=>l});var d=c(33873),e=c.n(d),f=c(79551),g=c(18230),h=c(94749);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,87507)),g=(await d(a)).trim();if(!g)return null;if(g.startsWith("file://"))try{return e().resolve((0,f.fileURLToPath)(g))}catch(a){return i.warn(`resolveRootToPath: could not parse file URI "${g}"`,a),null}return e().isAbsolute(g)?e().resolve(g):e().resolve(b,g)}async function l(a,b,d){let{getDataDir:f}=await Promise.resolve().then(c.bind(c,85510)),g=f(),l=function(a){for(let b of Array.isArray(a)?a:[a]){let a=process.env[b];if(!a||!a.trim())continue;let c=a.split(e().delimiter).map(a=>a.trim()).filter(Boolean).map(a=>e().resolve(a));if(c.length)return c}return null}(b),m=[];try{for(let b of(await (0,h.AC)(a)))m.push(e().isAbsolute(b)?e().resolve(b):e().resolve(g,b))}catch(a){i.warn("loadEffectiveRoots: could not read persisted roots",a)}try{let{getNodeRoots:b,getNodeRootsForId:e}=await Promise.resolve().then(c.bind(c,28181));for(let c of void 0!==d?(()=>{let c=e(a,d);return c.length>0?c:b(a)})():b(a)){let a=await k(c,g);a&&m.push(a)}}catch(a){i.warn("loadEffectiveRoots: could not read node roots",a)}let n=Array.from(new Set(m));if(!l)return 0===n.length?[g]:n;let o=n.filter(a=>l.some(b=>j(b,a)));return o.length?o:l}},65858:(a,b,c)=>{"use strict";c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(85510),i=c(79111),j=c(31296),k=c(48092);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.YM)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}},85781:a=>{function b(a){var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b}b.keys=()=>[],b.resolve=b,b.id=85781,a.exports=b}};
@@ -1,2 +1,2 @@
1
- "use strict";exports.id=1664,exports.ids=[1664],exports.modules={38296:(a,b,c)=>{c.d(b,{A:()=>C});var d=c(21124),e=c(38301),f=c(54573),g=c(81637),h=c(79515),i=c(68730),j=c(53773),k=c(82666),l=c(37674),m=c(67101),n=c(41893),o=c(95587),p=c(77028),q=c(44079),r=c(6537),s=c(19815),t=c(49938),u=c(47902),v=c(11480),w=c(93083),x=c(85557),y=c(91034),z=c(82571),A=c(92173);let B=(0,s.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),C=({serverName:a,initialEnv:b,onSave:c,onDelete:s,onServerRestart:C})=>{let{globalEnvVars:D}=(0,t.rX)(),[E,F]=(0,e.useState)([]),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(null);(0,e.useEffect)(()=>{B.debug(`Initializing environment variables for server: ${a}`,{variableCount:Object.keys(b).length}),F(Object.entries(b).map(([a,b])=>{let c="object"==typeof b&&null!==b&&"value"in b?b.value:b,d="object"==typeof b&&null!==b&&"metadata"in b?b.metadata:{isSecret:(0,z.xc)(a)},e=c.match(/\$\{global:([^}]+)\}/);if(e){let b=e[1];return{key:a,value:c,isSecret:d.isSecret,isBound:!0,boundTo:b}}let f="string"==typeof c&&(c.startsWith("encrypted:")||c.startsWith("encrypted_failed:"));return{key:a,value:f?A.gF:c,isSecret:d.isSecret,isEncrypted:f}}))},[b]);let O=async b=>{B.debug(`Removing environment variable at index: ${b}`);let c=E[b];if("Global"===a&&s&&c.key)try{await s(c.key),F(E.filter((a,c)=>c!==b))}catch(a){B.error(`Failed to delete environment variable: ${c.key}`,a)}else F(E.filter((a,c)=>c!==b)),H(!0)},P=(a,b,c)=>{let d=[...E];if("isSecret"===b){let b=d[a];b.isSecret&&!c?d[a]={...b,isSecret:c,value:"",isEncrypted:!1,showWarning:!0}:d[a]={...b,isSecret:c}}else{let e={...d[a],[b]:c,isSecret:"key"===b?(0,z.xc)(c):d[a].isSecret};"key"===b&&(e.isValidKey=""===c||/^[a-zA-Z0-9_]+$/.test(c)),"value"===b&&(d[a].isEncrypted&&(e.isEncrypted=!1),d[a].showWarning&&c&&(e.showWarning=!1)),d[a]=e}F(d),H(!0)},Q=async()=>{if(E.some(a=>""!==a.key&&!1===a.isValidKey))return void B.error("Cannot save: Some variable names contain invalid characters");B.debug(`Saving environment variables for server: ${a}`,{variableCount:E.length}),J(!0);try{let b=E.reduce((a,b)=>{let{key:c,value:d,isBound:e,boundTo:f,isSecret:g,isEncrypted:h}=b;return c&&(e&&f?a[c]={value:`$\{global:${f}}`,metadata:{isSecret:g}}:g&&d===A.gF||(a[c]={value:d,metadata:{isSecret:g}})),a},{});await c(b),H(!1),C&&"Global"!==a&&(B.debug(`Restarting server after env variable changes: ${a}`),await C(a))}catch(a){B.error("Failed to save environment variables:",a)}J(!1)};return(0,d.jsxs)(f.A,{sx:{p:3,borderRadius:2,border:1,borderColor:a=>"dark"===a.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,d.jsxs)(h.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",a]}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,d.jsx)(u.A,{}),onClick:()=>{B.debug("Adding new environment variable"),F([...E,{key:"",value:"",isSecret:!1}]),H(!0)},children:"Add Variable"})]}),(0,d.jsx)(j.A,{spacing:3,children:E.map((a,b)=>(0,d.jsxs)(k.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,placeholder:"Variable name",value:a.key,onChange:a=>P(b,"key",a.target.value),error:!1===a.isValidKey,helperText:!1===a.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,type:a.isSecret?"password":"text",placeholder:a.showWarning?"Re-enter value":"Value",value:a.value,onChange:a=>P(b,"value",a.target.value),InputProps:{readOnly:a.isBound,startAdornment:a.isEncrypted?(0,d.jsx)(m.A,{position:"start",children:(0,d.jsx)(v.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:a.isBound?(0,d.jsx)(m.A,{position:"end",children:(0,d.jsx)(n.A,{size:"small",label:`Bound to global: ${a.boundTo}`,color:"primary",variant:"outlined",onDelete:()=>(a=>{B.debug(`Unbinding variable at index: ${a}`);let b=[...E];b[a]={...b[a],isBound:!1,boundTo:void 0},F(b),H(!0)})(b),deleteIcon:(0,d.jsx)(w.A,{fontSize:"small"})})}):null},error:a.showWarning,helperText:a.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:b=>a.isBound?"dark"===b.palette.mode?"#1a1a1a":"#f9fafb":b.palette.background.paper}})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:2,children:(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(o.A,{control:(0,d.jsx)(p.A,{checked:a.isSecret,onChange:a=>P(b,"isSecret",a.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!a.isBound&&(0,d.jsx)(q.A,{size:"small",color:"primary",onClick:()=>(a=>{B.debug(`Opening bind modal for variable at index: ${a}`),N(a),L(!0)})(b),title:"Bind to global variable",sx:{mr:1},children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(q.A,{size:"small",color:"error",onClick:()=>O(b),title:"Remove variable",children:(0,d.jsx)(y.A,{fontSize:"small"})})]})})]},b))}),(0,d.jsx)(r.A,{open:K,onClose:()=>{L(!1),N(null)},children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,d.jsx)(h.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(D).length?(0,d.jsx)(h.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,d.jsx)(g.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(D).map(([a,b])=>(0,d.jsxs)(i.A,{fullWidth:!0,variant:"text",onClick:()=>(a=>{if(null!==M){B.debug(`Binding variable at index ${M} to global variable: ${a}`);let b=[...E];b[M]={...b[M],isBound:!0,boundTo:a,value:`$\{global:${a}}`},F(b),L(!1),N(null),H(!0)}})(a),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,d.jsx)(h.default,{variant:"body2",children:a}),(0,d.jsx)(h.default,{variant:"caption",color:"text.secondary",children:b&&"object"==typeof b&&b.metadata&&b.metadata.isSecret?A.gF:b&&"object"==typeof b?b.value:b})]},a))}),(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,d.jsx)(i.A,{variant:"outlined",onClick:()=>{L(!1),N(null)},children:"Cancel"})})]})}),G&&(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,d.jsx)(i.A,{variant:"contained",color:"success",onClick:Q,disabled:I||E.some(a=>""!==a.key&&!1===a.isValidKey),children:I?"Saving...":"Save Changes"})})]})}},81017:(a,b,c)=>{c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>U,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>W});var d=c(91488);c(27806);let e={LOG_LEVEL:3},f={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},g="number"==typeof e.LOG_LEVEL?e.LOG_LEVEL:f.ERROR;function h(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=h(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>h(a,b+1)):c[d]=e)}return c}function i(a,b,c,d,e){if(a>=("number"==typeof e?e:g)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let e=new Date().toISOString(),g=`[${e}] [${b}]`,i=`${g} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?h(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?h(b):b,2);i+=`:
1
+ "use strict";exports.id=1664,exports.ids=[1664],exports.modules={38296:(a,b,c)=>{c.d(b,{A:()=>D});var d=c(21124),e=c(38301),f=c(54573),g=c(81637),h=c(79515),i=c(68730),j=c(53773),k=c(82666),l=c(37674),m=c(67101),n=c(41893),o=c(95587),p=c(77028),q=c(44079),r=c(6537),s=c(19815),t=c(49938),u=c(47902),v=c(11480),w=c(93083),x=c(85557),y=c(91034),z=c(82571),A=c(92173);let B=(0,s.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),C=/^\$\{global:([A-Za-z0-9_.-]+)\}$/,D=({serverName:a,initialEnv:b,onSave:c,onDelete:s,onServerRestart:D})=>{let{globalEnvVars:E}=(0,t.rX)(),[F,G]=(0,e.useState)([]),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(!1),[N,O]=(0,e.useState)(null);(0,e.useEffect)(()=>{B.debug(`Initializing environment variables for server: ${a}`,{variableCount:Object.keys(b).length}),G(Object.entries(b).map(([a,b])=>{let c="object"==typeof b&&null!==b&&"value"in b?b.value:b,d="object"==typeof b&&null!==b&&"metadata"in b?b.metadata:{isSecret:(0,z.xc)(a)},e=c.match(C);if(e){let b=e[1];return{key:a,value:c,isSecret:d.isSecret,isBound:!0,boundTo:b}}let f="string"==typeof c&&(c.startsWith("encrypted:")||c.startsWith("encrypted_failed:"));return{key:a,value:f?A.gF:c,isSecret:d.isSecret,isEncrypted:f}}))},[b]);let P=async b=>{B.debug(`Removing environment variable at index: ${b}`);let c=F[b];if("Global"===a&&s&&c.key)try{await s(c.key),G(F.filter((a,c)=>c!==b))}catch(a){B.error(`Failed to delete environment variable: ${c.key}`,a)}else G(F.filter((a,c)=>c!==b)),I(!0)},Q=(a,b,c)=>{let d=[...F];if("isSecret"===b){let b=d[a];b.isSecret&&!c?d[a]={...b,isSecret:c,value:"",isEncrypted:!1,showWarning:!0}:d[a]={...b,isSecret:c}}else{let e={...d[a],[b]:c,isSecret:"key"===b?(0,z.xc)(c):d[a].isSecret};if("key"===b&&(e.isValidKey=""===c||/^[a-zA-Z0-9_]+$/.test(c)),"value"===b){let b=c.match(C);e.isBound=!!b,e.boundTo=b?.[1],d[a].isEncrypted&&(e.isEncrypted=!1),d[a].showWarning&&c&&(e.showWarning=!1)}d[a]=e}G(d),I(!0)},R=async()=>{if(F.some(a=>""!==a.key&&!1===a.isValidKey))return void B.error("Cannot save: Some variable names contain invalid characters");B.debug(`Saving environment variables for server: ${a}`,{variableCount:F.length}),K(!0);try{let b=F.reduce((a,b)=>{let{key:c,value:d,isBound:e,boundTo:f,isSecret:g,isEncrypted:h}=b;return c&&(e&&f?a[c]={value:`$\{global:${f}}`,metadata:{isSecret:g}}:g&&d===A.gF||(a[c]={value:d,metadata:{isSecret:g}})),a},{});await c(b),I(!1),D&&"Global"!==a&&(B.debug(`Restarting server after env variable changes: ${a}`),await D(a))}catch(a){B.error("Failed to save environment variables:",a)}K(!1)};return(0,d.jsxs)(f.A,{sx:{p:3,borderRadius:2,border:1,borderColor:a=>"dark"===a.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,d.jsxs)(h.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",a]}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,d.jsx)(u.A,{}),onClick:()=>{B.debug("Adding new environment variable"),G([...F,{key:"",value:"",isSecret:!1}]),I(!0)},children:"Add Variable"})]}),(0,d.jsx)(j.A,{spacing:3,children:F.map((a,b)=>(0,d.jsxs)(k.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,placeholder:"Variable name",value:a.key,onChange:a=>Q(b,"key",a.target.value),error:!1===a.isValidKey,helperText:!1===a.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,type:a.isSecret?"password":"text",placeholder:a.showWarning?"Re-enter value":"Value",value:a.value,onChange:a=>Q(b,"value",a.target.value),InputProps:{readOnly:a.isBound,startAdornment:a.isEncrypted?(0,d.jsx)(m.A,{position:"start",children:(0,d.jsx)(v.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:a.isBound?(0,d.jsx)(m.A,{position:"end",children:(0,d.jsx)(n.A,{size:"small",label:`Bound to global: ${a.boundTo}`,color:"primary",variant:"outlined",onDelete:()=>(a=>{B.debug(`Unbinding variable at index: ${a}`);let b=[...F];b[a]={...b[a],isBound:!1,boundTo:void 0},G(b),I(!0)})(b),deleteIcon:(0,d.jsx)(w.A,{fontSize:"small"})})}):null},error:a.showWarning,helperText:a.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:b=>a.isBound?"dark"===b.palette.mode?"#1a1a1a":"#f9fafb":b.palette.background.paper}})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:2,children:(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(o.A,{control:(0,d.jsx)(p.A,{checked:a.isSecret,onChange:a=>Q(b,"isSecret",a.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!a.isBound&&(0,d.jsx)(q.A,{size:"small",color:"primary",onClick:()=>(a=>{B.debug(`Opening bind modal for variable at index: ${a}`),O(a),M(!0)})(b),title:"Bind to global variable",sx:{mr:1},children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(q.A,{size:"small",color:"error",onClick:()=>P(b),title:"Remove variable",children:(0,d.jsx)(y.A,{fontSize:"small"})})]})})]},b))}),(0,d.jsx)(r.A,{open:L,onClose:()=>{M(!1),O(null)},children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,d.jsx)(h.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(E).length?(0,d.jsx)(h.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,d.jsx)(g.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(E).map(([a,b])=>(0,d.jsxs)(i.A,{fullWidth:!0,variant:"text",onClick:()=>(a=>{if(null!==N){B.debug(`Binding variable at index ${N} to global variable: ${a}`);let b=[...F];b[N]={...b[N],isBound:!0,boundTo:a,value:`$\{global:${a}}`},G(b),M(!1),O(null),I(!0)}})(a),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,d.jsx)(h.default,{variant:"body2",children:a}),(0,d.jsx)(h.default,{variant:"caption",color:"text.secondary",children:b&&"object"==typeof b&&b.metadata&&b.metadata.isSecret?A.gF:b&&"object"==typeof b?b.value:b})]},a))}),(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,d.jsx)(i.A,{variant:"outlined",onClick:()=>{M(!1),O(null)},children:"Cancel"})})]})}),H&&(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,d.jsx)(i.A,{variant:"contained",color:"success",onClick:R,disabled:J||F.some(a=>""!==a.key&&!1===a.isValidKey),children:J?"Saving...":"Save Changes"})})]})}},81017:(a,b,c)=>{c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>U,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>W});var d=c(91488);c(27806);let e={LOG_LEVEL:3},f={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},g="number"==typeof e.LOG_LEVEL?e.LOG_LEVEL:f.ERROR;function h(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=h(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>h(a,b+1)):c[d]=e)}return c}function i(a,b,c,d,e){if(a>=("number"==typeof e?e:g)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let e=new Date().toISOString(),g=`[${e}] [${b}]`,i=`${g} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?h(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?h(b):b,2);i+=`:
2
2
  ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case f.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case f.DEBUG:console.debug(i);break;case f.INFO:console.info(i);break;case f.WARN:console.warn(i);break;case f.ERROR:console.error(i);break;default:console.log(i)}}}function j(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{i(f.VERBOSE,d,a,c,b)},debug:(a,c)=>{i(f.DEBUG,d,a,c,b)},info:(a,c)=>{i(f.INFO,d,a,c,b)},warn:(a,c)=>{i(f.WARN,d,a,c,b)},error:(a,c)=>{i(f.ERROR,d,a,c,b)}}}var k=c(29021),l=c(33873),m=c.n(l),n=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.LAST_PICKED_FLOW_ID="last_picked_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",a.MCP_QUALITY_SETTINGS="mcp_quality_settings",a.RUN_RESOURCE_SETTINGS="run_resource_settings",a.KV_STORE_SETTINGS="kv_store_settings",a.PENDING_APPROVALS="pending_approvals",a.MCP_INTERNAL_OVERRIDES="mcp_internal_overrides",a.PACKAGE_INSTALLS="package_installs",a.EXPERIMENTAL_SETTINGS="experimental_settings",a.REGISTRY_ACCOUNT="registry_account",a.REGISTRY_SETTINGS="registry_settings",a.TELEMETRY_STATE="telemetry_state",a}({});function o(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?m().resolve(a):process.cwd()}c(21820);let p=j("utils/storage/backend"),q=m().join(o(),"db"),r=m().join(o(),".next","storage"),s=a=>m().join(q,`${a}.json`);async function t(){try{await k.promises.access(q),p.verbose(`Storage directory exists: ${q}`)}catch{p.debug(`Creating storage directory: ${q}`),await k.promises.mkdir(q,{recursive:!0})}try{await k.promises.access(r),p.warn(`Old storage directory found: ${r}. This may cause data inconsistency issues.`)}catch{}}let u=new Map,v=0;async function w(a,b){let c=m().dirname(a);await k.promises.mkdir(c,{recursive:!0});let d=`${a}.tmp.${process.pid}.${++v}`;try{await k.promises.writeFile(d,b),await k.promises.rename(d,a)}catch(a){try{await k.promises.unlink(d)}catch{}throw a}}async function x(a,b){let c=s(a),d=(u.get(a)??Promise.resolve()).catch(()=>{}).then(()=>w(c,JSON.stringify(b,null,2)));u.set(a,d);try{await d,p.verbose(`Successfully saved item to: ${c}`)}catch(b){throw p.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{u.get(a)===d&&u.delete(a)}}async function y(a,b){try{await t();let c=s(a),d=await k.promises.readFile(c,"utf-8");if(0===d.trim().length)return p.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(d);return p.verbose(`Successfully loaded item from: ${c}`),a}catch(b){p.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await k.promises.writeFile(a,d),p.info(`Created backup of corrupted file at: ${a}`)}catch(a){p.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return p.verbose(`Item with key "${a}" not found at ${s(a)}, returning default.`),b;throw p.error(`CRITICAL: Error loading item with key "${a}" from ${s(a)}:`,c),c}}var z=c(92347),A=c.n(z);let B=j("utils/encryption/session"),C=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map),D=j("utils/encryption/secure");class E extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,E.prototype)}}let F="data_encryption_key",G="data_encryption_iv",H="data_encryption_salt",I="encryption_type";var J=function(a){return a.DEFAULT="default",a.USER="user",a}(J||{});function K(){let a=A().enc.Utf8.parse("flujo_fixed_salt_v1");return A().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}function L(a){let b;try{b=a.toString(A().enc.Utf8)}catch{return null}return RegExp("^[0-9a-f]{16}$").test(b)?b:null}async function M(){D.debug("initializeDefaultEncryption: Entering method");try{if(await R())return!0;let a=K(),b=A().lib.WordArray.random(8),c=A().lib.WordArray.random(16),d=A().AES.encrypt(b.toString(),a,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7}),e=A().enc.Utf8.parse("flujo_fixed_salt_v1"),f={[F]:d.toString(),[G]:c.toString(),[H]:e.toString(),encryption_version:1,[I]:"default"};return await x(n.ENCRYPTION_KEY,f),!0}catch(a){return D.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function N(){D.debug("getDefaultDEK: Entering method");try{let a=await y(n.ENCRYPTION_KEY,null);if(!a){if(!await M())return D.error("getDefaultDEK: Failed to initialize default encryption"),null;return await N()}if("default"!==a[I])return D.error("getDefaultDEK: Not using default encryption"),null;let b=a[F],c=A().enc.Hex.parse(a[G]),d=K(),e=A().AES.decrypt(b,d,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!L(e))return D.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return A().enc.Hex.parse(e.toString())}catch(a){return D.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function O(a){D.debug("getUserDEK: Entering method");try{let b=await y(n.ENCRYPTION_KEY,null);if(!b)return D.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[I])return D.error("getUserDEK: Not using user encryption"),null;let c=b[F],d=A().enc.Hex.parse(b[G]),e=A().enc.Hex.parse(b[H]),f=A().PBKDF2(a,e,{keySize:8,iterations:1e5}),g=A().AES.decrypt(c,f,{iv:d,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!L(g))return D.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return A().enc.Hex.parse(g.toString())}catch(a){return D.error("getUserDEK: Failed to get user DEK:",a),null}}async function P(a,b=!1){D.debug("getDEK: Entering method");try{if(b&&a){D.debug("getDEK: Using session token");let b=function(a){let b=C.get(a);if(!b)return B.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(B.warn(`Session expired: ${a}`),C.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return A().enc.Hex.parse(b);D.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await y(n.ENCRYPTION_KEY,null);if(!c){if(D.info("getDEK: No encryption metadata found, initializing default encryption"),!await M())return D.error("getDEK: Failed to initialize default encryption"),null;return await P(a,b)}if("user"!==c[I])return await N();{let c=global.__flujo_server_dek??null;if(c)return D.debug("getDEK: Using server unlock state for user encryption"),A().enc.Hex.parse(c);if(a&&!b){let b=await O(a);if(b)return b;D.warn("getDEK: Provided password did not yield a valid user DEK")}throw D.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new E}}catch(a){if(a instanceof E)throw a;D.error("getDEK: Failed to get DEK:",a);try{if(D.warn("getDEK: Attempting to initialize default encryption as error recovery"),await M())return await N()}catch(a){D.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function Q(a,b,c=!1){D.debug("decryptWithPassword: Entering method");try{let d=await P(b,c);if(!d)return null;let e=a.split(":");if(2!==e.length)return D.error("decryptWithPassword: Invalid ciphertext format"),null;let f=A().enc.Hex.parse(e[0]),g=e[1];return A().AES.decrypt(g,d,{iv:f,mode:A().mode.CBC,padding:A().pad.Pkcs7}).toString(A().enc.Utf8)}catch(a){if(a instanceof E)throw a;return D.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function R(){return D.debug("isEncryptionInitialized: Entering method"),null!==await y(n.ENCRYPTION_KEY,null)}var S=c(40410);let T=j("backend/utils/resolveGlobalVars");async function U(a,b={}){T.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await y(n.GLOBAL_ENV_VARS,{}),e=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}(d);T.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let f={},g=new Set;if(e)for(let[a,b]of Object.entries(d))f[a]=b.value,b.metadata.isSecret&&g.add(a);else f={...d};let h=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==f[b]){let e=f[b];if(!c&&(g.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){T.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){T.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await Q(a);if(c)e=c,T.debug(`Successfully decrypted global variable: ${b}`);else{T.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){T.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){T.warn(`Skipping failed encrypted global variable: ${b}`);continue}T.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else T.warn(`Global variable not found: ${b}`)}return d},i=async a=>{if("string"==typeof a)return await h(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},j=await i(a);return"object"==typeof a&&null!==a&&T.debug("Resolved global variables result:",JSON.stringify(j,null,2)),T.debug("Completed global variable resolution"),j}async function V(a){return U(a,{resolveSecrets:!1})}async function W(a,b=0){if(T.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return T.warn("Empty value provided"),null;if(b>=10)return T.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){T.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await Q(a);if(!d)return T.warn(`Failed to decrypt value at depth ${b}`),null;T.debug(`Successfully decrypted value at depth ${b}`),T.verbose(d),c=d}catch(a){return T.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(T.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){T.debug(`Resolving global variables at depth ${b}`);try{let a=await U(c);if(T.verbose(a),a!==c)return T.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),W(a,b+1);c=a}catch(a){return T.error(`Error resolving global variables at depth ${b}:`,a),null}}return T.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,S.D)([U,V,W]),(0,d.A)(U,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(V,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(W,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},92173:(a,b,c)=>{c.d(b,{RJ:()=>e,gF:()=>d});let d="masked:********",e="********"}};
@@ -1 +1 @@
1
- "use strict";exports.id=1805,exports.ids=[1805],exports.modules={74186:(a,b,c)=>{c.d(b,{loadServerConfigs:()=>q,q:()=>r});var d=c(33873),e=c.n(d),f=c(34322),g=c(92372),h=c(38844),i=c(50846),j=c(43326);let k=(0,i.h)("backend/services/mcp/config"),l=new Set(["streamable","sse","websocket"]),m=e().join((0,j.getDataDir)(),"mcp-servers"),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Ay)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;if(l.has(a.transport))return{type:"remote"};let c="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getDataDir)(),b);if(c&&function(a){let b=e().relative(m,a);return""!==b&&!b.startsWith("..")&&!e().isAbsolute(b)}(c)){let a=await o(c);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){k.debug("Entering loadServerConfigs method");try{let a=await (0,g.YM)(h.Z.MCP_SERVERS,{}),b=Object.entries(a).map(([a,b])=>{let c=b.transport||"stdio";l.has(c)&&function(a){if("string"!=typeof a)return!1;let b=a.trim();return"/"===b||"\\"===b||/^[A-Za-z]:[\\/]?$/.test(b)}(b.rootPath)&&(k.info(`Normalizing filesystem-root rootPath "${b.rootPath}" of remote server ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let d={name:a,disabled:!1,autoApprove:[],rootPath:"",env:{},_buildCommand:"",_installCommand:""};return"streamable"===c?{...d,...b,name:a,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0,reconnectionOptions:b.reconnectionOptions&&"object"==typeof b.reconnectionOptions?b.reconnectionOptions:void 0,sessionId:b.sessionId||void 0,oauthClientId:b.oauthClientId||"",oauthClientSecret:b.oauthClientSecret||"",oauthScopes:b.oauthScopes||(b.oauthClientId||b.oauthClientInformation?["read"]:void 0),oauthClientMetadata:b.oauthClientMetadata,oauthClientInformation:b.oauthClientInformation,oauthTokens:b.oauthTokens,oauthCodeVerifier:b.oauthCodeVerifier}:"sse"===c?{...d,...b,name:a,eventSourceInit:b.eventSourceInit&&"object"==typeof b.eventSourceInit?b.eventSourceInit:void 0,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0}:"websocket"===c?{...d,...b,name:a,websocketUrl:b.websocketUrl||""}:{...d,...b,name:a,command:b.command||"",args:b.args||[],stderr:b.stderr||"pipe"}});return await Promise.all(b.map(async a=>{a.source||(a.source=await p(a))})),b}catch(a){return k.warn("Failed to load server configs",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async function r(a){k.debug("Entering saveConfig method");try{let b=Object.fromEntries(Array.from(a.entries()).filter(([,a])=>!0!==a.builtIn).map(([a,b])=>{let{name:c,...d}=b;return[a,d]}));return await (0,g.VH)(h.Z.MCP_SERVERS,b),{success:!0}}catch(a){return k.warn("Failed to save config",a),{success:!1,error:`Failed to save config: ${a instanceof Error?a.message:"Unknown error"}`}}}}};
1
+ "use strict";exports.id=1805,exports.ids=[1805],exports.modules={74186:(a,b,c)=>{c.d(b,{loadServerConfigs:()=>q,q:()=>r});var d=c(33873),e=c.n(d),f=c(34322),g=c(92372),h=c(38844),i=c(50846),j=c(43326);let k=(0,i.h)("backend/services/mcp/config"),l=new Set(["streamable","sse","websocket"]),m=e().join((0,j.getDataDir)(),"mcp-servers"),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Ay)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;if(l.has(a.transport))return{type:"remote"};let c="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getDataDir)(),b);if(c&&function(a){let b=e().relative(m,a);return""!==b&&!b.startsWith("..")&&!e().isAbsolute(b)}(c)){let a=await o(c);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){k.debug("Entering loadServerConfigs method");try{let a=await (0,g.loadItem)(h.Z.MCP_SERVERS,{}),b=Object.entries(a).map(([a,b])=>{let c=b.transport||"stdio";l.has(c)&&function(a){if("string"!=typeof a)return!1;let b=a.trim();return"/"===b||"\\"===b||/^[A-Za-z]:[\\/]?$/.test(b)}(b.rootPath)&&(k.info(`Normalizing filesystem-root rootPath "${b.rootPath}" of remote server ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let d={name:a,disabled:!1,autoApprove:[],rootPath:"",env:{},_buildCommand:"",_installCommand:""};return"streamable"===c?{...d,...b,name:a,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0,reconnectionOptions:b.reconnectionOptions&&"object"==typeof b.reconnectionOptions?b.reconnectionOptions:void 0,sessionId:b.sessionId||void 0,oauthClientId:b.oauthClientId||"",oauthClientSecret:b.oauthClientSecret||"",oauthScopes:b.oauthScopes||(b.oauthClientId||b.oauthClientInformation?["read"]:void 0),oauthClientMetadata:b.oauthClientMetadata,oauthClientInformation:b.oauthClientInformation,oauthTokens:b.oauthTokens,oauthCodeVerifier:b.oauthCodeVerifier}:"sse"===c?{...d,...b,name:a,eventSourceInit:b.eventSourceInit&&"object"==typeof b.eventSourceInit?b.eventSourceInit:void 0,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0}:"websocket"===c?{...d,...b,name:a,websocketUrl:b.websocketUrl||""}:{...d,...b,name:a,command:b.command||"",args:b.args||[],stderr:b.stderr||"pipe"}});return await Promise.all(b.map(async a=>{a.source||(a.source=await p(a))})),b}catch(a){return k.warn("Failed to load server configs",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async function r(a){k.debug("Entering saveConfig method");try{let b=Object.fromEntries(Array.from(a.entries()).filter(([,a])=>!0!==a.builtIn).map(([a,b])=>{let{name:c,...d}=b;return[a,d]}));return await (0,g.VH)(h.Z.MCP_SERVERS,b),{success:!0}}catch(a){return k.warn("Failed to save config",a),{success:!1,error:`Failed to save config: ${a instanceof Error?a.message:"Unknown error"}`}}}}};
@@ -1 +1 @@
1
- "use strict";exports.id=227,exports.ids=[227],exports.modules={7389:(a,b,c)=>{c.d(b,{Sq:()=>e,lJ:()=>f});var d=c(81226);let e={type:"object",additionalProperties:!1,required:["name","goal","steps"],properties:{profile:{type:"string",const:"simple"},version:{type:"integer",const:1},name:{type:"string",minLength:1},goal:{type:"string",minLength:1},model:{type:"string",minLength:1},steps:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","task"],properties:{id:{type:"string",minLength:1,pattern:"^[A-Za-z][A-Za-z0-9_-]*$"},task:{type:"string",minLength:1},label:{type:"string",minLength:1},model:{type:"string",minLength:1},tools:{type:"array",uniqueItems:!0,items:{type:"string",minLength:1}},flow:{type:"string",minLength:1}}}},routes:{type:"array",items:{type:"object",additionalProperties:!1,required:["from","to"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},when:{type:"object",additionalProperties:!1,required:["kind"],properties:{kind:{type:"string",enum:["contains","equals","regex","always"]},value:{type:"string"},ignoreCase:{type:"boolean"},negate:{type:"boolean"}}}}}}}};function f(a,b={},c={}){let e=function(a){let b=[],c=Array.isArray(a?.steps)?a.steps:[],d=new Set,e=[];for(let a of c){let c="string"==typeof a?.id?a.id.trim():"",f="string"==typeof a?.task?a.task.trim():"";if(!c||!/^[A-Za-z][A-Za-z0-9_-]*$/.test(c)){b.push({severity:"error",code:"simple-step-id-invalid",message:"Every simple step needs an id matching ^[A-Za-z][A-Za-z0-9_-]*$."});continue}if(d.has(c)){b.push({severity:"error",code:"simple-step-id-duplicate",nodeKey:c,message:`Duplicate simple step id "${c}"; the later step was dropped.`});continue}if(!f){b.push({severity:"error",code:"simple-step-task-missing",nodeKey:c,message:`Step "${c}" needs a non-empty task.`});continue}d.add(c),e.push({...a,id:c,task:f})}let f="__start",g="__finish",h=[{key:f,type:"start",label:"Start",prompt:`Execute this workflow toward its stated goal: ${"string"==typeof a?.goal?a.goal.trim():""}`}];for(let c of e){let d="string"==typeof c.label&&c.label.trim()?c.label.trim():function(a){let b=a.replace(/[_-]+/g," ").trim();return b?b.replace(/\b\w/g,a=>a.toUpperCase()):"Step"}(c.id),e="string"==typeof c.flow?c.flow.trim():"";if(e){h.push({key:c.id,type:"subflow",label:d,description:c.task,flow:e,prompt:c.task,inputMode:"full-history",outputMode:"final-only"});continue}let f="string"==typeof c.model&&c.model.trim()?c.model.trim():"string"==typeof a?.model?a.model.trim():"";h.push({key:c.id,type:"process",label:d,description:c.task,prompt:c.task,...f?{model:f}:{},servers:function(a,b,c){let d=new Map;for(let e of a??[]){let a="string"==typeof e?e.trim():"";if(!a)continue;let f=a.indexOf("/"),g=(f>=0?a.slice(0,f):a).trim(),h=f>=0?a.slice(f+1).trim():"";if(!g){c.push({severity:"warning",code:"simple-tool-invalid",nodeKey:b,message:`Step "${b}": ignored tool reference "${a}"; use server/tool.`});continue}d.has(g)||d.set(g,new Set),h&&d.get(g).add(h)}return[...d].map(([a,b])=>({name:a,...b.size>0?{tools:[...b]}:{}}))}(c.tools,c.id,b),inputMode:"full-history",outputMode:"latest-message"})}h.push({key:g,type:"finish",label:"Finish"});let i=[],j=Array.isArray(a?.routes)?a.routes:[];if(0===j.length){let a=[f,...e.map(a=>a.id),g];for(let b=0;b<a.length-1;b++)i.push({from:a[b],to:a[b+1]})}else{let a=new Set,c=new Set;for(let e of j){let f="string"==typeof e?.from?e.from.trim():"",g="string"==typeof e?.to?e.to.trim():"";if(!d.has(f)||!d.has(g)){b.push({severity:"error",code:"simple-route-unresolved",nodeKey:f||void 0,message:`Simple route "${f}" → "${g}" references an unknown step.`});continue}i.push({from:f,to:g,...e.when?{condition:e.when}:{}}),c.add(f),a.add(g)}for(let b of e)a.has(b.id)||i.push({from:f,to:b.id}),c.has(b.id)||i.push({from:b.id,to:g})}return{spec:{name:"string"==typeof a?.name?a.name.trim():"",description:"string"==typeof a?.goal?a.goal.trim():"",nodes:h,edges:i},issues:b}}(a),g=(0,d.dM)(e.spec,b,c),h=[...e.issues,...g.issues];return{...g,loweredSpec:e.spec,issues:h,errorCount:h.filter(a=>"error"===a.severity).length,warningCount:h.filter(a=>"warning"===a.severity).length}}},30227:(a,b,c)=>{c.d(b,{cI:()=>q,oV:()=>s,yM:()=>o});var d=c(50846),e=c(88185),f=c(7389),g=c(38204),h=c(9312),i=c(14265),j=c(1905),k=c(33233),l=c(25250);let m=(0,d.h)("backend/services/mcp/flowAuthoringTools"),n=["list_flow_building_blocks","get_flow_authoring_guide","validate_flow_spec","draft_flow","create_flow","search_mcp_marketplace","install_mcp_server","install_best_mcp_server"];function o(a){return n.includes(a)}function p(){return{type:"object",additionalProperties:!1,properties:{spec:{oneOf:[f.Sq,{type:"object",description:'Legacy advanced FlowSpec with nodes and edges. Pass profile="advanced"; fetch its contract with get_flow_authoring_guide.'}],description:"A guided SimpleFlowSpec by default, or a legacy advanced FlowSpec."},profile:{type:"string",enum:["simple","advanced"],description:"Authoring profile. Defaults to simple; legacy specs containing nodes+edges are auto-detected as advanced."},keepPills:{type:"boolean",description:"When true, binding pills (${tool:server__name}) that resolve against the node's wired servers are preserved in the compiled output instead of being stripped. Pills that cannot be resolved are still stripped with a warning. Default: false (strip all pills — generator-safe behaviour)."}},required:["spec"]}}function q(){return[{name:"list_flow_building_blocks",description:"List models, MCP server/tool references, and existing flows available to a new flow.",inputSchema:{type:"object",properties:{}}},{name:"get_flow_authoring_guide",description:"Fetch the flow-authoring contract only when needed. The simple guide is compact; the advanced guide contains the complete FlowSpec reference.",inputSchema:{type:"object",properties:{profile:{type:"string",enum:["simple","advanced"],description:"Guide to return. Defaults to simple."}}}},{name:"validate_flow_spec",description:"Compile and validate a guided flow without saving. Returns a compact summary and issues. Use draft_flow when the caller needs the complete unsaved draft.",inputSchema:p()},{name:"draft_flow",description:"Compile and validate a flow WITHOUT saving and return the complete draft bundle for review or opening in the Flow Builder.",inputSchema:p()},{name:"create_flow",description:"Compile, validate, and save a guided flow. Saving occurs only when validation has no errors. Use list_flow_building_blocks for valid references.",inputSchema:p()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Installs are gated by consent (SEP-1024): unless this trusted authoring tool is allowed via the mcpAutoInstall settings (trustBrainStem / requireConsent / namespaceAllowlist), the tool returns the exact resolved command + arguments with consentRequired=true INSTEAD of installing, and the caller must obtain explicit approval. Every attempt is written to an audit log (command, args, env NAMES, verification status — never secret values) before any spawn. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument), or the resolved plan when consent is required. First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}},{name:"install_best_mcp_server",description:"Install the BEST WORKING MCP server for a capability, unattended — the recommended way to acquire a capability when you don't already have a specific server name. Searches the registry, RANKS candidates by blended quality (GitHub stars + recent activity, npm weekly downloads, registry status), then installs best→worst until one actually boots and exposes tools (the \"works-gate\"): candidates that need unavailable keys, can't be installed, or start with zero tools are skipped automatically. Same consent/audit rules and third-party-code warning as install_mcp_server. Returns the installed server name + its tools and the list of candidates tried, or needsEnv/consentRequired. Prefer this over search+install for headless self-improvement; use install_mcp_server only when you must pin an exact server.",inputSchema:{type:"object",properties:{capability:{type:"string",description:'Short capability term matched against server names, e.g. "youtube", "email", "browser".'},env:{type:"object",description:"Optional env var values shared across attempted servers (e.g. an API key).",additionalProperties:{type:"string"}}},required:["capability"]}}]}function r(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function s(a,b){try{if("list_flow_building_blocks"===a){let a=await (0,h.jY)();return r(a.blocks)}if("get_flow_authoring_guide"===a){let a=b?.profile==="advanced"?"advanced":"simple";if("advanced"===a)return r({profile:a,guide:e.R});return r({profile:a,schema:f.Sq,guide:["Set name, goal, and one or more ordered steps.","Each step needs id and task. model overrides the top-level default.","Tools use server/tool references from list_flow_building_blocks.","Set flow on a step to run an existing flow instead of a model.","Omit routes for a linear flow. Routes are only for branches; omit when for the fallback.","Start, Finish, layout, data handoff, and ordinary defaults are inferred."]})}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await (0,i.e3)(a);return r(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await (0,i.aM)(a,c,{resolveOnly:!0});if(!d.plan)return r(d,!0);let e=await (0,j.Ej)(),f=(0,k.e5)({caller:"authoring-tool",settings:e,registryName:a}),g=(0,l.nO)(d.plan.verificationStatus)?void 0:`Unverified / self-asserted registry entry (status: ${d.plan.verificationStatus}). Registry entries are publisher-asserted — review the command before approving.`;if(await (0,j.NB)((0,k.UM)(d.plan,"authoring-tool",f,!1)),!f.allowed)return r({installed:!1,consentRequired:!0,message:f.message,plan:d.plan,...g?{verificationWarning:g}:{}});let h=await (0,i.aM)(a,c);return await (0,j.NB)((0,k.UM)(h.plan??d.plan,"authoring-tool",f,h.installed,h.error)),r({...h,...g?{verificationWarning:g}:{}},!h.installed)}if("install_best_mcp_server"===a){let a="string"==typeof b?.capability?b.capability:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0;if(!a)return r({error:'Provide a "capability" search term.'},!0);let d=await (0,j.Ej)(),e=(0,k.e5)({caller:"authoring-tool",settings:d,registryName:a});if(!e.allowed){let b=(await (0,i.e3)(a)).find(a=>a.installable),d=b?await (0,i.aM)(b.name,c,{resolveOnly:!0}):null;return d?.plan&&await (0,j.NB)((0,k.UM)(d.plan,"authoring-tool",e,!1)),r({installed:!1,consentRequired:!0,message:e.message,...d?.plan?{plan:d.plan}:{}})}let f=await (0,i.LG)(a,c,{onAttempt:async(a,b)=>{a&&await (0,j.NB)((0,k.UM)(a,"authoring-tool",e,b.installed,b.error))}}),g=f.installed&&!(0,l.nO)(f.plan?.verificationStatus)?`Installed an unverified / self-asserted registry entry (status: ${f.plan?.verificationStatus}).`:void 0;return r({...f,...g?{verificationWarning:g}:{}},!f.installed)}if("validate_flow_spec"===a||"draft_flow"===a||"create_flow"===a){let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(b);if(!c)return r({error:'Provide a "spec" argument: a SimpleFlowSpec object (or JSON string).'},!0);let d=c&&"object"==typeof c&&!Array.isArray(c)?c:{},e="advanced"===b.profile?"advanced":"simple"===b.profile?"simple":Array.isArray(d.nodes)&&Array.isArray(d.edges)?"advanced":"simple",f=!0===b.keepPills,h=await (0,g.V)(c,{save:"create_flow"===a,keepPills:f,profile:e});if(!h.success)return r({error:h.error,issues:h.issues??[]},!0);let i=h.flows.length,j=i>1?` (plus ${i-1} nested subflow flow(s))`:"",k={profile:e,flowId:h.flow.id,flowName:h.flow.name,nodeCount:h.flow.nodes.length,edgeCount:h.flow.edges.length,...i>1?{flows:h.flows.map(a=>({id:a.id,name:a.name}))}:{},validation:h.validation,..."draft_flow"===a?{saved:!1,rootFlowId:h.flow.id,flow:h.flow,flows:h.flows}:{},..."create_flow"===a?{saved:h.saved,...h.saved?{note:`Flow "${h.flow.name}"${j} was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${h.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return r(k,"create_flow"===a&&!h.saved)}return r({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return m.error("authoringCallTool failed",{toolName:a,err:b}),r({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},38204:(a,b,c)=>{c.d(b,{V:()=>k});var d=c(50846),e=c(87821),f=c(81226),g=c(7389),h=c(84671),i=c(9312);let j=(0,d.h)("backend/services/flow/compileFlow");async function k(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,i.jY)(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let l="simple"===b.profile?(0,g.lJ)(a,d,{keepPills:b.keepPills}):(0,f.dM)(a,d,{keepPills:b.keepPills});if(!l.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:l.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(l.flow.id=b.updateFlowId);let m=l.flows.flatMap(a=>(0,h.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),n=(0,i.RB)(l.issues,{issues:m,errorCount:0,warningCount:0,isRunnable:!0}),o=!1;if(b.save&&0===n.errorCount){for(let a of l.flows)await e.flowService.saveFlow(a);o=!0,j.info(`Compiled and saved ${l.flows.length} flow(s); root "${l.flow.name}" (${l.flow.id})`)}else b.save&&j.info(`Compiled flow "${l.flow.name}" has ${n.errorCount} error(s); NOT saved`);return{success:!0,flow:l.flow,flows:l.flows,validation:n,saved:o}}}};
1
+ "use strict";exports.id=227,exports.ids=[227],exports.modules={7389:(a,b,c)=>{c.d(b,{Sq:()=>e,lJ:()=>f});var d=c(81226);let e={type:"object",additionalProperties:!1,required:["name","goal","steps"],properties:{profile:{type:"string",const:"simple"},version:{type:"integer",const:1},name:{type:"string",minLength:1},goal:{type:"string",minLength:1},model:{type:"string",minLength:1},steps:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","task"],properties:{id:{type:"string",minLength:1,pattern:"^[A-Za-z][A-Za-z0-9_-]*$"},task:{type:"string",minLength:1},label:{type:"string",minLength:1},model:{type:"string",minLength:1},tools:{type:"array",uniqueItems:!0,items:{type:"string",minLength:1}},flow:{type:"string",minLength:1}}}},routes:{type:"array",items:{type:"object",additionalProperties:!1,required:["from","to"],properties:{from:{type:"string",minLength:1},to:{type:"string",minLength:1},when:{type:"object",additionalProperties:!1,required:["kind"],properties:{kind:{type:"string",enum:["contains","equals","regex","always"]},value:{type:"string"},ignoreCase:{type:"boolean"},negate:{type:"boolean"}}}}}}}};function f(a,b={},c={}){let e=function(a){let b=[],c=Array.isArray(a?.steps)?a.steps:[],d=new Set,e=[];for(let a of c){let c="string"==typeof a?.id?a.id.trim():"",f="string"==typeof a?.task?a.task.trim():"";if(!c||!/^[A-Za-z][A-Za-z0-9_-]*$/.test(c)){b.push({severity:"error",code:"simple-step-id-invalid",message:"Every simple step needs an id matching ^[A-Za-z][A-Za-z0-9_-]*$."});continue}if(d.has(c)){b.push({severity:"error",code:"simple-step-id-duplicate",nodeKey:c,message:`Duplicate simple step id "${c}"; the later step was dropped.`});continue}if(!f){b.push({severity:"error",code:"simple-step-task-missing",nodeKey:c,message:`Step "${c}" needs a non-empty task.`});continue}d.add(c),e.push({...a,id:c,task:f})}let f="__start",g="__finish",h=[{key:f,type:"start",label:"Start",prompt:`Execute this workflow toward its stated goal: ${"string"==typeof a?.goal?a.goal.trim():""}`}];for(let c of e){let d="string"==typeof c.label&&c.label.trim()?c.label.trim():function(a){let b=a.replace(/[_-]+/g," ").trim();return b?b.replace(/\b\w/g,a=>a.toUpperCase()):"Step"}(c.id),e="string"==typeof c.flow?c.flow.trim():"";if(e){h.push({key:c.id,type:"subflow",label:d,description:c.task,flow:e,prompt:c.task,inputMode:"full-history",outputMode:"final-only"});continue}let f="string"==typeof c.model&&c.model.trim()?c.model.trim():"string"==typeof a?.model?a.model.trim():"";h.push({key:c.id,type:"process",label:d,description:c.task,prompt:c.task,...f?{model:f}:{},servers:function(a,b,c){let d=new Map;for(let e of a??[]){let a="string"==typeof e?e.trim():"";if(!a)continue;let f=a.indexOf("/"),g=(f>=0?a.slice(0,f):a).trim(),h=f>=0?a.slice(f+1).trim():"";if(!g){c.push({severity:"warning",code:"simple-tool-invalid",nodeKey:b,message:`Step "${b}": ignored tool reference "${a}"; use server/tool.`});continue}d.has(g)||d.set(g,new Set),h&&d.get(g).add(h)}return[...d].map(([a,b])=>({name:a,...b.size>0?{tools:[...b]}:{}}))}(c.tools,c.id,b),inputMode:"full-history",outputMode:"latest-message"})}h.push({key:g,type:"finish",label:"Finish"});let i=[],j=Array.isArray(a?.routes)?a.routes:[];if(0===j.length){let a=[f,...e.map(a=>a.id),g];for(let b=0;b<a.length-1;b++)i.push({from:a[b],to:a[b+1]})}else{let a=new Set,c=new Set;for(let e of j){let f="string"==typeof e?.from?e.from.trim():"",g="string"==typeof e?.to?e.to.trim():"";if(!d.has(f)||!d.has(g)){b.push({severity:"error",code:"simple-route-unresolved",nodeKey:f||void 0,message:`Simple route "${f}" → "${g}" references an unknown step.`});continue}i.push({from:f,to:g,...e.when?{condition:e.when}:{}}),c.add(f),a.add(g)}for(let b of e)a.has(b.id)||i.push({from:f,to:b.id}),c.has(b.id)||i.push({from:b.id,to:g})}return{spec:{name:"string"==typeof a?.name?a.name.trim():"",description:"string"==typeof a?.goal?a.goal.trim():"",nodes:h,edges:i},issues:b}}(a),g=(0,d.dM)(e.spec,b,c),h=[...e.issues,...g.issues];return{...g,loweredSpec:e.spec,issues:h,errorCount:h.filter(a=>"error"===a.severity).length,warningCount:h.filter(a=>"warning"===a.severity).length}}},30227:(a,b,c)=>{c.d(b,{cI:()=>r,oV:()=>u,yM:()=>p});var d=c(50846),e=c(88185),f=c(7389),g=c(38204),h=c(9312),i=c(97630),j=c(14265),k=c(1905),l=c(33233),m=c(25250);let n=(0,d.h)("backend/services/mcp/flowAuthoringTools"),o=["list_flow_building_blocks","get_flow_authoring_guide","validate_flow_spec","draft_flow","draft_generated_flow","create_flow","search_mcp_marketplace","install_mcp_server","install_best_mcp_server"];function p(a){return o.includes(a)}function q(){return{type:"object",additionalProperties:!1,properties:{spec:{oneOf:[f.Sq,{type:"object",description:'Legacy advanced FlowSpec with nodes and edges. Pass profile="advanced"; fetch its contract with get_flow_authoring_guide.'}],description:"A guided SimpleFlowSpec by default, or a legacy advanced FlowSpec."},profile:{type:"string",enum:["simple","advanced"],description:"Authoring profile. Defaults to simple; legacy specs containing nodes+edges are auto-detected as advanced."},keepPills:{type:"boolean",description:"When true, binding pills (${tool:server__name}) that resolve against the node's wired servers are preserved in the compiled output instead of being stripped. Pills that cannot be resolved are still stripped with a warning. Default: false (strip all pills — generator-safe behaviour)."}},required:["spec"]}}function r(){return[{name:"list_flow_building_blocks",description:"List models, MCP server/tool references, and existing flows available to a new flow.",inputSchema:{type:"object",properties:{}}},{name:"get_flow_authoring_guide",description:"Fetch the flow-authoring contract only when needed. The simple guide is compact; the advanced guide contains the complete FlowSpec reference.",inputSchema:{type:"object",properties:{profile:{type:"string",enum:["simple","advanced"],description:"Guide to return. Defaults to simple."}}}},{name:"validate_flow_spec",description:"Compile and validate a guided flow without saving. Returns a compact summary and issues. Use draft_flow when the caller needs the complete unsaved draft.",inputSchema:q()},{name:"draft_flow",description:"Compile and validate a flow WITHOUT saving and return the complete draft bundle for review or opening in the Flow Builder.",inputSchema:q()},{name:"draft_generated_flow",description:"Run the production Flow Generator post-processing pipeline on a complete advanced FlowSpec: scratchpad safety guard, structural auto-repair, bounded nested compilation, generated-flow defaults, and whole-bundle validation. Returns the complete UNSAVED draft and hardened spec.",inputSchema:{type:"object",additionalProperties:!1,properties:{spec:{type:"object",description:'A complete advanced FlowSpec authored using get_flow_authoring_guide(profile="advanced").'}},required:["spec"]}},{name:"create_flow",description:"Compile, validate, and save a guided flow. Saving occurs only when validation has no errors. Use list_flow_building_blocks for valid references.",inputSchema:q()},{name:"search_mcp_marketplace",description:"Search the public MCP server registry for new capabilities (voice, browsing, files, email, vision, …). The registry matches the query against server NAMES only (substring) — use short single terms and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it would require.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}},{name:"install_mcp_server",description:'Install an MCP server from the public registry (by the exact name returned by search_mcp_marketplace) and connect it — this DOWNLOADS AND RUNS a third-party package on the FLUJO host. Installs are gated by consent (SEP-1024): unless this trusted authoring tool is allowed via the mcpAutoInstall settings (trustBrainStem / requireConsent / namespaceAllowlist), the tool returns the exact resolved command + arguments with consentRequired=true INSTEAD of installing, and the caller must obtain explicit approval. Every attempt is written to an audit log (command, args, env NAMES, verification status — never secret values) before any spawn. Returns the FLUJO server name (reference it in FlowSpec "servers") and the tools it provides, or needsEnv when required keys are missing (supply values via the optional "env" argument), or the resolved plan when consent is required. First install can take minutes (package download).',inputSchema:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'},env:{type:"object",description:"Optional env var values for the server (e.g. required API keys).",additionalProperties:{type:"string"}}},required:["name"]}},{name:"install_best_mcp_server",description:"Install the BEST WORKING MCP server for a capability, unattended — the recommended way to acquire a capability when you don't already have a specific server name. Searches the registry, RANKS candidates by blended quality (GitHub stars + recent activity, npm weekly downloads, registry status), then installs best→worst until one actually boots and exposes tools (the \"works-gate\"): candidates that need unavailable keys, can't be installed, or start with zero tools are skipped automatically. Same consent/audit rules and third-party-code warning as install_mcp_server. Returns the installed server name + its tools and the list of candidates tried, or needsEnv/consentRequired. Prefer this over search+install for headless self-improvement; use install_mcp_server only when you must pin an exact server.",inputSchema:{type:"object",properties:{capability:{type:"string",description:'Short capability term matched against server names, e.g. "youtube", "email", "browser".'},env:{type:"object",description:"Optional env var values shared across attempted servers (e.g. an API key).",additionalProperties:{type:"string"}}},required:["capability"]}}]}function s(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}function t(a,b=!1){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}async function u(a,b){try{if("list_flow_building_blocks"===a){let a=await (0,h.jY)();return t(a.blocks)}if("get_flow_authoring_guide"===a){let a=b?.profile==="advanced"?"advanced":"simple";if("advanced"===a)return t({profile:a,guide:e.R});return t({profile:a,schema:f.Sq,guide:["Set name, goal, and one or more ordered steps.","Each step needs id and task. model overrides the top-level default.","Tools use server/tool references from list_flow_building_blocks.","Set flow on a step to run an existing flow instead of a model.","Omit routes for a linear flow. Routes are only for branches; omit when for the fallback.","Start, Finish, layout, data handoff, and ordinary defaults are inferred."]})}if("search_mcp_marketplace"===a){let a="string"==typeof b?.query?b.query:"",c=await (0,j.e3)(a);return t(c)}if("install_mcp_server"===a){let a="string"==typeof b?.name?b.name:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0,d=await (0,j.aM)(a,c,{resolveOnly:!0});if(!d.plan)return t(d,!0);let e=await (0,k.Ej)(),f=(0,l.e5)({caller:"authoring-tool",settings:e,registryName:a}),g=(0,m.nO)(d.plan.verificationStatus)?void 0:`Unverified / self-asserted registry entry (status: ${d.plan.verificationStatus}). Registry entries are publisher-asserted — review the command before approving.`;if(await (0,k.NB)((0,l.UM)(d.plan,"authoring-tool",f,!1)),!f.allowed)return t({installed:!1,consentRequired:!0,message:f.message,plan:d.plan,...g?{verificationWarning:g}:{}});let h=await (0,j.aM)(a,c);return await (0,k.NB)((0,l.UM)(h.plan??d.plan,"authoring-tool",f,h.installed,h.error)),t({...h,...g?{verificationWarning:g}:{}},!h.installed)}if("install_best_mcp_server"===a){let a="string"==typeof b?.capability?b.capability:"",c=b?.env&&"object"==typeof b.env&&!Array.isArray(b.env)?b.env:void 0;if(!a)return t({error:'Provide a "capability" search term.'},!0);let d=await (0,k.Ej)(),e=(0,l.e5)({caller:"authoring-tool",settings:d,registryName:a});if(!e.allowed){let b=(await (0,j.e3)(a)).find(a=>a.installable),d=b?await (0,j.aM)(b.name,c,{resolveOnly:!0}):null;return d?.plan&&await (0,k.NB)((0,l.UM)(d.plan,"authoring-tool",e,!1)),t({installed:!1,consentRequired:!0,message:e.message,...d?.plan?{plan:d.plan}:{}})}let f=await (0,j.LG)(a,c,{onAttempt:async(a,b)=>{a&&await (0,k.NB)((0,l.UM)(a,"authoring-tool",e,b.installed,b.error))}}),g=f.installed&&!(0,m.nO)(f.plan?.verificationStatus)?`Installed an unverified / self-asserted registry entry (status: ${f.plan?.verificationStatus}).`:void 0;return t({...f,...g?{verificationWarning:g}:{}},!f.installed)}if("draft_generated_flow"===a){let a=s(b);if(!a||"object"!=typeof a||Array.isArray(a))return t({error:'Provide a complete advanced FlowSpec object in "spec".'},!0);let c=await (0,h.jY)(),d=(0,i.oW)(a,c);if(!d.success)return t({error:"The generated specification could not be compiled.",spec:d.spec,issues:d.issues,hardening:{guardChanges:d.guardChanges,repairChanges:d.repairChanges}},!0);return t({profile:"advanced",pipeline:"production-generator",saved:!1,rootFlowId:d.flow.id,flow:d.flow,flows:d.flows.map(a=>a.flow),spec:d.spec,validation:d.validation,hardening:{guardChanges:d.guardChanges,repairChanges:d.repairChanges}})}if("validate_flow_spec"===a||"draft_flow"===a||"create_flow"===a){let c=s(b);if(!c)return t({error:'Provide a "spec" argument: a SimpleFlowSpec object (or JSON string).'},!0);let d=c&&"object"==typeof c&&!Array.isArray(c)?c:{},e="advanced"===b.profile?"advanced":"simple"===b.profile?"simple":Array.isArray(d.nodes)&&Array.isArray(d.edges)?"advanced":"simple",f=!0===b.keepPills,h=await (0,g.V)(c,{save:"create_flow"===a,keepPills:f,profile:e});if(!h.success)return t({error:h.error,issues:h.issues??[]},!0);let i=h.flows.length,j=i>1?` (plus ${i-1} nested subflow flow(s))`:"",k={profile:e,flowId:h.flow.id,flowName:h.flow.name,nodeCount:h.flow.nodes.length,edgeCount:h.flow.edges.length,...i>1?{flows:h.flows.map(a=>({id:a.id,name:a.name}))}:{},validation:h.validation,..."draft_flow"===a?{saved:!1,rootFlowId:h.flow.id,flow:h.flow,flows:h.flows}:{},..."create_flow"===a?{saved:h.saved,...h.saved?{note:`Flow "${h.flow.name}"${j} was created. It is callable as a tool on this MCP server (after a fresh tools/list) and as model "flow-${h.flow.name}" on the OpenAI-compatible endpoint.`}:{note:"NOT saved: validation found errors. Fix the issues and call create_flow again."}}:{}};return t(k,"create_flow"===a&&!h.saved)}return t({error:`Unknown authoring tool: ${a}`},!0)}catch(b){return n.error("authoringCallTool failed",{toolName:a,err:b}),t({error:`Authoring tool failed: ${b instanceof Error?b.message:String(b)}`},!0)}}},38204:(a,b,c)=>{c.d(b,{V:()=>k});var d=c(50846),e=c(87821),f=c(81226),g=c(7389),h=c(84671),i=c(9312);let j=(0,d.h)("backend/services/flow/compileFlow");async function k(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await (0,i.jY)(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let l="simple"===b.profile?(0,g.lJ)(a,d,{keepPills:b.keepPills}):(0,f.dM)(a,d,{keepPills:b.keepPills});if(!l.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:l.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(l.flow.id=b.updateFlowId);let m=l.flows.flatMap(a=>(0,h.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),n=(0,i.RB)(l.issues,{issues:m,errorCount:0,warningCount:0,isRunnable:!0}),o=!1;if(b.save&&0===n.errorCount){for(let a of l.flows)await e.flowService.saveFlow(a);o=!0,j.info(`Compiled and saved ${l.flows.length} flow(s); root "${l.flow.name}" (${l.flow.id})`)}else b.save&&j.info(`Compiled flow "${l.flow.name}" has ${n.errorCount} error(s); NOT saved`);return{success:!0,flow:l.flow,flows:l.flows,validation:n,saved:o}}}};