flujo-ai 3.9.0 → 3.9.1

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 (108) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +46 -46
  3. package/.next/app-path-routes-manifest.json +4 -4
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/required-server-files.json +2 -2
  6. package/.next/server/app/_not-found/page.js +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_not-found.html +1 -1
  9. package/.next/server/app/_not-found.rsc +1 -1
  10. package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/chat.html +1 -1
  51. package/.next/server/app/chat.rsc +1 -1
  52. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/docs.html +1 -1
  54. package/.next/server/app/docs.rsc +1 -1
  55. package/.next/server/app/executions/page.js +1 -1
  56. package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/executions.html +1 -1
  58. package/.next/server/app/executions.rsc +1 -1
  59. package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/flows.html +1 -1
  61. package/.next/server/app/flows.rsc +1 -1
  62. package/.next/server/app/index.html +1 -1
  63. package/.next/server/app/index.rsc +1 -1
  64. package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/mcp-flows/route.js +1 -1
  66. package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
  68. package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/mcp.html +1 -1
  70. package/.next/server/app/mcp.rsc +1 -1
  71. package/.next/server/app/models/page.js +2 -2
  72. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  73. package/.next/server/app/page.js +1 -1
  74. package/.next/server/app/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/settings.html +1 -1
  77. package/.next/server/app/settings.rsc +1 -1
  78. package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app-paths-manifest.json +4 -4
  90. package/.next/server/chunks/2181.js +1 -1
  91. package/.next/server/chunks/2776.js +1 -1
  92. package/.next/server/chunks/3984.js +4 -4
  93. package/.next/server/chunks/4239.js +1 -1
  94. package/.next/server/chunks/5389.js +1 -1
  95. package/.next/server/chunks/5734.js +4 -4
  96. package/.next/server/chunks/6542.js +1 -1
  97. package/.next/server/chunks/6996.js +3 -3
  98. package/.next/server/pages/404.html +1 -1
  99. package/.next/server/pages/500.html +1 -1
  100. package/.next/server/pages-manifest.json +1 -1
  101. package/.next/server/server-reference-manifest.js +1 -1
  102. package/.next/server/server-reference-manifest.json +1 -1
  103. package/.next/trace +7 -7
  104. package/README.md +1 -1
  105. package/{next.config.ts → next.config.mjs} +105 -99
  106. package/package.json +1 -2
  107. /package/.next/static/{GbXXL_8DLT2oVwT-JdpbM → 6EKGB09pbUp8R7aHuLiP1}/_buildManifest.js +0 -0
  108. /package/.next/static/{GbXXL_8DLT2oVwT-JdpbM → 6EKGB09pbUp8R7aHuLiP1}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/v1/models/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"4474":{"*":{"id":"8521","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"55145","name":"*","chunks":[],"async":false}},"13975":{"*":{"id":"78763","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"34644","name":"*","chunks":[],"async":false}},"24437":{"*":{"id":"24207","name":"*","chunks":[],"async":false}},"25635":{"*":{"id":"79515","name":"*","chunks":[],"async":false}},"27127":{"*":{"id":"85906","name":"*","chunks":[],"async":false}},"27879":{"*":{"id":"92093","name":"*","chunks":[],"async":false}},"31742":{"*":{"id":"77048","name":"*","chunks":[],"async":false}},"36552":{"*":{"id":"52402","name":"*","chunks":[],"async":false}},"45993":{"*":{"id":"37310","name":"*","chunks":[],"async":false}},"46487":{"*":{"id":"56146","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"67421":{"*":{"id":"29872","name":"*","chunks":[],"async":false}},"72403":{"*":{"id":"49428","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"89547":{"*":{"id":"71779","name":"*","chunks":[],"async":false}},"94049":{"*":{"id":"81637","name":"*","chunks":[],"async":false}},"94929":{"*":{"id":"61615","name":"*","chunks":[],"async":false}},"95271":{"*":{"id":"19830","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\font\\google\\target.css?{\"path\":\"src\\\\app\\\\layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"variable\":\"--font-geist-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"geistSans\"}":{"id":59742,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\font\\google\\target.css?{\"path\":\"src\\\\app\\\\layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"variable\":\"--font-geist-mono\",\"subsets\":[\"latin\"]}],\"variableName\":\"geistMono\"}":{"id":3946,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\globals.css":{"id":13673,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx":{"id":72403,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\chat\\page.tsx":{"id":67421,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\docs\\page.tsx":{"id":27127,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\executions\\page.tsx":{"id":95271,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\flows\\page.tsx":{"id":45993,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\mcp\\page.tsx":{"id":31742,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\page.tsx":{"id":89547,"name":"*","chunks":["2678","static/chunks/2678-c88052addfb0478a.js","4754","static/chunks/4754-5c62bb61142f82d1.js","9244","static/chunks/9244-3281f7fd02003a2c.js","8548","static/chunks/8548-8e4a95334064e8b2.js","690","static/chunks/690-391bc0f482a9f67c.js","2003","static/chunks/2003-7710c23acaef11c9.js","3077","static/chunks/3077-565833c67440a7fa.js","2619","static/chunks/2619-04bc32f026a0d946.js","2720","static/chunks/2720-2a926505ec98a6de.js","9164","static/chunks/9164-81ca1a1bccdc5ed2.js","8974","static/chunks/app/page-471879d3918aeeb6.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\settings\\page.tsx":{"id":46487,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\models\\error.tsx":{"id":27879,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\Box\\Box.js":{"id":94049,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\CircularProgress\\CircularProgress.js":{"id":4474,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\Typography\\Typography.js":{"id":25635,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\shared\\lib\\lazy-dynamic\\dynamic-bailout-to-csr.js":{"id":24437,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\shared\\lib\\lazy-dynamic\\dynamic-bailout-to-csr.js":{"id":24437,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\shared\\lib\\lazy-dynamic\\preload-chunks.js":{"id":36552,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\shared\\lib\\lazy-dynamic\\preload-chunks.js":{"id":36552,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\models\\ModelClient.tsx":{"id":13975,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\shared\\Spinner.tsx":{"id":94929,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\":[],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\layout":[{"inlined":false,"path":"static/css/d1484588c616b291.css"}],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\page":[],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\v1\\models\\route":[]},"rscModuleMapping":{"4474":{"*":{"id":"65251","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}},"13673":{"*":{"id":"61135","name":"*","chunks":[],"async":false}},"13975":{"*":{"id":"2671","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"24437":{"*":{"id":"69389","name":"*","chunks":[],"async":false}},"25635":{"*":{"id":"16825","name":"*","chunks":[],"async":false}},"27127":{"*":{"id":"65793","name":"*","chunks":[],"async":false}},"27879":{"*":{"id":"14867","name":"*","chunks":[],"async":false}},"31742":{"*":{"id":"51016","name":"*","chunks":[],"async":false}},"36552":{"*":{"id":"63112","name":"*","chunks":[],"async":false}},"45993":{"*":{"id":"10057","name":"*","chunks":[],"async":false}},"46487":{"*":{"id":"85431","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"67421":{"*":{"id":"22516","name":"*","chunks":[],"async":false}},"72403":{"*":{"id":"41306","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"89547":{"*":{"id":"60967","name":"*","chunks":[],"async":false}},"94049":{"*":{"id":"73737","name":"*","chunks":[],"async":false}},"94929":{"*":{"id":"37997","name":"*","chunks":[],"async":false}},"95271":{"*":{"id":"42389","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/v1/models/route"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"4474":{"*":{"id":"8521","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"77526","name":"*","chunks":[],"async":false}},"13975":{"*":{"id":"78763","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"78922","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"68495","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"12263","name":"*","chunks":[],"async":false}},"24437":{"*":{"id":"24207","name":"*","chunks":[],"async":false}},"25635":{"*":{"id":"79515","name":"*","chunks":[],"async":false}},"27127":{"*":{"id":"85906","name":"*","chunks":[],"async":false}},"27879":{"*":{"id":"92093","name":"*","chunks":[],"async":false}},"31742":{"*":{"id":"77048","name":"*","chunks":[],"async":false}},"36552":{"*":{"id":"52402","name":"*","chunks":[],"async":false}},"45993":{"*":{"id":"37310","name":"*","chunks":[],"async":false}},"46487":{"*":{"id":"56146","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"54160","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"75170","name":"*","chunks":[],"async":false}},"67421":{"*":{"id":"29872","name":"*","chunks":[],"async":false}},"72403":{"*":{"id":"49428","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"82146","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"31603","name":"*","chunks":[],"async":false}},"89547":{"*":{"id":"71779","name":"*","chunks":[],"async":false}},"94049":{"*":{"id":"81637","name":"*","chunks":[],"async":false}},"94929":{"*":{"id":"61615","name":"*","chunks":[],"async":false}},"95271":{"*":{"id":"19830","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"29234","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\builtin\\global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\builtin\\global-error.js":{"id":57150,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\client-page.js":{"id":81959,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\client-segment.js":{"id":17989,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\http-access-fallback\\error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\http-access-fallback\\error-boundary.js":{"id":63886,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\layout-router.js":{"id":9766,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\metadata\\async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\metadata\\async-metadata.js":{"id":15278,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\client\\components\\render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\client\\components\\render-from-template-context.js":{"id":98924,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\lib\\framework\\boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\lib\\framework\\boundary-components.js":{"id":24431,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\lib\\metadata\\generate\\icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\lib\\metadata\\generate\\icon-mark.js":{"id":80622,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\font\\google\\target.css?{\"path\":\"src\\\\app\\\\layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"variable\":\"--font-geist-sans\",\"subsets\":[\"latin\"]}],\"variableName\":\"geistSans\"}":{"id":59742,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\font\\google\\target.css?{\"path\":\"src\\\\app\\\\layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"variable\":\"--font-geist-mono\",\"subsets\":[\"latin\"]}],\"variableName\":\"geistMono\"}":{"id":3946,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\globals.css":{"id":13673,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx":{"id":72403,"name":"*","chunks":["7177","static/chunks/app/layout-2878f13d7e253503.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\chat\\page.tsx":{"id":67421,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\docs\\page.tsx":{"id":27127,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\flows\\page.tsx":{"id":45993,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\executions\\page.tsx":{"id":95271,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\page.tsx":{"id":89547,"name":"*","chunks":["2678","static/chunks/2678-c88052addfb0478a.js","4754","static/chunks/4754-5c62bb61142f82d1.js","9244","static/chunks/9244-3281f7fd02003a2c.js","8548","static/chunks/8548-8e4a95334064e8b2.js","690","static/chunks/690-391bc0f482a9f67c.js","2003","static/chunks/2003-7710c23acaef11c9.js","3077","static/chunks/3077-565833c67440a7fa.js","2619","static/chunks/2619-04bc32f026a0d946.js","2720","static/chunks/2720-2a926505ec98a6de.js","9164","static/chunks/9164-81ca1a1bccdc5ed2.js","8974","static/chunks/app/page-471879d3918aeeb6.js"],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\mcp\\page.tsx":{"id":31742,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\settings\\page.tsx":{"id":46487,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\models\\error.tsx":{"id":27879,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\Box\\Box.js":{"id":94049,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\CircularProgress\\CircularProgress.js":{"id":4474,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\@mui\\material\\Typography\\Typography.js":{"id":25635,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\shared\\lib\\lazy-dynamic\\dynamic-bailout-to-csr.js":{"id":24437,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\shared\\lib\\lazy-dynamic\\dynamic-bailout-to-csr.js":{"id":24437,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\shared\\lib\\lazy-dynamic\\preload-chunks.js":{"id":36552,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\node_modules\\next\\dist\\esm\\shared\\lib\\lazy-dynamic\\preload-chunks.js":{"id":36552,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\models\\ModelClient.tsx":{"id":13975,"name":"*","chunks":[],"async":false},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\shared\\Spinner.tsx":{"id":94929,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\":[],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\layout":[{"inlined":false,"path":"static/css/d1484588c616b291.css"}],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\page":[],"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\app\\v1\\models\\route":[]},"rscModuleMapping":{"4474":{"*":{"id":"65251","name":"*","chunks":[],"async":false}},"9766":{"*":{"id":"6060","name":"*","chunks":[],"async":false}},"13673":{"*":{"id":"61135","name":"*","chunks":[],"async":false}},"13975":{"*":{"id":"2671","name":"*","chunks":[],"async":false}},"15278":{"*":{"id":"7184","name":"*","chunks":[],"async":false}},"17989":{"*":{"id":"36893","name":"*","chunks":[],"async":false}},"24431":{"*":{"id":"73041","name":"*","chunks":[],"async":false}},"24437":{"*":{"id":"69389","name":"*","chunks":[],"async":false}},"25635":{"*":{"id":"16825","name":"*","chunks":[],"async":false}},"27127":{"*":{"id":"65793","name":"*","chunks":[],"async":false}},"27879":{"*":{"id":"14867","name":"*","chunks":[],"async":false}},"31742":{"*":{"id":"51016","name":"*","chunks":[],"async":false}},"36552":{"*":{"id":"63112","name":"*","chunks":[],"async":false}},"45993":{"*":{"id":"10057","name":"*","chunks":[],"async":false}},"46487":{"*":{"id":"85431","name":"*","chunks":[],"async":false}},"57150":{"*":{"id":"81170","name":"*","chunks":[],"async":false}},"63886":{"*":{"id":"89748","name":"*","chunks":[],"async":false}},"67421":{"*":{"id":"22516","name":"*","chunks":[],"async":false}},"72403":{"*":{"id":"41306","name":"*","chunks":[],"async":false}},"80622":{"*":{"id":"51384","name":"*","chunks":[],"async":false}},"81959":{"*":{"id":"23597","name":"*","chunks":[],"async":false}},"89547":{"*":{"id":"60967","name":"*","chunks":[],"async":false}},"94049":{"*":{"id":"73737","name":"*","chunks":[],"async":false}},"94929":{"*":{"id":"37997","name":"*","chunks":[],"async":false}},"95271":{"*":{"id":"42389","name":"*","chunks":[],"async":false}},"98924":{"*":{"id":"69576","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}}
@@ -1,4 +1,5 @@
1
1
  {
2
+ "/_not-found/page": "app/_not-found/page.js",
2
3
  "/api/backup/route": "app/api/backup/route.js",
3
4
  "/api/browse/route": "app/api/browse/route.js",
4
5
  "/api/cwd/route": "app/api/cwd/route.js",
@@ -13,7 +14,6 @@
13
14
  "/api/mcp-registry/spotlight/route": "app/api/mcp-registry/spotlight/route.js",
14
15
  "/api/mcp/cancel/route": "app/api/mcp/cancel/route.js",
15
16
  "/api/mcp/servers/[name]/prompts/get/route": "app/api/mcp/servers/[name]/prompts/get/route.js",
16
- "/_not-found/page": "app/_not-found/page.js",
17
17
  "/api/mcp/servers/[name]/prompts/route": "app/api/mcp/servers/[name]/prompts/route.js",
18
18
  "/api/mcp/servers/[name]/resources/read/route": "app/api/mcp/servers/[name]/resources/read/route.js",
19
19
  "/api/mcp/servers/[name]/resources/route": "app/api/mcp/servers/[name]/resources/route.js",
@@ -49,15 +49,15 @@
49
49
  "/v1/chat/conversations/route": "app/v1/chat/conversations/route.js",
50
50
  "/v1/models/route": "app/v1/models/route.js",
51
51
  "/api/update/route": "app/api/update/route.js",
52
- "/mcp-proxy/[server]/route": "app/mcp-proxy/[server]/route.js",
53
52
  "/mcp-flows/route": "app/mcp-flows/route.js",
53
+ "/mcp-proxy/[server]/route": "app/mcp-proxy/[server]/route.js",
54
54
  "/v1/chat/conversations/[conversationId]/events/route": "app/v1/chat/conversations/[conversationId]/events/route.js",
55
55
  "/chat/page": "app/chat/page.js",
56
56
  "/docs/page": "app/docs/page.js",
57
- "/executions/page": "app/executions/page.js",
58
57
  "/flows/page": "app/flows/page.js",
59
- "/mcp/page": "app/mcp/page.js",
58
+ "/executions/page": "app/executions/page.js",
60
59
  "/page": "app/page.js",
60
+ "/mcp/page": "app/mcp/page.js",
61
61
  "/settings/page": "app/settings/page.js",
62
62
  "/models/page": "app/models/page.js"
63
63
  }
@@ -1,4 +1,4 @@
1
- exports.id=2181,exports.ids=[2181],exports.modules={1133:(a,b,c)=>{"use strict";c.r(b),c.d(b,{MCPService:()=>aj,mcpService:()=>ak});var d=c(37601),e=c(32524),f=c(79748),g=c.n(f),h=c(33873),i=c.n(h),j=c(50846),k=c(43326),l=c(51805),m=c(68780),n=c(73456);let o=(0,j.h)("backend/services/mcp/tools"),p=0x80000000-1;async function q(a,b){if(o.debug("Entering listServerTools method"),!a)return o.warn(`Server ${b} not connected`),{tools:[],error:"Server not connected"};try{o.info(`Listing tools for server ${b}`);let c=await a.listTools();o.verbose("Raw response from MCP server:",c);let d=(c.tools||[]).map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema||{}}));return o.verbose("Processed tools:",d),{tools:d}}catch(c){o.warn(`Failed to list tools for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{tools:[],error:a.includes("Connection timeout")?a:`Failed to list tools: ${a}`}}}async function r(a,b,c,d,e,f){if(o.debug("Entering callTool method"),!a)return o.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};let g=void 0!==e&&e>0?Math.min(1e3*e,p):p;try{o.debug(`Original args for tool ${c}:`,d);let b=await (0,n.c)(d),e=function(a,b){if(!a)return{};let c={};for(let d in a){let e=a[d];null==e?(o.debug(`Normalizing undefined/null value for parameter '${d}' in tool '${b}'`),d.includes("number")||d.endsWith("Count")||d.endsWith("Id")||d.endsWith("Limit")?(c[d]=0,o.debug(`Using default value 0 for likely number parameter: ${d}`)):d.includes("bool")||d.startsWith("is")||d.startsWith("has")||d.startsWith("should")?(c[d]=!1,o.debug(`Using default value false for likely boolean parameter: ${d}`)):d.includes("array")||d.endsWith("s")||d.endsWith("List")||d.endsWith("Items")?(c[d]=[],o.debug(`Using empty array for likely array parameter: ${d}`)):d.includes("object")||d.endsWith("Options")||d.endsWith("Config")||d.endsWith("Settings")?(c[d]={},o.debug(`Using empty object for likely object parameter: ${d}`)):(c[d]="",o.debug(`Using empty string for parameter with unknown type: ${d}`))):c[d]=e}return c}("object"==typeof b&&null!==b?b:{},c);o.debug(`Normalized args for tool ${c}:`,e),o.debug(`Calling tool ${c} with SDK timeout ${g}ms`);let h=await a.callTool({name:c,arguments:e},void 0,{timeout:g,resetTimeoutOnProgress:!0,onprogress:a=>{o.debug(`Progress for tool ${c}: ${a.progress}${void 0!==a.total?`/${a.total}`:""}${a.message?` — ${a.message}`:""}`),f?.(a)}});return{success:!0,data:h}}catch(e){o.warn(`Failed to call tool ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;if(e instanceof m.Nh&&e.code===m.O4.RequestTimeout){let a=Math.round(g/1e3);return o.warn(`Tool ${c} execution timed out after ${a} seconds`),{success:!1,error:`Tool execution timed out after ${a} seconds`,errorType:"timeout",toolName:c,timeout:a,statusCode:408}}if(a.includes("401")||a.includes("Unauthorized")||a.includes("invalid_token")||a.includes("token_expired"))return o.info(`OAuth authentication error detected for tool ${c} on server ${b}`),{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate the server.",statusCode:401,requiresAuthentication:!0};return(a.includes("404")||a.includes("Not Found"))&&(o.info(`404 error detected for tool ${c} on server ${b} - may indicate OAuth issues`),d=404,a="Tool endpoint not found (404). This may indicate OAuth authentication issues or the server may not be properly configured."),e instanceof m.Nh?(a=`Failed to call tool: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code?d=400:-32603===e.code&&(d=500)):a=`Failed to call tool: ${a}`,{success:!1,error:a,statusCode:d}}}let s=(0,j.h)("backend/services/mcp/resources");async function t(a,b){if(s.debug("Entering listServerResources method"),!a)return s.warn(`Server ${b} not connected`),{resources:[],error:"Server not connected"};try{s.info(`Listing resources for server ${b}`);let c=(await a.listResources()).resources||[];return s.verbose("Processed resources:",c),{resources:c}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return s.debug(`Server ${b} does not support resources/list`),{resources:[]};s.warn(`Failed to list resources for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resources:[],error:a.includes("Connection timeout")?a:`Failed to list resources: ${a}`}}}async function u(a,b){if(s.debug("Entering listServerResourceTemplates method"),!a)return s.warn(`Server ${b} not connected`),{resourceTemplates:[],error:"Server not connected"};try{return s.info(`Listing resource templates for server ${b}`),{resourceTemplates:(await a.listResourceTemplates()).resourceTemplates||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return s.debug(`Server ${b} does not support resources/templates/list`),{resourceTemplates:[]};s.warn(`Failed to list resource templates for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resourceTemplates:[],error:a.includes("Connection timeout")?a:`Failed to list resource templates: ${a}`}}}async function v(a,b,c){if(s.debug("Entering readResource method"),!a)return s.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let d=await (0,n.c)(c);s.info(`Reading resource ${d} from server ${b}`);let e=await a.readResource({uri:d});return{success:!0,data:e}}catch(e){s.warn(`Failed to read resource ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to read resource: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to read resource: ${a}`,{success:!1,error:a,statusCode:d}}}let w=(0,j.h)("backend/services/mcp/prompts");async function x(a,b){if(w.debug("Entering listServerPrompts method"),!a)return w.warn(`Server ${b} not connected`),{prompts:[],error:"Server not connected"};try{return w.info(`Listing prompts for server ${b}`),{prompts:(await a.listPrompts()).prompts||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return w.debug(`Server ${b} does not support prompts/list`),{prompts:[]};w.warn(`Failed to list prompts for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{prompts:[],error:a.includes("Connection timeout")?a:`Failed to list prompts: ${a}`}}}async function y(a,b,c,d){if(w.debug("Entering getPrompt method"),!a)return w.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let e;if(d&&Object.keys(d).length>0){let a=await (0,n.c)(d);e="object"==typeof a&&null!==a?a:void 0}w.info(`Getting prompt ${c} from server ${b}`);let f=await a.getPrompt({name:c,arguments:e});return{success:!0,data:f}}catch(e){w.warn(`Failed to get prompt ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to get prompt: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to get prompt: ${a}`,{success:!1,error:a,statusCode:d}}}var z=c(17748),A=c(40829),B=c(27299);let C=new Set(["npx","bunx","uvx","pipx","dlx"]),D=new Set(["pnpm","yarn","bun","npm"]),E=new Set(["dlx","exec","x"]);function F(a,b=[]){let c=((a||"").split(/[\\/]/).filter(Boolean).pop()||"").toLowerCase().replace(/\.(cmd|exe|bat|ps1)$/i,"");if(C.has(c))return!0;if(D.has(c)){let a=(b[0]||"").toLowerCase();return E.has(a)}return!1}function G(a){return"stdio"===a.transport&&F(a.command,a.args??[])}var H=c(4231),I=c(58302),J=c(77823),K=c(72238),L=c(29021),M=c(21820),N=c(77213),O=c(25096);let P=new Set(["node","npm","npx"]);var Q=c(79551);let R=(0,j.h)("backend/services/mcp/roots");function S(){return global.__mcp_node_roots}function T(a){let b=[];for(let c of S().values())if(c.serverName===a)for(let a of c.roots)b.includes(a)||b.push(a);return b}async function U(a){let b=function(a){let b=a.trim();if(!b)return null;if(b.startsWith("file://"))return b;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(b))return R.warn(`Ignoring non-file root URI: ${b}`),null;try{return(0,Q.pathToFileURL)(b).href}catch(a){return R.warn(`Could not convert root "${b}" to a file URI:`,a),null}}(await (0,n.c)(a));return b?{uri:b,name:function(a){try{let b=new URL(a).pathname.replace(/\/+$/,"").split("/").pop();return b?decodeURIComponent(b):void 0}catch{return}}(b)}:null}async function V(a){let b=a.roots,c=[...Array.isArray(b)?b:[],...T(a.name)],d=[],e=new Set;for(let a of c){if("string"!=typeof a||!a.trim())continue;let b=await U(a);b&&!e.has(b.uri)&&(e.add(b.uri),d.push(b))}if(0===d.length&&"string"==typeof a.rootPath&&a.rootPath.trim()){let b=await U(a.rootPath);if(b)return[b]}return d}async function W(a){try{let{loadServerConfigs:b}=await Promise.resolve().then(c.bind(c,51805)),d=await b();if(Array.isArray(d)){let b=d.find(b=>b.name===a.name);if(b)return b}}catch(b){R.warn(`Could not re-load config for ${a.name}, using connect-time config:`,b)}return a}void 0===global.__mcp_node_roots&&(global.__mcp_node_roots=new Map);var X=c(20433),Y=c(48999);let Z=(0,j.h)("backend/services/mcp/sampling");function $(a){return a.sampling}function _(a){let b=$(a);return b?.enabled?JSON.stringify({m:b.modelId,t:b.maxTokens,r:b.maxCallsPerMinute}):""}let aa=(0,j.h)("backend/services/mcp/connection");function ab(a){let b={};if(a)for(let[c,d]of Object.entries(a))d&&"object"==typeof d&&"value"in d?b[c]=d.value:b[c]=d;return b}function ac(a){return JSON.stringify({command:a.command,args:a.args??[],env:ab(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??""})}function ad(a){return JSON.stringify({transport:a.transport,url:a.serverUrl??"",headers:a.headers??{},requestInit:a.requestInit??{},eventSourceInit:a.eventSourceInit??{},reconnectionOptions:a.reconnectionOptions??{},sessionId:a.sessionId??"",oauthClientId:a.oauthClientId??"",oauthClientInformation:a.oauthClientInformation??{},oauthClientSecret:a.oauthClientSecret??"",oauthTokens:a.oauthTokens??{}})}function ae(a){aa.debug("Entering createNewClient method");let b=function(a){let b=$(a);return!!(b?.enabled&&b.modelId)}(a),c=new H.K({name:`flujo-${a.name}-client`,version:"3.9.0"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{}}});return c.setRequestHandler(m.WQ,async()=>{let b=await V(await W(a));return R.debug(`roots/list for ${a.name}: ${b.length} root(s)`),{roots:b}}),b&&function(a,b){let c=[];a.setRequestHandler(m.u9,async a=>{let d=$(b);if(!d?.enabled||!d.modelId)throw new m.Nh(m.O4.InvalidRequest,"Sampling is not enabled for this server");let e=d.maxCallsPerMinute??10,f=Date.now(),g=f-6e4;for(;c.length>0&&c[0]<g;)c.shift();if(c.length>=e)throw Z.warn(`Sampling rate limit (${e}/min) hit for ${b.name}`),new m.Nh(m.O4.InvalidRequest,`Sampling rate limit of ${e}/min exceeded`);c.push(f);let h=await X.modelService.getModel(d.modelId);if(!h)throw new m.Nh(m.O4.InternalError,`Sampling model not found: ${d.modelId}`);let i=await X.modelService.resolveAndDecryptApiKey(h.ApiKey);if(!i)throw new m.Nh(m.O4.InternalError,"Could not resolve the sampling model API key");let j=a.params,k=function(a){let b=[];for(let c of(a.systemPrompt&&b.push({role:"system",content:a.systemPrompt}),a.messages||[])){let a=c.content,d=a?.type==="text"&&"string"==typeof a.text?a.text:`[unsupported ${a?.type||"non-text"} content omitted]`;b.push({role:c.role,content:d})}return b}(j),l="number"==typeof j.temperature?j.temperature:.7;Z.info(`Sampling for ${b.name} via model ${h.name} (${k.length} messages)`);let n=(0,Y.getCompletionAdapter)(h),{completion:o}=await n.createCompletion({model:h,apiKey:i,messages:k,temperature:l}),p=o.choices?.[0]?.message?.content;return{role:"assistant",content:{type:"text",text:"string"==typeof p?p:""},model:h.name,stopReason:"endTurn"}})}(c,a),c.__flujoCapKey=_(a),c}function af(a){if(aa.debug("Entering createTransport method"),"streamable"===a.transport){aa.info(`Creating streamable http transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.reconnectionOptions&&"object"==typeof a.reconnectionOptions&&(b.reconnectionOptions=a.reconnectionOptions),"string"==typeof a.sessionId&&a.sessionId.length>0&&(b.sessionId=a.sessionId),a.headers&&"object"==typeof a.headers){let c=Object.fromEntries(Object.entries(a.headers).filter(([a,b])=>a&&"string"==typeof b));Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},aa.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}a.oauthClientId||a.oauthClientInformation?(aa.info(`Setting up OAuth authentication for ${a.name}`),b.authProvider=(0,O.C)(a),a.oauthTokens?.access_token?(aa.debug(`OAuth provider configured for ${a.name} with existing tokens`),aa.debug(`Token expires in: ${a.oauthTokens.expires_in} seconds`)):aa.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)):aa.debug(`No OAuth configuration found for ${a.name}`);let c=new J.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ad(a),c}if("sse"===a.transport){aa.info(`Creating legacy sse transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit),a.headers&&"object"==typeof a.headers){let c=Object.fromEntries(Object.entries(a.headers).filter(([a,b])=>a&&"string"==typeof b));Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},aa.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new K.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ad(a),c}return"websocket"===a.transport?(aa.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new I.I(new URL(a.websocketUrl))):function(a){if(aa.debug("Entering createStdioTransport method"),"stdio"!==a.transport)throw Error("Cannot create stdio transport for non-stdio config");let b=a.command,c=a.args?[...a.args]:[],e=`${N.VL}/${a.name}`;aa.info(`Creating stdio transport for server ${a.name}`),aa.debug(`Original command: ${b}`),aa.debug(`Original args: ${JSON.stringify(c)}`),aa.debug(`Server directory: ${e}`);let f=!h.isAbsolute(b)&&(b.includes("/")||b.includes("\\")),g=!b.includes("/")&&!b.includes("\\");if(aa.debug(`Is relative path: ${f}`),aa.debug(`Is just filename: ${g}`),"win32"===M.platform()&&b.toLowerCase().endsWith(".bat"))if(aa.debug(`Detected .bat file on Windows: ${b}`),g){let a=h.join((0,k.ok)(),e,b);aa.debug(`Checking if file exists at: ${a}`);let d=L.existsSync(a);aa.debug(`File exists: ${d}`),d?(aa.debug(`Using full path to .bat file: ${a}`),c=["/c",a,...c]):(aa.warn(`WARNING: .bat file not found at ${a}`),c=["/c",b,...c]),b="cmd.exe"}else aa.debug(`Using cmd.exe with path as provided: ${b}`),c=["/c",b,...c],b="cmd.exe";let i=function(a,b){if(!a||!(!a.includes("/")&&!a.includes("\\")))return a;let c=a.toLowerCase();if(!P.has(c))return a;if("node"===c)return b.execPath||a;if(!b.execPath)return a;let d=b.dirname(b.execPath);for(let a of"win32"===b.platform?[`${c}.cmd`,`${c}.exe`,c]:[c]){let c=b.joinPath(d,a);if(b.fileExists(c))return c}return a}(b,{execPath:process.execPath,platform:M.platform(),dirname:h.dirname,joinPath:h.join,fileExists:L.existsSync});i!==b&&(aa.debug(`Resolved Node toolchain command "${b}" to absolute path: ${i}`),b=i),aa.debug(`Final command: ${b}`),aa.debug(`Final args: ${JSON.stringify(c)}`);let j=function({command:a,args:b=[],rootPath:c,cwd:d,serverName:e,defaultCwd:f}){let g=c||d||f;return e&&F(a,b)&&(g.split(/[\\/]/).filter(Boolean).pop()||"")===e&&function(a){let b=a.match(/^(.*[\\/])[^\\/]+[\\/]*$/);return b?b[1].replace(/[\\/]+$/,""):""}(g)||g}({command:a.command,args:a.args,rootPath:a.rootPath,cwd:a.cwd,serverName:a.name,defaultCwd:`${N.VL}/${a.name}`}),l=h.isAbsolute(j)?j:h.join((0,k.ok)(),j);aa.debug(`cwd: ${l}`),aa.debug(`env: ${JSON.stringify(a.env)}`),aa.info(`Creating StdioClientTransport for ${a.name} with stderr: 'pipe'`);let m=ab(a.env);aa.verbose("Transformed environment variables",JSON.stringify(m));let n={command:b,args:c,env:m,cwd:l,stderr:"pipe"},o=new d.oQ(n);return o.__flujoStdioKey=ac(a),o.stderr?aa.info(`Stderr stream is available for ${a.name}`):aa.warn(`Stderr stream is NOT available for ${a.name}`),o}(a)}function ag(a,b){return null!==a.exitCode||null!==a.signalCode?Promise.resolve(!0):new Promise(c=>{let d=()=>{clearTimeout(e),c(!0)},e=setTimeout(()=>{a.removeListener("exit",d),c(!1)},b);e.unref?.(),a.once("exit",d)})}async function ah(a,b,c,e){aa.debug("Entering safelyCloseClient method");let f=e?.gracePeriodMs??15e3,g=e?.killEscalationMs??5e3;try{if(a.transport instanceof d.oQ){let c=a.transport._process;if(c&&null===c.exitCode&&null===c.signalCode){try{c.stdin&&!c.stdin.destroyed&&(c.stdin.end(),aa.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){aa.warn(`Error closing stdin for ${b}:`,a)}let a=await ag(c,f);if(!a){aa.warn(`Process did not exit within ${f}ms after stdin close, sending SIGTERM for ${b}`);try{c.kill("SIGTERM")}catch(a){aa.error(`Error sending SIGTERM for ${b}:`,a)}a=await ag(c,g)}if(a)aa.info(`Process exited gracefully for ${b}`);else{aa.warn(`Process did not respond to SIGTERM, sending SIGKILL for ${b}`);try{c.kill("SIGKILL")}catch(a){aa.error(`Error sending SIGKILL for ${b}:`,a)}}}}await a.close(),aa.info(`Client closed successfully for ${b}`)}catch(a){aa.warn(`Error closing client for ${b}:`,a)}}void 0===global.__mcp_recovery&&(global.__mcp_recovery=new Map),void 0===global.__mcp_connecting&&(global.__mcp_connecting=new Set),void 0===global.__mcp_starting_up&&(global.__mcp_starting_up=!0),void 0===global.__mcp_active_transports&&(global.__mcp_active_transports=new Map);let ai=(0,j.h)("backend/services/mcp/index");class aj{get connectingServers(){return global.__mcp_connecting}get activeTransports(){return global.__mcp_active_transports}static{this.MAX_STDERR_LOG_ENTRIES=200}appendStderrLog(a,b){let c=this.stderrLogs.get(a)||[];c.push(b),c.length>aj.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-aj.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){this.clients.delete(a),this.removeFromGlobalRecovery(a),this.activeTransports.delete(a)}constructor(){this.clients=new Map,this.stderrLogs=new Map,this.lastConnectionError=new Map,this.inFlightConnects=new Map,this.recover_attempted=!1,this.connectionRetryTimers=new Map,this.connectionRetryAttempts=new Map,this.attemptRecovery()}attemptRecovery(){!this.recover_attempted&&global.__mcp_recovery&&global.__mcp_recovery.size>0&&(ai.info(`Attempting to recover ${global.__mcp_recovery.size} clients from global recovery map`),global.__mcp_recovery.forEach((a,b)=>{this.clients.set(b,a),ai.info(`Recovered client for server: ${b}`)})),this.recover_attempted=!0}addToGlobalRecovery(a,b){global.__mcp_recovery||(global.__mcp_recovery=new Map),global.__mcp_recovery.set(a,b),ai.debug(`Added client for server ${a} to global recovery map`)}removeFromGlobalRecovery(a){global.__mcp_recovery&&global.__mcp_recovery.has(a)&&(global.__mcp_recovery.delete(a),ai.debug(`Removed client for server ${a} from global recovery map`))}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),ai.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){ai.warn(`Maximum retry attempts (5) reached for server ${a}, stopping retries`),this.connectionRetryAttempts.delete(a);return}let d=Math.min(5e3*Math.pow(2,c),3e5);ai.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout(async()=>{ai.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){ai.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){ai.info(`Server ${a} is now disabled, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}let d=this.getClient(a);if(d)try{await d.ping({timeout:5e3}),ai.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){ai.warn(`Server ${a} has a registered client but ping failed (${b instanceof Error?b.message:String(b)}); reconnecting from scratch`)}this.connectionRetryAttempts.set(a,c+1);try{let e=d?await this.forceReconnect(a):await this.connectServer(b);if(e.success)ai.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(ai.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication){ai.info(`Server ${a} requires authentication, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){ai.error(`Error during retry connection for server ${a}:`,c),this.scheduleConnectionRetry(a,b)}},d);this.connectionRetryTimers.set(a,e)}isStartingUp(){return!0===global.__mcp_starting_up}setStartingUp(a){global.__mcp_starting_up=a,ai.info(`Backend startup state set to: ${a?"starting":"complete"}`)}getClient(a){let b=this.clients.get(a);if(!b){let c=global.__mcp_recovery?.get(a);c&&(this.clients.set(a,c),b=c,ai.debug(`getClient: adopted ${a} from the global recovery map`))}return ai.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){ai.debug("loadServerConfigs: Entering method");try{let a=await (0,l.loadServerConfigs)();if(!Array.isArray(a))return ai.warn("loadServerConfigs: Received non-array response",a),a;return ai.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){return ai.warn("loadServerConfigs: Failed to load server configs:",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async getServerConfig(a){ai.debug(`getServerConfig: Looking up config for server ${a}`);let b=await this.loadServerConfigs();if(!Array.isArray(b))return ai.warn(`getServerConfig: Failed to load configs for ${a}:`,b.error),null;let c=b.find(b=>b.name===a);return c||(ai.warn(`getServerConfig: Server ${a} not found in configs`),null)}async isServerDisabled(a){let b=await this.getServerConfig(a);return b?.disabled===!0}async connectServer(a){let b="string"==typeof a?a:a.name,c=this.inFlightConnects.get(b);if(c)return ai.debug(`connectServer: reusing in-flight connection attempt for ${b}`),c;let d=this.connectServerInternal(a).finally(()=>{this.inFlightConnects.delete(b)});return this.inFlightConnects.set(b,d),d}async connectServerInternal(a){let b;if("string"==typeof a){ai.info(`connectServer: Looking up config for server ${a}`);let c=await this.getServerConfig(a);if(!c)return ai.warn(`connectServer: Server ${a} not found in configs`),{success:!1,error:`Server configuration for "${a}" not found. The server may have been deleted or not properly configured.`};b=c}else b=a;if((("string"==typeof a?b:await this.getServerConfig(b.name))??b).disabled)return ai.info(`connectServer: Server ${b.name} is disabled — refusing to create a client/transport`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!1,error:`Server '${b.name}' is disabled. Enable it on the MCP page to use it.`};let c=(0,e.A)();ai.info(`connectServer: Starting connection for server ${b.name} [RequestID: ${c}]`),this.connectingServers.add(b.name);try{this.stderrLogs.set(b.name,[]);let a=this.clients.get(b.name);if(a){let{needsNewClient:c,reason:e}=function(a,b){if(aa.debug("Entering shouldRecreateClient method"),(a.__flujoCapKey??"")!==_(b))return{needsNewClient:!0,reason:"Client capabilities (sampling) changed"};if("websocket"===b.transport){if(!(a.transport instanceof I.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof J.j))return{needsNewClient:!0,reason:"Transport type changed to streamable"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"Streamable server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing streamable transport has no config key"};if(e!==ad(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof K.A))return{needsNewClient:!0,reason:"Transport type changed to sse"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"SSE server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing sse transport has no config key"};if(e!==ad(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof d.oQ))return{needsNewClient:!0,reason:"Transport type changed to stdio"};if("stdio"!==b.transport)return{needsNewClient:!0,reason:"Transport type changed from stdio"};let c=a.transport.__flujoStdioKey;if(!c)return{needsNewClient:!0,reason:"Existing stdio transport has no config key"};if(c!==ac(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}(a,b);if(!c)return ai.info(`connectServer: Server ${b.name} is already connected`),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!0};ai.info(`connectServer: Existing client for ${b.name} is stale (${e}), recreating`),this.deregisterClient(b.name);try{await ah(a,b.name,b)}catch(a){ai.debug(`connectServer: error closing stale client for ${b.name}: ${a instanceof Error?a.message:String(a)}`)}a=void 0}a=ae(b);let c=af(b);if(c instanceof d.oQ&&c.stderr){let a=b.name;c.stderr.on("data",b=>{let c=b.toString();ai.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)})}return await a.connect(c),c.onclose=()=>{if(this.activeTransports.get(b.name)!==c)return void ai.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${b.name}`);ai.warn(`connectServer: Connection closed for server ${b.name}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ai.info(`Server ${b.name} is now disabled, skipping reconnection logic`);ai.info(`Connection closed for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ai.warn(`Error checking server config for ${b.name} during onclose:`,a)})},c.onerror=a=>{if((0,z.lO)(a))return void ai.debug(`connectServer: transient SSE stream disconnect for ${b.name} (self-healing, ignored): ${a instanceof Error?a.message:String(a)}`);if(this.activeTransports.get(b.name)!==c)return void ai.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${b.name}`);if(ai.error(`connectServer: Transport error for server ${b.name}:`),a instanceof Error){ai.error(`Error name: ${a.name}`),ai.error(`Error message: ${a.message}`),ai.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&ai.error(`Error code: ${b}`),ai.error(`Error chain: ${(0,z.jf)(a)}`)}else if(a&&"object"==typeof a){ai.error(`Error type: ${typeof a}`),ai.error(`Error constructor: ${a.constructor?.name||"Unknown"}`);let b=Object.getOwnPropertyNames(a);b.length>0?(ai.error(`Error properties: ${b.join(", ")}`),b.forEach(b=>{try{let c=a[b];ai.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){ai.error(` ${b}: [Unable to serialize: ${a}]`)}})):ai.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);ai.error(`JSON stringified error: ${b}`)}catch(a){ai.error(`Cannot JSON stringify error: ${a}`)}}else ai.error(`Error value: ${String(a)} (type: ${typeof a})`);this.appendStderrLog(b.name,`Transport error: ${(0,z.jf)(a)}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ai.info(`Server ${b.name} is now disabled, skipping reconnection after transport error`);ai.info(`Transport error for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ai.warn(`Error checking server config for ${b.name} during onerror:`,a)})},this.clients.set(b.name,a),this.activeTransports.set(b.name,c),this.addToGlobalRecovery(b.name,a),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),ai.info(`connectServer: Successfully connected to ${b.name}`),{success:!0}}catch(f){ai.error(`connectServer: Failed to connect to server ${b.name}:`,f);let a=f instanceof Error?f.message:String(f),c=f instanceof Error?f.name:"";if(a.includes("OAuth authentication required")||"OAuthAuthenticationRequired"===c){if(ai.info(`OAuth authentication required for server ${b.name}`),"streamable"===b.transport){let a=b;a.authorizationUrl&&ai.info(`Authorization URL available for ${b.name}: ${a.authorizationUrl}`)}return{success:!1,error:a,requiresAuthentication:!0}}if((0,z.Ah)(f)){if(ai.info(`OAuth authentication error detected for server ${b.name}: ${a}`),"streamable"===b.transport){let a=b;if(!a.oauthScopes||0===a.oauthScopes.length){ai.info(`Dynamically enabling OAuth for server ${b.name} due to authentication error`);try{let c={...a,oauthScopes:["read"]},d=await this.loadServerConfigs();if(Array.isArray(d)){let a=d.findIndex(a=>a.name===b.name);-1!==a&&(d[a]=c,await (0,l.q)(new Map(d.map(a=>[a.name,a]))),ai.info(`Updated config for ${b.name} to enable OAuth`))}}catch(a){ai.warn(`Failed to update config for ${b.name} to enable OAuth:`,a)}}}return{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate.",requiresAuthentication:!0}}let d=this.stderrLogs.get(b.name)||[],e=(0,z.ox)(f,b,d);return this.lastConnectionError.set(b.name,e),{success:!1,error:e}}finally{this.connectingServers.delete(b.name)}}async testConnection(a){ai.info(`testConnection: Testing connection to ${a.name||"(unnamed)"} via ${a.transport} transport`);let b=[],c=null,e=null;try{let f;c=ae(a),(e=af(a))instanceof d.oQ&&e.stderr&&e.stderr.on("data",a=>{b.push(a.toString())}),e.onerror=a=>{b.push(`Transport error: ${(0,z.jf)(a)}`)};let g=G(a)?9e4:15e3,h=G(a),i=new Promise((a,b)=>{f=setTimeout(()=>b(Error(`Connection timeout after ${g/1e3}s`+(h?" — the package may still be downloading via npx/uvx. Try running the Test again (the package is cached after the first download), or verify the command and network access.":""))),g)});try{await Promise.race([c.connect(e),i])}finally{f&&clearTimeout(f)}let j=0;try{let a=await c.listTools();j=Array.isArray(a?.tools)?a.tools.length:0}catch(b){ai.debug(`testConnection: connected to ${a.name} but listTools failed: ${b instanceof Error?b.message:String(b)}`)}return ai.info(`testConnection: Successfully connected to ${a.name} (${j} tools)`),{success:!0,data:{toolCount:j}}}catch(d){ai.warn(`testConnection: Failed to connect to ${a.name}:`,d);let c=(0,z.Ah)(d);return{success:!1,error:(0,z.ox)(d,a,b),requiresAuthentication:c}}finally{if(c)try{await ah(c,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){ai.debug(`testConnection: error closing test client for ${a.name}: ${b instanceof Error?b.message:String(b)}`)}}}setNodeRoots(a,b,c){for(let d of function(a,b,c){let d=(c??[]).filter(a=>"string"==typeof a&&a.trim().length>0),e=S().get(b),f=new Set([a]);e&&f.add(e.serverName);let g=new Map;for(let a of f)g.set(a,T(a));0===d.length?S().delete(b)&&R.debug(`Cleared node roots for node ${b}`):(S().set(b,{serverName:a,roots:d}),R.debug(`Registered ${d.length} node root(s) for node ${b} on server ${a}`));let h=[];for(let a of f){let b=T(a),c=g.get(a)??[];(b.length!==c.length||b.some((a,b)=>a!==c[b]))&&h.push(a)}return h}(a,b,c))this.notifyRootsChanged(d)}notifyRootsChanged(a){let b=this.getClient(a);if(!b)return void ai.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{ai.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),ai.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){ai.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}async disconnectServer(a){ai.debug(`disconnectServer: Entering method for server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);let b=this.getClient(a);if(!b)return ai.warn(`disconnectServer: Server ${a} not found in clients map`),this.removeFromGlobalRecovery(a),this.activeTransports.delete(a),{success:!1,error:`Server ${a} not found`};this.deregisterClient(a);try{let c=await this.getServerConfig(a);return await ah(b,a,c||void 0),ai.info(`disconnectServer: Disconnected server ${a}`),{success:!0}}catch(b){return ai.warn(`disconnectServer: Failed to disconnect server ${a}:`,b),{success:!1,error:`Failed to disconnect server: ${b instanceof Error?b.message:"Unknown error"}`}}}async forceReconnect(a){ai.info(`forceReconnect: Forcing fresh connection for server ${a}`);let b=this.clients.get(a);if(b){this.deregisterClient(a);let c=await this.getServerConfig(a);try{await ah(b,a,c||void 0)}catch(b){ai.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a){if(ai.debug(`listServerTools: Entering method for server ${a}`),await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`listServerTools: ${b}`),{tools:[],error:b}}let b=this.getClient(a);b||ai.warn(`listServerTools: Client not found for ${a}`);let c=await q(b,a);if(c.error){ai.warn(`listServerTools: Listing tools for ${a} failed (${c.error}); forcing reconnect and retrying once`);let d=await this.forceReconnect(a);if(!d.success)return ai.warn(`listServerTools: Reconnect for ${a} failed: ${d.error}`),{tools:[],error:d.error||c.error};b=this.clients.get(a),(c=await q(b,a)).error?ai.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,c.error):ai.info(`listServerTools: Recovered after reconnect for ${a}; listed ${c.tools.length} tools`)}else ai.info(`listServerTools: Listed ${c.tools.length} tools for ${a}`);return c}async callTool(a,b,c,d,e){if(ai.debug(`callTool: Entering method for server ${a}, tool ${b}`),await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`callTool: ${b}`),{success:!1,error:b}}let f=this.getClient(a);if(!f){ai.warn(`callTool: No client for ${a}; forcing reconnect before calling ${b}`);let c=await this.forceReconnect(a);c.success?f=this.clients.get(a):ai.warn(`callTool: Reconnect for ${a} failed: ${c.error}`)}let g=await r(f,a,b,c,d,e);return ai.info(`callTool: Called tool ${b} on ${a}`),g}async listWithReconnect(a,b,c){if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=this.clients.get(a);d||ai.warn(`listWithReconnect: Client not found for ${a}`);let e=await b(d,a);if(!e.error)return e;ai.warn(`listWithReconnect: Listing for ${a} failed (${e.error}); forcing reconnect and retrying once`);let f=await this.forceReconnect(a);return f.success?(d=this.clients.get(a),(e=await b(d,a)).error?ai.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,e.error):ai.info(`listWithReconnect: Recovered after reconnect for ${a}`),e):(ai.warn(`listWithReconnect: Reconnect for ${a} failed: ${f.error}`),{...c,error:f.error||e.error})}async listServerResources(a){return ai.debug(`listServerResources: Entering method for server ${a}`),this.listWithReconnect(a,t,{resources:[]})}async listServerResourceTemplates(a){return ai.debug(`listServerResourceTemplates: Entering method for server ${a}`),this.listWithReconnect(a,u,{resourceTemplates:[]})}async readResource(a,b){ai.debug(`readResource: Entering method for server ${a}, uri ${b}`);let c=this.clients.get(a);c||ai.warn(`readResource: Client not found for ${a}`);let d=await v(c,a,b);return ai.info(`readResource: Read resource ${b} on ${a}`),d}async listServerPrompts(a){return ai.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,x,{prompts:[]})}async getPrompt(a,b,c){ai.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=this.clients.get(a);d||ai.warn(`getPrompt: Client not found for ${a}`);let e=await y(d,a,b,c);return ai.info(`getPrompt: Got prompt ${b} on ${a}`),e}async resolveOAuthSecretForSave(a,b){return a===B.RJ?b??"":a?a.startsWith("${global:")||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")?a:await (0,A.Rs)(a):""}async ensureRemoteServerRootDir(a){try{if(!["streamable","sse","websocket"].includes(a.transport))return;let b=(a.rootPath||"").trim();if(!b)return;let c=i().resolve((0,k.ok)(),b);if(i().dirname(c)===c)return;await g().mkdir(c,{recursive:!0}),ai.debug(`ensureRemoteServerRootDir: ensured ${c} for ${a.name}`)}catch(b){ai.warn(`ensureRemoteServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){ai.debug(`updateServerConfig: Entering method for server ${a}`);let c=await this.loadServerConfigs();if(!Array.isArray(c))return ai.warn("updateServerConfig: Failed to load configs:",c.error),c;let d=c.find(b=>b.name===a),e=!!d&&"string"==typeof b.name&&b.name!==a;if(e&&c.some(a=>a.name===b.name))return ai.warn(`updateServerConfig: Refusing to rename ${a} -> ${b.name}: name already in use`),{success:!1,error:`A server named "${b.name}" already exists`};if(!d&&b.name)ai.info(`updateServerConfig: Creating new server config for ${b.name}`),d={name:b.name,transport:"stdio",command:"",args:[],env:{},disabled:!1,autoApprove:[],_buildCommand:"",_installCommand:"",rootPath:""},c.push(d);else if(!d)return ai.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};if(b.env){ai.debug(`updateServerConfig: Resolving global variables in env for ${a}`);try{ai.debug(`Original env variables for ${a}:`,JSON.stringify(b.env,null,2)),b.env=await (0,n.c)(b.env),ai.debug(`Resolved env variables for ${a}:`,JSON.stringify(b.env,null,2)),ai.debug(`updateServerConfig: Successfully resolved global variables for ${a}`)}catch(b){ai.warn(`updateServerConfig: Error resolving global variables for ${a}:`,b)}}let f=b.oauthClientSecret;if(void 0!==f){let a=d.oauthClientSecret;b.oauthClientSecret=await this.resolveOAuthSecretForSave(f,a)}let g={...d};g={...d,...b};let h=JSON.stringify(d.roots??[])!==JSON.stringify(g.roots??[])||(d.rootPath??"")!==(g.rootPath??""),i=c.findIndex(b=>b.name===a);-1!==i?c[i]=g:g.name&&c.push(g);let j=await (0,l.q)(new Map(c.map(a=>[a.name,a])));return j.success?(await this.ensureRemoteServerRootDir(g),e?(this.clients.has(a)?await this.disconnectServer(a):(this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a)),this.removeFromGlobalRecovery(a),this.stderrLogs.delete(a),this.lastConnectionError.delete(a),await this.handleConnectionStateChange(g.name,g)):await this.handleConnectionStateChange(a,g),h&&this.notifyRootsChanged(g.name),ai.info(`updateServerConfig: Successfully updated config for ${a}${e?` (renamed to ${g.name})`:""}`),g):(ai.warn(`updateServerConfig: Failed to save config for ${a}:`,j.error),j)}async handleConnectionStateChange(a,b){ai.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){ai.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{await this.disconnectServer(a)}catch(b){ai.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(ai.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(ai.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(ai.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){ai.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ai.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(ai.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){ai.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){ai.debug(`deleteServerConfig: Entering method for server ${a}`),this.clients.has(a)&&(ai.info(`deleteServerConfig: Disconnecting server ${a} before deletion`),await this.disconnectServer(a));let b=await this.loadServerConfigs();if(!Array.isArray(b))return ai.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return ai.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),ai.debug(`deleteServerConfig: Saving updated configs after deleting ${a}`);let d=await (0,l.q)(new Map(b.map(a=>[a.name,a])));return d.success?ai.info(`deleteServerConfig: Successfully deleted server ${a}`):ai.warn(`deleteServerConfig: Error saving configs after deleting ${a}:`,d.error),d}async getServerStatus(a){this.getClient(a);let b=await this.getServerConfig(a);if(!b)return ai.warn(`getServerStatus: Server ${a} not found`),{status:"error",message:`Server ${a} configuration not found. The server may have been deleted or not properly configured.`};if(b.disabled)return ai.debug(`getServerStatus: Server ${a} is disabled`),{status:"disconnected"};if("streamable"===b.transport&&b.oauthScopes&&b.oauthScopes.length>0){if(!b.oauthTokens||!b.oauthTokens.access_token)return ai.info(`getServerStatus: Server ${a} requires OAuth authentication but has no valid tokens`),{status:"requires_authentication",message:"OAuth authentication required. Click the authenticate button to complete the OAuth flow."};if(!b.oauthTokens.refresh_token&&b.oauthTokens.expires_in&&b.oauthTokens.issued_at){let c=b.oauthTokens.issued_at,d=b.oauthTokens.expires_in;if(Math.floor(Date.now()/1e3)>=c+d)return ai.info(`getServerStatus: OAuth tokens for ${a} have expired and no refresh token is available`),{status:"requires_authentication",message:"OAuth tokens have expired. Please re-authenticate."}}}let c=(this.stderrLogs.get(a)||[]).join("\n").trim(),d=this.lastConnectionError.get(a);if(this.getClient(a))return ai.info(`getServerStatus: Server ${a} is connected`),{status:"connected",stderrOutput:c||void 0};{let b=this.isStartingUp()&&!this.lastConnectionError.has(a);if(this.connectingServers.has(a)||b)return ai.info(`getServerStatus: Server ${a} is still connecting`),{status:"connecting",message:"Server is starting up. This may take a few moments."};if(c&&(c.includes("OAuth authentication required")||c.includes("invalid_token")))return ai.info(`getServerStatus: OAuth authentication error detected for ${a}`),{status:"requires_authentication",message:"OAuth authentication required. Please complete the OAuth flow.",stderrOutput:c};let e=c||d;return e?(ai.info(`getServerStatus: Using ${c?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:e,stderrOutput:c||void 0}):(ai.info(`getServerStatus: No specific error details available for ${a}`),{status:"error",message:`Server ${a} is configured but not connected. The server process may have crashed or been terminated.`,stderrOutput:void 0})}}async startEnabledServers(){ai.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ai.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled);ai.info(`Found ${b.length} enabled servers to start`),ai.debug(`${b}`),b.forEach(a=>this.connectingServers.add(a.name)),await Promise.all(b.map(a=>(ai.info(`Starting server: ${a.name}`),this.connectServer(a).catch(b=>{ai.error(`Failed to start server ${a.name}:`,b)}))))}finally{this.setStartingUp(!1)}}async getAvailableClients(){try{let a=await this.loadServerConfigs();if(!a||"error"in a)return ai.warn("getAvailableClients: Failed to load server configs:",a?.error),[];return(await Promise.all(a.map(async a=>{try{let b=await this.getServerStatus(a.name);return{name:a.name,status:"string"==typeof b?b:b.status,connected:"string"==typeof b?"connected"===b:"connected"===b.status}}catch(b){return ai.warn(`getAvailableClients: Error getting status for ${a.name}:`,b),{name:a.name,status:"error",connected:!1}}}))).map(a=>`${a.name} (${a.status})`)}catch(a){return ai.error("getAvailableClients: Error getting available clients:",a),[]}}}let ak=new aj},7573:(a,b,c)=>{"use strict";c.d(b,{s:()=>j});var d=c(37067),e=c.n(d),f=c(44708),g=c.n(f),h=c(78975),i=c(81251);function j(a){let{apiKey:b,baseURL:c,maxRetries:d=2,timeout:f=i.l}=a,j=!c||c.trim().toLowerCase().startsWith("https")?new(g()).Agent({keepAlive:!1}):new(e()).Agent({keepAlive:!1});return new h.Ay({apiKey:b,baseURL:c,httpAgent:j,maxRetries:d,timeout:f})}},17748:(a,b,c)=>{"use strict";c.d(b,{Ah:()=>r,dX:()=>t,jf:()=>o,lO:()=>s,ox:()=>p});var d=c(29021),e=c(33873),f=c(21820),g=c(68780),h=c(50846),i=c(77213),j=c(43326);let k=(0,h.h)("app/api/mcp/utils");function l(a){return k.debug("Entering isLikelyFilePath method"),a.includes(".")&&(a.includes("/")||a.includes("\\")||/\.[a-zA-Z0-9]+$/.test(a))}let m=new Set(["UNABLE_TO_VERIFY_LEAF_SIGNATURE","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","UNABLE_TO_GET_ISSUER_CERT","SELF_SIGNED_CERT_IN_CHAIN","DEPTH_ZERO_SELF_SIGNED_CERT","CERT_HAS_EXPIRED","CERT_UNTRUSTED","ERR_TLS_CERT_ALTNAME_INVALID"]),n=/unable to verify|self[- ]signed certificate|certificate has expired|altname|leaf signature|unable to get local issuer/i;function o(a){let{messages:b,codes:c}=function(a){let b=[],c=[],d=a,e=0;for(;d&&e<10;){if(d instanceof Error){d.message&&b.push(d.message);let a=d.code;"string"==typeof a&&c.push(a)}else"string"==typeof d&&b.push(d);let a=d?.cause,f=d?.errors;if(a)d=a;else if(Array.isArray(f)&&f.length>0)d=f[0];else break;e++}return{messages:b,codes:c}}(a),d=Array.from(new Set(b.filter(Boolean))),e=d.join(": ");e||(e=a instanceof Error?a.message||a.name:String(a));let f=Array.from(new Set(c));return f.length>0&&!f.some(a=>e.includes(a))&&(e+=` (${f.join(", ")})`),(f.some(a=>m.has(a))||d.some(a=>n.test(a)))&&(e+=`
1
+ exports.id=2181,exports.ids=[2181],exports.modules={1133:(a,b,c)=>{"use strict";c.r(b),c.d(b,{MCPService:()=>aj,mcpService:()=>ak});var d=c(37601),e=c(32524),f=c(79748),g=c.n(f),h=c(33873),i=c.n(h),j=c(50846),k=c(43326),l=c(51805),m=c(68780),n=c(73456);let o=(0,j.h)("backend/services/mcp/tools"),p=0x80000000-1;async function q(a,b){if(o.debug("Entering listServerTools method"),!a)return o.warn(`Server ${b} not connected`),{tools:[],error:"Server not connected"};try{o.info(`Listing tools for server ${b}`);let c=await a.listTools();o.verbose("Raw response from MCP server:",c);let d=(c.tools||[]).map(a=>({name:a.name,description:a.description||"",inputSchema:a.inputSchema||{}}));return o.verbose("Processed tools:",d),{tools:d}}catch(c){o.warn(`Failed to list tools for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{tools:[],error:a.includes("Connection timeout")?a:`Failed to list tools: ${a}`}}}async function r(a,b,c,d,e,f){if(o.debug("Entering callTool method"),!a)return o.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};let g=void 0!==e&&e>0?Math.min(1e3*e,p):p;try{o.debug(`Original args for tool ${c}:`,d);let b=await (0,n.c)(d),e=function(a,b){if(!a)return{};let c={};for(let d in a){let e=a[d];null==e?(o.debug(`Normalizing undefined/null value for parameter '${d}' in tool '${b}'`),d.includes("number")||d.endsWith("Count")||d.endsWith("Id")||d.endsWith("Limit")?(c[d]=0,o.debug(`Using default value 0 for likely number parameter: ${d}`)):d.includes("bool")||d.startsWith("is")||d.startsWith("has")||d.startsWith("should")?(c[d]=!1,o.debug(`Using default value false for likely boolean parameter: ${d}`)):d.includes("array")||d.endsWith("s")||d.endsWith("List")||d.endsWith("Items")?(c[d]=[],o.debug(`Using empty array for likely array parameter: ${d}`)):d.includes("object")||d.endsWith("Options")||d.endsWith("Config")||d.endsWith("Settings")?(c[d]={},o.debug(`Using empty object for likely object parameter: ${d}`)):(c[d]="",o.debug(`Using empty string for parameter with unknown type: ${d}`))):c[d]=e}return c}("object"==typeof b&&null!==b?b:{},c);o.debug(`Normalized args for tool ${c}:`,e),o.debug(`Calling tool ${c} with SDK timeout ${g}ms`);let h=await a.callTool({name:c,arguments:e},void 0,{timeout:g,resetTimeoutOnProgress:!0,onprogress:a=>{o.debug(`Progress for tool ${c}: ${a.progress}${void 0!==a.total?`/${a.total}`:""}${a.message?` — ${a.message}`:""}`),f?.(a)}});return{success:!0,data:h}}catch(e){o.warn(`Failed to call tool ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;if(e instanceof m.Nh&&e.code===m.O4.RequestTimeout){let a=Math.round(g/1e3);return o.warn(`Tool ${c} execution timed out after ${a} seconds`),{success:!1,error:`Tool execution timed out after ${a} seconds`,errorType:"timeout",toolName:c,timeout:a,statusCode:408}}if(a.includes("401")||a.includes("Unauthorized")||a.includes("invalid_token")||a.includes("token_expired"))return o.info(`OAuth authentication error detected for tool ${c} on server ${b}`),{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate the server.",statusCode:401,requiresAuthentication:!0};return(a.includes("404")||a.includes("Not Found"))&&(o.info(`404 error detected for tool ${c} on server ${b} - may indicate OAuth issues`),d=404,a="Tool endpoint not found (404). This may indicate OAuth authentication issues or the server may not be properly configured."),e instanceof m.Nh?(a=`Failed to call tool: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code?d=400:-32603===e.code&&(d=500)):a=`Failed to call tool: ${a}`,{success:!1,error:a,statusCode:d}}}let s=(0,j.h)("backend/services/mcp/resources");async function t(a,b){if(s.debug("Entering listServerResources method"),!a)return s.warn(`Server ${b} not connected`),{resources:[],error:"Server not connected"};try{s.info(`Listing resources for server ${b}`);let c=(await a.listResources()).resources||[];return s.verbose("Processed resources:",c),{resources:c}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return s.debug(`Server ${b} does not support resources/list`),{resources:[]};s.warn(`Failed to list resources for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resources:[],error:a.includes("Connection timeout")?a:`Failed to list resources: ${a}`}}}async function u(a,b){if(s.debug("Entering listServerResourceTemplates method"),!a)return s.warn(`Server ${b} not connected`),{resourceTemplates:[],error:"Server not connected"};try{return s.info(`Listing resource templates for server ${b}`),{resourceTemplates:(await a.listResourceTemplates()).resourceTemplates||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return s.debug(`Server ${b} does not support resources/templates/list`),{resourceTemplates:[]};s.warn(`Failed to list resource templates for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{resourceTemplates:[],error:a.includes("Connection timeout")?a:`Failed to list resource templates: ${a}`}}}async function v(a,b,c){if(s.debug("Entering readResource method"),!a)return s.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let d=await (0,n.c)(c);s.info(`Reading resource ${d} from server ${b}`);let e=await a.readResource({uri:d});return{success:!0,data:e}}catch(e){s.warn(`Failed to read resource ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to read resource: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to read resource: ${a}`,{success:!1,error:a,statusCode:d}}}let w=(0,j.h)("backend/services/mcp/prompts");async function x(a,b){if(w.debug("Entering listServerPrompts method"),!a)return w.warn(`Server ${b} not connected`),{prompts:[],error:"Server not connected"};try{return w.info(`Listing prompts for server ${b}`),{prompts:(await a.listPrompts()).prompts||[]}}catch(c){if(c instanceof m.Nh&&-32601===c.code)return w.debug(`Server ${b} does not support prompts/list`),{prompts:[]};w.warn(`Failed to list prompts for server ${b}:`,c);let a=c instanceof Error?c.message:"Unknown error";return{prompts:[],error:a.includes("Connection timeout")?a:`Failed to list prompts: ${a}`}}}async function y(a,b,c,d){if(w.debug("Entering getPrompt method"),!a)return w.warn(`Server ${b} not found`),{success:!1,error:`Server ${b} not found`,statusCode:404};try{let e;if(d&&Object.keys(d).length>0){let a=await (0,n.c)(d);e="object"==typeof a&&null!==a?a:void 0}w.info(`Getting prompt ${c} from server ${b}`);let f=await a.getPrompt({name:c,arguments:e});return{success:!0,data:f}}catch(e){w.warn(`Failed to get prompt ${c} on server ${b}:`,e);let a=e instanceof Error?e.message:"Unknown error",d=500;return e instanceof m.Nh?(a=`Failed to get prompt: ${a} (Code: ${e.code})`,-32601===e.code?d=404:-32602===e.code&&(d=400)):a=`Failed to get prompt: ${a}`,{success:!1,error:a,statusCode:d}}}var z=c(17748),A=c(40829),B=c(27299);let C=new Set(["npx","bunx","uvx","pipx","dlx"]),D=new Set(["pnpm","yarn","bun","npm"]),E=new Set(["dlx","exec","x"]);function F(a,b=[]){let c=((a||"").split(/[\\/]/).filter(Boolean).pop()||"").toLowerCase().replace(/\.(cmd|exe|bat|ps1)$/i,"");if(C.has(c))return!0;if(D.has(c)){let a=(b[0]||"").toLowerCase();return E.has(a)}return!1}function G(a){return"stdio"===a.transport&&F(a.command,a.args??[])}var H=c(4231),I=c(58302),J=c(77823),K=c(72238),L=c(29021),M=c(21820),N=c(77213),O=c(25096);let P=new Set(["node","npm","npx"]);var Q=c(79551);let R=(0,j.h)("backend/services/mcp/roots");function S(){return global.__mcp_node_roots}function T(a){let b=[];for(let c of S().values())if(c.serverName===a)for(let a of c.roots)b.includes(a)||b.push(a);return b}async function U(a){let b=function(a){let b=a.trim();if(!b)return null;if(b.startsWith("file://"))return b;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(b))return R.warn(`Ignoring non-file root URI: ${b}`),null;try{return(0,Q.pathToFileURL)(b).href}catch(a){return R.warn(`Could not convert root "${b}" to a file URI:`,a),null}}(await (0,n.c)(a));return b?{uri:b,name:function(a){try{let b=new URL(a).pathname.replace(/\/+$/,"").split("/").pop();return b?decodeURIComponent(b):void 0}catch{return}}(b)}:null}async function V(a){let b=a.roots,c=[...Array.isArray(b)?b:[],...T(a.name)],d=[],e=new Set;for(let a of c){if("string"!=typeof a||!a.trim())continue;let b=await U(a);b&&!e.has(b.uri)&&(e.add(b.uri),d.push(b))}if(0===d.length&&"string"==typeof a.rootPath&&a.rootPath.trim()){let b=await U(a.rootPath);if(b)return[b]}return d}async function W(a){try{let{loadServerConfigs:b}=await Promise.resolve().then(c.bind(c,51805)),d=await b();if(Array.isArray(d)){let b=d.find(b=>b.name===a.name);if(b)return b}}catch(b){R.warn(`Could not re-load config for ${a.name}, using connect-time config:`,b)}return a}void 0===global.__mcp_node_roots&&(global.__mcp_node_roots=new Map);var X=c(20433),Y=c(48999);let Z=(0,j.h)("backend/services/mcp/sampling");function $(a){return a.sampling}function _(a){let b=$(a);return b?.enabled?JSON.stringify({m:b.modelId,t:b.maxTokens,r:b.maxCallsPerMinute}):""}let aa=(0,j.h)("backend/services/mcp/connection");function ab(a){let b={};if(a)for(let[c,d]of Object.entries(a))d&&"object"==typeof d&&"value"in d?b[c]=d.value:b[c]=d;return b}function ac(a){return JSON.stringify({command:a.command,args:a.args??[],env:ab(a.env),cwd:String(a.cwd??""),rootPath:a.rootPath??""})}function ad(a){return JSON.stringify({transport:a.transport,url:a.serverUrl??"",headers:a.headers??{},requestInit:a.requestInit??{},eventSourceInit:a.eventSourceInit??{},reconnectionOptions:a.reconnectionOptions??{},sessionId:a.sessionId??"",oauthClientId:a.oauthClientId??"",oauthClientInformation:a.oauthClientInformation??{},oauthClientSecret:a.oauthClientSecret??"",oauthTokens:a.oauthTokens??{}})}function ae(a){aa.debug("Entering createNewClient method");let b=function(a){let b=$(a);return!!(b?.enabled&&b.modelId)}(a),c=new H.K({name:`flujo-${a.name}-client`,version:"3.9.1"},{capabilities:{experimental:{},roots:{listChanged:!0},...b?{sampling:{}}:{}}});return c.setRequestHandler(m.WQ,async()=>{let b=await V(await W(a));return R.debug(`roots/list for ${a.name}: ${b.length} root(s)`),{roots:b}}),b&&function(a,b){let c=[];a.setRequestHandler(m.u9,async a=>{let d=$(b);if(!d?.enabled||!d.modelId)throw new m.Nh(m.O4.InvalidRequest,"Sampling is not enabled for this server");let e=d.maxCallsPerMinute??10,f=Date.now(),g=f-6e4;for(;c.length>0&&c[0]<g;)c.shift();if(c.length>=e)throw Z.warn(`Sampling rate limit (${e}/min) hit for ${b.name}`),new m.Nh(m.O4.InvalidRequest,`Sampling rate limit of ${e}/min exceeded`);c.push(f);let h=await X.modelService.getModel(d.modelId);if(!h)throw new m.Nh(m.O4.InternalError,`Sampling model not found: ${d.modelId}`);let i=await X.modelService.resolveAndDecryptApiKey(h.ApiKey);if(!i)throw new m.Nh(m.O4.InternalError,"Could not resolve the sampling model API key");let j=a.params,k=function(a){let b=[];for(let c of(a.systemPrompt&&b.push({role:"system",content:a.systemPrompt}),a.messages||[])){let a=c.content,d=a?.type==="text"&&"string"==typeof a.text?a.text:`[unsupported ${a?.type||"non-text"} content omitted]`;b.push({role:c.role,content:d})}return b}(j),l="number"==typeof j.temperature?j.temperature:.7;Z.info(`Sampling for ${b.name} via model ${h.name} (${k.length} messages)`);let n=(0,Y.getCompletionAdapter)(h),{completion:o}=await n.createCompletion({model:h,apiKey:i,messages:k,temperature:l}),p=o.choices?.[0]?.message?.content;return{role:"assistant",content:{type:"text",text:"string"==typeof p?p:""},model:h.name,stopReason:"endTurn"}})}(c,a),c.__flujoCapKey=_(a),c}function af(a){if(aa.debug("Entering createTransport method"),"streamable"===a.transport){aa.info(`Creating streamable http transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.reconnectionOptions&&"object"==typeof a.reconnectionOptions&&(b.reconnectionOptions=a.reconnectionOptions),"string"==typeof a.sessionId&&a.sessionId.length>0&&(b.sessionId=a.sessionId),a.headers&&"object"==typeof a.headers){let c=Object.fromEntries(Object.entries(a.headers).filter(([a,b])=>a&&"string"==typeof b));Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},aa.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}a.oauthClientId||a.oauthClientInformation?(aa.info(`Setting up OAuth authentication for ${a.name}`),b.authProvider=(0,O.C)(a),a.oauthTokens?.access_token?(aa.debug(`OAuth provider configured for ${a.name} with existing tokens`),aa.debug(`Token expires in: ${a.oauthTokens.expires_in} seconds`)):aa.debug(`OAuth provider configured for ${a.name} - will initiate OAuth flow if needed`)):aa.debug(`No OAuth configuration found for ${a.name}`);let c=new J.j(new URL(a.serverUrl),b);return c.__flujoHttpKey=ad(a),c}if("sse"===a.transport){aa.info(`Creating legacy sse transport for server ${a.name} with URL ${a.serverUrl}`);let b={};if(a.requestInit&&"object"==typeof a.requestInit&&(b.requestInit=a.requestInit),a.eventSourceInit&&"object"==typeof a.eventSourceInit&&(b.eventSourceInit=a.eventSourceInit),a.headers&&"object"==typeof a.headers){let c=Object.fromEntries(Object.entries(a.headers).filter(([a,b])=>a&&"string"==typeof b));Object.keys(c).length>0&&(b.requestInit={...b.requestInit||{},headers:{...b.requestInit?.headers||{},...c}},aa.info(`Applied ${Object.keys(c).length} custom header(s) for ${a.name}: ${Object.keys(c).join(", ")}`))}let c=new K.A(new URL(a.serverUrl),b);return c.__flujoHttpKey=ad(a),c}return"websocket"===a.transport?(aa.info(`Creating WebSocket transport for server ${a.name} with URL ${a.websocketUrl}`),new I.I(new URL(a.websocketUrl))):function(a){if(aa.debug("Entering createStdioTransport method"),"stdio"!==a.transport)throw Error("Cannot create stdio transport for non-stdio config");let b=a.command,c=a.args?[...a.args]:[],e=`${N.VL}/${a.name}`;aa.info(`Creating stdio transport for server ${a.name}`),aa.debug(`Original command: ${b}`),aa.debug(`Original args: ${JSON.stringify(c)}`),aa.debug(`Server directory: ${e}`);let f=!h.isAbsolute(b)&&(b.includes("/")||b.includes("\\")),g=!b.includes("/")&&!b.includes("\\");if(aa.debug(`Is relative path: ${f}`),aa.debug(`Is just filename: ${g}`),"win32"===M.platform()&&b.toLowerCase().endsWith(".bat"))if(aa.debug(`Detected .bat file on Windows: ${b}`),g){let a=h.join((0,k.ok)(),e,b);aa.debug(`Checking if file exists at: ${a}`);let d=L.existsSync(a);aa.debug(`File exists: ${d}`),d?(aa.debug(`Using full path to .bat file: ${a}`),c=["/c",a,...c]):(aa.warn(`WARNING: .bat file not found at ${a}`),c=["/c",b,...c]),b="cmd.exe"}else aa.debug(`Using cmd.exe with path as provided: ${b}`),c=["/c",b,...c],b="cmd.exe";let i=function(a,b){if(!a||!(!a.includes("/")&&!a.includes("\\")))return a;let c=a.toLowerCase();if(!P.has(c))return a;if("node"===c)return b.execPath||a;if(!b.execPath)return a;let d=b.dirname(b.execPath);for(let a of"win32"===b.platform?[`${c}.cmd`,`${c}.exe`,c]:[c]){let c=b.joinPath(d,a);if(b.fileExists(c))return c}return a}(b,{execPath:process.execPath,platform:M.platform(),dirname:h.dirname,joinPath:h.join,fileExists:L.existsSync});i!==b&&(aa.debug(`Resolved Node toolchain command "${b}" to absolute path: ${i}`),b=i),aa.debug(`Final command: ${b}`),aa.debug(`Final args: ${JSON.stringify(c)}`);let j=function({command:a,args:b=[],rootPath:c,cwd:d,serverName:e,defaultCwd:f}){let g=c||d||f;return e&&F(a,b)&&(g.split(/[\\/]/).filter(Boolean).pop()||"")===e&&function(a){let b=a.match(/^(.*[\\/])[^\\/]+[\\/]*$/);return b?b[1].replace(/[\\/]+$/,""):""}(g)||g}({command:a.command,args:a.args,rootPath:a.rootPath,cwd:a.cwd,serverName:a.name,defaultCwd:`${N.VL}/${a.name}`}),l=h.isAbsolute(j)?j:h.join((0,k.ok)(),j);aa.debug(`cwd: ${l}`),aa.debug(`env: ${JSON.stringify(a.env)}`),aa.info(`Creating StdioClientTransport for ${a.name} with stderr: 'pipe'`);let m=ab(a.env);aa.verbose("Transformed environment variables",JSON.stringify(m));let n={command:b,args:c,env:m,cwd:l,stderr:"pipe"},o=new d.oQ(n);return o.__flujoStdioKey=ac(a),o.stderr?aa.info(`Stderr stream is available for ${a.name}`):aa.warn(`Stderr stream is NOT available for ${a.name}`),o}(a)}function ag(a,b){return null!==a.exitCode||null!==a.signalCode?Promise.resolve(!0):new Promise(c=>{let d=()=>{clearTimeout(e),c(!0)},e=setTimeout(()=>{a.removeListener("exit",d),c(!1)},b);e.unref?.(),a.once("exit",d)})}async function ah(a,b,c,e){aa.debug("Entering safelyCloseClient method");let f=e?.gracePeriodMs??15e3,g=e?.killEscalationMs??5e3;try{if(a.transport instanceof d.oQ){let c=a.transport._process;if(c&&null===c.exitCode&&null===c.signalCode){try{c.stdin&&!c.stdin.destroyed&&(c.stdin.end(),aa.debug(`Closed stdin for graceful shutdown for ${b}`))}catch(a){aa.warn(`Error closing stdin for ${b}:`,a)}let a=await ag(c,f);if(!a){aa.warn(`Process did not exit within ${f}ms after stdin close, sending SIGTERM for ${b}`);try{c.kill("SIGTERM")}catch(a){aa.error(`Error sending SIGTERM for ${b}:`,a)}a=await ag(c,g)}if(a)aa.info(`Process exited gracefully for ${b}`);else{aa.warn(`Process did not respond to SIGTERM, sending SIGKILL for ${b}`);try{c.kill("SIGKILL")}catch(a){aa.error(`Error sending SIGKILL for ${b}:`,a)}}}}await a.close(),aa.info(`Client closed successfully for ${b}`)}catch(a){aa.warn(`Error closing client for ${b}:`,a)}}void 0===global.__mcp_recovery&&(global.__mcp_recovery=new Map),void 0===global.__mcp_connecting&&(global.__mcp_connecting=new Set),void 0===global.__mcp_starting_up&&(global.__mcp_starting_up=!0),void 0===global.__mcp_active_transports&&(global.__mcp_active_transports=new Map);let ai=(0,j.h)("backend/services/mcp/index");class aj{get connectingServers(){return global.__mcp_connecting}get activeTransports(){return global.__mcp_active_transports}static{this.MAX_STDERR_LOG_ENTRIES=200}appendStderrLog(a,b){let c=this.stderrLogs.get(a)||[];c.push(b),c.length>aj.MAX_STDERR_LOG_ENTRIES&&c.splice(0,c.length-aj.MAX_STDERR_LOG_ENTRIES),this.stderrLogs.set(a,c)}deregisterClient(a){this.clients.delete(a),this.removeFromGlobalRecovery(a),this.activeTransports.delete(a)}constructor(){this.clients=new Map,this.stderrLogs=new Map,this.lastConnectionError=new Map,this.inFlightConnects=new Map,this.recover_attempted=!1,this.connectionRetryTimers=new Map,this.connectionRetryAttempts=new Map,this.attemptRecovery()}attemptRecovery(){!this.recover_attempted&&global.__mcp_recovery&&global.__mcp_recovery.size>0&&(ai.info(`Attempting to recover ${global.__mcp_recovery.size} clients from global recovery map`),global.__mcp_recovery.forEach((a,b)=>{this.clients.set(b,a),ai.info(`Recovered client for server: ${b}`)})),this.recover_attempted=!0}addToGlobalRecovery(a,b){global.__mcp_recovery||(global.__mcp_recovery=new Map),global.__mcp_recovery.set(a,b),ai.debug(`Added client for server ${a} to global recovery map`)}removeFromGlobalRecovery(a){global.__mcp_recovery&&global.__mcp_recovery.has(a)&&(global.__mcp_recovery.delete(a),ai.debug(`Removed client for server ${a} from global recovery map`))}clearRetryTimer(a){let b=this.connectionRetryTimers.get(a);b&&(clearTimeout(b),this.connectionRetryTimers.delete(a),ai.debug(`Cleared retry timer for server ${a}`))}scheduleConnectionRetry(a,b){this.clearRetryTimer(a);let c=this.connectionRetryAttempts.get(a)||0;if(c>=5){ai.warn(`Maximum retry attempts (5) reached for server ${a}, stopping retries`),this.connectionRetryAttempts.delete(a);return}let d=Math.min(5e3*Math.pow(2,c),3e5);ai.info(`Scheduling connection retry for server ${a} in ${d}ms (attempt ${c+1}/5)`);let e=setTimeout(async()=>{ai.info(`Attempting to reconnect server ${a} (attempt ${c+1}/5)`);let b=await this.getServerConfig(a);if(!b){ai.info(`Server ${a} configuration not found, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}if(b.disabled){ai.info(`Server ${a} is now disabled, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}let d=this.getClient(a);if(d)try{await d.ping({timeout:5e3}),ai.info(`Server ${a} is already connected and responsive, cancelling retry`),this.connectionRetryAttempts.delete(a);return}catch(b){ai.warn(`Server ${a} has a registered client but ping failed (${b instanceof Error?b.message:String(b)}); reconnecting from scratch`)}this.connectionRetryAttempts.set(a,c+1);try{let e=d?await this.forceReconnect(a):await this.connectServer(b);if(e.success)ai.info(`Successfully reconnected server ${a} after ${c+1} attempts`),this.connectionRetryAttempts.delete(a);else{if(ai.warn(`Failed to reconnect server ${a}: ${e.error}`),e.requiresAuthentication){ai.info(`Server ${a} requires authentication, stopping retry attempts`),this.connectionRetryAttempts.delete(a);return}this.scheduleConnectionRetry(a,b)}}catch(c){ai.error(`Error during retry connection for server ${a}:`,c),this.scheduleConnectionRetry(a,b)}},d);this.connectionRetryTimers.set(a,e)}isStartingUp(){return!0===global.__mcp_starting_up}setStartingUp(a){global.__mcp_starting_up=a,ai.info(`Backend startup state set to: ${a?"starting":"complete"}`)}getClient(a){let b=this.clients.get(a);if(!b){let c=global.__mcp_recovery?.get(a);c&&(this.clients.set(a,c),b=c,ai.debug(`getClient: adopted ${a} from the global recovery map`))}return ai.debug(`getClient: Looking for client: ${a}`,b?"Found":"Not found"),b}async loadServerConfigs(){ai.debug("loadServerConfigs: Entering method");try{let a=await (0,l.loadServerConfigs)();if(!Array.isArray(a))return ai.warn("loadServerConfigs: Received non-array response",a),a;return ai.debug(`loadServerConfigs: Loaded ${a.length} server configs`),a}catch(a){return ai.warn("loadServerConfigs: Failed to load server configs:",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async getServerConfig(a){ai.debug(`getServerConfig: Looking up config for server ${a}`);let b=await this.loadServerConfigs();if(!Array.isArray(b))return ai.warn(`getServerConfig: Failed to load configs for ${a}:`,b.error),null;let c=b.find(b=>b.name===a);return c||(ai.warn(`getServerConfig: Server ${a} not found in configs`),null)}async isServerDisabled(a){let b=await this.getServerConfig(a);return b?.disabled===!0}async connectServer(a){let b="string"==typeof a?a:a.name,c=this.inFlightConnects.get(b);if(c)return ai.debug(`connectServer: reusing in-flight connection attempt for ${b}`),c;let d=this.connectServerInternal(a).finally(()=>{this.inFlightConnects.delete(b)});return this.inFlightConnects.set(b,d),d}async connectServerInternal(a){let b;if("string"==typeof a){ai.info(`connectServer: Looking up config for server ${a}`);let c=await this.getServerConfig(a);if(!c)return ai.warn(`connectServer: Server ${a} not found in configs`),{success:!1,error:`Server configuration for "${a}" not found. The server may have been deleted or not properly configured.`};b=c}else b=a;if((("string"==typeof a?b:await this.getServerConfig(b.name))??b).disabled)return ai.info(`connectServer: Server ${b.name} is disabled — refusing to create a client/transport`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!1,error:`Server '${b.name}' is disabled. Enable it on the MCP page to use it.`};let c=(0,e.A)();ai.info(`connectServer: Starting connection for server ${b.name} [RequestID: ${c}]`),this.connectingServers.add(b.name);try{this.stderrLogs.set(b.name,[]);let a=this.clients.get(b.name);if(a){let{needsNewClient:c,reason:e}=function(a,b){if(aa.debug("Entering shouldRecreateClient method"),(a.__flujoCapKey??"")!==_(b))return{needsNewClient:!0,reason:"Client capabilities (sampling) changed"};if("websocket"===b.transport){if(!(a.transport instanceof I.I))return{needsNewClient:!0,reason:"Transport type changed to websocket"}}else if("streamable"===b.transport){if(!(a.transport instanceof J.j))return{needsNewClient:!0,reason:"Transport type changed to streamable"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"Streamable server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing streamable transport has no config key"};if(e!==ad(b))return{needsNewClient:!0,reason:"Streamable auth/connection parameters changed"}}else if("sse"===b.transport){if(!(a.transport instanceof K.A))return{needsNewClient:!0,reason:"Transport type changed to sse"};let c=a.transport,d=c._url?.toString();if(void 0!==d&&d!==new URL(b.serverUrl).toString())return{needsNewClient:!0,reason:"SSE server URL changed"};let e=c.__flujoHttpKey;if(!e)return{needsNewClient:!0,reason:"Existing sse transport has no config key"};if(e!==ad(b))return{needsNewClient:!0,reason:"SSE auth/connection parameters changed"}}else{if(!(a.transport instanceof d.oQ))return{needsNewClient:!0,reason:"Transport type changed to stdio"};if("stdio"!==b.transport)return{needsNewClient:!0,reason:"Transport type changed from stdio"};let c=a.transport.__flujoStdioKey;if(!c)return{needsNewClient:!0,reason:"Existing stdio transport has no config key"};if(c!==ac(b))return{needsNewClient:!0,reason:"Connection parameters changed"}}return{needsNewClient:!1}}(a,b);if(!c)return ai.info(`connectServer: Server ${b.name} is already connected`),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),{success:!0};ai.info(`connectServer: Existing client for ${b.name} is stale (${e}), recreating`),this.deregisterClient(b.name);try{await ah(a,b.name,b)}catch(a){ai.debug(`connectServer: error closing stale client for ${b.name}: ${a instanceof Error?a.message:String(a)}`)}a=void 0}a=ae(b);let c=af(b);if(c instanceof d.oQ&&c.stderr){let a=b.name;c.stderr.on("data",b=>{let c=b.toString();ai.warn(`stderr: [${a}]: ${c}`),this.appendStderrLog(a,c)})}return await a.connect(c),c.onclose=()=>{if(this.activeTransports.get(b.name)!==c)return void ai.debug(`connectServer: ignoring close event from a stale/deregistered transport for ${b.name}`);ai.warn(`connectServer: Connection closed for server ${b.name}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ai.info(`Server ${b.name} is now disabled, skipping reconnection logic`);ai.info(`Connection closed for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ai.warn(`Error checking server config for ${b.name} during onclose:`,a)})},c.onerror=a=>{if((0,z.lO)(a))return void ai.debug(`connectServer: transient SSE stream disconnect for ${b.name} (self-healing, ignored): ${a instanceof Error?a.message:String(a)}`);if(this.activeTransports.get(b.name)!==c)return void ai.debug(`connectServer: ignoring error event from a stale/deregistered transport for ${b.name}`);if(ai.error(`connectServer: Transport error for server ${b.name}:`),a instanceof Error){ai.error(`Error name: ${a.name}`),ai.error(`Error message: ${a.message}`),ai.error(`Error stack: ${a.stack}`);let b=a.code;void 0!==b&&ai.error(`Error code: ${b}`),ai.error(`Error chain: ${(0,z.jf)(a)}`)}else if(a&&"object"==typeof a){ai.error(`Error type: ${typeof a}`),ai.error(`Error constructor: ${a.constructor?.name||"Unknown"}`);let b=Object.getOwnPropertyNames(a);b.length>0?(ai.error(`Error properties: ${b.join(", ")}`),b.forEach(b=>{try{let c=a[b];ai.error(` ${b}: ${"function"==typeof c?"[Function]":JSON.stringify(c)}`)}catch(a){ai.error(` ${b}: [Unable to serialize: ${a}]`)}})):ai.error("Error object has no enumerable properties");try{let b=JSON.stringify(a);ai.error(`JSON stringified error: ${b}`)}catch(a){ai.error(`Cannot JSON stringify error: ${a}`)}}else ai.error(`Error value: ${String(a)} (type: ${typeof a})`);this.appendStderrLog(b.name,`Transport error: ${(0,z.jf)(a)}`),this.deregisterClient(b.name),this.getServerConfig(b.name).then(a=>{if(!a||a.disabled)return void ai.info(`Server ${b.name} is now disabled, skipping reconnection after transport error`);ai.info(`Transport error for enabled server ${b.name}, scheduling reconnection`),this.scheduleConnectionRetry(b.name,a)}).catch(a=>{ai.warn(`Error checking server config for ${b.name} during onerror:`,a)})},this.clients.set(b.name,a),this.activeTransports.set(b.name,c),this.addToGlobalRecovery(b.name,a),this.lastConnectionError.delete(b.name),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name),ai.info(`connectServer: Successfully connected to ${b.name}`),{success:!0}}catch(f){ai.error(`connectServer: Failed to connect to server ${b.name}:`,f);let a=f instanceof Error?f.message:String(f),c=f instanceof Error?f.name:"";if(a.includes("OAuth authentication required")||"OAuthAuthenticationRequired"===c){if(ai.info(`OAuth authentication required for server ${b.name}`),"streamable"===b.transport){let a=b;a.authorizationUrl&&ai.info(`Authorization URL available for ${b.name}: ${a.authorizationUrl}`)}return{success:!1,error:a,requiresAuthentication:!0}}if((0,z.Ah)(f)){if(ai.info(`OAuth authentication error detected for server ${b.name}: ${a}`),"streamable"===b.transport){let a=b;if(!a.oauthScopes||0===a.oauthScopes.length){ai.info(`Dynamically enabling OAuth for server ${b.name} due to authentication error`);try{let c={...a,oauthScopes:["read"]},d=await this.loadServerConfigs();if(Array.isArray(d)){let a=d.findIndex(a=>a.name===b.name);-1!==a&&(d[a]=c,await (0,l.q)(new Map(d.map(a=>[a.name,a]))),ai.info(`Updated config for ${b.name} to enable OAuth`))}}catch(a){ai.warn(`Failed to update config for ${b.name} to enable OAuth:`,a)}}}return{success:!1,error:"OAuth authentication failed or tokens have expired. Please re-authenticate.",requiresAuthentication:!0}}let d=this.stderrLogs.get(b.name)||[],e=(0,z.ox)(f,b,d);return this.lastConnectionError.set(b.name,e),{success:!1,error:e}}finally{this.connectingServers.delete(b.name)}}async testConnection(a){ai.info(`testConnection: Testing connection to ${a.name||"(unnamed)"} via ${a.transport} transport`);let b=[],c=null,e=null;try{let f;c=ae(a),(e=af(a))instanceof d.oQ&&e.stderr&&e.stderr.on("data",a=>{b.push(a.toString())}),e.onerror=a=>{b.push(`Transport error: ${(0,z.jf)(a)}`)};let g=G(a)?9e4:15e3,h=G(a),i=new Promise((a,b)=>{f=setTimeout(()=>b(Error(`Connection timeout after ${g/1e3}s`+(h?" — the package may still be downloading via npx/uvx. Try running the Test again (the package is cached after the first download), or verify the command and network access.":""))),g)});try{await Promise.race([c.connect(e),i])}finally{f&&clearTimeout(f)}let j=0;try{let a=await c.listTools();j=Array.isArray(a?.tools)?a.tools.length:0}catch(b){ai.debug(`testConnection: connected to ${a.name} but listTools failed: ${b instanceof Error?b.message:String(b)}`)}return ai.info(`testConnection: Successfully connected to ${a.name} (${j} tools)`),{success:!0,data:{toolCount:j}}}catch(d){ai.warn(`testConnection: Failed to connect to ${a.name}:`,d);let c=(0,z.Ah)(d);return{success:!1,error:(0,z.ox)(d,a,b),requiresAuthentication:c}}finally{if(c)try{await ah(c,a.name,a,{gracePeriodMs:3e3,killEscalationMs:2e3})}catch(b){ai.debug(`testConnection: error closing test client for ${a.name}: ${b instanceof Error?b.message:String(b)}`)}}}setNodeRoots(a,b,c){for(let d of function(a,b,c){let d=(c??[]).filter(a=>"string"==typeof a&&a.trim().length>0),e=S().get(b),f=new Set([a]);e&&f.add(e.serverName);let g=new Map;for(let a of f)g.set(a,T(a));0===d.length?S().delete(b)&&R.debug(`Cleared node roots for node ${b}`):(S().set(b,{serverName:a,roots:d}),R.debug(`Registered ${d.length} node root(s) for node ${b} on server ${a}`));let h=[];for(let a of f){let b=T(a),c=g.get(a)??[];(b.length!==c.length||b.some((a,b)=>a!==c[b]))&&h.push(a)}return h}(a,b,c))this.notifyRootsChanged(d)}notifyRootsChanged(a){let b=this.getClient(a);if(!b)return void ai.debug(`notifyRootsChanged: ${a} not connected, skipping notification`);try{b.sendRootsListChanged().catch(b=>{ai.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}),ai.debug(`notifyRootsChanged: sent roots/list_changed to ${a}`)}catch(b){ai.warn(`notifyRootsChanged: failed to notify ${a}:`,b)}}async disconnectServer(a){ai.debug(`disconnectServer: Entering method for server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a);let b=this.getClient(a);if(!b)return ai.warn(`disconnectServer: Server ${a} not found in clients map`),this.removeFromGlobalRecovery(a),this.activeTransports.delete(a),{success:!1,error:`Server ${a} not found`};this.deregisterClient(a);try{let c=await this.getServerConfig(a);return await ah(b,a,c||void 0),ai.info(`disconnectServer: Disconnected server ${a}`),{success:!0}}catch(b){return ai.warn(`disconnectServer: Failed to disconnect server ${a}:`,b),{success:!1,error:`Failed to disconnect server: ${b instanceof Error?b.message:"Unknown error"}`}}}async forceReconnect(a){ai.info(`forceReconnect: Forcing fresh connection for server ${a}`);let b=this.clients.get(a);if(b){this.deregisterClient(a);let c=await this.getServerConfig(a);try{await ah(b,a,c||void 0)}catch(b){ai.debug(`forceReconnect: error closing stale client for ${a}: ${b instanceof Error?b.message:String(b)}`)}}return this.connectServer(a)}async listServerTools(a){if(ai.debug(`listServerTools: Entering method for server ${a}`),await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`listServerTools: ${b}`),{tools:[],error:b}}let b=this.getClient(a);b||ai.warn(`listServerTools: Client not found for ${a}`);let c=await q(b,a);if(c.error){ai.warn(`listServerTools: Listing tools for ${a} failed (${c.error}); forcing reconnect and retrying once`);let d=await this.forceReconnect(a);if(!d.success)return ai.warn(`listServerTools: Reconnect for ${a} failed: ${d.error}`),{tools:[],error:d.error||c.error};b=this.clients.get(a),(c=await q(b,a)).error?ai.warn(`listServerTools: Retry after reconnect still failed for ${a}:`,c.error):ai.info(`listServerTools: Recovered after reconnect for ${a}; listed ${c.tools.length} tools`)}else ai.info(`listServerTools: Listed ${c.tools.length} tools for ${a}`);return c}async callTool(a,b,c,d,e){if(ai.debug(`callTool: Entering method for server ${a}, tool ${b}`),await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`callTool: ${b}`),{success:!1,error:b}}let f=this.getClient(a);if(!f){ai.warn(`callTool: No client for ${a}; forcing reconnect before calling ${b}`);let c=await this.forceReconnect(a);c.success?f=this.clients.get(a):ai.warn(`callTool: Reconnect for ${a} failed: ${c.error}`)}let g=await r(f,a,b,c,d,e);return ai.info(`callTool: Called tool ${b} on ${a}`),g}async listWithReconnect(a,b,c){if(await this.isServerDisabled(a)){let b=`Server '${a}' is disabled. Enable it on the MCP page to use it.`;return ai.warn(`listWithReconnect: ${b}`),{...c,error:b}}let d=this.clients.get(a);d||ai.warn(`listWithReconnect: Client not found for ${a}`);let e=await b(d,a);if(!e.error)return e;ai.warn(`listWithReconnect: Listing for ${a} failed (${e.error}); forcing reconnect and retrying once`);let f=await this.forceReconnect(a);return f.success?(d=this.clients.get(a),(e=await b(d,a)).error?ai.warn(`listWithReconnect: Retry after reconnect still failed for ${a}:`,e.error):ai.info(`listWithReconnect: Recovered after reconnect for ${a}`),e):(ai.warn(`listWithReconnect: Reconnect for ${a} failed: ${f.error}`),{...c,error:f.error||e.error})}async listServerResources(a){return ai.debug(`listServerResources: Entering method for server ${a}`),this.listWithReconnect(a,t,{resources:[]})}async listServerResourceTemplates(a){return ai.debug(`listServerResourceTemplates: Entering method for server ${a}`),this.listWithReconnect(a,u,{resourceTemplates:[]})}async readResource(a,b){ai.debug(`readResource: Entering method for server ${a}, uri ${b}`);let c=this.clients.get(a);c||ai.warn(`readResource: Client not found for ${a}`);let d=await v(c,a,b);return ai.info(`readResource: Read resource ${b} on ${a}`),d}async listServerPrompts(a){return ai.debug(`listServerPrompts: Entering method for server ${a}`),this.listWithReconnect(a,x,{prompts:[]})}async getPrompt(a,b,c){ai.debug(`getPrompt: Entering method for server ${a}, prompt ${b}`);let d=this.clients.get(a);d||ai.warn(`getPrompt: Client not found for ${a}`);let e=await y(d,a,b,c);return ai.info(`getPrompt: Got prompt ${b} on ${a}`),e}async resolveOAuthSecretForSave(a,b){return a===B.RJ?b??"":a?a.startsWith("${global:")||a.startsWith("encrypted:")||a.startsWith("encrypted_failed:")?a:await (0,A.Rs)(a):""}async ensureRemoteServerRootDir(a){try{if(!["streamable","sse","websocket"].includes(a.transport))return;let b=(a.rootPath||"").trim();if(!b)return;let c=i().resolve((0,k.ok)(),b);if(i().dirname(c)===c)return;await g().mkdir(c,{recursive:!0}),ai.debug(`ensureRemoteServerRootDir: ensured ${c} for ${a.name}`)}catch(b){ai.warn(`ensureRemoteServerRootDir: could not create root dir for ${a.name}:`,b)}}async updateServerConfig(a,b){ai.debug(`updateServerConfig: Entering method for server ${a}`);let c=await this.loadServerConfigs();if(!Array.isArray(c))return ai.warn("updateServerConfig: Failed to load configs:",c.error),c;let d=c.find(b=>b.name===a),e=!!d&&"string"==typeof b.name&&b.name!==a;if(e&&c.some(a=>a.name===b.name))return ai.warn(`updateServerConfig: Refusing to rename ${a} -> ${b.name}: name already in use`),{success:!1,error:`A server named "${b.name}" already exists`};if(!d&&b.name)ai.info(`updateServerConfig: Creating new server config for ${b.name}`),d={name:b.name,transport:"stdio",command:"",args:[],env:{},disabled:!1,autoApprove:[],_buildCommand:"",_installCommand:"",rootPath:""},c.push(d);else if(!d)return ai.warn(`updateServerConfig: Server ${a} not found`),{success:!1,error:`Server ${a} not found`};if(b.env){ai.debug(`updateServerConfig: Resolving global variables in env for ${a}`);try{ai.debug(`Original env variables for ${a}:`,JSON.stringify(b.env,null,2)),b.env=await (0,n.c)(b.env),ai.debug(`Resolved env variables for ${a}:`,JSON.stringify(b.env,null,2)),ai.debug(`updateServerConfig: Successfully resolved global variables for ${a}`)}catch(b){ai.warn(`updateServerConfig: Error resolving global variables for ${a}:`,b)}}let f=b.oauthClientSecret;if(void 0!==f){let a=d.oauthClientSecret;b.oauthClientSecret=await this.resolveOAuthSecretForSave(f,a)}let g={...d};g={...d,...b};let h=JSON.stringify(d.roots??[])!==JSON.stringify(g.roots??[])||(d.rootPath??"")!==(g.rootPath??""),i=c.findIndex(b=>b.name===a);-1!==i?c[i]=g:g.name&&c.push(g);let j=await (0,l.q)(new Map(c.map(a=>[a.name,a])));return j.success?(await this.ensureRemoteServerRootDir(g),e?(this.clients.has(a)?await this.disconnectServer(a):(this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a)),this.removeFromGlobalRecovery(a),this.stderrLogs.delete(a),this.lastConnectionError.delete(a),await this.handleConnectionStateChange(g.name,g)):await this.handleConnectionStateChange(a,g),h&&this.notifyRootsChanged(g.name),ai.info(`updateServerConfig: Successfully updated config for ${a}${e?` (renamed to ${g.name})`:""}`),g):(ai.warn(`updateServerConfig: Failed to save config for ${a}:`,j.error),j)}async handleConnectionStateChange(a,b){ai.debug(`handleConnectionStateChange: Entering method for server ${a}`);let c=!!this.getClient(a),d=!b.disabled;if(c&&!d){ai.info(`handleConnectionStateChange: Disconnecting disabled server ${a}`);try{await this.disconnectServer(a)}catch(b){ai.warn(`handleConnectionStateChange: Failed to disconnect server ${a} during update:`,b)}}else!c&&d?(ai.info(`handleConnectionStateChange: Connecting previously disabled server ${a}`),await this.connectServer(b)):c&&d?(ai.info(`handleConnectionStateChange: Re-applying config to connected server ${a}`),await this.connectServer(b)):d||(ai.info(`handleConnectionStateChange: Clearing retry timers for disabled server ${a}`),this.clearRetryTimer(a),this.connectionRetryAttempts.delete(a))}async clearRetryTimersForDisabledServers(){ai.debug("clearRetryTimersForDisabledServers: Checking for disabled servers with active retry timers");try{let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ai.warn("clearRetryTimersForDisabledServers: Failed to load server configs");for(let b of a.filter(a=>a.disabled))this.connectionRetryTimers.has(b.name)&&(ai.info(`clearRetryTimersForDisabledServers: Clearing retry timer for disabled server ${b.name}`),this.clearRetryTimer(b.name),this.connectionRetryAttempts.delete(b.name))}catch(a){ai.error("clearRetryTimersForDisabledServers: Error clearing retry timers:",a)}}async deleteServerConfig(a){ai.debug(`deleteServerConfig: Entering method for server ${a}`),this.clients.has(a)&&(ai.info(`deleteServerConfig: Disconnecting server ${a} before deletion`),await this.disconnectServer(a));let b=await this.loadServerConfigs();if(!Array.isArray(b))return ai.warn("deleteServerConfig: Failed to load configs:",b.error),b;let c=b.findIndex(b=>b.name===a);if(-1===c)return ai.warn(`deleteServerConfig: Server ${a} not found in configs`),{success:!1,error:`Server ${a} not found`};b.splice(c,1),ai.debug(`deleteServerConfig: Saving updated configs after deleting ${a}`);let d=await (0,l.q)(new Map(b.map(a=>[a.name,a])));return d.success?ai.info(`deleteServerConfig: Successfully deleted server ${a}`):ai.warn(`deleteServerConfig: Error saving configs after deleting ${a}:`,d.error),d}async getServerStatus(a){this.getClient(a);let b=await this.getServerConfig(a);if(!b)return ai.warn(`getServerStatus: Server ${a} not found`),{status:"error",message:`Server ${a} configuration not found. The server may have been deleted or not properly configured.`};if(b.disabled)return ai.debug(`getServerStatus: Server ${a} is disabled`),{status:"disconnected"};if("streamable"===b.transport&&b.oauthScopes&&b.oauthScopes.length>0){if(!b.oauthTokens||!b.oauthTokens.access_token)return ai.info(`getServerStatus: Server ${a} requires OAuth authentication but has no valid tokens`),{status:"requires_authentication",message:"OAuth authentication required. Click the authenticate button to complete the OAuth flow."};if(!b.oauthTokens.refresh_token&&b.oauthTokens.expires_in&&b.oauthTokens.issued_at){let c=b.oauthTokens.issued_at,d=b.oauthTokens.expires_in;if(Math.floor(Date.now()/1e3)>=c+d)return ai.info(`getServerStatus: OAuth tokens for ${a} have expired and no refresh token is available`),{status:"requires_authentication",message:"OAuth tokens have expired. Please re-authenticate."}}}let c=(this.stderrLogs.get(a)||[]).join("\n").trim(),d=this.lastConnectionError.get(a);if(this.getClient(a))return ai.info(`getServerStatus: Server ${a} is connected`),{status:"connected",stderrOutput:c||void 0};{let b=this.isStartingUp()&&!this.lastConnectionError.has(a);if(this.connectingServers.has(a)||b)return ai.info(`getServerStatus: Server ${a} is still connecting`),{status:"connecting",message:"Server is starting up. This may take a few moments."};if(c&&(c.includes("OAuth authentication required")||c.includes("invalid_token")))return ai.info(`getServerStatus: OAuth authentication error detected for ${a}`),{status:"requires_authentication",message:"OAuth authentication required. Please complete the OAuth flow.",stderrOutput:c};let e=c||d;return e?(ai.info(`getServerStatus: Using ${c?"stderr output":"persisted connection error"} as error message for ${a}`),{status:"error",message:e,stderrOutput:c||void 0}):(ai.info(`getServerStatus: No specific error details available for ${a}`),{status:"error",message:`Server ${a} is configured but not connected. The server process may have crashed or been terminated.`,stderrOutput:void 0})}}async startEnabledServers(){ai.info("Starting all enabled servers"),this.setStartingUp(!0);try{await this.clearRetryTimersForDisabledServers();let a=await this.loadServerConfigs();if(!Array.isArray(a))return void ai.warn("Failed to load server configs, cannot start servers");let b=a.filter(a=>!a.disabled);ai.info(`Found ${b.length} enabled servers to start`),ai.debug(`${b}`),b.forEach(a=>this.connectingServers.add(a.name)),await Promise.all(b.map(a=>(ai.info(`Starting server: ${a.name}`),this.connectServer(a).catch(b=>{ai.error(`Failed to start server ${a.name}:`,b)}))))}finally{this.setStartingUp(!1)}}async getAvailableClients(){try{let a=await this.loadServerConfigs();if(!a||"error"in a)return ai.warn("getAvailableClients: Failed to load server configs:",a?.error),[];return(await Promise.all(a.map(async a=>{try{let b=await this.getServerStatus(a.name);return{name:a.name,status:"string"==typeof b?b:b.status,connected:"string"==typeof b?"connected"===b:"connected"===b.status}}catch(b){return ai.warn(`getAvailableClients: Error getting status for ${a.name}:`,b),{name:a.name,status:"error",connected:!1}}}))).map(a=>`${a.name} (${a.status})`)}catch(a){return ai.error("getAvailableClients: Error getting available clients:",a),[]}}}let ak=new aj},7573:(a,b,c)=>{"use strict";c.d(b,{s:()=>j});var d=c(37067),e=c.n(d),f=c(44708),g=c.n(f),h=c(78975),i=c(81251);function j(a){let{apiKey:b,baseURL:c,maxRetries:d=2,timeout:f=i.l}=a,j=!c||c.trim().toLowerCase().startsWith("https")?new(g()).Agent({keepAlive:!1}):new(e()).Agent({keepAlive:!1});return new h.Ay({apiKey:b,baseURL:c,httpAgent:j,maxRetries:d,timeout:f})}},17748:(a,b,c)=>{"use strict";c.d(b,{Ah:()=>r,dX:()=>t,jf:()=>o,lO:()=>s,ox:()=>p});var d=c(29021),e=c(33873),f=c(21820),g=c(68780),h=c(50846),i=c(77213),j=c(43326);let k=(0,h.h)("app/api/mcp/utils");function l(a){return k.debug("Entering isLikelyFilePath method"),a.includes(".")&&(a.includes("/")||a.includes("\\")||/\.[a-zA-Z0-9]+$/.test(a))}let m=new Set(["UNABLE_TO_VERIFY_LEAF_SIGNATURE","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","UNABLE_TO_GET_ISSUER_CERT","SELF_SIGNED_CERT_IN_CHAIN","DEPTH_ZERO_SELF_SIGNED_CERT","CERT_HAS_EXPIRED","CERT_UNTRUSTED","ERR_TLS_CERT_ALTNAME_INVALID"]),n=/unable to verify|self[- ]signed certificate|certificate has expired|altname|leaf signature|unable to get local issuer/i;function o(a){let{messages:b,codes:c}=function(a){let b=[],c=[],d=a,e=0;for(;d&&e<10;){if(d instanceof Error){d.message&&b.push(d.message);let a=d.code;"string"==typeof a&&c.push(a)}else"string"==typeof d&&b.push(d);let a=d?.cause,f=d?.errors;if(a)d=a;else if(Array.isArray(f)&&f.length>0)d=f[0];else break;e++}return{messages:b,codes:c}}(a),d=Array.from(new Set(b.filter(Boolean))),e=d.join(": ");e||(e=a instanceof Error?a.message||a.name:String(a));let f=Array.from(new Set(c));return f.length>0&&!f.some(a=>e.includes(a))&&(e+=` (${f.join(", ")})`),(f.some(a=>m.has(a))||d.some(a=>n.test(a)))&&(e+=`
2
2
 
3
3
  This looks like a TLS certificate trust problem: the server presents a certificate signed by a custom/private CA that Node.js does not trust by default.
4
4
  To fix it, start FLUJO so Node trusts your CA:
@@ -1,3 +1,3 @@
1
1
  exports.id=2776,exports.ids=[2776],exports.modules={11525:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,81170,23)),Promise.resolve().then(c.t.bind(c,23597,23)),Promise.resolve().then(c.t.bind(c,36893,23)),Promise.resolve().then(c.t.bind(c,89748,23)),Promise.resolve().then(c.t.bind(c,6060,23)),Promise.resolve().then(c.t.bind(c,7184,23)),Promise.resolve().then(c.t.bind(c,69576,23)),Promise.resolve().then(c.t.bind(c,73041,23)),Promise.resolve().then(c.t.bind(c,51384,23))},13516:(a,b,c)=>{"use strict";c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},19815:(a,b,c)=>{"use strict";c.d(b,{h:()=>i});let d={LOG_LEVEL:3},e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.LOG_LEVEL?d.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
- ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},24677:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,54160,23)),Promise.resolve().then(c.t.bind(c,31603,23)),Promise.resolve().then(c.t.bind(c,68495,23)),Promise.resolve().then(c.t.bind(c,75170,23)),Promise.resolve().then(c.t.bind(c,55145,23)),Promise.resolve().then(c.t.bind(c,78922,23)),Promise.resolve().then(c.t.bind(c,29234,23)),Promise.resolve().then(c.t.bind(c,34644,23)),Promise.resolve().then(c.bind(c,82146))},30301:(a,b,c)=>{Promise.resolve().then(c.bind(c,41306))},41306:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"C:\\\\Users\\\\MarioAndreschak\\\\Documents\\\\GitHub\\\\FLUJO\\\\src\\\\frontend\\\\components\\\\AppWrapper.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx","default")},41917:(a,b,c)=>{Promise.resolve().then(c.bind(c,49428))},49428:(a,b,c)=>{"use strict";c.d(b,{default:()=>p});var d=c(21124),e=c(38301),f=c.n(e),g=c(13973);let h=(0,c(19815).h)("frontend/components/AppWrapper"),i=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/ThemeContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading theme..."})}),j=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/StorageContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading storage..."})}),k=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Navigation"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading navigation..."})}),l=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./EncryptionAuthDialog"]},ssr:!1,loading:()=>null}),m=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/TourContext"]},ssr:!1,loading:()=>null}),n=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Tour/TourOverlay"]},ssr:!1,loading:()=>null});class o extends f().Component{constructor(a){super(a),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(a){h.error("AppWrapper error boundary caught an error:",a)}render(){return this.state.hasError?(0,d.jsxs)("div",{style:{padding:"20px",textAlign:"center"},children:[(0,d.jsx)("h2",{children:"Something went wrong loading the application."}),(0,d.jsx)("p",{children:"Please try refreshing the page."}),(0,d.jsx)("button",{onClick:()=>window.location.reload(),style:{padding:"8px 16px",background:"#3498DB",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",marginTop:"10px"},children:"Refresh"})]}):this.props.children}}function p({children:a}){return h.debug("Rendering AppWrapper"),(0,d.jsx)(o,{children:(0,d.jsx)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading application..."}),children:(0,d.jsx)(i,{children:(0,d.jsx)(j,{children:(0,d.jsxs)(m,{children:[(0,d.jsxs)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading navigation..."}),children:[(0,d.jsx)(k,{}),(0,d.jsx)(l,{})]}),(0,d.jsx)("main",{children:a}),(0,d.jsx)(n,{})]})})})})})}},50846:(a,b,c)=>{"use strict";c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
2
+ ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},24677:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,54160,23)),Promise.resolve().then(c.t.bind(c,31603,23)),Promise.resolve().then(c.t.bind(c,68495,23)),Promise.resolve().then(c.t.bind(c,75170,23)),Promise.resolve().then(c.t.bind(c,77526,23)),Promise.resolve().then(c.t.bind(c,78922,23)),Promise.resolve().then(c.t.bind(c,29234,23)),Promise.resolve().then(c.t.bind(c,12263,23)),Promise.resolve().then(c.bind(c,82146))},30301:(a,b,c)=>{Promise.resolve().then(c.bind(c,41306))},41306:(a,b,c)=>{"use strict";c.d(b,{default:()=>d});let d=(0,c(97954).registerClientReference)(function(){throw Error("Attempted to call the default export of \"C:\\\\Users\\\\MarioAndreschak\\\\Documents\\\\GitHub\\\\FLUJO\\\\src\\\\frontend\\\\components\\\\AppWrapper.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"C:\\Users\\MarioAndreschak\\Documents\\GitHub\\FLUJO\\src\\frontend\\components\\AppWrapper.tsx","default")},41917:(a,b,c)=>{Promise.resolve().then(c.bind(c,49428))},49428:(a,b,c)=>{"use strict";c.d(b,{default:()=>p});var d=c(21124),e=c(38301),f=c.n(e),g=c(13973);let h=(0,c(19815).h)("frontend/components/AppWrapper"),i=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/ThemeContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading theme..."})}),j=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/StorageContext"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading storage..."})}),k=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Navigation"]},ssr:!1,loading:()=>(0,d.jsx)("div",{children:"Loading navigation..."})}),l=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./EncryptionAuthDialog"]},ssr:!1,loading:()=>null}),m=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ../contexts/TourContext"]},ssr:!1,loading:()=>null}),n=(0,g.default)(async()=>{},{loadableGenerated:{modules:["frontend\\components\\AppWrapper.tsx -> ./Tour/TourOverlay"]},ssr:!1,loading:()=>null});class o extends f().Component{constructor(a){super(a),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(a){h.error("AppWrapper error boundary caught an error:",a)}render(){return this.state.hasError?(0,d.jsxs)("div",{style:{padding:"20px",textAlign:"center"},children:[(0,d.jsx)("h2",{children:"Something went wrong loading the application."}),(0,d.jsx)("p",{children:"Please try refreshing the page."}),(0,d.jsx)("button",{onClick:()=>window.location.reload(),style:{padding:"8px 16px",background:"#3498DB",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",marginTop:"10px"},children:"Refresh"})]}):this.props.children}}function p({children:a}){return h.debug("Rendering AppWrapper"),(0,d.jsx)(o,{children:(0,d.jsx)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading application..."}),children:(0,d.jsx)(i,{children:(0,d.jsx)(j,{children:(0,d.jsxs)(m,{children:[(0,d.jsxs)(e.Suspense,{fallback:(0,d.jsx)("div",{children:"Loading navigation..."}),children:[(0,d.jsx)(k,{}),(0,d.jsx)(l,{})]}),(0,d.jsx)("main",{children:a}),(0,d.jsx)(n,{})]})})})})})}},50846:(a,b,c)=>{"use strict";c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
3
3
  ${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},51472:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>m,metadata:()=>l});var d=c(75338),e=c(94294),f=c.n(e),g=c(81464),h=c.n(g);c(61135);var i=c(50846),j=c(41306);let k=(0,i.h)("app/layout"),l={title:"FLUJO",description:"A browser-based application for managing models, MCP servers, flows and chat interactions"};function m({children:a}){return k.debug("Rendering RootLayout"),(0,d.jsx)("html",{lang:"en",children:(0,d.jsx)("body",{className:`${f().variable} ${h().variable} antialiased`,children:(0,d.jsx)(j.default,{children:a})})})}},61135:()=>{}};