flujo-ai 3.19.0 → 3.20.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 +213 -206
- package/.next/app-path-routes-manifest.json +9 -8
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +18 -18
- package/.next/react-loadable-manifest.json +8 -8
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- 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.js +1 -1
- package/.next/server/app/api/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/route.js +1 -1
- package/.next/server/app/api/cwd/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/env/route.js.nft.json +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 -1
- 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 -1
- package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
- 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 -1
- package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/repair/route.js +1 -1
- package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
- 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.js +1 -1
- package/.next/server/app/api/git/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/mcp-registry/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/initiate/route.js +1 -1
- package/.next/server/app/api/oauth/initiate/route.js.nft.json +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 +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 +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 +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.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/storage/route.js.nft.json +1 -1
- package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route.js +1 -1
- package/.next/server/app/api/update/route.js.nft.json +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 +7 -7
- 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 +9 -2
- package/.next/server/app/docs/page.js.nft.json +1 -1
- 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 +1 -1
- package/.next/server/app/executions/page.js.nft.json +1 -1
- 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 -3
- 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 +2 -2
- 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 +1 -1
- 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 +1 -1
- 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.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +1 -1
- 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 -1
- 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 -2
- 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 +1 -1
- 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 -2
- 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 +1 -1
- 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]/resources/route.js +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js.nft.json +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -0
- 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 +1 -1
- 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 +1 -1
- 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 -8
- package/.next/server/chunks/1083.js +1 -1
- package/.next/server/chunks/1197.js +2 -2
- package/.next/server/chunks/1373.js +1 -1
- package/.next/server/chunks/1690.js +1 -0
- package/.next/server/chunks/1746.js +1 -1
- package/.next/server/chunks/2261.js +1 -0
- package/.next/server/chunks/2350.js +1 -1
- package/.next/server/chunks/264.js +1 -1
- package/.next/server/chunks/2859.js +1 -1
- package/.next/server/chunks/289.js +1 -0
- package/.next/server/chunks/3574.js +2 -2
- package/.next/server/chunks/{3310.js → 3778.js} +2 -2
- package/.next/server/chunks/3953.js +1 -1
- package/.next/server/chunks/3984.js +4 -4
- package/.next/server/chunks/4045.js +1 -0
- package/.next/server/chunks/4322.js +1 -0
- package/.next/server/chunks/4436.js +1 -0
- package/.next/server/chunks/4498.js +40 -0
- package/.next/server/chunks/4637.js +13 -6
- package/.next/server/chunks/4671.js +1 -0
- package/.next/server/chunks/{1912.js → 4690.js} +2 -2
- package/.next/server/chunks/5708.js +7 -0
- package/.next/server/chunks/5734.js +4 -4
- package/.next/server/chunks/{6088.js → 6532.js} +2 -2
- package/.next/server/chunks/6772.js +1 -1
- package/.next/server/chunks/{6136.js → 6908.js} +2 -2
- package/.next/server/chunks/6981.js +1 -0
- package/.next/server/chunks/6996.js +3 -3
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7101.js +64 -0
- package/.next/server/chunks/7214.js +2 -2
- package/.next/server/chunks/724.js +3 -3
- package/.next/server/chunks/7362.js +4 -4
- package/.next/server/chunks/7463.js +6 -0
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7635.js +1 -1
- package/.next/server/chunks/7821.js +1 -1
- package/.next/server/chunks/8298.js +1 -0
- package/.next/server/chunks/8739.js +2 -2
- package/.next/server/chunks/9509.js +2 -2
- package/.next/server/chunks/9957.js +1 -0
- package/.next/server/functions-config-manifest.json +3 -3
- 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/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1892-a0f5ec7152540dc3.js → 1892-5c1e38d89e0a5a9c.js} +1 -1
- package/.next/static/chunks/{3272-ab88dd195ea61b65.js → 3272-fd8d59523f61da96.js} +1 -1
- package/.next/static/chunks/3381-5fd2417957ca0881.js +1 -0
- package/.next/static/chunks/{1634-d4019c4a5cac2ed0.js → 3648-733cf7ca4a5d1f19.js} +1 -1
- package/.next/static/chunks/422-268783d9ad5897e1.js +1 -0
- package/.next/static/chunks/{5501-7d6e38c7c8cc3c5a.js → 5501-c400aaeaf57e6297.js} +1 -1
- package/.next/static/chunks/7258-e27017c1b98f43f9.js +1 -0
- package/.next/static/chunks/{7583.5355a64005f2b265.js → 7583.26a8c1f6e6823daf.js} +1 -1
- package/.next/static/chunks/{8187.57929e3f925fe538.js → 8187.fd653767df53db87.js} +1 -1
- package/.next/static/chunks/{7829-b843e80f32a83256.js → 8755-9f375ec8740fecac.js} +1 -1
- package/.next/static/chunks/{9164-14dc5889cb7478c0.js → 9164-f54d3531ca1df5f7.js} +1 -1
- package/.next/static/chunks/{9747-ffb8be5e59700c27.js → 9587-706bfd1a692c4660.js} +3 -3
- package/.next/static/chunks/app/api/backup/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/browse/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/cwd/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/encryption/secure/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/env/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/compile/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/generate/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/improve/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/quick-chat/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/repair/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/flow/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/git/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/init/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/local-models/capability/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/local-models/pull/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/local-models/suggest/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/cancel/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/model/[id]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/model/provider/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/model/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/model/test/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/oauth/initiate/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/oauth/reset/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/restore/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/storage/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/update/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[id]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/chat/page-a67ad3683443e7ad.js +1 -0
- package/.next/static/chunks/app/docs/page-097827ec4dae1d30.js +1 -0
- package/.next/static/chunks/app/executions/page-cb0dcc66d84c9bf8.js +1 -0
- package/.next/static/chunks/app/flows/page-abdd0642e378c5da.js +1 -0
- package/.next/static/chunks/app/mcp/{page-9a612d0be5a3336d.js → page-7d3a269dce68b529.js} +1 -1
- package/.next/static/chunks/app/mcp-flows/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/mcp-proxy/[server]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/completions/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/app/v1/models/route-b296683a5faf800a.js +1 -0
- package/.next/static/chunks/webpack-ef5b2cef70829f42.js +1 -0
- package/.next/trace +9 -7
- package/.next/types/app/v1/chat/conversations/[conversationId]/resources/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/.next/server/chunks/2194.js +0 -1
- package/.next/server/chunks/3648.js +0 -1
- package/.next/server/chunks/4239.js +0 -1
- package/.next/server/chunks/4372.js +0 -1
- package/.next/server/chunks/4681.js +0 -1
- package/.next/server/chunks/5148.js +0 -1
- package/.next/server/chunks/6465.js +0 -1
- package/.next/server/chunks/7403.js +0 -38
- package/.next/server/chunks/7865.js +0 -9
- package/.next/static/chunks/1711-ccf5eba61d618a1a.js +0 -1
- package/.next/static/chunks/3625-74c77250d64d1cd3.js +0 -1
- package/.next/static/chunks/924-64f908860caf1a35.js +0 -1
- package/.next/static/chunks/app/api/backup/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/browse/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/cwd/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/encryption/secure/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/env/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/compile/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/generate/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/improve/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/quick-chat/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/repair/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/flow/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/git/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/init/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/local-models/capability/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/local-models/pull/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/local-models/suggest/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/cancel/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/model/[id]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/model/provider/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/model/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/model/test/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/oauth/callback/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/oauth/initiate/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/oauth/reset/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/restore/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/storage/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/update/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[id]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/chat/page-1d764d1de5ad5d2f.js +0 -1
- package/.next/static/chunks/app/docs/page-d670c1ec8af5cb54.js +0 -1
- package/.next/static/chunks/app/executions/page-109274291811d467.js +0 -1
- package/.next/static/chunks/app/flows/page-df8eda0e83934fb2.js +0 -1
- package/.next/static/chunks/app/mcp-flows/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/mcp-proxy/[server]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/completions/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/app/v1/models/route-ff084c1cc278df77.js +0 -1
- package/.next/static/chunks/webpack-3e8560996ac8c1e0.js +0 -1
- /package/.next/static/{itJEX_uJ7hJ7oF-igwwK9 → dvSaKx6-EfRNi7Xj-cSv_}/_buildManifest.js +0 -0
- /package/.next/static/{itJEX_uJ7hJ7oF-igwwK9 → dvSaKx6-EfRNi7Xj-cSv_}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=2350,exports.ids=[2350,7821],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>g,FH:()=>s,Zn:()=>t,dM:()=>r,lk:()=>h,pX:()=>q});var d=c(32524),e=c(49181),f=c(45131);let g=3,h=8;function i(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let j={type:"arrowclosed",width:20,height:20,color:"#1976d2"},k={stroke:"#1976d2",strokeWidth:2},l=new Set(["full-history","latest-message","isolated"]),m=new Set(["steps","final-only"]),n=new Set(["full-conversation","latest-message"]);function o(a){let b=(0,e.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}function p(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function q(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function r(a,b={},c={}){let e=[],s=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),t=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),u=b.models??[],v=new Set((b.servers??[]).map(a=>a.name)),w=b.serverTools??{},x=i(c.maxDepth,0,g,g),y=i(c.maxFlows,1,h,h),z=[],A=[...(b.flows??[]).map(a=>a.name)],B=[],C=0;var D=function a(e,g,h){let r=Array.isArray(e?.nodes)?e.nodes:[],D=Array.isArray(e?.edges)?e.edges:[],E=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,A);A.push(E),C++;let F=(0,d.A)(),G=[...h,E],I=new Map,J=[],K=[];for(let c of r){let e=c?.key;if(!e||"string"!=typeof e){s("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(I.has(e)){s("node-duplicate-key",`Duplicate node key "${e}" — keys must be unique; the later node was dropped.`,e);continue}let f=c.type;if("mcp"===f){s("mcp-node-not-allowed",`Node "${e}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,e);continue}if("start"!==f&&"process"!==f&&"finish"!==f&&"subflow"!==f){s("unknown-node-type",`Node "${e}" has unknown type "${String(f)}".`,e);continue}let h={},j="string"==typeof c.prompt?c.prompt:void 0;if("start"===f){let{text:a,stripped:b}=o(j??"");b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}else if("process"===f){let{text:a,stripped:b}=o(j??"");if(b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a,c.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(c.model,u);a?h.boundModel=a:(h.boundModel=c.model,t("model-unresolved",`Node "${e}": model "${c.model}" does not match any configured model (by id, display name, or name).`,e))}void 0!==c.inputMode&&(l.has(c.inputMode)?(h.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(h.isolatedPrompt=c.isolatedPrompt)):t("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(n.has(c.outputMode)?h.outputMode=c.outputMode:t("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,e)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?t("invalid-max-turns",`Node "${e}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,e):h.maxTurns=i(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(h.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(h.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(h.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(h.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim())}else if("subflow"===f){if(function(c,d,e,f,g){let h=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,i=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0;if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,h?"parallelFlows":null,i?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&t("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(h||i)&&s("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(g.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?g.itemSplit=c.itemSplit:t("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(g.sequential=!0),H(c,g)):s("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}if(c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return s("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=p(c.flow,[...b.flows??[],...B]);return a?g.subflowId=a:s("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>x)return s("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${x} level(s); this inline subflow was not compiled.`,d);if(C>=y)return s("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${y} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?g.subflowId=b.id:s("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(h){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){s("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){s("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=p(e,[...b.flows??[],...B]);c?a.includes(c)||a.push(c):s("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(g.parallelSubflowIds=a,H(c,g)):s("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(i){let b=[];for(let g of c.parallelSubflowSpecs){if(!g||"object"!=typeof g){s("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>x){s("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${x} level(s); a parallel inline subflow was not compiled.`,d);continue}if(C>=y){s("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${y} flows in one bundle; it was not compiled.`,d);continue}let c=a(g,e+1,f);c?b.push(c.id):s("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(g.parallelSubflowIds=b,H(c,g)):s("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return s("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d);s("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,e,g,G,h),void 0!==c.inputMode&&(l.has(c.inputMode)?h.inputMode=c.inputMode:t("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(m.has(c.outputMode)?h.outputMode=c.outputMode:t("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,e)),void 0!==j){let{text:a,stripped:b}=o(j);b&&t("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(h.allowCallerPrompt=c.allowCallerPrompt),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim())}let k={id:(0,d.A)(),type:f,position:{x:0,y:0},data:{label:c.label||`${f.charAt(0).toUpperCase()}${f.slice(1)} Node`,type:f,...c.description?{description:c.description}:{},properties:h}};if(I.set(e,k),J.push(k),"process"===f&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,f=b?.name;if(!f||"string"!=typeof f){t("server-missing-name",`Node "${e}": a server reference is missing its "name"; skipped.`,e);continue}if(a.has(f))continue;a.add(f),v.has(f)||t("server-unknown",`Node "${e}": MCP server "${f}" is not configured in FLUJO.`,e);let g=w[f];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&t("tool-unknown",`Node "${e}": server "${f}" does not report tool(s): ${a.join(", ")}.`,e)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:f,type:"mcp",properties:{boundServer:f,enabledTools:c}}};J.push(h),K.push({processKey:e,mcpNode:h})}}else"process"!==f&&Array.isArray(c.servers)&&c.servers.length>0&&t("servers-on-non-process",`Node "${e}": only process nodes can have "servers"; ignored.`,e)}if(0===I.size)return s("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let L=[],M=new Set;for(let a of D){let b,c=a?.from,d=a?.to,e=c?I.get(c):void 0,g=d?I.get(d):void 0;if(!e||!g){s("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===g){s("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("start"===g.type){s("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){s("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let h=`${c}->${d}`;if(M.has(h)){t("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}M.add(h);let i=!0===a.bidirectional;i&&("start"===e.type||"finish"===g.type)&&(t("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),i=!1);let j=a.condition;j&&"object"==typeof j&&("process"!==e.type?t("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(j.kind)?"string"!=typeof j.value||0===j.value.length?t("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==j.kind||(0,f.wM)(j.value)||t("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:j.kind,value:j.value,..."last-message"===j.target?{target:"last-message"}:{},...!0===j.ignoreCase?{ignoreCase:!0}:{},...!0===j.negate?{negate:!0}:{}}):t("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(j.kind)}"; the condition was dropped.`)),L.push(q(e,g,i,b))}for(let{processKey:a,mcpNode:b}of K){let c=I.get(a);L.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...j},markerStart:{...j},style:{...k}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c)a.data?.edgeType!=="mcp"&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target));let g=[...b.values()],h=g.filter(a=>"start"===a.type),i=h.length>0?h:g.slice(0,1),j=new Map,k=i.map(a=>({id:a.id,depth:0}));for(let a of k)j.set(a.id,0);for(;k.length;){let{id:a,depth:b}=k.shift();for(let c of f.get(a)??[])j.has(c)||(j.set(c,b+1),k.push({id:c,depth:b+1}))}let l=0;for(let a of j.values())l=Math.max(l,a);for(let a of g)j.has(a.id)||j.set(a.id,l+1);let m=new Map;for(let[a,c]of b)m.set(c.id,a);let n=new Map;for(let a of g){let b=m.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=j.get(a.id),f=n.get(d)??0;n.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let o=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=o.get(a)??0;o.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}}(0,I,L,K,0===g?c.positions:void 0);let N={id:F,name:E,...e?.description?{description:e.description}:{},nodes:J,edges:L};return z.push(N),B.push({id:N.id,name:N.name}),N}(a,0,[]),E=z,F=e;let G=F.filter(a=>"error"===a.severity).length;return{flow:D,flows:E,issues:F,errorCount:G,warningCount:F.length-G};function H(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?t("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:t("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function s(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,...a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else"subflow"===b&&(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0?(d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy)):"string"==typeof c.subflowId&&c.subflowId&&(d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function t(a){for(let b of a.nodes){if("process"!==b.type)continue;let a=b.data.properties??{};void 0===a.inputMode&&(a.inputMode="latest-message"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}},87821:(a,b,c)=>{c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);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.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(7865)]).then(c.bind(c,77865));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}};
|
|
1
|
+
"use strict";exports.id=2350,exports.ids=[2350,7821],exports.modules={81226:(a,b,c)=>{c.d(b,{A_:()=>g,FH:()=>u,Zn:()=>v,dM:()=>t,lk:()=>h,pX:()=>s});var d=c(32524),e=c(49181),f=c(45131);let g=3,h=8;function i(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let j={type:"arrowclosed",width:20,height:20,color:"#1976d2"},k={stroke:"#1976d2",strokeWidth:2},l={type:"arrowclosed",width:20,height:20,color:"#009688"},m={stroke:"#009688",strokeWidth:2},n=new Set(["full-history","latest-message","isolated"]),o=new Set(["steps","final-only"]),p=new Set(["full-conversation","latest-message"]);function q(a){let b=(0,e.A$)(a);if(0===b.length)return{text:a,stripped:!1};let c="",d=0;for(let e of b)c+=a.slice(d,e.index)+e.name,d=e.index+e.fullMatch.length;return{text:c+=a.slice(d),stripped:!0}}function r(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.name.toLowerCase()===c);return d?d.id:null}function s(a,b,c,d){let e=`${a.type}-bottom`,f=`${b.type}-top`;return{id:`${a.id}:${e}->${b.id}:${f}`,source:a.id,sourceHandle:e,target:b.id,targetHandle:f,type:"custom",data:{edgeType:"standard",...c?{bidirectional:!0}:{},...d?{condition:d}:{}},animated:!0}}function t(a,b={},c={}){let e=[],u=(a,b,c)=>e.push({severity:"error",code:a,message:b,nodeKey:c}),v=(a,b,c)=>e.push({severity:"warning",code:a,message:b,nodeKey:c}),w=b.models??[],x=new Set((b.servers??[]).map(a=>a.name)),y=b.serverTools??{},z=i(c.maxDepth,0,g,g),A=i(c.maxFlows,1,h,h),B=[],C=[...(b.flows??[]).map(a=>a.name)],D=[],E=0;var F=function a(e,g,h){let t=Array.isArray(e?.nodes)?e.nodes:[],F=Array.isArray(e?.edges)?e.edges:[],G=function(a,b){let c=(a??"").trim().replace(/[^\w-]+/g,"_").replace(/^_+|_+$/g,"");c||(c="generated_flow");let d=new Set(b.map(a=>a.toLowerCase()));if(!d.has(c.toLowerCase()))return c;for(let a=2;;a++){let b=`${c}_${a}`;if(!d.has(b.toLowerCase()))return b}}(e?.name,C);C.push(G),E++;let H=(0,d.A)(),I=[...h,G],K=new Map,L=[],M=[];for(let c of t){let e=c?.key;if(!e||"string"!=typeof e){u("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(K.has(e)){u("node-duplicate-key",`Duplicate node key "${e}" — keys must be unique; the later node was dropped.`,e);continue}let f=c.type;if("mcp"===f){u("mcp-node-not-allowed",`Node "${e}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,e);continue}if("start"!==f&&"process"!==f&&"finish"!==f&&"subflow"!==f&&"resource"!==f){u("unknown-node-type",`Node "${e}" has unknown type "${String(f)}".`,e);continue}let h={},j="string"==typeof c.prompt?c.prompt:void 0;if("start"===f){let{text:a,stripped:b}=q(j??"");b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}else if("process"===f){let{text:a,stripped:b}=q(j??"");if(b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a,c.model){let a=function(a,b){if(b.some(b=>b.id===a))return a;let c=a.toLowerCase(),d=b.find(a=>a.displayName?.toLowerCase()===c);if(d)return d.id;let e=b.find(a=>a.name?.toLowerCase()===c);return e?e.id:null}(c.model,w);a?h.boundModel=a:(h.boundModel=c.model,v("model-unresolved",`Node "${e}": model "${c.model}" does not match any configured model (by id, display name, or name).`,e))}void 0!==c.inputMode&&(n.has(c.inputMode)?(h.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(h.isolatedPrompt=c.isolatedPrompt)):v("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(p.has(c.outputMode)?h.outputMode=c.outputMode:v("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,e)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?v("invalid-max-turns",`Node "${e}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,e):h.maxTurns=i(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(h.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(h.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(h.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(h.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(h.captureResource=c.captureResource.trim())}else if("subflow"===f){if(function(c,d,e,f,g){let h=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,i=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0;if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,h?"parallelFlows":null,i?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&v("subflow-multiple-sources",`Node "${d}": a subflow node should have only one target source ("flow", "subflowSpec", "parallelFlows", "parallelSubflowSpecs", or "generateSubflow"); applying precedence flow > subflowSpec > parallelFlows > parallelSubflowSpecs > generateSubflow.`,d),!0===c.mapOverList){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;(h||i)&&u("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(g.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?g.itemSplit=c.itemSplit:v("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(g.sequential=!0),J(c,g)):u("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}if(c.flow){if(f.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return u("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=r(c.flow,[...b.flows??[],...D]);return a?g.subflowId=a:u("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(e+1>z)return u("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${z} level(s); this inline subflow was not compiled.`,d);if(E>=A)return u("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${A} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,e+1,f);return b?g.subflowId=b.id:u("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(h){let a=[];for(let e of c.parallelFlows){if("string"!=typeof e||!e){u("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(f.some(a=>a.toLowerCase()===e.toLowerCase())){u("subflow-cycle",`Node "${d}": parallel flow "${e}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=r(e,[...b.flows??[],...D]);c?a.includes(c)||a.push(c):u("parallel-flow-unresolved",`Node "${d}": parallel flow "${e}" does not match any existing flow (by id or name).`,d)}a.length>0?(g.parallelSubflowIds=a,J(c,g)):u("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(i){let b=[];for(let g of c.parallelSubflowSpecs){if(!g||"object"!=typeof g){u("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(e+1>z){u("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${z} level(s); a parallel inline subflow was not compiled.`,d);continue}if(E>=A){u("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${A} flows in one bundle; it was not compiled.`,d);continue}let c=a(g,e+1,f);c?b.push(c.id):u("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(g.parallelSubflowIds=b,J(c,g)):u("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}if(void 0!==c.generateSubflow&&null!==c.generateSubflow)return u("subflow-generate-unsupported",`Node "${d}": "generateSubflow" is only available through the AI flow generator. Use "subflowSpec" for deterministic nested authoring, or "flow" to reference an existing flow.`,d);u("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,e,g,I,h),void 0!==c.inputMode&&(n.has(c.inputMode)?h.inputMode=c.inputMode:v("invalid-input-mode",`Node "${e}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,e)),void 0!==c.outputMode&&(o.has(c.outputMode)?h.outputMode=c.outputMode:v("invalid-output-mode",`Node "${e}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,e)),void 0!==j){let{text:a,stripped:b}=q(j);b&&v("pill-stripped",`Node "${e}": binding pills are not supported in generated prompts and were replaced with plain names.`,e),h.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(h.allowCallerPrompt=c.allowCallerPrompt),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(h.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(h.captureResource=c.captureResource.trim())}else if("resource"===f){let a="string"==typeof c.runName?c.runName.trim():"",b="string"==typeof c.server?c.server.trim():"",d="string"==typeof c.uri?c.uri.trim():"";a?(h.scope="run",h.runName=a,(b||d)&&v("resource-both-bindings",`Node "${e}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,e)):(h.scope="mcp",b&&(h.boundServer=b),d&&(h.uri=d),b&&d?x.has(b)||v("server-unknown",`Node "${e}": MCP server "${b}" is not configured in FLUJO.`,e):v("resource-missing-binding",`Node "${e}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,e))}let k={id:(0,d.A)(),type:f,position:{x:0,y:0},data:{label:c.label||`${f.charAt(0).toUpperCase()}${f.slice(1)} Node`,type:f,...c.description?{description:c.description}:{},properties:h}};if(K.set(e,k),L.push(k),"process"===f&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,f=b?.name;if(!f||"string"!=typeof f){v("server-missing-name",`Node "${e}": a server reference is missing its "name"; skipped.`,e);continue}if(a.has(f))continue;a.add(f),x.has(f)||v("server-unknown",`Node "${e}": MCP server "${f}" is not configured in FLUJO.`,e);let g=y[f];if(Array.isArray(b.tools)){if(c=b.tools.filter(a=>"string"==typeof a&&a),g){let a=c.filter(a=>!g.includes(a));a.length>0&&v("tool-unknown",`Node "${e}": server "${f}" does not report tool(s): ${a.join(", ")}.`,e)}}else c=g?[...g]:[];let h={id:(0,d.A)(),type:"mcp",position:{x:0,y:0},data:{label:f,type:"mcp",properties:{boundServer:f,enabledTools:c}}};L.push(h),M.push({processKey:e,mcpNode:h})}}else"process"!==f&&Array.isArray(c.servers)&&c.servers.length>0&&v("servers-on-non-process",`Node "${e}": only process nodes can have "servers"; ignored.`,e)}if(0===K.size)return u("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let N=[],O=new Set;for(let a of F){let b,c=a?.from,d=a?.to,e=c?K.get(c):void 0,g=d?K.get(d):void 0;if(!e||!g){u("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(e===g){u("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===e.type||"resource"===g.type){if(("resource"!==e.type||"process"!==g.type)&&("process"!==e.type||"resource"!==g.type)){u("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&v("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&v("resource-edge-bidirectional",`Edge "${c}" -> "${d}": resource wiring is directional (read vs write); "bidirectional" was ignored — add the opposite edge explicitly if the step both reads and writes.`);let b=`${c}->${d}`;if(O.has(b)){v("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}O.add(b),N.push(function(a,b){let c="resource"===a.type?"resource-out":"process-right-resource",d="resource"===b.type?"resource-in":"process-left-resource";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"resourceEdge",data:{edgeType:"resource"},animated:!1,markerEnd:{...l},style:{...m}}}(e,g));continue}if("start"===g.type){u("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===e.type){u("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let h=`${c}->${d}`;if(O.has(h)){v("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}O.add(h);let i=!0===a.bidirectional;i&&("start"===e.type||"finish"===g.type)&&(v("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),i=!1);let j=a.condition;j&&"object"==typeof j&&("process"!==e.type?v("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${e.type} node; conditions only route from process nodes and were dropped.`):(0,f.C)(j.kind)?"string"!=typeof j.value||0===j.value.length?v("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==j.kind||(0,f.wM)(j.value)||v("edge-condition-regex",`Edge "${c}" -> "${d}" has a regex condition that does not compile; it is kept but will never match at runtime.`),b={kind:j.kind,value:j.value,..."last-message"===j.target?{target:"last-message"}:{},...!0===j.ignoreCase?{ignoreCase:!0}:{},...!0===j.negate?{negate:!0}:{}}):v("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(j.kind)}"; the condition was dropped.`)),N.push(s(e,g,i,b))}for(let{processKey:a,mcpNode:b}of M){let c=K.get(a);N.push(function(a,b){let c="process-right-mcp",d="mcp-left";return{id:`${a.id}:${c}->${b.id}:${d}`,source:a.id,sourceHandle:c,target:b.id,targetHandle:d,type:"mcpEdge",data:{edgeType:"mcp"},animated:!1,markerEnd:{...j},markerStart:{...j},style:{...k}}}(c,b))}!function(a,b,c,d,e){let f=new Map;for(let a of c){let b=a.data?.edgeType;"mcp"!==b&&"resource"!==b&&(f.has(a.source)||f.set(a.source,[]),f.get(a.source).push(a.target))}let g=[...b.values()],h=g.filter(a=>"resource"===a.type),i=g.filter(a=>"resource"!==a.type),j=i.filter(a=>"start"===a.type),k=j.length>0?j:i.slice(0,1),l=new Map,m=k.map(a=>({id:a.id,depth:0}));for(let a of m)l.set(a.id,0);for(;m.length;){let{id:a,depth:b}=m.shift();for(let c of f.get(a)??[])l.has(c)||(l.set(c,b+1),m.push({id:c,depth:b+1}))}let n=0;for(let a of l.values())n=Math.max(n,a);for(let a of i)l.has(a.id)||l.set(a.id,n+1);let o=new Map;for(let[a,c]of b)o.set(c.id,a);let p=new Map;for(let a of i){let b=o.get(a.id),c=e&&b?e[b]:void 0;if(c&&"number"==typeof c.x&&"number"==typeof c.y){a.position={x:c.x,y:c.y};continue}let d=l.get(a.id),f=p.get(d)??0;p.set(d,f+1),a.position={x:250+280*f,y:150+170*d}}let q=new Map;for(let{processKey:a,mcpNode:c}of d){let d=b.get(a),e=q.get(a)??0;q.set(a,e+1),c.position={x:d.position.x+320,y:d.position.y+150*e}}let r=new Map(g.map(a=>[a.id,a])),s=new Map,t=0;for(let a of h){let b=o.get(a.id),d=e&&b?e[b]:void 0;if(d&&"number"==typeof d.x&&"number"==typeof d.y){a.position={x:d.x,y:d.y};continue}let f=c.find(b=>b.data?.edgeType==="resource"&&(b.source===a.id||b.target===a.id)),g=f?f.source===a.id?f.target:f.source:void 0,h=g?r.get(g):void 0;if(h){let b=s.get(h.id)??0;s.set(h.id,b+1),a.position={x:h.position.x-320,y:h.position.y+150*b}}else{let b=0;for(let a of i)b=Math.max(b,a.position.y);a.position={x:250+280*t,y:b+170},t++}}}(0,K,N,M,0===g?c.positions:void 0);let P={id:H,name:G,...e?.description?{description:e.description}:{},nodes:L,edges:N};return B.push(P),D.push({id:P.id,name:P.name}),P}(a,0,[]),G=B,H=e;let I=H.filter(a=>"error"===a.severity).length;return{flow:F,flows:G,issues:H,errorCount:I,warningCount:H.length-I};function J(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?v("invalid-concurrency-limit",`Node "${a.key}": concurrencyLimit "${String(a.concurrencyLimit)}" is not a number; using the runtime default.`,a.key):b.concurrencyLimit=Math.max(1,Math.floor(a.concurrencyLimit))),"string"==typeof a.joinSeparator&&(b.joinSeparator=a.joinSeparator),void 0!==a.errorStrategy&&("fail-fast"===a.errorStrategy||"collect-all"===a.errorStrategy?b.errorStrategy=a.errorStrategy:v("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}function u(a){let b=Array.isArray(a?.nodes)?a.nodes:[],c=Array.isArray(a?.edges)?a.edges:[],d=new Map;for(let a of b)"mcp"===a.type&&d.set(a.id,a);let e=new Map;for(let a of c){if(a.data?.edgeType!=="mcp")continue;let b=d.get(a.target);if(!b)continue;let c=b.data?.properties??{},f="string"==typeof c.boundServer&&c.boundServer?c.boundServer:b.data?.label;if(!f||"string"!=typeof f)continue;let g=Array.isArray(c.enabledTools)?c.enabledTools.filter(a=>"string"==typeof a&&!!a):void 0,h=e.get(a.source)??[];h.push({name:f,...g?{tools:g}:{}}),e.set(a.source,h)}let f=[];for(let a of b){if("mcp"===a.type)continue;let b=a.type;if("start"!==b&&"process"!==b&&"finish"!==b&&"subflow"!==b&&"resource"!==b)continue;let c=a.data?.properties??{},d={key:a.id,type:b,...a.data?.label?{label:a.data.label}:{},...a.data?.description?{description:a.data.description}:{}};if("start"===b)"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate);else if("process"===b){"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),"string"==typeof c.boundModel&&c.boundModel&&(d.model=c.boundModel),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.isolatedPrompt&&c.isolatedPrompt&&(d.isolatedPrompt=c.isolatedPrompt),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"number"==typeof c.maxTurns&&c.maxTurns>0&&(d.maxTurns=c.maxTurns),!0===c.excludeModelPrompt&&(d.excludeModelPrompt=!0),!0===c.excludeStartNodePrompt&&(d.excludeStartNodePrompt=!0),!0===c.excludeSystemPrompt&&(d.excludeSystemPrompt=!0),Array.isArray(c.allowedTools)&&c.allowedTools.length>0&&(d.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&!!a)),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource);let b=e.get(a.id);b&&b.length>0&&(d.servers=b)}else"subflow"===b?(Array.isArray(c.parallelSubflowIds)&&c.parallelSubflowIds.length>0?(d.parallelFlows=c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy)):"string"==typeof c.subflowId&&c.subflowId&&(d.flow=c.subflowId,!0===c.mapOverList&&(d.mapOverList=!0,("json-array"===c.itemSplit||"lines"===c.itemSplit)&&(d.itemSplit=c.itemSplit),!0===c.sequential&&(d.sequential=!0),"number"==typeof c.concurrencyLimit&&c.concurrencyLimit>0&&(d.concurrencyLimit=c.concurrencyLimit),"string"==typeof c.joinSeparator&&(d.joinSeparator=c.joinSeparator),("fail-fast"===c.errorStrategy||"collect-all"===c.errorStrategy)&&(d.errorStrategy=c.errorStrategy))),"string"==typeof c.inputMode&&(d.inputMode=c.inputMode),"string"==typeof c.outputMode&&(d.outputMode=c.outputMode),"string"==typeof c.promptTemplate&&c.promptTemplate&&(d.prompt=c.promptTemplate),!0===c.allowCallerPrompt&&(d.allowCallerPrompt=!0),"string"==typeof c.captureVariable&&c.captureVariable&&(d.captureVariable=c.captureVariable),"string"==typeof c.captureResource&&c.captureResource&&(d.captureResource=c.captureResource)):"resource"===b&&("run"===c.scope&&"string"==typeof c.runName&&c.runName?d.runName=c.runName:("string"==typeof c.boundServer&&c.boundServer&&(d.server=c.boundServer),"string"==typeof c.uri&&c.uri&&(d.uri=c.uri)));f.push(d)}let g=[];for(let a of c){if(a.data?.edgeType==="mcp"||!a.source||!a.target||d.has(a.source)||d.has(a.target))continue;let b=a.data;g.push({from:a.source,to:a.target,...b?.bidirectional?{bidirectional:!0}:{},...b?.condition?{condition:b.condition}:{}})}return{...a?.name?{name:a.name}:{},...a?.description?{description:a.description}:{},nodes:f,edges:g}}function v(a){for(let b of a.nodes){if("process"!==b.type)continue;let a=b.data.properties??{};void 0===a.inputMode&&(a.inputMode="latest-message"),void 0===a.outputMode&&(a.outputMode="latest-message"),b.data.properties=a}}},87821:(a,b,c)=>{c.d(b,{flowService:()=>w});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(33873),i=c.n(h),j=c(29021),k=c(43326);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.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(724),c.e(4498)]).then(c.bind(c,44498));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}};
|