flujo-ai 3.16.0 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +202 -187
- package/.next/app-path-routes-manifest.json +9 -7
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +6 -6
- package/.next/react-loadable-manifest.json +6 -6
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/api/backup/route.js +1 -1
- package/.next/server/app/api/backup/route.js.nft.json +1 -1
- package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
- package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/route.js +1 -1
- package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/compile/route.js +1 -1
- package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generate/route.js +1 -17
- package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/improve/route.js +1 -0
- package/.next/server/app/api/flow/improve/route.js.nft.json +1 -0
- package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/flow/prompt-renderer/route.js +2 -2
- package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/quick-chat/route.js +1 -0
- package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -0
- package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/flow/route.js +1 -1
- package/.next/server/app/api/flow/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/init/route.js +1 -1
- package/.next/server/app/api/init/route.js.nft.json +1 -1
- package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route.js +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/[id]/route.js +1 -1
- package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/provider/route.js +1 -1
- package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
- package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/route.js +1 -1
- package/.next/server/app/api/model/route.js.nft.json +1 -1
- package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/test/route.js +1 -1
- package/.next/server/app/api/model/test/route.js.nft.json +1 -1
- package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/route.js +1 -1
- package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/restore/route.js +1 -1
- package/.next/server/app/api/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/webhooks/[id]/route.js +1 -1
- package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +9 -9
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +2 -2
- package/.next/server/app/docs/page.js +7 -3
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +2 -2
- package/.next/server/app/executions/page.js +2 -2
- package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +2 -2
- package/.next/server/app/flows/page.js +3 -39
- package/.next/server/app/flows/page.js.nft.json +1 -1
- package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/flows.html +1 -1
- package/.next/server/app/flows.rsc +2 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/mcp/page.js +23 -27
- package/.next/server/app/mcp/page.js.nft.json +1 -1
- package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-flows/route.js +3 -3
- package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
- package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
- package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp.html +1 -1
- package/.next/server/app/mcp.rsc +2 -2
- package/.next/server/app/models/page.js +3 -3
- package/.next/server/app/models/page.js.nft.json +1 -1
- package/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/v1/chat/completions/route.js +1 -2
- package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/models/route.js +1 -1
- package/.next/server/app/v1/models/route.js.nft.json +1 -1
- package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +9 -7
- package/.next/server/chunks/1403.js +4 -2
- package/.next/server/chunks/1912.js +38 -0
- package/.next/server/chunks/2350.js +1 -0
- package/.next/server/chunks/{7531.js → 2439.js} +2 -2
- package/.next/server/chunks/{5504.js → 264.js} +2 -2
- package/.next/server/chunks/2859.js +5 -5
- package/.next/server/chunks/3304.js +1 -1
- package/.next/server/chunks/3310.js +35 -0
- package/.next/server/chunks/453.js +1 -0
- package/.next/server/chunks/4681.js +1 -1
- package/.next/server/chunks/5311.js +1 -0
- package/.next/server/chunks/6037.js +41 -0
- package/.next/server/chunks/6069.js +6 -0
- package/.next/server/chunks/6201.js +5 -0
- package/.next/server/chunks/6826.js +1 -0
- package/.next/server/chunks/6936.js +9 -7
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7186.js +2 -0
- package/.next/server/chunks/7214.js +2 -2
- package/.next/server/chunks/724.js +1 -1
- package/.next/server/chunks/7362.js +8 -8
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7635.js +2 -2
- package/.next/server/chunks/7821.js +1 -0
- package/.next/server/chunks/7982.js +1 -0
- package/.next/server/chunks/8227.js +2 -0
- package/.next/server/chunks/8342.js +1 -0
- package/.next/server/chunks/8739.js +1 -1
- package/.next/server/chunks/906.js +35 -0
- package/.next/server/chunks/{5888.js → 9314.js} +3 -3
- package/.next/server/chunks/9687.js +1 -0
- package/.next/server/chunks/9880.js +1 -0
- package/.next/server/chunks/9938.js +1 -1
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/Fdh7zqKv38txmpLAxepeR/_buildManifest.js +1 -0
- package/.next/static/chunks/1374-e084b3c40554288a.js +1 -0
- package/.next/static/chunks/1892-359187893bbc7f3a.js +1 -0
- package/.next/static/chunks/{7126-2bafddf1b09cacac.js → 2084-2463e1d781bad2a6.js} +1 -1
- package/.next/static/chunks/4105-8fddb00196bf3c6d.js +1 -0
- package/.next/static/chunks/4244-6f399c7ff9980207.js +1 -0
- package/.next/static/chunks/4809-423a2a4a90d02f2c.js +1 -0
- package/.next/static/chunks/6084-68908a197e957e5f.js +1 -0
- package/.next/static/chunks/6509-3380826fd7c82b4e.js +1 -0
- package/.next/static/chunks/7290-fd5bb2c94fd7f605.js +1 -0
- package/.next/static/chunks/{7583.8a518353bd072db9.js → 7583.b6c2f8874b6b89cd.js} +1 -1
- package/.next/static/chunks/8098-297bf477152a565b.js +1 -0
- package/.next/static/chunks/{8187.5d6523f30e705998.js → 8187.15bf331f5318c00f.js} +1 -1
- package/.next/static/chunks/{9164-36fedeb944fa71e9.js → 9164-a56181e5e93cc47e.js} +1 -1
- package/.next/static/chunks/924-64f908860caf1a35.js +1 -0
- package/.next/static/chunks/9286-6ea909e5bf70a97e.js +1 -0
- package/.next/static/chunks/9747-ffb8be5e59700c27.js +8 -0
- package/.next/static/chunks/app/api/backup/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/browse/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/cwd/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/encryption/secure/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/env/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/compile/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/generate/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/improve/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/quick-chat/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/flow/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/git/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/init/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/local-models/capability/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/local-models/pull/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/local-models/suggest/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/cancel/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/model/[id]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/model/provider/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/model/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/model/test/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/oauth/initiate/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/oauth/reset/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/restore/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/storage/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/update/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[id]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/chat/page-6486974f4a6c7b57.js +1 -0
- package/.next/static/chunks/app/docs/page-5da72cc6db51f238.js +1 -0
- package/.next/static/chunks/app/executions/page-fe19f6a1bd3fe05c.js +1 -0
- package/.next/static/chunks/app/flows/page-3b84093cdf2aee84.js +1 -0
- package/.next/static/chunks/app/mcp/page-355386ec2a542e42.js +1 -0
- package/.next/static/chunks/app/mcp-flows/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/mcp-proxy/[server]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/models/page-20c80d398bf83fc5.js +1 -0
- package/.next/static/chunks/app/settings/page-9430dfdaff87d70c.js +1 -0
- package/.next/static/chunks/app/v1/chat/completions/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/app/v1/models/route-1691635994fcddb5.js +1 -0
- package/.next/static/chunks/{webpack-4015bd6f241940a1.js → webpack-4880945dd240d429.js} +1 -1
- package/.next/trace +7 -7
- package/.next/types/app/api/flow/improve/route.ts +347 -0
- package/.next/types/app/api/flow/quick-chat/route.ts +347 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/.next/server/chunks/117.js +0 -1
- package/.next/server/chunks/1877.js +0 -31
- package/.next/server/chunks/1905.js +0 -2
- package/.next/server/chunks/3243.js +0 -1
- package/.next/server/chunks/5558.js +0 -1
- package/.next/server/chunks/5587.js +0 -1
- package/.next/server/chunks/5838.js +0 -1
- package/.next/server/chunks/5935.js +0 -2
- package/.next/server/chunks/6195.js +0 -37
- package/.next/server/chunks/6283.js +0 -2
- package/.next/server/chunks/6523.js +0 -1
- package/.next/server/chunks/7328.js +0 -1
- package/.next/server/chunks/8126.js +0 -1
- package/.next/server/chunks/8312.js +0 -5
- package/.next/server/chunks/8434.js +0 -1
- package/.next/server/chunks/9188.js +0 -1
- package/.next/server/chunks/9688.js +0 -2
- package/.next/server/chunks/9989.js +0 -1
- package/.next/static/chunks/1226-af62e7a89fa9032e.js +0 -1
- package/.next/static/chunks/1979-e2d922370ecef69f.js +0 -1
- package/.next/static/chunks/2158-0d6bb5a428ed0688.js +0 -1
- package/.next/static/chunks/510-e39ad4e1fae6dd1f.js +0 -1
- package/.next/static/chunks/539-8ddf886986877cfc.js +0 -1
- package/.next/static/chunks/5781-4328d17aad13f908.js +0 -8
- package/.next/static/chunks/5961-828f4f7efc3e1381.js +0 -1
- package/.next/static/chunks/687-98ba5f5043866f48.js +0 -1
- package/.next/static/chunks/6902-cba4e59c4295b4a0.js +0 -1
- package/.next/static/chunks/8862-1170dad1d6f3cd39.js +0 -1
- package/.next/static/chunks/8867-3f7163974605427b.js +0 -1
- package/.next/static/chunks/8989-401559d9f3bc80a0.js +0 -1
- package/.next/static/chunks/9414-3cd5c3976cba66b2.js +0 -1
- package/.next/static/chunks/app/api/backup/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/browse/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/cwd/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/encryption/secure/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/env/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/flow/compile/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/flow/generate/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/flow/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/git/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/init/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/local-models/capability/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/local-models/pull/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/local-models/suggest/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/cancel/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/model/[id]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/model/provider/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/model/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/model/test/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/oauth/callback/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/oauth/initiate/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/oauth/reset/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/restore/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/storage/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/update/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[id]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/chat/page-c759cf382bcabd77.js +0 -1
- package/.next/static/chunks/app/docs/page-1d349e2d82f7b104.js +0 -1
- package/.next/static/chunks/app/executions/page-4155f9f682ee6f84.js +0 -1
- package/.next/static/chunks/app/flows/page-375150edff9134a3.js +0 -1
- package/.next/static/chunks/app/mcp/page-5234695929980171.js +0 -1
- package/.next/static/chunks/app/mcp-flows/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/mcp-proxy/[server]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/models/page-4fc4d100a8b1d4b4.js +0 -1
- package/.next/static/chunks/app/settings/page-9a2bfb8d5bdba29e.js +0 -1
- package/.next/static/chunks/app/v1/chat/completions/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/route-7248529e02c31012.js +0 -1
- package/.next/static/chunks/app/v1/models/route-7248529e02c31012.js +0 -1
- package/.next/static/z7fsG7kblb_yxkUhOxn-G/_buildManifest.js +0 -1
- /package/.next/static/{z7fsG7kblb_yxkUhOxn-G → Fdh7zqKv38txmpLAxepeR}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";exports.id=6936,exports.ids=[6936],exports.modules={8336:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},8918:(a,b,c)=>{c.d(b,{Fp:()=>f,M5:()=>d,Po:()=>e});let d=(a,b,c,d,e)=>({type:"model",code:a,message:b,modelId:c,requestId:d,details:e}),e=(a,b,c,d,e)=>({type:"tool",code:a,message:b,toolName:c,toolArgs:d,details:e}),f=(a,b,c,d,e)=>({type:"mcp",code:a,message:b,serverName:c,operation:d,details:e})},18975:(a,b,c)=>{function d(a){return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0}function e(a,b,c){if(!b||"full-history"===b)return a;let e=a.filter(a=>"system"===a.role);if("isolated"===b)return[...e,{role:"user",content:c??"",id:"isolated-input",timestamp:0},...function(a){let b=a.length-1;for(;b>=0;b--){let c=a[b];if(!("tool"===c.role||d(c)))break}let c=a.slice(b+1);return c.some(d)?c:[]}(a)];let f=-1;for(let b=a.length-1;b>=0;b--)if("user"===a[b].role){f=b;break}return -1===f?a:[...e,...a.slice(f)]}function f(a){return"handoff"===a||a.startsWith("handoff_to_")}function g(a,b){return[b,...a.filter(a=>"system"!==a.role)]}function h(a){return(function(a){let b=new Set;for(let c of a)if("assistant"===c.role&&Array.isArray(c.tool_calls))for(let a of c.tool_calls)"function"===a.type&&f(a.function.name)&&b.add(a.id);let c=[];for(let d of a)if(("user"!==d.role||"string"!=typeof d.content||"The handoff was successful. Continue"!==d.content.trim())&&!("tool"===d.role&&d.tool_call_id&&b.has(d.tool_call_id))){if("assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.some(a=>"function"===a.type&&f(a.function.name))){let a=d.tool_calls.filter(a=>!("function"===a.type&&f(a.function.name)));if(a.length>0)c.push({...d,tool_calls:a});else if("string"==typeof d.content?d.content.trim().length>0:!!Array.isArray(d.content)&&d.content.length>0){let{tool_calls:a,...b}=d;c.push(b)}continue}c.push(d)}return c})(a).map(({id:a,timestamp:b,disabled:c,processNodeId:d,depth:e,usage:f,...g})=>g)}c.d(b,{Ui:()=>g,ae:()=>h,ij:()=>e})},26485:(a,b,c)=>{c.d(b,{E5:()=>g,Jp:()=>d,O:()=>f,g4:()=>e});let d="TOOL_CALL",e="FINAL_RESPONSE",f="ERROR",g="STAY_ON_NODE"},34115:(a,b,c)=>{c.d(b,{LB:()=>q,UG:()=>u,jM:()=>v});var d=c(29021),e=c(33873),f=c.n(e),g=c(18230),h=c(63129);let i=(0,g.h)("backend/execution/flow/conversationLog"),j=new Set(["run:start","run:done","node:enter","node:exit","handoff","message","message:removed","tool:call","tool:result","usage","subflow:start","subflow:done","error"]),k=/^[A-Za-z0-9_-]+$/,l=f().join((0,h.ok)(),"db","conversation-logs");function m(a){return f().join(l,`${a}.jsonl`)}let n=new Map;function o(a,b){let c=(n.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(l,{recursive:!0}),await d.promises.appendFile(m(a),b)});return n.set(a,c),c.finally(()=>{n.get(a)===c&&n.delete(a)})}function p(a){return`${JSON.stringify(a)}
|
|
2
|
-
`}function q(a){if(j.has(a.type)){if(!k.test(a.conversationId))return void i.warn("Refusing to log event for unsafe conversation id",{conversationId:a.conversationId});(function(a){try{let{FlowExecutor:b}=c(96936),d=b.conversationStates.get(a);if(!d)return!1;return!d.ephemeral}catch(b){return i.warn(`Could not resolve persistence policy for ${a}; not persisting.`,{err:b}),!1}})(a.conversationId)&&o(a.conversationId,p(a)).catch(b=>i.warn(`Failed to append event to conversation log ${a.conversationId}`,{err:b}))}}async function r(a,b){if(0===b.length||a.ephemeral)return;let c=a.conversationId;if(!c||!k.test(c))return;let d=b.map(a=>p({...a,conversationId:c,seq:-1,timestamp:Date.now()})).join("");try{await o(c,d)}catch(a){i.warn(`Failed to append ${b.length} event(s) to conversation log ${c}`,{err:a})}}async function s(a){let b;if(!k.test(a))return;try{b=await d.promises.readFile(m(a),"utf-8")}catch(b){if("ENOENT"===b.code)return;i.error(`Error reading conversation log ${a}:`,b);return}let c=[],e=0;for(let a of b.split("\n"))if(0!==a.trim().length)try{c.push(JSON.parse(a))}catch{e++}return e>0&&i.warn(`Skipped ${e} unparseable line(s) in conversation log ${a} (truncated append?)`),c}function t(a){return JSON.stringify([a.role,a.content,a.tool_calls??null,a.disabled??!1,a.processNodeId??null])}async function u(a,b){if(a.ephemeral)return;let c=a.conversationId;if(!c||!k.test(c))return;let d=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id),e=await w(c)?b.filter(a=>"system"!==a.role&&!!a.id):[],f=new Map(e.map(a=>[a.id,a])),g=new Set(d.map(a=>a.id)),h=[];for(let a of d){let b=f.get(a.id);b&&t(b)===t(a)||h.push({type:"message",message:a})}for(let a of e)g.has(a.id)||h.push({type:"message:removed",messageId:a.id});await r(a,h)}async function v(a){if(a.ephemeral)return!1;let b=a.conversationId;if(!b||!k.test(b))return!1;let c=await s(b);if(!c)return!1;let d=(function(a){let b=[],c=new Map;for(let d of a)if("message"===d.type){let a=d.message;if(!a||!a.id||"system"===a.role)continue;let e=d.depth??0,f=e>0?{...a,depth:e}:{...a},g=c.get(a.id);void 0!==g?b[g]=f:(c.set(a.id,b.length),b.push(f))}else if("message:removed"===d.type){let a=c.get(d.messageId);if(void 0===a)continue;for(let[e,f]of(b.splice(a,1),c.delete(d.messageId),c))f>a&&c.set(e,f-1)}return b})(c).filter(a=>!((a.depth??0)>0)),e=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id).map(a=>a.id);if(d.length<=e.length)return!1;let f=new Set(d.map(a=>a.id));return!!e.every(a=>f.has(a))&&(i.info(`Recovered ${d.length-e.length} message(s) from the conversation log for ${b} (snapshot was behind).`),a.messages=d,!0)}async function w(a){if(!k.test(a))return!1;try{return await d.promises.access(m(a)),!0}catch{return!1}}},50564:(a,b,c)=>{c.d(b,{s:()=>s});var d=c(18230),e=c(8918),f=c(59448),g=c(18975),h=c(1191),i=c(12763),j=c(22124),k=c(31351),l=c(99924),m=c(69088),n=c(96249);let o=globalThis,p=o.__flujoToolApprovals??(o.__flujoToolApprovals=new Map);var q=c(89850);let r=(0,d.h)("backend/flow/execution/handlers/ModelHandler");class s{static extractProviderErrorDetails(a,b){let c=b||a?.message||"Provider returned an unspecified error in the response body.";b&&"string"==typeof a?.message&&a.message&&a.message!==b&&(c=`${b} - ${a.message}`);let d=a?.metadata;if(d){let a;if("string"==typeof d.raw)try{let b=JSON.parse(d.raw);a=b?.error?.message||b?.message||d.raw}catch{a=d.raw}else d.raw&&"object"==typeof d.raw&&(a=d.raw.error?.message||d.raw.message);let b=[];d.provider_name&&b.push(String(d.provider_name)),a&&b.push(a),b.length>0&&(c=`${c} (upstream: ${b.join(": ")})`)}return"string"==typeof a?.origin&&a.origin&&(c=`${c} (origin: ${a.origin})`),{message:c,code:a?.code,type:a?.type,param:a?.param,retryAfter:d?.retry_after_seconds!=null?String(d.retry_after_seconds):void 0,providerError:a}}static persistStreamedMessage(a,b){try{let{FlowExecutor:d}=c(96936),e=d.conversationStates.get(a);if(!e||!Array.isArray(e.messages))return;!function(a,b){let c=a.findIndex(a=>a.id===b.id);c>=0?a[c]=b:a.push(b)}(e.messages,b),e.updatedAt=Date.now()}catch(b){r.warn(`Failed to fold streamed message into conversation ${a}`,{err:b})}}static async callModel(a){let b,{modelId:c,prompt:d,messages:e,wireMessages:f,tools:g,nodeName:h,nodeId:k,toolNameMap:l,maxTurns:m,conversationId:o,requireToolApproval:t}=a;try{let a=await i.modelService.getModel(c);a&&(a.displayName||a.name,a.name,b=a.maxTurns)}catch(a){r.warn(`Failed to fetch model information for prefix: ${a instanceof Error?a.message:String(a)}`)}let u=function(a,b,c=j.m){return"number"==typeof a&&Number.isFinite(a)&&a>0?a:"number"==typeof b&&Number.isFinite(b)&&b>0?b:c}(m,b);r.info("callModel - Single execution",{modelId:c,messagesCount:e.length,toolsCount:g?.length||0,nodeName:h,nodeId:k}),r.verbose("callModel input",a);let v=o?n.$.emitterFor(o):void 0,w=t&&v&&o?async a=>{let b={id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args??{})}};return new Promise(a=>{let c;(c=p.get(o))||(c=new Map,p.set(o,c)),c.set(b.id,{toolCall:b,resolve:a}),v({type:"run:awaiting_approval",pendingToolCalls:function(a){let b=p.get(a);return b?Array.from(b.values(),a=>a.toolCall):[]}(o)})})}:void 0,x=v?a=>{let b=k?{...a,processNodeId:k}:a;v({type:"message",message:b,node:k?{nodeId:k}:void 0}),o&&s.persistStreamedMessage(o,b)}:void 0,y=await this.generateCompletion(c,d,f??e,g,{toolNameMap:l,maxTurns:u,requestToolApproval:w,onTranscriptMessage:x});if(!y.success)return r.verbose("callModel error response",y),{success:!1,error:y.error};let z=y.value,A=z.content||"",B=[...e],C=z.fullResponse?.usage,D=C?{promptTokens:C.prompt_tokens??0,completionTokens:C.completion_tokens??0,totalTokens:C.total_tokens??0}:void 0;if(z.transcript&&z.transcript.length>0){let a=Date.now(),b=z.transcript;b.forEach((c,d)=>{let e=d===b.length-1;B.push({...c,id:c.id??(0,q.A)(),timestamp:c.timestamp??a+d,processNodeId:k,...e&&D?{usage:D}:{}})})}else{let a={id:(0,q.A)(),role:"assistant",content:A,tool_calls:z.fullResponse?.choices?.[0]?.message?.tool_calls,timestamp:Date.now(),processNodeId:k,...D?{usage:D}:{}};B.push(a)}let E=z.fullResponse?.choices?.[0]?.message?.tool_calls?.map(a=>{try{return{name:a.function.name,args:JSON.parse(a.function.arguments),id:a.id,result:""}}catch(b){return r.warn(`Failed to parse tool arguments for call ${a.id}`,{args:a.function.arguments,error:b}),{name:a.function.name,args:{},id:a.id,result:""}}}).filter(Boolean),F={success:!0,value:{content:A,messages:B,fullResponse:z.fullResponse,toolCalls:E}};return r.verbose("callModel single step result",F),F}static async generateCompletion(a,b,d,f,j){r.verbose("generateCompletion input",{modelId:a,prompt:b,messages:d,tools:f});try{let b,h=await i.modelService.getModel(a);if(!h)return{success:!1,error:(0,e.M5)("model_not_found",`Model not found: ${a}`,a)};let l=h.temperature?parseFloat(h.temperature):0,m=await i.modelService.resolveAndDecryptApiKey(h.ApiKey);if(!m)return{success:!1,error:(0,e.M5)("api_key_error","Failed to resolve or decrypt API key",a)};r.verbose(`decrypted api key ${m}`),r.verbose(` baseurl ${h.baseUrl}`);let n=(0,g.ae)(d);if(f&&f.length>0){let{ToolHandler:a}=c(70834);b=f.map(b=>"function"===b.type&&b.function.parameters?{...b,function:{...b.function,parameters:a.sanitizeSchema(b.function.parameters)}}:b)}let o=(0,k.getCompletionAdapter)(h);r.debug("calling chatcompletion"),r.verbose("calling chatcompletion now with ADAPTER",h.adapter||"openai"),r.verbose("calling chatcompletion now with MODEL",h.name),r.verbose("calling chatcompletion now with TEMP",l),r.verbose("calling chatcompletion now with MESSAGES",n),r.verbose("calling chatcompletion now with TOOLS",b),r.debug("[ModelHandler.generateCompletion] Sending request via adapter",{adapter:h.adapter||"openai",model:h.name});let{completion:p,transcript:q}=await o.createCompletion({model:h,apiKey:m,messages:n,tools:b,temperature:l,toolNameMap:j?.toolNameMap,maxTurns:j?.maxTurns,requestToolApproval:j?.requestToolApproval,onTranscriptMessage:j?.onTranscriptMessage});if(r.debug("[ModelHandler.generateCompletion] Received raw response from OpenAI API",{response:p}),r.verbose("chatcompletion returned"),r.verbose("chatcompletion returned",p),p&&"object"==typeof p&&"error"in p&&p.error){r.warn("API call returned successfully but contained an error object:",JSON.stringify(p.error));let b=p.error,c=s.extractProviderErrorDetails(b),d={success:!1,error:(0,e.M5)("api_error",c.message,a,void 0,{code:c.code,type:c.type,param:c.param,retryAfter:c.retryAfter,providerError:c.providerError})};return r.verbose("generateCompletion returning error from response body",d),d}let t=p?.choices?.[0];if(!t)return r.error("API response missing choices array or first choice.",{response:p}),{success:!1,error:(0,e.M5)("api_error","Invalid response structure from API: Missing choices.",a,void 0,{rawResponse:p})};let u={success:!0,value:{content:t.message?.content||"",messages:[...d],fullResponse:p,transcript:q}};return r.verbose("generateCompletion success result",u),u}catch(c){if(r.error("[ModelHandler.generateCompletion] Caught error during OpenAI API call",{rawError:c}),r.error("--- Error during openai.chat.completions.create ---"),c instanceof Error?(r.error(`Error Name: ${c.name}`),r.error(`Error Message: ${c.message}`),r.error(`Error Stack: ${c.stack}`)):r.error("Caught non-Error object:",c),c instanceof h.Ay.APIError&&(r.error(`API Error Status: ${c.status}`),r.error(`API Error Type: ${c.type}`),r.error(`API Error Code: ${c.code}`),r.error(`API Error Param: ${c.param}`),r.error(`API Error Headers: ${JSON.stringify(c.headers)}`)),r.error("--- End Error Details ---"),c instanceof h.Ay.APIError){let b=c.error,d=s.extractProviderErrorDetails(b,c.message),f=c.headers||{},g=f["retry-after"]??f["Retry-After"],h=void 0!==g?String(g):d.retryAfter,i=f["x-ratelimit-reset"]??f["x-ratelimit-reset-requests"],j={success:!1,error:(0,e.M5)("api_error",d.message,a,void 0,{status:c.status,type:d.type??c.type,code:d.code??c.code,param:d.param??c.param,retryAfter:h,rateLimitReset:void 0!==i?String(i):void 0,providerError:d.providerError,stack:c.stack})};return r.verbose("generateCompletion API error",j),j}let b={success:!1,error:(0,e.M5)("unknown_error",c instanceof Error?c.message:String(c),a,void 0,{stack:c instanceof Error?c.stack:void 0})};return r.verbose("generateCompletion unknown error",b),b}}static async processToolCalls(a){let{toolCalls:b,toolNameMap:c,emit:d}=a;if(r.verbose("processToolCalls input",a),!b||0===b.length){let a={success:!0,value:{toolCallMessages:[],processedToolCalls:[]}};return r.verbose("processToolCalls empty result",a),a}try{let a=[],e=[];for(let g of b){let{id:b,function:{name:h,arguments:i}}=g;try{let g=JSON.parse(i);if(r.info("trying to call tool",h),h.startsWith("handoff_to_")||"handoff"===h){r.info(`Processing handoff tool: ${h}`);let c={handoff:!0,args:g},d=JSON.stringify(c);a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:d,timestamp:Date.now()}),e.push({name:h,args:g,id:b,result:d});continue}let j=(0,f.ud)(h,c);if(!j)throw r.error("invalid tool format",h),Error(`Invalid tool name format: ${h}`);let k=j.server,n=j.tool;d?.({type:"tool:call",toolCallId:b,name:h,args:i});let o=j.timeout??m.aI,p=await l.mcpService.callTool(k,n,g,o,a=>d?.({type:"tool:progress",toolCallId:b,name:h,progress:a.progress,total:a.total,message:a.message})),s=p.success?JSON.stringify(p.data):`Error: ${p.error}`;d?.({type:"tool:result",toolCallId:b,name:h,result:s.length>500?`${s.slice(0,500)}…`:s,isError:!p.success}),a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:s,timestamp:Date.now()}),e.push({name:h,args:g,id:b,result:s})}catch(f){let c=`Error: ${f instanceof Error?f.message:"Unknown error"}`;d?.({type:"tool:result",toolCallId:b,name:h,result:c,isError:!0}),a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:c,timestamp:Date.now()}),e.push({name:h,args:{},id:b,result:c})}}let g={success:!0,value:{toolCallMessages:a,processedToolCalls:e}};return r.verbose("processToolCalls success result",g),g}catch(b){let a={success:!1,error:(0,e.Po)("tool_processing_failed",b instanceof Error?b.message:String(b),"unknown")};return r.verbose("processToolCalls error result",a),a}}static hasToolCalls(a){return!!(a.fullResponse?.choices?.[0]?.message?.tool_calls&&a.fullResponse.choices[0].message.tool_calls.length>0)}}},54898:(a,b,c)=>{c.d(b,{nC:()=>h});var d=c(8336);function e(a){return a.data?.type??a.type??"unknown"}function f(a){return a.data?.label||a.id}function g(a){return a.data?.edgeType==="mcp"}function h(a,b={}){let c=[],i=Array.isArray(a?.nodes)?a.nodes:[],j=Array.isArray(a?.edges)?a.edges:[],k=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?f(e):void 0}),l=new Map((b.models??[]).map(a=>[a.id,a])),m=new Map((b.servers??[]).map(a=>[a.name,a])),n=!!b.models,o=!!b.servers,p=i.filter(a=>"start"===e(a)),q=i.filter(a=>"finish"===e(a)),r=i.filter(a=>"process"===e(a)),s=i.filter(a=>"mcp"===e(a));if(0===p.length)k("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(p.length>1)for(let a of p.slice(1))k("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===q.length&&k("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),r)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(n&&!l.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";k("error","process-model-missing",`Process node "${f(a)}" is bound to a model that no longer exists${c}.`,a)}}else k("error","process-missing-model",`Process node "${f(a)}" has no model bound.`,a)}for(let a of s){let b=(a.data?.properties??{}).boundServer;if(b){if(o&&!m.has(b))k("warning","mcp-server-missing",`MCP node "${f(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(o){let c=m.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;k("warning","mcp-server-disconnected",`MCP node "${f(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else k("warning","mcp-missing-server",`MCP node "${f(a)}" is not bound to a server.`,a);j.some(b=>g(b)&&(b.source===a.id||b.target===a.id))||k("warning","mcp-node-unconnected",`MCP node "${f(a)}" is not connected to any Process node.`,a)}if(p.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!g(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(j);for(let b of p)a.get(b.id)?.length||k("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(p.map(a=>a.id),a);for(let a of[...r,...q])b.has(a.id)||k("warning","unreachable-node",`${"finish"===e(a)?"Finish":"Process"} node "${f(a)}" is not reachable from the Start node.`,a)}for(let a of i.filter(a=>"subflow"===e(a))){let b=j.filter(b=>!g(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&k("error","subflow-multiple-outgoing",`Subflow node "${f(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a)}for(let a of r){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let h=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=new Set;for(let b of c){if(!g(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let h=d.get(c);if(!h||"mcp"!==e(h))continue;let i=h.data?.properties?.boundServer;"string"==typeof i&&i&&f.add(i)}return f}(a.id,i,j),l=new Set;for(let e of(0,d.A$)(c)){if("handoff"===e.server)continue;let c=`${e.kind}:${e.server}:${e.name}`;!l.has(c)&&(l.add(c),h.has(e.server)?"tool"===e.kind&&b.serverTools&&b.serverTools[e.server]&&!b.serverTools[e.server].includes(e.name)&&k("warning","tool-unavailable",`Process node "${f(a)}" references tool "${e.name}" which server "${e.server}" no longer provides.`,a):k("error","tool-pill-disconnected",`Process node "${f(a)}" references ${e.kind} "${e.name}" from server "${e.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let t=c.filter(a=>"error"===a.severity).length,u=c.length-t;return{issues:c,errorCount:t,warningCount:u,isRunnable:0===t}}},59448:(a,b,c)=>{c.d(b,{$9:()=>g,Y6:()=>e,ud:()=>f});let d="_-_-_";function e(a,b){let c=function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(36)}(`${a}\0${b}`),d=64-(5+c.length),e=b.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,Math.max(0,d));return`mcp_${e}_${c}`}function f(a,b){if(b&&b[a])return b[a];if(a.includes(d)){let b=a.split(d);if(3===b.length)return{server:b[1],tool:b[2]}}return null}function g(a,b){return!!b&&!!b[a]||a.includes(d)}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>x});var d=c(18230),e=c(96936),f=c(79111);let g=(0,d.h)("backend/execution/flow/persistConversationState");var h=c(34115),i=c(96249),j=c(26485),k=c(50564),l=c(59448),m=c(72440),n=c(86028),o=c(12763),p=c(99924),q=c(54898);let r=(0,d.h)("backend/execution/flow/validateFlowForRun");async function s(a){let b,c,d=await m.flowService.getFlow(a);if(!d)return r.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0};try{b=await o.modelService.loadModels()}catch(a){r.warn("validateFlowForRun: could not load models; skipping model checks",a)}try{let a=await p.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){r.warn("validateFlowForRun: could not load servers; skipping server checks",a)}return(0,q.nC)(d,{models:b,servers:c})}var t=c(85701);let u=(0,d.h)("backend/execution/flow/runFlow");m.flowService.getFlowByName||(m.flowService.getFlowByName=async a=>(await m.flowService.loadFlows()).find(b=>b.name===a)||null,u.info("Added getFlowByName method directly to flowService instance."));let v=m.flowService,w=function(a,b){return b.ephemeral?(g.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})};async function x(a){let b,c,d,g=Date.now(),m=a.flujo??!0,o=a.requireApproval??!1,p=a.debug??!1,q=a.continueDebug??!1,r=a.userTurn??!1,x="ephemeral"===a.mode,y=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),z={model:a.modelName,messages:y,processNodeId:a.processNodeId};u.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:y.length,mode:x?"ephemeral":"conversation",flujo:m,requireApproval:o,flujodebug:p,conversationId:a.conversationId});let A=a.conversationId||crypto.randomUUID(),B=`conversations/${A}`,C="new";if(u.info(`Effective Conversation ID for this run: ${A}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(A))c=e.FlowExecutor.conversationStates.get(A),u.info(`Resuming conversation ${A} from memory`,{currentNodeId:c.currentNodeId}),C="memory";else if(!x)try{(c=await (0,f.YM)(B,void 0))?(u.info(`Loaded conversation state from storage: ${A}`),C="storage",await (0,h.jM)(c),e.FlowExecutor.conversationStates.set(A,c)):u.info(`No state found in storage for conversation: ${A}. Will create new state.`)}catch(a){u.warn(`Error loading conversation state from storage for ${A}:`,a)}if(c?((b=c).conversationId!==A&&(u.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${A}). Using effectiveConvId.`),b.conversationId=A),"new"!==C&&("completed"===b.status||"error"===b.status)&&(u.info(`Resuming completed/errored conversation ${A}. Resetting status to 'running'.`),b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===C&&e.FlowExecutor.conversationStates.set(A,b)),z.processNodeId&&"new"!==C&&(u.info(`Edit detected: Resetting currentNodeId for conversation ${A} to provided processNodeId: ${z.processNodeId}`),b.currentNodeId=z.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},n.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(A,b),u.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(u.info(`Creating new conversation state object for ID: ${A}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(n.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:A,currentNodeId:void 0,status:"running",title:"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:p,executionTrace:p&&n.G.ENABLE_EXECUTION_TRACKER?[]:void 0}),b.requireApproval=o,x&&(b.ephemeral=!0),b.runDepth=a.depth??b.runDepth??0,b.runDepth>t.A)return u.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${t.A}`),b.status="error",{status:"error",conversationId:A,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${t.A}) exceeded`,statusCode:500},finalAction:j.O,sharedState:b};let D=[...b.messages??[]];if("new"===C){let c=a.flowId;if(!c&&z.model){let a=z.model.substring(5),d=await v.getFlowByName(a);if(!d)return u.error(`Flow not found: ${a}`),{status:"error",conversationId:A,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:j.O,sharedState:b};c=d.id}if(!c)return u.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:A,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:j.O,sharedState:b};b.flowId=c;let d=(z.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",u.verbose(`Updated conversation title for ${A} during init to: ${b.title}`))}await w(B,b),u.debug(`Saved initial state for new conversation ${A}.`)}catch(a){u.error(`Failed to save initial state for new conversation ${A}:`,a)}e.FlowExecutor.conversationStates.set(A,b)}else z.messages&&z.messages.length>0&&(b.messages=z.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),u.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(r||void 0===b.debugMode)&&(b.debugMode=p),r&&(b.debugPendingToolCalls=void 0),b.debugMode&&n.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,h.UG)(b,D)}catch(a){u.warn(`Conversation-log reconcile failed for ${A}; continuing`,a)}if(r&&"new"!==C&&!z.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(u.info(`New user turn for ${A}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(A,b))}r&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),u.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${A}.`));let E=!1,F=0,G=a.emit??i.$.emitterFor(A),H=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),I=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.processNodeId||"unknown",e=c.byNode[d]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};e.promptTokens+=a.usage.promptTokens,e.completionTokens+=a.usage.completionTokens,e.totalTokens+=a.usage.totalTokens,c.byNode[d]=e,b.usage=c,G({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0})},J=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),H.has(a.id)||(H.add(a.id),"system"!==a.role&&(G({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),I(a)))};if(G({type:"run:start",flowId:b.flowId}),(r||"new"===C)&&b.flowId)try{let a=await s(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
|
|
3
|
-
`+c.map(a=>`• ${a.message}`).join("\n");
|
|
1
|
+
"use strict";exports.id=6936,exports.ids=[6936],exports.modules={8336:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},8918:(a,b,c)=>{c.d(b,{Fp:()=>f,M5:()=>d,Po:()=>e});let d=(a,b,c,d,e)=>({type:"model",code:a,message:b,modelId:c,requestId:d,details:e}),e=(a,b,c,d,e)=>({type:"tool",code:a,message:b,toolName:c,toolArgs:d,details:e}),f=(a,b,c,d,e)=>({type:"mcp",code:a,message:b,serverName:c,operation:d,details:e})},11659:(a,b,c)=>{c.d(b,{flowService:()=>w});var d=c(89850),e=c(79111),f=c(89392),g=c(18230),h=c(33873),i=c.n(h),j=c(29021),k=c(63129);let l=(0,g.h)("backend/services/flow/flowVersions");function m(a){return(0,e.ln)(a),`flow-versions/${a}`}async function n(a){try{let b=m(a.id),c=Date.now(),d=`${c}-${Math.random().toString(36).slice(2,6)}`,f={versionId:d,flowId:a.id,savedAt:c,flow:a};return await (0,e.Vt)(b,d,f),await o(a.id),d}catch(b){return l.warn(`Could not archive a version of flow ${a.id}`,b),null}}async function o(a){let b=m(a),c=await (0,e.pL)(b);if(!(c.length<=25))for(let d of c.sort((a,b)=>b.savedAt-a.savedAt).slice(25))try{await (0,e.bB)(b,d.versionId)}catch(b){l.warn(`Could not prune version ${d.versionId} of flow ${a}`,b)}}async function p(a){return(await (0,e.pL)(m(a))).sort((a,b)=>b.savedAt-a.savedAt).map(a=>({versionId:a.versionId,savedAt:a.savedAt,name:a.flow?.name??"unknown",nodeCount:a.flow?.nodes?.length??0,edgeCount:a.flow?.edges?.length??0}))}async function q(a,b){try{return await (0,e.EI)(m(a),b,null)}catch(c){return l.debug(`getFlowVersion: could not load ${a}/${b}`,c),null}}async function r(a){try{(0,e.ln)(a),await j.promises.rm(i().join((0,k.ok)(),"db","flow-versions",a),{recursive:!0,force:!0})}catch(b){l.warn(`Could not remove version history of flow ${a}`,b)}}let s=(0,g.h)("backend/services/flow/index"),t=f.Z.FLOWS;async function u(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,t,a=>a.id)}catch(a){s.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class v{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return s.debug("Using cached flows"),this.flowsCache;s.debug("Loading flows from storage"),await u();let a=await (0,e.pL)(t);return this.flowsCache=a,s.info("Loaded flows from storage",{count:a.length}),a}catch(a){return s.error("Failed to load flows",a),[]}}async getFlow(a){try{s.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return s.debug(`Flow ${a} found in cache`),b;await u();let c=null;try{c=await (0,e.EI)(t,a,null)}catch(b){s.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return s.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return s.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.resolve().then(c.bind(c,96936));b.clearFlowCache(a),s.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){s.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{s.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await u();let b=null;try{b=await (0,e.EI)(t,a.id,null)}catch(b){s.debug(`saveFlow: could not read previous definition of ${a.id} for versioning`,b)}b&&JSON.stringify(b)!==JSON.stringify(a)&&await n(b),await (0,e.Vt)(t,a.id,a);let c=this.flowsCache;if(c){let b=c.findIndex(b=>b.id===a.id);b>=0?c[b]=a:c.push(a),this.flowsCache=c}return await this.invalidateExecutionCache(a.id),s.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return s.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{s.debug(`Deleting flow: ${a}`),await u(),await (0,e.bB)(t,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),await r(a),s.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return s.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}async listFlowVersions(a){return p(a)}async getFlowVersion(a,b){return q(a,b)}async revertFlow(a,b){let c=await q(a,b);return c?this.saveFlow({...c.flow,id:a}):{success:!1,error:`No version "${b}" of flow ${a}`}}createNode(a,b){s.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return s.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){s.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return s.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return s.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){s.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return s.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){s.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return s.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let w=new v},18975:(a,b,c)=>{function d(a){return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0}function e(a){let b=a.length-1;for(;b>=0;b--){let c=a[b];if(!("tool"===c.role||d(c)))break}let c=a.slice(b+1);return c.some(d)?c:[]}function f(a,b,c){if(!b||"full-history"===b)return a;let d=a.filter(a=>"system"===a.role);if("isolated"===b)return[...d,{role:"user",content:c??"",id:"isolated-input",timestamp:0},...e(a)];let f=-1;for(let b=a.length-1;b>=0;b--)if("user"===a[b].role){f=b;break}return -1===f?a:[...d,...a.slice(f)]}function g(a){return a.tool_calls.some(a=>"function"===a.type&&i(a.function.name))}function h(a,b){if(0===b.size)return a;let c=a.length-e(a).length,f=Array(c).fill(!1);for(let b=0;b<c;){let e=a[b].processNodeId,h=b;for(;h<c&&a[h].processNodeId===e;)h++;let i=!1;if(e)for(let c=b;c<h;c++){let b=a[c];if("assistant"===b.role&&k(b)&&(!d(b)||g(b))){i=!0;break}}for(let a=b;a<h;a++)f[a]=i;b=h}let h=new Set,i=[],j=!1;for(let e=0;e<a.length;e++){let l=a[e];if(e<c){if(d(l)&&l.processNodeId&&b.has(l.processNodeId)&&f[e]){for(let a of l.tool_calls)h.add(a.id);if(j=!0,g(l)&&k(l)){let{tool_calls:a,...b}=l;i.push(b)}continue}if("tool"===l.role&&l.tool_call_id&&h.has(l.tool_call_id)){j=!0;continue}}i.push(l)}return j?i:a}function i(a){return"handoff"===a||a.startsWith("handoff_to_")}function j(a,b){return[b,...a.filter(a=>"system"!==a.role)]}function k(a){return"string"==typeof a.content?a.content.trim().length>0:!!Array.isArray(a.content)&&a.content.length>0}function l(a){return(function(a){let b=new Set;for(let c of a)if("assistant"===c.role&&Array.isArray(c.tool_calls))for(let a of c.tool_calls)"function"===a.type&&i(a.function.name)&&b.add(a.id);let c=[];for(let d of a)if(("user"!==d.role||"string"!=typeof d.content||"The handoff was successful. Continue"!==d.content.trim())&&!("tool"===d.role&&d.tool_call_id&&b.has(d.tool_call_id))){if("assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.some(a=>"function"===a.type&&i(a.function.name))){let a=d.tool_calls.filter(a=>!("function"===a.type&&i(a.function.name)));if(a.length>0)c.push({...d,tool_calls:a});else if(k(d)){let{tool_calls:a,...b}=d;c.push(b)}continue}c.push(d)}return c})(a).map(({id:a,timestamp:b,disabled:c,processNodeId:d,depth:e,usage:f,...g})=>g)}c.d(b,{Qv:()=>h,Ui:()=>j,ae:()=>l,ij:()=>f})},26485:(a,b,c)=>{c.d(b,{E5:()=>g,Jp:()=>d,O:()=>f,g4:()=>e});let d="TOOL_CALL",e="FINAL_RESPONSE",f="ERROR",g="STAY_ON_NODE"},34115:(a,b,c)=>{c.d(b,{LB:()=>q,Os:()=>t,UG:()=>w,cc:()=>u,jM:()=>x,u8:()=>s});var d=c(29021),e=c(33873),f=c.n(e),g=c(18230),h=c(63129);let i=(0,g.h)("backend/execution/flow/conversationLog"),j=new Set(["run:start","run:done","node:enter","node:exit","handoff","message","message:removed","tool:call","tool:result","usage","subflow:start","subflow:done","error"]),k=/^[A-Za-z0-9_-]+$/,l=f().join((0,h.ok)(),"db","conversation-logs");function m(a){return f().join(l,`${a}.jsonl`)}let n=new Map;function o(a,b){let c=(n.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(l,{recursive:!0}),await d.promises.appendFile(m(a),b)});return n.set(a,c),c.finally(()=>{n.get(a)===c&&n.delete(a)})}function p(a){return`${JSON.stringify(a)}
|
|
2
|
+
`}function q(a){if(j.has(a.type)){if(!k.test(a.conversationId))return void i.warn("Refusing to log event for unsafe conversation id",{conversationId:a.conversationId});(function(a){try{let{FlowExecutor:b}=c(96936),d=b.conversationStates.get(a);if(!d)return!1;return!d.ephemeral}catch(b){return i.warn(`Could not resolve persistence policy for ${a}; not persisting.`,{err:b}),!1}})(a.conversationId)&&o(a.conversationId,p(a)).catch(b=>i.warn(`Failed to append event to conversation log ${a.conversationId}`,{err:b}))}}async function r(a,b){if(0===b.length||a.ephemeral)return;let c=a.conversationId;if(!c||!k.test(c))return;let d=b.map(a=>p({...a,conversationId:c,seq:-1,timestamp:Date.now()})).join("");try{await o(c,d)}catch(a){i.warn(`Failed to append ${b.length} event(s) to conversation log ${c}`,{err:a})}}function s(a){let b=n.get(a);return b?b.then(()=>void 0,()=>void 0):Promise.resolve()}async function t(a){let b;if(!k.test(a))return;try{b=await d.promises.readFile(m(a),"utf-8")}catch(b){if("ENOENT"===b.code)return;i.error(`Error reading conversation log ${a}:`,b);return}let c=[],e=0;for(let a of b.split("\n"))if(0!==a.trim().length)try{c.push(JSON.parse(a))}catch{e++}return e>0&&i.warn(`Skipped ${e} unparseable line(s) in conversation log ${a} (truncated append?)`),c}function u(a){let b=[],c=new Map;for(let d of a)if("message"===d.type){let a=d.message;if(!a||!a.id||"system"===a.role)continue;let e=d.depth??0,f=e>0?{...a,depth:e}:{...a},g=c.get(a.id);void 0!==g?b[g]=f:(c.set(a.id,b.length),b.push(f))}else if("message:removed"===d.type){let a=c.get(d.messageId);if(void 0===a)continue;for(let[e,f]of(b.splice(a,1),c.delete(d.messageId),c))f>a&&c.set(e,f-1)}return b}function v(a){return JSON.stringify([a.role,a.content,a.tool_calls??null,a.disabled??!1,a.processNodeId??null])}async function w(a,b){if(a.ephemeral)return;let c=a.conversationId;if(!c||!k.test(c))return;let d=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id),e=await y(c)?b.filter(a=>"system"!==a.role&&!!a.id):[],f=new Map(e.map(a=>[a.id,a])),g=new Set(d.map(a=>a.id)),h=[];for(let a of d){let b=f.get(a.id);b&&v(b)===v(a)||h.push({type:"message",message:a})}for(let a of e)g.has(a.id)||h.push({type:"message:removed",messageId:a.id});await r(a,h)}async function x(a){if(a.ephemeral)return!1;let b=a.conversationId;if(!b||!k.test(b))return!1;let c=await t(b);if(!c)return!1;let d=u(c).filter(a=>!((a.depth??0)>0)),e=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id).map(a=>a.id);if(d.length<=e.length)return!1;let f=new Set(d.map(a=>a.id));return!!e.every(a=>f.has(a))&&(i.info(`Recovered ${d.length-e.length} message(s) from the conversation log for ${b} (snapshot was behind).`),a.messages=d,!0)}async function y(a){if(!k.test(a))return!1;try{return await d.promises.access(m(a)),!0}catch{return!1}}},54898:(a,b,c)=>{c.d(b,{nC:()=>h});var d=c(8336);function e(a){return a.data?.type??a.type??"unknown"}function f(a){return a.data?.label||a.id}function g(a){return a.data?.edgeType==="mcp"}function h(a,b={}){let c=[],i=Array.isArray(a?.nodes)?a.nodes:[],j=Array.isArray(a?.edges)?a.edges:[],k=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?f(e):void 0}),l=new Map((b.models??[]).map(a=>[a.id,a])),m=new Map((b.servers??[]).map(a=>[a.name,a])),n=!!b.models,o=!!b.servers,p=i.filter(a=>"start"===e(a)),q=i.filter(a=>"finish"===e(a)),r=i.filter(a=>"process"===e(a)),s=i.filter(a=>"mcp"===e(a));if(0===p.length)k("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(p.length>1)for(let a of p.slice(1))k("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===q.length&&k("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),r)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(n&&!l.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";k("error","process-model-missing",`Process node "${f(a)}" is bound to a model that no longer exists${c}.`,a)}}else k("error","process-missing-model",`Process node "${f(a)}" has no model bound.`,a)}for(let a of s){let b=(a.data?.properties??{}).boundServer;if(b){if(o&&!m.has(b))k("warning","mcp-server-missing",`MCP node "${f(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(o){let c=m.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;k("warning","mcp-server-disconnected",`MCP node "${f(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else k("warning","mcp-missing-server",`MCP node "${f(a)}" is not bound to a server.`,a);j.some(b=>g(b)&&(b.source===a.id||b.target===a.id))||k("warning","mcp-node-unconnected",`MCP node "${f(a)}" is not connected to any Process node.`,a)}if(p.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!g(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(j);for(let b of p)a.get(b.id)?.length||k("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(p.map(a=>a.id),a);for(let a of[...r,...q])b.has(a.id)||k("warning","unreachable-node",`${"finish"===e(a)?"Finish":"Process"} node "${f(a)}" is not reachable from the Start node.`,a)}for(let a of i.filter(a=>"subflow"===e(a))){let b=j.filter(b=>!g(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&k("error","subflow-multiple-outgoing",`Subflow node "${f(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a)}for(let a of r){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let h=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=new Set;for(let b of c){if(!g(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let h=d.get(c);if(!h||"mcp"!==e(h))continue;let i=h.data?.properties?.boundServer;"string"==typeof i&&i&&f.add(i)}return f}(a.id,i,j),l=new Set;for(let e of(0,d.A$)(c)){if("handoff"===e.server)continue;let c=`${e.kind}:${e.server}:${e.name}`;!l.has(c)&&(l.add(c),h.has(e.server)?"tool"===e.kind&&b.serverTools&&b.serverTools[e.server]&&!b.serverTools[e.server].includes(e.name)&&k("warning","tool-unavailable",`Process node "${f(a)}" references tool "${e.name}" which server "${e.server}" no longer provides.`,a):k("error","tool-pill-disconnected",`Process node "${f(a)}" references ${e.kind} "${e.name}" from server "${e.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let t=c.filter(a=>"error"===a.severity).length,u=c.length-t;return{issues:c,errorCount:t,warningCount:u,isRunnable:0===t}}},59448:(a,b,c)=>{c.d(b,{$9:()=>g,Y6:()=>e,ud:()=>f});let d="_-_-_";function e(a,b){let c=function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(36)}(`${a}\0${b}`),d=64-(5+c.length),e=b.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,Math.max(0,d));return`mcp_${e}_${c}`}function f(a,b){if(b&&b[a])return b[a];if(a.includes(d)){let b=a.split(d);if(3===b.length)return{server:b[1],tool:b[2]}}return null}function g(a,b){return!!b&&!!b[a]||a.includes(d)}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>y});var d=c(18230),e=c(96936),f=c(79111);let g=(0,d.h)("backend/execution/flow/persistConversationState");var h=c(34115),i=c(96249),j=c(26485),k=c(95082),l=c(59448),m=c(11659),n=c(86028),o=c(12763),p=c(99924),q=c(54898);let r=(0,d.h)("backend/execution/flow/validateFlowForRun");async function s(a){let b,c;try{b=await o.modelService.loadModels()}catch(a){r.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await p.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){r.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,q.nC)(a,{models:b,servers:c})}async function t(a){let b=await m.flowService.getFlow(a);return b?s(b):(r.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var u=c(85701);let v=(0,d.h)("backend/execution/flow/runFlow");m.flowService.getFlowByName||(m.flowService.getFlowByName=async a=>(await m.flowService.loadFlows()).find(b=>b.name===a)||null,v.info("Added getFlowByName method directly to flowService instance."));let w=m.flowService,x=function(a,b){return b.ephemeral?(g.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})};async function y(a){let b,c,d,g=Date.now(),m=a.flujo??!0,o=a.requireApproval??!1,p=a.debug??!1,q=a.continueDebug??!1,r=a.userTurn??!1,y="ephemeral"===a.mode,z=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),A={model:a.modelName,messages:z,processNodeId:a.processNodeId};v.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:z.length,mode:y?"ephemeral":"conversation",flujo:m,requireApproval:o,flujodebug:p,conversationId:a.conversationId});let B=a.conversationId||crypto.randomUUID(),C=`conversations/${B}`,D="new";if(v.info(`Effective Conversation ID for this run: ${B}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(B))c=e.FlowExecutor.conversationStates.get(B),v.info(`Resuming conversation ${B} from memory`,{currentNodeId:c.currentNodeId}),D="memory";else if(!y)try{(c=await (0,f.YM)(C,void 0))?(v.info(`Loaded conversation state from storage: ${B}`),D="storage",await (0,h.jM)(c),e.FlowExecutor.conversationStates.set(B,c)):v.info(`No state found in storage for conversation: ${B}. Will create new state.`)}catch(a){v.warn(`Error loading conversation state from storage for ${B}:`,a)}if(c?((b=c).conversationId!==B&&(v.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${B}). Using effectiveConvId.`),b.conversationId=B),"new"!==D&&("completed"===b.status||"error"===b.status)&&(v.info(`Resuming completed/errored conversation ${B}. Resetting status to 'running'.`),b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===D&&e.FlowExecutor.conversationStates.set(B,b)),A.processNodeId&&"new"!==D&&(v.info(`Edit detected: Resetting currentNodeId for conversation ${B} to provided processNodeId: ${A.processNodeId}`),b.currentNodeId=A.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},n.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(B,b),v.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(v.info(`Creating new conversation state object for ID: ${B}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(n.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:B,currentNodeId:void 0,status:"running",title:"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:p,executionTrace:p&&n.G.ENABLE_EXECUTION_TRACKER?[]:void 0}),b.requireApproval=o,y&&(b.ephemeral=!0),b.runDepth=a.depth??b.runDepth??0,b.runDepth>u.A)return v.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${u.A}`),b.status="error",{status:"error",conversationId:B,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${u.A}) exceeded`,statusCode:500},finalAction:j.O,sharedState:b};let E=[...b.messages??[]];if("new"===D){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&A.model){let a=A.model.substring(5),d=await w.getFlowByName(a);if(!d)return v.error(`Flow not found: ${a}`),{status:"error",conversationId:B,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:j.O,sharedState:b};c=d.id}if(!c)return v.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:B,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:j.O,sharedState:b};b.flowId=c;let d=(A.messages||[]).filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0}));b.messages=d;try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",v.verbose(`Updated conversation title for ${B} during init to: ${b.title}`))}await x(C,b),v.debug(`Saved initial state for new conversation ${B}.`)}catch(a){v.error(`Failed to save initial state for new conversation ${B}:`,a)}e.FlowExecutor.conversationStates.set(B,b)}else A.messages&&A.messages.length>0&&(b.messages=A.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),v.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(r||void 0===b.debugMode)&&(b.debugMode=p),r&&(b.debugPendingToolCalls=void 0),b.debugMode&&n.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,h.UG)(b,E)}catch(a){v.warn(`Conversation-log reconcile failed for ${B}; continuing`,a)}if(r&&"new"!==D&&!A.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(v.info(`New user turn for ${B}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(B,b))}r&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),v.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${B}.`));let F=!1,G=0,H=a.emit??i.$.emitterFor(B),I=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),J=a=>{if(!a.usage)return;let c=b.usage??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0,byNode:{}};c.promptTokens+=a.usage.promptTokens,c.completionTokens+=a.usage.completionTokens,c.totalTokens+=a.usage.totalTokens;let d=a.usage.cacheReadTokens??0;d&&(c.cacheReadTokens=(c.cacheReadTokens??0)+d);let e=a.processNodeId||"unknown",f=c.byNode[e]??{promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0};f.promptTokens+=a.usage.promptTokens,f.completionTokens+=a.usage.completionTokens,f.totalTokens+=a.usage.totalTokens,d&&(f.cacheReadTokens=(f.cacheReadTokens??0)+d),c.byNode[e]=f,b.usage=c,H({type:"usage",node:a.processNodeId?{nodeId:a.processNodeId}:void 0,promptTokens:a.usage.promptTokens,completionTokens:a.usage.completionTokens,totalTokens:a.usage.totalTokens,costUsd:0,...d?{cacheReadTokens:d}:{}})},K=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),I.has(a.id)||(I.add(a.id),"system"!==a.role&&(H({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),J(a)))};if(H({type:"run:start",flowId:b.flowId}),(r||"new"===D)&&b.flowId)try{let a=b.flowSnapshot?await s(b.flowSnapshot):await t(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
|
|
3
|
+
`+c.map(a=>`• ${a.message}`).join("\n");v.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${B}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=j.O,F=!0}}catch(a){v.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let L=!!b.debugMode&&!q,M=()=>{b.status="paused_debug",H({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!F)for(;;){if(G++,v.debug(`--- Starting Execution Step ${G} for Conv ${B} ---`),G>150){v.warn(`Max internal iterations (150) reached for conv ${B}. Breaking loop.`),d!==j.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=j.O);break}if(b.isCancelled){v.info(`Cancellation flag detected for conv ${B}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=j.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,v.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${B}.`);let c=await k.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:H});if(!c.success){v.error(`Debug tool processing failed for conv ${B}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=j.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(B,b),K();try{b.updatedAt=Date.now(),await x(C,b)}catch(a){v.error(`Failed to save state after debug tool execution for conv ${B}:`,a)}if(L){v.info(`[Debug Step] Paused after tool execution for conv ${B}.`),M();break}continue}if(!L&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b);if(a&&b.breakpoints.includes(a)&&b.lastBreakNodeId!==a){v.info(`Breakpoint hit at node ${a} for conv ${B}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,H({type:"breakpoint:hit",node:{nodeId:a}}),H({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await x(C,b)}catch(a){v.error(`Failed to save state on breakpoint for conv ${B}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);v.verbose(`Message history before step ${G}`,a)}else v.verbose(`No messages in history before step ${G}`);let a=await e.FlowExecutor.executeStep(b,H);if(b=a.sharedState,d=a.action,K(),b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",v.verbose(`Updated conversation title for ${B} after step ${G} to: ${b.title}`))}if(v.info(`Step ${G} completed for conv ${B}. Action: ${d}`,{currentNodeId:b.currentNodeId}),v.verbose(`Shared state after step ${G}`,b),v.debug(`[Action Handling] Step ${G}: Received action "${d}" for conv ${B}`),d===j.O){v.info(`[Action Handling] Step ${G}: Handling ERROR_ACTION for conv ${B}`),v.error(`Error action received during step ${G} for conv ${B}`,{error:b.lastResponse});break}if(d===j.g4){v.info(`[Action Handling] Step ${G}: Handling FINAL_RESPONSE_ACTION for conv ${B}`),v.info(`Final response action received at step ${G} for conv ${B}`),b.status="completed",v.info(`Setting conversation status to 'completed' for conv ${B}`);break}if(d===j.Jp){v.info(`[Action Handling] Step ${G}: Handling TOOL_CALL_ACTION for conv ${B}`),v.info(`Tool call action received at step ${G} for conv ${B}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(m)if(o){v.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${B}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(B,b);try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",v.verbose(`Updated conversation title for ${B} before pausing to: ${b.title}`))}await x(C,b),v.verbose(`Saved state before pausing for approval for conv ${B}`)}catch(a){v.error(`Failed to save state before pausing for approval for conv ${B}:`,a)}H({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}else if(L){v.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${B}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(B,b);try{b.updatedAt=Date.now(),await x(C,b)}catch(a){v.error(`Failed to save state before debug tool pause for conv ${B}:`,a)}M();break}else{v.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${B}`);let c=await k.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:H});if(!c.success){v.error(`Internal tool processing failed for conv ${B}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=j.O;break}v.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${B}`);let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(B,b),K(),v.info(`Continuing loop for conv ${B} after internal tool processing (no approval needed).`);continue}else{v.info(`[flujo=false] Tool call action received for conv ${B}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,l.$9)(a.function.name,b.toolNameMap)?(v.verbose("tool is internal:",a.function.name),f.push(a)):(v.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){v.info(`[flujo=false] Processing ${f.length} internal tools for conv ${B}. External tools (${g.length}) will be ignored this step.`);let a=await k.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:H});if(!a.success){v.error(`[flujo=false] Internal tool processing failed for conv ${B}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=j.O;break}v.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${B}`);let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),e.FlowExecutor.conversationStates.set(B,b),v.info(`Continuing loop for conv ${B} after internal tool processing (flujo=false).`);continue}if(g.length>0){v.info(`[flujo=false] Found ${g.length} external tools for conv ${B}. Wrapping in XML and returning.`);let a=[];for(let b of g)if("function"===b.type)try{let c=JSON.parse(b.function.arguments||"{}"),d="";for(let a in c){let b=String(c[a]).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'");d+=`
|
|
4
4
|
<${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
|
|
5
|
-
</${b.function.name}>`)}catch(c){
|
|
5
|
+
</${b.function.name}>`)}catch(c){v.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:B}),a.push(`<${b.function.name}>
|
|
6
6
|
<error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
|
|
7
|
-
</${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=j.g4,u.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${A}.`);break}u.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${A} but no tools found after classification. Treating as final.`),d=j.g4;break}u.warn(`TOOL_CALL_ACTION received for conv ${A} but no tool_calls found in last message. Treating as final.`),d=j.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){u.info(`[Action Handling] Step ${F}: Handling Handoff Action (Edge ID) for conv ${A}`),u.info(`Handoff action received for conv ${A}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){c=e.id,u.debug(`Found handoff tool call ID: ${c} for edge ${d}`);let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),u.info(`Appended tool result message for handoff tool call ${c}`)}else u.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else u.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);J();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,G({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),u.info(`Transitioning conv ${A} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(A,b),K){u.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${A}.`),L();break}u.info(`Continuing loop for conv ${A} after handoff.`);continue}u.error(`Handoff failed for conv ${A}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=j.O;break}if(d===j.E5){u.info(`[Action Handling] Step ${F}: Handling STAY_ON_NODE_ACTION for conv ${A}`),u.info(`Stay on node action received for conv ${A} at step ${F}`);break}u.warn(`Unrecognized action '${d}' received at step ${F} for conv ${A}. Treating as final response.`),d=j.g4;break}}catch(a){if(u.error(`Unhandled error during execution loop for conv ${A}`,{loopError:a}),d!==j.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=j.O}}d===j.O&&"error"!==b.status&&(b.status="error");let M=Date.now()-g,N=b.status||(d===j.g4?"completed":d===j.O?"error":"running");u.info(`Execution finished for conv ${A}. Final Action: ${d}, Final Status: ${N}`,{duration:`${M}ms`}),J(),("completed"===N||"error"===N)&&G({type:"run:done",status:N});try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",u.verbose(`Updated conversation title for ${A} before final return to: ${b.title}`))}await w(B,b),u.debug(`Saved final state for conversation ${A} before returning.`)}catch(a){u.error(`Failed to save final state for conversation ${A}:`,a)}e.FlowExecutor.conversationStates.set(A,b);let O=()=>{x&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(A)},P={conversationId:b.conversationId||A,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return u.info(`Returning paused debug state for conv ${A}`),{...P,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===j.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},u.error(`Returning error result for conv ${A}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),O(),{...P,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let Q=b.messages.length>0?b.messages[b.messages.length-1]:null,R="",S="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(S=b.lastResponse._flujo_xml_tools,R=Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:"",R+=(R?"\n\n":"")+S,b.lastResponse=R):R="string"==typeof b.lastResponse?b.lastResponse:Q?.role==="assistant"&&"string"==typeof Q.content?Q.content:d!==j.Jp||m?"Processing complete.":"";let T=S?void 0:Q?.role==="assistant"?Q.tool_calls:void 0;return u.info(`Returning success result for conv ${A}`,{action:d,status:b.status,flujo:m,requireApproval:o,flujodebug:p}),O(),{...P,status:b.status||(d===j.g4?"completed":"running"),outputText:R,toolCalls:T,pendingToolCalls:b.pendingToolCalls}}},70834:(a,b,c)=>{c.r(b),c.d(b,{ToolHandler:()=>i});var d=c(18230),e=c(8918),f=c(99924),g=c(59448);let h=(0,d.h)("backend/flow/execution/handlers/ToolHandler");class i{static sanitizeSchema(a){if(!a||"object"!=typeof a)return a;let b=JSON.parse(JSON.stringify(a));return"string"===b.type&&b.format&&"enum"!==b.format&&"date-time"!==b.format&&(b.description||(b.description=""),b.description+=` (format: ${b.format})`,delete b.format),b.properties&&Object.keys(b.properties).forEach(a=>{b.properties[a]=i.sanitizeSchema(b.properties[a])}),b.items&&(b.items=i.sanitizeSchema(b.items)),["oneOf","anyOf","allOf"].forEach(a=>{Array.isArray(b[a])&&(b[a]=b[a].map(a=>i.sanitizeSchema(a)))}),b}static prepareTools(a){let{availableTools:b}=a;if(h.verbose("prepareTools input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{tools:[]}};return h.verbose("prepareTools empty result",JSON.stringify(a)),a}try{for(let a of b){if(!a.name)return{success:!1,error:(0,e.Po)("invalid_tool","Tool missing required 'name' property","unknown")};if(!a.inputSchema)return{success:!1,error:(0,e.Po)("invalid_tool",`Tool '${a.name}' missing required 'inputSchema' property`,a.name)}}let a=b.map(a=>({type:"function",function:{name:a.name,description:a.description||`Tool: ${a.name}`,parameters:i.sanitizeSchema(a.inputSchema)}})),c={success:!0,value:{tools:a}};return h.verbose("prepareTools success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Po)("tool_preparation_failed",b instanceof Error?b.message:String(b),"unknown")};return h.verbose("prepareTools error result",JSON.stringify(a)),a}}static async processMCPNodes(a){let{mcpNodes:b}=a;if(h.verbose("processMCPNodes input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{availableTools:[]}};return h.verbose("processMCPNodes empty result",JSON.stringify(a)),a}try{let a=[];for(let c of b){let b=c.properties;if(b&&b.boundServer){let d=b.boundServer,h=b.enabledTools||[],i=b.toolTimeout;f.mcpService.setNodeRoots(d,c.id,b.roots);let j=await f.mcpService.connectServer(d);if(!j.success)return{success:!1,error:(0,e.Fp)("server_connection_failed",`Failed to connect to MCP server '${d}': ${j.error}`,d,"connect")};let k=await f.mcpService.listServerTools(d);if(k.error)return{success:!1,error:(0,e.Fp)("list_tools_failed",`Failed to list tools for MCP server '${d}': ${k.error}`,d,"listTools")};for(let b of(k.tools||[]).filter(a=>h.includes(a.name)).map(a=>({originalName:a.name,server:d,name:(0,g.Y6)(d,a.name),timeout:i,description:a.description,inputSchema:a.inputSchema})))a.some(a=>a.name===b.name)||a.push(b)}}let c={success:!0,value:{availableTools:a}};return h.verbose("processMCPNodes success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Fp)("mcp_processing_failed",b instanceof Error?b.message:String(b),"unknown","processMCPNodes")};return h.verbose("processMCPNodes error result",JSON.stringify(a)),a}}}},72440:(a,b,c)=>{c.d(b,{flowService:()=>k});var d=c(89850),e=c(79111),f=c(89392);let g=(0,c(18230).h)("backend/services/flow/index"),h=f.Z.FLOWS;async function i(){return global.__flujo_flowsMigration||(global.__flujo_flowsMigration=(async()=>{try{await (0,e.w5)(f.Z.FLOWS,h,a=>a.id)}catch(a){g.error("Flow storage migration failed",a),global.__flujo_flowsMigration=void 0}})()),global.__flujo_flowsMigration}class j{get flowsCache(){return global.__flujo_flowsCache??null}set flowsCache(a){global.__flujo_flowsCache=a}async loadFlows(){try{if(this.flowsCache)return g.debug("Using cached flows"),this.flowsCache;g.debug("Loading flows from storage"),await i();let a=await (0,e.pL)(h);return this.flowsCache=a,g.info("Loaded flows from storage",{count:a.length}),a}catch(a){return g.error("Failed to load flows",a),[]}}async getFlow(a){try{g.debug(`Getting flow by ID: ${a}`);let b=this.flowsCache?.find(b=>b.id===a)||null;if(b)return g.debug(`Flow ${a} found in cache`),b;await i();let c=null;try{c=await (0,e.EI)(h,a,null)}catch(b){g.debug(`getFlow: could not load flow ${a}`,b),c=null}if(c&&this.flowsCache){let a=this.flowsCache,b=a.findIndex(a=>a.id===c.id);b>=0?a[b]=c:a.push(c),this.flowsCache=a}return g.debug(`Flow ${a} ${c?"found":"not found"}`),c}catch(b){return g.error(`Failed to get flow ${a}`,b),null}}async invalidateExecutionCache(a){try{let{FlowExecutor:b}=await Promise.resolve().then(c.bind(c,96936));b.clearFlowCache(a),g.debug("Invalidated execution flow cache",{flowId:a??"all"})}catch(a){g.warn("Failed to invalidate execution flow cache",a)}}async saveFlow(a){try{g.debug(`Saving flow: ${a.id}`,{name:a.name}),(0,e.ln)(a.id),await i(),await (0,e.Vt)(h,a.id,a);let b=this.flowsCache;if(b){let c=b.findIndex(b=>b.id===a.id);c>=0?b[c]=a:b.push(a),this.flowsCache=b}return await this.invalidateExecutionCache(a.id),g.info(`Flow ${a.id} saved successfully`),{success:!0}}catch(a){return g.error("Failed to save flow",a),{success:!1,error:a instanceof Error?a.message:"Failed to save flow"}}}async deleteFlow(a){try{g.debug(`Deleting flow: ${a}`),await i(),await (0,e.bB)(h,a);let b=this.flowsCache;return b&&(this.flowsCache=b.filter(b=>b.id!==a)),await this.invalidateExecutionCache(a),g.info(`Flow ${a} deleted successfully`),{success:!0}}catch(b){return g.error(`Failed to delete flow: ${a}`,b),{success:!1,error:b instanceof Error?b.message:"Failed to delete flow"}}}createNode(a,b){g.debug(`Creating new node of type: ${a}`,{position:b});let c={id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}};return g.debug(`Node created with ID: ${c.id}`),c}createNewFlow(a="NewFlow"){g.debug(`Creating new flow: ${a}`);let b={id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}},c={id:(0,d.A)(),name:a,nodes:[b],edges:[]};return g.info(`New flow created with ID: ${c.id}`,{name:a}),c}createHistoryEntry(a,b){return g.debug("Creating history entry",{nodeCount:a.length,edgeCount:b.length}),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){g.debug(`Generating sample flow: ${a}`);let b={id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]};return g.info(`Sample flow generated with ID: ${b.id}`,{name:a}),b}async listFlows(){g.debug("listFlows: Entering method");try{let a=await this.loadFlows();return{success:!0,flows:a}}catch(a){return g.warn("listFlows: Failed to list flows:",a),{success:!1,error:a instanceof Error?a.message:"Failed to list flows"}}}}let k=new j},85701:(a,b,c)=>{c.d(b,{A:()=>d});let d=8},96249:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(94735),e=c(34115);let f=(0,c(18230).h)("backend/execution/flow/engine/ExecutionEventBus");class g{getChannel(a){let b=this.channels.get(a);if(!b){let c=new d.EventEmitter;c.setMaxListeners(0),b={emitter:c,seq:0,buffer:[]},this.channels.set(a,b)}return b}cancelCleanup(a){let b=this.cleanupTimers.get(a);b&&(clearTimeout(b),this.cleanupTimers.delete(a))}scheduleCleanup(a,b){this.cancelCleanup(a);let c=setTimeout(()=>{this.cleanupTimers.delete(a);let c=this.channels.get(a);c&&c.seq===b&&(c.emitter.listenerCount("event")>0||this.channels.delete(a))},3e5);"function"==typeof c.unref&&c.unref(),this.cleanupTimers.set(a,c)}emit(a,b){let c=this.getChannel(a),d={...b,conversationId:a,seq:c.seq++,timestamp:Date.now()};return c.buffer.push(d),c.buffer.length>1e3&&c.buffer.shift(),c.emitter.emit("event",d),(0,e.LB)(d),"run:done"===d.type?this.scheduleCleanup(a,c.seq):this.cancelCleanup(a),d}emitterFor(a){return b=>{try{this.emit(a,b)}catch(b){f.warn(`Failed to emit execution event for ${a}`,{err:b})}}}getBufferedSince(a,b){let c=this.channels.get(a);return c?c.buffer.filter(a=>a.seq>=b):[]}currentSeq(a){return this.channels.get(a)?.seq??0}subscribe(a,b){let c=this.getChannel(a);return c.emitter.on("event",b),()=>{c.emitter.off("event",b)}}constructor(){this.channels=new Map,this.cleanupTimers=new Map}}let h=globalThis,i=h.__flujoExecutionEventBus??(h.__flujoExecutionEventBus=new g)},96936:(a,b,c)=>{c.r(b),c.d(b,{FlowExecutor:()=>ab});var d=c(18230),e=c(26485),f=c(43304),g=c.n(f),h=c(86028),i=c(72440);let j=(0,d.h)("backend/execution/flow/temp_pocket"),k="default";class l{constructor(){j.debug("BaseNode constructor called"),this.flow_params={},this.node_params={},this.successors=new Map}setParams(a,b){j.debug("setParams called with params",{params:a}),j.verbose("setParams input",JSON.stringify({params:a,node_params:b})),this.flow_params=a,b&&(this.node_params=b),j.debug("setParams finished. flow_params count",{flow_params:this.flow_params?.length,node_params:this.node_params?.length}),j.verbose("setParams result",JSON.stringify({flow_params:this.flow_params,node_params:this.node_params}))}clone(){j.debug("clone called");let a=this._clone();return j.verbose("_clone result",{newNode:a}),a.flow_params=g()(this.flow_params),j.verbose("Cloned flow_params",{flow_params:a.flow_params}),a.node_params=g()(this.node_params),j.verbose("Cloned node_params",{node_params:a.node_params}),a.successors=new Map(this.successors),j.verbose("Cloned successors",{successors:a.successors}),j.verbose("clone finished"),a}addSuccessor(a,b=k){if(j.verbose(`addSuccessor called with action: ${b}`),this.successors.has(b))throw j.error(`Action ${b} already exists`),Error(`Action ${b} already exists`);this.successors.set(b,a),j.debug("addSuccessor finished. Successors",{successors:this.successors})}getSuccessor(a){if(j.debug(`getSuccessor called with name: ${a}`),!this.successors.has(a))return void j.error(`Successor ${a} not found`);let b=this.successors.get(a).clone();return j.debug("getSuccessor finished. Returning successor",{successor:b}),b}async execWrapper(a,b){j.debug("execWrapper called with prepResult",{prepResult:a}),j.verbose("execWrapper input",{prepResult:a,node_params:b});let c=await this.execCore(a,b);return j.debug("execWrapper finished. Result",{result:c}),j.verbose("execWrapper result",c),c}async run(a){j.debug("run called with sharedState",{sharedState:a}),j.debug("Current flow_params at start of run",{flow_params:this.flow_params}),j.verbose("run input",{sharedState:a,flow_params:this.flow_params,node_params:this.node_params});let b=await this.prep(a,this.node_params);j.verbose("run prepResult",b);let c=await this.execWrapper(b,this.node_params);j.verbose("run execResult",c);let d=await this.post(b,c,a,this.node_params);return j.debug("action",{action:d}),j.debug(`run finished. Returning action: ${d}`),j.verbose("run action result",{action:d,prepResult:b,execResult:c}),{action:d,prepResult:b,execResult:c}}}class m extends l{constructor(a){j.debug("Flow constructor called with start",{start:a}),super(),this.start=a}_clone(){j.debug("Flow _clone called");let a=new m(this.start);return j.debug("Flow _clone finished. Returning",{newFlow:a}),a}async getStartNode(){j.debug("getStartNode called");let a=this.start.clone();return j.debug("getStartNode finished. Returning",{clonedStart:a}),a}async execCore(a){throw j.error("Flow node does not support direct execution"),j.verbose("Flow execCore error",JSON.stringify({error:"Flow node does not support direct execution"})),Error("Flow node does not support direct execution")}async prep(a,b){return j.debug("Flow prep called with sharedState",{sharedState:a}),j.verbose("Flow prep input",JSON.stringify({sharedState:a,node_params:b})),j.debug("Flow prep finished. Returning empty object"),j.verbose("Flow prep result",JSON.stringify({})),{}}async post(a,b,c,d){return j.debug("Flow post called with prepResult, execResult, and sharedState",{prepResult:a,execResult:b,sharedState:c}),j.verbose("Flow post input",JSON.stringify({prepResult:a,execResult:b,node_params:d})),j.debug("Flow post finished. Returning DEFAULT_ACTION"),j.verbose("Flow post result",JSON.stringify({action:k})),k}}let n=(0,d.h)("execution/nodes/StartNode.ts");class o extends l{async prep(a,b){n.info("prep() started");let c=b?.properties?.promptTemplate||"";n.info("Extracted promptTemplate",{promptTemplateLength:c.length,promptTemplatePreview:c.length>100?c.substring(0,100)+"...":c});let d={nodeId:b?.id||"",nodeType:"start",systemPrompt:c};return n.info("prep() completed"),d}async execCore(a,b){n.info("execCore() started"),n.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return n.verbose("execCore() execResult",JSON.stringify(c)),n.info("execCore() completed"),c}async post(a,b,c,d){if(n.info("post() started"),n.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"StartNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Start Node",timestamp:new Date().toISOString()}),n.info("Added StartNode tracking information")),a.systemPrompt){let b={role:"system",content:a.systemPrompt,id:crypto.randomUUID(),timestamp:Date.now()};c.messages.some(a=>"system"===a.role)||(c.messages.push(b),n.debug("Added system message",{contentLength:"string"==typeof b.content?b.content.length:"non-string content",contentPreview:"string"==typeof b.content&&b.content.length>50?b.content.substring(0,50)+"...":b.content}))}n.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(n.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return n.info(`post() completed, returning action: ${a}`),a}return n.info("post() completed, returning default action"),"default"}_clone(){return new o}}var p=c(12763),q=c(99924),r=c(8336);c(87507);let s=(0,d.h)("backend/utils/PromptRenderer");class t{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;s.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:i}=await this.findNodePrompt(b,a),j=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,k=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,l=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:i;s.debug("Exclusion settings",{excludeModelPrompt:j,excludeStartNodePrompt:k,excludeSystemPrompt:l,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let m="",n=null;if(!k){let b=await this.findStartNodePrompt(a);b&&(s.debug("Adding start node prompt",{length:b.length}),m+=b+"\n\n")}if(!j){let c=await this.findModelPrompt(b,a);c.prompt&&(s.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),m+=c.prompt+"\n\n"),n=c.functionCallingSchema,c.reasoningSchema&&(m+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
|
|
7
|
+
</${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=j.g4,v.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${B}.`);break}v.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${B} but no tools found after classification. Treating as final.`),d=j.g4;break}v.warn(`TOOL_CALL_ACTION received for conv ${B} but no tool_calls found in last message. Treating as final.`),d=j.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){v.info(`[Action Handling] Step ${G}: Handling Handoff Action (Edge ID) for conv ${B}`),v.info(`Handoff action received for conv ${B}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c,f=b.messages.length>0?b.messages[b.messages.length-1]:null;if(f?.role==="assistant"&&f.tool_calls){let e=f.tool_calls.find(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_")));if(e){if(c=e.id,v.debug(`Found handoff tool call ID: ${c} for edge ${d}`),"function"===e.type)try{let c=JSON.parse(e.function.arguments||"{}"),d="string"==typeof c?.prompt?c.prompt.trim():"";d&&(b.handoffInput={targetNodeId:a,prompt:d},v.info(`Captured caller prompt for handoff to node ${a} (${d.length} chars)`))}catch(a){v.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller prompt`,{parseError:a})}let f={id:crypto.randomUUID(),role:"tool",tool_call_id:c,content:JSON.stringify({status:"Handoff processed",targetNodeId:a}),timestamp:Date.now(),processNodeId:b.currentNodeId};b.messages.push(f),v.info(`Appended tool result message for handoff tool call ${c}`)}else v.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`)}else v.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);K();let g=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,H({type:"handoff",from:g?{nodeId:g}:void 0,toNodeId:a,edgeId:d}),v.info(`Transitioning conv ${B} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(B,b),L){v.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${B}.`),M();break}v.info(`Continuing loop for conv ${B} after handoff.`);continue}v.error(`Handoff failed for conv ${B}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=j.O;break}if(d===j.E5){v.info(`[Action Handling] Step ${G}: Handling STAY_ON_NODE_ACTION for conv ${B}`),v.info(`Stay on node action received for conv ${B} at step ${G}`);break}v.warn(`Unrecognized action '${d}' received at step ${G} for conv ${B}. Treating as final response.`),d=j.g4;break}}catch(a){if(v.error(`Unhandled error during execution loop for conv ${B}`,{loopError:a}),d!==j.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=j.O}}d===j.O&&"error"!==b.status&&(b.status="error");let N=Date.now()-g,O=b.status||(d===j.g4?"completed":d===j.O?"error":"running");v.info(`Execution finished for conv ${B}. Final Action: ${d}, Final Status: ${O}`,{duration:`${N}ms`}),K(),("completed"===O||"error"===O)&&H({type:"run:done",status:O});try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=a.content.split(" ").slice(0,5).join(" ")+"...",v.verbose(`Updated conversation title for ${B} before final return to: ${b.title}`))}await x(C,b),v.debug(`Saved final state for conversation ${B} before returning.`)}catch(a){v.error(`Failed to save final state for conversation ${B}:`,a)}e.FlowExecutor.conversationStates.set(B,b);let P=()=>{y&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(B)},Q={conversationId:b.conversationId||B,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return v.info(`Returning paused debug state for conv ${B}`),{...Q,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===j.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},v.error(`Returning error result for conv ${B}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),P(),{...Q,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let R=b.messages.length>0?b.messages[b.messages.length-1]:null,S="",T="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(T=b.lastResponse._flujo_xml_tools,S=R?.role==="assistant"&&"string"==typeof R.content?R.content:"",S+=(S?"\n\n":"")+T,b.lastResponse=S):S="string"==typeof b.lastResponse?b.lastResponse:R?.role==="assistant"&&"string"==typeof R.content?R.content:d!==j.Jp||m?"Processing complete.":"";let U=T?void 0:R?.role==="assistant"?R.tool_calls:void 0;return v.info(`Returning success result for conv ${B}`,{action:d,status:b.status,flujo:m,requireApproval:o,flujodebug:p}),P(),{...Q,status:b.status||(d===j.g4?"completed":"running"),outputText:S,toolCalls:U,pendingToolCalls:b.pendingToolCalls}}},70834:(a,b,c)=>{c.r(b),c.d(b,{ToolHandler:()=>i});var d=c(18230),e=c(8918),f=c(99924),g=c(59448);let h=(0,d.h)("backend/flow/execution/handlers/ToolHandler");class i{static sanitizeSchema(a){if(!a||"object"!=typeof a)return a;let b=JSON.parse(JSON.stringify(a));return"string"===b.type&&b.format&&"enum"!==b.format&&"date-time"!==b.format&&(b.description||(b.description=""),b.description+=` (format: ${b.format})`,delete b.format),b.properties&&Object.keys(b.properties).forEach(a=>{b.properties[a]=i.sanitizeSchema(b.properties[a])}),b.items&&(b.items=i.sanitizeSchema(b.items)),["oneOf","anyOf","allOf"].forEach(a=>{Array.isArray(b[a])&&(b[a]=b[a].map(a=>i.sanitizeSchema(a)))}),b}static prepareTools(a){let{availableTools:b}=a;if(h.verbose("prepareTools input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{tools:[]}};return h.verbose("prepareTools empty result",JSON.stringify(a)),a}try{for(let a of b){if(!a.name)return{success:!1,error:(0,e.Po)("invalid_tool","Tool missing required 'name' property","unknown")};if(!a.inputSchema)return{success:!1,error:(0,e.Po)("invalid_tool",`Tool '${a.name}' missing required 'inputSchema' property`,a.name)}}let a=[...b].sort((a,b)=>a.name<b.name?-1:+(a.name>b.name)).map(a=>({type:"function",function:{name:a.name,description:a.description||`Tool: ${a.name}`,parameters:i.sanitizeSchema(a.inputSchema)}})),c={success:!0,value:{tools:a}};return h.verbose("prepareTools success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Po)("tool_preparation_failed",b instanceof Error?b.message:String(b),"unknown")};return h.verbose("prepareTools error result",JSON.stringify(a)),a}}static async processMCPNodes(a){let{mcpNodes:b}=a;if(h.verbose("processMCPNodes input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{availableTools:[]}};return h.verbose("processMCPNodes empty result",JSON.stringify(a)),a}try{let a=[];for(let c of b){let b=c.properties;if(b&&b.boundServer){let d=b.boundServer,h=b.enabledTools||[],i=b.toolTimeout;f.mcpService.setNodeRoots(d,c.id,b.roots);let j=await f.mcpService.connectServer(d);if(!j.success)return{success:!1,error:(0,e.Fp)("server_connection_failed",`Failed to connect to MCP server '${d}': ${j.error}`,d,"connect")};let k=await f.mcpService.listServerTools(d);if(k.error)return{success:!1,error:(0,e.Fp)("list_tools_failed",`Failed to list tools for MCP server '${d}': ${k.error}`,d,"listTools")};for(let b of(k.tools||[]).filter(a=>h.includes(a.name)).map(a=>({originalName:a.name,server:d,name:(0,g.Y6)(d,a.name),timeout:i,description:a.description,inputSchema:a.inputSchema})))a.some(a=>a.name===b.name)||a.push(b)}}let c={success:!0,value:{availableTools:a}};return h.verbose("processMCPNodes success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Fp)("mcp_processing_failed",b instanceof Error?b.message:String(b),"unknown","processMCPNodes")};return h.verbose("processMCPNodes error result",JSON.stringify(a)),a}}}},85701:(a,b,c)=>{c.d(b,{A:()=>d});let d=8},95082:(a,b,c)=>{c.d(b,{s:()=>s});var d=c(18230),e=c(8918),f=c(59448),g=c(18975),h=c(1191),i=c(12763),j=c(22124),k=c(25713),l=c(99924),m=c(69088),n=c(96249);let o=globalThis,p=o.__flujoToolApprovals??(o.__flujoToolApprovals=new Map);var q=c(89850);let r=(0,d.h)("backend/flow/execution/handlers/ModelHandler");class s{static async resolveToolUiLink(a,b){let c=function(a){if(a&&"object"==typeof a){for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if("string"==typeof a&&a.trim().toLowerCase().startsWith("ui://"))return a}}}(b?._meta);if(c)try{let b=await l.mcpService.loadServerConfigs();if(!Array.isArray(b))return;let d=b.find(b=>b.name===a);if(!d?.enableMcpApps)return;return{uri:c,serverName:a}}catch(b){r.warn(`resolveToolUiLink: failed to check MCP Apps opt-in for ${a}`,b);return}}static extractProviderErrorDetails(a,b){let c=b||a?.message||"Provider returned an unspecified error in the response body.";b&&"string"==typeof a?.message&&a.message&&a.message!==b&&(c=`${b} - ${a.message}`);let d=a?.metadata;if(d){let a;if("string"==typeof d.raw)try{let b=JSON.parse(d.raw);a=b?.error?.message||b?.message||d.raw}catch{a=d.raw}else d.raw&&"object"==typeof d.raw&&(a=d.raw.error?.message||d.raw.message);let b=[];d.provider_name&&b.push(String(d.provider_name)),a&&b.push(a),b.length>0&&(c=`${c} (upstream: ${b.join(": ")})`)}return"string"==typeof a?.origin&&a.origin&&(c=`${c} (origin: ${a.origin})`),{message:c,code:a?.code,type:a?.type,param:a?.param,retryAfter:d?.retry_after_seconds!=null?String(d.retry_after_seconds):void 0,providerError:a}}static persistStreamedMessage(a,b){try{let{FlowExecutor:d}=c(96936),e=d.conversationStates.get(a);if(!e||!Array.isArray(e.messages))return;!function(a,b){let c=a.findIndex(a=>a.id===b.id);c>=0?a[c]=b:a.push(b)}(e.messages,b),e.updatedAt=Date.now()}catch(b){r.warn(`Failed to fold streamed message into conversation ${a}`,{err:b})}}static async callModel(a){let b,{modelId:c,prompt:d,messages:e,wireMessages:f,tools:g,nodeName:h,nodeId:k,toolNameMap:l,maxTurns:m,conversationId:o,requireToolApproval:t}=a;try{let a=await i.modelService.getModel(c);a&&(a.displayName||a.name,a.name,b=a.maxTurns)}catch(a){r.warn(`Failed to fetch model information for prefix: ${a instanceof Error?a.message:String(a)}`)}let u=function(a,b,c=j.m){return"number"==typeof a&&Number.isFinite(a)&&a>0?a:"number"==typeof b&&Number.isFinite(b)&&b>0?b:c}(m,b);r.info("callModel - Single execution",{modelId:c,messagesCount:e.length,toolsCount:g?.length||0,nodeName:h,nodeId:k}),r.verbose("callModel input",a);let v=o?n.$.emitterFor(o):void 0,w=t&&v&&o?async a=>{let b={id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args??{})}};return new Promise(a=>{let c;(c=p.get(o))||(c=new Map,p.set(o,c)),c.set(b.id,{toolCall:b,resolve:a}),v({type:"run:awaiting_approval",pendingToolCalls:function(a){let b=p.get(a);return b?Array.from(b.values(),a=>a.toolCall):[]}(o)})})}:void 0,x=v?a=>{let b=k?{...a,processNodeId:k}:a;v({type:"message",message:b,node:k?{nodeId:k}:void 0}),o&&s.persistStreamedMessage(o,b)}:void 0,y=await this.generateCompletion(c,d,f??e,g,{toolNameMap:l,maxTurns:u,requestToolApproval:w,onTranscriptMessage:x});if(!y.success)return r.verbose("callModel error response",y),{success:!1,error:y.error};let z=y.value,A=z.content||"",B=[...e],C=function(a){if(!a)return;let b=a.prompt_tokens_details?.cached_tokens;return{promptTokens:a.prompt_tokens??0,completionTokens:a.completion_tokens??0,totalTokens:a.total_tokens??0,...null!=b?{cacheReadTokens:b}:{}}}(z.fullResponse?.usage);if(z.transcript&&z.transcript.length>0){let a=Date.now(),b=z.transcript;b.forEach((c,d)=>{let e=d===b.length-1;B.push({...c,id:c.id??(0,q.A)(),timestamp:c.timestamp??a+d,processNodeId:k,...e&&C?{usage:C}:{}})})}else{let a={id:(0,q.A)(),role:"assistant",content:A,tool_calls:z.fullResponse?.choices?.[0]?.message?.tool_calls,timestamp:Date.now(),processNodeId:k,...C?{usage:C}:{}};B.push(a)}let D=z.fullResponse?.choices?.[0]?.message?.tool_calls?.map(a=>{try{return{name:a.function.name,args:JSON.parse(a.function.arguments),id:a.id,result:""}}catch(b){return r.warn(`Failed to parse tool arguments for call ${a.id}`,{args:a.function.arguments,error:b}),{name:a.function.name,args:{},id:a.id,result:""}}}).filter(Boolean),E={success:!0,value:{content:A,messages:B,fullResponse:z.fullResponse,toolCalls:D}};return r.verbose("callModel single step result",E),E}static async generateCompletion(a,b,d,f,j){r.verbose("generateCompletion input",{modelId:a,prompt:b,messages:d,tools:f});try{let b,h=await i.modelService.getModel(a);if(!h)return{success:!1,error:(0,e.M5)("model_not_found",`Model not found: ${a}`,a)};let l=h.temperature?parseFloat(h.temperature):0,m=await i.modelService.resolveAndDecryptApiKey(h.ApiKey);if(!m)return{success:!1,error:(0,e.M5)("api_key_error","Failed to resolve or decrypt API key",a)};r.verbose(`decrypted api key ${m}`),r.verbose(` baseurl ${h.baseUrl}`);let n=(0,g.ae)(d);if(f&&f.length>0){let{ToolHandler:a}=c(70834);b=f.map(b=>"function"===b.type&&b.function.parameters?{...b,function:{...b.function,parameters:a.sanitizeSchema(b.function.parameters)}}:b)}let o=(0,k.getCompletionAdapter)(h);r.debug("calling chatcompletion"),r.verbose("calling chatcompletion now with ADAPTER",h.adapter||"openai"),r.verbose("calling chatcompletion now with MODEL",h.name),r.verbose("calling chatcompletion now with TEMP",l),r.verbose("calling chatcompletion now with MESSAGES",n),r.verbose("calling chatcompletion now with TOOLS",b),r.debug("[ModelHandler.generateCompletion] Sending request via adapter",{adapter:h.adapter||"openai",model:h.name});let{completion:p,transcript:q}=await o.createCompletion({model:h,apiKey:m,messages:n,tools:b,temperature:l,toolNameMap:j?.toolNameMap,maxTurns:j?.maxTurns,requestToolApproval:j?.requestToolApproval,onTranscriptMessage:j?.onTranscriptMessage});if(r.debug("[ModelHandler.generateCompletion] Received raw response from OpenAI API",{response:p}),r.verbose("chatcompletion returned"),r.verbose("chatcompletion returned",p),p&&"object"==typeof p&&"error"in p&&p.error){r.warn("API call returned successfully but contained an error object:",JSON.stringify(p.error));let b=p.error,c=s.extractProviderErrorDetails(b),d={success:!1,error:(0,e.M5)("api_error",c.message,a,void 0,{code:c.code,type:c.type,param:c.param,retryAfter:c.retryAfter,providerError:c.providerError})};return r.verbose("generateCompletion returning error from response body",d),d}let t=p?.choices?.[0];if(!t)return r.error("API response missing choices array or first choice.",{response:p}),{success:!1,error:(0,e.M5)("api_error","Invalid response structure from API: Missing choices.",a,void 0,{rawResponse:p})};let u={success:!0,value:{content:t.message?.content||"",messages:[...d],fullResponse:p,transcript:q}};return r.verbose("generateCompletion success result",u),u}catch(c){if(r.error("[ModelHandler.generateCompletion] Caught error during OpenAI API call",{rawError:c}),r.error("--- Error during openai.chat.completions.create ---"),c instanceof Error?(r.error(`Error Name: ${c.name}`),r.error(`Error Message: ${c.message}`),r.error(`Error Stack: ${c.stack}`)):r.error("Caught non-Error object:",c),c instanceof h.Ay.APIError&&(r.error(`API Error Status: ${c.status}`),r.error(`API Error Type: ${c.type}`),r.error(`API Error Code: ${c.code}`),r.error(`API Error Param: ${c.param}`),r.error(`API Error Headers: ${JSON.stringify(c.headers)}`)),r.error("--- End Error Details ---"),c instanceof h.Ay.APIError){let b=c.error,d=s.extractProviderErrorDetails(b,c.message),f=c.headers||{},g=f["retry-after"]??f["Retry-After"],h=void 0!==g?String(g):d.retryAfter,i=f["x-ratelimit-reset"]??f["x-ratelimit-reset-requests"],j={success:!1,error:(0,e.M5)("api_error",d.message,a,void 0,{status:c.status,type:d.type??c.type,code:d.code??c.code,param:d.param??c.param,retryAfter:h,rateLimitReset:void 0!==i?String(i):void 0,providerError:d.providerError,stack:c.stack})};return r.verbose("generateCompletion API error",j),j}let b={success:!1,error:(0,e.M5)("unknown_error",c instanceof Error?c.message:String(c),a,void 0,{stack:c instanceof Error?c.stack:void 0})};return r.verbose("generateCompletion unknown error",b),b}}static async processToolCalls(a){let{toolCalls:b,toolNameMap:c,emit:d}=a;if(r.verbose("processToolCalls input",a),!b||0===b.length){let a={success:!0,value:{toolCallMessages:[],processedToolCalls:[]}};return r.verbose("processToolCalls empty result",a),a}try{let a=[],e=[];for(let g of b){let{id:b,function:{name:h,arguments:i}}=g;try{let g=JSON.parse(i);if(r.info("trying to call tool",h),h.startsWith("handoff_to_")||"handoff"===h){r.info(`Processing handoff tool: ${h}`);let c={handoff:!0,args:g},d=JSON.stringify(c);a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:d,timestamp:Date.now()}),e.push({name:h,args:g,id:b,result:d});continue}let j=(0,f.ud)(h,c);if(!j)throw r.error("invalid tool format",h),Error(`Invalid tool name format: ${h}`);let k=j.server,n=j.tool;d?.({type:"tool:call",toolCallId:b,name:h,args:i});let o=j.timeout??m.aI,p=await l.mcpService.callTool(k,n,g,o,a=>d?.({type:"tool:progress",toolCallId:b,name:h,progress:a.progress,total:a.total,message:a.message})),t=p.success?JSON.stringify(p.data):`Error: ${p.error}`;d?.({type:"tool:result",toolCallId:b,name:h,result:t.length>500?`${t.slice(0,500)}…`:t,isError:!p.success});let u=p.success?await s.resolveToolUiLink(k,p.data):void 0;a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:t,timestamp:Date.now(),...u?{ui:u}:{}}),e.push({name:h,args:g,id:b,result:t})}catch(f){let c=`Error: ${f instanceof Error?f.message:"Unknown error"}`;d?.({type:"tool:result",toolCallId:b,name:h,result:c,isError:!0}),a.push({id:(0,q.A)(),role:"tool",tool_call_id:b,content:c,timestamp:Date.now()}),e.push({name:h,args:{},id:b,result:c})}}let g={success:!0,value:{toolCallMessages:a,processedToolCalls:e}};return r.verbose("processToolCalls success result",g),g}catch(b){let a={success:!1,error:(0,e.Po)("tool_processing_failed",b instanceof Error?b.message:String(b),"unknown")};return r.verbose("processToolCalls error result",a),a}}static hasToolCalls(a){return!!(a.fullResponse?.choices?.[0]?.message?.tool_calls&&a.fullResponse.choices[0].message.tool_calls.length>0)}}},96249:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(94735),e=c(34115);let f=(0,c(18230).h)("backend/execution/flow/engine/ExecutionEventBus");class g{getChannel(a){let b=this.channels.get(a);if(!b){let c=new d.EventEmitter;c.setMaxListeners(0),b={emitter:c,seq:0,buffer:[]},this.channels.set(a,b)}return b}cancelCleanup(a){let b=this.cleanupTimers.get(a);b&&(clearTimeout(b),this.cleanupTimers.delete(a))}scheduleCleanup(a,b){this.cancelCleanup(a);let c=setTimeout(()=>{this.cleanupTimers.delete(a);let c=this.channels.get(a);c&&c.seq===b&&(c.emitter.listenerCount("event")>0||this.channels.delete(a))},3e5);"function"==typeof c.unref&&c.unref(),this.cleanupTimers.set(a,c)}emit(a,b){let c=this.getChannel(a),d={...b,conversationId:a,seq:c.seq++,timestamp:Date.now()};return c.buffer.push(d),c.buffer.length>1e3&&c.buffer.shift(),c.emitter.emit("event",d),(0,e.LB)(d),"run:done"===d.type?this.scheduleCleanup(a,c.seq):this.cancelCleanup(a),d}emitterFor(a){return b=>{try{this.emit(a,b)}catch(b){f.warn(`Failed to emit execution event for ${a}`,{err:b})}}}getBufferedSince(a,b){let c=this.channels.get(a);return c?c.buffer.filter(a=>a.seq>=b):[]}currentSeq(a){return this.channels.get(a)?.seq??0}subscribe(a,b){let c=this.getChannel(a);return c.emitter.on("event",b),()=>{c.emitter.off("event",b)}}constructor(){this.channels=new Map,this.cleanupTimers=new Map}}let h=globalThis,i=h.__flujoExecutionEventBus??(h.__flujoExecutionEventBus=new g)},96936:(a,b,c)=>{c.r(b),c.d(b,{FlowExecutor:()=>ab});var d=c(18230),e=c(26485),f=c(43304),g=c.n(f),h=c(86028),i=c(11659);let j=(0,d.h)("backend/execution/flow/temp_pocket"),k="default";class l{constructor(){j.debug("BaseNode constructor called"),this.flow_params={},this.node_params={},this.successors=new Map}setParams(a,b){j.debug("setParams called with params",{params:a}),j.verbose("setParams input",JSON.stringify({params:a,node_params:b})),this.flow_params=a,b&&(this.node_params=b),j.debug("setParams finished. flow_params count",{flow_params:this.flow_params?.length,node_params:this.node_params?.length}),j.verbose("setParams result",JSON.stringify({flow_params:this.flow_params,node_params:this.node_params}))}clone(){j.debug("clone called");let a=this._clone();return j.verbose("_clone result",{newNode:a}),a.flow_params=g()(this.flow_params),j.verbose("Cloned flow_params",{flow_params:a.flow_params}),a.node_params=g()(this.node_params),j.verbose("Cloned node_params",{node_params:a.node_params}),a.successors=new Map(this.successors),j.verbose("Cloned successors",{successors:a.successors}),j.verbose("clone finished"),a}addSuccessor(a,b=k){if(j.verbose(`addSuccessor called with action: ${b}`),this.successors.has(b))throw j.error(`Action ${b} already exists`),Error(`Action ${b} already exists`);this.successors.set(b,a),j.debug("addSuccessor finished. Successors",{successors:this.successors})}getSuccessor(a){if(j.debug(`getSuccessor called with name: ${a}`),!this.successors.has(a))return void j.error(`Successor ${a} not found`);let b=this.successors.get(a).clone();return j.debug("getSuccessor finished. Returning successor",{successor:b}),b}async execWrapper(a,b){j.debug("execWrapper called with prepResult",{prepResult:a}),j.verbose("execWrapper input",{prepResult:a,node_params:b});let c=await this.execCore(a,b);return j.debug("execWrapper finished. Result",{result:c}),j.verbose("execWrapper result",c),c}async run(a){j.debug("run called with sharedState",{sharedState:a}),j.debug("Current flow_params at start of run",{flow_params:this.flow_params}),j.verbose("run input",{sharedState:a,flow_params:this.flow_params,node_params:this.node_params});let b=await this.prep(a,this.node_params);j.verbose("run prepResult",b);let c=await this.execWrapper(b,this.node_params);j.verbose("run execResult",c);let d=await this.post(b,c,a,this.node_params);return j.debug("action",{action:d}),j.debug(`run finished. Returning action: ${d}`),j.verbose("run action result",{action:d,prepResult:b,execResult:c}),{action:d,prepResult:b,execResult:c}}}class m extends l{constructor(a){j.debug("Flow constructor called with start",{start:a}),super(),this.start=a}_clone(){j.debug("Flow _clone called");let a=new m(this.start);return j.debug("Flow _clone finished. Returning",{newFlow:a}),a}async getStartNode(){j.debug("getStartNode called");let a=this.start.clone();return j.debug("getStartNode finished. Returning",{clonedStart:a}),a}async execCore(a){throw j.error("Flow node does not support direct execution"),j.verbose("Flow execCore error",JSON.stringify({error:"Flow node does not support direct execution"})),Error("Flow node does not support direct execution")}async prep(a,b){return j.debug("Flow prep called with sharedState",{sharedState:a}),j.verbose("Flow prep input",JSON.stringify({sharedState:a,node_params:b})),j.debug("Flow prep finished. Returning empty object"),j.verbose("Flow prep result",JSON.stringify({})),{}}async post(a,b,c,d){return j.debug("Flow post called with prepResult, execResult, and sharedState",{prepResult:a,execResult:b,sharedState:c}),j.verbose("Flow post input",JSON.stringify({prepResult:a,execResult:b,node_params:d})),j.debug("Flow post finished. Returning DEFAULT_ACTION"),j.verbose("Flow post result",JSON.stringify({action:k})),k}}let n=(0,d.h)("execution/nodes/StartNode.ts");class o extends l{async prep(a,b){n.info("prep() started");let c=b?.properties?.promptTemplate||"";n.info("Extracted promptTemplate",{promptTemplateLength:c.length,promptTemplatePreview:c.length>100?c.substring(0,100)+"...":c});let d={nodeId:b?.id||"",nodeType:"start",systemPrompt:c};return n.info("prep() completed"),d}async execCore(a,b){n.info("execCore() started"),n.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return n.verbose("execCore() execResult",JSON.stringify(c)),n.info("execCore() completed"),c}async post(a,b,c,d){if(n.info("post() started"),n.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"StartNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Start Node",timestamp:new Date().toISOString()}),n.info("Added StartNode tracking information")),a.systemPrompt){let b={role:"system",content:a.systemPrompt,id:crypto.randomUUID(),timestamp:Date.now()};c.messages.some(a=>"system"===a.role)||(c.messages.push(b),n.debug("Added system message",{contentLength:"string"==typeof b.content?b.content.length:"non-string content",contentPreview:"string"==typeof b.content&&b.content.length>50?b.content.substring(0,50)+"...":b.content}))}n.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(n.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return n.info(`post() completed, returning action: ${a}`),a}return n.info("post() completed, returning default action"),"default"}_clone(){return new o}}var p=c(12763),q=c(99924),r=c(8336);c(87507);let s=(0,d.h)("backend/utils/PromptRenderer");class t{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;s.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:i}=await this.findNodePrompt(b,a),j=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,k=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,l=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:i;s.debug("Exclusion settings",{excludeModelPrompt:j,excludeStartNodePrompt:k,excludeSystemPrompt:l,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let m="",n=null;if(!k){let b=await this.findStartNodePrompt(a);b&&(s.debug("Adding start node prompt",{length:b.length}),m+=b+"\n\n")}if(!j){let c=await this.findModelPrompt(b,a);c.prompt&&(s.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),m+=c.prompt+"\n\n"),n=c.functionCallingSchema,c.reasoningSchema&&(m+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
|
|
8
8
|
|
|
9
9
|
`),n&&(m+=`Please use the following pattern to use a tool: ${n}
|
|
10
10
|
|
|
@@ -30,6 +30,8 @@ ${JSON.stringify(d,null,2)}]`}formatToolDescriptionXML(a,b,c){let d=`<${b}>
|
|
|
30
30
|
`;if(c.inputSchema?.properties)for(let a in c.inputSchema.properties){let b=c.inputSchema.properties[a];d+=` <${a}>${b.description||a}</${a}>
|
|
31
31
|
`}return d+=`</${b}>`,`[Tool: \`tool:${a}__${b}\` (${c.description||"No description"})
|
|
32
32
|
Example usage:
|
|
33
|
-
${d}]`}formatToolParameters(a){if(!a.inputSchema||!a.inputSchema.properties)return"";let b=[];for(let c in a.inputSchema.properties){let d=a.inputSchema.properties[c],e=d.description?`(${d.description})`:"";b.push(`\`${c}\` ${e}`)}return b.length>0?` with parameters ${b.join(", ")}`:""}delay(a){return new Promise(b=>setTimeout(b,a))}}let u=new t;var v=c(70834),w=c(
|
|
33
|
+
${d}]`}formatToolParameters(a){if(!a.inputSchema||!a.inputSchema.properties)return"";let b=[];for(let c in a.inputSchema.properties){let d=a.inputSchema.properties[c],e=d.description?`(${d.description})`:"";b.push(`\`${c}\` ${e}`)}return b.length>0?` with parameters ${b.join(", ")}`:""}delay(a){return new Promise(b=>setTimeout(b,a))}}let u=new t;var v=c(70834),w=c(95082),x=c(18975),y=c(85701);function z(a,b){let c=a.replace(/\s+/g," ").trim();if(c.length<=b)return c;let d=c.slice(0,b),e=d.lastIndexOf(" ");return`${(e>.6*b?d.slice(0,e):d).trimEnd()}…`}let A=(0,d.h)("backend/execution/flow/buildHandoffDescription");async function B(a,b){if(!a)return;if(b.modelNames.has(a))return b.modelNames.get(a);let c=a;try{let b=await p.modelService.getModel(a);b&&(c=b.displayName&&b.displayName.trim()||b.name||a)}catch(b){A.debug("resolveModelName failed; using raw id",{modelId:a,err:b})}return b.modelNames.set(a,c),c}async function C(a,b){if(b.serverConnected.has(a))return b.serverConnected.get(a);let c=!1;try{let b=await q.mcpService.getServerStatus(a);c=b?.status==="connected"}catch(b){A.debug("getServerStatus failed; treating server as offline",{server:a,err:b})}return b.serverConnected.set(a,c),c}async function D(a,b){if(b.flows.has(a))return b.flows.get(a);let c=null;try{c=await i.flowService.getFlow(a)}catch(b){A.debug("getFlow failed while summarising subflow",{flowId:a,err:b})}return b.flows.set(a,c),c}async function E(a,b){let c=Array.isArray(a.mcpNodes)?a.mcpNodes:[],d=[],e=new Set;for(let a of c){let c=a?.properties?.boundServer;if(!c||e.has(c))continue;e.add(c);let f=await C(c,b),g=Array.isArray(a?.properties?.enabledTools)?a.properties.enabledTools:[];d.push({name:c,connected:f,tools:f?g:void 0})}return d}async function F(a,b,c,d){let e=a.data?.type||a.type||"unknown",f=a.data?.label||"Unknown Node",g=a.data?.properties||{},h=a.data?.description,i={label:f,type:e,userDescription:h};if(h&&h.trim())return i;if("subflow"===e){let a=g.subflowId;if(!a)return i.subflowMissing=!0,i;if(b+1>y.A||d.has(a)){i.depthCapReached=!0;let b=await D(a,c);return i.subflowName=b?.name,i}let e=await D(a,c);if(!e)return i.subflowMissing=!0,i;i.subflowName=e.name;let f=new Set(d);f.add(a);let h=(e.nodes||[]).filter(a=>a.data?.type==="process"||a.data?.type==="subflow"||"process"===a.type||"subflow"===a.type);for(let a of(i.children=[],h))i.children.push(await F(a,b+1,c,f));return i}i.modelName=await B(g.boundModel,c);let j=g.promptTemplate;return"string"==typeof j&&j.trim()&&(i.promptSummary=j),i.servers=await E(g,c),i}async function G(a){try{let b=await F(a,0,{modelNames:new Map,serverConnected:new Map,flows:new Map},new Set);return function(a){if(a.userDescription&&a.userDescription.trim())return z(a.userDescription,1500);let b=`Hand off execution to ${a.label} (${a.type}).`,c=[];!function a(b,c,d){let e=" ".repeat(c);if(b.userDescription&&b.userDescription.trim())return void d.push(`${e}${z(b.userDescription,200)}`);if("subflow"===b.type){if(b.subflowMissing)return void d.push(`${e}Runs a subflow (referenced flow not found).`);if(b.subflowDetailsUnavailable){let a=b.subflowName?` "${b.subflowName}"`:"";d.push(`${e}Runs a subflow${a} (contents summarised when the flow runs).`);return}if(d.push(`${e}Runs the subflow "${b.subflowName??"unknown"}", which contains:`),b.depthCapReached)return void d.push(`${e} (nested subflows omitted — recursion depth limit reached)`);let f=b.children??[];if(0===f.length)return void d.push(`${e} (no process or subflow steps)`);for(let b of f.slice(0,10))d.push(`${e} - ${b.label}:`),a(b,c+2,d);return void(f.length>10&&d.push(`${e} - …and ${f.length-10} more step(s)`))}if(b.modelName&&d.push(`${e}Model: ${b.modelName}`),b.promptSummary&&d.push(`${e}Role: ${z(b.promptSummary,200)}`),b.servers&&b.servers.length>0)for(let a of b.servers)if(a.connected&&a.tools&&a.tools.length>0){let b=a.tools.slice(0,10),c=a.tools.length-b.length,f=c>0?`, +${c} more`:"";d.push(`${e}Tools (${a.name}): ${b.join(", ")}${f}`)}else d.push(`${e}Tools (${a.name}): server not connected`)}(a,0,c);let d=c.join("\n").trim(),e=d?`${b}
|
|
34
34
|
${d}`:b;if(e.length<=1500)return e;let f=1500-b.length-2;return f<=0?b:`${b}
|
|
35
|
-
${z(d,f)}`}(b)}catch(d){let b=a.data?.label||"Unknown Node",c=a.data?.type||a.type||"unknown";return A.warn("buildHandoffDescription failed; falling back to basic description",{label:b,type:c,err:d}),`Hand off execution to ${b} (${c})`}}let H="handoff_to_";var I=c(89850);let J=(0,d.h)("backend/flow/execution/nodes/ProcessNode");class K extends l{async generateHandoffTools(a){J.info("Generating handoff tools");let b=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));J.debug("Found standard actions for handoff tools",{actionsCount:b.length,actions:b});let c=[],d=new Set;for(let a of b){let b=this.successors instanceof Map?this.successors.get(a):this.successors[a];if(!b){J.warn(`Target node not found for edge ${a}`);continue}let e=b.node_params?.id||"unknown";d.has(e)||(d.add(e),c.push({id:e,label:b.node_params?.label||"Unknown Node",type:b.node_params?.type||"unknown"}))}let e=function(a){let b=new Set,c=new Map;for(let d of a){if(c.has(d.id))continue;let a=function(a,b){let c=(a&&a.trim()||b&&b.trim()||"node").toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return c.length>48&&(c=c.slice(0,48).replace(/_+$/g,"")),c||(c=b&&b.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_")||"node"),c||"node"}(d.label,d.type),e=`${H}${a}`;if(b.has(e)){let c=2;for(;b.has(`${H}${a}_${c}`);)c++;e=`${H}${a}_${c}`}b.add(e),c.set(d.id,e)}return c}(c);a.handoffNameMap=a.handoffNameMap||{};let f=null;try{let b=await i.flowService.getFlow(a.flowId);b&&(f=new Map(b.nodes.map(a=>[a.id,a])))}catch(a){J.warn("Could not load flow for handoff descriptions; using basic descriptions",{err:a})}let g=[];for(let b of c){let c=e.get(b.id)||`handoff_to_${b.id}`;a.handoffNameMap[c]=b.id;let d=f?.get(b.id),h=d?await G(d):`Hand off execution to ${b.label} (${b.type})`;g.push({name:c,description:h,inputSchema:{type:"object",properties:{},required:[]}}),J.debug("Created handoff tool",{toolName:c,targetNodeId:b.id,targetNodeLabel:b.label})}return J.info("Generated handoff tools",{toolsCount:g.length}),g}async prep(a,b){J.info("prep() started");let c=b?.id,d=a.flowId,e=b?.properties?.boundModel,f=b?.properties?.excludeModelPrompt||!1,g=b?.properties?.excludeStartNodePrompt||!1,h=b?.properties?.excludeSystemPrompt||!1;if(J.debug("Extracted properties",{nodeId:c,flowId:d,boundModel:e,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h}),!c||!d)throw J.error("Missing required node or flow ID",{nodeId:c,flowId:d}),Error("Process node requires node ID and flow ID");if(!e)throw J.error("Missing bound model"),Error("Process node requires a bound model");J.info("Using promptRenderer to build the complete prompt");let i=await u.renderPrompt(d,c,{renderMode:"rendered",includeConversationHistory:!1,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h});J.debug("Prompt rendered successfully",{completePromptLength:i.length,completePromptPreview:i.length>100?i.substring(0,100)+"...":i}),a.currentNodeId=c;let j=[];if(a.mcpContext&&a.mcpContext.availableTools&&a.mcpContext.availableTools.length>0)J.info("Using MCP tools from shared state",{toolsCount:a.mcpContext.availableTools.length}),j=a.mcpContext.availableTools;else{let a=b?.properties?.mcpNodes||[];if(a.length>0){J.info("No MCP tools found in shared state, processing MCP nodes",{mcpNodesCount:a.length});let b=await v.ToolHandler.processMCPNodes({mcpNodes:a});if(!b.success)throw J.error("Failed to process MCP nodes",{error:b.error}),Error(`Failed to process MCP nodes: ${b.error.message}`);j=b.value.availableTools}}for(let b of(j=[...j,...await this.generateHandoffTools(a)],a.toolNameMap=a.toolNameMap||{},j))b.server&&b.originalName&&(a.toolNameMap[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let k={nodeId:c,nodeType:"process",currentPrompt:i,boundModel:e,availableTools:j,messages:[],conversationId:a.conversationId,requireToolApproval:a.requireApproval??!1},l={id:(0,I.A)(),role:"system",content:i,timestamp:Date.now()};J.info("Added system message from prompt template",{contentLength:i.length,contentPreview:i.length>100?i.substring(0,100)+"...":i}),k.messages=(0,x.Ui)(a.messages,l);let m=b?.properties?.inputMode??"full-history";return"full-history"!==m&&(k.wireMessages=(0,x.ij)(k.messages,m,b?.properties?.isolatedPrompt)),J.info("Assembled node context",{systemMessageCount:1,totalMessageCount:k.messages.length,inputMode:m,wireMessageCount:k.wireMessages?.length}),J.info("prep() completed",{completePromptLength:i.length,boundModel:e,hasTools:!!k.availableTools?.length,toolsCount:k.availableTools?.length||0,messagesCount:k.messages.length}),k}async execCore(a,b){J.info("execCore() started",{boundModel:a.boundModel,promptLength:a.currentPrompt?.length,messagesCount:a.messages?.length||0}),J.debug("execCore() prepResult",a);try{let c,d;if(a.availableTools&&a.availableTools.length>0){let b=v.ToolHandler.prepareTools({availableTools:a.availableTools});if(!b.success)throw J.error("Failed to prepare tools",{error:b.error}),Error(`Failed to prepare tools: ${b.error.message}`);d=b.value.tools}let e={};for(let b of a.availableTools??[])b.server&&b.originalName&&(e[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let f=b?.label||b?.properties?.name||"Process Node",g=a.messages&&a.messages.length>0?a.messages[a.messages.length-1]:null;J.debug(`[ProcessNode ${a.nodeId}] Calling ModelHandler.callModel`,{modelId:a.boundModel,messageCount:a.messages?.length||0,toolCount:d?.length||0,lastMessageType:g?.role,lastMessageToolCallId:g?.role==="tool"?g.tool_call_id:void 0,lastMessageContentPreview:"string"==typeof g?.content?g.content.substring(0,100)+"...":"(non-string content)"});try{(c=await w.s.callModel({modelId:a.boundModel,prompt:a.currentPrompt,messages:a.messages,wireMessages:a.wireMessages,tools:d,iteration:1,maxIterations:1,maxTurns:b?.properties?.maxTurns,nodeName:f,nodeId:a.nodeId,toolNameMap:e,conversationId:a.conversationId,requireToolApproval:a.requireToolApproval})).success?J.debug(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned successfully`,{success:!0,hasContent:!!c.value?.content,contentLength:c.value?.content?.length||0,toolCallsCount:c.value?.toolCalls?.length||0}):J.warn(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned failure state unexpectedly here`,{success:!1,error:c.error})}catch(b){throw J.error(`[ProcessNode ${a.nodeId}] Error calling ModelHandler.callModel`,{error:b}),b}finally{J.debug(`[ProcessNode ${a.nodeId}] Finished attempt to call ModelHandler.callModel`)}if(!c||!c.success){let a=c?.error||{message:"Unknown model execution error after call attempt."};J.error("Model execution error after call attempt",{error:a});let b=Error(`Model execution failed: ${c.error.message}`);throw b.isModelError=!0,b.details={message:c.error.message,type:c.error.type,code:c.error.code,..."model"===c.error.type?{modelId:c.error.modelId}:{},param:"string"==typeof c.error.details?.param?c.error.details.param:void 0,status:"number"==typeof c.error.details?.status?c.error.details.status:void 0,...c.error.details},J.error("Throwing critical model error to abort flow execution",{error:c.error.message,type:c.error.type,code:c.error.code}),b}let h=c.value,i={success:!0,content:h.content||"",messages:h.messages,fullResponse:h.fullResponse,toolCalls:h.toolCalls};return h.toolCalls&&h.toolCalls.length>0&&J.info("Tool calls found in model response",{toolCallsCount:h.toolCalls.length,toolNames:h.toolCalls.map(a=>a.name).join(", ")}),J.info("execCore() completed",{responseLength:i.content?.length||0,messagesCount:i.messages?.length||0,hasToolCalls:!!i.toolCalls?.length}),J.verbose("execCore() execResult",i),i}catch(b){if(b&&"object"==typeof b&&("isCriticalToolError"in b||"isModelError"in b)){let a=b instanceof Error?b.message:String(b);throw J.error("Critical error detected - propagating to abort flow:",{error:a,isModelError:"isModelError"in b,isCriticalToolError:"isCriticalToolError"in b}),b}let a={success:!1,error:b instanceof Error?b.message:String(b),errorDetails:b instanceof Error?{message:b.message,name:b.name,stack:b.stack}:{message:String(b)}};return J.error("execCore() failed",{error:a.error,errorDetails:a.errorDetails}),J.verbose("execCore() errorResult",a),a}}processHandoffToolCalls(a,b){if(!a||0===a.length)return!1;J.info("Processing tool calls for handoff requests",{toolCallsCount:a.length});let c=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));for(let d of a){let{name:a}=d;if(a.startsWith("handoff_to_")){let d=b.handoffNameMap?.[a]||a.replace("handoff_to_","");for(let e of c){let c=this.successors instanceof Map?this.successors.get(e):this.successors[e];if(c&&c.node_params?.id===d)return b.handoffRequested={edgeId:e,targetNodeId:d},J.info(`Handoff requested to node ${d}`,{edgeId:e,toolName:a}),!0}}}return!1}async post(a,b,c,d){if(J.debug(`[ProcessNode ${d?.id}] post() method started.`),J.info("post() started",{execResultSuccess:b.success,execResultContentLength:b.content?.length||0,messagesCount:b.messages?.length||0,toolCallsCount:b.toolCalls?.length||0}),!b.success)return c.lastResponse={success:!1,error:b.error,errorDetails:b.errorDetails},Array.isArray(c.trackingInfo.nodeExecutionTracker),J.warn(`Execution failed for node ${d?.id}. Returning ERROR_ACTION.`),e.O;if(c.lastResponse=b.content||"",b.messages&&b.messages.length>0&&(c.messages=b.messages.filter(a=>"system"!==a.role),J.info("Updated messages in sharedState (system prompt excluded)",{messagesCount:c.messages.length})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"ProcessNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Process Node",modelDisplayName:a.modelDisplayName||"Unknown Model",modelTechnicalName:a.boundModel||"unknown",allowedTools:d?.properties?.allowedTools?.join(", "),timestamp:new Date().toISOString()}),J.info("Added ProcessNode tracking information",{modelDisplayName:a.modelDisplayName,modelTechnicalName:a.boundModel})),this.processHandoffToolCalls(b.toolCalls,c)&&c.handoffRequested){let a=c.handoffRequested.edgeId;return J.info(`Handoff requested via tool call, returning edge ID: ${a}`),a}let f=b.toolCalls?.filter(a=>!a.name.startsWith("handoff_to_"));return f&&f.length>0?(J.info("Non-handoff tool calls detected, returning TOOL_CALL_ACTION"),e.Jp):(J.info("No tool calls or handoff requested, returning FINAL_RESPONSE_ACTION"),e.g4)}_clone(){return new K}}var L=c(8918);let M=(0,d.h)("backend/flow/execution/handlers/MCPHandler");class N{static async executeMCP(a){let{mcpServer:b,enabledTools:c,nodeId:d,nodeRoots:e}=a;M.verbose("executeMCP input",JSON.stringify(a));try{d&&q.mcpService.setNodeRoots(b,d,e);let a=await q.mcpService.getServerStatus(b);if("connected"!==a.status){let a=await q.mcpService.connectServer(b);if(!a.success){let c={success:!1,error:(0,L.Fp)("server_connection_failed",`Failed to connect to MCP server: ${a.error}`,b,"connect")};return M.verbose("executeMCP connection error",JSON.stringify(c)),c}}let f=await q.mcpService.listServerTools(b);if(f.error){let a={success:!1,error:(0,L.Fp)("list_tools_failed",`Failed to list tools for server: ${f.error}`,b,"listTools")};return M.verbose("executeMCP list tools error",JSON.stringify(a)),a}let g={success:!0,value:{server:b,tools:f.tools||[],enabledTools:c}};return M.verbose("executeMCP success result",JSON.stringify(g)),g}catch(c){let a={success:!1,error:(0,L.Fp)("mcp_execution_failed",c instanceof Error?c.message:String(c),b,"executeMCP")};return M.verbose("executeMCP execution error",JSON.stringify(a)),a}}}var O=c(59448);let P=(0,d.h)("backend/flow/execution/nodes/MCPNode");class Q extends l{async prep(a,b){P.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw P.error("Missing bound server"),Error("MCP node requires a bound server");return P.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){P.info("execCore() started",{mcpServer:a.mcpServer}),P.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await N.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw P.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return P.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),P.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return P.error("execCore() failed",{error:a.error}),P.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(P.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),P.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),P.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a=d?.properties?.toolTimeout,e=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>({...c,originalName:c.name,server:b.server,name:(0,O.Y6)(b.server,c.name),timeout:a}));if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of e)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:e};for(let a of(c.toolNameMap=c.toolNameMap||{},e))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout};let f=e.map(a=>a.name);P.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:e.length,availableToolNames:f.length>10?f.slice(0,10).join(", ")+"...":f.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}P.info("post() completed"),P.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(P.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return P.info(`Returning action: ${a}`),a}return"default"}_clone(){return new Q}}let R=(0,d.h)("backend/flow/execution/nodes/FinishNode");class S extends l{async prep(a,b){R.debug("prep() started");let c={nodeId:b?.id||"",nodeType:"finish",messages:a.messages};return R.debug("prep() completed",{messagesCount:c.messages.length,hasSystemPrompt:c.messages.some(a=>"system"===a.role)}),c}async execCore(a,b){R.debug("execCore() started",{messagesCount:a.messages.length}),R.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return R.verbose("execCore() execResult",JSON.stringify(c)),R.info("execCore() completed"),c}async post(a,b,c,d){R.info("post() started",{messagesCount:a.messages.length}),R.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"FinishNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Finish Node",timestamp:new Date().toISOString()}),R.info("Added FinishNode tracking information"));let f=a.messages[a.messages.length-1];f&&"assistant"===f.role&&f.content&&("string"==typeof f.content?c.lastResponse=f.content:c.lastResponse={content:f.content,role:f.role}),R.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let g=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(R.info("Actions:",{actionsCount:g.length,actions:g}),g.length>0){let a=g[0];return R.info(`post() completed, returning action: ${a}`),a}return R.info("post() completed, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new S}}let T=(0,d.h)("backend/execution/flow/nodes/SubflowNode");class U extends l{async prep(a,b){let d=b?.properties?.subflowId,e=b?.properties?.promptTemplate?.trim(),f=b?.properties?.inputMode??(e?"isolated":"full-history"),g=b?.properties?.outputMode!=="final-only",h={nodeId:b?.id||"",nodeType:"subflow",subflowId:d,depth:(a.runDepth??0)+1,parentRunId:a.conversationId,showSteps:g,emit:a.emit,nodeName:b?.properties?.name};if("isolated"===f)h.inputText=e??"";else{let b=function(a){let b=[];for(let d of a){var c;if("system"===d.role||"tool"===d.role||"assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.length>0||!("string"==typeof(c=d.content)?c.trim().length>0:!!Array.isArray(c)&&c.length>0))continue;let{processNodeId:a,...e}=d;b.push({...e})}return b}(a.messages);h.messages="latest-message"===f?function(a){for(let b=a.length-1;b>=0;b--)if("user"===a[b].role)return[a[b]];return a}(b):b}if(d)try{let{flowService:a}=await Promise.resolve().then(c.bind(c,72440)),b=await a.getFlow(d);b?.name&&(h.subflowName=b.name)}catch{}return T.info("prep() completed",{subflowId:d,depth:h.depth,mode:f,historyCount:h.messages?.length,showSteps:g}),h}async execCore(a,b){if(!a.subflowId)return{success:!1,error:"Subflow node has no flow selected (subflowId is empty)."};let{runFlow:d}=await Promise.resolve().then(c.bind(c,67463)),e=a.emit,f={nodeId:a.nodeId,nodeName:a.nodeName,nodeType:"subflow"},g=a.subflowId,h=e&&a.showSteps?b=>{let c=(b.depth??0)+1;return"run:start"===b.type?void e({type:"subflow:start",node:f,subflowId:g,subflowName:a.subflowName,depth:c}):"run:done"===b.type?void e({type:"subflow:done",node:f,subflowId:g,status:b.status,depth:c}):"message"===b.type?void e({...b,depth:c,message:{...b.message,depth:c}}):void e({...b,depth:c})}:void 0;T.info("execCore() running subflow",{subflowId:a.subflowId,depth:a.depth,showSteps:a.showSteps,foldingEvents:!!h});let i=await d({flowId:a.subflowId,...a.messages?{messages:a.messages}:{prompt:a.inputText??""},mode:"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,parentRunId:a.parentRunId,...h?{emit:h}:{}});return"error"===i.status?{success:!1,error:i.error?.message||"Subflow execution failed",errorDetails:i.error?.details,subStatus:i.status}:{success:!0,outputText:i.outputText,subStatus:i.status}}async post(a,b,c,d){if(h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&c.trackingInfo.nodeExecutionTracker.push({nodeType:"SubflowNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Subflow Node",timestamp:new Date().toISOString()}),!b.success)return T.error("Subflow failed",{subflowId:a.subflowId,error:b.error}),c.lastResponse={success:!1,error:b.error||"Subflow execution failed",errorDetails:b.errorDetails},e.O;let f=b.outputText??"",g={role:"assistant",content:f,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:d?.id};c.messages.push(g),c.lastResponse=f;let i=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(i.length>0){let a=i[0];return T.info(`post() completed, handing off via action: ${a}`),a}return T.info("post() completed, no successor → FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new U}}let V=(0,d.h)("backend/flow/execution/FlowConverter");class W{static convert(a){V.info("Converting React Flow to Pocket Flow",{flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}),V.verbose("convert input",JSON.stringify({flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}));let b=new Map;for(let c of a.nodes){V.debug(`Creating node: ${c.id} (${c.type})`);let a=this.createNode(c);b.set(c.id,a)}for(let c of a.edges){V.debug(`Connecting edge: ${c.id} (${c.source} -> ${c.target})`);let a=b.get(c.source),d=b.get(c.target);if(a&&d)if(c.data?.edgeType==="mcp"){let b,e;V.info(`Handling MCP connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof K?(b=a,e=d):d instanceof K&&(b=d,e=a),b&&e?(b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.mcpNodes||(b.node_params.properties.mcpNodes=[]),b.node_params.properties.mcpNodes.push({id:e.node_params.id,properties:e.node_params.properties}),V.info("Stored MCP node in Process node properties",{processNodeId:b.node_params.id,mcpNodeId:e.node_params.id})):V.warn(`Invalid MCP connection: ${c.id}. Could not find Process and MCP nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else{let b=c.id||"default";a.addSuccessor(d,b),c.data?.bidirectional&&(d.addSuccessor(a,`${b}__reverse`),V.info(`Connected nodes (bidirectional): ${c.target} -> ${c.source} with action: ${b}__reverse`)),V.info(`Connected nodes: ${c.source} -> ${c.target} with action: ${b}`),a.successors instanceof Map?V.debug("Source node successors after connection:",{sourceNodeId:c.source,successorsCount:a.successors.size,successorsKeys:Array.from(a.successors.keys()),hasTargetNode:a.successors.has(b)}):V.warn("Source node successors is not a Map:",{sourceNodeId:c.source,successorsType:typeof a.successors})}else V.warn(`Failed to connect edge: ${c.id}`,{sourceExists:!!a,targetExists:!!d})}let c=a.nodes.find(a=>"start"===a.type);if(!c)throw V.error("No start node found in flow"),Error("Flow must have a start node");V.debug(`Found start node: ${c.id}`);let d=b.get(c.id);if(!d)throw V.error(`Failed to retrieve start node from map: ${c.id}`),Error("Failed to create start node");let e=new m(d);return V.debug("Created Pocket Flow with start node"),V.info("Flow conversion completed successfully",{nodeCount:b.size}),V.verbose("convert result",JSON.stringify({flowStartNodeId:e.node_params?.id||"unknown",nodesCount:b.size})),e}static createNode(a){let b,c;switch(V.debug(`Creating node of type: ${a.type}`,{nodeId:a.id,label:a.data.label}),V.verbose("createNode input",JSON.stringify({nodeId:a.id,nodeType:a.type,label:a.data.label,properties:a.data.properties})),a.type){case"start":b=new o,c={id:a.id,label:a.data.label,type:"start",properties:a.data.properties||{name:a.data.label}};break;case"process":b=new K,c={id:a.id,label:a.data.label,type:"process",properties:a.data.properties||{name:a.data.label}};break;case"mcp":b=new Q,c={id:a.id,label:a.data.label,type:"mcp",properties:a.data.properties||{name:a.data.label}};break;case"finish":b=new S,c={id:a.id,label:a.data.label,type:"finish",properties:a.data.properties||{name:a.data.label}};break;case"subflow":b=new U,c={id:a.id,label:a.data.label,type:"subflow",properties:a.data.properties||{name:a.data.label}};break;default:throw V.error(`Unknown node type: ${a.type}`,{nodeId:a.id}),Error(`Unknown node type: ${a.type}`)}return b.setParams({},c),V.debug("Node created and parameters set",{nodeId:a.id,type:a.type,propertiesKeys:Object.keys(c.properties||{})}),V.verbose("createNode result",JSON.stringify({nodeId:a.id,nodeType:a.type,nodeParams:c})),b}}let X=(0,d.h)("backend/execution/flow/engine/PocketflowEngine");class Y{clearCache(a){a?this.pocketFlowCache.delete(a):this.pocketFlowCache.clear()}async loadAndConvertFlow(a){if(this.pocketFlowCache.has(a))return X.debug(`Using cached Pocket Flow for flowId: ${a}`),this.pocketFlowCache.get(a).clone();X.verbose(`Loading and converting flow for flowId: ${a}`);let b=await i.flowService.getFlow(a);if(!b)throw X.error(`Flow not found for flowId: ${a}`),Error(`Flow not found: ${a}`);X.info(`Found flow: ${b.name}`,{flowId:b.id,nodeCount:b.nodes.length,edgeCount:b.edges.length});let c=W.convert(b);return this.pocketFlowCache.set(a,c),X.verbose(`Flow ${a} converted and cached.`),c.clone()}async findNodeById(a,b){X.verbose(`Searching for node ${b} in flow ${a.node_params?.id}`);let c=await a.getStartNode(),d=[c],e=new Set,f=c.node_params?.id;for(f?e.add(f):X.warn("Start node is missing an ID in its parameters.");d.length>0;){let a=d.shift();if(a.node_params?.id===b)return X.verbose(`Found node ${b}`),a;if(a.successors instanceof Map)for(let b of a.successors.values()){let a=b.node_params?.id;"string"==typeof a&&a.length>0&&!e.has(a)&&(e.add(a),d.push(b.clone()))}}X.warn(`Node ${b} not found in flow.`)}async resolveNode(a){let b,{conversationId:c,flowId:d,currentNodeId:e}=a,f=await this.loadAndConvertFlow(d);if(e)(b=await this.findNodeById(f,e))?X.info(`Resuming conversation ${c} at node ${e}`):(X.warn(`Resuming conversation ${c}, but node ${e} not found. Starting from beginning.`),b=await f.getStartNode());else{let d=a.messages.length>0?a.messages[a.messages.length-1]:null;d?.processNodeId?(X.info(`Found processNodeId ${d.processNodeId} in last message. Attempting to resume from this node.`),(b=await this.findNodeById(f,d.processNodeId))?X.info(`Resuming conversation ${c} from node ${d.processNodeId} based on last message.`):(X.warn(`Could not find node ${d.processNodeId} from last message. Starting from beginning.`),b=await f.getStartNode())):(b=await f.getStartNode(),X.info(`Starting conversation ${c} from the beginning.`))}if(!b)throw Error("Execution error: Cannot find starting node.");let g=b.node_params?.id;if("string"!=typeof g||0===g.length)throw Error(`Execution error: Node ${b.constructor.name} is missing an ID.`);return{handle:b,id:g,type:b.node_params?.type||"unknown",name:b.node_params?.label||"Unknown Node"}}async resolveHandoff(a,b){let{flowId:c,currentNodeId:d}=a;if(!d||!b)return{isSuccessorEdge:!1,targetNodeId:null};let e=await this.loadAndConvertFlow(c),f=await this.findNodeById(e,d);if(!f||!f.successors.has(b))return{isSuccessorEdge:!1,targetNodeId:null};let g=f.getSuccessor(b),h=g?.node_params?.id,i=g?.node_params?.type;return{isSuccessorEdge:!0,targetNodeId:"string"==typeof h&&h.length>0?h:null,targetNodeType:"string"==typeof i?i:null}}async runNode(a,b,c){let d=a.handle;c&&(b.emit=c);try{X.debug(`[PocketflowEngine] Calling run() on node ${a.id} (${a.type})`);let c=await d.run(b);return X.debug(`[PocketflowEngine] Node ${a.id} returned action: "${c.action}"`),{action:c.action,prepResult:c.prepResult,execResult:c.execResult}}finally{delete b.emit}}constructor(){this.pocketFlowCache=new Map}}let Z=(0,d.h)("backend/execution/flow/FlowExecutor"),$=["messages","availableTools","fullResponse","emit"];function _(a){let{messages:b,executionTrace:c,emit:d,mcpContext:e,...f}=a,h=g()(f);return h.messageCount=b?.length??0,e&&(h.mcpContext={server:e.server,availableTools:[]}),h}function aa(a){if(!a||"object"!=typeof a)return a;let b=g()(a);for(let a of $)a in b&&delete b[a];return b}class ab{static get conversationStates(){return global.__flujo_conversation_states||(global.__flujo_conversation_states=new Map),global.__flujo_conversation_states}static get engine(){return global.__flujo_flow_engine||(global.__flujo_flow_engine=new Y),global.__flujo_flow_engine}static set engine(a){global.__flujo_flow_engine=a}static clearFlowCache(a){this.engine.clearCache(a)}static resolveHandoff(a,b){return this.engine.resolveHandoff(a,b)}static async peekNextNodeId(a){try{return(await this.engine.resolveNode(a)).id}catch{return null}}static async executeStep(a,b){let c,d,f,{conversationId:g,flowId:i,currentNodeId:j}=a;if("string"!=typeof g||0===g.length)return Z.error("executeStep called without a valid conversationId in sharedState."),a.lastResponse={success:!1,error:"Internal error: Missing conversationId."},{sharedState:a,action:e.O};Z.debug(`executeStep called for conversation ${g}`,{flowId:i,currentNodeId:j});let k=h.G.ENABLE_EXECUTION_TRACKER||!!a.debugMode,l=j;try{let e=await this.engine.resolveNode(a);l=e.id,a.currentNodeId=e.id,Z.info(`Executing step for node ${e.id} (${e.type}) in conversation ${g}`),k&&!a.executionTrace&&(a.executionTrace=[]),c=_(a),b?.({type:"node:enter",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type}});let h=await this.engine.runNode(e,a,b),i=h.action;d=h.prepResult,f=h.execResult,b?.({type:"node:exit",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type},action:i}),Z.debug(`Node ${e.id} finished with action: ${i} for conversation ${g}`);let j=_(a);if(k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:e.id,nodeType:e.type,nodeName:e.name,timestamp:new Date().toISOString(),actionTaken:i,stateBefore:c,stateAfter:j,prepResultSnapshot:aa(d),execResultSnapshot:aa(f)};a.executionTrace.push(h),Z.verbose(`Appended step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),Z.debug(`[FlowExecutor] Returning from executeStep for node ${e.id} with action: "${i}"`),{sharedState:a,action:i}}catch(i){let f=l||"unknown node";Z.error(`Error during node execution step for ${f} in conversation ${g}`,{error:i});let h=i?.details;if(a.lastResponse={success:!1,error:i instanceof Error?i.message:String(i),errorDetails:i instanceof Error?{name:i.name,message:i.message,stack:i.stack,...h&&"object"==typeof h?h:{}}:{message:String(i)}},a.currentNodeId=l,b?.({type:"error",node:l?{nodeId:l}:void 0,message:i instanceof Error?i.message:String(i)}),k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:f,nodeType:"unknown",nodeName:"Unknown Node",timestamp:new Date().toISOString(),actionTaken:e.O,stateBefore:c??_(a),stateAfter:_(a),prepResultSnapshot:d?aa(d):null,execResultSnapshot:{success:!1,error:a.lastResponse}};a.executionTrace.push(h),Z.verbose(`Appended ERROR step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),{sharedState:a,action:e.O}}}}}};
|
|
35
|
+
${z(d,f)}`}(b)}catch(d){let b=a.data?.label||"Unknown Node",c=a.data?.type||a.type||"unknown";return A.warn("buildHandoffDescription failed; falling back to basic description",{label:b,type:c,err:d}),`Hand off execution to ${b} (${c})`}}let H="handoff_to_";var I=c(89850);let J=(0,d.h)("backend/flow/execution/nodes/ProcessNode");class K extends l{async generateHandoffTools(a){J.info("Generating handoff tools");let b=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));J.debug("Found standard actions for handoff tools",{actionsCount:b.length,actions:b});let c=[],d=new Set;for(let a of b){let b=this.successors instanceof Map?this.successors.get(a):this.successors[a];if(!b){J.warn(`Target node not found for edge ${a}`);continue}let e=b.node_params?.id||"unknown";d.has(e)||(d.add(e),c.push({id:e,label:b.node_params?.label||"Unknown Node",type:b.node_params?.type||"unknown"}))}let e=function(a){let b=new Set,c=new Map;for(let d of a){if(c.has(d.id))continue;let a=function(a,b){let c=(a&&a.trim()||b&&b.trim()||"node").toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return c.length>48&&(c=c.slice(0,48).replace(/_+$/g,"")),c||(c=b&&b.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_")||"node"),c||"node"}(d.label,d.type),e=`${H}${a}`;if(b.has(e)){let c=2;for(;b.has(`${H}${a}_${c}`);)c++;e=`${H}${a}_${c}`}b.add(e),c.set(d.id,e)}return c}(c);a.handoffNameMap=a.handoffNameMap||{};let f=null;try{let b=await i.flowService.getFlow(a.flowId);b&&(f=new Map(b.nodes.map(a=>[a.id,a])))}catch(a){J.warn("Could not load flow for handoff descriptions; using basic descriptions",{err:a})}let g=[];for(let b of c){let c=e.get(b.id)||`handoff_to_${b.id}`;a.handoffNameMap[c]=b.id;let d=f?.get(b.id),h=d?await G(d):`Hand off execution to ${b.label} (${b.type})`,i=d?.data?.properties,j="subflow"===b.type&&i?.inputMode==="isolated"&&i?.allowCallerPrompt===!0;g.push({name:c,description:j?`${h}
|
|
36
|
+
|
|
37
|
+
Optionally pass a "prompt" argument to instruct the target subflow; omit it to use its default prompt.`:h,inputSchema:j?{type:"object",properties:{prompt:{type:"string",description:"Instruction/prompt to run the target subflow with (isolated mode). Optional; omitted falls back to the subflow's default prompt."}},required:[]}:{type:"object",properties:{},required:[]}}),J.debug("Created handoff tool",{toolName:c,targetNodeId:b.id,targetNodeLabel:b.label})}return J.info("Generated handoff tools",{toolsCount:g.length}),g}async prep(a,b){J.info("prep() started");let c=b?.id,d=a.flowId,e=b?.properties?.boundModel,f=b?.properties?.excludeModelPrompt||!1,g=b?.properties?.excludeStartNodePrompt||!1,h=b?.properties?.excludeSystemPrompt||!1;if(J.debug("Extracted properties",{nodeId:c,flowId:d,boundModel:e,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h}),!c||!d)throw J.error("Missing required node or flow ID",{nodeId:c,flowId:d}),Error("Process node requires node ID and flow ID");if(!e)throw J.error("Missing bound model"),Error("Process node requires a bound model");J.info("Using promptRenderer to build the complete prompt");let j=await u.renderPrompt(d,c,{renderMode:"rendered",includeConversationHistory:!1,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h});J.debug("Prompt rendered successfully",{completePromptLength:j.length,completePromptPreview:j.length>100?j.substring(0,100)+"...":j}),a.currentNodeId=c;let k=[];if(a.mcpContext&&a.mcpContext.availableTools&&a.mcpContext.availableTools.length>0)J.info("Using MCP tools from shared state",{toolsCount:a.mcpContext.availableTools.length}),k=a.mcpContext.availableTools;else{let a=b?.properties?.mcpNodes||[];if(a.length>0){J.info("No MCP tools found in shared state, processing MCP nodes",{mcpNodesCount:a.length});let b=await v.ToolHandler.processMCPNodes({mcpNodes:a});if(!b.success)throw J.error("Failed to process MCP nodes",{error:b.error}),Error(`Failed to process MCP nodes: ${b.error.message}`);k=b.value.availableTools}}for(let b of(k=[...k,...await this.generateHandoffTools(a)],a.toolNameMap=a.toolNameMap||{},k))b.server&&b.originalName&&(a.toolNameMap[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let l={nodeId:c,nodeType:"process",currentPrompt:j,boundModel:e,availableTools:k,messages:[],conversationId:a.conversationId,requireToolApproval:a.requireApproval??!1},m={id:(0,I.A)(),role:"system",content:j,timestamp:Date.now()};J.info("Added system message from prompt template",{contentLength:j.length,contentPreview:j.length>100?j.substring(0,100)+"...":j}),l.messages=(0,x.Ui)(a.messages,m);let n=b?.properties?.inputMode??"full-history",o=l.messages;try{let a=await i.flowService.getFlow(d),b=new Set((a?.nodes??[]).filter(a=>"process"===a.type&&a.data?.properties?.outputMode==="latest-message").map(a=>a.id));o=(0,x.Qv)(l.messages,b)}catch(a){J.warn("Could not resolve outputMode collapse set; sending the full wire view",{err:a})}return("full-history"!==n||o!==l.messages)&&(l.wireMessages=(0,x.ij)(o,n,b?.properties?.isolatedPrompt)),J.info("Assembled node context",{systemMessageCount:1,totalMessageCount:l.messages.length,inputMode:n,wireMessageCount:l.wireMessages?.length}),J.info("prep() completed",{completePromptLength:j.length,boundModel:e,hasTools:!!l.availableTools?.length,toolsCount:l.availableTools?.length||0,messagesCount:l.messages.length}),l}async execCore(a,b){J.info("execCore() started",{boundModel:a.boundModel,promptLength:a.currentPrompt?.length,messagesCount:a.messages?.length||0}),J.debug("execCore() prepResult",a);try{let c,d;if(a.availableTools&&a.availableTools.length>0){let b=v.ToolHandler.prepareTools({availableTools:a.availableTools});if(!b.success)throw J.error("Failed to prepare tools",{error:b.error}),Error(`Failed to prepare tools: ${b.error.message}`);d=b.value.tools}let e={};for(let b of a.availableTools??[])b.server&&b.originalName&&(e[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let f=b?.label||b?.properties?.name||"Process Node",g=a.messages&&a.messages.length>0?a.messages[a.messages.length-1]:null;J.debug(`[ProcessNode ${a.nodeId}] Calling ModelHandler.callModel`,{modelId:a.boundModel,messageCount:a.messages?.length||0,toolCount:d?.length||0,lastMessageType:g?.role,lastMessageToolCallId:g?.role==="tool"?g.tool_call_id:void 0,lastMessageContentPreview:"string"==typeof g?.content?g.content.substring(0,100)+"...":"(non-string content)"});try{(c=await w.s.callModel({modelId:a.boundModel,prompt:a.currentPrompt,messages:a.messages,wireMessages:a.wireMessages,tools:d,iteration:1,maxIterations:1,maxTurns:b?.properties?.maxTurns,nodeName:f,nodeId:a.nodeId,toolNameMap:e,conversationId:a.conversationId,requireToolApproval:a.requireToolApproval})).success?J.debug(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned successfully`,{success:!0,hasContent:!!c.value?.content,contentLength:c.value?.content?.length||0,toolCallsCount:c.value?.toolCalls?.length||0}):J.warn(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned failure state unexpectedly here`,{success:!1,error:c.error})}catch(b){throw J.error(`[ProcessNode ${a.nodeId}] Error calling ModelHandler.callModel`,{error:b}),b}finally{J.debug(`[ProcessNode ${a.nodeId}] Finished attempt to call ModelHandler.callModel`)}if(!c||!c.success){let a=c?.error||{message:"Unknown model execution error after call attempt."};J.error("Model execution error after call attempt",{error:a});let b=Error(`Model execution failed: ${c.error.message}`);throw b.isModelError=!0,b.details={message:c.error.message,type:c.error.type,code:c.error.code,..."model"===c.error.type?{modelId:c.error.modelId}:{},param:"string"==typeof c.error.details?.param?c.error.details.param:void 0,status:"number"==typeof c.error.details?.status?c.error.details.status:void 0,...c.error.details},J.error("Throwing critical model error to abort flow execution",{error:c.error.message,type:c.error.type,code:c.error.code}),b}let h=c.value,i={success:!0,content:h.content||"",messages:h.messages,fullResponse:h.fullResponse,toolCalls:h.toolCalls};return h.toolCalls&&h.toolCalls.length>0&&J.info("Tool calls found in model response",{toolCallsCount:h.toolCalls.length,toolNames:h.toolCalls.map(a=>a.name).join(", ")}),J.info("execCore() completed",{responseLength:i.content?.length||0,messagesCount:i.messages?.length||0,hasToolCalls:!!i.toolCalls?.length}),J.verbose("execCore() execResult",i),i}catch(b){if(b&&"object"==typeof b&&("isCriticalToolError"in b||"isModelError"in b)){let a=b instanceof Error?b.message:String(b);throw J.error("Critical error detected - propagating to abort flow:",{error:a,isModelError:"isModelError"in b,isCriticalToolError:"isCriticalToolError"in b}),b}let a={success:!1,error:b instanceof Error?b.message:String(b),errorDetails:b instanceof Error?{message:b.message,name:b.name,stack:b.stack}:{message:String(b)}};return J.error("execCore() failed",{error:a.error,errorDetails:a.errorDetails}),J.verbose("execCore() errorResult",a),a}}processHandoffToolCalls(a,b){if(!a||0===a.length)return!1;J.info("Processing tool calls for handoff requests",{toolCallsCount:a.length});let c=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));for(let d of a){let{name:a}=d;if(a.startsWith("handoff_to_")){let d=b.handoffNameMap?.[a]||a.replace("handoff_to_","");for(let e of c){let c=this.successors instanceof Map?this.successors.get(e):this.successors[e];if(c&&c.node_params?.id===d)return b.handoffRequested={edgeId:e,targetNodeId:d},J.info(`Handoff requested to node ${d}`,{edgeId:e,toolName:a}),!0}}}return!1}async post(a,b,c,d){if(J.debug(`[ProcessNode ${d?.id}] post() method started.`),J.info("post() started",{execResultSuccess:b.success,execResultContentLength:b.content?.length||0,messagesCount:b.messages?.length||0,toolCallsCount:b.toolCalls?.length||0}),!b.success)return c.lastResponse={success:!1,error:b.error,errorDetails:b.errorDetails},Array.isArray(c.trackingInfo.nodeExecutionTracker),J.warn(`Execution failed for node ${d?.id}. Returning ERROR_ACTION.`),e.O;if(c.lastResponse=b.content||"",b.messages&&b.messages.length>0&&(c.messages=b.messages.filter(a=>"system"!==a.role),J.info("Updated messages in sharedState (system prompt excluded)",{messagesCount:c.messages.length})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"ProcessNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Process Node",modelDisplayName:a.modelDisplayName||"Unknown Model",modelTechnicalName:a.boundModel||"unknown",allowedTools:d?.properties?.allowedTools?.join(", "),timestamp:new Date().toISOString()}),J.info("Added ProcessNode tracking information",{modelDisplayName:a.modelDisplayName,modelTechnicalName:a.boundModel})),this.processHandoffToolCalls(b.toolCalls,c)&&c.handoffRequested){let a=c.handoffRequested.edgeId;return J.info(`Handoff requested via tool call, returning edge ID: ${a}`),a}let f=b.toolCalls?.filter(a=>!a.name.startsWith("handoff_to_"));return f&&f.length>0?(J.info("Non-handoff tool calls detected, returning TOOL_CALL_ACTION"),e.Jp):(J.info("No tool calls or handoff requested, returning FINAL_RESPONSE_ACTION"),e.g4)}_clone(){return new K}}var L=c(8918);let M=(0,d.h)("backend/flow/execution/handlers/MCPHandler");class N{static async executeMCP(a){let{mcpServer:b,enabledTools:c,nodeId:d,nodeRoots:e}=a;M.verbose("executeMCP input",JSON.stringify(a));try{d&&q.mcpService.setNodeRoots(b,d,e);let a=await q.mcpService.getServerStatus(b);if("connected"!==a.status){let a=await q.mcpService.connectServer(b);if(!a.success){let c={success:!1,error:(0,L.Fp)("server_connection_failed",`Failed to connect to MCP server: ${a.error}`,b,"connect")};return M.verbose("executeMCP connection error",JSON.stringify(c)),c}}let f=await q.mcpService.listServerTools(b);if(f.error){let a={success:!1,error:(0,L.Fp)("list_tools_failed",`Failed to list tools for server: ${f.error}`,b,"listTools")};return M.verbose("executeMCP list tools error",JSON.stringify(a)),a}let g={success:!0,value:{server:b,tools:f.tools||[],enabledTools:c}};return M.verbose("executeMCP success result",JSON.stringify(g)),g}catch(c){let a={success:!1,error:(0,L.Fp)("mcp_execution_failed",c instanceof Error?c.message:String(c),b,"executeMCP")};return M.verbose("executeMCP execution error",JSON.stringify(a)),a}}}var O=c(59448);let P=(0,d.h)("backend/flow/execution/nodes/MCPNode");class Q extends l{async prep(a,b){P.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw P.error("Missing bound server"),Error("MCP node requires a bound server");return P.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){P.info("execCore() started",{mcpServer:a.mcpServer}),P.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await N.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw P.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return P.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),P.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return P.error("execCore() failed",{error:a.error}),P.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(P.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),P.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),P.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a=d?.properties?.toolTimeout,e=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>({...c,originalName:c.name,server:b.server,name:(0,O.Y6)(b.server,c.name),timeout:a}));if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of e)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:e};for(let a of(c.toolNameMap=c.toolNameMap||{},e))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout};let f=e.map(a=>a.name);P.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:e.length,availableToolNames:f.length>10?f.slice(0,10).join(", ")+"...":f.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}P.info("post() completed"),P.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(P.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return P.info(`Returning action: ${a}`),a}return"default"}_clone(){return new Q}}let R=(0,d.h)("backend/flow/execution/nodes/FinishNode");class S extends l{async prep(a,b){R.debug("prep() started");let c={nodeId:b?.id||"",nodeType:"finish",messages:a.messages};return R.debug("prep() completed",{messagesCount:c.messages.length,hasSystemPrompt:c.messages.some(a=>"system"===a.role)}),c}async execCore(a,b){R.debug("execCore() started",{messagesCount:a.messages.length}),R.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return R.verbose("execCore() execResult",JSON.stringify(c)),R.info("execCore() completed"),c}async post(a,b,c,d){R.info("post() started",{messagesCount:a.messages.length}),R.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"FinishNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Finish Node",timestamp:new Date().toISOString()}),R.info("Added FinishNode tracking information"));let f=a.messages[a.messages.length-1];f&&"assistant"===f.role&&f.content&&("string"==typeof f.content?c.lastResponse=f.content:c.lastResponse={content:f.content,role:f.role}),R.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let g=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(R.info("Actions:",{actionsCount:g.length,actions:g}),g.length>0){let a=g[0];return R.info(`post() completed, returning action: ${a}`),a}return R.info("post() completed, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new S}}let T=(0,d.h)("backend/execution/flow/nodes/SubflowNode");class U extends l{async prep(a,b){let d=b?.properties?.subflowId,e=b?.properties?.promptTemplate?.trim(),f=b?.properties?.inputMode??(e?"isolated":"full-history"),g=b?.properties?.outputMode!=="final-only",h={nodeId:b?.id||"",nodeType:"subflow",subflowId:d,depth:(a.runDepth??0)+1,parentRunId:a.conversationId,showSteps:g,emit:a.emit,nodeName:b?.properties?.name};if("isolated"===f){let c=b?.properties?.allowCallerPrompt===!0,d=a.handoffInput;d&&d.targetNodeId===b?.id?(a.handoffInput=void 0,c&&d.prompt.trim()?(h.inputText=d.prompt,T.info("Using caller-supplied prompt for isolated subflow",{nodeId:b?.id})):h.inputText=e??""):h.inputText=e??""}else{let b=function(a){let b=[];for(let d of a){var c;if("system"===d.role||"tool"===d.role||"assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.length>0||!("string"==typeof(c=d.content)?c.trim().length>0:!!Array.isArray(c)&&c.length>0))continue;let{processNodeId:a,...e}=d;b.push({...e})}return b}(a.messages);h.messages="latest-message"===f?function(a){for(let b=a.length-1;b>=0;b--)if("user"===a[b].role)return[a[b]];return a}(b):b}if(d)try{let{flowService:a}=await Promise.resolve().then(c.bind(c,11659)),b=await a.getFlow(d);b?.name&&(h.subflowName=b.name)}catch{}return T.info("prep() completed",{subflowId:d,depth:h.depth,mode:f,historyCount:h.messages?.length,showSteps:g}),h}async execCore(a,b){if(!a.subflowId)return{success:!1,error:"Subflow node has no flow selected (subflowId is empty)."};let{runFlow:d}=await Promise.resolve().then(c.bind(c,67463)),e=a.emit,f={nodeId:a.nodeId,nodeName:a.nodeName,nodeType:"subflow"},g=a.subflowId,h=e&&a.showSteps?b=>{let c=(b.depth??0)+1;return"run:start"===b.type?void e({type:"subflow:start",node:f,subflowId:g,subflowName:a.subflowName,depth:c}):"run:done"===b.type?void e({type:"subflow:done",node:f,subflowId:g,status:b.status,depth:c}):"message"===b.type?void e({...b,depth:c,message:{...b.message,depth:c}}):void e({...b,depth:c})}:void 0;T.info("execCore() running subflow",{subflowId:a.subflowId,depth:a.depth,showSteps:a.showSteps,foldingEvents:!!h});let i=await d({flowId:a.subflowId,...a.messages?{messages:a.messages}:{prompt:a.inputText??""},mode:"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,parentRunId:a.parentRunId,...h?{emit:h}:{}});return"error"===i.status?{success:!1,error:i.error?.message||"Subflow execution failed",errorDetails:i.error?.details,subStatus:i.status}:{success:!0,outputText:i.outputText,subStatus:i.status}}async post(a,b,c,d){if(h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&c.trackingInfo.nodeExecutionTracker.push({nodeType:"SubflowNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Subflow Node",timestamp:new Date().toISOString()}),!b.success)return T.error("Subflow failed",{subflowId:a.subflowId,error:b.error}),c.lastResponse={success:!1,error:b.error||"Subflow execution failed",errorDetails:b.errorDetails},e.O;let f=b.outputText??"",g={role:"assistant",content:f,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:d?.id};c.messages.push(g),c.lastResponse=f;let i=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(i.length>0){let a=i[0];return T.info(`post() completed, handing off via action: ${a}`),a}return T.info("post() completed, no successor → FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new U}}let V=(0,d.h)("backend/flow/execution/FlowConverter");class W{static convert(a){V.info("Converting React Flow to Pocket Flow",{flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}),V.verbose("convert input",JSON.stringify({flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}));let b=new Map;for(let c of a.nodes){V.debug(`Creating node: ${c.id} (${c.type})`);let a=this.createNode(c);b.set(c.id,a)}for(let c of a.edges){V.debug(`Connecting edge: ${c.id} (${c.source} -> ${c.target})`);let a=b.get(c.source),d=b.get(c.target);if(a&&d)if(c.data?.edgeType==="mcp"){let b,e;V.info(`Handling MCP connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof K?(b=a,e=d):d instanceof K&&(b=d,e=a),b&&e?(b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.mcpNodes||(b.node_params.properties.mcpNodes=[]),b.node_params.properties.mcpNodes.push({id:e.node_params.id,properties:e.node_params.properties}),V.info("Stored MCP node in Process node properties",{processNodeId:b.node_params.id,mcpNodeId:e.node_params.id})):V.warn(`Invalid MCP connection: ${c.id}. Could not find Process and MCP nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else{let b=c.id||"default";a.addSuccessor(d,b),c.data?.bidirectional&&(d.addSuccessor(a,`${b}__reverse`),V.info(`Connected nodes (bidirectional): ${c.target} -> ${c.source} with action: ${b}__reverse`)),V.info(`Connected nodes: ${c.source} -> ${c.target} with action: ${b}`),a.successors instanceof Map?V.debug("Source node successors after connection:",{sourceNodeId:c.source,successorsCount:a.successors.size,successorsKeys:Array.from(a.successors.keys()),hasTargetNode:a.successors.has(b)}):V.warn("Source node successors is not a Map:",{sourceNodeId:c.source,successorsType:typeof a.successors})}else V.warn(`Failed to connect edge: ${c.id}`,{sourceExists:!!a,targetExists:!!d})}let c=a.nodes.find(a=>"start"===a.type);if(!c)throw V.error("No start node found in flow"),Error("Flow must have a start node");V.debug(`Found start node: ${c.id}`);let d=b.get(c.id);if(!d)throw V.error(`Failed to retrieve start node from map: ${c.id}`),Error("Failed to create start node");let e=new m(d);return V.debug("Created Pocket Flow with start node"),V.info("Flow conversion completed successfully",{nodeCount:b.size}),V.verbose("convert result",JSON.stringify({flowStartNodeId:e.node_params?.id||"unknown",nodesCount:b.size})),e}static createNode(a){let b,c;switch(V.debug(`Creating node of type: ${a.type}`,{nodeId:a.id,label:a.data.label}),V.verbose("createNode input",JSON.stringify({nodeId:a.id,nodeType:a.type,label:a.data.label,properties:a.data.properties})),a.type){case"start":b=new o,c={id:a.id,label:a.data.label,type:"start",properties:a.data.properties||{name:a.data.label}};break;case"process":b=new K,c={id:a.id,label:a.data.label,type:"process",properties:a.data.properties||{name:a.data.label}};break;case"mcp":b=new Q,c={id:a.id,label:a.data.label,type:"mcp",properties:a.data.properties||{name:a.data.label}};break;case"finish":b=new S,c={id:a.id,label:a.data.label,type:"finish",properties:a.data.properties||{name:a.data.label}};break;case"subflow":b=new U,c={id:a.id,label:a.data.label,type:"subflow",properties:a.data.properties||{name:a.data.label}};break;default:throw V.error(`Unknown node type: ${a.type}`,{nodeId:a.id}),Error(`Unknown node type: ${a.type}`)}return b.setParams({},c),V.debug("Node created and parameters set",{nodeId:a.id,type:a.type,propertiesKeys:Object.keys(c.properties||{})}),V.verbose("createNode result",JSON.stringify({nodeId:a.id,nodeType:a.type,nodeParams:c})),b}}let X=(0,d.h)("backend/execution/flow/engine/PocketflowEngine");class Y{clearCache(a){a?this.pocketFlowCache.delete(a):this.pocketFlowCache.clear()}async resolveFlowDefinition(a){let b=a.flowId;if(this.pocketFlowCache.has(b))return X.debug(`Using cached Pocket Flow for flowId: ${b}`),this.pocketFlowCache.get(b).clone();let c=a.flowSnapshot;if(c)X.verbose(`Resolving flow ${b} from an in-memory quick-chat snapshot.`);else if(X.verbose(`Loading and converting flow for flowId: ${b}`),!(c=await i.flowService.getFlow(b)??void 0))throw X.error(`Flow not found for flowId: ${b}`),Error(`Flow not found: ${b}`);X.info(`Found flow: ${c.name}`,{flowId:c.id,nodeCount:c.nodes.length,edgeCount:c.edges.length});let d=W.convert(c);return this.pocketFlowCache.set(b,d),X.verbose(`Flow ${b} converted and cached.`),d.clone()}async findNodeById(a,b){X.verbose(`Searching for node ${b} in flow ${a.node_params?.id}`);let c=await a.getStartNode(),d=[c],e=new Set,f=c.node_params?.id;for(f?e.add(f):X.warn("Start node is missing an ID in its parameters.");d.length>0;){let a=d.shift();if(a.node_params?.id===b)return X.verbose(`Found node ${b}`),a;if(a.successors instanceof Map)for(let b of a.successors.values()){let a=b.node_params?.id;"string"==typeof a&&a.length>0&&!e.has(a)&&(e.add(a),d.push(b.clone()))}}X.warn(`Node ${b} not found in flow.`)}async resolveNode(a){let b,{conversationId:c,currentNodeId:d}=a,e=await this.resolveFlowDefinition(a);if(d)(b=await this.findNodeById(e,d))?X.info(`Resuming conversation ${c} at node ${d}`):(X.warn(`Resuming conversation ${c}, but node ${d} not found. Starting from beginning.`),b=await e.getStartNode());else{let d=a.messages.length>0?a.messages[a.messages.length-1]:null;d?.processNodeId?(X.info(`Found processNodeId ${d.processNodeId} in last message. Attempting to resume from this node.`),(b=await this.findNodeById(e,d.processNodeId))?X.info(`Resuming conversation ${c} from node ${d.processNodeId} based on last message.`):(X.warn(`Could not find node ${d.processNodeId} from last message. Starting from beginning.`),b=await e.getStartNode())):(b=await e.getStartNode(),X.info(`Starting conversation ${c} from the beginning.`))}if(!b)throw Error("Execution error: Cannot find starting node.");let f=b.node_params?.id;if("string"!=typeof f||0===f.length)throw Error(`Execution error: Node ${b.constructor.name} is missing an ID.`);return{handle:b,id:f,type:b.node_params?.type||"unknown",name:b.node_params?.label||"Unknown Node"}}async resolveHandoff(a,b){let{currentNodeId:c}=a;if(!c||!b)return{isSuccessorEdge:!1,targetNodeId:null};let d=await this.resolveFlowDefinition(a),e=await this.findNodeById(d,c);if(!e||!e.successors.has(b))return{isSuccessorEdge:!1,targetNodeId:null};let f=e.getSuccessor(b),g=f?.node_params?.id,h=f?.node_params?.type;return{isSuccessorEdge:!0,targetNodeId:"string"==typeof g&&g.length>0?g:null,targetNodeType:"string"==typeof h?h:null}}async runNode(a,b,c){let d=a.handle;c&&(b.emit=c);try{X.debug(`[PocketflowEngine] Calling run() on node ${a.id} (${a.type})`);let c=await d.run(b);return X.debug(`[PocketflowEngine] Node ${a.id} returned action: "${c.action}"`),{action:c.action,prepResult:c.prepResult,execResult:c.execResult}}finally{delete b.emit}}constructor(){this.pocketFlowCache=new Map}}let Z=(0,d.h)("backend/execution/flow/FlowExecutor"),$=["messages","availableTools","fullResponse","emit"];function _(a){let{messages:b,executionTrace:c,emit:d,mcpContext:e,...f}=a,h=g()(f);return h.messageCount=b?.length??0,e&&(h.mcpContext={server:e.server,availableTools:[]}),h}function aa(a){if(!a||"object"!=typeof a)return a;let b=g()(a);for(let a of $)a in b&&delete b[a];return b}class ab{static get conversationStates(){return global.__flujo_conversation_states||(global.__flujo_conversation_states=new Map),global.__flujo_conversation_states}static get engine(){return global.__flujo_flow_engine||(global.__flujo_flow_engine=new Y),global.__flujo_flow_engine}static set engine(a){global.__flujo_flow_engine=a}static clearFlowCache(a){this.engine.clearCache(a)}static resolveHandoff(a,b){return this.engine.resolveHandoff(a,b)}static async peekNextNodeId(a){try{return(await this.engine.resolveNode(a)).id}catch{return null}}static async executeStep(a,b){let c,d,f,{conversationId:g,flowId:i,currentNodeId:j}=a;if("string"!=typeof g||0===g.length)return Z.error("executeStep called without a valid conversationId in sharedState."),a.lastResponse={success:!1,error:"Internal error: Missing conversationId."},{sharedState:a,action:e.O};Z.debug(`executeStep called for conversation ${g}`,{flowId:i,currentNodeId:j});let k=h.G.ENABLE_EXECUTION_TRACKER||!!a.debugMode,l=j;try{let e=await this.engine.resolveNode(a);l=e.id,a.currentNodeId=e.id,Z.info(`Executing step for node ${e.id} (${e.type}) in conversation ${g}`),k&&!a.executionTrace&&(a.executionTrace=[]),c=_(a),b?.({type:"node:enter",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type}});let h=await this.engine.runNode(e,a,b),i=h.action;d=h.prepResult,f=h.execResult,b?.({type:"node:exit",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type},action:i}),Z.debug(`Node ${e.id} finished with action: ${i} for conversation ${g}`);let j=_(a);if(k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:e.id,nodeType:e.type,nodeName:e.name,timestamp:new Date().toISOString(),actionTaken:i,stateBefore:c,stateAfter:j,prepResultSnapshot:aa(d),execResultSnapshot:aa(f)};a.executionTrace.push(h),Z.verbose(`Appended step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),Z.debug(`[FlowExecutor] Returning from executeStep for node ${e.id} with action: "${i}"`),{sharedState:a,action:i}}catch(i){let f=l||"unknown node";Z.error(`Error during node execution step for ${f} in conversation ${g}`,{error:i});let h=i?.details;if(a.lastResponse={success:!1,error:i instanceof Error?i.message:String(i),errorDetails:i instanceof Error?{name:i.name,message:i.message,stack:i.stack,...h&&"object"==typeof h?h:{}}:{message:String(i)}},a.currentNodeId=l,b?.({type:"error",node:l?{nodeId:l}:void 0,message:i instanceof Error?i.message:String(i)}),k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:f,nodeType:"unknown",nodeName:"Unknown Node",timestamp:new Date().toISOString(),actionTaken:e.O,stateBefore:c??_(a),stateAfter:_(a),prepResultSnapshot:d?aa(d):null,execResultSnapshot:{success:!1,error:a.lastResponse}};a.executionTrace.push(h),Z.verbose(`Appended ERROR step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),{sharedState:a,action:e.O}}}}}};
|
|
@@ -5,6 +5,6 @@ ${b.condition}
|
|
|
5
5
|
Tool result (untrusted data):
|
|
6
6
|
\`\`\`json
|
|
7
7
|
${m}
|
|
8
|
-
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.resolve().then(c.bind(c,12763)),{getCompletionAdapter:e}=await Promise.resolve().then(c.bind(c,
|
|
8
|
+
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.resolve().then(c.bind(c,12763)),{getCompletionAdapter:e}=await Promise.resolve().then(c.bind(c,25713)),f=await d.getModel(a);if(!f)throw Error(`config: The AI-check model no longer exists (${a})`);let g=await d.resolveAndDecryptApiKey(f.ApiKey);if(!g)throw Error("config: Could not resolve the AI-check model API key");let i=e(f),{completion:j}=await i.createCompletion({model:f,apiKey:g,temperature:0,messages:[{role:"system",content:h},{role:"user",content:b}]}),k=j.choices?.[0]?.message?.content;return"string"==typeof k?k:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(3304),c.e(6936)]).then(c.bind(c,67463)),e=await d({flowId:a,prompt:`${b}
|
|
9
9
|
|
|
10
10
|
${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";exports.id=7186,exports.ids=[7186],exports.modules={9047:(a,b,c)=>{c.r(b),c.d(b,{"40520b537d1d43f510acbccd60e3e7d42ce215c157":()=>T,"60de87c4c5950c080550cb766970e88ae9c9a0ca25":()=>U});var d=c(91488);c(27806);let e={LOG_LEVEL:3},f={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},g="number"==typeof e.LOG_LEVEL?e.LOG_LEVEL:f.ERROR;function h(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=h(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>h(a,b+1)):c[d]=e)}return c}function i(a,b,c,d,e){if(a>=("number"==typeof e?e:g)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let e=new Date().toISOString(),g=`[${e}] [${b}]`,i=`${g} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?h(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?h(b):b,2);i+=`:
|
|
2
|
+
${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case f.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case f.DEBUG:console.debug(i);break;case f.INFO:console.info(i);break;case f.WARN:console.warn(i);break;case f.ERROR:console.error(i);break;default:console.log(i)}}}function j(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{i(f.VERBOSE,d,a,c,b)},debug:(a,c)=>{i(f.DEBUG,d,a,c,b)},info:(a,c)=>{i(f.INFO,d,a,c,b)},warn:(a,c)=>{i(f.WARN,d,a,c,b)},error:(a,c)=>{i(f.ERROR,d,a,c,b)}}}var k=c(29021),l=c(33873),m=c.n(l),n=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",a}({});function o(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?m().resolve(a):process.cwd()}let p=j("utils/storage/backend"),q=m().join(o(),"db"),r=m().join(o(),".next","storage"),s=a=>m().join(q,`${a}.json`);async function t(){try{await k.promises.access(q),p.verbose(`Storage directory exists: ${q}`)}catch{p.debug(`Creating storage directory: ${q}`),await k.promises.mkdir(q,{recursive:!0})}try{await k.promises.access(r),p.warn(`Old storage directory found: ${r}. This may cause data inconsistency issues.`)}catch{}}let u=new Map,v=0;async function w(a,b){let c=m().dirname(a);await k.promises.mkdir(c,{recursive:!0});let d=`${a}.tmp.${process.pid}.${++v}`;try{await k.promises.writeFile(d,b),await k.promises.rename(d,a)}catch(a){try{await k.promises.unlink(d)}catch{}throw a}}async function x(a,b){let c=s(a),d=(u.get(a)??Promise.resolve()).catch(()=>{}).then(()=>w(c,JSON.stringify(b,null,2)));u.set(a,d);try{await d,p.verbose(`Successfully saved item to: ${c}`)}catch(b){throw p.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{u.get(a)===d&&u.delete(a)}}async function y(a,b){try{await t();let c=s(a),d=await k.promises.readFile(c,"utf-8");if(0===d.trim().length)return p.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(d);return p.verbose(`Successfully loaded item from: ${c}`),a}catch(b){p.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await k.promises.writeFile(a,d),p.info(`Created backup of corrupted file at: ${a}`)}catch(a){p.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return p.verbose(`Item with key "${a}" not found at ${s(a)}, returning default.`),b;throw p.error(`CRITICAL: Error loading item with key "${a}" from ${s(a)}:`,c),c}}var z=c(92347),A=c.n(z);let B=j("utils/encryption/session"),C=global.__flujo_encryption_sessions??(global.__flujo_encryption_sessions=new Map),D=j("utils/encryption/secure");class E extends Error{constructor(a="Encryption is locked: user password required to access secrets"){super(a),this.name="EncryptionLockedError",Object.setPrototypeOf(this,E.prototype)}}let F="data_encryption_key",G="data_encryption_iv",H="data_encryption_salt",I="encryption_type";var J=function(a){return a.DEFAULT="default",a.USER="user",a}(J||{});function K(){let a=A().enc.Utf8.parse("flujo_fixed_salt_v1");return A().PBKDF2("FLUJO~",a,{keySize:8,iterations:1e5})}async function L(){D.debug("initializeDefaultEncryption: Entering method");try{if(await Q())return!0;let a=K(),b=A().lib.WordArray.random(8),c=A().lib.WordArray.random(16),d=A().AES.encrypt(b.toString(),a,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7}),e=A().enc.Utf8.parse("flujo_fixed_salt_v1"),f={[F]:d.toString(),[G]:c.toString(),[H]:e.toString(),encryption_version:1,[I]:"default"};return await x(n.ENCRYPTION_KEY,f),!0}catch(a){return D.error("initializeDefaultEncryption: Failed to initialize default encryption:",a),!1}}async function M(){D.debug("getDefaultDEK: Entering method");try{let a=await y(n.ENCRYPTION_KEY,null);if(!a){if(!await L())return D.error("getDefaultDEK: Failed to initialize default encryption"),null;return await M()}if("default"!==a[I])return D.error("getDefaultDEK: Not using default encryption"),null;let b=a[F],c=A().enc.Hex.parse(a[G]),d=K(),e=A().AES.decrypt(b,d,{iv:c,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!e.toString())return D.error("getDefaultDEK: Failed to decrypt DEK with default key"),null;return A().enc.Hex.parse(e.toString())}catch(a){return D.error("getDefaultDEK: Failed to get default DEK:",a),null}}async function N(a){D.debug("getUserDEK: Entering method");try{let b=await y(n.ENCRYPTION_KEY,null);if(!b)return D.error("getUserDEK: No encryption metadata found"),null;if("user"!==b[I])return D.error("getUserDEK: Not using user encryption"),null;let c=b[F],d=A().enc.Hex.parse(b[G]),e=A().enc.Hex.parse(b[H]),f=A().PBKDF2(a,e,{keySize:8,iterations:1e5}),g=A().AES.decrypt(c,f,{iv:d,mode:A().mode.CBC,padding:A().pad.Pkcs7});if(!g.toString())return D.error("getUserDEK: Failed to decrypt DEK with provided password"),null;return A().enc.Hex.parse(g.toString())}catch(a){return D.error("getUserDEK: Failed to get user DEK:",a),null}}async function O(a,b=!1){D.debug("getDEK: Entering method");try{if(b&&a){D.debug("getDEK: Using session token");let b=function(a){let b=C.get(a);if(!b)return B.warn(`Session not found: ${a}`),null;let c=Date.now();return c-b.createdAt>72e5?(B.warn(`Session expired: ${a}`),C.delete(a),null):(b.lastUsed=c,b.dek)}(a);if(b)return A().enc.Hex.parse(b);D.warn("getDEK: Invalid or expired session token, falling back to default encryption")}let c=await y(n.ENCRYPTION_KEY,null);if(!c){if(D.info("getDEK: No encryption metadata found, initializing default encryption"),!await L())return D.error("getDEK: Failed to initialize default encryption"),null;return await O(a,b)}if("user"!==c[I])return await M();{let c=global.__flujo_server_dek??null;if(c)return D.debug("getDEK: Using server unlock state for user encryption"),A().enc.Hex.parse(c);if(a&&!b){let b=await N(a);if(b)return b;D.warn("getDEK: Provided password did not yield a valid user DEK")}throw D.warn("getDEK: User encryption is locked (no unlock state or valid credential)"),new E}}catch(a){if(a instanceof E)throw a;D.error("getDEK: Failed to get DEK:",a);try{if(D.warn("getDEK: Attempting to initialize default encryption as error recovery"),await L())return await M()}catch(a){D.error("getDEK: Failed to initialize default encryption as error recovery:",a)}return null}}async function P(a,b,c=!1){D.debug("decryptWithPassword: Entering method");try{let d=await O(b,c);if(!d)return null;let e=a.split(":");if(2!==e.length)return D.error("decryptWithPassword: Invalid ciphertext format"),null;let f=A().enc.Hex.parse(e[0]),g=e[1];return A().AES.decrypt(g,d,{iv:f,mode:A().mode.CBC,padding:A().pad.Pkcs7}).toString(A().enc.Utf8)}catch(a){if(a instanceof E)throw a;return D.error("decryptWithPassword: Failed to decrypt data:",a),null}}async function Q(){return D.debug("isEncryptionInitialized: Entering method"),null!==await y(n.ENCRYPTION_KEY,null)}var R=c(40410);let S=j("backend/utils/resolveGlobalVars");async function T(a){S.debug("Entering resolveGlobalVars method");let b=await y(n.GLOBAL_ENV_VARS,{}),c=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(b);S.debug(`Loaded ${Object.keys(b).length} global environment variables (${c?"new":"old"} format)`);let d={};if(c)for(let[a,c]of Object.entries(b))d[a]=c.value;else d={...b};let e=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let c=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==d[b]){let e=d[b];if(e.startsWith("encrypted:")){S.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await P(a);if(c)e=c,S.debug(`Successfully decrypted global variable: ${b}`);else{S.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){S.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){S.warn(`Skipping failed encrypted global variable: ${b}`);continue}S.debug(`Resolved global variable: ${b}`),c=c.replace(a,e)}else S.warn(`Global variable not found: ${b}`)}return c},f=async a=>{if("string"==typeof a)return await e(a);if(Array.isArray(a))return await Promise.all(a.map(a=>f(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await f(d);return b}return a},g=await f(a);return"object"==typeof a&&null!==a&&S.debug("Resolved global variables result:",JSON.stringify(g,null,2)),S.debug("Completed global variable resolution"),g}async function U(a,b=0){if(S.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return S.warn("Empty value provided"),null;if(b>=10)return S.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){S.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await P(a);if(!d)return S.warn(`Failed to decrypt value at depth ${b}`),null;S.debug(`Successfully decrypted value at depth ${b}`),S.verbose(d),c=d}catch(a){return S.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(S.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){S.debug(`Resolving global variables at depth ${b}`);try{let a=await T(c);if(S.verbose(a),a!==c)return S.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),U(a,b+1);c=a}catch(a){return S.error(`Error resolving global variables at depth ${b}:`,a),null}}return S.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,R.D)([T,U]),(0,d.A)(T,"40520b537d1d43f510acbccd60e3e7d42ce215c157",null),(0,d.A)(U,"60de87c4c5950c080550cb766970e88ae9c9a0ca25",null)},38296:(a,b,c)=>{c.d(b,{A:()=>C});var d=c(21124),e=c(38301),f=c(54573),g=c(81637),h=c(79515),i=c(20830),j=c(53773),k=c(82666),l=c(37674),m=c(67101),n=c(41893),o=c(95587),p=c(77028),q=c(44079),r=c(6537),s=c(19815),t=c(49938),u=c(47902),v=c(11480),w=c(93083),x=c(85557),y=c(91034),z=c(82571),A=c(92173);let B=(0,s.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),C=({serverName:a,initialEnv:b,onSave:c,onDelete:s,onServerRestart:C})=>{let{globalEnvVars:D}=(0,t.rX)(),[E,F]=(0,e.useState)([]),[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(!1),[K,L]=(0,e.useState)(!1),[M,N]=(0,e.useState)(null);(0,e.useEffect)(()=>{B.debug(`Initializing environment variables for server: ${a}`,{variableCount:Object.keys(b).length}),F(Object.entries(b).map(([a,b])=>{let c="object"==typeof b&&null!==b&&"value"in b?b.value:b,d="object"==typeof b&&null!==b&&"metadata"in b?b.metadata:{isSecret:(0,z.xc)(a)},e=c.match(/\$\{global:([^}]+)\}/);if(e){let b=e[1];return{key:a,value:c,isSecret:d.isSecret,isBound:!0,boundTo:b}}let f="string"==typeof c&&(c.startsWith("encrypted:")||c.startsWith("encrypted_failed:"));return{key:a,value:f?A.gF:c,isSecret:d.isSecret,isEncrypted:f}}))},[b]);let O=async b=>{B.debug(`Removing environment variable at index: ${b}`);let c=E[b];if("Global"===a&&s&&c.key)try{await s(c.key),F(E.filter((a,c)=>c!==b))}catch(a){B.error(`Failed to delete environment variable: ${c.key}`,a)}else F(E.filter((a,c)=>c!==b)),H(!0)},P=(a,b,c)=>{let d=[...E];if("isSecret"===b){let b=d[a];b.isSecret&&!c?d[a]={...b,isSecret:c,value:"",isEncrypted:!1,showWarning:!0}:d[a]={...b,isSecret:c}}else{let e={...d[a],[b]:c,isSecret:"key"===b?(0,z.xc)(c):d[a].isSecret};"key"===b&&(e.isValidKey=""===c||/^[a-zA-Z0-9_]+$/.test(c)),"value"===b&&(d[a].isEncrypted&&(e.isEncrypted=!1),d[a].showWarning&&c&&(e.showWarning=!1)),d[a]=e}F(d),H(!0)},Q=async()=>{if(E.some(a=>""!==a.key&&!1===a.isValidKey))return void B.error("Cannot save: Some variable names contain invalid characters");B.debug(`Saving environment variables for server: ${a}`,{variableCount:E.length}),J(!0);try{let b=E.reduce((a,b)=>{let{key:c,value:d,isBound:e,boundTo:f,isSecret:g,isEncrypted:h}=b;return c&&(e&&f?a[c]={value:`$\{global:${f}}`,metadata:{isSecret:g}}:g&&d===A.gF||(a[c]={value:d,metadata:{isSecret:g}})),a},{});await c(b),H(!1),C&&"Global"!==a&&(B.debug(`Restarting server after env variable changes: ${a}`),await C(a))}catch(a){B.error("Failed to save environment variables:",a)}J(!1)};return(0,d.jsxs)(f.A,{sx:{p:3,borderRadius:2,border:1,borderColor:a=>"dark"===a.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,d.jsxs)(h.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",a]}),(0,d.jsx)(i.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,d.jsx)(u.A,{}),onClick:()=>{B.debug("Adding new environment variable"),F([...E,{key:"",value:"",isSecret:!1}]),H(!0)},children:"Add Variable"})]}),(0,d.jsx)(j.A,{spacing:3,children:E.map((a,b)=>(0,d.jsxs)(k.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,placeholder:"Variable name",value:a.key,onChange:a=>P(b,"key",a.target.value),error:!1===a.isValidKey,helperText:!1===a.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:5,children:(0,d.jsx)(l.A,{fullWidth:!0,type:a.isSecret?"password":"text",placeholder:a.showWarning?"Re-enter value":"Value",value:a.value,onChange:a=>P(b,"value",a.target.value),InputProps:{readOnly:a.isBound,startAdornment:a.isEncrypted?(0,d.jsx)(m.A,{position:"start",children:(0,d.jsx)(v.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:a.isBound?(0,d.jsx)(m.A,{position:"end",children:(0,d.jsx)(n.A,{size:"small",label:`Bound to global: ${a.boundTo}`,color:"primary",variant:"outlined",onDelete:()=>(a=>{B.debug(`Unbinding variable at index: ${a}`);let b=[...E];b[a]={...b[a],isBound:!1,boundTo:void 0},F(b),H(!0)})(b),deleteIcon:(0,d.jsx)(w.A,{fontSize:"small"})})}):null},error:a.showWarning,helperText:a.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:b=>a.isBound?"dark"===b.palette.mode?"#1a1a1a":"#f9fafb":b.palette.background.paper}})}),(0,d.jsx)(k.Ay,{item:!0,xs:12,sm:2,children:(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,d.jsx)(o.A,{control:(0,d.jsx)(p.A,{checked:a.isSecret,onChange:a=>P(b,"isSecret",a.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!a.isBound&&(0,d.jsx)(q.A,{size:"small",color:"primary",onClick:()=>(a=>{B.debug(`Opening bind modal for variable at index: ${a}`),N(a),L(!0)})(b),title:"Bind to global variable",sx:{mr:1},children:(0,d.jsx)(x.A,{fontSize:"small"})}),(0,d.jsx)(q.A,{size:"small",color:"error",onClick:()=>O(b),title:"Remove variable",children:(0,d.jsx)(y.A,{fontSize:"small"})})]})})]},b))}),(0,d.jsx)(r.A,{open:K,onClose:()=>{L(!1),N(null)},children:(0,d.jsxs)(g.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,d.jsx)(h.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(D).length?(0,d.jsx)(h.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,d.jsx)(g.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(D).map(([a,b])=>(0,d.jsxs)(i.A,{fullWidth:!0,variant:"text",onClick:()=>(a=>{if(null!==M){B.debug(`Binding variable at index ${M} to global variable: ${a}`);let b=[...E];b[M]={...b[M],isBound:!0,boundTo:a,value:`$\{global:${a}}`},F(b),L(!1),N(null),H(!0)}})(a),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,d.jsx)(h.default,{variant:"body2",children:a}),(0,d.jsx)(h.default,{variant:"caption",color:"text.secondary",children:b&&"object"==typeof b&&b.metadata&&b.metadata.isSecret?A.gF:b&&"object"==typeof b?b.value:b})]},a))}),(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,d.jsx)(i.A,{variant:"outlined",onClick:()=>{L(!1),N(null)},children:"Cancel"})})]})}),G&&(0,d.jsx)(g.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,d.jsx)(i.A,{variant:"contained",color:"success",onClick:Q,disabled:I||E.some(a=>""!==a.key&&!1===a.isValidKey),children:I?"Saving...":"Save Changes"})})]})}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}},92173:(a,b,c)=>{c.d(b,{RJ:()=>e,gF:()=>d});let d="masked:********",e="********"}};
|