flujo-ai 3.34.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 (423) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +324 -317
  3. package/.next/app-path-routes-manifest.json +19 -18
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +24 -24
  6. package/.next/routes-manifest.json +9 -0
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_not-found.html +1 -1
  9. package/.next/server/app/_not-found.rsc +1 -1
  10. package/.next/server/app/api/approvals/[id]/route.js +1 -1
  11. package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/approvals/route.js +2 -2
  13. package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/backup/route.js +1 -1
  15. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/bugs/enhance/route.js +1 -1
  18. package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/env/route.js +2 -2
  22. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/generator/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
  31. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/mcp/app-sandbox/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/mcp/cancel/route.js +1 -1
  42. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/mcp-registry/route.js +1 -1
  56. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
  58. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/model/provider/route.js +1 -1
  61. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/model/test/route.js +1 -1
  64. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/oauth/callback/route.js +1 -1
  66. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/oauth/initiate/route.js +1 -1
  68. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/oauth/reset/route.js +1 -1
  70. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/packages/search/route.js +1 -1
  79. package/.next/server/app/api/packages/search/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
  82. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
  84. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
  86. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/registry/feedback/route.js +1 -1
  94. package/.next/server/app/api/registry/feedback/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/registry/packages/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/restore/route.js +1 -1
  101. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/runs/active/route.js +1 -1
  103. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/storage/route.js +1 -1
  105. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
  107. package/.next/server/app/api/telemetry/daily-active/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/update/route.js +1 -1
  109. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/chat/page.js +2 -2
  113. package/.next/server/app/chat/page.js.nft.json +1 -1
  114. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/chat.html +1 -1
  116. package/.next/server/app/chat.rsc +2 -2
  117. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  118. package/.next/server/app/docs.html +1 -1
  119. package/.next/server/app/docs.rsc +1 -1
  120. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  121. package/.next/server/app/executions.html +1 -1
  122. package/.next/server/app/executions.rsc +1 -1
  123. package/.next/server/app/flows/page.js +2 -2
  124. package/.next/server/app/flows/page.js.nft.json +1 -1
  125. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app/flows.html +1 -1
  127. package/.next/server/app/flows.rsc +2 -2
  128. package/.next/server/app/index.html +1 -1
  129. package/.next/server/app/index.rsc +1 -1
  130. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  131. package/.next/server/app/mcp-flows/route.js +1 -1
  132. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  134. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/mcp.html +1 -1
  136. package/.next/server/app/mcp.rsc +2 -2
  137. package/.next/server/app/models/page.js +1 -1
  138. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app/packages/page.js +1 -1
  140. package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
  141. package/.next/server/app/packages.html +1 -1
  142. package/.next/server/app/packages.rsc +2 -2
  143. package/.next/server/app/page_client-reference-manifest.js +1 -1
  144. package/.next/server/app/settings/page.js +1 -1
  145. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  146. package/.next/server/app/settings.html +1 -1
  147. package/.next/server/app/settings.rsc +2 -2
  148. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
  150. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
  152. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  154. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  156. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
  158. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
  160. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js +1 -1
  162. package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js +1 -0
  164. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js.nft.json +1 -0
  165. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
  167. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  169. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  171. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/v1/chat/conversations/route.js +1 -1
  173. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/v1/chat/events/route.js +1 -1
  175. package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/v1/models/route.js +1 -1
  177. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  179. package/.next/server/app/waves.html +1 -1
  180. package/.next/server/app/waves.rsc +1 -1
  181. package/.next/server/app-paths-manifest.json +19 -18
  182. package/.next/server/chunks/1227.js +1 -1
  183. package/.next/server/chunks/1805.js +1 -1
  184. package/.next/server/chunks/2273.js +2 -2
  185. package/.next/server/chunks/2372.js +1 -1
  186. package/.next/server/chunks/2859.js +1 -1
  187. package/.next/server/chunks/3935.js +4 -0
  188. package/.next/server/chunks/4265.js +1 -1
  189. package/.next/server/chunks/4771.js +2 -2
  190. package/.next/server/chunks/4822.js +1 -1
  191. package/.next/server/chunks/5096.js +1 -1
  192. package/.next/server/chunks/5309.js +1 -1
  193. package/.next/server/chunks/544.js +16 -16
  194. package/.next/server/chunks/5544.js +1 -1
  195. package/.next/server/chunks/5703.js +2 -2
  196. package/.next/server/chunks/6041.js +1 -1
  197. package/.next/server/chunks/6226.js +1 -1
  198. package/.next/server/chunks/6747.js +42 -42
  199. package/.next/server/chunks/701.js +1 -1
  200. package/.next/server/chunks/7069.js +4 -4
  201. package/.next/server/chunks/7506.js +1 -1
  202. package/.next/server/chunks/7628.js +1 -1
  203. package/.next/server/chunks/7891.js +1 -1
  204. package/.next/server/chunks/7993.js +1 -1
  205. package/.next/server/chunks/8284.js +1 -1
  206. package/.next/server/chunks/8387.js +1 -1
  207. package/.next/server/chunks/8645.js +1 -1
  208. package/.next/server/chunks/8739.js +1 -1
  209. package/.next/server/chunks/9085.js +1 -1
  210. package/.next/server/chunks/9235.js +1 -1
  211. package/.next/server/chunks/9285.js +1 -1
  212. package/.next/server/functions-config-manifest.json +1 -1
  213. package/.next/server/middleware-build-manifest.js +1 -1
  214. package/.next/server/middleware-manifest.json +1 -1
  215. package/.next/server/pages/404.html +1 -1
  216. package/.next/server/pages/500.html +1 -1
  217. package/.next/server/server-reference-manifest.js +1 -1
  218. package/.next/server/server-reference-manifest.json +1 -1
  219. package/.next/static/chunks/{8650-5294c6ed1173b014.js → 8650-aa22dbf7b37348f0.js} +1 -1
  220. package/.next/static/chunks/9611-9867e6e8e65172ec.js +1 -0
  221. package/.next/static/chunks/app/api/approvals/[id]/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  222. package/.next/static/chunks/app/api/approvals/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  223. package/.next/static/chunks/app/api/backup/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  224. package/.next/static/chunks/app/api/browse/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
  225. package/.next/static/chunks/app/api/bugs/enhance/route-b9c783850b4c2acf.js +1 -0
  226. package/.next/static/chunks/app/api/cwd/route-b9c783850b4c2acf.js +1 -0
  227. package/.next/static/chunks/app/api/encryption/secure/route-b9c783850b4c2acf.js +1 -0
  228. package/.next/static/chunks/app/api/env/route-b9c783850b4c2acf.js +1 -0
  229. package/.next/static/chunks/app/api/flow/[id]/route-b9c783850b4c2acf.js +1 -0
  230. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-b9c783850b4c2acf.js +1 -0
  231. package/.next/static/chunks/app/api/flow/[id]/versions/route-b9c783850b4c2acf.js +1 -0
  232. package/.next/static/chunks/app/api/flow/compile/route-b9c783850b4c2acf.js +1 -0
  233. package/.next/static/chunks/app/api/flow/generate/route-b9c783850b4c2acf.js +1 -0
  234. package/.next/static/chunks/app/api/flow/generator/route-b9c783850b4c2acf.js +1 -0
  235. package/.next/static/chunks/app/api/flow/improve/route-b9c783850b4c2acf.js +1 -0
  236. package/.next/static/chunks/app/api/flow/prompt-renderer/route-b9c783850b4c2acf.js +1 -0
  237. package/.next/static/chunks/app/api/flow/quick-chat/route-b9c783850b4c2acf.js +1 -0
  238. package/.next/static/chunks/app/api/flow/repair/route-b9c783850b4c2acf.js +1 -0
  239. package/.next/static/chunks/app/api/flow/route-b9c783850b4c2acf.js +1 -0
  240. package/.next/static/chunks/app/api/git/route-b9c783850b4c2acf.js +1 -0
  241. package/.next/static/chunks/app/api/init/route-b9c783850b4c2acf.js +1 -0
  242. package/.next/static/chunks/app/api/local-models/capability/route-b9c783850b4c2acf.js +1 -0
  243. package/.next/static/chunks/app/api/local-models/pull/route-b9c783850b4c2acf.js +1 -0
  244. package/.next/static/chunks/app/api/local-models/suggest/route-b9c783850b4c2acf.js +1 -0
  245. package/.next/static/chunks/app/api/mcp/app-sandbox/route-b9c783850b4c2acf.js +1 -0
  246. package/.next/static/chunks/app/api/mcp/cancel/route-b9c783850b4c2acf.js +1 -0
  247. package/.next/static/chunks/app/api/mcp/oauth-capability/route-b9c783850b4c2acf.js +1 -0
  248. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b9c783850b4c2acf.js +1 -0
  249. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b9c783850b4c2acf.js +1 -0
  250. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b9c783850b4c2acf.js +1 -0
  251. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b9c783850b4c2acf.js +1 -0
  252. package/.next/static/chunks/app/api/mcp/servers/[name]/route-b9c783850b4c2acf.js +1 -0
  253. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b9c783850b4c2acf.js +1 -0
  254. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b9c783850b4c2acf.js +1 -0
  255. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b9c783850b4c2acf.js +1 -0
  256. package/.next/static/chunks/app/api/mcp/servers/route-b9c783850b4c2acf.js +1 -0
  257. package/.next/static/chunks/app/api/mcp/test-connection/route-b9c783850b4c2acf.js +1 -0
  258. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b9c783850b4c2acf.js +1 -0
  259. package/.next/static/chunks/app/api/mcp-registry/route-b9c783850b4c2acf.js +1 -0
  260. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b9c783850b4c2acf.js +1 -0
  261. package/.next/static/chunks/app/api/model/[id]/route-b9c783850b4c2acf.js +1 -0
  262. package/.next/static/chunks/app/api/model/provider/route-b9c783850b4c2acf.js +1 -0
  263. package/.next/static/chunks/app/api/model/route-b9c783850b4c2acf.js +1 -0
  264. package/.next/static/chunks/app/api/model/test/route-b9c783850b4c2acf.js +1 -0
  265. package/.next/static/chunks/app/api/oauth/callback/route-b9c783850b4c2acf.js +1 -0
  266. package/.next/static/chunks/app/api/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
  267. package/.next/static/chunks/app/api/oauth/reset/route-b9c783850b4c2acf.js +1 -0
  268. package/.next/static/chunks/app/api/packages/build/route-b9c783850b4c2acf.js +1 -0
  269. package/.next/static/chunks/app/api/packages/derive-secrets/route-b9c783850b4c2acf.js +1 -0
  270. package/.next/static/chunks/app/api/packages/install/route-b9c783850b4c2acf.js +1 -0
  271. package/.next/static/chunks/app/api/packages/install/status/route-b9c783850b4c2acf.js +1 -0
  272. package/.next/static/chunks/app/api/packages/installed/route-b9c783850b4c2acf.js +1 -0
  273. package/.next/static/chunks/app/api/packages/resolve/route-b9c783850b4c2acf.js +1 -0
  274. package/.next/static/chunks/app/api/packages/scan-targets/route-b9c783850b4c2acf.js +1 -0
  275. package/.next/static/chunks/app/api/packages/search/route-b9c783850b4c2acf.js +1 -0
  276. package/.next/static/chunks/app/api/packages/uninstall/route-b9c783850b4c2acf.js +1 -0
  277. package/.next/static/chunks/app/api/planned-executions/[id]/route-b9c783850b4c2acf.js +1 -0
  278. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b9c783850b4c2acf.js +1 -0
  279. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b9c783850b4c2acf.js +1 -0
  280. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b9c783850b4c2acf.js +1 -0
  281. package/.next/static/chunks/app/api/planned-executions/reconcile/route-b9c783850b4c2acf.js +1 -0
  282. package/.next/static/chunks/app/api/planned-executions/route-b9c783850b4c2acf.js +1 -0
  283. package/.next/static/chunks/app/api/registry/auth/resend/route-b9c783850b4c2acf.js +1 -0
  284. package/.next/static/chunks/app/api/registry/auth/reset/route-b9c783850b4c2acf.js +1 -0
  285. package/.next/static/chunks/app/api/registry/auth/route-b9c783850b4c2acf.js +1 -0
  286. package/.next/static/chunks/app/api/registry/feedback/route-b9c783850b4c2acf.js +1 -0
  287. package/.next/static/chunks/app/api/registry/oauth/callback/route-b9c783850b4c2acf.js +1 -0
  288. package/.next/static/chunks/app/api/registry/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
  289. package/.next/static/chunks/app/api/registry/packages/route-b9c783850b4c2acf.js +1 -0
  290. package/.next/static/chunks/app/api/registry/publish/route-b9c783850b4c2acf.js +1 -0
  291. package/.next/static/chunks/app/api/registry/settings/route-b9c783850b4c2acf.js +1 -0
  292. package/.next/static/chunks/app/api/restore/route-b9c783850b4c2acf.js +1 -0
  293. package/.next/static/chunks/app/api/runs/active/route-b9c783850b4c2acf.js +1 -0
  294. package/.next/static/chunks/app/api/storage/route-b9c783850b4c2acf.js +1 -0
  295. package/.next/static/chunks/app/api/telemetry/daily-active/route-b9c783850b4c2acf.js +1 -0
  296. package/.next/static/chunks/app/api/update/route-b9c783850b4c2acf.js +1 -0
  297. package/.next/static/chunks/app/api/waves/route-b9c783850b4c2acf.js +1 -0
  298. package/.next/static/chunks/app/api/webhooks/[id]/route-b9c783850b4c2acf.js +1 -0
  299. package/.next/static/chunks/app/chat/{page-bc7807593b8b7394.js → page-e37bbc561f40ce60.js} +1 -1
  300. package/.next/static/chunks/app/flows/{page-87fb466e491fc068.js → page-e52c8943555e38dd.js} +1 -1
  301. package/.next/static/chunks/app/mcp-flows/route-b9c783850b4c2acf.js +1 -0
  302. package/.next/static/chunks/app/mcp-proxy/[server]/route-b9c783850b4c2acf.js +1 -0
  303. package/.next/static/chunks/app/models/page-595597042e227970.js +1 -0
  304. package/.next/static/chunks/app/packages/page-f1a22789a6c0e0b6.js +1 -0
  305. package/.next/static/chunks/app/settings/{page-2fc3a70bfd25c48b.js → page-f35e939032b0277d.js} +1 -1
  306. package/.next/static/chunks/app/v1/chat/completions/route-b9c783850b4c2acf.js +1 -0
  307. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b9c783850b4c2acf.js +1 -0
  308. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b9c783850b4c2acf.js +1 -0
  309. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b9c783850b4c2acf.js +1 -0
  310. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b9c783850b4c2acf.js +1 -0
  311. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b9c783850b4c2acf.js +1 -0
  312. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b9c783850b4c2acf.js +1 -0
  313. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-b9c783850b4c2acf.js +1 -0
  314. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route-b9c783850b4c2acf.js +1 -0
  315. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b9c783850b4c2acf.js +1 -0
  316. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b9c783850b4c2acf.js +1 -0
  317. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b9c783850b4c2acf.js +1 -0
  318. package/.next/static/chunks/app/v1/chat/conversations/route-b9c783850b4c2acf.js +1 -0
  319. package/.next/static/chunks/app/v1/chat/events/route-b9c783850b4c2acf.js +1 -0
  320. package/.next/static/chunks/app/v1/models/route-b9c783850b4c2acf.js +1 -0
  321. package/.next/static/chunks/{webpack-d5d737ff6a86674f.js → webpack-9d09d53b271f49e2.js} +1 -1
  322. package/.next/trace +10 -10
  323. package/.next/types/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.ts +347 -0
  324. package/.next/types/routes.d.ts +2 -1
  325. package/.next/types/validator.ts +9 -0
  326. package/README.md +60 -61
  327. package/package.json +1 -1
  328. package/.next/server/chunks/4308.js +0 -4
  329. package/.next/static/chunks/6733-c9029143901e62e9.js +0 -1
  330. package/.next/static/chunks/app/api/bugs/enhance/route-9ea2990be4b67136.js +0 -1
  331. package/.next/static/chunks/app/api/cwd/route-9ea2990be4b67136.js +0 -1
  332. package/.next/static/chunks/app/api/encryption/secure/route-9ea2990be4b67136.js +0 -1
  333. package/.next/static/chunks/app/api/env/route-9ea2990be4b67136.js +0 -1
  334. package/.next/static/chunks/app/api/flow/[id]/route-9ea2990be4b67136.js +0 -1
  335. package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-9ea2990be4b67136.js +0 -1
  336. package/.next/static/chunks/app/api/flow/[id]/versions/route-9ea2990be4b67136.js +0 -1
  337. package/.next/static/chunks/app/api/flow/compile/route-9ea2990be4b67136.js +0 -1
  338. package/.next/static/chunks/app/api/flow/generate/route-9ea2990be4b67136.js +0 -1
  339. package/.next/static/chunks/app/api/flow/generator/route-9ea2990be4b67136.js +0 -1
  340. package/.next/static/chunks/app/api/flow/improve/route-9ea2990be4b67136.js +0 -1
  341. package/.next/static/chunks/app/api/flow/prompt-renderer/route-9ea2990be4b67136.js +0 -1
  342. package/.next/static/chunks/app/api/flow/quick-chat/route-9ea2990be4b67136.js +0 -1
  343. package/.next/static/chunks/app/api/flow/repair/route-9ea2990be4b67136.js +0 -1
  344. package/.next/static/chunks/app/api/flow/route-9ea2990be4b67136.js +0 -1
  345. package/.next/static/chunks/app/api/git/route-9ea2990be4b67136.js +0 -1
  346. package/.next/static/chunks/app/api/init/route-9ea2990be4b67136.js +0 -1
  347. package/.next/static/chunks/app/api/local-models/capability/route-9ea2990be4b67136.js +0 -1
  348. package/.next/static/chunks/app/api/local-models/pull/route-9ea2990be4b67136.js +0 -1
  349. package/.next/static/chunks/app/api/local-models/suggest/route-9ea2990be4b67136.js +0 -1
  350. package/.next/static/chunks/app/api/mcp/app-sandbox/route-9ea2990be4b67136.js +0 -1
  351. package/.next/static/chunks/app/api/mcp/cancel/route-9ea2990be4b67136.js +0 -1
  352. package/.next/static/chunks/app/api/mcp/oauth-capability/route-9ea2990be4b67136.js +0 -1
  353. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-9ea2990be4b67136.js +0 -1
  354. package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-9ea2990be4b67136.js +0 -1
  355. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-9ea2990be4b67136.js +0 -1
  356. package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-9ea2990be4b67136.js +0 -1
  357. package/.next/static/chunks/app/api/mcp/servers/[name]/route-9ea2990be4b67136.js +0 -1
  358. package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-9ea2990be4b67136.js +0 -1
  359. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-9ea2990be4b67136.js +0 -1
  360. package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-9ea2990be4b67136.js +0 -1
  361. package/.next/static/chunks/app/api/mcp/servers/route-9ea2990be4b67136.js +0 -1
  362. package/.next/static/chunks/app/api/mcp/test-connection/route-9ea2990be4b67136.js +0 -1
  363. package/.next/static/chunks/app/api/mcp/test-connection/stream/route-9ea2990be4b67136.js +0 -1
  364. package/.next/static/chunks/app/api/mcp-registry/route-9ea2990be4b67136.js +0 -1
  365. package/.next/static/chunks/app/api/mcp-registry/spotlight/route-9ea2990be4b67136.js +0 -1
  366. package/.next/static/chunks/app/api/model/[id]/route-9ea2990be4b67136.js +0 -1
  367. package/.next/static/chunks/app/api/model/provider/route-9ea2990be4b67136.js +0 -1
  368. package/.next/static/chunks/app/api/model/route-9ea2990be4b67136.js +0 -1
  369. package/.next/static/chunks/app/api/model/test/route-9ea2990be4b67136.js +0 -1
  370. package/.next/static/chunks/app/api/oauth/callback/route-9ea2990be4b67136.js +0 -1
  371. package/.next/static/chunks/app/api/oauth/initiate/route-9ea2990be4b67136.js +0 -1
  372. package/.next/static/chunks/app/api/oauth/reset/route-9ea2990be4b67136.js +0 -1
  373. package/.next/static/chunks/app/api/packages/build/route-9ea2990be4b67136.js +0 -1
  374. package/.next/static/chunks/app/api/packages/derive-secrets/route-9ea2990be4b67136.js +0 -1
  375. package/.next/static/chunks/app/api/packages/install/route-9ea2990be4b67136.js +0 -1
  376. package/.next/static/chunks/app/api/packages/install/status/route-9ea2990be4b67136.js +0 -1
  377. package/.next/static/chunks/app/api/packages/installed/route-9ea2990be4b67136.js +0 -1
  378. package/.next/static/chunks/app/api/packages/resolve/route-9ea2990be4b67136.js +0 -1
  379. package/.next/static/chunks/app/api/packages/scan-targets/route-9ea2990be4b67136.js +0 -1
  380. package/.next/static/chunks/app/api/packages/search/route-9ea2990be4b67136.js +0 -1
  381. package/.next/static/chunks/app/api/packages/uninstall/route-9ea2990be4b67136.js +0 -1
  382. package/.next/static/chunks/app/api/planned-executions/[id]/route-9ea2990be4b67136.js +0 -1
  383. package/.next/static/chunks/app/api/planned-executions/[id]/run/route-9ea2990be4b67136.js +0 -1
  384. package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-9ea2990be4b67136.js +0 -1
  385. package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-9ea2990be4b67136.js +0 -1
  386. package/.next/static/chunks/app/api/planned-executions/reconcile/route-9ea2990be4b67136.js +0 -1
  387. package/.next/static/chunks/app/api/planned-executions/route-9ea2990be4b67136.js +0 -1
  388. package/.next/static/chunks/app/api/registry/auth/resend/route-9ea2990be4b67136.js +0 -1
  389. package/.next/static/chunks/app/api/registry/auth/reset/route-9ea2990be4b67136.js +0 -1
  390. package/.next/static/chunks/app/api/registry/auth/route-9ea2990be4b67136.js +0 -1
  391. package/.next/static/chunks/app/api/registry/feedback/route-9ea2990be4b67136.js +0 -1
  392. package/.next/static/chunks/app/api/registry/oauth/callback/route-9ea2990be4b67136.js +0 -1
  393. package/.next/static/chunks/app/api/registry/oauth/initiate/route-9ea2990be4b67136.js +0 -1
  394. package/.next/static/chunks/app/api/registry/packages/route-9ea2990be4b67136.js +0 -1
  395. package/.next/static/chunks/app/api/registry/publish/route-9ea2990be4b67136.js +0 -1
  396. package/.next/static/chunks/app/api/registry/settings/route-9ea2990be4b67136.js +0 -1
  397. package/.next/static/chunks/app/api/restore/route-9ea2990be4b67136.js +0 -1
  398. package/.next/static/chunks/app/api/runs/active/route-9ea2990be4b67136.js +0 -1
  399. package/.next/static/chunks/app/api/storage/route-9ea2990be4b67136.js +0 -1
  400. package/.next/static/chunks/app/api/telemetry/daily-active/route-9ea2990be4b67136.js +0 -1
  401. package/.next/static/chunks/app/api/update/route-9ea2990be4b67136.js +0 -1
  402. package/.next/static/chunks/app/api/waves/route-9ea2990be4b67136.js +0 -1
  403. package/.next/static/chunks/app/api/webhooks/[id]/route-9ea2990be4b67136.js +0 -1
  404. package/.next/static/chunks/app/mcp-flows/route-9ea2990be4b67136.js +0 -1
  405. package/.next/static/chunks/app/mcp-proxy/[server]/route-9ea2990be4b67136.js +0 -1
  406. package/.next/static/chunks/app/models/page-a5e2437356b06db8.js +0 -1
  407. package/.next/static/chunks/app/packages/page-fba5696f33d9cdfb.js +0 -1
  408. package/.next/static/chunks/app/v1/chat/completions/route-9ea2990be4b67136.js +0 -1
  409. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-9ea2990be4b67136.js +0 -1
  410. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-9ea2990be4b67136.js +0 -1
  411. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-9ea2990be4b67136.js +0 -1
  412. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-9ea2990be4b67136.js +0 -1
  413. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-9ea2990be4b67136.js +0 -1
  414. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-9ea2990be4b67136.js +0 -1
  415. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-9ea2990be4b67136.js +0 -1
  416. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-9ea2990be4b67136.js +0 -1
  417. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-9ea2990be4b67136.js +0 -1
  418. package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-9ea2990be4b67136.js +0 -1
  419. package/.next/static/chunks/app/v1/chat/conversations/route-9ea2990be4b67136.js +0 -1
  420. package/.next/static/chunks/app/v1/chat/events/route-9ea2990be4b67136.js +0 -1
  421. package/.next/static/chunks/app/v1/models/route-9ea2990be4b67136.js +0 -1
  422. /package/.next/static/{Zz_Vh59XdtLIPcf-PxCpo → hbjnLG9RCje2AApS9TzP8}/_buildManifest.js +0 -0
  423. /package/.next/static/{Zz_Vh59XdtLIPcf-PxCpo → hbjnLG9RCje2AApS9TzP8}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=2859,exports.ids=[2859],exports.modules={29715:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(95708),e=c(92372),f=c(60184),g=c(38291);let h=(0,c(50846).h)("backend/execution/flow/loadConversationState");async function i(a){try{(0,e.ln)(a)}catch{h.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(d.FlowExecutor.conversationStates.has(a))return h.debug("Loaded state from memory",{conversationId:a}),d.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,e.YM)(b,void 0);if(c){h.debug("Loaded state from storage",{conversationId:a}),await (0,f.recoverMessagesFromLog)(c);try{let d=(0,f.repairDanglingToolCalls)(c);d.length&&(h.info("Repaired dangling tool call(s) on load",{conversationId:a,count:d.length}),await (0,f.appendRawForState)(c,d.map(a=>({type:"message",message:a}))),await (0,g.persistConversationState)(b,c))}catch(b){h.warn("Failed to repair dangling tool calls on load; continuing",{conversationId:a,repairError:b})}return d.FlowExecutor.conversationStates.set(a,c),c}}catch(b){h.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>ab,internalToolDefinitions:()=>x});var d=c(33873),e=c.n(d),f=c(29021),g=c(50846),h=c(87821),i=c(20433),j=c(4771),k=c(52189),l=c(16226),m=c(38204),n=c(9312),o=c(29715),p=c(60184),q=c(14214),r=c(43326),s=c(78325),t=c(30227),u=c(81495);let v=(0,g.h)("backend/services/mcp/internalTools");function w(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function x(){return[...(0,t.cI)(),{name:"list_flows",description:"List all flows in this FLUJO instance with lightweight metadata only (id, name, description, node count) and no flow content. Use this to enumerate flows cheaply. Use list_flow_building_blocks only when you need the full authoring catalog (models + servers + flows).",inputSchema:{type:"object",properties:{}}},{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}},{name:"update_planned_execution",description:'Modify an existing planned execution (by id or name, see list_planned_executions). Patch any of: "enabled" (turn the schedule on/off), "prompt" (the run prompt), "flowId" (the flow to run — accepts a flow name or id), "cron" (a convenience for the trigger\'s cron pattern — works for schedule / mcp-poll / url-watch triggers) or a full "trigger" object for complete control. Flow-driven cadence changes are clamped to a minimum interval (a runaway every-second schedule is rejected). The webhook secret token is never returned.',inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."},enabled:{type:"boolean",description:"Enable or disable the execution."},prompt:{type:"string",description:"The run prompt."},flowId:{type:"string",description:"The flow to run — a flow name or id (resolved to the flow id)."},cron:{type:"string",description:"Cron pattern (croner syntax; 6-field form for seconds) for the trigger's schedule. Applies to schedule / mcp-poll / url-watch triggers."},trigger:{type:"object",description:"Full trigger config object (escape hatch for complete control). Prefer the named fields above."}},required:["execution"]}},{name:"create_planned_execution",description:'Create a new planned execution: bind a flow to a trigger so it runs headlessly. Provide "name", "flow" (a flow name or id), an optional "prompt", optional "enabled" (default true), and EITHER a full "trigger" object OR a convenience "cron" (which creates a schedule trigger). Flow-driven cadence is clamped to a minimum interval. A webhook trigger\'s secret token is minted server-side and never returned.',inputSchema:{type:"object",properties:{name:{type:"string",description:"A name for the planned execution."},flow:{type:"string",description:"The flow to run — a flow name or id."},prompt:{type:"string",description:"The run prompt (may be empty)."},enabled:{type:"boolean",description:"Whether to arm the trigger immediately (default true)."},cron:{type:"string",description:'Cron pattern for a schedule trigger (convenience — use "trigger" for other trigger types).'},trigger:{type:"object",description:"Full trigger config object (schedule / webhook / file-watch / mcp-poll / url-watch)."}},required:["name","flow"]}},{name:"delete_planned_execution",description:"Permanently delete a planned execution (by id or name, see list_planned_executions), along with its run history. This cannot be undone.",inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."}},required:["execution"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"kv_get",description:'Read a value from FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs (loop counters, cursors, flags). Returns { found, value }. Defaults to the instance-global board; pass "scope" to target another board (e.g. a flow-folder board id). Values are plain strings, never secrets.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to read (an identifier: letters, digits, _ and -, not starting with a digit)."},scope:{type:"string",description:'Optional board id to read from. Defaults to "global".'}},required:["name"]}},{name:"kv_set",description:'Write a value to FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs. Last-write-wins. Defaults to the instance-global board; pass "scope" to target another board. Values are plain strings (never secrets — use ${global:} for those) and are size-capped; an oversized write is refused with { saved:false, skipped }.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to write (an identifier: letters, digits, _ and -, not starting with a digit)."},value:{type:"string",description:"The string value to store."},scope:{type:"string",description:'Optional board id to write to. Defaults to "global".'}},required:["name","value"]}}]}async function y(a){let b=await h.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function z(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return w({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return w({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return w({error:b.error?.message??"Unknown error during flow execution."},!0);return w(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.deleteFlow(c.id);return d.success?w({deleted:!0,flowId:c.id,flowName:c.name}):w({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function B(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":b?.edgeType==="resource"?"resource":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function C(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);return c?w({...B(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function D(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.listFlowVersions(c.id);return w({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function E(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.getFlowVersion(d.id,c);return e?w({versionId:e.versionId,savedAt:e.savedAt,...B(e.flow)}):w({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function F(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.revertFlow(d.id,c);return e.success?w({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):w({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function G(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return w({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?w({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):w({error:e.error,issues:e.issues??[]},!0)}async function H(a){let b=await a.loadServerConfigs();return Array.isArray(b)?w(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){v.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):w({error:b.error??"Failed to load server configs."},!0)}async function I(a,b,c){let d=String(b?.server??"").trim();if(!d)return w({error:'Provide "server": a FLUJO server name.'},!0);if(d===u._)return w(x().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:e,error:f}=await a.listServerTools(d,"host"===c?"all":c);return f?w({error:f},!0):w(e.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function J(a,b,c){let d=String(b?.server??"").trim(),e=String(b?.tool??"").trim();if(!d||!e)return w({error:'Provide "server" and "tool".'},!0);if(d===u._)return w({error:`"${u._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let f=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},g="number"==typeof b?.timeout?b.timeout:void 0,h=await a.callTool(d,e,f,g,void 0,void 0,void 0,c);if(!h.success)return w({error:h.error??`Tool call failed on ${d}.`},!0);let i=h.data;return i&&Array.isArray(i.content)?i:w(i??{ok:!0})}async function K(a,b){let c=String(b?.server??"").trim();if(!c)return w({error:'Provide "server": a FLUJO server name.'},!0);if(c===u._)return w({ok:!0,note:`"${u._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return w({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return w({restarted:!0,server:c,status:e.status})}async function L(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return w({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===u._)return w({error:`The built-in "${u._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?w({error:e.error},!0):w({server:c,enabled:d})}async function M(){try{let a=(await h.flowService.loadFlows()).map(a=>({id:a.id,name:a.name,...a.description?{description:(0,n.xv)(a.description,n.bD)}:{},nodeCount:a.nodes?.length??0}));return w(a)}catch(a){return v.error("list_flows failed",a),w({error:"Failed to load flows."},!0)}}async function N(){return w((await i.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function O(){return w((await (0,j.getSchedulerService)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function P(a){let b=String(a?.id??"").trim();if(!b)return w({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,j.getSchedulerService)().runNow(b);return d||!c?w({error:d??"Run failed."},!0):w({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function Q(a){let b=await (0,j.getSchedulerService)().list(),c=b.find(b=>b.execution.id===a),d=b.find(b=>b.execution.name===a);return(c??d)?.execution??null}function R(a){return{id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type}}function S(a,b){try{let c=(0,k.Z9)(a,b,5).map(a=>new Date(a).getTime()),d=1/0;for(let a=1;a<c.length;a++){let b=c[a]-c[a-1];b>0&&b<d&&(d=b)}return Number.isFinite(d)?d:null}catch{return null}}function T(a){let b=null;return("schedule"===a.type||"url-watch"===a.type?a.cron&&(b=S(a.cron,a.timezone)):"mcp-poll"===a.type&&(a.cron?b=S(a.cron,a.timezone):"number"==typeof a.intervalMs&&(b=a.intervalMs)),null!==b&&b<6e4)?`Cadence too fast: the trigger would fire about every ${Math.round(b/1e3)}s, but flow-driven schedule changes are clamped to a minimum interval of 60s. Choose a slower cadence (change it from the Planned Executions page for a faster one).`:null}async function U(a){let b,c=String(a?.execution??"").trim();if(!c)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let d=await Q(c);if(!d)return w({error:`No planned execution with id or name "${c}". Use list_planned_executions to see them.`},!0);let e={};"boolean"==typeof a?.enabled&&(e.enabled=a.enabled),"string"==typeof a?.prompt&&(e.prompt=a.prompt);let f=String(a?.flowId??a?.flow??"").trim();if(f){let a=await y(f);if(!a)return w({error:`No flow named or with id "${f}". Use list_flow_building_blocks to see the flows.`},!0);e.flowId=a.id}a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger)&&(b=a.trigger);let g="string"==typeof a?.cron?a.cron.trim():"";if(g){let a=b??d.trigger;if("schedule"!==a.type&&"mcp-poll"!==a.type&&"url-watch"!==a.type)return w({error:`The "${a.type}" trigger has no schedule to change with "cron". Pass a full "trigger" object instead.`},!0);b={...a,cron:g}}if(b){let a=T(b);if(a)return w({error:a},!0);e.trigger=b}if(0===Object.keys(e).length)return w({error:"Nothing to update. Provide at least one of: enabled, prompt, flowId, cron, trigger."},!0);let h=await (0,j.getSchedulerService)().update(d.id,e);return h.error||!h.execution?w({error:h.error??"Update failed."},!0):w({updated:!0,...R(h.execution)})}async function V(a){let b,c=String(a?.name??"").trim();if(!c)return w({error:'Provide "name": a name for the planned execution.'},!0);let d=String(a?.flow??a?.flowId??"").trim();if(!d)return w({error:'Provide "flow": a flow name or id to run.'},!0);let e=await y(d);if(!e)return w({error:`No flow named or with id "${d}". Use list_flow_building_blocks to see the flows.`},!0);if(a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger))b=a.trigger;else{let c="string"==typeof a?.cron?a.cron.trim():"";if(!c)return w({error:'Provide a "trigger" object or a "cron" pattern (which creates a schedule trigger).'},!0);b={type:"schedule",cron:c}}let f=T(b);if(f)return w({error:f},!0);let g={name:c,enabled:"boolean"!=typeof a?.enabled||a.enabled,flowId:e.id,prompt:"string"==typeof a?.prompt?a.prompt:"",trigger:b},h=await (0,j.getSchedulerService)().create(g);return h.error||!h.execution?w({error:h.error??"Create failed."},!0):w({created:!0,...R(h.execution)})}async function W(a){let b=String(a?.execution??"").trim();if(!b)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let c=await Q(b);if(!c)return w({error:`No planned execution with id or name "${b}". Use list_planned_executions to see them.`},!0);let d=await (0,j.getSchedulerService)().delete(c.id);return d.success?w({deleted:!0,id:c.id,name:c.name}):w({error:d.error??`Failed to delete "${c.name}".`},!0)}async function X(a){let b,c=e().join((0,r.getDataDir)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return w([]);return w({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===q.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return v.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return w(g?d.slice(0,g):d)}async function Y(a){let b=String(a?.conversation??"").trim();if(!b)return w({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,p.flushConversationLog)(b);let c=await (0,o.N)(b);if(!c)return w({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,p.readConversationLog)(b),e=d?(0,p.projectMessages)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),w({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}let Z=/^[A-Za-z0-9_-]{1,64}$/,$=/^[A-Za-z_][\w-]*$/;async function _(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global";if(!$.test(b))return w({error:'kv_get requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let d=await (0,s.M3)(c,b);return w({scope:c,name:b,found:void 0!==d,value:d??null})}async function aa(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global",d="string"==typeof a.value?a.value:null==a.value?"":String(a.value);if(!$.test(b))return w({error:'kv_set requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let e=await (0,s.or)(c,b,d);return"skipped"in e?w({scope:c,name:b,saved:!1,skipped:e.skipped},!0):w({scope:c,name:b,saved:!0,size:e.size})}async function ab(a,b,c,d="host"){try{if((0,t.yM)(b))return await (0,t.oV)(b,c);switch(b){case"list_flows":return await M();case"execute_flow":return await z(c);case"read_flow":return await C(c);case"update_flow":return await G(c);case"list_flow_versions":return await D(c);case"read_flow_version":return await E(c);case"revert_flow":return await F(c);case"delete_flow":return await A(c);case"list_mcp_servers":return await H(a);case"list_mcp_server_tools":return await I(a,c,d);case"call_mcp_tool":return await J(a,c,d);case"restart_mcp_server":return await K(a,c);case"set_mcp_server_enabled":return await L(a,c);case"list_models":return await N();case"list_planned_executions":return await O();case"run_planned_execution":return await P(c);case"update_planned_execution":return await U(c);case"create_planned_execution":return await V(c);case"delete_planned_execution":return await W(c);case"list_conversations":return await X(c);case"read_conversation":return await Y(c);case"kv_get":return await _(c);case"kv_set":return await aa(c);default:return w({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return v.error("internalCallTool failed",{toolName:b,err:a}),w({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
1
+ "use strict";exports.id=2859,exports.ids=[2859],exports.modules={29715:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(95708),e=c(92372),f=c(60184),g=c(38291);let h=(0,c(50846).h)("backend/execution/flow/loadConversationState");async function i(a){try{(0,e.ln)(a)}catch{h.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(d.FlowExecutor.conversationStates.has(a))return h.debug("Loaded state from memory",{conversationId:a}),d.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,e.loadItem)(b,void 0);if(c){h.debug("Loaded state from storage",{conversationId:a}),await (0,f.recoverMessagesFromLog)(c);try{let d=(0,f.repairDanglingToolCalls)(c);d.length&&(h.info("Repaired dangling tool call(s) on load",{conversationId:a,count:d.length}),await (0,f.appendRawForState)(c,d.map(a=>({type:"message",message:a}))),await (0,g.persistConversationState)(b,c))}catch(b){h.warn("Failed to repair dangling tool calls on load; continuing",{conversationId:a,repairError:b})}return d.FlowExecutor.conversationStates.set(a,c),c}}catch(b){h.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>ab,internalToolDefinitions:()=>x});var d=c(33873),e=c.n(d),f=c(29021),g=c(50846),h=c(87821),i=c(20433),j=c(4771),k=c(52189),l=c(16226),m=c(38204),n=c(9312),o=c(29715),p=c(60184),q=c(14214),r=c(43326),s=c(78325),t=c(30227),u=c(81495);let v=(0,g.h)("backend/services/mcp/internalTools");function w(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function x(){return[...(0,t.cI)(),{name:"list_flows",description:"List all flows in this FLUJO instance with lightweight metadata only (id, name, description, node count) and no flow content. Use this to enumerate flows cheaply. Use list_flow_building_blocks only when you need the full authoring catalog (models + servers + flows).",inputSchema:{type:"object",properties:{}}},{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}},{name:"update_planned_execution",description:'Modify an existing planned execution (by id or name, see list_planned_executions). Patch any of: "enabled" (turn the schedule on/off), "prompt" (the run prompt), "flowId" (the flow to run — accepts a flow name or id), "cron" (a convenience for the trigger\'s cron pattern — works for schedule / mcp-poll / url-watch triggers) or a full "trigger" object for complete control. Flow-driven cadence changes are clamped to a minimum interval (a runaway every-second schedule is rejected). The webhook secret token is never returned.',inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."},enabled:{type:"boolean",description:"Enable or disable the execution."},prompt:{type:"string",description:"The run prompt."},flowId:{type:"string",description:"The flow to run — a flow name or id (resolved to the flow id)."},cron:{type:"string",description:"Cron pattern (croner syntax; 6-field form for seconds) for the trigger's schedule. Applies to schedule / mcp-poll / url-watch triggers."},trigger:{type:"object",description:"Full trigger config object (escape hatch for complete control). Prefer the named fields above."}},required:["execution"]}},{name:"create_planned_execution",description:'Create a new planned execution: bind a flow to a trigger so it runs headlessly. Provide "name", "flow" (a flow name or id), an optional "prompt", optional "enabled" (default true), and EITHER a full "trigger" object OR a convenience "cron" (which creates a schedule trigger). Flow-driven cadence is clamped to a minimum interval. A webhook trigger\'s secret token is minted server-side and never returned.',inputSchema:{type:"object",properties:{name:{type:"string",description:"A name for the planned execution."},flow:{type:"string",description:"The flow to run — a flow name or id."},prompt:{type:"string",description:"The run prompt (may be empty)."},enabled:{type:"boolean",description:"Whether to arm the trigger immediately (default true)."},cron:{type:"string",description:'Cron pattern for a schedule trigger (convenience — use "trigger" for other trigger types).'},trigger:{type:"object",description:"Full trigger config object (schedule / webhook / file-watch / mcp-poll / url-watch)."}},required:["name","flow"]}},{name:"delete_planned_execution",description:"Permanently delete a planned execution (by id or name, see list_planned_executions), along with its run history. This cannot be undone.",inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."}},required:["execution"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"kv_get",description:'Read a value from FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs (loop counters, cursors, flags). Returns { found, value }. Defaults to the instance-global board; pass "scope" to target another board (e.g. a flow-folder board id). Values are plain strings, never secrets.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to read (an identifier: letters, digits, _ and -, not starting with a digit)."},scope:{type:"string",description:'Optional board id to read from. Defaults to "global".'}},required:["name"]}},{name:"kv_set",description:'Write a value to FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs. Last-write-wins. Defaults to the instance-global board; pass "scope" to target another board. Values are plain strings (never secrets — use ${global:} for those) and are size-capped; an oversized write is refused with { saved:false, skipped }.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to write (an identifier: letters, digits, _ and -, not starting with a digit)."},value:{type:"string",description:"The string value to store."},scope:{type:"string",description:'Optional board id to write to. Defaults to "global".'}},required:["name","value"]}}]}async function y(a){let b=await h.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function z(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return w({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return w({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return w({error:b.error?.message??"Unknown error during flow execution."},!0);return w(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.deleteFlow(c.id);return d.success?w({deleted:!0,flowId:c.id,flowName:c.name}):w({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function B(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":b?.edgeType==="resource"?"resource":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function C(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);return c?w({...B(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function D(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.listFlowVersions(c.id);return w({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function E(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.getFlowVersion(d.id,c);return e?w({versionId:e.versionId,savedAt:e.savedAt,...B(e.flow)}):w({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function F(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.revertFlow(d.id,c);return e.success?w({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):w({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function G(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return w({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?w({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):w({error:e.error,issues:e.issues??[]},!0)}async function H(a){let b=await a.loadServerConfigs();return Array.isArray(b)?w(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){v.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):w({error:b.error??"Failed to load server configs."},!0)}async function I(a,b,c){let d=String(b?.server??"").trim();if(!d)return w({error:'Provide "server": a FLUJO server name.'},!0);if(d===u._)return w(x().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:e,error:f}=await a.listServerTools(d,"host"===c?"all":c);return f?w({error:f},!0):w(e.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function J(a,b,c){let d=String(b?.server??"").trim(),e=String(b?.tool??"").trim();if(!d||!e)return w({error:'Provide "server" and "tool".'},!0);if(d===u._)return w({error:`"${u._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let f=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},g="number"==typeof b?.timeout?b.timeout:void 0,h=await a.callTool(d,e,f,g,void 0,void 0,void 0,c);if(!h.success)return w({error:h.error??`Tool call failed on ${d}.`},!0);let i=h.data;return i&&Array.isArray(i.content)?i:w(i??{ok:!0})}async function K(a,b){let c=String(b?.server??"").trim();if(!c)return w({error:'Provide "server": a FLUJO server name.'},!0);if(c===u._)return w({ok:!0,note:`"${u._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return w({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return w({restarted:!0,server:c,status:e.status})}async function L(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return w({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===u._)return w({error:`The built-in "${u._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?w({error:e.error},!0):w({server:c,enabled:d})}async function M(){try{let a=(await h.flowService.loadFlows()).map(a=>({id:a.id,name:a.name,...a.description?{description:(0,n.xv)(a.description,n.bD)}:{},nodeCount:a.nodes?.length??0}));return w(a)}catch(a){return v.error("list_flows failed",a),w({error:"Failed to load flows."},!0)}}async function N(){return w((await i.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function O(){return w((await (0,j.getSchedulerService)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function P(a){let b=String(a?.id??"").trim();if(!b)return w({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,j.getSchedulerService)().runNow(b);return d||!c?w({error:d??"Run failed."},!0):w({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function Q(a){let b=await (0,j.getSchedulerService)().list(),c=b.find(b=>b.execution.id===a),d=b.find(b=>b.execution.name===a);return(c??d)?.execution??null}function R(a){return{id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type}}function S(a,b){try{let c=(0,k.Z9)(a,b,5).map(a=>new Date(a).getTime()),d=1/0;for(let a=1;a<c.length;a++){let b=c[a]-c[a-1];b>0&&b<d&&(d=b)}return Number.isFinite(d)?d:null}catch{return null}}function T(a){let b=null;return("schedule"===a.type||"url-watch"===a.type?a.cron&&(b=S(a.cron,a.timezone)):"mcp-poll"===a.type&&(a.cron?b=S(a.cron,a.timezone):"number"==typeof a.intervalMs&&(b=a.intervalMs)),null!==b&&b<6e4)?`Cadence too fast: the trigger would fire about every ${Math.round(b/1e3)}s, but flow-driven schedule changes are clamped to a minimum interval of 60s. Choose a slower cadence (change it from the Planned Executions page for a faster one).`:null}async function U(a){let b,c=String(a?.execution??"").trim();if(!c)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let d=await Q(c);if(!d)return w({error:`No planned execution with id or name "${c}". Use list_planned_executions to see them.`},!0);let e={};"boolean"==typeof a?.enabled&&(e.enabled=a.enabled),"string"==typeof a?.prompt&&(e.prompt=a.prompt);let f=String(a?.flowId??a?.flow??"").trim();if(f){let a=await y(f);if(!a)return w({error:`No flow named or with id "${f}". Use list_flow_building_blocks to see the flows.`},!0);e.flowId=a.id}a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger)&&(b=a.trigger);let g="string"==typeof a?.cron?a.cron.trim():"";if(g){let a=b??d.trigger;if("schedule"!==a.type&&"mcp-poll"!==a.type&&"url-watch"!==a.type)return w({error:`The "${a.type}" trigger has no schedule to change with "cron". Pass a full "trigger" object instead.`},!0);b={...a,cron:g}}if(b){let a=T(b);if(a)return w({error:a},!0);e.trigger=b}if(0===Object.keys(e).length)return w({error:"Nothing to update. Provide at least one of: enabled, prompt, flowId, cron, trigger."},!0);let h=await (0,j.getSchedulerService)().update(d.id,e);return h.error||!h.execution?w({error:h.error??"Update failed."},!0):w({updated:!0,...R(h.execution)})}async function V(a){let b,c=String(a?.name??"").trim();if(!c)return w({error:'Provide "name": a name for the planned execution.'},!0);let d=String(a?.flow??a?.flowId??"").trim();if(!d)return w({error:'Provide "flow": a flow name or id to run.'},!0);let e=await y(d);if(!e)return w({error:`No flow named or with id "${d}". Use list_flow_building_blocks to see the flows.`},!0);if(a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger))b=a.trigger;else{let c="string"==typeof a?.cron?a.cron.trim():"";if(!c)return w({error:'Provide a "trigger" object or a "cron" pattern (which creates a schedule trigger).'},!0);b={type:"schedule",cron:c}}let f=T(b);if(f)return w({error:f},!0);let g={name:c,enabled:"boolean"!=typeof a?.enabled||a.enabled,flowId:e.id,prompt:"string"==typeof a?.prompt?a.prompt:"",trigger:b},h=await (0,j.getSchedulerService)().create(g);return h.error||!h.execution?w({error:h.error??"Create failed."},!0):w({created:!0,...R(h.execution)})}async function W(a){let b=String(a?.execution??"").trim();if(!b)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let c=await Q(b);if(!c)return w({error:`No planned execution with id or name "${b}". Use list_planned_executions to see them.`},!0);let d=await (0,j.getSchedulerService)().delete(c.id);return d.success?w({deleted:!0,id:c.id,name:c.name}):w({error:d.error??`Failed to delete "${c.name}".`},!0)}async function X(a){let b,c=e().join((0,r.getDataDir)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return w([]);return w({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===q.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return v.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return w(g?d.slice(0,g):d)}async function Y(a){let b=String(a?.conversation??"").trim();if(!b)return w({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,p.flushConversationLog)(b);let c=await (0,o.N)(b);if(!c)return w({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,p.readConversationLog)(b),e=d?(0,p.projectMessages)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),w({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}let Z=/^[A-Za-z0-9_-]{1,64}$/,$=/^[A-Za-z_][\w-]*$/;async function _(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global";if(!$.test(b))return w({error:'kv_get requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let d=await (0,s.M3)(c,b);return w({scope:c,name:b,found:void 0!==d,value:d??null})}async function aa(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global",d="string"==typeof a.value?a.value:null==a.value?"":String(a.value);if(!$.test(b))return w({error:'kv_set requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let e=await (0,s.or)(c,b,d);return"skipped"in e?w({scope:c,name:b,saved:!1,skipped:e.skipped},!0):w({scope:c,name:b,saved:!0,size:e.size})}async function ab(a,b,c,d="host"){try{if((0,t.yM)(b))return await (0,t.oV)(b,c);switch(b){case"list_flows":return await M();case"execute_flow":return await z(c);case"read_flow":return await C(c);case"update_flow":return await G(c);case"list_flow_versions":return await D(c);case"read_flow_version":return await E(c);case"revert_flow":return await F(c);case"delete_flow":return await A(c);case"list_mcp_servers":return await H(a);case"list_mcp_server_tools":return await I(a,c,d);case"call_mcp_tool":return await J(a,c,d);case"restart_mcp_server":return await K(a,c);case"set_mcp_server_enabled":return await L(a,c);case"list_models":return await N();case"list_planned_executions":return await O();case"run_planned_execution":return await P(c);case"update_planned_execution":return await U(c);case"create_planned_execution":return await V(c);case"delete_planned_execution":return await W(c);case"list_conversations":return await X(c);case"read_conversation":return await Y(c);case"kv_get":return await _(c);case"kv_set":return await aa(c);default:return w({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return v.error("internalCallTool failed",{toolName:b,err:a}),w({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
@@ -0,0 +1,4 @@
1
+ "use strict";exports.id=3935,exports.ids=[3935],exports.modules={4580:(a,b,c)=>{async function d(a,b){throw Error("Web Speech API is only available in browser environments")}function e(){return{supported:!1,message:"Not in browser environment"}}c.d(b,{G:()=>e,S:()=>d}),(0,c(19815).h)("frontend/services/transcription/webSpeech")},6135:(a,b,c)=>{c.d(b,{A:()=>al});var d=c(21124),e=c(38301),f=c.n(e),g=c(79515),h=c(81637),i=c(68730),j=c(8521),k=c(43312),l=c(41893),m=c(99561),n=c(95587),o=c(67191),p=c(44079),q=c(54573),r=c(61628),s=c(19787),t=c(95803),u=c(77028),v=c(82605),w=c(50062),x=c(7675),y=c(94367),z=c(38233),A=c(37674),B=c(29231),C=c(86374),D=c(74419),E=c(7118),F=c(50553),G=c(84233),H=c(45798),I=c(18954),J=c(96955),K=c(16348),L=c(13665),M=c(9258),N=c(73245),O=c(17332),P=c(84049),Q=c(56685),R=c(82543),S=c(22797),T=c(12033),U=c(24276),V=c(885),W=c(91353),X=c(82571),Y=c(98502);function Z(a){return!!a&&(a.startsWith(Y.n9)||"handoff"===a)}var $=c(34641);function _(a){return a.url?a.url:a.data?`data:${a.mimeType??"application/octet-stream"};base64,${a.data}`:void 0}let aa=(0,c(19815).h)("frontend/components/Chat/ChatMessages");function ab(a){return"assistant"===a.role&&"tool_calls"in a&&Array.isArray(a.tool_calls)}function ac(a){if("tool"!==a.role||"string"!=typeof a.content)return!1;try{return JSON.parse(a.content)?.handoff===!0}catch{return!1}}let ad={p:a=>(0,d.jsx)(g.default,{variant:"body1",sx:{mb:.5,whiteSpace:"pre-line"},children:a.children}),h1:a=>(0,d.jsx)(g.default,{variant:"h5",sx:{mt:2,mb:.5},children:a.children}),h2:a=>(0,d.jsx)(g.default,{variant:"h6",sx:{mt:2,mb:.5},children:a.children}),h3:a=>(0,d.jsx)(g.default,{variant:"subtitle1",sx:{mt:1.5,mb:.5},children:a.children}),h4:a=>(0,d.jsx)(g.default,{variant:"subtitle2",sx:{mt:1.5,mb:.5},children:a.children}),h5:a=>(0,d.jsx)(g.default,{variant:"body1",sx:{mt:1,mb:.5,fontWeight:"bold"},children:a.children}),h6:a=>(0,d.jsx)(g.default,{variant:"body2",sx:{mt:1,mb:.5,fontWeight:"bold"},children:a.children}),ul:a=>(0,d.jsx)(h.default,{component:"ul",sx:{pl:2,mb:1},children:a.children}),ol:a=>(0,d.jsx)(h.default,{component:"ol",sx:{pl:2,mb:1},children:a.children}),li:a=>(0,d.jsx)(h.default,{component:"li",sx:{mb:.5,whiteSpace:"pre-line"},children:a.children}),a:a=>(0,d.jsx)(g.default,{component:"a",sx:{color:"primary.main"},href:a.href,children:a.children}),blockquote:a=>(0,d.jsx)(h.default,{component:"blockquote",sx:{borderLeft:"4px solid",borderColor:"divider",pl:2,py:.5,my:1,bgcolor:"action.hover",borderRadius:"4px"},children:a.children}),code:({node:a,className:b,children:c,...e})=>/language-(\w+)/.exec(b||"")||b?(0,d.jsx)(h.default,{component:"pre",sx:{bgcolor:"action.hover",p:1.5,borderRadius:"4px",overflowX:"auto",fontFamily:"monospace",fontSize:"0.875rem",my:1,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:c}):(0,d.jsx)(g.default,{component:"code",sx:{bgcolor:"action.hover",px:.5,py:.25,borderRadius:"4px",fontFamily:"monospace",wordBreak:"break-all"},children:c})},ae=({media:a})=>(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column",gap:1,mt:1},children:a.map((a,b)=>{let c=_(a),e=a.resourceUri??a.url??`${a.type}-${b}`;return c?"image"===a.type?(0,d.jsx)(h.default,{component:"img",src:c,alt:a.name??`Generated image ${b+1}`,sx:{maxWidth:"100%",height:"auto",borderRadius:1}},e):"audio"===a.type?(0,d.jsxs)(h.default,{children:[(0,d.jsx)(h.default,{component:"audio",controls:!0,src:c,sx:{width:"100%"}}),a.transcript&&(0,d.jsx)(g.default,{variant:"caption",color:"text.secondary",sx:{display:"block",mt:.5},children:a.transcript})]},e):"video"===a.type?(0,d.jsx)(h.default,{component:"video",controls:!0,src:c,sx:{maxWidth:"100%",maxHeight:560,borderRadius:1}},e):(0,d.jsx)(i.A,{component:"a",href:c,download:a.name||!0,target:"_blank",rel:"noopener noreferrer",variant:"outlined",size:"small",startIcon:(0,d.jsx)(M.A,{}),sx:{alignSelf:"flex-start"},children:a.name??"Download generated file"},e):null})}),af=({content:a,showRaw:b})=>b?(0,d.jsx)(h.default,{component:"pre",sx:{whiteSpace:"pre-wrap",wordBreak:"break-all",fontSize:"0.8rem",p:1,borderRadius:1,border:1,borderColor:a=>a.palette.divider,bgcolor:"action.hover",color:a=>a.palette.text.primary,overflow:"auto",maxHeight:"300px"},children:"string"==typeof a?a:"[Invalid tool content]"}):"string"!=typeof a?(0,d.jsx)(g.default,{variant:"body2",fontStyle:"italic",color:"text.secondary",children:"[Invalid tool content]"}):(0,d.jsx)(h.default,{sx:{width:"100%",minWidth:0},children:(()=>{try{let b=JSON.parse(a);if(b&&Array.isArray(b.content))return(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column",gap:1},children:b.content.map((a,b)=>"text"===a.type?(0,d.jsx)(H.oz,{remarkPlugins:[I.A],children:a.text},b):"image"===a.type&&a.data&&a.mimeType?(0,d.jsx)("img",{src:`data:${a.mimeType};base64,${a.data}`,alt:`Tool Result Image ${b+1}`,style:{maxWidth:"100%",height:"auto",borderRadius:"4px",marginTop:"8px"}},b):"audio"===a.type&&a.data&&a.mimeType?(0,d.jsx)("audio",{controls:!0,src:`data:${a.mimeType};base64,${a.data}`,style:{width:"100%",marginTop:"8px"},children:"Your browser does not support the audio element."},b):"video"===a.type&&a.data&&a.mimeType?(0,d.jsx)("video",{controls:!0,src:`data:${a.mimeType};base64,${a.data}`,style:{maxWidth:"100%",maxHeight:"560px",marginTop:"8px"},children:"Your browser does not support the video element."},b):(0,d.jsx)(h.default,{component:"pre",sx:{whiteSpace:"pre-wrap",wordBreak:"break-all",fontSize:"0.8rem",p:1,borderRadius:1,border:1,borderColor:a=>a.palette.divider,bgcolor:"action.hover",color:a=>a.palette.text.primary,overflow:"auto",mt:1},children:`Unsupported content type: ${a.type}
2
+ ${JSON.stringify(a,null,2)}`},b))});return(0,d.jsx)(H.oz,{remarkPlugins:[I.A],children:`\`\`\`json
3
+ ${JSON.stringify(b,null,2)}
4
+ \`\`\``})}catch(b){return(0,d.jsx)(H.oz,{remarkPlugins:[I.A],children:a})}})()}),ag=({pairs:a,messageId:b,onAppMessage:c,onUpdateModelContext:i,onRegisterAppTeardown:p,onOpenInCanvas:q})=>{let[r,s]=(0,e.useState)(null),[t,u]=(0,e.useState)({}),v=(a,c)=>a.toolCall.id||`tc-${b}-${c}`;return(0,d.jsxs)(h.default,{sx:{mt:1,pt:1,borderTop:"1px solid",borderColor:"divider"},children:[(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",color:"primary.main",mb:1},children:[(0,d.jsx)(P.A,{fontSize:"small",sx:{mr:1}}),(0,d.jsx)(g.default,{variant:"body2",children:1===a.length?"The assistant used a tool":`The assistant used ${a.length} tools`})]}),(0,d.jsx)(h.default,{sx:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:.5},children:a.map((a,b)=>{let c=v(a,b),e=function(a){if(!a)return"pending";if("string"==typeof a.content)try{let b=JSON.parse(a.content);if(b&&(!0===b.isError||null!=b.error))return"error"}catch{}return"done"}(a.result),g=r===c;return(0,d.jsxs)(f().Fragment,{children:[b>0&&(0,d.jsx)(h.default,{sx:{width:14,height:"2px",bgcolor:"divider",flexShrink:0}}),(0,d.jsx)(k.A,{title:g?"Hide call & result":"Show call & result",children:(0,d.jsx)(l.A,{icon:function(a){return"pending"===a?(0,d.jsx)(j.default,{size:14,thickness:6}):"error"===a?(0,d.jsx)(S.A,{fontSize:"small"}):(0,d.jsx)(R.A,{fontSize:"small"})}(e),label:(0,X.yo)(a.toolCall.function.name),size:"small",clickable:!0,variant:g?"filled":"outlined",color:"error"===e?"error":"pending"===e?"default":"primary",onClick:()=>s(g?null:c),sx:{maxWidth:"100%"}})})]},c)})}),a.map((a,b)=>{let e=v(a,b),f=a.toolCall.function.arguments;try{f=JSON.stringify(JSON.parse(a.toolCall.function.arguments),null,2)}catch(a){}let k=!!t[e];return(0,d.jsx)(m.A,{in:r===e,children:(0,d.jsxs)(h.default,{sx:{mt:1,p:1,borderRadius:1,bgcolor:"rgba(0, 0, 0, 0.03)"},children:[(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",mb:.5},children:[(0,d.jsx)(P.A,{fontSize:"small",sx:{mr:.5,color:"primary.main"}}),(0,d.jsx)(g.default,{variant:"caption",sx:{fontWeight:"bold"},children:"Parameters"}),(0,d.jsx)(l.A,{label:`ID: ${a.toolCall.id?a.toolCall.id.substring(0,8):"N/A"}...`,size:"small",color:"default",variant:"outlined",sx:{ml:1,height:20,fontSize:"0.7rem"}})]}),(0,d.jsx)(h.default,{component:"pre",sx:{bgcolor:"action.hover",p:1,borderRadius:"4px",overflowX:"auto",fontFamily:"monospace",fontSize:"0.75rem",my:.5,maxHeight:"150px",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:f}),(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",mt:1,mb:.5},children:[(0,d.jsx)(Q.A,{fontSize:"small",sx:{mr:.5,color:"text.secondary"}}),(0,d.jsx)(g.default,{variant:"caption",sx:{fontWeight:"bold"},children:"Result"}),a.result&&(0,d.jsx)(n.A,{control:(0,d.jsx)(o.A,{size:"small",checked:k,onChange:a=>u(b=>({...b,[e]:a.target.checked}))}),label:"Raw",sx:{ml:"auto",mr:0,"& .MuiTypography-root":{fontSize:"0.75rem"}}})]}),a.result?(0,d.jsx)(af,{content:a.result.content,showRaw:k}):(0,d.jsxs)(g.default,{variant:"body2",fontStyle:"italic",color:"text.secondary",sx:{display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(j.default,{size:14,thickness:6})," Waiting for the tool to respond…"]}),a.result?.ui?.uri&&a.result.ui.serverName&&(0,d.jsx)($.Ay,{serverName:a.result.ui.serverName,uri:a.result.ui.uri,toolName:a.result.ui.toolName??a.toolCall.function.name,toolArgs:a.toolCall.function.arguments,toolResultContent:"string"==typeof a.result.content?a.result.content:void 0,toolCancelledReason:a.result.ui.cancelledReason,toolIsError:a.result.ui.isError,onAppMessage:c,onUpdateModelContext:i,onRegisterTeardown:p,teardownRegistrationKey:`${a.result.ui.serverName}::${a.result.ui.uri}::${e}`,onRequestDock:q?()=>q({serverName:a.result.ui.serverName,uri:a.result.ui.uri,toolName:a.result.ui.toolName??a.toolCall.function.name,toolArgs:a.toolCall.function.arguments,resultContent:"string"==typeof a.result.content?a.result.content:void 0,cancelledReason:a.result.ui.cancelledReason,isError:a.result.ui.isError}):void 0})]})},e)})]})},ah=f().memo(function({message:a,nodeLabel:b,availableNodes:c,showRaw:e,toolCallPairs:f,onAppMessage:i,onUpdateModelContext:j,onRegisterAppTeardown:m,onOpenInCanvas:u,hoistedHandoffs:v,isBeingEdited:w,onMenuOpen:x,onToggleRaw:y}){var z;let A,B=a.depth??0;return(0,d.jsxs)(h.default,{sx:{display:"flex",flexDirection:"column",alignItems:"user"===a.role?"flex-end":"flex-start",opacity:a.disabled?.5:1,...B>0&&{pl:3*B,borderLeft:"2px solid",borderColor:"divider",ml:1}},children:[(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",mb:.5},children:[(0,d.jsxs)(g.default,{variant:"caption",color:"text.secondary",sx:{mr:1},children:["user"===a.role?"You":"assistant"===a.role?"Assistant":"tool"===a.role?"Tool":"System"," • ","number"!=typeof(z=a.timestamp)||isNaN(z)?(aa.warn("formatTime received invalid timestamp:",z),"Invalid Date"):new Date(z).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})]}),a.processNodeId&&(0,d.jsx)(k.A,{title:`${b?`${b} — `:""}Process Node ID: ${a.processNodeId}`,children:(0,d.jsx)(l.A,{label:`Node: ${b||`${a.processNodeId.substring(0,6)}...`}`,size:"small",color:"primary",variant:"outlined",sx:{height:20,fontSize:"0.7rem",mr:1}})}),B>0&&(0,d.jsx)(k.A,{title:`Nested subflow step (depth ${B})`,children:(0,d.jsx)(l.A,{label:"Subflow step",size:"small",color:"secondary",variant:"outlined",sx:{height:20,fontSize:"0.7rem",mr:1}})}),a.disabled&&(0,d.jsx)(l.A,{label:"Disabled",size:"small",color:"default",variant:"outlined",sx:{height:20,fontSize:"0.7rem"}}),a.usage&&(0,d.jsx)(k.A,{title:`${a.usage.promptTokens.toLocaleString()} prompt + ${a.usage.completionTokens.toLocaleString()} completion tokens (provider-reported)`,children:(0,d.jsx)(l.A,{label:`${(A=a.usage.totalTokens)>=1e3?`${(A/1e3).toFixed(A>=1e5?0:1)}k`:`${A}`} tok`,size:"small",color:"default",variant:"outlined",sx:{height:20,fontSize:"0.7rem",mr:1}})}),(0,d.jsx)(p.A,{size:"small",onClick:b=>x(b,a.id),sx:{ml:1},children:(0,d.jsx)(J.A,{fontSize:"small"})})]}),(0,d.jsxs)(q.A,{elevation:1,sx:{p:2,maxWidth:"75vw",borderRadius:2,bgcolor:"user"===a.role?"primary.light":"assistant"===a.role||"tool"===a.role?"background.paper":"info.light",color:"user"===a.role?"primary.contrastText":"assistant"===a.role||"tool"===a.role?"text.primary":"info.contrastText",position:"relative",borderLeft:"tool"===a.role?"4px solid":"none",borderColor:"tool"===a.role?"grey.400":"transparent",opacity:w?.55:1,outline:w?"2px dashed":"none",outlineColor:"warning.main",overflowWrap:"break-word",wordBreak:"break-word",overflow:"hidden"},children:[(0,d.jsxs)(d.Fragment,{children:["tool"!==a.role&&"string"==typeof a.content&&(0,d.jsx)(H.oz,{remarkPlugins:[I.A],components:ad,children:a.content}),"tool"!==a.role&&Array.isArray(a.content)&&(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column",gap:1},children:a.content.map((a,b)=>a?.type==="text"?(0,d.jsx)(H.oz,{remarkPlugins:[I.A],children:a.text},b):a?.type==="image_url"&&a.image_url?.url?(0,d.jsx)("img",{src:a.image_url.url,alt:`Image ${b+1}`,style:{maxWidth:"100%",height:"auto",borderRadius:"4px"}},b):null)}),"tool"!==a.role&&a.media&&a.media.length>0&&(0,d.jsx)(ae,{media:a.media.filter(b=>"image"!==b.type||!Array.isArray(a.content)||!a.content.some(a=>a?.type==="image_url"&&a.image_url?.url===_(b)))}),"tool"!==a.role&&"string"!=typeof a.content&&!Array.isArray(a.content)&&!ab(a)&&!a.media?.length&&(0,d.jsx)(g.default,{variant:"body2",fontStyle:"italic",color:"text.secondary",children:"[No text content]"})]}),(()=>{let b=[...ab(a)?a.tool_calls.filter(a=>{var b;return!!(b=a.function.name)&&(b.startsWith(Y.n9)||"handoff"===b)}):[],...v??[]];return(0,d.jsx)(h.default,{sx:{mt:1,display:"flex",flexWrap:"wrap",gap:.5},children:b.map((b,e)=>(0,d.jsx)(l.A,{size:"small",variant:"outlined",color:"secondary",icon:(0,d.jsx)(W.A,{fontSize:"small"}),label:`Handoff → ${function(a,b){let c=a.startsWith(Y.n9)?a.slice(Y.n9.length):a,d=c.replace(/_\d+$/,""),e=b.find(a=>{let b=(0,Y.RN)(a.label);return b===c||b===d});return e?.label?e.label:d.split("_").filter(Boolean).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")||"target node"}(b.function.name,c)}`,sx:{maxWidth:"100%",fontWeight:500}},b.id||`handoff-${a.id}-${e}`))})})(),f&&f.length>0&&(0,d.jsx)(ag,{pairs:f,messageId:a.id,onAppMessage:i,onUpdateModelContext:j,onRegisterAppTeardown:m,onOpenInCanvas:u}),"tool"===a.role&&a.tool_call_id&&!ac(a)&&(0,d.jsxs)(h.default,{children:[(0,d.jsxs)(g.default,{variant:"body2",sx:{display:"flex",alignItems:"center",color:"text.secondary",mb:1},children:[(0,d.jsx)(Q.A,{fontSize:"small",sx:{mr:1}}),"The tool responded to the assistant"]}),(0,d.jsxs)(r.A,{defaultExpanded:!1,sx:{mb:.5,"&:before":{display:"none"},boxShadow:"none",bgcolor:"rgba(0, 0, 0, 0.02)"},children:[(0,d.jsx)(s.A,{expandIcon:(0,d.jsx)(O.A,{}),children:(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center"},children:[(0,d.jsx)(Q.A,{fontSize:"small",sx:{mr:1,color:"text.secondary"}}),(0,d.jsx)(g.default,{variant:"subtitle2",children:"Tool Result"}),(0,d.jsx)(l.A,{label:`ID: ${a.tool_call_id.substring(0,8)}...`,size:"small",color:"default",variant:"outlined",sx:{ml:1,height:20,fontSize:"0.7rem"}}),(0,d.jsx)(n.A,{control:(0,d.jsx)(o.A,{size:"small",checked:e,onChange:b=>y(a.id,b.target.checked),onClick:a=>a.stopPropagation()}),label:"Raw",sx:{mr:1,ml:"auto","& .MuiTypography-root":{fontSize:"0.75rem"}},onClick:a=>a.stopPropagation()})]})}),(0,d.jsx)(t.A,{sx:{pt:0,pb:1,overflow:"hidden"},children:(0,d.jsx)(af,{content:a.content,showRaw:e})})]})]}),a.attachments&&a.attachments.length>0&&(0,d.jsxs)(h.default,{sx:{mt:1,pt:1,borderTop:"1px solid",borderColor:"divider"},children:[(0,d.jsx)(g.default,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:.5},children:"Attachments:"}),a.attachments.map(a=>"image"===a.type?(0,d.jsx)(h.default,{sx:{mb:.5},children:(0,d.jsx)("img",{src:a.content,alt:a.originalName||"image attachment",style:{maxWidth:"100%",height:"auto",borderRadius:"4px"}})},a.id):(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",p:1,borderRadius:1,bgcolor:"rgba(0, 0, 0, 0.04)",mb:.5},children:["document"===a.type?(0,d.jsx)(M.A,{fontSize:"small",sx:{mr:1}}):(0,d.jsx)(N.A,{fontSize:"small",sx:{mr:1}}),(0,d.jsx)(g.default,{variant:"caption",sx:{wordBreak:"break-all"},children:a.originalName||`${a.type} attachment`})]},a.id))]})]})]})}),ai=({elicitation:a,onSubmit:b,onCancel:c})=>{let{elicitationId:f,message:j,requestedSchema:k}=a,l=k?.properties??{},m=Object.keys(l),[o,p]=(0,e.useState)(()=>{let a={};for(let b of m){let c=l[b];void 0!==c.default?a[b]=c.default:"boolean"===c.type?a[b]=!1:"number"===c.type||"integer"===c.type?a[b]=0:a[b]=""}return a}),r=(a,b)=>{p(c=>({...c,[a]:b}))};return(0,d.jsxs)(q.A,{elevation:2,sx:{p:2,mt:2,bgcolor:"info.light",border:"1px solid",borderColor:"info.main",borderRadius:2},children:[(0,d.jsx)(g.default,{variant:"h6",sx:{mb:1},children:"Server needs more information"}),(0,d.jsx)(g.default,{variant:"body2",sx:{mb:2},children:j}),(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column",gap:1.5},children:m.map(a=>{let b=l[a],c=b.title||a,e=o[a];if("boolean"===b.type)return(0,d.jsx)(n.A,{control:(0,d.jsx)(u.A,{checked:!!e,onChange:b=>r(a,b.target.checked),size:"small"}),label:c},a);if(b.enum&&b.enum.length>0)return(0,d.jsxs)(v.A,{size:"small",sx:{minWidth:200},children:[(0,d.jsx)(w.A,{children:c}),(0,d.jsx)(x.A,{label:c,value:String(e??""),onChange:b=>r(a,b.target.value),children:b.enum.map((a,c)=>(0,d.jsx)(y.A,{value:a,children:b.enumNames?.[c]||a},a))}),b.description&&(0,d.jsx)(z.A,{children:b.description})]},a);let f="number"===b.type||"integer"===b.type;return(0,d.jsx)(A.A,{size:"small",label:c,type:f?"number":"text",value:String(e??""),helperText:b.description,inputProps:{minLength:b.minLength,maxLength:b.maxLength,min:b.minimum,max:b.maximum},onChange:b=>{if(f){let c=parseFloat(b.target.value);r(a,isNaN(c)?0:c)}else r(a,b.target.value)}},a)})}),(0,d.jsxs)(h.default,{sx:{display:"flex",justifyContent:"flex-end",gap:1,mt:2},children:[(0,d.jsx)(i.A,{variant:"outlined",color:"inherit",size:"small",onClick:()=>{c&&c(f)},disabled:!c,children:"Cancel"}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",onClick:()=>{b&&b(f,o)},disabled:!b,children:"Submit"})]})]})},aj="Type your own answer",ak=({question:a,onAnswer:b,onDecline:c})=>{let{questionId:f,questions:j}=a,[k,l]=(0,e.useState)(()=>j.map(()=>[])),[m,o]=(0,e.useState)(()=>j.map(()=>"")),p=()=>j.map((a,b)=>(k[b]??[]).map(a=>a===aj?m[b].trim():a).filter(a=>a.length>0)),r=j.every((a,b)=>(p()[b]??[]).length>0);return(0,d.jsxs)(q.A,{elevation:2,sx:{p:2,mt:2,bgcolor:"info.light",border:"1px solid",borderColor:"info.main",borderRadius:2},children:[(0,d.jsx)(g.default,{variant:"h6",sx:{mb:1},children:"The assistant is asking"}),(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column",gap:2},children:j.map((a,b)=>(0,d.jsxs)(v.A,{component:"fieldset",sx:{display:"flex"},children:[(0,d.jsx)(B.A,{sx:{mb:.5},children:a.prompt}),a.multiple?(0,d.jsx)(h.default,{sx:{display:"flex",flexDirection:"column"},children:a.options.map(a=>(0,d.jsx)(n.A,{control:(0,d.jsx)(u.A,{size:"small",checked:(k[b]??[]).includes(a),onChange:()=>((a,b)=>{l(c=>{let d=c.map(a=>[...a]),e=d[a],f=e.indexOf(b);return f>=0?e.splice(f,1):e.push(b),d})})(b,a)}),label:a},a))}):(0,d.jsx)(C.A,{value:(k[b]??[])[0]??"",onChange:a=>{var c;return c=a.target.value,void l(a=>{let d=a.map(a=>[...a]);return d[b]=[c],d})},children:a.options.map(a=>(0,d.jsx)(n.A,{value:a,control:(0,d.jsx)(D.A,{size:"small"}),label:a},a))}),(k[b]??[]).includes(aj)&&(0,d.jsx)(A.A,{size:"small",sx:{mt:1},placeholder:"Your answer…",value:m[b],onChange:a=>o(c=>{let d=[...c];return d[b]=a.target.value,d})})]},b))}),(0,d.jsxs)(h.default,{sx:{display:"flex",justifyContent:"flex-end",gap:1,mt:2},children:[(0,d.jsx)(i.A,{variant:"outlined",color:"inherit",size:"small",onClick:()=>{c&&c(f)},disabled:!c,children:"Decline"}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",onClick:()=>{b&&b(f,p())},disabled:!b||!r,children:"Answer"})]})]})},al=({messages:a,pendingToolCalls:b,pendingElicitation:c,availableNodes:k=[],conversationId:m,editingMessageId:n,onToggleDisabled:o,onSplitConversation:p,onBeginEditMessage:u,onApproveToolCall:v,onRejectToolCall:w,onSubmitElicitation:x,onCancelElicitation:z,pendingQuestion:B,onAnswerQuestion:C,onDeclineQuestion:D,onAppMessage:H,onUpdateModelContext:I,onRegisterAppTeardown:J,onOpenInCanvas:M,queuedMessages:N=[],queueHoldReason:Q=null})=>{let[R,S]=(0,e.useState)({}),[W,Y]=(0,e.useState)(50);(0,e.useEffect)(()=>{Y(50)},[m]);let $=Math.max(0,(Array.isArray(a)?a.length:0)-W),_=(0,e.useMemo)(()=>Array.isArray(a)?$>0?a.slice($):a:[],[a,$]),{pairsByAnchorId:ab,handoffsByAnchorId:ad,consumedToolCallIds:ae,groups:af}=(0,e.useMemo)(()=>(function(a){let b=new Map,c=new Map,d=new Set,e=new Set,f=new Map,g=[];if(!Array.isArray(a))return{pairsByAnchorId:b,handoffsByAnchorId:c,hoistedAssistantIds:d,consumedToolCallIds:e,groups:g};let h=new Map;for(let b of a)"tool"===b.role&&"string"==typeof b.tool_call_id&&b.tool_call_id&&!h.has(b.tool_call_id)&&h.set(b.tool_call_id,b);let i=a=>{let d=f.get(a);return d||(d={anchorId:a,memberIds:[a],hoistedIds:[]},f.set(a,d),g.push(d),b.set(a,[]),c.set(a,[])),d},j=null;for(let f of a){if("user"===f.role||"system"===f.role){j=null;continue}if("assistant"!==f.role)continue;let a=Array.isArray(f.tool_calls)?f.tool_calls:[],g=[],k=[];for(let b of a){if("function"!==b.type)continue;if(Z(b.function?.name)){k.push(b);continue}let a=b.id,c=a?h.get(a):void 0;a&&e.add(a),g.push({toolCall:b,result:c})}let l=function(a){let b=a.content;return"string"==typeof b?b.trim().length>0:!!Array.isArray(b)&&b.some(a=>!!a&&"object"==typeof a&&("text"===a.type?"string"==typeof a.text&&a.text.trim().length>0:"image_url"===a.type?!!a.image_url?.url:"input_audio"===a.type&&!!a.input_audio?.data))}(f),m=g.length>0||k.length>0;if(l){j=f.id,m&&(i(f.id),b.get(f.id).push(...g),c.get(f.id).push(...k));continue}if(m)if(j){let a=i(j);b.get(j).push(...g),c.get(j).push(...k),a.memberIds.push(f.id),a.hoistedIds.push(f.id),d.add(f.id)}else j=f.id,i(f.id),b.get(f.id).push(...g),c.get(f.id).push(...k)}return{pairsByAnchorId:b,handoffsByAnchorId:c,hoistedAssistantIds:d,consumedToolCallIds:e,groups:g}})(a),[a]),ag=(0,e.useMemo)(()=>(function(a){let b=new Set;if(!Array.isArray(a))return b;for(let c of a){if("assistant"!==c.role)continue;let a=c.tool_calls;if(Array.isArray(a))for(let c of a)"function"===c.type&&Z(c.function?.name)&&"string"==typeof c.id&&c.id&&b.add(c.id)}return b})(a),[a]),aj=(0,e.useMemo)(()=>new Set(_.map(a=>a.id)),[_]),{renderPairsById:al,renderHandoffsById:am,suppressedIds:an}=(0,e.useMemo)(()=>{let a=new Map,b=new Map,c=new Set;for(let d of af){let e=ab.get(d.anchorId)??[],f=ad.get(d.anchorId)??[],g=d.memberIds.find(a=>aj.has(a))??d.anchorId;for(let h of(e.length>0&&a.set(g,e),f.length>0&&b.set(g,f),d.hoistedIds))h!==g&&c.add(h)}return{renderPairsById:a,renderHandoffsById:b,suppressedIds:c}},[af,ab,ad,aj]),[ao,ap]=f().useState(null),[aq,ar]=f().useState(null),[as,at]=f().useState({}),au=(0,e.useCallback)((a,b)=>{aa.debug(`handleMenuOpen called with messageId: ${b}`),ap(a.currentTarget),ar(b)},[]),av=(0,e.useCallback)((a,b)=>{at(c=>({...c,[a]:b}))},[]),aw=()=>{ap(null),ar(null)},ax=()=>{aq&&(u?.(aq),aw())},ay=(0,e.useMemo)(()=>{let a=new Map;for(let b of k)a.set(b.id,b.label);return a},[k]),az=(0,e.useMemo)(()=>aq&&a.find(a=>a.id===aq)||null,[aq,a]);return(0,d.jsxs)(h.default,{sx:{display:"flex",flexDirection:"column",gap:2},children:[$>0&&(0,d.jsx)(h.default,{sx:{display:"flex",justifyContent:"center"},children:(0,d.jsxs)(i.A,{size:"small",variant:"outlined",onClick:()=>Y(a=>a+200),children:["Show earlier messages (",$," more)"]})}),_.map((a,b)=>ac(a)||"tool"===a.role&&"string"==typeof a.tool_call_id&&ag.has(a.tool_call_id)||"tool"===a.role&&"string"==typeof a.tool_call_id&&ae.has(a.tool_call_id)||an.has(a.id)?null:(0,d.jsx)(ah,{message:a,nodeLabel:a.processNodeId?ay.get(a.processNodeId):void 0,availableNodes:k,showRaw:!!as[a.id],toolCallPairs:al.get(a.id),onAppMessage:H,onUpdateModelContext:I,onRegisterAppTeardown:J,onOpenInCanvas:M,hoistedHandoffs:am.get(a.id),isBeingEdited:!!n&&a.id===n,onMenuOpen:au,onToggleRaw:av},a.id||`msg-${$+b}`)),N.map(a=>(0,d.jsx)(h.default,{"data-testid":"queued-bubble",sx:{display:"flex",justifyContent:"flex-end",opacity:.6},children:(0,d.jsxs)(h.default,{sx:{maxWidth:"70%",bgcolor:"primary.light",color:"primary.contrastText",borderRadius:2,px:2,py:1,display:"flex",flexDirection:"column",gap:.5},children:[(0,d.jsx)(g.default,{variant:"body2",sx:{whiteSpace:"pre-wrap",wordBreak:"break-word"},children:a.content||(a.attachments.length>0?`${a.attachments.length} attachment(s)`:"")}),(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",gap:.5,justifyContent:"flex-end"},children:[!Q&&(0,d.jsx)(j.default,{size:10,color:"inherit"}),(0,d.jsx)(g.default,{variant:"caption",sx:{opacity:.85},children:Q??"Queued"})]})]})},a.id)),(0,d.jsxs)(E.A,{anchorEl:ao,open:!!ao,onClose:aw,children:[az&&(()=>{aa.debug("Entering menu item rendering logic",{activeMessageId:aq}),aa.debug("Active message object for menu:",az),aa.debug("Active message role for menu:",az?.role);try{if("user"===az.role&&"string"==typeof az.content&&u)return(0,d.jsxs)(y.A,{onClick:ax,children:[(0,d.jsx)(F.A,{children:(0,d.jsx)(T.A,{fontSize:"small"})}),(0,d.jsx)(G.A,{children:"Edit Message"})]});return null}catch(a){return aa.error("Error rendering Edit Message menu item",{error:a}),null}})(),(0,d.jsxs)(y.A,{onClick:()=>{aq&&(o(aq),aw())},children:[(0,d.jsx)(F.A,{children:(0,d.jsx)(K.A,{fontSize:"small"})}),(0,d.jsx)(G.A,{children:az?.disabled?"Enable Message":"Disable Message"})]}),(0,d.jsxs)(y.A,{onClick:()=>{aq&&(p(aq),aw())},children:[(0,d.jsx)(F.A,{children:(0,d.jsx)(L.A,{fontSize:"small"})}),(0,d.jsx)(G.A,{children:"Split Conversation Here"})]})]}),c&&(0,d.jsx)(ai,{elicitation:c,onSubmit:x,onCancel:z}),B&&(0,d.jsx)(ak,{question:B,onAnswer:C,onDecline:D}),b&&b.length>0&&(0,d.jsxs)(q.A,{elevation:2,sx:{p:2,mt:2,bgcolor:"warning.light",border:"1px solid",borderColor:"warning.main",borderRadius:2},children:[(0,d.jsxs)(g.default,{variant:"h6",sx:{mb:1,display:"flex",alignItems:"center"},children:[(0,d.jsx)(P.A,{sx:{mr:1}})," Tool Approval Required"]}),(0,d.jsx)(g.default,{variant:"body2",sx:{mb:2},children:"The assistant wants to use the following tool(s). Please approve or reject each request."}),b.map((a,b)=>{let c=(0,X.yo)(a.function.name),e=a.function.arguments;try{let b=JSON.parse(a.function.arguments);e=JSON.stringify(b,null,2)}catch(a){}return(0,d.jsxs)(r.A,{defaultExpanded:!0,sx:{mb:1,"&:before":{display:"none"},boxShadow:1},children:[(0,d.jsx)(s.A,{expandIcon:(0,d.jsx)(O.A,{}),children:(0,d.jsxs)(h.default,{sx:{display:"flex",alignItems:"center",width:"100%"},children:[(0,d.jsx)(P.A,{fontSize:"small",sx:{mr:1,color:"primary.main"}}),(0,d.jsx)(g.default,{variant:"subtitle2",sx:{fontWeight:"bold",flexGrow:1},children:c}),(0,d.jsx)(l.A,{label:`ID: ${a.id?a.id.substring(0,8):"N/A"}...`,size:"small",variant:"outlined",sx:{ml:1,height:20,fontSize:"0.7rem"}})]})}),(0,d.jsxs)(t.A,{sx:{pt:0},children:[(0,d.jsx)(h.default,{component:"pre",sx:{bgcolor:"action.hover",p:1,borderRadius:"4px",overflowX:"auto",fontFamily:"monospace",fontSize:"0.75rem",my:.5,maxHeight:"150px",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:e}),(0,d.jsx)(A.A,{label:"Rejection reason (optional)",placeholder:"e.g. write to dist/ instead",value:R[a.id]??"",onChange:b=>S(c=>({...c,[a.id]:b.target.value})),multiline:!0,minRows:1,maxRows:4,fullWidth:!0,size:"small",sx:{mt:1,mb:1}}),(0,d.jsxs)(h.default,{sx:{display:"flex",justifyContent:"flex-end",gap:1,mt:1,flexWrap:"wrap"},children:[(0,d.jsx)(i.A,{variant:"outlined",color:"error",size:"small",startIcon:(0,d.jsx)(V.A,{}),onClick:()=>w&&w(a.id,!1,R[a.id]?.trim()||void 0),disabled:!w,children:"Reject"}),(0,d.jsx)(i.A,{variant:"outlined",color:"error",size:"small",onClick:()=>w&&w(a.id,!0),disabled:!w,title:"Always deny this tool — saves a rule so future calls are auto-denied",children:"Always Deny"}),(0,d.jsx)(i.A,{variant:"outlined",color:"success",size:"small",startIcon:(0,d.jsx)(U.A,{}),onClick:()=>v&&v(a.id,!0),disabled:!v,title:"Always allow this tool — saves a rule so future calls are auto-approved",children:"Always Allow"}),(0,d.jsx)(i.A,{variant:"contained",color:"success",size:"small",startIcon:(0,d.jsx)(U.A,{}),onClick:()=>v&&v(a.id),disabled:!v,children:"Approve"})]})]})]},a.id||`ptc-${b}`)})]})]})}},24856:(a,b,c)=>{c.d(b,{pX:()=>d});function d(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}}},29237:(a,b,c)=>{c.d(b,{C:()=>f,L2:()=>e,P2:()=>h,w4:()=>d,wM:()=>g});let d=["contains","regex","equals","always"],e=["last-assistant","last-message"];function f(a){return"string"==typeof a&&d.includes(a)}function g(a){try{return new RegExp(a),!0}catch{return!1}}function h(a){if(!a||!f(a.kind))return"";let b=a.negate?"!":"";if("always"===a.kind)return`${b}always`;let c=a.ignoreCase?" i":"",d="string"==typeof a.value?a.value:"",e=d.length>8?`${d.slice(0,8)}…`:d,g="regex"===a.kind?`/${e}/`:`"${e}"`;return`${b}${a.kind}:${g}${c}`}},31164:(a,b,c)=>{c.d(b,{jY:()=>f,oY:()=>g,sZ:()=>h});var d=c(21124);c(38301);var e=c(97004);let f=a=>(0,d.jsx)(e.A,{...a,variant:"standard"}),g=a=>(0,d.jsx)(e.A,{...a,variant:"mcp"}),h=a=>(0,d.jsx)(e.A,{...a,variant:"resource"})},36627:(a,b,c)=>{function d(a){return!!a&&a.includes("mcp")}function e(a){return!!a&&a.includes("resource")}function f(a){let b=a?.data?.edgeType;return"mcp"===b||"resource"===b}function g(a,b,c,f){if("trigger"===a&&"start"===c)return b&&"trigger-bottom"!==b?"Trigger nodes must connect via their bottom handle":f&&"start-top"!==f?"Trigger nodes must connect to the top handle of the Start node":null;if("trigger"===c)return"Trigger nodes cannot have incoming connections";if("trigger"===a&&"start"!==c)return"Trigger nodes can only connect to the Start node";if("start"===c)return"Start nodes cannot have incoming connections";if("finish"===a)return"Finish nodes cannot have outgoing connections";if("mcp"===a||"mcp"===c||d(b)||d(f))return("mcp"!==a||"process"!==c)&&("process"!==a||"mcp"!==c)?"MCP connections must link an MCP node to a Process node via MCP handles":"process"!==a||d(b)?null:"Connect MCP nodes from the Process node's left/right MCP handles";if("resource"===a||"resource"===c||e(b)||e(f)){if(("resource"!==a||"process"!==c)&&("process"!==a||"resource"!==c))return"Resource connections must link a Resource node to a Process node via resource handles";if("process"===a&&!e(b))return"Connect Resource nodes from the Process node's left/right resource handles"}return null}function h(a,b){return"resource"===a?"resource-in":"process"===a&&e(b)?"process-left-resource":"process"===a&&d(b)?"process-left-mcp":"start"===a?"start-top":`${a}-top`}function i(a,b){if("trigger"===a)return["start"];let c=["process","finish","mcp","subflow","resource","signal","trigger"];return a&&b?c.filter(c=>null===g(a,b,c,h(c,b))):c}c.d(b,{BY:()=>f,CW:()=>h,_w:()=>i,vC:()=>g,vM:()=>e,z5:()=>d})},38259:(a,b,c)=>{c.d(b,{O:()=>i,b:()=>e});let d=(0,c(19815).h)("frontend/services/chat/index");class e extends Error{constructor(a,b,c){super(a),this.name="ChatApiError",this.status=b,this.body=c}}let f="/v1/chat/conversations";async function g(a){let b;if(204===a.status)return;let c=await a.text();if(c)try{b=JSON.parse(c)}catch{b=c}if(!a.ok)throw new e(b&&"object"==typeof b&&(b.error||b.message)||`Request failed with status ${a.status}`,a.status,b);return b}class h{async listConversations(){return d.debug("listConversations: Entering method"),g(await fetch(f))}async getConversation(a){return d.debug("getConversation: Entering method",{conversationId:a}),g(await fetch(`${f}/${encodeURIComponent(a)}`))}async createConversation(a){return d.debug("createConversation: Entering method",{conversationId:a.id}),g(await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}))}async updateConversationFlow(a,b){return d.debug("updateConversationFlow: Entering method",{conversationId:a,flowId:b}),g(await fetch(`${f}/${encodeURIComponent(a)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({flowId:b})}))}async updateConversationTitle(a,b){return d.debug("updateConversationTitle: Entering method",{conversationId:a}),g(await fetch(`${f}/${encodeURIComponent(a)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:b})}))}async updateConversationApproval(a,b){return d.debug("updateConversationApproval: Entering method",{conversationId:a,requireApproval:b}),g(await fetch(`${f}/${encodeURIComponent(a)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({requireApproval:b})}))}async deleteConversation(a){d.debug("deleteConversation: Entering method",{conversationId:a});let b=await fetch(`${f}/${encodeURIComponent(a)}`,{method:"DELETE"});await g(b)}async deleteConversations(a){return d.debug("deleteConversations: Entering method",{count:a.length}),g(await fetch(f,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({ids:a})}))}async respondToToolCall(a,b,c,e,h){return d.debug("respondToToolCall: Entering method",{conversationId:a,action:b,toolCallId:c,always:e}),g(await fetch(`${f}/${encodeURIComponent(a)}/respond`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:b,toolCallId:c,...e?{always:!0}:{},...h?{feedback:h}:{}})}))}async debugStep(a){return d.debug("debugStep: Entering method",{conversationId:a}),g(await fetch(`${f}/${encodeURIComponent(a)}/debug/step`,{method:"POST"}))}async debugContinue(a){return d.debug("debugContinue: Entering method",{conversationId:a}),g(await fetch(`${f}/${encodeURIComponent(a)}/debug/continue`,{method:"POST"}))}async setBreakpoints(a,b){d.debug("setBreakpoints: Entering method",{conversationId:a,count:b.length});let c=await fetch(`${f}/${encodeURIComponent(a)}/breakpoints`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({breakpoints:b})});await g(c)}async synthesizeQuickChat(a){return d.debug("synthesizeQuickChat: Entering method",{conversationId:a.conversationId}),g(await fetch("/api/flow/quick-chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}))}async synthesizeFlowGenerator(a){return g(await fetch("/api/flow/generator",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}))}async completeFlowGeneratorTurn(a){return g(await fetch("/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:"flow-Flow Generator Session",messages:a.messages,stream:!1,metadata:{flujo:"true",conversationId:a.conversationId}})}))}async restoreFlowGenerator(){return g(await fetch("/api/flow/generator",{method:"PUT"}))}async cancel(a){d.debug("cancel: Entering method",{conversationId:a});let b=await fetch(`${f}/${encodeURIComponent(a)}/cancel`,{method:"POST"});await g(b)}async injectMessage(a,b,c){d.debug("injectMessage: Entering method",{conversationId:a,messageId:c});try{let e=await fetch(`${f}/${encodeURIComponent(a)}/inject`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:b,id:c})});if(e.ok)return{delivered:!0};if(409===e.status)return d.debug("injectMessage: run is not live; caller should send normally",{conversationId:a}),{delivered:!1};return d.warn("injectMessage: unexpected response; falling back to a normal send",{conversationId:a,status:e.status}),{delivered:!1}}catch(b){return d.warn("injectMessage: request failed; falling back to a normal send",{conversationId:a,err:b}),{delivered:!1}}}subscribeToEvents(a,b,c){let e=new EventSource(void 0!==c?`${f}/${encodeURIComponent(a)}/events?fromSeq=${c}`:`${f}/${encodeURIComponent(a)}/events`);return e.onopen=()=>{d.debug("Execution event stream open",{conversationId:a}),b.onOpen?.()},e.onmessage=a=>{try{b.onEvent(JSON.parse(a.data))}catch(a){d.warn("Failed to parse SSE event",{err:a})}},e.onerror=a=>{d.debug("SSE stream error (browser will retry if still open)"),b.onError?.(a)},e}}let i=new h},57361:(a,b,c)=>{c.d(b,{Ay:()=>Z,nd:()=>V,c_:()=>U});var d=c(21124),e=c(38301),f=c(6537),g=c(81637),h=c(79515),i=c(95791),j=c(46973),k=c(60839),l=c(18168),m=c(2117),n=c(63281),o=c(63654),p=c(8070),q=c(94367),r=c(50553),s=c(84233),t=c(91059),u=c(7118),v=c(91034),w=c(38941),x=c(95345),y=c(12033),z=c(1010);let A=({open:a,position:b,onClose:c,onDelete:e,onEditProperties:f,onToggleBidirectional:g,onCopy:h,onPaste:i,canPaste:j,canCopy:k,nodeId:l,selection:m,edgeId:n})=>{let o=()=>{f&&f(),c()},p=[];return l&&!m&&p.push((0,d.jsxs)(q.A,{onClick:o,children:[(0,d.jsx)(r.A,{children:(0,d.jsx)(y.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Edit Properties"})]},"edit")),n&&!l&&!m&&(f&&p.push((0,d.jsxs)(q.A,{onClick:o,children:[(0,d.jsx)(r.A,{children:(0,d.jsx)(y.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Edit Properties"})]},"edge-edit")),g&&p.push((0,d.jsxs)(q.A,{onClick:()=>{g&&g(),c()},children:[(0,d.jsx)(r.A,{children:(0,d.jsx)(z.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Toggle Bidirectional"})]},"edge-bidirectional"))),h&&(l||m)&&p.push((0,d.jsxs)(q.A,{onClick:()=>{h&&h(),c()},disabled:!k,children:[(0,d.jsx)(r.A,{children:(0,d.jsx)(w.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Copy"})]},"copy")),i&&p.push((0,d.jsxs)(q.A,{onClick:()=>{i&&i(),c()},disabled:!j,children:[(0,d.jsx)(r.A,{children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Paste"})]},"paste")),(l||n||m)&&p.push((0,d.jsx)(t.A,{},"delete-divider"),(0,d.jsxs)(q.A,{onClick:()=>{e(),c()},sx:{color:"error.main"},children:[(0,d.jsx)(r.A,{sx:{color:"error.main"},children:(0,d.jsx)(v.A,{fontSize:"small"})}),(0,d.jsx)(s.A,{children:"Delete"})]},"delete")),(0,d.jsx)(u.A,{open:a,onClose:c,anchorReference:"anchorPosition",anchorPosition:null!==b.y&&null!==b.x?{top:b.y,left:b.x}:void 0,children:p})};var B=c(31164),C=c(97004);function D(a,b){return b.find(b=>b.id===a)}var E=c(19815);let F=(0,E.h)("components/flow/FlowBuilder/Canvas/hooks/useCanvasEvents.ts");var G=c(90430),H=c(36627),I=c(68730),J=c(43312),K=c(34229),L=c(48440),M=c(1618);let N=(0,l.Ay)(I.A)(({theme:a})=>({minWidth:"36px",padding:"6px",margin:"0 4px",backgroundColor:"dark"===a.palette.mode?"rgba(255, 255, 255, 0.05)":"rgba(0, 0, 0, 0.02)","&:hover":{backgroundColor:"dark"===a.palette.mode?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)"}})),O=()=>{let{zoomIn:a,zoomOut:b,fitView:c}=(0,i.VH)();return(0,d.jsx)(i.Zk,{position:"top-right",style:{margin:"10px"},children:(0,d.jsxs)("div",{style:{display:"flex",gap:"5px"},children:[(0,d.jsx)(J.A,{title:"Zoom In",children:(0,d.jsx)(N,{variant:"outlined",size:"small",onClick:()=>a(),children:(0,d.jsx)(K.A,{fontSize:"small"})})}),(0,d.jsx)(J.A,{title:"Zoom Out",children:(0,d.jsx)(N,{variant:"outlined",size:"small",onClick:()=>b(),children:(0,d.jsx)(L.A,{fontSize:"small"})})}),(0,d.jsx)(J.A,{title:"Fit View",children:(0,d.jsx)(N,{variant:"outlined",size:"small",onClick:()=>c(),children:(0,d.jsx)(M.A,{fontSize:"small"})})})]})})},P=({showMiniMap:a=!0,showControls:b=!0,showBackground:c=!0})=>{let e=(0,k.A)(),f="dark"===e.palette.mode;return(0,d.jsxs)(d.Fragment,{children:[c&&(0,d.jsx)(i.VS,{color:f?e.palette.text.disabled:e.palette.divider,gap:20,size:1}),b&&(0,d.jsx)(i.H2,{}),a&&(0,d.jsx)(i.of,{nodeColor:f?e.palette.primary.dark:e.palette.primary.light,maskColor:f?"rgba(0, 0, 0, 0.4)":"rgba(255, 255, 255, 0.6)"})]})},Q=(0,E.h)("components/flow/FlowBuilder/Canvas/Canvas.tsx"),R="flujo:flowClipboard",S=null;function T(a){S=a;try{localStorage.setItem(R,JSON.stringify(a))}catch(a){Q.warn("Could not persist flow clipboard to localStorage",a)}}let U={start:p.vm,process:p.Uw,finish:p.IK,mcp:p.v2,subflow:p.lA,resource:p.z9,signal:p.z3,trigger:p.pF},V={custom:B.jY,mcpEdge:B.oY,resourceEdge:B.sZ},W=({open:a,position:b,onClose:c,onSelectNodeType:e,sourceNodeType:i,sourceHandleId:j})=>{let l=(0,k.A)(),m=(0,H._w)(i,j);Q.debug(`NodeSelectionModal: Source node type: ${i}, Source handle ID: ${j}`),Q.debug(`NodeSelectionModal: Valid node types: ${m.join(", ")}`);let n=[{type:"process",label:"Process Node",description:"Let a LLM do your work"},{type:"finish",label:"Finish Node",description:"End your flow here"},{type:"mcp",label:"MCP Node",description:"Add functionality"},{type:"subflow",label:"Subflow Node",description:"Run another flow"},{type:"resource",label:"Resource Node",description:"A data artifact steps read or write"},{type:"signal",label:"Signal Node",description:"Emit an event to trigger another flow"},{type:"trigger",label:"Trigger Node",description:"Schedule or event-trigger for this flow"}].filter(a=>m.includes(a.type));return b?(0,d.jsx)(f.A,{open:a,onClose:c,"aria-labelledby":"node-selection-modal",children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:300,bgcolor:"background.paper",borderRadius:2,boxShadow:24,p:4},children:[(0,d.jsx)(h.default,{variant:"h6",component:"h2",gutterBottom:!0,children:"Select Node Type"}),(0,d.jsx)(g.default,{display:"flex",flexDirection:"column",gap:2,children:n.map(a=>(0,d.jsxs)(g.default,{sx:{padding:2,borderRadius:1,border:`2px solid ${"process"===a.type?l.palette.secondary.main:"finish"===a.type?l.palette.success.main:"subflow"===a.type?l.palette.warning.main:"resource"===a.type?p.nH:l.palette.info.main}`,cursor:"pointer","&:hover":{boxShadow:3}},onClick:()=>e(a.type,b),children:[(0,d.jsxs)(g.default,{display:"flex",alignItems:"center",gap:1,mb:1,children:[(a=>{switch(a){case"process":default:return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:l.palette.secondary.main,borderRadius:"50%"}});case"finish":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:l.palette.success.main,borderRadius:"50%"}});case"mcp":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:l.palette.info.main,borderRadius:"50%"}});case"subflow":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:l.palette.warning.main,borderRadius:"50%"}});case"resource":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:p.nH,borderRadius:"50%"}});case"signal":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:p.vp,borderRadius:"50%"}});case"trigger":return(0,d.jsx)("div",{style:{width:24,height:24,backgroundColor:p.$Q,borderRadius:"50%"}})}})(a.type),(0,d.jsx)(h.default,{variant:"subtitle1",fontWeight:"bold",children:a.label})]}),(0,d.jsx)(h.default,{variant:"body2",color:"text.secondary",children:a.description})]},a.type))})]})}):null},X=(0,l.Ay)("div")(({theme:a})=>({width:"100%",height:"80vh",border:`1px solid ${a.palette.divider}`,borderRadius:"4px",background:a.palette.background.paper,position:"relative"})),Y=(0,e.forwardRef)((a,b)=>{let c=(0,k.A)(),{nodes:f,edges:g,onNodesChange:h,onEdgesChange:l,onDrop:p,onDragOver:q,onInit:r,reactFlowWrapper:s,onEditNode:t,onEditEdge:u}=a,{contextMenu:v,selectedElements:w,closeContextMenu:x,handleDelete:y,onNodeContextMenu:z,onEdgeContextMenu:B,onPaneContextMenu:E,onSelectionContextMenu:I}=function(a){let{deleteElements:b}=(0,i.VH)(),[c,d]=(0,e.useState)({open:!1,position:{x:0,y:0}}),[f,g]=(0,e.useState)({nodes:[],edges:[]});(0,i.p4)({onChange:({nodes:a,edges:b})=>{let c=a.map(a=>a.id),d=b.map(a=>a.id);F.debug(`Selection changed: ${c.length} nodes, ${d.length} edges selected`),g({nodes:c,edges:d})}});let h=(0,e.useCallback)((a,b,c,e)=>{a.preventDefault(),b?F.debug(`Context menu opened for node: ${b}`):c?F.debug(`Context menu opened for edge: ${c}`):e?F.debug("Context menu opened for the current selection"):F.debug(`Context menu opened on canvas at (${a.clientX}, ${a.clientY})`),d({open:!0,position:{x:a.clientX,y:a.clientY},nodeId:b,edgeId:c,selection:e})},[]),j=(0,e.useCallback)(()=>{F.debug("Context menu closed"),d(a=>({...a,open:!1}))},[]),k=(0,e.useCallback)(()=>{if(c.selection)F.debug("handleDelete: Deleting the current selection"),b({nodes:f.nodes.map(a=>({id:a})),edges:f.edges.map(a=>({id:a}))});else if(c.nodeId){if(F.debug(`handleDelete: Attempting to delete node ${c.nodeId}`),!function(a,b){let c=D(a,b);return!!c&&"start"!==c.type}(c.nodeId,a)){F.warn(`Cannot delete Start node: ${c.nodeId}`),alert("Start nodes cannot be deleted");return}b({nodes:[{id:c.nodeId}]})}else c.edgeId&&(F.debug(`handleDelete: Deleting edge ${c.edgeId}`),b({edges:[{id:c.edgeId}]}))},[c,b,a,f]),l=(0,e.useCallback)((a,b)=>{h(a,b.id)},[h]),m=(0,e.useCallback)((a,b)=>{h(a,void 0,b.id)},[h]),n=(0,e.useCallback)(a=>{h(a)},[h]),o=(0,e.useCallback)(a=>{h(a,void 0,void 0,!0)},[h]);return{contextMenu:c,selectedElements:f,onContextMenu:h,closeContextMenu:j,handleDelete:k,onNodeContextMenu:l,onEdgeContextMenu:m,onPaneContextMenu:n,onSelectionContextMenu:o}}(f),{deleteElements:J}=(0,i.VH)(),K=(0,i.PI)(),L=(0,e.useRef)(null),[M,N]=(0,e.useState)(null),[Y,Z]=(0,e.useState)({open:!1,position:null}),$=(0,e.useCallback)(a=>[...f.filter(a=>a.selected).map(a=>({type:"select",id:a.id,selected:!1})),{type:"add",item:{...a,selected:!0}}],[f]);(0,e.useEffect)(()=>{if(!t)return;let a=a=>{if(a.detail&&a.detail.nodeId){let b=D(a.detail.nodeId,f);b&&t(b)}};return document.addEventListener("editNode",a),()=>{document.removeEventListener("editNode",a)}},[f,t]);let _=(0,e.useCallback)(a=>{if(!a.sourceHandle||!a.targetHandle)return void Q.error("Invalid connection: Missing source or target handle",a);let b=K.getState().connection.fromHandle?.type==="target";if(!(0,G.JL)(a,f,g))return;let d=(0,G.wn)(a,f);if(d.data?.edgeType==="standard"){let d=a=>a.data?.edgeType!=="mcp",e=a=>!!a.data?.bidirectional,h=g.find(b=>d(b)&&b.source===a.source&&b.target===a.target),i=g.find(b=>d(b)&&b.source===a.target&&b.target===a.source),k=a=>{Q.info(`Merging reverse connection into bidirectional edge ${a.id}`),l([{type:"replace",id:a.id,item:{...a,data:{...a.data,bidirectional:!0},markerStart:{type:j.TG.ArrowClosed,width:20,height:20,color:c.palette.text.secondary}}}])};if(b){let a=h??i;return a?void(!e(a)&&(0,G.y2)(a,f,g)&&k(a)):void Q.info("Connection drawn from a top handle is only allowed to convert an existing edge to bidirectional")}if(h&&e(h))return;if(i){!e(i)&&(0,G.y2)(i,f,g)&&k(i);return}}l([...(0,G.Cm)(d,g).map(a=>({type:"remove",id:a})),{type:"add",item:d}])},[f,g,l,K,c.palette.text.secondary]),aa=(0,e.useCallback)(a=>(0,G.p9)(a,f,g),[f,g]);(0,e.useEffect)(()=>{let a=a=>{let{edgeId:b,waypoints:c}=a.detail,d=g.find(a=>a.id===b);if(!d)return;let{waypoint:e,...f}=d.data??{};l([{type:"replace",id:b,item:{...d,data:{...f,waypoints:c??void 0}}}])};return document.addEventListener(C.R,a),()=>document.removeEventListener(C.R,a)},[g,l]);let ab=(0,e.useCallback)(async({nodes:a,edges:b})=>{let c=a.filter(a=>"start"!==a.type),d=new Set(c.map(a=>a.id)),e=new Set(a.map(a=>a.id)),f=b.filter(a=>!!(a.selected||d.has(a.source)||d.has(a.target))||!(e.has(a.source)||e.has(a.target))),g=c.filter(a=>"trigger"===a.type);return g.length>0&&await Promise.all(g.map(async a=>{let b=a.data?.properties?.executionId;if("string"==typeof b&&b)try{await o.P.update(b,{enabled:!1})}catch(a){console.warn("TriggerNode: failed to disarm PlannedExecution",b,a)}})),(0!==c.length||0!==f.length)&&{nodes:c,edges:f}},[]),ac=(0,e.useCallback)(a=>{N(a),r&&r(a)},[r]);(0,e.useEffect)(()=>{let a=a=>{if(!a.detail||!M)return;let{nodeType:b,position:c}=a.detail,d=n.g.createNode(b,c);h($(d)),t&&t(d)};return document.addEventListener("addNodeFromPalette",a),()=>{document.removeEventListener("addNodeFromPalette",a)}},[M,h,$,t]);let ad=(0,e.useCallback)(()=>{if(v.nodeId&&t){let a=D(v.nodeId,f);a&&t(a)}else if(v.edgeId&&u){let a=g.find(a=>a.id===v.edgeId);a&&u(a)}},[v.nodeId,v.edgeId,f,g,t,u]),ae=(0,e.useCallback)(()=>{let a;if(!v.edgeId)return;let b=g.find(a=>a.id===v.edgeId);if(!b)return;if(b.data?.edgeType!=="standard")return void Q.debug(`Toggle bidirectional ignored for non-standard edge ${b.id}`);let d=!!b.data?.bidirectional;if(!d&&!(0,G.y2)(b,f,g))return void Q.info(`Edge ${b.id} cannot be made bidirectional (reverse direction is not a legal connection)`);let e={...b.data??{},bidirectional:!d};if(d){let{markerStart:c,...d}=b;a={...d,data:e}}else a={...b,data:e,markerStart:{type:j.TG.ArrowClosed,width:20,height:20,color:c.palette.text.secondary}};l([{type:"replace",id:b.id,item:a}])},[v.edgeId,g,f,l,c.palette.text.secondary]),af=(0,e.useCallback)((a,b)=>{a.preventDefault(),t&&t(b)},[t]),ag=(0,e.useCallback)((a,b)=>{let{fromNode:c,fromHandle:d,toHandle:e}=b;if(!c||!d?.id||!M)return void Q.debug("onConnectEnd: No valid connection start data");Q.debug(`onConnectEnd: Connection ended from node ${c.id}, handle ${d.id}`);let f="subflow"===c.type&&g.some(a=>{let b=a.data;return b?.edgeType!=="mcp"&&b?.edgeType!=="resource"&&(a.source===c.id||a.target===c.id&&!!b?.bidirectional)}),h=!!a.target?.closest?.(".react-flow__pane");if(!function(a){let{fromNodeType:b,fromHandleType:c,fromHandleId:d,landedOnHandle:e,droppedOnPane:f,subflowHasOutgoing:g}=a;return!e&&!!f&&!!d&&("target"!==c||!!(0,H.z5)(d))&&("subflow"!==b||"source"!==c||!g)}({fromNodeType:c.type,fromHandleType:d.type,fromHandleId:d.id,landedOnHandle:!!e,droppedOnPane:h,subflowHasOutgoing:f}))return;let i=a instanceof MouseEvent?a:a.changedTouches[0],j=M.screenToFlowPosition({x:i.clientX,y:i.clientY});Q.debug(`onConnectEnd: Connection dropped on pane at position (${j.x}, ${j.y})`),Z({open:!0,position:j,sourceNodeId:c.id,sourceNodeType:c.type,sourceHandleId:d.id})},[M,g]),ah=(0,e.useCallback)((a,b)=>{Q.debug(`handleNodeTypeSelection: Selected node type ${a} at position (${b.x}, ${b.y})`);let c=n.g.createNode(a,b);h($(c));let{sourceNodeId:d,sourceHandleId:e}=Y,i=d?D(d,f):void 0;if(i&&e){let b=(0,H.CW)(a,e),d={source:i.id,sourceHandle:e,target:c.id,targetHandle:b};if(Q.debug(`handleNodeTypeSelection: Creating connection from ${d.source} to ${d.target}`),(0,G.JL)(d,[...f,c],g)){let a=(0,G.wn)(d,[...f,c]);l([...(0,G.Cm)(a,g).map(a=>({type:"remove",id:a})),{type:"add",item:a}]),Q.debug(`handleNodeTypeSelection: Edge created with id ${a.id}`)}}Z({open:!1,position:null}),t&&t(c)},[Y,f,g,$,h,l,t]),ai=(0,e.useCallback)(()=>{Q.debug("handleCloseNodeSelectionModal: Closing node selection modal"),Z({open:!1,position:null})},[]),aj=(0,e.useCallback)(()=>{let a=new Set(w.nodes),b=f.filter(b=>a.has(b.id)&&"start"!==b.type);if(0===b.length)return!1;let c=new Set(b.map(a=>a.id)),d=g.filter(a=>c.has(a.source)&&c.has(a.target));return T({nodes:JSON.parse(JSON.stringify(b)),edges:JSON.parse(JSON.stringify(d))}),Q.debug(`Copied ${b.length} node(s) and ${d.length} edge(s)`),!0},[w,f,g]),ak=(0,e.useCallback)(()=>{let a=S;if(!a)try{let b=localStorage.getItem(R);b&&(a=JSON.parse(b))}catch(a){Q.warn("Could not read flow clipboard from localStorage",a)}if(!a||!a.nodes||0===a.nodes.length)return void Q.debug("Paste requested but clipboard is empty");let b=new Map;a.nodes.forEach(a=>b.set(a.id,(0,m.A)()));let c=a.nodes.map(a=>({...a,id:b.get(a.id),position:{x:(a.position?.x??0)+40,y:(a.position?.y??0)+40},selected:!0,data:{...a.data}})),d=(a.edges||[]).filter(a=>b.has(a.source)&&b.has(a.target)).map(a=>({...a,id:(0,m.A)(),source:b.get(a.source),target:b.get(a.target),selected:!1}));h([...f.filter(a=>a.selected).map(a=>({type:"select",id:a.id,selected:!1})),...c.map(a=>({type:"add",item:a}))]),d.length>0&&l(d.map(a=>({type:"add",item:a}))),Q.info(`Pasted ${c.length} node(s) and ${d.length} edge(s)`)},[f,h,l]),al=(0,e.useCallback)(a=>{let b=a.ctrlKey||a.metaKey,c=a.key.toLowerCase();if(b&&"c"===c){aj()&&a.preventDefault();return}if(b&&"x"===c){aj()&&(a.preventDefault(),J({nodes:w.nodes.map(a=>({id:a})),edges:w.edges.map(a=>({id:a}))}));return}if(b&&"v"===c){a.preventDefault(),ak();return}},[aj,ak,J,w]),am=(0,e.useCallback)(()=>{if(v.nodeId&&!w.nodes.includes(v.nodeId)){let a=f.find(a=>a.id===v.nodeId);a&&"start"!==a.type&&(T({nodes:JSON.parse(JSON.stringify([a])),edges:[]}),Q.debug("Copied right-clicked node to clipboard"));return}aj()},[v.nodeId,w,f,aj]),an=(0,e.useMemo)(()=>{if(S)return!0;try{return!!localStorage.getItem(R)}catch{return!1}},[v.open]),ao=(0,e.useMemo)(()=>{if(v.selection){let a=new Set(w.nodes);return f.some(b=>a.has(b.id)&&"start"!==b.type)}if(v.nodeId){let a=f.find(a=>a.id===v.nodeId);return!!a&&"start"!==a.type}return!1},[v.selection,v.nodeId,w,f]);return(0,d.jsxs)(X,{ref:a=>{b&&("function"==typeof b?b(a):b.current=a),s&&(s.current=a),L.current=a},children:[(0,d.jsxs)(i.Gc,{nodes:f,edges:g,nodeTypes:U,edgeTypes:V,defaultEdgeOptions:(0,e.useMemo)(()=>({type:"custom",animated:!0,style:{stroke:c.palette.text.secondary,strokeWidth:2},markerEnd:{type:j.TG.ArrowClosed,width:20,height:20,color:c.palette.text.secondary}}),[c.palette.text.secondary]),connectionLineType:j.Do.SmoothStep,connectionMode:j.WZ.Loose,isValidConnection:aa,onNodesChange:h,onEdgesChange:l,onConnect:_,onBeforeDelete:ab,deleteKeyCode:["Backspace","Delete"],onDrop:p,onDragOver:q,onInit:ac,onNodeContextMenu:z,onEdgeContextMenu:B,onPaneContextMenu:E,onSelectionContextMenu:I,onKeyDown:al,onNodeDoubleClick:af,onConnectEnd:ag,tabIndex:0,fitView:!0,attributionPosition:"bottom-right",minZoom:.1,maxZoom:2,snapToGrid:!0,snapGrid:[15,15],connectOnClick:!1,children:[(0,d.jsx)(O,{}),(0,d.jsx)(P,{})]}),(0,d.jsx)(A,{open:v.open,position:v.position,onClose:x,onDelete:y,onEditProperties:ad,onToggleBidirectional:ae,onCopy:am,onPaste:ak,canPaste:an,canCopy:ao,nodeId:v.nodeId,selection:v.selection,edgeId:v.edgeId}),(0,d.jsx)(W,{open:Y.open,position:Y.position,onClose:ai,onSelectNodeType:ah,sourceNodeType:Y.sourceNodeType,sourceHandleId:Y.sourceHandleId})]})});Y.displayName="Canvas";let Z=Y},61220:(a,b,c)=>{c.d(b,{A:()=>P});var d=c(21124),e=c(38301),f=c(19815);async function g(a,b={}){return{text:"Speech recognition is only available in browser environments",success:!1,error:"Server-side transcription is not supported"}}c(4580),(0,f.h)("frontend/services/transcription");var h=c(49938),i=c(54573),j=c(81637),k=c(79515),l=c(44079),m=c(41893),n=c(37674),o=c(43312),p=c(95587),q=c(77028),r=c(40512),s=c(83899),t=c(52327),u=c(8521),v=c(19925),w=c(68730),x=c(70011),y=c(9258),z=c(73245),A=c(30137),B=c(88970),C=c(36698),D=c(12033),E=c(73821),F=c(46973),G=c(95791),H=c(60839),I=c(57361);let J=new Set(["start","process","subflow"]),K=a=>a.type??a.data?.type,L=({flow:a,selectedNodeId:b,onSelect:c,onClose:f})=>{let g=(0,H.A)(),h=(0,e.useMemo)(()=>(a?.nodes||[]).map(a=>{let c=J.has(K(a)||""),d=a.id===b;return{...a,draggable:!1,selectable:!1,style:{...a.style||{},opacity:c?1:.35,cursor:c?"pointer":"default",borderRadius:8,boxShadow:d?`0 0 0 3px ${g.palette.primary.main}`:void 0,transition:"box-shadow 120ms ease"}}}),[a?.nodes,b,g.palette.primary.main]),i=(0,e.useMemo)(()=>(a?.edges||[]).filter(a=>a.source&&a.target&&a.sourceHandle&&a.targetHandle),[a?.edges]),j=(0,e.useMemo)(()=>({type:"custom",animated:!1,style:{stroke:g.palette.text.secondary,strokeWidth:2},markerEnd:{type:F.TG.ArrowClosed,width:20,height:20,color:g.palette.text.secondary}}),[g.palette.text.secondary]);return(0,d.jsx)(G.Gc,{nodes:h,edges:i,nodeTypes:I.c_,edgeTypes:I.nd,defaultEdgeOptions:j,connectionLineType:F.Do.SmoothStep,fitView:!0,minZoom:.1,maxZoom:2,onNodeClick:(a,b)=>{J.has(K(b)||"")&&(c(b.id),f())},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,deleteKeyCode:null,proOptions:{hideAttribution:!0},children:(0,d.jsx)(G.VS,{})})},M=({open:a,flow:b,selectedNodeId:c,allowAutomatic:e,onSelect:f,onClose:g})=>{let h=!!(b&&(b.nodes?.length??0)>0);return(0,d.jsxs)(r.A,{open:a,onClose:g,maxWidth:"lg",fullWidth:!0,children:[(0,d.jsx)(s.A,{children:"Pick a node to run on"}),(0,d.jsxs)(t.A,{dividers:!0,sx:{p:0},children:[(0,d.jsx)(j.default,{sx:{px:2,pt:1.5},children:(0,d.jsxs)(k.default,{variant:"caption",color:"text.secondary",children:["Click a ",(0,d.jsx)("strong",{children:"Start"}),", ",(0,d.jsx)("strong",{children:"Process"}),", or"," ",(0,d.jsx)("strong",{children:"Subflow"})," node. Other nodes and edges can't be picked."]})}),(0,d.jsx)(j.default,{sx:{height:"62vh",width:"100%"},children:h?(0,d.jsx)(G.Ln,{children:(0,d.jsx)(L,{flow:b,selectedNodeId:c,onSelect:f,onClose:g})}):(0,d.jsx)(j.default,{sx:{height:"100%",display:"flex",alignItems:"center",justifyContent:"center"},children:(0,d.jsx)(k.default,{variant:"body2",color:"text.secondary",children:"No flow to display."})})})]}),(0,d.jsxs)(v.A,{children:[e&&(0,d.jsx)(w.A,{startIcon:(0,d.jsx)(E.A,{}),onClick:()=>{f(null),g()},children:"Automatic"}),(0,d.jsx)(j.default,{sx:{flex:1}}),(0,d.jsx)(w.A,{onClick:g,children:"Cancel"})]})]})};var N=c(2117);let O=(0,f.h)("frontend/components/Chat/ChatInput"),P=({onSendMessage:a,disabled:b=!1,requireApproval:c=!1,onRequireApprovalChange:f,executeInDebugger:E=!1,onExecuteInDebuggerChange:F,availableNodes:G=[],flow:H=null,currentNodeId:I=null,nodeOverrideActive:J=!1,onSelectNode:K,editing:L=null,onEditingContentChange:P,onEditingNodeChange:Q,onSaveEdit:R,onCancelEdit:S})=>{let{settings:T}=(0,h.rX)(),[U,V]=(0,e.useState)(""),[W,X]=(0,e.useState)([]),[Y,Z]=(0,e.useState)(!1),[$,_]=(0,e.useState)(0),[aa,ab]=(0,e.useState)(null),ac=(0,e.useRef)(null),ad=(0,e.useRef)(null),ae=(0,e.useRef)([]),[af,ag]=(0,e.useState)(!1),ah=!!L,ai=ah?L?.nodeId??null:I,aj=(a=>G.find(b=>b.id===a)?.label||(a?`${a.substring(0,6)}...`:"Start"))(ai),[ak,al]=(0,e.useState)(!1),[am,an]=(0,e.useState)(""),[ao,ap]=(0,e.useState)(""),[aq,ar]=(0,e.useState)("document"),[as,at]=(0,e.useState)(null),[au,av]=(0,e.useState)(),[aw,ax]=(0,e.useState)(!1),[ay,az]=(0,e.useState)(0),[aA,aB]=(0,e.useState)(""),aC=()=>{L&&L.content.trim()&&R?.()},aD=()=>{(U.trim()||W.length>0)&&(O.debug("Sending message",{messageLength:U.length,attachmentsCount:W.length}),a(U,W),V(""),X([]))},aE=async a=>{let b=a.target.files;if(!b||0===b.length)return;let c=b[0];O.debug("File selected",{fileName:c.name,fileSize:c.size,fileType:c.type});try{let a=c.type||"application/octet-stream";if(a.startsWith("text/")||/\.(txt|md|json|csv|html?|xml|js|ts|jsx|tsx|css|scss)$/i.test(c.name)){ap(`Processing ${c.name}`),ar("document"),an(""),ax(!0),al(!0);let a=await aF(c);O.debug("File read successfully",{contentLength:a.length}),an(a),ax(!1)}else{let b=await aG(c),d=a.startsWith("image/")?"image":a.startsWith("audio/")?"audio":a.startsWith("video/")?"video":"document";X(e=>[...e,{id:(0,N.A)(),type:d,content:b,originalName:c.name,mimeType:a}])}}catch(a){O.error("Error reading file:",a),an("Error reading file. Please try again."),ax(!1)}ac.current&&(ac.current.value="")},aF=a=>new Promise((b,c)=>{let d=new FileReader;d.onload=a=>{a.target?.result?b(a.target.result):c(Error("Failed to read file"))},d.onerror=()=>{c(Error("Error reading file"))},d.readAsText(a)}),aG=a=>new Promise((b,c)=>{let d=new FileReader;d.onload=()=>"string"==typeof d.result?b(d.result):c(Error("Failed to encode file")),d.onerror=()=>c(Error("Error reading file")),d.readAsDataURL(a)}),aH=async()=>{O.debug("Starting audio recording");try{let a=await navigator.mediaDevices.getUserMedia({audio:!0});O.debug("Audio stream obtained successfully"),ae.current=[];let b=new MediaRecorder(a);ad.current=b,b.ondataavailable=a=>{a.data.size>0&&ae.current.push(a.data)},b.onstop=async()=>{let c=b.mimeType||ae.current[0]?.type||"audio/webm",d=new Blob(ae.current,{type:c});ap("Audio Recording"),ar("audio"),at(await aG(d)),av(c),an(""),ax(!0),al(!0);try{if((T?.speech||{enabled:!0,modelSize:"base",autoDownload:!1}).enabled){aB("Initializing transcription..."),az(0);let a=await g(d,{onProgress:az,onStatusChange:aB,language:navigator.language});if(a.success){let b=a.text;an(b),O.debug("Transcription successful",{textLength:a.text.length,engine:a.engine})}else an(`Error transcribing audio: ${a.error}.`),O.error("Transcription failed",{error:a.error})}else an("Speech recognition is disabled in settings. Enable it to get automatic transcriptions.")}catch(a){O.error("Error handling audio recording",{error:a}),an(`Failed to process audio: ${a}`)}finally{ax(!1),a.getTracks().forEach(a=>a.stop())}},b.start(),Z(!0);let c=setInterval(()=>{_(a=>a+1)},1e3);ab(c)}catch(a){O.error("Error starting recording:",a),alert("Could not access microphone. Please check permissions.")}};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(i.A,{elevation:3,sx:{p:2,display:"flex",flexDirection:"column",borderRadius:2},children:[W.length>0&&(0,d.jsx)(j.default,{sx:{mb:2,display:"flex",flexWrap:"wrap",gap:1},children:W.map(a=>(0,d.jsxs)(i.A,{variant:"outlined",sx:{p:1,display:"flex",alignItems:"center",borderRadius:1,bgcolor:"background.default"},children:["image"===a.type?(0,d.jsx)(j.default,{component:"img",src:a.content,alt:a.originalName||"pasted image",sx:{width:40,height:40,objectFit:"cover",borderRadius:1,mr:1}}):"video"===a.type?(0,d.jsx)(j.default,{component:"video",src:a.content,sx:{width:40,height:40,objectFit:"cover",borderRadius:1,mr:1}}):"document"===a.type?(0,d.jsx)(y.A,{fontSize:"small",sx:{mr:1}}):(0,d.jsx)(z.A,{fontSize:"small",sx:{mr:1}}),(0,d.jsx)(k.default,{variant:"body2",noWrap:!0,sx:{maxWidth:150},children:a.originalName||`${a.type} attachment`}),(0,d.jsx)(l.A,{size:"small",onClick:()=>(a=>{O.debug("Removing attachment",{id:a}),X(W.filter(b=>b.id!==a))})(a.id),sx:{ml:1},children:(0,d.jsx)(A.A,{fontSize:"small"})})]},a.id))}),ah&&(0,d.jsxs)(j.default,{sx:{mb:1,display:"flex",alignItems:"center",gap:1},children:[(0,d.jsx)(m.A,{icon:(0,d.jsx)(D.A,{}),label:"Editing message",size:"small",color:"warning",variant:"outlined"}),(0,d.jsx)(k.default,{variant:"caption",color:"text.secondary",children:"Enter to save \xb7 Esc to cancel"})]}),(0,d.jsxs)(j.default,{sx:{display:"flex",alignItems:"flex-end"},children:[(0,d.jsx)(n.A,{fullWidth:!0,multiline:!0,maxRows:ah?12:4,"data-tour":"chat-input",placeholder:ah?"Edit message...":"Type a message...",value:ah?L?.content??"":U,onChange:a=>{ah?P?.(a.target.value):V(a.target.value)},onKeyDown:a=>{"Enter"!==a.key||a.shiftKey?"Escape"===a.key&&ah&&(a.preventDefault(),S?.()):(a.preventDefault(),ah?aC():(O.debug("Enter key pressed, sending message"),aD()))},onPaste:a=>{let b=a.clipboardData?.items;if(!b)return;let c=[];for(let a=0;a<b.length;a++){let d=b[a];if("file"===d.kind&&d.type.startsWith("image/")){let a=d.getAsFile();a&&c.push(a)}}0!==c.length&&(a.preventDefault(),O.debug("Pasting image attachment(s)",{count:c.length}),c.forEach(a=>{let b=new FileReader;b.onload=b=>{let c=b.target?.result;if("string"!=typeof c)return;let d=(a.type.split("/")[1]||"png").split("+")[0];X(b=>[...b,{id:(0,N.A)(),type:"image",content:c,originalName:a.name&&!/^image\.\w+$/i.test(a.name)?a.name:`Pasted image.${d}`}])},b.onerror=()=>O.error("Failed to read pasted image"),b.readAsDataURL(a)}))},disabled:!ah&&b,variant:"outlined",autoFocus:ah,sx:{mr:1},InputProps:{sx:{borderRadius:2}}}),!ah&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o.A,{title:"Attach document",children:(0,d.jsx)(l.A,{color:"primary",onClick:()=>{O.debug("File selection triggered"),ac.current?.click()},disabled:b||Y,children:(0,d.jsx)(y.A,{})})}),(0,d.jsx)("input",{type:"file",ref:ac,onChange:aE,style:{display:"none"},accept:"image/*,audio/*,video/*,.pdf,.txt,.md,.json,.csv,.html,.xml,.js,.ts,.jsx,.tsx,.css,.scss"}),(0,d.jsx)(o.A,{title:Y?"Stop recording":"Record audio",children:(0,d.jsxs)(l.A,{color:Y?"error":"primary",onClick:Y?()=>{O.debug("Stopping audio recording"),ad.current&&"inactive"!==ad.current.state&&(ad.current.stop(),Z(!1),aa&&(clearInterval(aa),ab(null)),_(0))}:aH,disabled:b,children:[(0,d.jsx)(z.A,{}),Y&&(0,d.jsx)(k.default,{variant:"caption",sx:{position:"absolute",bottom:-15,fontSize:"0.7rem",color:"error.main"},children:(a=>{let b=Math.floor(a/60);return`${b.toString().padStart(2,"0")}:${(a%60).toString().padStart(2,"0")}`})($)})]})})]}),ah?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o.A,{title:"Save edit",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{color:"primary",onClick:aC,disabled:!L?.content.trim(),children:(0,d.jsx)(C.A,{})})})}),(0,d.jsx)(o.A,{title:"Cancel edit",children:(0,d.jsx)(l.A,{color:"default",onClick:()=>S?.(),children:(0,d.jsx)(A.A,{})})})]}):(0,d.jsx)(o.A,{title:"Send message",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{color:"primary",onClick:aD,disabled:b||!U.trim()&&0===W.length,children:(0,d.jsx)(x.A,{})})})})]})," ",(f||(K||ah)&&G.length>0)&&(0,d.jsxs)(j.default,{sx:{mt:1,display:"flex",justifyContent:"flex-start",alignItems:"center",flexWrap:"wrap",gap:1},children:[(K||ah)&&G.length>0&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o.A,{title:ah?"Node this message runs on — click to pick from the flow":J?"Next message will run on this manually picked node — click to change":"Node the next message will run on — click to pick from the flow",children:(0,d.jsx)(m.A,{icon:(0,d.jsx)(B.A,{}),label:aj,size:"small",color:ah||J?"primary":"default",variant:ah||J?"filled":"outlined",onClick:()=>ag(!0),disabled:!ah&&b})}),(0,d.jsx)(M,{open:af,flow:H,selectedNodeId:ai,allowAutomatic:!ah,onSelect:a=>{ah?Q?.(a):K?.(a)},onClose:()=>ag(!1)})]}),f&&(0,d.jsx)(p.A,{control:(0,d.jsx)(q.A,{checked:c,onChange:a=>f(a.target.checked),size:"small",disabled:b}),label:(0,d.jsx)(k.default,{variant:"caption",children:"Require Tool Approvals"}),sx:{mr:"auto"}}),F&&(0,d.jsx)(p.A,{control:(0,d.jsx)(q.A,{checked:E,onChange:a=>F(a.target.checked),size:"small",disabled:b}),label:(0,d.jsx)(k.default,{variant:"caption",children:"Execute in Debugger"}),sx:{ml:2}})]})," "]})," ",(0,d.jsxs)(r.A,{open:ak,onClose:()=>!aw&&al(!1),maxWidth:"md",fullWidth:!0,children:[(0,d.jsxs)(s.A,{children:[ao,!aw&&(0,d.jsx)(l.A,{"aria-label":"close",onClick:()=>al(!1),sx:{position:"absolute",right:8,top:8},children:(0,d.jsx)(A.A,{})})]}),(0,d.jsx)(t.A,{dividers:!0,children:aw?(0,d.jsxs)(j.default,{sx:{display:"flex",justifyContent:"center",flexDirection:"column",alignItems:"center",p:4},children:[(0,d.jsx)(u.default,{value:"audio"===aq&&ay?ay:void 0,variant:"audio"===aq&&ay>0?"determinate":"indeterminate"}),"audio"===aq&&(0,d.jsxs)(j.default,{sx:{mt:2,textAlign:"center"},children:[(0,d.jsx)(k.default,{variant:"body2",children:aA||"Processing audio..."}),ay>0&&(0,d.jsxs)(k.default,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[Math.round(ay),"%"]})]})]}):(0,d.jsx)(n.A,{multiline:!0,fullWidth:!0,minRows:10,maxRows:20,value:am,onChange:a=>an(a.target.value),variant:"outlined",placeholder:"document"===aq?"Document content":"Audio transcription"})}),(0,d.jsxs)(v.A,{children:[(0,d.jsx)(w.A,{onClick:()=>al(!1),disabled:aw,children:"Cancel"}),(0,d.jsx)(w.A,{onClick:()=>{O.debug("Adding attachment",{type:aq,titleLength:ao.length}),X([...W,{id:(0,N.A)(),type:aq,content:"audio"===aq&&as?as:am,originalName:ao,..."audio"===aq&&au?{mimeType:au,transcript:am}:{}}]),at(null),av(void 0),al(!1)},variant:"contained",disabled:aw||!am.trim(),children:"Add to Message"})]})]})]})}},74855:(a,b,c)=>{c.d(b,{MG:()=>e,Ud:()=>f});var d=c(46973);d.TG.ArrowClosed;let e={type:"resourceEdge",animated:!1,style:{stroke:"#009688",strokeWidth:2},markerEnd:{type:d.TG.ArrowClosed,width:20,height:20,color:"#009688"}},f={type:"mcpEdge",animated:!1,style:{stroke:"#1976d2",strokeWidth:2},markerEnd:{type:d.TG.ArrowClosed,width:20,height:20,color:"#1976d2"},markerStart:{type:d.TG.ArrowClosed,width:20,height:20,color:"#1976d2"}}},90430:(a,b,c)=>{c.d(b,{Cm:()=>l,JL:()=>i,p9:()=>h,wn:()=>j,y2:()=>k});var d=c(74855),e=c(36627);function f(a,b,c){return b.filter(b=>!(0,e.BY)(b)&&(b.source===a?b.target!==c:!!(b.target===a&&b.data?.bidirectional)&&b.source!==c))}function g(a,b,c=[]){if(!a.source||!a.target||!a.sourceHandle||!a.targetHandle)return"Missing source, target, or handles";let d=b.find(b=>b.id===a.source),h=b.find(b=>b.id===a.target);if(!d||!h)return"Source or target node not found";let i=(0,e.vC)(d.type,a.sourceHandle,h.type,a.targetHandle);return i||("subflow"===d.type&&f(d.id,c,a.target).length>0?"Subflow nodes can only have one outgoing connection":null)}function h(a,b,c=[]){return null===g(a,b,c)}function i(a,b,c=[]){let d=g(a,b,c);return!d||(console.error(`Invalid connection: ${d}`,a),!1)}function j(a,b,c){let f=b.find(b=>b.id===a.source),g=b.find(b=>b.id===a.target),h=a.sourceHandle,i=a.targetHandle,j=f?.type==="mcp"||g?.type==="mcp"||(0,e.z5)(h)||(0,e.z5)(i),k=!j&&(f?.type==="resource"||g?.type==="resource"||(0,e.vM)(h)||(0,e.vM)(i)),l=`${a.source}:${h}->${a.target}:${i}`;return j?{id:l,...a,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:d.Ud.markerEnd,markerStart:d.Ud.markerStart,style:d.Ud.style}:k?{id:l,...a,type:"resourceEdge",data:{edgeType:"resource"},animated:!1,markerEnd:d.MG.markerEnd,style:d.MG.style}:{id:l,...a,type:"custom",data:{edgeType:"standard",...c?{condition:c}:{}},animated:!0}}function k(a,b,c=[]){let d=b.find(b=>b.id===a.source),g=b.find(b=>b.id===a.target);return!!d&&!!g&&("subflow"!==g.type||!(f(g.id,c,a.source).length>0))&&null===(0,e.vC)(g.type,null,d.type,null)}function l(a,b){let c=a=>a.data?.edgeType,d=a=>"mcp"===c(a),e=a=>"resource"===c(a);return b.filter(b=>b.id===a.id||(d(a)?d(b)&&(b.source===a.source&&b.target===a.target||b.source===a.target&&b.target===a.source):e(a)?e(b)&&b.source===a.source&&b.target===a.target:!d(b)&&!e(b)&&b.source===a.source&&b.target===a.target)).map(a=>a.id)}},97004:(a,b,c)=>{c.d(b,{R:()=>l,A:()=>r});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839);function j(a){return a===g.yX.Left||a===g.yX.Right?"h":"v"}var k=c(29237);let l="flowEdgeWaypoint",m={x:16,y:-16},n=(0,h.Ay)("button")(({theme:a})=>({background:a.palette.background.paper,border:`1px solid ${a.palette.divider}`,cursor:"pointer",borderRadius:"50%",fontSize:"10px",width:"20px",height:"20px",display:"flex",justifyContent:"center",alignItems:"center",color:a.palette.text.secondary,boxShadow:"dark"===a.palette.mode?"0 2px 4px rgba(0,0,0,0.3)":"0 2px 4px rgba(0,0,0,0.1)","&:hover":{background:a.palette.error.main,borderColor:a.palette.error.main,color:a.palette.error.contrastText}})),o=(0,h.Ay)(f.tE)({"&&.animated":{strokeDasharray:5,animation:"flowPathAnimation 500ms infinite linear"},"&&.animated-both":{strokeDasharray:5,animation:"flowPathAnimation 750ms infinite linear alternate"},"@keyframes flowPathAnimation":{"0%":{strokeDashoffset:10},"100%":{strokeDashoffset:0}}}),p="#009688",q="#4DB6AC",r=({variant:a,id:b,source:c,target:h,sourceHandleId:r,targetHandleId:s,sourceX:t,sourceY:u,targetX:v,targetY:w,sourcePosition:x,targetPosition:y,style:z={},markerEnd:A,markerStart:B,data:C,selected:D})=>{let E,F,G=(0,i.A)(),{deleteElements:H,screenToFlowPosition:I,getNode:J}=(0,f.VH)(),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(null),O=(0,e.useRef)(null),P=(0,e.useRef)(!1),Q="standard"===a&&C?.condition?(0,k.P2)(C.condition):"",R=a=>!!a&&a.includes("process")&&a.includes("resource"),S="";if("resource"===a){let a=J(c)?.type,b=J(h)?.type;"resource"===a&&"process"===b?S="consume":"process"===a&&"resource"===b||R(r)?S="produce":R(s)&&(S="consume")}let T=C?.waypoints??(C?.waypoint?[C.waypoint]:[]),U=M??T,V="standard"===a&&!!C?.bidirectional,W="mcp"===a||"resource"===a,X=x||(W?g.yX.Left:g.yX.Bottom),Y=y||(W?g.yX.Right:g.yX.Top),Z=null;if(U.length>0)E=(Z=function(a,b,c,d,e,f=8){let g=[a,...e,c],h=[a],i=[],j=b,k=(a,b)=>{let c;c=h[h.length-1],.01>Math.abs(c.x-a.x)&&.01>Math.abs(c.y-a.y)||(h.push(a),i.push(b))};for(let a=1;a<g.length;a++){let b=h[h.length-1],c=g[a],e=a-1;if(a===g.length-1){if("v"===d)if("h"===j)k({x:c.x,y:b.y},e);else{let a=(b.y+c.y)/2;k({x:b.x,y:a},e),k({x:c.x,y:a},e)}else if("v"===j)k({x:b.x,y:c.y},e);else{let a=(b.x+c.x)/2;k({x:a,y:b.y},e),k({x:a,y:c.y},e)}k(c,e)}else k("v"===j?{x:b.x,y:c.y}:{x:c.x,y:b.y},e),k(c,e),j="v"===j?"h":"v"}!function(a,b){for(let c=1;c<a.length-1;c++){let d=a[c-1],e=a[c],f=a[c+1],g=.01>Math.abs(d.x-e.x)&&.01>Math.abs(f.x-e.x)&&(e.y-d.y)*(f.y-e.y)<0,h=.01>Math.abs(d.y-e.y)&&.01>Math.abs(f.y-e.y)&&(e.x-d.x)*(f.x-e.x)<0;if(g||h){if(g){let g=(a[c-2]?.x??e.x-1)<=e.x,h=g?e.x-12:e.x+12,i=g?e.x+12:e.x-12,j=b[c-1];a.splice(c-1,3,{x:h,y:d.y},{x:h,y:e.y},{x:i,y:e.y},{x:i,y:f.y}),b.splice(c-1,2,j,j,j)}else{let g=(a[c-2]?.y??e.y-1)<=e.y,h=g?e.y-12:e.y+12,i=g?e.y+12:e.y-12,j=b[c-1];a.splice(c-1,3,{x:d.x,y:h},{x:e.x,y:h},{x:e.x,y:i},{x:f.x,y:i}),b.splice(c-1,2,j,j,j)}c++}}}(h,i);let l=[];for(let a=0;a<h.length-1;a++)l.push({a:h[a],b:h[a+1],gap:i[a]});return{d:function(a,b){if(0===a.length)return"";let c=`M ${a[0].x},${a[0].y}`;for(let d=1;d<a.length-1;d++){let e=a[d-1],f=a[d],g=a[d+1],h=Math.hypot(f.x-e.x,f.y-e.y),i=Math.hypot(g.x-f.x,g.y-f.y),j=Math.min(b,h/2,i/2);if(j<.5){c+=` L ${f.x},${f.y}`;continue}let k={x:f.x-(f.x-e.x)/h*j,y:f.y-(f.y-e.y)/h*j},l={x:f.x+(g.x-f.x)/i*j,y:f.y+(g.y-f.y)/i*j};c+=` L ${k.x},${k.y} Q ${f.x},${f.y} ${l.x},${l.y}`}let d=a[a.length-1];return c+` L ${d.x},${d.y}`}(h,f),points:h,segments:l,midpoint:function(a,b){let c=0;for(let b=0;b<a.length-1;b++)c+=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(0===c)return a[0];let d=.5*c;for(let b=0;b<a.length-1;b++){let c=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(d<=c){let e=0===c?0:d/c;return{x:a[b].x+(a[b+1].x-a[b].x)*e,y:a[b].y+(a[b+1].y-a[b].y)*e}}d-=c}return a[a.length-1]}(h,.5)}}({x:t,y:u},j(X),{x:v,y:w},j(Y),U,16)).d,F=Z.midpoint;else{let[a,b,c]=(0,g.oN)({sourceX:t,sourceY:u,sourcePosition:X,targetX:v,targetY:w,targetPosition:Y,borderRadius:16});E=a,F={x:b,y:c}}let $=W?"":V?"animated-both":C?.animated!==!1?"animated":"",_={...z,strokeWidth:D?3:2,stroke:"mcp"===a?D?G.palette.info.light:G.palette.info.main:"resource"===a?D?q:p:D?G.palette.primary.main:G.palette.text.secondary,..."resource"===a?{strokeDasharray:"6 4"}:{},...$?{animationDuration:`${Math.round((V?750:500)*(a=>{let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)|0;return .9+Math.abs(b)%1e3/1e3*.2})(b))}ms`}:{}},aa=a=>{document.dispatchEvent(new CustomEvent(l,{detail:{edgeId:b,waypoints:a&&a.length>0?a:null}}))},ab=a=>{if(0!==a.button)return;let b=I({x:a.clientX,y:a.clientY}),c=Z?function(a,b){let c=0,d=1/0;for(let e of b){let b=function(a,b,c){let d=c.x-b.x,e=c.y-b.y,f=d*d+e*e,g=0===f?0:Math.max(0,Math.min(1,((a.x-b.x)*d+(a.y-b.y)*e)/f));return Math.hypot(a.x-(b.x+d*g),a.y-(b.y+e*g))}(a,e.a,e.b);b<d&&(d=b,c=e.gap)}return c}(b,Z.segments):0,d=[...U];d.splice(c,0,b),O.current={index:c,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:d,active:!1,fromPath:!0},a.target.setPointerCapture(a.pointerId)},ac=a=>{let b=O.current;if(!b||a.pointerId!==b.pointerId)return;if(!b.active){if(4>Math.hypot(a.clientX-b.startClient.x,a.clientY-b.startClient.y))return;b.active=!0}let c=[...b.base];c[b.index]=I({x:a.clientX,y:a.clientY}),N(c)},ad=a=>{let b=O.current;if(!b||a.pointerId!==b.pointerId||(O.current=null,a.target.releasePointerCapture(a.pointerId),P.current=b.active,!b.active))return;let c=[...b.base];c[b.index]=I({x:a.clientX,y:a.clientY}),aa(c),N(null)},ae=null!==M,af=D||K||ae;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o,{path:E,markerEnd:A,markerStart:B,style:_,id:b,className:$}),(0,d.jsx)("path",{d:E,fill:"none",stroke:"transparent",strokeWidth:20,style:{cursor:ae?"grabbing":"grab"},onMouseEnter:()=>L(!0),onMouseLeave:()=>L(!1),onPointerDown:ab,onPointerMove:ac,onPointerUp:ad}),(0,d.jsxs)(f.rV,{children:[Q&&(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${F.x}px,${F.y-18}px)`,pointerEvents:"none",background:G.palette.info.main,color:G.palette.info.contrastText,borderRadius:4,padding:"1px 6px",fontSize:10,fontWeight:600,whiteSpace:"nowrap",boxShadow:G.shadows[1],zIndex:1002},className:"nodrag nopan",title:`Routing condition: ${Q}`,children:Q}),S&&(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${F.x}px,${F.y-18}px)`,pointerEvents:"none",background:D?q:p,color:"#ffffff",borderRadius:4,padding:"1px 6px",fontSize:10,fontWeight:600,whiteSpace:"nowrap",boxShadow:G.shadows[1],zIndex:1002},className:"nodrag nopan",title:"consume"===S?"This step consumes (reads) the resource":"This step produces (writes) the resource",children:S}),af&&U.map((a,b)=>(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${a.x}px,${a.y}px)`,width:12,height:12,borderRadius:"50%",background:G.palette.primary.main,border:`2px solid ${G.palette.background.paper}`,boxShadow:G.shadows[1],cursor:"move",pointerEvents:"all",touchAction:"none",zIndex:1001},className:"nodrag nopan",title:"Drag to move; double-click to remove this bend",onMouseEnter:()=>L(!0),onMouseLeave:()=>L(!1),onPointerDown:a=>{0===a.button&&(a.stopPropagation(),O.current={index:b,pointerId:a.pointerId,startClient:{x:a.clientX,y:a.clientY},base:[...U],active:!1,fromPath:!1},a.target.setPointerCapture(a.pointerId))},onPointerMove:ac,onPointerUp:ad,onDoubleClick:a=>{a.stopPropagation(),(a=>{let b=U.filter((b,c)=>c!==a);N(null),aa(b)})(b)}},b)),(0,d.jsx)("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${F.x+m.x}px,${F.y+m.y}px)`,pointerEvents:af&&!ae?"all":"none",opacity:af&&!ae?1:0,transition:"opacity 120ms ease",zIndex:1e3},className:"nodrag nopan",onMouseEnter:()=>L(!0),onMouseLeave:()=>L(!1),children:(0,d.jsx)(n,{title:"Delete connection (drag to re-route)",style:{touchAction:"none"},onPointerDown:ab,onPointerMove:ac,onPointerUp:ad,onClick:a=>{if(a.stopPropagation(),P.current){P.current=!1;return}H({edges:[{id:b}]})},children:"\xd7"})})]})]})}},98502:(a,b,c)=>{c.d(b,{E9:()=>f,RN:()=>e,n9:()=>d});let d="handoff_to_";function e(a,b){let c=(a&&a.trim()||b&&b.trim()||"node").toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return c.length>48&&(c=c.slice(0,48).replace(/_+$/g,"")),c||(c=b&&b.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_")||"node"),c||"node"}function f(a){let b=new Set,c=new Map;for(let f of a){if(c.has(f.id))continue;let a=e(f.label,f.type),g=`${d}${a}`;if(b.has(g)){let c=2;for(;b.has(`${d}${a}_${c}`);)c++;g=`${d}${a}_${c}`}b.add(g),c.set(f.id,g)}return c}}};
@@ -1 +1 @@
1
- "use strict";exports.id=4265,exports.ids=[4265],exports.modules={14265:(a,b,c)=>{let d;c.d(b,{LG:()=>T,aM:()=>S,a$:()=>Q,e3:()=>O});var e=c(50846),f=c(8665),g=c(25250),h=c(60453),i=c(92372);let j=(0,e.h)("backend/services/mcp/quality/cache"),k="mcp-quality-cache";class l{constructor(a=Date.now()){this.entries={},this.dirty=!1,this.now=a}async load(){try{let a=await (0,i.YM)(k,{entries:{}});this.entries=a?.entries&&"object"==typeof a.entries?a.entries:{}}catch(a){j.warn("Failed to load quality cache; starting empty",a),this.entries={}}}get(a,b){let c=this.entries[`${a}::${b}`];if(c&&!(this.now-c.at>864e5))return c.signal}set(a,b,c){this.entries[`${a}::${b}`]={at:this.now,signal:c},this.dirty=!0}async flush(){let a=!1;for(let[b,c]of Object.entries(this.entries))this.now-c.at>864e5&&(delete this.entries[b],a=!0);if(this.dirty||a)try{await (0,i.VH)(k,{entries:this.entries})}catch(a){j.warn("Failed to persist quality cache",a)}}}function m(a){return!Number.isFinite(a)||a<0?0:a>1?1:a}function n(a,b){return!Number.isFinite(a)||a<=0?0:!Number.isFinite(b)||b<=1?+(a>0):m(Math.log10(a+1)/Math.log10(b+1))}let o=(0,e.h)("backend/services/mcp/quality/providers/githubStars"),p="github",q=new Map;function r(){return d??(process.env.GITHUB_TOKEN||void 0)}function s(a){let b,c=a.server.repository;if(c?.source&&"github"!==c.source.toLowerCase())return null;var d=c?.url;if(!d)return null;try{b=new URL(d.replace(/^git\+/,""))}catch{return null}if(!/(^|\.)github\.com$/i.test(b.hostname))return null;let e=b.pathname.replace(/\.git$/i,"").split("/").filter(Boolean);return e.length<2?null:`${e[0]}/${e[1]}`.toLowerCase()}async function t(a,b){let c=new AbortController,d=()=>c.abort();b.addEventListener("abort",d,{once:!0});let e=setTimeout(()=>c.abort(),6e3);try{return await fetch(`https://api.github.com${a}`,{headers:function(){let a={Accept:"application/vnd.github+json","User-Agent":"FLUJO-mcp-quality","X-GitHub-Api-Version":"2022-11-28"},b=r();return b&&(a.Authorization=`Bearer ${b}`),a}(),signal:c.signal,cache:"no-store"})}catch(b){return o.warn(`GitHub request failed (${a})`,b instanceof Error?b.message:b),null}finally{clearTimeout(e),b.removeEventListener("abort",d)}}function u(a){return(403===a.status||429===a.status)&&"0"===a.headers.get("x-ratelimit-remaining")}let v=(0,e.h)("backend/services/mcp/quality/providers/npmDownloads"),w="npm-downloads",x=new Map;function y(a){for(let b of a.server.packages??[])if("npm"===b.registryType&&b.identifier)return b.identifier;return null}function z(a){return a.startsWith("@")}async function A(a,b){let c=new AbortController,d=()=>c.abort();b.addEventListener("abort",d,{once:!0});let e=setTimeout(()=>c.abort(),6e3);try{return await fetch(`https://api.npmjs.org${a}`,{signal:c.signal,cache:"no-store"})}catch(b){return v.warn(`npm request failed (${a})`,b instanceof Error?b.message:b),null}finally{clearTimeout(e),b.removeEventListener("abort",d)}}let B="registry-status",C=[{id:p,label:"GitHub Stars & Activity",defaultWeight:.5,isApplicable:a=>null!==s(a),cacheKey:a=>s(a),async prefetch(a,b,c){let d=`${a??""} mcp`.trim(),e=`/search/repositories?q=${encodeURIComponent(d)}&sort=stars&order=desc&per_page=50`,f=await t(e,c);if(f&&f.ok)try{for(let a of(await f.json()).items??[])a.full_name&&q.set(a.full_name.toLowerCase(),{stars:"number"==typeof a.stargazers_count?a.stargazers_count:0,pushedAtMs:a.pushed_at?Date.parse(a.pushed_at):null})}catch(a){o.warn("Failed to parse GitHub search response",a)}else if(f&&u(f))return void o.warn("GitHub search rate-limited; ranking will degrade to other providers");if(!r())return;let g=3;for(let a of b){if(g<=0)break;let b=s(a);if(!b||q.has(b))continue;g-=1;let d=await t(`/repos/${b}`,c);if(d){if(u(d))break;if(d.ok)try{let a=await d.json();q.set(b,{stars:"number"==typeof a.stargazers_count?a.stargazers_count:0,pushedAtMs:a.pushed_at?Date.parse(a.pushed_at):null})}catch{}}}},async fetch(a){let b=s(a);if(!b)return null;let c=q.get(b);if(!c)return null;let d=n(c.stars,5e4),e=function(a,b,c=30,d=730){if(!a||!Number.isFinite(a))return 0;let e=(b-a)/864e5;return e<=c?1:e>=d?0:m(1-(e-c)/(d-c))}(c.pushedAtMs,Date.now());return{providerId:p,score:m(.7*d+.3*e),evidence:{repo:b,stars:c.stars,...c.pushedAtMs?{pushedAt:new Date(c.pushedAtMs).toISOString()}:{},starsScore:d,recencyScore:e}}}},{id:w,label:"npm Weekly Downloads",defaultWeight:.35,isApplicable:a=>null!==y(a),cacheKey:a=>y(a),async prefetch(a,b,c){let d=b.map(y).filter(a=>!!a&&!x.has(a)),e=d.filter(a=>!z(a)),f=d.filter(z);for(let a=0;a<e.length;a+=100){let b=e.slice(a,a+100),d=await A(`/downloads/point/last-week/${b.join(",")}`,c);if(d&&d.ok)try{let a=await d.json();if(1===b.length)"number"==typeof a.downloads&&x.set(b[0],a.downloads);else for(let c of b){let b=a[c];x.set(c,b&&"number"==typeof b.downloads?b.downloads:0)}}catch(a){v.warn("Failed to parse npm bulk downloads response",a)}}for(let a of f){let b=await A(`/downloads/point/last-week/${a}`,c);if(b&&b.ok)try{let c=await b.json();"number"==typeof c.downloads&&x.set(a,c.downloads)}catch{}}},async fetch(a){let b=y(a);if(!b)return null;let c=x.get(b);return void 0===c?null:{providerId:w,score:n(c,1e6),evidence:{package:b,weeklyDownloads:c}}}},{id:B,label:"Registry Status",defaultWeight:.15,isApplicable:a=>!0,cacheKey:()=>null,fetch:async a=>({providerId:B,score:+("active"===a.verificationStatus),evidence:{status:a.verificationStatus}})}];var D=c(38844);let E=(0,e.h)("backend/services/mcp/quality/settings");function F(){return{providers:C.map(a=>({id:a.id,enabled:!0,weight:a.defaultWeight})),minScore:0,worksGate:!0}}async function G(){try{let a=await (0,i.YM)(D.Z.MCP_QUALITY_SETTINGS,F());return function(a){var b,c;let d=F(),e=a??{},f=new Map;if(Array.isArray(e.providers))for(let a of e.providers)a&&"string"==typeof a.id&&f.set(a.id,a);return{providers:d.providers.map(a=>{let b=f.get(a.id);return{id:a.id,enabled:"boolean"==typeof b?.enabled?b.enabled:a.enabled,weight:"number"==typeof b?.weight&&Number.isFinite(b.weight)&&b.weight>=0?b.weight:a.weight}}),minScore:(b=e.minScore,c=d.minScore,"number"==typeof b&&Number.isFinite(b)?Math.min(1,Math.max(0,b)):c),worksGate:"boolean"==typeof e.worksGate?e.worksGate:d.worksGate,..."string"==typeof e.githubToken&&e.githubToken.length>0?{githubToken:e.githubToken}:{}}}(a)}catch(a){return E.warn("Failed to load mcpQuality settings; using defaults",a),F()}}let H=(0,e.h)("backend/services/mcp/quality/orchestrator");async function I(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{return await a(c.signal)}finally{clearTimeout(d)}}async function J(a,b,c={}){let e=c.topN??10;try{var f;let g=c.settings??await G(),h=C.filter(a=>(function(a,b){let c=a.providers.find(a=>a.id===b);return!!c?.enabled})(g,a.id));if(0===h.length)return b.map(a=>({candidate:a,score:0,signals:[]}));d=(f=g.githubToken)&&f.length>0?f:void 0;let i=b.slice(0,e),j=b.slice(e),k=new l(c.now??Date.now());await k.load();let n=i.map(()=>[]);for(let b of h){let c=i.map((a,b)=>({c:a,i:b})).filter(({c:a})=>b.isApplicable(a)),d=[],e=[];for(let a of c){let c=b.cacheKey(a.c);if(c){let d=k.get(b.id,c);if(d){e.push({i:a.i,signal:d});continue}}d.push(a)}if(b.prefetch&&d.length>0)try{await I(c=>b.prefetch(a,d.map(a=>a.c),c),12e3)}catch(a){H.warn(`Provider "${b.id}" prefetch failed; degrading`,a)}for(let{c:a,i:c}of d)try{let d=await I(c=>b.fetch(a,c),2e3);if(d){n[c].push(d);let e=b.cacheKey(a);e&&k.set(b.id,e,d)}}catch(c){H.warn(`Provider "${b.id}" fetch failed for "${a.registryName}"`,c)}for(let{i:a,signal:b}of e)n[a].push(b)}await k.flush();let o=i.map((a,b)=>{let c=n[b],d=new Map(c.map(a=>[a.providerId,a])),e=h.filter(b=>b.isApplicable(a)).map(a=>({providerId:a.id,weight:function(a,b){let c=a.providers.find(a=>a.id===b);return c&&c.enabled?c.weight:0}(g,a.id),score:d.get(a.id)?.score??0})),{score:f}=function(a){let b=0,c=0;for(let d of a){let a=Number.isFinite(d.weight)&&d.weight>0?d.weight:0,e=m(d.score);b+=a,c+=a*e}return{score:b>0?c/b:0,breakdown:a}}(e);return{candidate:a,score:f,signals:c}}).map((a,b)=>({s:a,idx:b})).sort((a,b)=>b.s.score-a.s.score||a.idx-b.idx).map(a=>a.s),p=j.map(a=>({candidate:a,score:0,signals:[]}));return[...o,...p]}catch(a){return H.warn("enrichAndRank failed; returning unranked candidates",a),b.map(a=>({candidate:a,score:0,signals:[]}))}}let K=(0,e.h)("backend/services/mcp/registryInstall"),L="/v0.1/servers";function M(a){return{registryName:a.server.name,server:a.server,verificationStatus:(0,g.vf)(a)}}function N(a){let b=b=>a.signals.find(a=>a.providerId===b)?.evidence,c=b(p),d=b(w),e=b(B);return{score:a.score,..."number"==typeof c?.stars?{stars:c.stars}:{},..."number"==typeof d?.weeklyDownloads?{weeklyDownloads:d.weeklyDownloads}:{},..."string"==typeof e?.status?{status:e.status}:{}}}async function O(a,b=8){let c=await P(a,b);return(await J(a,c.map(M))).map(a=>(function(a,b){let c=(0,g.AH)(a),d=c[0];return{name:a.name,...a.title?{title:a.title}:{},...a.description?{description:a.description}:{},installable:c.length>0,requiredEnv:d?(0,g.jg)(d):[],...b?{quality:N(b)}:{}}})(a.candidate.server,a))}async function P(a,b){let c=new URL(f.jD+L);c.searchParams.set("version","latest"),c.searchParams.set("limit",String(Math.min(Math.max(b,1),30))),a&&c.searchParams.set("search",a);let d=await (0,f.Ws)(c,15e3);return Array.isArray(d?.servers)?d.servers:[]}async function Q(a,b){try{let c=await J(a,b.map(M)),d=new Map(b.map(a=>[a.server.name,a])),e=[];for(let a of c){let b=d.get(a.candidate.server.name);b&&e.push(a.signals.length>0?{...b,quality:N(a)}:b)}return e.length===b.length?e:b}catch{return b}}async function R(a){let b=new URL(f.jD+L);b.searchParams.set("version","latest"),b.searchParams.set("limit","10"),b.searchParams.set("search",a);let c=await (0,f.Ws)(b,15e3),d=Array.isArray(c?.servers)?c.servers:[];return d.find(b=>b.server?.name===a)??d[0]??null}async function S(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A registry server name is required"};try{d=await R(a)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=d?.server??null;if(!e)return{installed:!1,error:`No registry entry found for "${a}"`};let f=(0,g.AH)(e)[0];if(!f)return{installed:!1,error:`"${e.name}" has no install method FLUJO supports (stdio package or HTTP remote)`};let i=(0,g.vf)(d),j=(0,g.O$)(a,e,f,i);if(c?.resolveOnly)return{installed:!1,serverName:j.serverName,plan:j};let k=(0,g.jg)(f,b);if(k.length>0)return{installed:!1,needsEnv:k,plan:j,error:`"${e.name}" requires values for: ${k.join(", ")}`};let l=(0,g.cy)((0,g.Yr)(e,f),b),m=l.name,n=await h.mcpService.loadServerConfigs();if(Array.isArray(n)&&n.some(a=>a.name===m)){K.info(`installRegistryServer: "${m}" already configured; reusing`);let{tools:a,error:b}=await h.mcpService.listServerTools(m);return{installed:!0,alreadyExisted:!0,serverName:m,plan:j,tools:(a??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...b?{error:b}:{}}}K.info(`installRegistryServer: installing "${e.name}" as "${m}" (${f.kind})`);let o=await h.mcpService.updateServerConfig(m,l);if(!Array.isArray(o)&&o&&"success"in o&&!1===o.success)return{installed:!1,error:`Saving the server failed: ${o.error??"unknown error"}`};let{tools:p,error:q}=await h.mcpService.listServerTools(m),r=(p??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}}));if((c?.worksGate??(await G()).worksGate)&&0===r.length){K.warn(`installRegistryServer: "${m}" exposed no tools${q?` (${q})`:""}; rolling back (works-gate)`);try{await h.mcpService.deleteServerConfig(m)}catch(a){K.error(`installRegistryServer: rollback of "${m}" failed`,a)}return{installed:!1,worksGateRejected:!0,serverName:m,plan:j,error:q?`"${e.name}" failed to start: ${q}`:`"${e.name}" connected but exposed no tools — rejected by the works-gate. Try a different server.`}}return{installed:!0,serverName:m,plan:j,tools:r,...q?{error:q}:{}}}async function T(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A capability search query is required"};try{d=await P(a,10)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=await J(a,d.map(M)),f=await G(),h=c?.minScore??f.minScore,i=c?.maxAttempts??3,j=[],k=0;for(let a of e){let d=a.candidate.registryName;if(a.score<h){j.push({name:d,score:a.score,reason:`below minScore ${h}`});break}if(0===(0,g.AH)(a.candidate.server).length){j.push({name:d,score:a.score,reason:"no supported install method"});continue}if(k>=i)break;k+=1;let e=await S(d,b,{worksGate:!0});if(c?.onAttempt)try{await c.onAttempt(e.plan,e)}catch(a){K.error("installBestForCapability: onAttempt hook failed",a)}if(e.installed)return{...e,attempts:j};let f=e.needsEnv?.length?`needs env: ${e.needsEnv.join(", ")}`:e.worksGateRejected?"works-gate rejected (no tools / failed to start)":e.error??"install failed";j.push({name:d,score:a.score,reason:f})}return{installed:!1,attempts:j,error:`No working server found for "${a}" among the top ${k} installable candidate(s).`}}}};
1
+ "use strict";exports.id=4265,exports.ids=[4265],exports.modules={14265:(a,b,c)=>{let d;c.d(b,{LG:()=>T,aM:()=>S,a$:()=>Q,e3:()=>O});var e=c(50846),f=c(8665),g=c(25250),h=c(60453),i=c(92372);let j=(0,e.h)("backend/services/mcp/quality/cache"),k="mcp-quality-cache";class l{constructor(a=Date.now()){this.entries={},this.dirty=!1,this.now=a}async load(){try{let a=await (0,i.loadItem)(k,{entries:{}});this.entries=a?.entries&&"object"==typeof a.entries?a.entries:{}}catch(a){j.warn("Failed to load quality cache; starting empty",a),this.entries={}}}get(a,b){let c=this.entries[`${a}::${b}`];if(c&&!(this.now-c.at>864e5))return c.signal}set(a,b,c){this.entries[`${a}::${b}`]={at:this.now,signal:c},this.dirty=!0}async flush(){let a=!1;for(let[b,c]of Object.entries(this.entries))this.now-c.at>864e5&&(delete this.entries[b],a=!0);if(this.dirty||a)try{await (0,i.VH)(k,{entries:this.entries})}catch(a){j.warn("Failed to persist quality cache",a)}}}function m(a){return!Number.isFinite(a)||a<0?0:a>1?1:a}function n(a,b){return!Number.isFinite(a)||a<=0?0:!Number.isFinite(b)||b<=1?+(a>0):m(Math.log10(a+1)/Math.log10(b+1))}let o=(0,e.h)("backend/services/mcp/quality/providers/githubStars"),p="github",q=new Map;function r(){return d??(process.env.GITHUB_TOKEN||void 0)}function s(a){let b,c=a.server.repository;if(c?.source&&"github"!==c.source.toLowerCase())return null;var d=c?.url;if(!d)return null;try{b=new URL(d.replace(/^git\+/,""))}catch{return null}if(!/(^|\.)github\.com$/i.test(b.hostname))return null;let e=b.pathname.replace(/\.git$/i,"").split("/").filter(Boolean);return e.length<2?null:`${e[0]}/${e[1]}`.toLowerCase()}async function t(a,b){let c=new AbortController,d=()=>c.abort();b.addEventListener("abort",d,{once:!0});let e=setTimeout(()=>c.abort(),6e3);try{return await fetch(`https://api.github.com${a}`,{headers:function(){let a={Accept:"application/vnd.github+json","User-Agent":"FLUJO-mcp-quality","X-GitHub-Api-Version":"2022-11-28"},b=r();return b&&(a.Authorization=`Bearer ${b}`),a}(),signal:c.signal,cache:"no-store"})}catch(b){return o.warn(`GitHub request failed (${a})`,b instanceof Error?b.message:b),null}finally{clearTimeout(e),b.removeEventListener("abort",d)}}function u(a){return(403===a.status||429===a.status)&&"0"===a.headers.get("x-ratelimit-remaining")}let v=(0,e.h)("backend/services/mcp/quality/providers/npmDownloads"),w="npm-downloads",x=new Map;function y(a){for(let b of a.server.packages??[])if("npm"===b.registryType&&b.identifier)return b.identifier;return null}function z(a){return a.startsWith("@")}async function A(a,b){let c=new AbortController,d=()=>c.abort();b.addEventListener("abort",d,{once:!0});let e=setTimeout(()=>c.abort(),6e3);try{return await fetch(`https://api.npmjs.org${a}`,{signal:c.signal,cache:"no-store"})}catch(b){return v.warn(`npm request failed (${a})`,b instanceof Error?b.message:b),null}finally{clearTimeout(e),b.removeEventListener("abort",d)}}let B="registry-status",C=[{id:p,label:"GitHub Stars & Activity",defaultWeight:.5,isApplicable:a=>null!==s(a),cacheKey:a=>s(a),async prefetch(a,b,c){let d=`${a??""} mcp`.trim(),e=`/search/repositories?q=${encodeURIComponent(d)}&sort=stars&order=desc&per_page=50`,f=await t(e,c);if(f&&f.ok)try{for(let a of(await f.json()).items??[])a.full_name&&q.set(a.full_name.toLowerCase(),{stars:"number"==typeof a.stargazers_count?a.stargazers_count:0,pushedAtMs:a.pushed_at?Date.parse(a.pushed_at):null})}catch(a){o.warn("Failed to parse GitHub search response",a)}else if(f&&u(f))return void o.warn("GitHub search rate-limited; ranking will degrade to other providers");if(!r())return;let g=3;for(let a of b){if(g<=0)break;let b=s(a);if(!b||q.has(b))continue;g-=1;let d=await t(`/repos/${b}`,c);if(d){if(u(d))break;if(d.ok)try{let a=await d.json();q.set(b,{stars:"number"==typeof a.stargazers_count?a.stargazers_count:0,pushedAtMs:a.pushed_at?Date.parse(a.pushed_at):null})}catch{}}}},async fetch(a){let b=s(a);if(!b)return null;let c=q.get(b);if(!c)return null;let d=n(c.stars,5e4),e=function(a,b,c=30,d=730){if(!a||!Number.isFinite(a))return 0;let e=(b-a)/864e5;return e<=c?1:e>=d?0:m(1-(e-c)/(d-c))}(c.pushedAtMs,Date.now());return{providerId:p,score:m(.7*d+.3*e),evidence:{repo:b,stars:c.stars,...c.pushedAtMs?{pushedAt:new Date(c.pushedAtMs).toISOString()}:{},starsScore:d,recencyScore:e}}}},{id:w,label:"npm Weekly Downloads",defaultWeight:.35,isApplicable:a=>null!==y(a),cacheKey:a=>y(a),async prefetch(a,b,c){let d=b.map(y).filter(a=>!!a&&!x.has(a)),e=d.filter(a=>!z(a)),f=d.filter(z);for(let a=0;a<e.length;a+=100){let b=e.slice(a,a+100),d=await A(`/downloads/point/last-week/${b.join(",")}`,c);if(d&&d.ok)try{let a=await d.json();if(1===b.length)"number"==typeof a.downloads&&x.set(b[0],a.downloads);else for(let c of b){let b=a[c];x.set(c,b&&"number"==typeof b.downloads?b.downloads:0)}}catch(a){v.warn("Failed to parse npm bulk downloads response",a)}}for(let a of f){let b=await A(`/downloads/point/last-week/${a}`,c);if(b&&b.ok)try{let c=await b.json();"number"==typeof c.downloads&&x.set(a,c.downloads)}catch{}}},async fetch(a){let b=y(a);if(!b)return null;let c=x.get(b);return void 0===c?null:{providerId:w,score:n(c,1e6),evidence:{package:b,weeklyDownloads:c}}}},{id:B,label:"Registry Status",defaultWeight:.15,isApplicable:a=>!0,cacheKey:()=>null,fetch:async a=>({providerId:B,score:+("active"===a.verificationStatus),evidence:{status:a.verificationStatus}})}];var D=c(38844);let E=(0,e.h)("backend/services/mcp/quality/settings");function F(){return{providers:C.map(a=>({id:a.id,enabled:!0,weight:a.defaultWeight})),minScore:0,worksGate:!0}}async function G(){try{let a=await (0,i.loadItem)(D.Z.MCP_QUALITY_SETTINGS,F());return function(a){var b,c;let d=F(),e=a??{},f=new Map;if(Array.isArray(e.providers))for(let a of e.providers)a&&"string"==typeof a.id&&f.set(a.id,a);return{providers:d.providers.map(a=>{let b=f.get(a.id);return{id:a.id,enabled:"boolean"==typeof b?.enabled?b.enabled:a.enabled,weight:"number"==typeof b?.weight&&Number.isFinite(b.weight)&&b.weight>=0?b.weight:a.weight}}),minScore:(b=e.minScore,c=d.minScore,"number"==typeof b&&Number.isFinite(b)?Math.min(1,Math.max(0,b)):c),worksGate:"boolean"==typeof e.worksGate?e.worksGate:d.worksGate,..."string"==typeof e.githubToken&&e.githubToken.length>0?{githubToken:e.githubToken}:{}}}(a)}catch(a){return E.warn("Failed to load mcpQuality settings; using defaults",a),F()}}let H=(0,e.h)("backend/services/mcp/quality/orchestrator");async function I(a,b){let c=new AbortController,d=setTimeout(()=>c.abort(),b);try{return await a(c.signal)}finally{clearTimeout(d)}}async function J(a,b,c={}){let e=c.topN??10;try{var f;let g=c.settings??await G(),h=C.filter(a=>(function(a,b){let c=a.providers.find(a=>a.id===b);return!!c?.enabled})(g,a.id));if(0===h.length)return b.map(a=>({candidate:a,score:0,signals:[]}));d=(f=g.githubToken)&&f.length>0?f:void 0;let i=b.slice(0,e),j=b.slice(e),k=new l(c.now??Date.now());await k.load();let n=i.map(()=>[]);for(let b of h){let c=i.map((a,b)=>({c:a,i:b})).filter(({c:a})=>b.isApplicable(a)),d=[],e=[];for(let a of c){let c=b.cacheKey(a.c);if(c){let d=k.get(b.id,c);if(d){e.push({i:a.i,signal:d});continue}}d.push(a)}if(b.prefetch&&d.length>0)try{await I(c=>b.prefetch(a,d.map(a=>a.c),c),12e3)}catch(a){H.warn(`Provider "${b.id}" prefetch failed; degrading`,a)}for(let{c:a,i:c}of d)try{let d=await I(c=>b.fetch(a,c),2e3);if(d){n[c].push(d);let e=b.cacheKey(a);e&&k.set(b.id,e,d)}}catch(c){H.warn(`Provider "${b.id}" fetch failed for "${a.registryName}"`,c)}for(let{i:a,signal:b}of e)n[a].push(b)}await k.flush();let o=i.map((a,b)=>{let c=n[b],d=new Map(c.map(a=>[a.providerId,a])),e=h.filter(b=>b.isApplicable(a)).map(a=>({providerId:a.id,weight:function(a,b){let c=a.providers.find(a=>a.id===b);return c&&c.enabled?c.weight:0}(g,a.id),score:d.get(a.id)?.score??0})),{score:f}=function(a){let b=0,c=0;for(let d of a){let a=Number.isFinite(d.weight)&&d.weight>0?d.weight:0,e=m(d.score);b+=a,c+=a*e}return{score:b>0?c/b:0,breakdown:a}}(e);return{candidate:a,score:f,signals:c}}).map((a,b)=>({s:a,idx:b})).sort((a,b)=>b.s.score-a.s.score||a.idx-b.idx).map(a=>a.s),p=j.map(a=>({candidate:a,score:0,signals:[]}));return[...o,...p]}catch(a){return H.warn("enrichAndRank failed; returning unranked candidates",a),b.map(a=>({candidate:a,score:0,signals:[]}))}}let K=(0,e.h)("backend/services/mcp/registryInstall"),L="/v0.1/servers";function M(a){return{registryName:a.server.name,server:a.server,verificationStatus:(0,g.vf)(a)}}function N(a){let b=b=>a.signals.find(a=>a.providerId===b)?.evidence,c=b(p),d=b(w),e=b(B);return{score:a.score,..."number"==typeof c?.stars?{stars:c.stars}:{},..."number"==typeof d?.weeklyDownloads?{weeklyDownloads:d.weeklyDownloads}:{},..."string"==typeof e?.status?{status:e.status}:{}}}async function O(a,b=8){let c=await P(a,b);return(await J(a,c.map(M))).map(a=>(function(a,b){let c=(0,g.AH)(a),d=c[0];return{name:a.name,...a.title?{title:a.title}:{},...a.description?{description:a.description}:{},installable:c.length>0,requiredEnv:d?(0,g.jg)(d):[],...b?{quality:N(b)}:{}}})(a.candidate.server,a))}async function P(a,b){let c=new URL(f.jD+L);c.searchParams.set("version","latest"),c.searchParams.set("limit",String(Math.min(Math.max(b,1),30))),a&&c.searchParams.set("search",a);let d=await (0,f.Ws)(c,15e3);return Array.isArray(d?.servers)?d.servers:[]}async function Q(a,b){try{let c=await J(a,b.map(M)),d=new Map(b.map(a=>[a.server.name,a])),e=[];for(let a of c){let b=d.get(a.candidate.server.name);b&&e.push(a.signals.length>0?{...b,quality:N(a)}:b)}return e.length===b.length?e:b}catch{return b}}async function R(a){let b=new URL(f.jD+L);b.searchParams.set("version","latest"),b.searchParams.set("limit","10"),b.searchParams.set("search",a);let c=await (0,f.Ws)(b,15e3),d=Array.isArray(c?.servers)?c.servers:[];return d.find(b=>b.server?.name===a)??d[0]??null}async function S(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A registry server name is required"};try{d=await R(a)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=d?.server??null;if(!e)return{installed:!1,error:`No registry entry found for "${a}"`};let f=(0,g.AH)(e)[0];if(!f)return{installed:!1,error:`"${e.name}" has no install method FLUJO supports (stdio package or HTTP remote)`};let i=(0,g.vf)(d),j=(0,g.O$)(a,e,f,i);if(c?.resolveOnly)return{installed:!1,serverName:j.serverName,plan:j};let k=(0,g.jg)(f,b);if(k.length>0)return{installed:!1,needsEnv:k,plan:j,error:`"${e.name}" requires values for: ${k.join(", ")}`};let l=function(a,b){if(!b?.length)return a;if("stdio"!==a.transport||!Array.isArray(a.args))return{error:"Package argument templates require a stdio registry server"};let c=[...a.args];for(let a of b){if(!Number.isInteger(a.index)||a.index<0||a.index>c.length||a.index<c.length&&!/\$\{global:[A-Za-z0-9_.-]+\}/.test(c[a.index])||!/\$\{global:[A-Za-z0-9_.-]+\}/.test(a.value))return{error:`Invalid package argument template at index ${String(a.index)}; templates may append arguments or replace an existing global-backed argument`};c[a.index]=a.value}return{...a,args:c}}((0,g.cy)((0,g.Yr)(e,f),b),c?.argTemplates);if("error"in l)return{installed:!1,plan:j,error:l.error};let m=l.name,n=await h.mcpService.loadServerConfigs();if(Array.isArray(n)&&n.some(a=>a.name===m)){K.info(`installRegistryServer: "${m}" already configured; reusing`);let{tools:a,error:b}=await h.mcpService.listServerTools(m);return{installed:!0,alreadyExisted:!0,serverName:m,plan:j,tools:(a??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}})),...b?{error:b}:{}}}K.info(`installRegistryServer: installing "${e.name}" as "${m}" (${f.kind})`);let o=await h.mcpService.updateServerConfig(m,l);if(!Array.isArray(o)&&o&&"success"in o&&!1===o.success)return{installed:!1,error:`Saving the server failed: ${o.error??"unknown error"}`};let{tools:p,error:q}=await h.mcpService.listServerTools(m),r=(p??[]).map(a=>({name:a.name,...a.description?{description:a.description}:{}}));if((c?.worksGate??(await G()).worksGate)&&0===r.length){K.warn(`installRegistryServer: "${m}" exposed no tools${q?` (${q})`:""}; rolling back (works-gate)`);try{await h.mcpService.deleteServerConfig(m)}catch(a){K.error(`installRegistryServer: rollback of "${m}" failed`,a)}return{installed:!1,worksGateRejected:!0,serverName:m,plan:j,error:q?`"${e.name}" failed to start: ${q}`:`"${e.name}" connected but exposed no tools — rejected by the works-gate. Try a different server.`}}return{installed:!0,serverName:m,plan:j,tools:r,...q?{error:q}:{}}}async function T(a,b,c){let d;if(!a||"string"!=typeof a)return{installed:!1,error:"A capability search query is required"};try{d=await P(a,10)}catch(a){return{installed:!1,error:`Registry lookup failed: ${a instanceof Error?a.message:String(a)}`}}let e=await J(a,d.map(M)),f=await G(),h=c?.minScore??f.minScore,i=c?.maxAttempts??3,j=[],k=0;for(let a of e){let d=a.candidate.registryName;if(a.score<h){j.push({name:d,score:a.score,reason:`below minScore ${h}`});break}if(0===(0,g.AH)(a.candidate.server).length){j.push({name:d,score:a.score,reason:"no supported install method"});continue}if(k>=i)break;k+=1;let e=await S(d,b,{worksGate:!0});if(c?.onAttempt)try{await c.onAttempt(e.plan,e)}catch(a){K.error("installBestForCapability: onAttempt hook failed",a)}if(e.installed)return{...e,attempts:j};let f=e.needsEnv?.length?`needs env: ${e.needsEnv.join(", ")}`:e.worksGateRejected?"works-gate rejected (no tools / failed to start)":e.error??"install failed";j.push({name:d,score:a.score,reason:f})}return{installed:!1,attempts:j,error:`No working server found for "${a}" among the top ${k} installable candidate(s).`}}}};