flujo-ai 3.22.0 → 3.23.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 (241) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +133 -133
  3. package/.next/app-path-routes-manifest.json +6 -6
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/server/app/_not-found/page.js +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_not-found.html +1 -1
  10. package/.next/server/app/_not-found.rsc +1 -1
  11. package/.next/server/app/api/approvals/[id]/route.js +1 -1
  12. package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
  13. package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/approvals/route.js.nft.json +1 -1
  15. package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/backup/route.js +1 -1
  17. package/.next/server/app/api/backup/route.js.nft.json +1 -1
  18. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/browse/route.js +1 -1
  20. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
  22. package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/cwd/route.js +1 -1
  24. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
  26. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
  29. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
  31. package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
  33. package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
  35. package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
  37. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
  39. package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
  41. package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/flow/route.js.nft.json +1 -1
  43. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/git/route.js +5 -5
  45. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/init/route.js.nft.json +1 -1
  47. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
  52. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
  54. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
  56. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
  58. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
  60. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
  62. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
  64. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
  66. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
  68. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
  70. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/mcp/test-connection/route.js +1 -1
  72. package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
  73. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
  75. package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
  76. package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
  78. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
  83. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/model/route.js.nft.json +1 -1
  85. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/model/test/route.js.nft.json +1 -1
  87. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
  91. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
  93. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
  95. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
  97. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
  100. package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
  102. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/restore/route.js +1 -1
  104. package/.next/server/app/api/restore/route.js.nft.json +1 -1
  105. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
  107. package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/update/route.js +1 -1
  110. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/waves/route.js.nft.json +1 -1
  112. package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/webhooks/[id]/route.js +1 -1
  114. package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
  115. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/chat/page.js +8 -8
  117. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  118. package/.next/server/app/chat.html +1 -1
  119. package/.next/server/app/chat.rsc +2 -2
  120. package/.next/server/app/docs/page.js +8 -2
  121. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/docs.html +1 -1
  123. package/.next/server/app/docs.rsc +2 -2
  124. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  125. package/.next/server/app/executions.html +1 -1
  126. package/.next/server/app/executions.rsc +2 -2
  127. package/.next/server/app/flows/page.js +3 -3
  128. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  129. package/.next/server/app/flows.html +1 -1
  130. package/.next/server/app/flows.rsc +2 -2
  131. package/.next/server/app/index.html +1 -1
  132. package/.next/server/app/index.rsc +2 -2
  133. package/.next/server/app/mcp/page.js +5 -5
  134. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/mcp-flows/route.js +1 -1
  136. package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
  137. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  139. package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
  140. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/mcp.html +1 -1
  142. package/.next/server/app/mcp.rsc +2 -2
  143. package/.next/server/app/models/page.js +1 -1
  144. package/.next/server/app/models/page.js.nft.json +1 -1
  145. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  146. package/.next/server/app/page.js +1 -1
  147. package/.next/server/app/page_client-reference-manifest.js +1 -1
  148. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  149. package/.next/server/app/settings.html +1 -1
  150. package/.next/server/app/settings.rsc +2 -2
  151. package/.next/server/app/v1/chat/completions/route.js +1 -1
  152. package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
  153. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
  155. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
  157. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
  159. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
  160. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
  162. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
  163. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
  165. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +2 -2
  167. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
  168. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
  171. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
  172. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
  174. package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
  175. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
  177. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/v1/models/route.js.nft.json +1 -1
  179. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/waves/page.js +1 -1
  181. package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/waves.html +1 -1
  183. package/.next/server/app/waves.rsc +1 -1
  184. package/.next/server/app-paths-manifest.json +6 -6
  185. package/.next/server/chunks/1083.js +1 -1
  186. package/.next/server/chunks/1197.js +1 -1
  187. package/.next/server/chunks/1226.js +1 -1
  188. package/.next/server/chunks/1373.js +1 -1
  189. package/.next/server/chunks/264.js +2 -2
  190. package/.next/server/chunks/2823.js +6 -0
  191. package/.next/server/chunks/2859.js +1 -1
  192. package/.next/server/chunks/289.js +1 -1
  193. package/.next/server/chunks/3774.js +1 -1
  194. package/.next/server/chunks/3823.js +4 -4
  195. package/.next/server/chunks/3984.js +4 -4
  196. package/.next/server/chunks/4239.js +1 -1
  197. package/.next/server/chunks/4561.js +4 -4
  198. package/.next/server/chunks/4637.js +8 -2
  199. package/.next/server/chunks/4671.js +1 -1
  200. package/.next/server/chunks/472.js +1 -1
  201. package/.next/server/chunks/4771.js +2 -2
  202. package/.next/server/chunks/5708.js +7 -1
  203. package/.next/server/chunks/5734.js +4 -4
  204. package/.next/server/chunks/6996.js +3 -3
  205. package/.next/server/chunks/701.js +1 -1
  206. package/.next/server/chunks/7362.js +8 -8
  207. package/.next/server/chunks/7506.js +1 -1
  208. package/.next/server/chunks/7769.js +6 -0
  209. package/.next/server/chunks/8739.js +1 -1
  210. package/.next/server/chunks/9509.js +2 -2
  211. package/.next/server/functions-config-manifest.json +2 -2
  212. package/.next/server/instrumentation.js.nft.json +1 -1
  213. package/.next/server/middleware-build-manifest.js +1 -1
  214. package/.next/server/middleware-react-loadable-manifest.js +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/6016.8201fa15ab6aa90e.js +1 -0
  220. package/.next/static/chunks/{7583.7cb88044a5212b29.js → 7583.7af90b94e3c263f2.js} +1 -1
  221. package/.next/static/chunks/812-624e93f4c0f671c7.js +1 -0
  222. package/.next/static/chunks/{9164-3d34bf7eab100ac7.js → 9164-d9f1abba780231e0.js} +1 -1
  223. package/.next/static/chunks/app/chat/page-ea6752144d35c892.js +1 -0
  224. package/.next/static/chunks/app/docs/page-935b0386917b91bb.js +1 -0
  225. package/.next/static/chunks/app/executions/page-d72027b0179e8fa2.js +1 -0
  226. package/.next/static/chunks/app/flows/page-1844e86dd43fa285.js +1 -0
  227. package/.next/static/chunks/app/mcp/{page-770a870b3d40766b.js → page-b6866f49f76a6801.js} +1 -1
  228. package/.next/static/chunks/{webpack-dded92b3d7b33173.js → webpack-f4a471ab560eb19e.js} +1 -1
  229. package/.next/trace +8 -9
  230. package/README.md +1 -1
  231. package/package.json +1 -1
  232. package/.next/server/chunks/7214.js +0 -6
  233. package/.next/server/chunks/7463.js +0 -6
  234. package/.next/static/chunks/6016.a157e5bde2faa652.js +0 -1
  235. package/.next/static/chunks/812-181496bc32cd0cd3.js +0 -1
  236. package/.next/static/chunks/app/chat/page-3a3efba25b59a747.js +0 -1
  237. package/.next/static/chunks/app/docs/page-84a92c3d5d8d5e13.js +0 -1
  238. package/.next/static/chunks/app/executions/page-445afbf37819e3ce.js +0 -1
  239. package/.next/static/chunks/app/flows/page-74ebca19957cc6db.js +0 -1
  240. /package/.next/static/{MMmWHUQ3UAJBdRB7G1zGj → WRUzIBdypUJvv0xAct8qc}/_buildManifest.js +0 -0
  241. /package/.next/static/{MMmWHUQ3UAJBdRB7G1zGj → WRUzIBdypUJvv0xAct8qc}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -37,7 +37,7 @@ For *anything* that you struggle with (MCP Installation, Application Issues, Usa
37
37
  # FLUJO
38
38
 
39
39
  [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
40
- [![Version](https://img.shields.io/badge/version-3.22.0-green.svg)](package.json)
40
+ [![Version](https://img.shields.io/badge/version-3.23.0-green.svg)](package.json)
41
41
 
42
42
  FLUJO is an open-source, local-first platform for building **MCP-powered AI workflows**. It brings together model management, Model-Context-Protocol (MCP) servers, a visual flow builder, and a chat interface in one app — so you can wire models and tools together, run them headlessly on triggers, and expose the result to other apps, without giving up control of your keys and data.
43
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flujo-ai",
3
- "version": "3.22.0",
3
+ "version": "3.23.0",
4
4
  "bin": {
5
5
  "flujo": "bin/flujo.mjs"
6
6
  },
@@ -1,6 +0,0 @@
1
- "use strict";exports.id=7214,exports.ids=[7214],exports.modules={38291:(a,b,c)=>{c.d(b,{n:()=>g});var d=c(92372),e=c(75028);let f=(0,c(50846).h)("backend/execution/flow/persistConversationState");async function g(a,b){let c="conversations/",g=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,d.ln)(g),null!=b.conversationId&&(0,d.ln)(b.conversationId),b.ephemeral)?(f.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,e.isConversationDeleted)(b.conversationId)?(f.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,d.VH)(a,{...b,executionTrace:void 0,emit:void 0})}},44681:(a,b,c)=>{c.d(b,{Q:()=>j,validateFlowForRun:()=>k});var d=c(50846),e=c(87821),f=c(20433),g=c(61397),h=c(84671);let i=(0,d.h)("backend/execution/flow/validateFlowForRun");async function j(a){let b,c;try{b=await f.modelService.loadModels()}catch(a){i.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await g.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){i.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,h.nC)(a,{models:b,servers:c})}async function k(a){let b=await e.flowService.getFlow(a);return b?j(b):(i.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}},57214:(a,b,c)=>{c.d(b,{runFlow:()=>w});var d=c(50846),e=c(23823),f=c(38291),g=c(60184),h=c(14214),i=c(56793),j=c(99978),k=c(32642),l=c(75312),m=c(87821),n=c(92372),o=c(13516),p=c(44681),q=c(67490),r=c(75028);let s=(0,d.h)("backend/execution/flow/runFlow");m.flowService.getFlowByName||(m.flowService.getFlowByName=async a=>(await m.flowService.loadFlows()).find(b=>b.name===a)||null,s.info("Added getFlowByName method directly to flowService instance."));let t=m.flowService,u=f.n;async function v(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await m.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,i.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){s.warn("Failed to publish runFlow flow-run event:",a)}}async function w(a){let b,c,d,f=Date.now(),i=a.flujo??!0,m=a.requireApproval??!1,w=a.debug??!1,x=a.continueDebug??!1,y=a.userTurn??!1,z="ephemeral"===a.mode,A=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),B={model:a.modelName,messages:A,processNodeId:a.processNodeId};s.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:A.length,mode:z?"ephemeral":"conversation",flujo:i,requireApproval:m,flujodebug:w,conversationId:a.conversationId});let C=a.conversationId||crypto.randomUUID(),D=`conversations/${C}`,E="new";if(s.info(`Effective Conversation ID for this run: ${C}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(C))c=e.FlowExecutor.conversationStates.get(C),s.info(`Resuming conversation ${C} from memory`,{currentNodeId:c.currentNodeId}),E="memory";else if(!z)try{(c=await (0,n.YM)(D,void 0))?(s.info(`Loaded conversation state from storage: ${C}`),E="storage",await (0,g.jM)(c),e.FlowExecutor.conversationStates.set(C,c)):s.info(`No state found in storage for conversation: ${C}. Will create new state.`)}catch(a){s.warn(`Error loading conversation state from storage for ${C}:`,a)}if(c?((b=c).conversationId!==C&&(s.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${C}). Using effectiveConvId.`),b.conversationId=C),"new"!==E&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(s.info(`Resuming completed/errored/fresh conversation ${C}. Resetting status to 'running'.`),b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===E&&e.FlowExecutor.conversationStates.set(C,b)),B.processNodeId&&"new"!==E&&(s.info(`Edit detected: Resetting currentNodeId for conversation ${C} to provided processNodeId: ${B.processNodeId}`),b.currentNodeId=B.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},o.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(C,b),s.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(s.info(`Creating new conversation state object for ID: ${C}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(o.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:C,currentNodeId:void 0,status:"running",title:"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:w,executionTrace:w&&o.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=m,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),z&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId),b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>q.A)return s.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${q.A}`),b.status="error",{status:"error",conversationId:C,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${q.A}) exceeded`,statusCode:500},finalAction:j.O,sharedState:b};let F=[...b.messages??[]];if("new"===E){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&B.model){let a=B.model.substring(5),d=await t.getFlowByName(a);if(!d)return s.error(`Flow not found: ${a}`),{status:"error",conversationId:C,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:j.O,sharedState:b};c=d.id}if(!c)return s.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:C,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:j.O,sharedState:b};b.flowId=c;let d=(B.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",s.verbose(`Updated conversation title for ${C} during init to: ${b.title}`))}await u(D,b),s.debug(`Saved initial state for new conversation ${C}.`)}catch(a){s.error(`Failed to save initial state for new conversation ${C}:`,a)}e.FlowExecutor.conversationStates.set(C,b)}else B.messages&&B.messages.length>0&&(b.messages=B.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),s.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(y||void 0===b.debugMode)&&(b.debugMode=w),y&&(b.debugPendingToolCalls=void 0),b.debugMode&&o.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,g.UG)(b,F)}catch(a){s.warn(`Conversation-log reconcile failed for ${C}; continuing`,a)}if(y&&"new"!==E&&!B.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(s.info(`New user turn for ${C}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(C,b))}y&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),s.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${C}.`));let G=!1,H=0,I=a.emit??h.$.emitterFor(C),J=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),K=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.usage.cacheReadTokens??0;d&&(c.cacheReadTokens=(c.cacheReadTokens??0)+d);let e=a.processNodeId||"unknown",f=c.byNode[e]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};f.promptTokens+=a.usage.promptTokens,f.completionTokens+=a.usage.completionTokens,f.totalTokens+=a.usage.totalTokens,d&&(f.cacheReadTokens=(f.cacheReadTokens??0)+d),c.byNode[e]=f,b.usage=c,I({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0,...d?{cacheReadTokens:d}:{}})},L=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),J.has(a.id)||(J.add(a.id),"system"!==a.role&&(I({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),K(a)))};if(I({type:"run:start",flowId:b.flowId}),(y||"new"===E)&&b.flowId)try{let a=b.flowSnapshot?await (0,p.Q)(b.flowSnapshot):await (0,p.validateFlowForRun)(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
2
- `+c.map(a=>`• ${a.message}`).join("\n");s.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${C}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=j.O,G=!0}}catch(a){s.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let M=()=>!!b.isCancelled||!!(0,r.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),N=!!b.debugMode&&!x,O=()=>{b.status="paused_debug",I({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!G)for(;;){if(H++,s.debug(`--- Starting Execution Step ${H} for Conv ${C} ---`),H>150){s.warn(`Max internal iterations (150) reached for conv ${C}. Breaking loop.`),d!==j.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=j.O);break}if(M()){s.info(`Cancellation flag detected for conv ${C}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=j.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,s.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${C}.`);let c=await k.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:I,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:M});if(!c.success){s.error(`Debug tool processing failed for conv ${C}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=j.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(C,b),L();try{b.updatedAt=Date.now(),await u(D,b)}catch(a){s.error(`Failed to save state after debug tool execution for conv ${C}:`,a)}if(N){s.info(`[Debug Step] Paused after tool execution for conv ${C}.`),O();break}continue}if(!N&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b);if(a&&b.breakpoints.includes(a)&&b.lastBreakNodeId!==a){s.info(`Breakpoint hit at node ${a} for conv ${C}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,I({type:"breakpoint:hit",node:{nodeId:a}}),I({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await u(D,b)}catch(a){s.error(`Failed to save state on breakpoint for conv ${C}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);s.verbose(`Message history before step ${H}`,a)}else s.verbose(`No messages in history before step ${H}`);let a=await e.FlowExecutor.executeStep(b,I);if(b=a.sharedState,d=a.action,L(),b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",s.verbose(`Updated conversation title for ${C} after step ${H} to: ${b.title}`))}if(s.info(`Step ${H} completed for conv ${C}. Action: ${d}`,{currentNodeId:b.currentNodeId}),s.verbose(`Shared state after step ${H}`,b),s.debug(`[Action Handling] Step ${H}: Received action "${d}" for conv ${C}`),d===j.O){s.info(`[Action Handling] Step ${H}: Handling ERROR_ACTION for conv ${C}`),s.error(`Error action received during step ${H} for conv ${C}`,{error:b.lastResponse});break}if(d===j.g4){s.info(`[Action Handling] Step ${H}: Handling FINAL_RESPONSE_ACTION for conv ${C}`),s.info(`Final response action received at step ${H} for conv ${C}`),b.status="completed",s.info(`Setting conversation status to 'completed' for conv ${C}`);break}if(d===j.Jp){s.info(`[Action Handling] Step ${H}: Handling TOOL_CALL_ACTION for conv ${C}`),s.info(`Tool call action received at step ${H} for conv ${C}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(i){if(m&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";s.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${C})`),b.status="error",b.pendingToolCalls=a.tool_calls,b.lastResponse={success:!1,error:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,errorDetails:{message:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,type:"approval_required",name:e}},d=j.O;break}if(m){s.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${C}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(C,b);try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",s.verbose(`Updated conversation title for ${C} before pausing to: ${b.title}`))}await u(D,b),s.verbose(`Saved state before pausing for approval for conv ${C}`)}catch(a){s.error(`Failed to save state before pausing for approval for conv ${C}:`,a)}I({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if(N){s.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${C}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(C,b);try{b.updatedAt=Date.now(),await u(D,b)}catch(a){s.error(`Failed to save state before debug tool pause for conv ${C}:`,a)}O();break}{s.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${C}`);let c=await k.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:I,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:M});if(!c.success){s.error(`Internal tool processing failed for conv ${C}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=j.O;break}s.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${C}`);let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(C,b),L(),s.info(`Continuing loop for conv ${C} after internal tool processing (no approval needed).`);continue}}else{s.info(`[flujo=false] Tool call action received for conv ${C}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,l.$9)(a.function.name,b.toolNameMap)?(s.verbose("tool is internal:",a.function.name),f.push(a)):(s.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){s.info(`[flujo=false] Processing ${f.length} internal tools for conv ${C}. External tools (${g.length}) will be ignored this step.`);let a=await k.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:I,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:M});if(!a.success){s.error(`[flujo=false] Internal tool processing failed for conv ${C}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=j.O;break}s.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${C}`);let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),e.FlowExecutor.conversationStates.set(C,b),s.info(`Continuing loop for conv ${C} after internal tool processing (flujo=false).`);continue}if(g.length>0){s.info(`[flujo=false] Found ${g.length} external tools for conv ${C}. Wrapping in XML and returning.`);let a=[];for(let b of g)if("function"===b.type)try{let c=JSON.parse(b.function.arguments||"{}"),d="";for(let a in c){let b=String(c[a]).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;");d+=`
3
- <${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
4
- </${b.function.name}>`)}catch(c){s.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:C}),a.push(`<${b.function.name}>
5
- <error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
6
- </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=j.g4,s.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${C}.`);break}s.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${C} but no tools found after classification. Treating as final.`),d=j.g4;break}s.warn(`TOOL_CALL_ACTION received for conv ${C} but no tool_calls found in last message. Treating as final.`),d=j.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){s.info(`[Action Handling] Step ${H}: Handling Handoff Action (Edge ID) for conv ${C}`),s.info(`Handoff action received for conv ${C}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){if(c=e.id,s.debug(`Found handoff tool call ID: ${c} for edge ${d}`),"function"===e.type)try{let c=JSON.parse(e.function.arguments||"{}"),d="string"==typeof c?.prompt?c.prompt.trim():"";d&&(b.handoffInput={targetNodeId:a,prompt:d},s.info(`Captured caller prompt for handoff to node ${a} (${d.length} chars)`))}catch(a){s.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller prompt`,{parseError:a})}let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),s.info(`Appended tool result message for handoff tool call ${c}`)}else s.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else s.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);L();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,I({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),s.info(`Transitioning conv ${C} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(C,b),N){s.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${C}.`),O();break}s.info(`Continuing loop for conv ${C} after handoff.`);continue}s.error(`Handoff failed for conv ${C}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=j.O;break}if(d===j.E5){s.info(`[Action Handling] Step ${H}: Handling STAY_ON_NODE_ACTION for conv ${C}`),s.info(`Stay on node action received for conv ${C} at step ${H}`);break}s.warn(`Unrecognized action '${d}' received at step ${H} for conv ${C}. Treating as final response.`),d=j.g4;break}}catch(a){if(s.error(`Unhandled error during execution loop for conv ${C}`,{loopError:a}),d!==j.O&&M()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=j.O),d!==j.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=j.O}}d!==j.O&&M()&&(s.info(`Cancellation flag set at run end for conv ${C}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=j.O),d===j.O&&"error"!==b.status&&(b.status="error");let P=Date.now()-f,Q=b.status||(d===j.g4?"completed":d===j.O?"error":"running");if(s.info(`Execution finished for conv ${C}. Final Action: ${d}, Final Status: ${Q}`,{duration:`${P}ms`}),L(),("completed"===Q||"error"===Q)&&(I({type:"run:done",status:Q}),"schedule"!==b.source&&(b.runDepth??0)===0)){let a=b.messages[b.messages.length-1],c=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:void 0;v(b,Q,c)}try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",s.verbose(`Updated conversation title for ${C} before final return to: ${b.title}`))}await u(D,b),s.debug(`Saved final state for conversation ${C} before returning.`)}catch(a){s.error(`Failed to save final state for conversation ${C}:`,a)}(0,r.isConversationDeleted)(C)?e.FlowExecutor.conversationStates.delete(C):e.FlowExecutor.conversationStates.set(C,b);let R=()=>{z&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(C)},S={conversationId:b.conversationId||C,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return s.info(`Returning paused debug state for conv ${C}`),{...S,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===j.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},s.error(`Returning error result for conv ${C}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),R(),{...S,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let T=b.messages.length>0?b.messages[b.messages.length-1]:null,U="",V="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(V=b.lastResponse._flujo_xml_tools,U=T?.role==="assistant"&&"string"==typeof T.content?T.content:"",U+=(U?"\n\n":"")+V,b.lastResponse=U):U="string"==typeof b.lastResponse?b.lastResponse:T?.role==="assistant"&&"string"==typeof T.content?T.content:d!==j.Jp||i?"Processing complete.":"";let W=V?void 0:T?.role==="assistant"?T.tool_calls:void 0;return s.info(`Returning success result for conv ${C}`,{action:d,status:b.status,flujo:i,requireApproval:m,flujodebug:w}),R(),{...S,status:b.status||(d===j.g4?"completed":"running"),outputText:U,toolCalls:W,pendingToolCalls:b.pendingToolCalls}}}};
@@ -1,6 +0,0 @@
1
- "use strict";exports.id=7463,exports.ids=[7463],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>m});var d=c(8336),e=c(78606),f=c(27386),g=c(33132);function h(a){return a.data?.type??a.type??"unknown"}function i(a){return a.data?.label||a.id}function j(a){return a.data?.edgeType==="mcp"}function k(a){return a.data?.edgeType==="resource"}function l(a){return j(a)||k(a)}function m(a,b={}){let c=[],n=Array.isArray(a?.nodes)?a.nodes:[],o=Array.isArray(a?.edges)?a.edges:[],p=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?i(e):void 0}),q=new Map((b.models??[]).map(a=>[a.id,a])),r=new Map((b.servers??[]).map(a=>[a.name,a])),s=!!b.models,t=!!b.servers,u=n.filter(a=>"start"===h(a)),v=n.filter(a=>"finish"===h(a)),w=n.filter(a=>"process"===h(a)),x=n.filter(a=>"mcp"===h(a));if(0===u.length)p("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(u.length>1)for(let a of u.slice(1))p("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===v.length&&p("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),w)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(s&&!q.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";p("error","process-model-missing",`Process node "${i(a)}" is bound to a model that no longer exists${c}.`,a)}}else p("error","process-missing-model",`Process node "${i(a)}" has no model bound.`,a)}for(let a of x){let b=(a.data?.properties??{}).boundServer;if(b){if(t&&!r.has(b))p("warning","mcp-server-missing",`MCP node "${i(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(t){let c=r.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;p("warning","mcp-server-disconnected",`MCP node "${i(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else p("warning","mcp-missing-server",`MCP node "${i(a)}" is not bound to a server.`,a);o.some(b=>j(b)&&(b.source===a.id||b.target===a.id))||p("warning","mcp-node-unconnected",`MCP node "${i(a)}" is not connected to any Process node.`,a)}for(let a of n.filter(a=>"resource"===h(a))){let b=a.data?.properties??{},c="run"===b.scope?"run":"mcp",d="string"==typeof b.boundServer?b.boundServer:"",e="string"==typeof b.uri?b.uri:"",g="string"==typeof b.runName?b.runName.trim():"";"mcp"!==c||d&&e||p("warning","resource-missing-binding",`Resource node "${i(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||g||p("warning","resource-missing-binding",`Resource node "${i(a)}" is a run artifact with no name; give it a name so steps can produce/consume it.`,a),"run"===c&&g&&!(0,f.qW)(g)&&p("warning","resource-run-name",`Resource node "${i(a)}" is named "${g}", which is not a valid artifact name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${res:...}.`,a),"mcp"===c&&d&&t&&!r.has(d)&&p("warning","resource-server-missing",`Resource node "${i(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=o.filter(b=>k(b)&&(b.source===a.id||b.target===a.id));0===h.length&&p("warning","resource-node-unconnected",`Resource node "${i(a)}" is not connected to any Process node.`,a);let j=h.filter(b=>b.target===a.id);"mcp"===c&&j.length>0&&p("error","resource-produce-static",`Resource node "${i(a)}" is a static MCP resource, but a step writes INTO it. Only run artifacts (scope "run") can be produced by a step — flip the edge or make this a run artifact.`,a),"run"===c&&j.length>1&&p("warning","resource-multiple-producers",`Resource node "${i(a)}" is produced by ${j.length} steps; the last writer wins. Consider one producer per artifact.`,a),"run"===c&&0===j.length&&h.length>0&&p("warning","resource-consumed-never-produced",`Resource node "${i(a)}" is consumed but no step in this flow produces it; it resolves to nothing unless an earlier run captured it.`,a)}for(let a of n.filter(a=>"signal"===h(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||p("warning","signal-missing-topic",`Signal node "${i(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(u.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!l(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(o);for(let b of u)a.get(b.id)?.length||p("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(u.map(a=>a.id),a);for(let a of[...w,...v])b.has(a.id)||p("warning","unreachable-node",`${"finish"===h(a)?"Finish":"Process"} node "${i(a)}" is not reachable from the Start node.`,a)}for(let a of n.filter(a=>"subflow"===h(a))){let b=o.filter(b=>!l(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&p("error","subflow-multiple-outgoing",`Subflow node "${i(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a);let c=a.data?.properties??{},d="string"==typeof c.subflowId&&c.subflowId?c.subflowId:void 0,e=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&e.length>0&&p("error","subflow-both-targets",`Subflow node "${i(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let g=!0===c.mapOverList;g&&e.length>0&&p("error","subflow-map-and-parallel",`Subflow node "${i(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),g&&!d&&0===e.length&&p("error","subflow-map-no-child",`Subflow node "${i(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let h="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(h&&((0,f.qW)(h)||p("warning","subflow-parallel-var-name",`Subflow node "${i(a)}" reads dynamic fan-out targets from "${h}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to capture with \${var:...}.`,a),g&&p("error","subflow-map-and-parallel-var",`Subflow node "${i(a)}" combines "mapOverList" with dynamic fan-out ("parallelSubflowIdsVar"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),n.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===h})||p("warning","subflow-parallel-var-uncaptured",`Subflow node "${i(a)}" reads dynamic fan-out targets from variable "${h}", but no node captures it (captureVariable). It may be seeded by the caller; otherwise it resolves to no targets and the node falls back to its static parallel list.`,a)),e.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&p("warning","subflow-concurrency-limit",`Subflow node "${i(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(n.map(a=>[a.id,a])),b=new Set;for(let c of o){if(l(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let f=a.get(c.source),g=f?h(f):"unknown";if("process"!==g){p("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${f?i(f):c.source}" has a routing condition, but only process nodes can route on a condition.`,f??void 0);continue}b.add(c.source),(0,e.C)(d.kind)?"always"===d.kind||("string"!=typeof d.value||0===d.value.length?p("warning","edge-condition-value",`Process node "${i(f)}" has an outgoing edge condition with no "value"; it will never match.`,f):"regex"!==d.kind||(0,e.wM)(d.value)||p("warning","edge-condition-regex",`Process node "${i(f)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,f)):p("warning","edge-condition-kind",`Process node "${i(f)}" has an outgoing edge whose condition kind "${String(d.kind)}" is unknown; it will never match.`,f)}for(let c of b){let b=a.get(c);b&&(o.some(a=>!l(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||p("warning","edge-condition-no-fallback",`Process node "${i(b)}" has conditioned outgoing edges but no bare fallback edge; if no condition matches, the flow ends here.`,b))}}{let a=new Set;for(let b of n){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,f.qW)(d)||p("warning","capture-var-name",`${"subflow"===h(b)?"Subflow":"Process"} node "${i(b)}" captures into "${d}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${var:...}.`,b)}}let b=["promptTemplate","isolatedPrompt"],c=new Set;for(let d of n){let e=d.data?.properties??{};for(let g of b){let b=e[g];if("string"==typeof b&&b)for(let e of(0,f.T9)(b)){if(a.has(e))continue;let b=`${d.id}:${e}`;c.has(b)||(c.add(b),p("warning","var-ref-uncaptured",`${i(d)} references \${var:${e}} but no step in this flow captures "${e}" (via captureVariable). It resolves to empty unless supplied as a run input — check for a typo or a step ordered after this one.`,d))}}}}{for(let a of n){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,g.g2)(b.trim());(0,g.ng)(c)||p("warning","capture-kv-name",`${"subflow"===h(a)?"Subflow":"Process"} node "${i(a)}" captures into kv "${b.trim()}", whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${kv:...}.`,a)}}let a=["promptTemplate","isolatedPrompt"],b=new Set;for(let c of n){let d=c.data?.properties??{};for(let e of a){let a=d[e];if("string"==typeof a&&a)for(let d of(0,g.pf)(a)){let{key:a}=(0,g.g2)(d);if((0,g.ng)(a))continue;let e=`${c.id}:${d}`;b.has(e)||(b.add(e),p("warning","kv-ref-name",`${i(c)} references \${kv:${d}}, whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it resolves to empty.`,c))}}}}for(let a of w){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let e=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!j(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==h(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}(a.id,n,o),f=new Set;for(let g of(0,d.A$)(c)){if("handoff"===g.server)continue;let c=`${g.kind}:${g.server}:${g.name}`;!f.has(c)&&(f.add(c),e.has(g.server)?"tool"===g.kind&&b.serverTools&&b.serverTools[g.server]&&!b.serverTools[g.server].includes(g.name)&&p("warning","tool-unavailable",`Process node "${i(a)}" references tool "${g.name}" which server "${g.server}" no longer provides.`,a):p("error","tool-pill-disconnected",`Process node "${i(a)}" references ${g.kind} "${g.name}" from server "${g.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let y=c.filter(a=>"error"===a.severity).length,z=c.length-y;return{issues:c,errorCount:y,warningCount:z,isRunnable:0===y}}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>B});var d=c(18230),e=c(44561),f=c(79111),g=c(44479);let h=(0,d.h)("backend/execution/flow/persistConversationState");async function i(a,b){let c="conversations/",d=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,f.ln)(d),null!=b.conversationId&&(0,f.ln)(b.conversationId),b.ephemeral)?(h.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,g.isConversationDeleted)(b.conversationId)?(h.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})}var j=c(34115),k=c(96249),l=c(37860),m=c(26485),n=c(80808),o=c(59448),p=c(11659),q=c(86028),r=c(12763),s=c(82464),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c;try{b=await r.modelService.loadModels()}catch(a){u.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await s.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){u.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,t.nC)(a,{models:b,servers:c})}async function w(a){let b=await p.flowService.getFlow(a);return b?v(b):(u.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var x=c(85701);let y=(0,d.h)("backend/execution/flow/runFlow");p.flowService.getFlowByName||(p.flowService.getFlowByName=async a=>(await p.flowService.loadFlows()).find(b=>b.name===a)||null,y.info("Added getFlowByName method directly to flowService instance."));let z=p.flowService;async function A(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await p.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,l.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){y.warn("Failed to publish runFlow flow-run event:",a)}}async function B(a){let b,c,d,h=Date.now(),l=a.flujo??!0,p=a.requireApproval??!1,r=a.debug??!1,s=a.continueDebug??!1,t=a.userTurn??!1,u="ephemeral"===a.mode,B=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),C={model:a.modelName,messages:B,processNodeId:a.processNodeId};y.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:B.length,mode:u?"ephemeral":"conversation",flujo:l,requireApproval:p,flujodebug:r,conversationId:a.conversationId});let D=a.conversationId||crypto.randomUUID(),E=`conversations/${D}`,F="new";if(y.info(`Effective Conversation ID for this run: ${D}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(D))c=e.FlowExecutor.conversationStates.get(D),y.info(`Resuming conversation ${D} from memory`,{currentNodeId:c.currentNodeId}),F="memory";else if(!u)try{(c=await (0,f.YM)(E,void 0))?(y.info(`Loaded conversation state from storage: ${D}`),F="storage",await (0,j.jM)(c),e.FlowExecutor.conversationStates.set(D,c)):y.info(`No state found in storage for conversation: ${D}. Will create new state.`)}catch(a){y.warn(`Error loading conversation state from storage for ${D}:`,a)}if(c?((b=c).conversationId!==D&&(y.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${D}). Using effectiveConvId.`),b.conversationId=D),"new"!==F&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(y.info(`Resuming completed/errored/fresh conversation ${D}. Resetting status to 'running'.`),b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===F&&e.FlowExecutor.conversationStates.set(D,b)),C.processNodeId&&"new"!==F&&(y.info(`Edit detected: Resetting currentNodeId for conversation ${D} to provided processNodeId: ${C.processNodeId}`),b.currentNodeId=C.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},q.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(D,b),y.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(y.info(`Creating new conversation state object for ID: ${D}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:D,currentNodeId:void 0,status:"running",title:"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:r,executionTrace:r&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=p,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),u&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId),b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>x.A)return y.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:D,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:m.O,sharedState:b};let G=[...b.messages??[]];if("new"===F){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&C.model){let a=C.model.substring(5),d=await z.getFlowByName(a);if(!d)return y.error(`Flow not found: ${a}`),{status:"error",conversationId:D,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:m.O,sharedState:b};c=d.id}if(!c)return y.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:D,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:m.O,sharedState:b};b.flowId=c;let d=(C.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",y.verbose(`Updated conversation title for ${D} during init to: ${b.title}`))}await i(E,b),y.debug(`Saved initial state for new conversation ${D}.`)}catch(a){y.error(`Failed to save initial state for new conversation ${D}:`,a)}e.FlowExecutor.conversationStates.set(D,b)}else C.messages&&C.messages.length>0&&(b.messages=C.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),y.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(t||void 0===b.debugMode)&&(b.debugMode=r),t&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,j.UG)(b,G)}catch(a){y.warn(`Conversation-log reconcile failed for ${D}; continuing`,a)}if(t&&"new"!==F&&!C.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(y.info(`New user turn for ${D}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(D,b))}t&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),y.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${D}.`));let H=!1,I=0,J=a.emit??k.$.emitterFor(D),K=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),L=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.usage.cacheReadTokens??0;d&&(c.cacheReadTokens=(c.cacheReadTokens??0)+d);let e=a.processNodeId||"unknown",f=c.byNode[e]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};f.promptTokens+=a.usage.promptTokens,f.completionTokens+=a.usage.completionTokens,f.totalTokens+=a.usage.totalTokens,d&&(f.cacheReadTokens=(f.cacheReadTokens??0)+d),c.byNode[e]=f,b.usage=c,J({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0,...d?{cacheReadTokens:d}:{}})},M=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),K.has(a.id)||(K.add(a.id),"system"!==a.role&&(J({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),L(a)))};if(J({type:"run:start",flowId:b.flowId}),(t||"new"===F)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
2
- `+c.map(a=>`• ${a.message}`).join("\n");y.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${D}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=m.O,H=!0}}catch(a){y.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let N=()=>!!b.isCancelled||!!(0,g.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),O=!!b.debugMode&&!s,P=()=>{b.status="paused_debug",J({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!H)for(;;){if(I++,y.debug(`--- Starting Execution Step ${I} for Conv ${D} ---`),I>150){y.warn(`Max internal iterations (150) reached for conv ${D}. Breaking loop.`),d!==m.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=m.O);break}if(N()){y.info(`Cancellation flag detected for conv ${D}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,y.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${D}.`);let c=await n.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:J,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:N});if(!c.success){y.error(`Debug tool processing failed for conv ${D}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(D,b),M();try{b.updatedAt=Date.now(),await i(E,b)}catch(a){y.error(`Failed to save state after debug tool execution for conv ${D}:`,a)}if(O){y.info(`[Debug Step] Paused after tool execution for conv ${D}.`),P();break}continue}if(!O&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b);if(a&&b.breakpoints.includes(a)&&b.lastBreakNodeId!==a){y.info(`Breakpoint hit at node ${a} for conv ${D}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,J({type:"breakpoint:hit",node:{nodeId:a}}),J({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await i(E,b)}catch(a){y.error(`Failed to save state on breakpoint for conv ${D}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);y.verbose(`Message history before step ${I}`,a)}else y.verbose(`No messages in history before step ${I}`);let a=await e.FlowExecutor.executeStep(b,J);if(b=a.sharedState,d=a.action,M(),b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",y.verbose(`Updated conversation title for ${D} after step ${I} to: ${b.title}`))}if(y.info(`Step ${I} completed for conv ${D}. Action: ${d}`,{currentNodeId:b.currentNodeId}),y.verbose(`Shared state after step ${I}`,b),y.debug(`[Action Handling] Step ${I}: Received action "${d}" for conv ${D}`),d===m.O){y.info(`[Action Handling] Step ${I}: Handling ERROR_ACTION for conv ${D}`),y.error(`Error action received during step ${I} for conv ${D}`,{error:b.lastResponse});break}if(d===m.g4){y.info(`[Action Handling] Step ${I}: Handling FINAL_RESPONSE_ACTION for conv ${D}`),y.info(`Final response action received at step ${I} for conv ${D}`),b.status="completed",y.info(`Setting conversation status to 'completed' for conv ${D}`);break}if(d===m.Jp){y.info(`[Action Handling] Step ${I}: Handling TOOL_CALL_ACTION for conv ${D}`),y.info(`Tool call action received at step ${I} for conv ${D}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(l){if(p&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";y.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${D})`),b.status="error",b.pendingToolCalls=a.tool_calls,b.lastResponse={success:!1,error:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,errorDetails:{message:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,type:"approval_required",name:e}},d=m.O;break}if(p){y.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${D}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(D,b);try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",y.verbose(`Updated conversation title for ${D} before pausing to: ${b.title}`))}await i(E,b),y.verbose(`Saved state before pausing for approval for conv ${D}`)}catch(a){y.error(`Failed to save state before pausing for approval for conv ${D}:`,a)}J({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if(O){y.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${D}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(D,b);try{b.updatedAt=Date.now(),await i(E,b)}catch(a){y.error(`Failed to save state before debug tool pause for conv ${D}:`,a)}P();break}{y.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${D}`);let c=await n.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:J,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:N});if(!c.success){y.error(`Internal tool processing failed for conv ${D}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}y.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${D}`);let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(D,b),M(),y.info(`Continuing loop for conv ${D} after internal tool processing (no approval needed).`);continue}}else{y.info(`[flujo=false] Tool call action received for conv ${D}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,o.$9)(a.function.name,b.toolNameMap)?(y.verbose("tool is internal:",a.function.name),f.push(a)):(y.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){y.info(`[flujo=false] Processing ${f.length} internal tools for conv ${D}. External tools (${g.length}) will be ignored this step.`);let a=await n.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:J,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:N});if(!a.success){y.error(`[flujo=false] Internal tool processing failed for conv ${D}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=m.O;break}y.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${D}`);let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),e.FlowExecutor.conversationStates.set(D,b),y.info(`Continuing loop for conv ${D} after internal tool processing (flujo=false).`);continue}if(g.length>0){y.info(`[flujo=false] Found ${g.length} external tools for conv ${D}. Wrapping in XML and returning.`);let a=[];for(let b of g)if("function"===b.type)try{let c=JSON.parse(b.function.arguments||"{}"),d="";for(let a in c){let b=String(c[a]).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;");d+=`
3
- <${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
4
- </${b.function.name}>`)}catch(c){y.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:D}),a.push(`<${b.function.name}>
5
- <error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
6
- </${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=m.g4,y.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${D}.`);break}y.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${D} but no tools found after classification. Treating as final.`),d=m.g4;break}y.warn(`TOOL_CALL_ACTION received for conv ${D} but no tool_calls found in last message. Treating as final.`),d=m.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){y.info(`[Action Handling] Step ${I}: Handling Handoff Action (Edge ID) for conv ${D}`),y.info(`Handoff action received for conv ${D}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){if(c=e.id,y.debug(`Found handoff tool call ID: ${c} for edge ${d}`),"function"===e.type)try{let c=JSON.parse(e.function.arguments||"{}"),d="string"==typeof c?.prompt?c.prompt.trim():"";d&&(b.handoffInput={targetNodeId:a,prompt:d},y.info(`Captured caller prompt for handoff to node ${a} (${d.length} chars)`))}catch(a){y.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller prompt`,{parseError:a})}let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),y.info(`Appended tool result message for handoff tool call ${c}`)}else y.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else y.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);M();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,J({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),y.info(`Transitioning conv ${D} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(D,b),O){y.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${D}.`),P();break}y.info(`Continuing loop for conv ${D} after handoff.`);continue}y.error(`Handoff failed for conv ${D}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=m.O;break}if(d===m.E5){y.info(`[Action Handling] Step ${I}: Handling STAY_ON_NODE_ACTION for conv ${D}`),y.info(`Stay on node action received for conv ${D} at step ${I}`);break}y.warn(`Unrecognized action '${d}' received at step ${I} for conv ${D}. Treating as final response.`),d=m.g4;break}}catch(a){if(y.error(`Unhandled error during execution loop for conv ${D}`,{loopError:a}),d!==m.O&&N()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d!==m.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=m.O}}d!==m.O&&N()&&(y.info(`Cancellation flag set at run end for conv ${D}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d===m.O&&"error"!==b.status&&(b.status="error");let Q=Date.now()-h,R=b.status||(d===m.g4?"completed":d===m.O?"error":"running");if(y.info(`Execution finished for conv ${D}. Final Action: ${d}, Final Status: ${R}`,{duration:`${Q}ms`}),M(),("completed"===R||"error"===R)&&(J({type:"run:done",status:R}),"schedule"!==b.source&&(b.runDepth??0)===0)){let a=b.messages[b.messages.length-1],c=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:void 0;A(b,R,c)}try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",y.verbose(`Updated conversation title for ${D} before final return to: ${b.title}`))}await i(E,b),y.debug(`Saved final state for conversation ${D} before returning.`)}catch(a){y.error(`Failed to save final state for conversation ${D}:`,a)}(0,g.isConversationDeleted)(D)?e.FlowExecutor.conversationStates.delete(D):e.FlowExecutor.conversationStates.set(D,b);let S=()=>{u&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(D)},T={conversationId:b.conversationId||D,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return y.info(`Returning paused debug state for conv ${D}`),{...T,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===m.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},y.error(`Returning error result for conv ${D}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),S(),{...T,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let U=b.messages.length>0?b.messages[b.messages.length-1]:null,V="",W="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(W=b.lastResponse._flujo_xml_tools,V=U?.role==="assistant"&&"string"==typeof U.content?U.content:"",V+=(V?"\n\n":"")+W,b.lastResponse=V):V="string"==typeof b.lastResponse?b.lastResponse:U?.role==="assistant"&&"string"==typeof U.content?U.content:d!==m.Jp||l?"Processing complete.":"";let X=W?void 0:U?.role==="assistant"?U.tool_calls:void 0;return y.info(`Returning success result for conv ${D}`,{action:d,status:b.status,flujo:l,requireApproval:p,flujodebug:r}),S(),{...T,status:b.status||(d===m.g4?"completed":"running"),outputText:V,toolCalls:X,pendingToolCalls:b.pendingToolCalls}}}};
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6016],{9352:(e,t,r)=>{r.d(t,{Ic:()=>s,kY:()=>n});var o=r(26796);let a=(0,r(87021).h)("frontend/utils/theme"),n={light:{background:"#FFFFFF",foreground:"#2C3E50",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"}},dark:{background:"#1a1a1a",foreground:"#f0f0f0",paperBackground:"#2a2a2a",textSecondary:"#aaaaaa",border:"#3a3a3a",heading:"#f8f8f8",text:"#f0f0f0",secondaryText:"#aaa",error:{background:"#3a2222",border:"#5a3333",text:"#f87171"}}};function s(){let{isDarkMode:e}=(0,o.useTheme)();return a.debug("useThemeUtils called with isDarkMode: ".concat(e)),{getThemeValue:(t,r)=>e?r:t,getThemeColor:t=>{let r=t.split("."),o=n[e?"dark":"light"];for(let e of r)if(!o||"object"!=typeof o||!(e in o))return a.warn("Theme color path not found: ".concat(t)),"";else o=o[e];return o},colors:e?n.dark:n.light,isDarkMode:e}}},20063:(e,t,r)=>{var o=r(47260);r.o(o,"usePathname")&&r.d(t,{usePathname:function(){return o.usePathname}}),r.o(o,"useRouter")&&r.d(t,{useRouter:function(){return o.useRouter}}),r.o(o,"useSearchParams")&&r.d(t,{useSearchParams:function(){return o.useSearchParams}})},26796:(e,t,r)=>{r.r(t),r.d(t,{ThemeProvider:()=>h,useTheme:()=>g});var o=r(95155),a=r(12115),n=r(87021),s=r(7160),i=r(29197),l=r(9352),c=r(84563),p=r(29692);let d=(0,n.h)("frontend/contexts/ThemeContext"),u=(0,a.createContext)(void 0),h=e=>{let{children:t}=e,[r,n]=(0,a.useState)(!1),[h,g]=(0,a.useState)(!1);(0,a.useEffect)(()=>{(async()=>{d.debug("Loading theme preference from storage");let e=await (0,p.YM)(p.Zg.THEME,"light");d.info("Theme loaded from storage: ".concat(e));let t="dark"===e;g(t),t?document.documentElement.classList.add("dark-theme"):document.documentElement.classList.remove("dark-theme"),n(!0)})()},[]);let m=(0,a.useMemo)(()=>(function(e){let t="dark"===e?l.kY.dark:l.kY.light;return(0,i.A)({palette:{mode:e,primary:{main:"#007bff"},secondary:{main:"#6c757d"},error:{main:"dark"===e?"#f87171":"#dc2626",light:"dark"===e?"#5a3333":"#fecaca",dark:"dark"===e?"#3a2222":"#b91c1c"},warning:{main:"#f59e0b"},info:{main:"#3b82f6"},success:{main:"dark"===e?"#4ade80":"#16a34a"},background:{default:t.background,paper:t.paperBackground},text:{primary:t.foreground,secondary:t.textSecondary}},typography:{fontFamily:"var(--font-geist-sans), Arial, sans-serif",h1:{fontWeight:700},h2:{fontWeight:700},h3:{fontWeight:600},h4:{fontWeight:600},h5:{fontWeight:600},h6:{fontWeight:600}},components:{MuiButton:{styleOverrides:{root:{textTransform:"none",borderRadius:"0.375rem"}}},MuiPaper:{styleOverrides:{root:{borderRadius:"0.5rem"}}},MuiTextField:{styleOverrides:{root:{"& .MuiOutlinedInput-root":{borderRadius:"0.375rem"}}}},MuiCard:{styleOverrides:{root:{borderRadius:"0.5rem",boxShadow:"dark"===e?"0 4px 6px -1px rgba(0, 0, 0, 0.2), 0 2px 4px -1px rgba(0, 0, 0, 0.1)":"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)"}}}}})})(h?"dark":"light"),[h]);return d.debug("Rendering ThemeProvider with isDarkMode: ".concat(h)),(0,o.jsx)(u.Provider,{value:{toggleTheme:()=>{g(e=>{let t=!e,r=t?"dark":"light";return d.info("Toggling theme to: ".concat(r)),t?document.documentElement.classList.add("dark-theme"):document.documentElement.classList.remove("dark-theme"),(0,p.VH)(p.Zg.THEME,r),t})},isDarkMode:h},children:(0,o.jsxs)(s.A,{theme:m,children:[(0,o.jsx)(c.Ay,{}),t]})})},g=()=>{let e=(0,a.useContext)(u);if(!e)throw d.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return d.debug("useTheme hook accessed"),e}},27156:(e,t,r)=>{r.d(t,{Z:()=>o});var o=function(e){return e.MODELS="models",e.FLOWS="flows",e.CHAT_HISTORY="history",e.THEME="theme",e.ENCRYPTION_KEY="encryption_key",e.MCP_SERVERS="mcp_servers",e.GLOBAL_ENV_VARS="global_env_vars",e.CURRENT_CONVERSATION_ID="current_conversation_id",e.SELECTED_FLOW_ID="selected_flow_id",e.SPEECH_SETTINGS="speech_settings",e.SPOTLIGHT_SERVERS="spotlight_servers",e.PLANNED_EXECUTIONS="planned_executions",e.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",e.MCP_QUALITY_SETTINGS="mcp_quality_settings",e.RUN_RESOURCE_SETTINGS="run_resource_settings",e.KV_STORE_SETTINGS="kv_store_settings",e.PENDING_APPROVALS="pending_approvals",e}({})},29692:(e,t,r)=>{r.d(t,{Zg:()=>o.Z,YM:()=>l,VH:()=>i,Mj:()=>s});var o=r(27156),a=r(12115);let n=(0,r(87021).h)("utils/storage/frontend.ts");function s(e,t){n.verbose("useLocalStorage: Entering method");let[r,o]=(0,a.useState)(t),[s,i]=(0,a.useState)(!0),l=(0,a.useRef)(r);return(0,a.useEffect)(()=>{l.current=r},[r]),(0,a.useEffect)(()=>{(async()=>{n.verbose("loadValue: Entering method");try{let r=await fetch("/api/storage?key=".concat(encodeURIComponent(e),"&defaultValue=").concat(encodeURIComponent(JSON.stringify(t)))),a=await r.json();r.ok&&o(a.value)}catch(t){n.warn('Error reading storage key "'.concat(e,'":'),t)}finally{i(!1)}})()},[e]),[r,(0,a.useCallback)(async t=>{n.verbose("setValue: Entering method");try{let r=t instanceof Function?t(l.current):t;if(o(r),!(await fetch("/api/storage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:e,value:r})})).ok)throw Error("Failed to save value")}catch(t){n.warn('Error setting storage key "'.concat(e,'":'),t)}},[e]),s]}let i=async(e,t)=>{n.verbose("saveItem: Entering method");try{if(!(await fetch("/api/storage",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:e,value:t})})).ok)throw Error("Failed to save item")}catch(e){throw n.error("Error saving to storage:",e),e}},l=async(e,t)=>{n.verbose("loadItem: Entering method");try{let r=await fetch("/api/storage?key=".concat(encodeURIComponent(e),"&defaultValue=").concat(encodeURIComponent(JSON.stringify(t))));if(!r.ok)throw Error("Failed to load item");return(await r.json()).value}catch(e){return n.error("Error loading from storage:",e),t}}},46320:(e,t,r)=>{r.d(t,{A:()=>i,I:()=>s});var o=r(12115),a=r(95155);let n=o.createContext(),s=()=>{let e=o.useContext(n);return null!=e&&e},i=function(e){let{value:t,...r}=e;return(0,a.jsx)(n.Provider,{value:null==t||t,...r})}},60530:(e,t,r)=>{r.d(t,{L_:()=>s,QO:()=>a,bH:()=>n});let o=null;function a(e){o=e}function n(e){o===e&&(o=null)}function s(e){return!!o&&(o(e),!0)}},73667:(e,t,r)=>{r.r(t),r.d(t,{default:()=>j});var o=r(95155),a=r(33567),n=r(12115),s=r(2821),i=r(57001),l=r(48116),c=r(66964),p=r(16625),d=r(81852),u=r(74798),h=r(2300),g=r(85795),m=r(95195);function f(e){return(0,m.Ay)("MuiAppBar",e)}(0,g.A)("MuiAppBar",["root","positionFixed","positionAbsolute","positionSticky","positionStatic","positionRelative","colorDefault","colorPrimary","colorSecondary","colorInherit","colorTransparent","colorError","colorInfo","colorSuccess","colorWarning"]);let v=(e,t)=>e?"".concat(null==e?void 0:e.replace(")",""),", ").concat(t,")"):t,y=(0,l.Ay)(h.A,{name:"MuiAppBar",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,t["position".concat((0,d.A)(r.position))],t["color".concat((0,d.A)(r.color))]]}})((0,c.A)(e=>{let{theme:t}=e;return{display:"flex",flexDirection:"column",width:"100%",boxSizing:"border-box",flexShrink:0,variants:[{props:{position:"fixed"},style:{position:"fixed",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0,"@media print":{position:"absolute"}}},{props:{position:"absolute"},style:{position:"absolute",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"sticky"},style:{position:"sticky",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0}},{props:{position:"static"},style:{position:"static"}},{props:{position:"relative"},style:{position:"relative"}},{props:{color:"inherit"},style:{"--AppBar-color":"inherit"}},{props:{color:"default"},style:{"--AppBar-background":t.vars?t.vars.palette.AppBar.defaultBg:t.palette.grey[100],"--AppBar-color":t.vars?t.vars.palette.text.primary:t.palette.getContrastText(t.palette.grey[100]),...t.applyStyles("dark",{"--AppBar-background":t.vars?t.vars.palette.AppBar.defaultBg:t.palette.grey[900],"--AppBar-color":t.vars?t.vars.palette.text.primary:t.palette.getContrastText(t.palette.grey[900])})}},...Object.entries(t.palette).filter((0,u.A)(["contrastText"])).map(e=>{var r,o;let[a]=e;return{props:{color:a},style:{"--AppBar-background":(null!=(r=t.vars)?r:t).palette[a].main,"--AppBar-color":(null!=(o=t.vars)?o:t).palette[a].contrastText}}}),{props:e=>!0===e.enableColorOnDark&&!["inherit","transparent"].includes(e.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)"}},{props:e=>!1===e.enableColorOnDark&&!["inherit","transparent"].includes(e.color),style:{backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...t.applyStyles("dark",{backgroundColor:t.vars?v(t.vars.palette.AppBar.darkBg,"var(--AppBar-background)"):null,color:t.vars?v(t.vars.palette.AppBar.darkColor,"var(--AppBar-color)"):null})}},{props:{color:"transparent"},style:{"--AppBar-background":"transparent","--AppBar-color":"inherit",backgroundColor:"var(--AppBar-background)",color:"var(--AppBar-color)",...t.applyStyles("dark",{backgroundImage:"none"})}}]}})),x=n.forwardRef(function(e,t){let r=(0,p.b)({props:e,name:"MuiAppBar"}),{className:a,color:n="primary",enableColorOnDark:l=!1,position:c="fixed",...u}=r,h={...r,color:n,position:c,enableColorOnDark:l},g=(e=>{let{color:t,position:r,classes:o}=e,a={root:["root","color".concat((0,d.A)(t)),"position".concat((0,d.A)(r))]};return(0,i.A)(a,f,o)})(h);return(0,o.jsx)(y,{square:!0,component:"header",ownerState:h,elevation:4,className:(0,s.A)(g.root,a,"fixed"===c&&"mui-fixed"),ref:t,...u})});function k(e){return(0,m.Ay)("MuiToolbar",e)}(0,g.A)("MuiToolbar",["root","gutters","regular","dense"]);let b=(0,l.Ay)("div",{name:"MuiToolbar",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,!r.disableGutters&&t.gutters,t[r.variant]]}})((0,c.A)(e=>{let{theme:t}=e;return{position:"relative",display:"flex",alignItems:"center",variants:[{props:e=>{let{ownerState:t}=e;return!t.disableGutters},style:{paddingLeft:t.spacing(2),paddingRight:t.spacing(2),[t.breakpoints.up("sm")]:{paddingLeft:t.spacing(3),paddingRight:t.spacing(3)}}},{props:{variant:"dense"},style:{minHeight:48}},{props:{variant:"regular"},style:t.mixins.toolbar}]}})),A=n.forwardRef(function(e,t){let r=(0,p.b)({props:e,name:"MuiToolbar"}),{className:a,component:n="div",disableGutters:l=!1,variant:c="regular",...d}=r,u={...r,component:n,disableGutters:l,variant:c},h=(e=>{let{classes:t,disableGutters:r,variant:o}=e;return(0,i.A)({root:["root",!r&&"gutters",o]},k,t)})(u);return(0,o.jsx)(b,{as:n,className:(0,s.A)(h.root,a),ref:t,ownerState:u,...d})});var T=r(25635),E=r(94049),S=r(41983),_=r(26796),C=r(87021),R=r(36697);let B=(0,R.A)((0,o.jsx)("path",{d:"M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6c3.31 0 6 2.69 6 6s-2.69 6-6 6"}),"Brightness4"),w=(0,R.A)((0,o.jsx)("path",{d:"M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6m0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4"}),"Brightness7");var I=r(52619),M=r.n(I),L=r(20063),O=r(60530);let P=(0,C.h)("frontend/components/Navigation"),N=[{name:"Models",path:"/models",tour:"nav-models"},{name:"MCP",path:"/mcp",tour:"nav-mcp"},{name:"Flows",path:"/flows",tour:"nav-flows"},{name:"Executions",path:"/executions",tour:"nav-executions"},{name:"Waves",path:"/waves",tour:"nav-waves"},{name:"Chat",path:"/chat",tour:"nav-chat"},{name:"Docs",path:"/docs",tour:"nav-docs"},{name:"Settings",path:"/settings",tour:"nav-settings"}];function j(){let{toggleTheme:e,isDarkMode:t}=(0,_.useTheme)();(0,a.A)();let r=(0,L.usePathname)(),n=(0,L.useRouter)();P.debug("Rendering Navigation component with pathname: ".concat(r));let s=e=>t=>{t.defaultPrevented||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||0!==t.button||(0,O.L_)(()=>n.push(e))&&t.preventDefault()};return(0,o.jsx)(x,{position:"sticky",color:"default",elevation:1,children:(0,o.jsxs)(A,{children:[(0,o.jsx)(T.default,{variant:"h6",component:M(),href:"/",onClick:s("/"),sx:{color:"text.primary",textDecoration:"none",flexGrow:0,mr:4,fontWeight:600},children:"FLUJO"}),(0,o.jsx)(E.default,{sx:{flexGrow:1,display:"flex",gap:2},children:N.map(e=>(0,o.jsx)(T.default,{component:M(),href:e.path,"data-tour":e.tour,onClick:s(e.path),sx:{color:r===e.path?"primary.main":"text.primary",textDecoration:"none",fontWeight:r===e.path?600:400,"&:hover":{color:"primary.main"}},children:e.name},e.path))}),(0,o.jsx)(S.A,{onClick:()=>{P.debug("Theme toggle clicked, current mode: ".concat(t?"dark":"light")),e()},color:"inherit",children:t?(0,o.jsx)(w,{}):(0,o.jsx)(B,{})})]})})}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[812],{17897:(e,r,t)=>{t.d(r,{S:()=>n});var o=t(56290);let a=(0,t(87021).h)("frontend/services/mcp/index");class s{async loadServerConfigs(){try{let e=await fetch("/api/mcp/servers"),r=await e.json();if(!e.ok||r&&r.error){let e=r&&r.error||"Failed to load server configs";return a.warn("Failed to load server configs:",e),{error:e}}return r}catch(e){return a.warn("Failed to load server configs:",e),{error:"Failed to load server configs"}}}async listServerTools(e){try{let r=this.toolsCache.get(e),t=Date.now();if(r&&t-r.timestamp<this.CACHE_TTL)return a.debug("Using cached tools for server ".concat(e)),{tools:r.tools};let o=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/tools")),s=await o.json();if(s.error)return a.warn("Error listing tools for server ".concat(e,":"),s.error),{tools:[],error:s.error};let n=Array.isArray(s.tools)?s.tools:[];return this.toolsCache.set(e,{tools:n,timestamp:t}),{tools:n}}catch(r){return a.warn("Failed to list tools for server ".concat(e,":"),r),{tools:[],error:"Failed to list tools: ".concat(r instanceof Error?r.message:"Unknown error")}}}clearToolsCache(e){e?(this.toolsCache.delete(e),a.debug("Cleared tools cache for server ".concat(e))):(this.toolsCache.clear(),a.debug("Cleared all tools cache"))}async listServerResources(e){try{let r=this.resourcesCache.get(e),t=Date.now();if(r&&t-r.timestamp<this.CACHE_TTL)return a.debug("Using cached resources for server ".concat(e)),r.data;let o=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/resources")),s=await o.json(),n={resources:Array.isArray(s.resources)?s.resources:[],resourceTemplates:Array.isArray(s.resourceTemplates)?s.resourceTemplates:[],error:s.error};return n.error||this.resourcesCache.set(e,{data:n,timestamp:t}),n}catch(r){return a.warn("Failed to list resources for server ".concat(e,":"),r),{resources:[],resourceTemplates:[],error:"Failed to list resources: ".concat(r instanceof Error?r.message:"Unknown error")}}}async readResource(e,r){try{let t=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/resources/read?uri=").concat(encodeURIComponent(r)));return await t.json()}catch(t){return a.warn("Failed to read resource ".concat(r," on server ").concat(e,":"),t),{success:!1,error:"Failed to read resource"}}}async listServerPrompts(e){try{let r=this.promptsCache.get(e),t=Date.now();if(r&&t-r.timestamp<this.CACHE_TTL)return a.debug("Using cached prompts for server ".concat(e)),{prompts:r.prompts};let o=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/prompts")),s=await o.json();if(s.error)return a.warn("Error listing prompts for server ".concat(e,":"),s.error),{prompts:[],error:s.error};let n=Array.isArray(s.prompts)?s.prompts:[];return this.promptsCache.set(e,{prompts:n,timestamp:t}),{prompts:n}}catch(r){return a.warn("Failed to list prompts for server ".concat(e,":"),r),{prompts:[],error:"Failed to list prompts: ".concat(r instanceof Error?r.message:"Unknown error")}}}async getPrompt(e,r,t){try{let o=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/prompts/get"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,arguments:t})});return await o.json()}catch(t){return a.warn("Failed to get prompt ".concat(r," on server ").concat(e,":"),t),{success:!1,error:"Failed to get prompt"}}}clearCapabilitiesCache(e){e?(this.resourcesCache.delete(e),this.promptsCache.delete(e)):(this.resourcesCache.clear(),this.promptsCache.clear())}async callTool(e,r,t,o){try{let a=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/tools/").concat(encodeURIComponent(r)),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({args:t,timeout:o})});return await a.json()}catch(t){return a.warn("Failed to call tool ".concat(r," on server ").concat(e,":"),t),{error:"Failed to call tool"}}}async updateServerConfig(e,r){try{let t=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e)),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)}),o=await t.json();if(t.ok)return a.info("Successfully updated server config for ".concat(e)),{success:!0,data:o};if(void 0!==r.disabled)return a.info("Config update for ".concat(e," treated as success for toggle operation")),{success:!0,data:{...r,name:e},_originalError:o.error};return a.warn("Failed to update server config for ".concat(e,":"),o.error),{success:!1,error:o.error}}catch(r){return a.warn("Failed to update server config for ".concat(e,":"),r),{error:"Failed to update server config"}}}async testConnection(e){try{let r=await fetch("/api/mcp/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return await r.json()}catch(r){return a.warn("Failed to test connection for ".concat(e.name,":"),r),{success:!1,error:"Failed to reach the FLUJO backend to run the connection test: ".concat(r instanceof Error?r.message:"Unknown error")}}}async testConnectionStreaming(e,r){try{let t=await fetch("/api/mcp/test-connection/stream",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok||!t.body)return a.warn("Streaming test-connection unavailable (status ".concat(t.status,"); falling back")),this.testConnection(e);let s=null;if(await (0,o.z)(t,e=>{r(e),"result"===e.type&&(s={success:e.success,error:e.error,requiresAuthentication:e.requiresAuthentication,data:e.data})}),s)return s;return a.warn("Streaming test-connection ended without a result event"),{success:!1,error:"The connection test stream ended unexpectedly without a result."}}catch(r){return a.warn("Streaming test connection failed for ".concat(e.name,"; falling back to non-streaming:"),r),this.testConnection(e)}}async getServerStatus(e){try{let r=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e),"/status"),{headers:{Accept:"application/json"}}),t=await r.json();if(t.error)return a.warn("Error getting status for server ".concat(e,":"),t.error),{status:"error",message:t.error};return t}catch(r){return a.warn("Failed to get status for server ".concat(e,":"),r),{status:"error",message:"Failed to get server status: ".concat(r instanceof Error?r.message:"Unknown error")}}}async deleteServerConfig(e){try{let r=await fetch("/api/mcp/servers/".concat(encodeURIComponent(e)),{method:"DELETE"});return await r.json()}catch(r){return a.warn("Failed to delete server config for ".concat(e,":"),r),{error:"Failed to delete server config"}}}async retryServer(e){return a.debug("Retrying server status for: ".concat(e)),this.getServerStatus(e)}async restartServer(e){a.debug("Restarting server: ".concat(e));try{let r=await this.updateServerConfig(e,{disabled:!0});if(r.error)return a.warn("Failed to disable server ".concat(e," during restart:"),r.error),{error:"Failed to restart server: ".concat(r.error)};await new Promise(e=>setTimeout(e,1e3));let t=await this.updateServerConfig(e,{disabled:!1});if(t.error)return a.warn("Failed to enable server ".concat(e," during restart:"),t.error),{error:"Failed to restart server: ".concat(t.error)};return a.info("Successfully restarted server ".concat(e)),{success:!0}}catch(r){return a.warn("Failed to restart server ".concat(e,":"),r),{error:"Failed to restart server: ".concat(r instanceof Error?r.message:"Unknown error")}}}constructor(){this.toolsCache=new Map,this.resourcesCache=new Map,this.promptsCache=new Map,this.CACHE_TTL=6e4}}let n=new s},22573:(e,r,t)=>{t.d(r,{A:()=>p});var o=t(95155);t(12115);var a=t(33567),s=t(94049),n=t(41983),c=t(25635),i=t(28548),l=t(50430),d=t(63186),u=t(91665);let p=e=>{let{label:r,count:t,expanded:p,onToggle:m,showFolderIcon:h=!1,children:f}=e,y=(0,a.A)();return(0,o.jsxs)(s.default,{sx:{mb:1.5},children:[(0,o.jsxs)(s.default,{role:"button",tabIndex:0,"aria-expanded":p,onClick:m,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),m())},sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.75,borderRadius:1,cursor:"pointer",userSelect:"none",backgroundColor:y.palette.background.default,border:"1px solid ".concat(y.palette.divider),"&:hover":{backgroundColor:y.palette.action.hover}},children:[(0,o.jsx)(n.A,{size:"small","aria-label":p?"Collapse section":"Expand section",onClick:e=>{e.stopPropagation(),m()},sx:{transition:"transform 0.2s",transform:p?"rotate(0deg)":"rotate(-90deg)"},children:(0,o.jsx)(d.A,{fontSize:"small"})}),h&&(0,o.jsx)(u.A,{fontSize:"small",sx:{color:"text.secondary"}}),(0,o.jsx)(c.default,{variant:"subtitle2",sx:{fontWeight:600},children:r}),(0,o.jsx)(i.A,{label:t,size:"small",sx:{height:20,fontSize:"0.7rem"}})]}),(0,o.jsx)(l.A,{in:p,unmountOnExit:!0,children:(0,o.jsx)(s.default,{sx:{pt:1.5},children:f})})]})}},38459:(e,r,t)=>{function o(e,r){let t=[],o=new Map;for(let a of e){let{key:e,label:s}=r(a),n=o.get(e);n||(n={key:e,label:s,items:[]},o.set(e,n),t.push(n)),n.items.push(a)}return t}function a(e){let r=(null!=e?e:"").trim().charAt(0).toUpperCase();return r>="A"&&r<="Z"?{key:"letter:".concat(r),label:r}:{key:"letter:#",label:"#"}}function s(e,r){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Ungrouped",o=new Map,a=[];for(let t of e){var s;let e=null==(s=r(t))?void 0:s.trim();if(e){let r=o.get(e);r?r.push(t):o.set(e,[t])}else a.push(t)}let n=Array.from(o.keys()).sort((e,r)=>e.localeCompare(r)).map(e=>({key:"folder:".concat(e),label:e,items:o.get(e)}));return a.length>0&&n.push({key:"folder:__ungrouped__",label:t,items:a}),n}function n(e,r){let t=new Set;for(let a of e){var o;let e=null==(o=r(a))?void 0:o.trim();e&&t.add(e)}return Array.from(t).sort((e,r)=>e.localeCompare(r))}t.d(r,{Az:()=>o,Je:()=>s,po:()=>a,yF:()=>n})},43076:(e,r,t)=>{t.d(r,{N:()=>c,X:()=>n});let o=(0,t(87021).h)("frontend/services/model");class a{async fetchWithErrorHandling(e,r){try{o.debug("Making API request",{url:e,method:(null==r?void 0:r.method)||"GET"});let t=await fetch(e,r),a=null;try{if(204!==t.status){let r=t.headers.get("content-type");if(r&&r.includes("application/json"))a=await t.json();else{let s=await t.text();o.warn("Received non-JSON response",{url:e,contentType:r,text:s.substring(0,200)}),a=s}}}catch(r){throw o.error("Failed to parse response",{url:e,status:t.status,contentType:t.headers.get("content-type"),parseError:r}),Error("Invalid response format")}if(!t.ok){let s;throw s="object"==typeof a&&null!==a?a.error||a.message||a.errorMessage||JSON.stringify(a):a||"HTTP error! status: ".concat(t.status),o.error("Request failed",{url:e,method:(null==r?void 0:r.method)||"GET",status:t.status,error:s,data:a}),Error(s)}return o.debug("API request successful",{url:e,method:(null==r?void 0:r.method)||"GET",status:t.status}),a}catch(t){if(t instanceof TypeError&&"Failed to fetch"===t.message)throw o.error("Network error",{url:e,method:(null==r?void 0:r.method)||"GET",error:t}),Error("Unable to connect to the server. Please check your internet connection.");if(t instanceof Error)throw t;throw o.error("API request failed",{url:e,method:(null==r?void 0:r.method)||"GET",error:t}),Error("Failed to complete request")}}async tryLoadModels(){try{let e=await this.fetchWithErrorHandling("/api/model");return Array.isArray(e)?e:null}catch(e){return o.error("Failed to load models",e),null}}async loadModels(){var e;return null!=(e=await this.tryLoadModels())?e:[]}async getModel(e){try{return await this.fetchWithErrorHandling("/api/model/".concat(encodeURIComponent(e)))}catch(r){return o.error("Failed to get model",{id:e,error:r}),null}}async addModel(e){try{if(!e.provider)return{success:!1,error:"Provider is required"};o.debug("Attempting to add model",{displayName:e.displayName,provider:e.provider});let r=await this.fetchWithErrorHandling("/api/model",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return o.debug("Model added successfully",{modelId:r.id,displayName:r.displayName}),{success:!0,model:r}}catch(t){o.error("Failed to add model",{displayName:e.displayName,provider:e.provider,error:t instanceof Error?t.message:t});let r=t instanceof Error?t.message:"Failed to add model";if(r.includes("display name already exists"))return{success:!1,error:'The display name "'.concat(e.displayName,'" is already in use. Please choose a different name.')};if(r.includes("technical name already exists"))return{success:!1,error:'A model with the name "'.concat(e.name,'" already exists. Please choose a different name.')};return{success:!1,error:r}}}async updateModel(e){try{if(!e.id)return{success:!1,error:"Model ID is required"};o.debug("Attempting to update model",{modelId:e.id,displayName:e.displayName});let r=await this.fetchWithErrorHandling("/api/model/".concat(encodeURIComponent(e.id)),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return o.debug("Model updated successfully",{modelId:e.id,displayName:e.displayName}),{success:!0,model:r}}catch(t){o.error("Failed to update model",{modelId:e.id,displayName:e.displayName,error:t instanceof Error?t.message:t});let r=t instanceof Error?t.message:"Failed to update model";return r.includes("display name")&&r.includes("already exists"),{success:!1,error:r}}}async deleteModel(e){try{if(!e)return{success:!1,error:"Model ID is required"};let r=await this.getModel(e);if(!r)return{success:!1,error:"Model not found"};return o.debug("Attempting to delete model",{modelId:e,displayName:r.displayName}),await this.fetchWithErrorHandling("/api/model/".concat(encodeURIComponent(e)),{method:"DELETE"}),o.debug("Model deleted successfully",{modelId:e,displayName:r.displayName}),{success:!0}}catch(a){let r;try{let t=await this.getModel(e);r=null==t?void 0:t.displayName}catch(e){}o.error("Failed to delete model",{modelId:e,displayName:r,error:a instanceof Error?a.message:a});let t=a instanceof Error?a.message:"Failed to delete model";if(t.includes("not found"))return{success:!1,error:"The model no longer exists or has already been deleted"};return{success:!1,error:t}}}async updateModelApiKey(e,r){try{let t=await this.getModel(e);if(!t)return{success:!1,error:"Model not found"};return await this.updateModel({...t,ApiKey:r})}catch(r){return o.error("Failed to update model API key",{modelId:e,error:r}),{success:!1,error:r instanceof Error?r.message:"Failed to update API key"}}}async testModel(e){return o.debug("Testing model",{modelId:e.modelId,name:e.name}),await this.fetchWithErrorHandling("/api/model/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async fetchProviderModels(e,r,t,a){try{var s;o.debug("Fetching provider models",{baseUrl:e,modelId:r,searchTerm:t?'"'.concat(t,'"'):"none",apiKey:a?"provided":"not provided"});let n=await this.fetchWithErrorHandling("/api/model/provider",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:e,modelId:r,searchTerm:t,apiKey:a})});return o.debug("Provider models fetched successfully",{baseUrl:e,modelCount:(null==(s=n.models)?void 0:s.length)||0,searchTerm:t?'"'.concat(t,'"'):"none"}),n.models||[]}catch(r){return o.error("Failed to fetch provider models",{baseUrl:e,searchTerm:t,error:r}),[]}}}let s=null,n=()=>(s||(s=new a),s),c=new Proxy({},{get(e,r){let t=n(),o=t[r];return"function"==typeof o?o.bind(t):o}})},56290:(e,r,t)=>{t.d(r,{z:()=>o});async function o(e,r){if(!e.body||"function"!=typeof e.body.getReader)throw Error("Response has no readable body to stream");let t=e.body.getReader(),o=new TextDecoder,a=function(){let e="",r=(e,r)=>{let t=e.trim();if(t)try{r.push(JSON.parse(t))}catch(e){}};return{push(t){let o;e+=t;let a=[];for(;(o=e.indexOf("\n"))>=0;)r(e.slice(0,o),a),e=e.slice(o+1);return a},flush(){let t=[];return r(e,t),e="",t}}}();try{for(;;){let{value:e,done:s}=await t.read();if(s)break;for(let t of a.push(o.decode(e,{stream:!0})))r(t)}let e=o.decode();if(e)for(let t of a.push(e))r(t);for(let e of a.flush())r(e)}finally{try{t.releaseLock()}catch(e){}}}},81956:(e,r,t)=>{t.d(r,{A:()=>b});var o=t(95155),a=t(12115),s=t(36314),n=t(86973),c=t(49501),i=t(17681),l=t(21067),d=t(2778),u=t(52363),p=t(65036),m=t(9562),h=t(75912),f=t(91871),y=t(9693),g=t(91665),w=t(7517),v=t(8190);let b=e=>{let{anchorEl:r,open:t,currentFolder:b,folders:C,onClose:E,onAssign:x}=e,[A,S]=(0,a.useState)(!1),[j,F]=(0,a.useState)(""),k=e=>{x(e),E()},T=()=>{let e=j.trim();e&&(S(!1),k(e))};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.A,{anchorEl:r,open:t,onClose:E,children:[C.length>0&&C.map(e=>(0,o.jsxs)(n.A,{onClick:()=>k(e),selected:e===b,children:[(0,o.jsx)(c.A,{children:e===b?(0,o.jsx)(y.A,{fontSize:"small"}):(0,o.jsx)(g.A,{fontSize:"small"})}),(0,o.jsx)(i.A,{primary:e})]},e)),C.length>0&&(0,o.jsx)(l.A,{}),(0,o.jsxs)(n.A,{onClick:()=>{F(""),S(!0)},children:[(0,o.jsx)(c.A,{children:(0,o.jsx)(w.A,{fontSize:"small"})}),(0,o.jsx)(i.A,{primary:"New folder…"})]}),b&&(0,o.jsxs)(n.A,{onClick:()=>k(void 0),children:[(0,o.jsx)(c.A,{children:(0,o.jsx)(v.A,{fontSize:"small"})}),(0,o.jsx)(i.A,{primary:"Remove from folder"})]})]}),(0,o.jsxs)(d.A,{open:A,onClose:()=>S(!1),maxWidth:"xs",fullWidth:!0,children:[(0,o.jsx)(u.A,{children:"New folder"}),(0,o.jsx)(p.A,{children:(0,o.jsx)(m.A,{autoFocus:!0,margin:"dense",label:"Folder name",fullWidth:!0,value:j,onChange:e=>F(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),T())}})}),(0,o.jsxs)(h.A,{children:[(0,o.jsx)(f.A,{onClick:()=>S(!1),children:"Cancel"}),(0,o.jsx)(f.A,{variant:"contained",disabled:!j.trim(),onClick:T,children:"Create"})]})]})]})}},87021:(e,r,t)=>{t.d(r,{h:()=>i});let o={LOG_LEVEL:3},a={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},s="number"==typeof o.LOG_LEVEL?o.LOG_LEVEL:a.ERROR;function n(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(r>6)return String(e);if(!(e instanceof Error))return e;let t={name:e.name,message:e.message};for(let o of Object.getOwnPropertyNames(e)){if("name"===o||"message"===o)continue;let a=e[o];"function"!=typeof a&&("stack"===o?t.stack=a:"cause"===o?t.cause=n(a,r+1):"errors"===o&&Array.isArray(a)?t.errors=a.map(e=>n(e,r+1)):t[o]=a)}return t}function c(e,r,t,o,c){if(e>=("number"==typeof c?c:s)){if("function"==typeof o)try{o=o()}catch(e){o="[lazy log data threw]"}let s=new Date().toISOString(),c="[".concat(s,"] [").concat(r,"]"),i="".concat(c," ").concat(t);if(void 0!==o)if(o instanceof Error||"object"==typeof o)try{let e=o instanceof Error?n(o):o,r=JSON.stringify(e,(e,r)=>r instanceof Error?n(r):r,2);i+=":\n".concat(r)}catch(e){i+=": [Object cannot be stringified]"}else i+=": ".concat(o);switch(e){case a.VERBOSE:console.debug("[VERBOSE] ".concat(i));break;case a.DEBUG:console.debug(i);break;case a.INFO:console.info(i);break;case a.WARN:console.warn(i);break;case a.ERROR:console.error(i);break;default:console.log(i)}}}function i(e,r){let t,o=((t=e.replace(/^src\//,"")).startsWith("/")&&(t=t.substring(1)),t);return{verbose:(e,t)=>{c(a.VERBOSE,o,e,t,r)},debug:(e,t)=>{c(a.DEBUG,o,e,t,r)},info:(e,t)=>{c(a.INFO,o,e,t,r)},warn:(e,t)=>{c(a.WARN,o,e,t,r)},error:(e,t)=>{c(a.ERROR,o,e,t,r)}}}},94929:(e,r,t)=>{t.d(r,{default:()=>n});var o=t(95155);t(12115);var a=t(94049),s=t(4474);let n=e=>{let{size:r="medium",color:t="primary",className:n="",sx:c={}}=e,i="white"===t?{color:"#fff",...c}:c;return(0,o.jsxs)(a.default,{component:"span",sx:{display:"inline-block",lineHeight:0,...i},className:n,role:"status",children:[(0,o.jsx)(s.default,{size:{small:16,medium:24,large:36}[r],color:"white"===t?"inherit":t,"aria-hidden":"true"}),(0,o.jsx)(a.default,{component:"span",sx:{position:"absolute",width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:0},children:"Loading..."})]})}},97104:(e,r,t)=>{t.d(r,{Xk:()=>a});var o=t(12115);function a(e,r){let[t,a]=(0,o.useState)(()=>(function(e,r){try{let t=window.localStorage.getItem(e);if(null===t)return r;return JSON.parse(t)}catch(e){return r}})(e,r));return[t,(0,o.useCallback)(r=>{a(t=>{let o="function"==typeof r?r(t):r;try{window.localStorage.setItem(e,JSON.stringify(o))}catch(e){}return o})},[e])]}}}]);