flujo-ai 3.26.0 → 3.27.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 +367 -274
- package/.next/app-path-routes-manifest.json +15 -5
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +24 -0
- package/.next/react-loadable-manifest.json +19 -18
- package/.next/routes-manifest.json +6 -0
- 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 +2 -2
- package/.next/server/app/api/approvals/[id]/route.js +1 -1
- package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/approvals/route.js +2 -2
- package/.next/server/app/api/approvals/route.js.nft.json +1 -1
- package/.next/server/app/api/approvals/route_client-reference-manifest.js +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/bugs/enhance/route.js +2 -2
- package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
- package/.next/server/app/api/bugs/enhance/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.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 -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 +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 -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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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_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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/packages/build/route.js +1 -0
- package/.next/server/app/api/packages/build/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/packages/derive-secrets/route.js +1 -0
- package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/packages/install/route.js +1 -0
- package/.next/server/app/api/packages/install/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/packages/install/status/route.js +1 -0
- package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/packages/resolve/route.js +1 -0
- package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -0
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
- package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/reconcile/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/registry/auth/resend/route.js +1 -0
- package/.next/server/app/api/registry/auth/resend/route.js.nft.json +1 -0
- package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/registry/auth/route.js +1 -0
- package/.next/server/app/api/registry/auth/route.js.nft.json +1 -0
- package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/registry/publish/route.js +1 -0
- package/.next/server/app/api/registry/publish/route.js.nft.json +1 -0
- package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/registry/settings/route.js +1 -0
- package/.next/server/app/api/registry/settings/route.js.nft.json +1 -0
- package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -0
- 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/runs/active/route.js +2 -2
- package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
- package/.next/server/app/api/runs/active/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.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/waves/route.js +1 -1
- package/.next/server/app/api/waves/route.js.nft.json +1 -1
- package/.next/server/app/api/waves/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 -10
- 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 +3 -3
- package/.next/server/app/docs/page.js +3 -3
- 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 +3 -3
- package/.next/server/app/executions/page.js +3 -3
- 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 +3 -3
- 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 +4 -4
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/mcp/page.js +6 -6
- 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 +3 -3
- package/.next/server/app/models/page.js +2 -2
- 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/packages/page.js +3 -0
- package/.next/server/app/packages/page.js.nft.json +1 -0
- package/.next/server/app/packages/page_client-reference-manifest.js +1 -0
- package/.next/server/app/packages.html +1 -0
- package/.next/server/app/packages.meta +7 -0
- package/.next/server/app/packages.rsc +22 -0
- package/.next/server/app/page.js +1 -1
- 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 +3 -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 +3 -3
- 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 +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 -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 +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]/resources/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 +2 -2
- 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/waves/page.js +3 -3
- package/.next/server/app/waves/page.js.nft.json +1 -1
- package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
- package/.next/server/app/waves.html +1 -1
- package/.next/server/app/waves.rsc +3 -3
- package/.next/server/app-paths-manifest.json +15 -5
- package/.next/server/chunks/1083.js +1 -1
- package/.next/server/chunks/1089.js +1 -0
- package/.next/server/chunks/1114.js +1 -1
- package/.next/server/chunks/1197.js +1 -1
- package/.next/server/chunks/1226.js +1 -1
- package/.next/server/chunks/1314.js +1 -0
- package/.next/server/chunks/1604.js +65 -0
- package/.next/server/chunks/1659.js +1 -1
- package/.next/server/chunks/166.js +5 -5
- package/.next/server/chunks/1805.js +1 -0
- package/.next/server/chunks/1819.js +2 -0
- package/.next/server/chunks/1925.js +1 -0
- package/.next/server/chunks/237.js +1 -0
- package/.next/server/chunks/2373.js +1 -1
- package/.next/server/chunks/2388.js +1 -0
- package/.next/server/chunks/2434.js +2 -0
- package/.next/server/chunks/2666.js +1 -0
- package/.next/server/chunks/2859.js +1 -1
- package/.next/server/chunks/2940.js +41 -0
- package/.next/server/chunks/2985.js +1 -0
- package/.next/server/chunks/3298.js +1 -1
- package/.next/server/chunks/{8445.js → 3392.js} +2 -2
- package/.next/server/chunks/346.js +1 -0
- package/.next/server/chunks/3569.js +1 -0
- package/.next/server/chunks/3629.js +1 -0
- package/.next/server/chunks/4042.js +1 -0
- package/.next/server/chunks/4306.js +1 -0
- package/.next/server/chunks/4322.js +1 -0
- package/.next/server/chunks/{3774.js → 4426.js} +2 -2
- package/.next/server/chunks/4545.js +3 -3
- package/.next/server/chunks/{6745.js → 4661.js} +1 -1
- package/.next/server/chunks/4671.js +1 -1
- package/.next/server/chunks/4681.js +1 -0
- package/.next/server/chunks/4765.js +1 -0
- package/.next/server/chunks/4771.js +1 -1
- package/.next/server/chunks/5094.js +2 -0
- package/.next/server/chunks/5096.js +1 -0
- package/.next/server/chunks/510.js +1 -0
- package/.next/server/chunks/{4578.js → 5150.js} +1 -1
- package/.next/server/chunks/5463.js +1 -1
- package/.next/server/chunks/5544.js +5 -5
- package/.next/server/chunks/5708.js +1 -1
- package/.next/server/chunks/5880.js +1 -0
- package/.next/server/chunks/6005.js +1 -0
- package/.next/server/chunks/6529.js +5 -0
- package/.next/server/chunks/6537.js +1 -1
- package/.next/server/chunks/6826.js +1 -1
- package/.next/server/chunks/6996.js +1 -62
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7028.js +1 -0
- package/.next/server/chunks/7214.js +2 -2
- package/.next/server/chunks/724.js +1 -1
- package/.next/server/chunks/7362.js +13 -13
- package/.next/server/chunks/7463.js +2 -2
- package/.next/server/chunks/7485.js +1 -0
- package/.next/server/chunks/7498.js +42 -0
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7579.js +2 -2
- package/.next/server/chunks/{3030.js → 7674.js} +1 -1
- package/.next/server/chunks/7764.js +37 -0
- package/.next/server/chunks/7821.js +1 -1
- package/.next/server/chunks/8192.js +12 -0
- package/.next/server/chunks/826.js +52 -0
- package/.next/server/chunks/8387.js +1 -1
- package/.next/server/chunks/{5662.js → 8522.js} +1 -1
- package/.next/server/chunks/8667.js +1 -0
- package/.next/server/chunks/869.js +2 -0
- package/.next/server/chunks/{3489.js → 8730.js} +1 -1
- package/.next/server/chunks/8732.js +62 -0
- package/.next/server/chunks/8739.js +1 -1
- package/.next/server/chunks/8745.js +1 -1
- package/.next/server/chunks/8851.js +1 -0
- package/.next/server/chunks/94.js +1 -1
- package/.next/server/chunks/{1152.js → 9400.js} +1 -1
- package/.next/server/chunks/{4456.js → 9472.js} +2 -2
- package/.next/server/chunks/9583.js +1 -0
- package/.next/server/instrumentation.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-manifest.json +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/O-elWbT5rs6ci1CrCqez1/_buildManifest.js +1 -0
- package/.next/static/chunks/{2003-7710c23acaef11c9.js → 2003-f826c607d609d1fa.js} +1 -1
- package/.next/static/chunks/{4003-3b3768446ae333df.js → 2019-f22580cb726c5dca.js} +1 -1
- package/.next/static/chunks/256-a13a59247ac6cc68.js +1 -0
- package/.next/static/chunks/2566-60acd5838abd9f3f.js +1 -0
- package/.next/static/chunks/2822-8168e3bb8443a1ec.js +1 -0
- package/.next/static/chunks/289-98f50bfcf833d661.js +1 -0
- package/.next/static/chunks/2981-10313d395eb99645.js +1 -0
- package/.next/static/chunks/3028-fc1f04241ed578ff.js +1 -0
- package/.next/static/chunks/3089.9e15df4ffd0fe4e8.js +1 -0
- package/.next/static/chunks/{3217.f728df99ab5da33c.js → 3217.260785c2198d1e9d.js} +1 -1
- package/.next/static/chunks/3392-6dd9ad3be66a7ce9.js +1 -0
- package/.next/static/chunks/{3556-3b6f7c99b015b752.js → 3556-b9855146c7506696.js} +1 -1
- package/.next/static/chunks/3560-5bdceef09b50e1c3.js +1 -0
- package/.next/static/chunks/3574-94e9f20550550a58.js +1 -0
- package/.next/static/chunks/4483-463f8bfc6f3dd5fa.js +1 -0
- package/.next/static/chunks/{488-623d07c3fbc21e28.js → 488-7ab54d8ae2b4b550.js} +1 -1
- package/.next/static/chunks/{5512.d01d565f73109a1a.js → 5512.682bef7fd3a7c286.js} +1 -1
- package/.next/static/chunks/5578-49bc150686c13b6f.js +1 -0
- package/.next/static/chunks/5766-dbd21cb8435605aa.js +1 -0
- package/.next/static/chunks/5866-6834cbc4ab02d86f.js +1 -0
- package/.next/static/chunks/6669-012c73587a6628fc.js +1 -0
- package/.next/static/chunks/6961-a40e97c06e616300.js +1 -0
- package/.next/static/chunks/7111-44538f8a64241b74.js +1 -0
- package/.next/static/chunks/7445-2802e158c9093556.js +1 -0
- package/.next/static/chunks/7554-db290baed5782cab.js +8 -0
- package/.next/static/chunks/795-704a0e742ecc2ef6.js +1 -0
- package/.next/static/chunks/8041-05830e887c133085.js +1 -0
- package/.next/static/chunks/{812-624e93f4c0f671c7.js → 812-8b3d4e0f6546d6f9.js} +1 -1
- package/.next/static/chunks/{8345.fbc0af16acce7256.js → 8345.bc5534ec13abc9ee.js} +1 -1
- package/.next/static/chunks/8401-0f39d91810180a88.js +1 -0
- package/.next/static/chunks/{8405.e728bc83a7c9fed6.js → 8405.73e8be2c8e5b55c5.js} +1 -1
- package/.next/static/chunks/{8989-401559d9f3bc80a0.js → 8989-5fa9c7c670eb9a1a.js} +1 -1
- package/.next/static/chunks/{9164-829ab5b085ec06d6.js → 9164-840f056a0e11d979.js} +1 -1
- package/.next/static/chunks/9562-ef0ddd4e6b9023cf.js +1 -0
- package/.next/static/chunks/9720-5ecb48f1a28808fe.js +1 -0
- package/.next/static/chunks/app/api/approvals/[id]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/approvals/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/backup/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/browse/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/bugs/enhance/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/cwd/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/encryption/secure/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/env/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/compile/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/generate/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/improve/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/quick-chat/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/repair/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/flow/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/git/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/init/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/local-models/capability/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/local-models/pull/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/local-models/suggest/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/cancel/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/model/[id]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/model/provider/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/model/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/model/test/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/oauth/initiate/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/oauth/reset/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/packages/build/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/packages/derive-secrets/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/packages/install/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/packages/install/status/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/packages/resolve/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/resend/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/registry/publish/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/registry/settings/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/restore/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/runs/active/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/storage/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/update/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/waves/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[id]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/chat/page-93403b0e520ba8d3.js +1 -0
- package/.next/static/chunks/app/docs/page-2c972a639cd9a41c.js +1 -0
- package/.next/static/chunks/app/executions/page-bb2fef60b2240f69.js +1 -0
- package/.next/static/chunks/app/flows/page-d60c5b47c923564a.js +1 -0
- package/.next/static/chunks/app/layout-eea7078d7553c21a.js +1 -0
- package/.next/static/chunks/app/mcp/page-92c03186d566a4f5.js +1 -0
- package/.next/static/chunks/app/mcp-flows/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/mcp-proxy/[server]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/models/page-d71e5606a8e29479.js +1 -0
- package/.next/static/chunks/app/packages/page-e64480d78312edd0.js +1 -0
- package/.next/static/chunks/app/{page-0a95c40a65dbd2eb.js → page-d3ea90b065b95d1e.js} +1 -1
- package/.next/static/chunks/app/settings/page-d067a3a624ec2fa0.js +1 -0
- package/.next/static/chunks/app/v1/chat/completions/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/v1/models/route-3e3cc52436d34625.js +1 -0
- package/.next/static/chunks/app/waves/page-ff15db2f75fb5d62.js +1 -0
- package/.next/static/chunks/webpack-2b2d7505a2ac6538.js +1 -0
- package/.next/static/css/{64cb1f185b52a623.css → 69ab44eb350e0b6c.css} +1 -1
- package/.next/trace +9 -10
- package/.next/types/app/api/packages/build/route.ts +347 -0
- package/.next/types/app/api/packages/derive-secrets/route.ts +347 -0
- package/.next/types/app/api/packages/install/route.ts +347 -0
- package/.next/types/app/api/packages/install/status/route.ts +347 -0
- package/.next/types/app/api/packages/resolve/route.ts +347 -0
- package/.next/types/app/api/registry/auth/resend/route.ts +347 -0
- package/.next/types/app/api/registry/auth/route.ts +347 -0
- package/.next/types/app/api/registry/publish/route.ts +347 -0
- package/.next/types/app/api/registry/settings/route.ts +347 -0
- package/.next/types/app/packages/page.ts +84 -0
- package/.next/types/routes.d.ts +12 -2
- package/.next/types/validator.ts +90 -0
- package/README.md +1 -1
- package/package.json +6 -1
- package/.next/server/chunks/1223.js +0 -1
- package/.next/server/chunks/1377.js +0 -1
- package/.next/server/chunks/289.js +0 -1
- package/.next/server/chunks/3823.js +0 -41
- package/.next/server/chunks/3855.js +0 -1
- package/.next/server/chunks/3924.js +0 -52
- package/.next/server/chunks/4372.js +0 -1
- package/.next/server/chunks/4561.js +0 -65
- package/.next/server/chunks/4677.js +0 -37
- package/.next/server/chunks/472.js +0 -1
- package/.next/server/chunks/4793.js +0 -2
- package/.next/server/chunks/4836.js +0 -1
- package/.next/server/chunks/5148.js +0 -1
- package/.next/server/chunks/5311.js +0 -1
- package/.next/server/chunks/584.js +0 -1
- package/.next/server/chunks/62.js +0 -1
- package/.next/server/chunks/6240.js +0 -1
- package/.next/server/chunks/6306.js +0 -1
- package/.next/server/chunks/6793.js +0 -1
- package/.next/server/chunks/6908.js +0 -12
- package/.next/server/chunks/8216.js +0 -1
- package/.next/server/chunks/856.js +0 -5
- package/.next/server/chunks/8652.js +0 -42
- package/.next/server/chunks/9165.js +0 -1
- package/.next/server/chunks/9427.js +0 -1
- package/.next/static/Il6IDWxf3CN0dv-P6QQrp/_buildManifest.js +0 -1
- package/.next/static/chunks/1675-773454288de4309d.js +0 -1
- package/.next/static/chunks/1731-6e45fb529f9044a3.js +0 -1
- package/.next/static/chunks/2318-76fcb6c769b1a569.js +0 -1
- package/.next/static/chunks/2403-5c26e0abd76095b1.js +0 -1
- package/.next/static/chunks/2566-6e2b9d9349814789.js +0 -1
- package/.next/static/chunks/2734-59fbe2f62a59df86.js +0 -1
- package/.next/static/chunks/3089.6b4e21e1faa304e2.js +0 -1
- package/.next/static/chunks/3109-11bdec9bdfd996c3.js +0 -1
- package/.next/static/chunks/333-5f3c5be57c80c48c.js +0 -1
- package/.next/static/chunks/3333-b7b3e5758a568013.js +0 -1
- package/.next/static/chunks/4635-0fe310d3be64e71e.js +0 -1
- package/.next/static/chunks/4690-ec7d397cfacedac3.js +0 -1
- package/.next/static/chunks/4775-cb9c0be621363a08.js +0 -8
- package/.next/static/chunks/5336-81da1080de29ebfc.js +0 -1
- package/.next/static/chunks/7274-1184563607f2b5f5.js +0 -1
- package/.next/static/chunks/8166-e75acdc559b34fcd.js +0 -1
- package/.next/static/chunks/8607-5787e42775fc3acb.js +0 -1
- package/.next/static/chunks/8610-660d5088bc1dd7a7.js +0 -1
- package/.next/static/chunks/9240-d0a51f4d504f34b1.js +0 -1
- package/.next/static/chunks/9562-b7922ceb400ec536.js +0 -1
- package/.next/static/chunks/9704-6b7415964d7c042a.js +0 -1
- package/.next/static/chunks/app/api/approvals/[id]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/approvals/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/backup/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/browse/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/bugs/enhance/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/cwd/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/encryption/secure/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/env/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/compile/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/generate/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/improve/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/quick-chat/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/repair/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/flow/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/git/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/init/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/local-models/capability/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/local-models/pull/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/local-models/suggest/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/cancel/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/model/[id]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/model/provider/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/model/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/model/test/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/oauth/callback/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/oauth/initiate/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/oauth/reset/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/restore/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/runs/active/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/storage/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/update/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/waves/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[id]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/chat/page-04ad1fad78048afb.js +0 -1
- package/.next/static/chunks/app/docs/page-5475c616764dbb18.js +0 -1
- package/.next/static/chunks/app/executions/page-c18708ed96d228ec.js +0 -1
- package/.next/static/chunks/app/flows/page-f7e44aa545bcc56e.js +0 -1
- package/.next/static/chunks/app/layout-e6fbae80e0f456a6.js +0 -1
- package/.next/static/chunks/app/mcp/page-3638fbee04a3a6ea.js +0 -1
- package/.next/static/chunks/app/mcp-flows/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/mcp-proxy/[server]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/models/page-e690a986047b1e62.js +0 -1
- package/.next/static/chunks/app/settings/page-3ef9b95187e18a5a.js +0 -1
- package/.next/static/chunks/app/v1/chat/completions/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/v1/models/route-6b442f97c5062f2c.js +0 -1
- package/.next/static/chunks/app/waves/page-c9a307e2236423a4.js +0 -1
- package/.next/static/chunks/webpack-a6844e1074885c2f.js +0 -1
- /package/.next/static/{Il6IDWxf3CN0dv-P6QQrp → O-elWbT5rs6ci1CrCqez1}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";exports.id=7463,exports.ids=[7463],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>m});var d=c(8336),e=c(78606),f=c(27386),g=c(33132);function h(a){return a.data?.type??a.type??"unknown"}function i(a){return a.data?.label||a.id}function j(a){return a.data?.edgeType==="mcp"}function k(a){return a.data?.edgeType==="resource"}function l(a){return j(a)||k(a)}function m(a,b={}){let c=[],n=Array.isArray(a?.nodes)?a.nodes:[],o=Array.isArray(a?.edges)?a.edges:[],p=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?i(e):void 0}),q=new Map((b.models??[]).map(a=>[a.id,a])),r=new Map((b.servers??[]).map(a=>[a.name,a])),s=!!b.models,t=!!b.servers,u=n.filter(a=>"start"===h(a)),v=n.filter(a=>"finish"===h(a)),w=n.filter(a=>"process"===h(a)),x=n.filter(a=>"mcp"===h(a));if(0===u.length)p("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(u.length>1)for(let a of u.slice(1))p("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===v.length&&p("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),w)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(s&&!q.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";p("error","process-model-missing",`Process node "${i(a)}" is bound to a model that no longer exists${c}.`,a)}}else p("error","process-missing-model",`Process node "${i(a)}" has no model bound.`,a)}for(let a of x){let b=(a.data?.properties??{}).boundServer;if(b){if(t&&!r.has(b))p("warning","mcp-server-missing",`MCP node "${i(a)}" is bound to server "${b}", which isn't in your current MCP server list. It may be offline (e.g. not connected), renamed, or removed — if it was renamed or removed, rebind this node.`,a);else if(t){let c=r.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;p("warning","mcp-server-disconnected",`MCP node "${i(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else p("warning","mcp-missing-server",`MCP node "${i(a)}" is not bound to a server.`,a);o.some(b=>j(b)&&(b.source===a.id||b.target===a.id))||p("warning","mcp-node-unconnected",`MCP node "${i(a)}" is not connected to any Process node.`,a)}for(let a of n.filter(a=>"resource"===h(a))){let b=a.data?.properties??{},c="run"===b.scope?"run":"mcp",d="string"==typeof b.boundServer?b.boundServer:"",e="string"==typeof b.uri?b.uri:"",g="string"==typeof b.runName?b.runName.trim():"";"mcp"!==c||d&&e||p("warning","resource-missing-binding",`Resource node "${i(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||g||p("warning","resource-missing-binding",`Resource node "${i(a)}" is a run artifact with no name; give it a name so steps can produce/consume it.`,a),"run"===c&&g&&!(0,f.qW)(g)&&p("warning","resource-run-name",`Resource node "${i(a)}" is named "${g}", which is not a valid artifact name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${res:...}.`,a),"mcp"===c&&d&&t&&!r.has(d)&&p("warning","resource-server-missing",`Resource node "${i(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=o.filter(b=>k(b)&&(b.source===a.id||b.target===a.id));0===h.length&&p("warning","resource-node-unconnected",`Resource node "${i(a)}" is not connected to any Process node.`,a);let j=h.filter(b=>b.target===a.id);"mcp"===c&&j.length>0&&p("error","resource-produce-static",`Resource node "${i(a)}" is a static MCP resource, but a step writes INTO it. Only run artifacts (scope "run") can be produced by a step — flip the edge or make this a run artifact.`,a),"run"===c&&j.length>1&&p("warning","resource-multiple-producers",`Resource node "${i(a)}" is produced by ${j.length} steps; the last writer wins. Consider one producer per artifact.`,a),"run"===c&&0===j.length&&h.length>0&&p("warning","resource-consumed-never-produced",`Resource node "${i(a)}" is consumed but no step in this flow produces it; it resolves to nothing unless an earlier run captured it.`,a)}for(let a of n.filter(a=>"signal"===h(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||p("warning","signal-missing-topic",`Signal node "${i(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(u.length>0){let a=function(a){let b=new Map,c=(a,c)=>{b.has(a)||b.set(a,[]),b.get(a).push(c)};for(let b of a)!l(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(o);for(let b of u)a.get(b.id)?.length||p("error","start-no-outgoing","The Start node is not connected to anything; the flow cannot run.",b);let b=function(a,b){let c=new Set(a),d=[...a];for(;d.length;){let a=d.shift();for(let e of b.get(a)??[])c.has(e)||(c.add(e),d.push(e))}return c}(u.map(a=>a.id),a);for(let a of[...w,...v])b.has(a.id)||p("warning","unreachable-node",`${"finish"===h(a)?"Finish":"Process"} node "${i(a)}" is not reachable from the Start node.`,a)}for(let a of n.filter(a=>"subflow"===h(a))){let b=o.filter(b=>!l(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&p("error","subflow-multiple-outgoing",`Subflow node "${i(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a);let c=a.data?.properties??{},d="string"==typeof c.subflowId&&c.subflowId?c.subflowId:void 0,e=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&e.length>0&&p("error","subflow-both-targets",`Subflow node "${i(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let g=!0===c.mapOverList;g&&e.length>0&&p("error","subflow-map-and-parallel",`Subflow node "${i(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),g&&!d&&0===e.length&&p("error","subflow-map-no-child",`Subflow node "${i(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let h=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];h.length>0&&!d&&p("error","subflow-spawn-no-child",`Subflow node "${i(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),h.length>0&&e.length>0&&p("error","subflow-spawn-and-parallel",`Subflow node "${i(a)}" combines "spawnBriefs" with "parallelSubflowIds"; spawn briefs run one sub-agent per brief and cannot be combined with a multi-flow fan-out list.`,a),h.length>0&&g&&p("error","subflow-spawn-and-map",`Subflow node "${i(a)}" combines "spawnBriefs" with "mapOverList"; use one lane source or the other.`,a);let j="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(j&&((0,f.qW)(j)||p("warning","subflow-parallel-var-name",`Subflow node "${i(a)}" reads dynamic fan-out targets from "${j}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to capture with \${var:...}.`,a),g&&p("error","subflow-map-and-parallel-var",`Subflow node "${i(a)}" combines "mapOverList" with dynamic fan-out ("parallelSubflowIdsVar"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),n.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===j})||p("warning","subflow-parallel-var-uncaptured",`Subflow node "${i(a)}" reads dynamic fan-out targets from variable "${j}", but no node captures it (captureVariable). It may be seeded by the caller; otherwise it resolves to no targets and the node falls back to its static parallel list.`,a)),!0===c.allowCallerFanout&&g&&p("error","subflow-map-and-caller-fanout",`Subflow node "${i(a)}" combines "mapOverList" with agentic fan-out ("allowCallerFanout"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),e.length>0||h.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&p("warning","subflow-concurrency-limit",`Subflow node "${i(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(n.map(a=>[a.id,a])),b=new Set;for(let c of o){if(l(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let f=a.get(c.source),g=f?h(f):"unknown";if("process"!==g){p("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${f?i(f):c.source}" has a routing condition, but only process nodes can route on a condition.`,f??void 0);continue}b.add(c.source),(0,e.C)(d.kind)?"always"===d.kind||("string"!=typeof d.value||0===d.value.length?p("warning","edge-condition-value",`Process node "${i(f)}" has an outgoing edge condition with no "value"; it will never match.`,f):"regex"!==d.kind||(0,e.wM)(d.value)||p("warning","edge-condition-regex",`Process node "${i(f)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,f)):p("warning","edge-condition-kind",`Process node "${i(f)}" has an outgoing edge whose condition kind "${String(d.kind)}" is unknown; it will never match.`,f)}for(let c of b){let b=a.get(c);b&&(o.some(a=>!l(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||p("warning","edge-condition-no-fallback",`Process node "${i(b)}" has conditioned outgoing edges but no bare fallback edge; if no condition matches, the flow ends here.`,b))}}{let a=new Set;for(let b of n){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,f.qW)(d)||p("warning","capture-var-name",`${"subflow"===h(b)?"Subflow":"Process"} node "${i(b)}" captures into "${d}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${var:...}.`,b)}}let b=["promptTemplate","isolatedPrompt"],c=new Set;for(let d of n){let e=d.data?.properties??{};for(let g of b){let b=e[g];if("string"==typeof b&&b)for(let e of(0,f.T9)(b)){if(a.has(e))continue;let b=`${d.id}:${e}`;c.has(b)||(c.add(b),p("warning","var-ref-uncaptured",`${i(d)} references \${var:${e}} but no step in this flow captures "${e}" (via captureVariable). It resolves to empty unless supplied as a run input — check for a typo or a step ordered after this one.`,d))}}}}{for(let a of n){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,g.g2)(b.trim());(0,g.ng)(c)||p("warning","capture-kv-name",`${"subflow"===h(a)?"Subflow":"Process"} node "${i(a)}" captures into kv "${b.trim()}", whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${kv:...}.`,a)}}let a=["promptTemplate","isolatedPrompt"],b=new Set;for(let c of n){let d=c.data?.properties??{};for(let e of a){let a=d[e];if("string"==typeof a&&a)for(let d of(0,g.pf)(a)){let{key:a}=(0,g.g2)(d);if((0,g.ng)(a))continue;let e=`${c.id}:${d}`;b.has(e)||(b.add(e),p("warning","kv-ref-name",`${i(c)} references \${kv:${d}}, whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it resolves to empty.`,c))}}}}for(let a of w){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let e=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!j(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==h(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}(a.id,n,o),f=new Set;for(let g of(0,d.A$)(c)){if("handoff"===g.server)continue;let c=`${g.kind}:${g.server}:${g.name}`;!f.has(c)&&(f.add(c),e.has(g.server)?"tool"===g.kind&&b.serverTools&&b.serverTools[g.server]&&!b.serverTools[g.server].includes(g.name)&&p("warning","tool-unavailable",`Process node "${i(a)}" references tool "${g.name}" which server "${g.server}" no longer provides.`,a):p("error","tool-pill-disconnected",`Process node "${i(a)}" references ${g.kind} "${g.name}" from server "${g.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}let y=c.filter(a=>"error"===a.severity).length,z=c.length-y;return{issues:c,errorCount:y,warningCount:z,isRunnable:0===y}}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>C});var d=c(18230),e=c(44561),f=c(79111),g=c(44479);let h=(0,d.h)("backend/execution/flow/persistConversationState");async function i(a,b){let c="conversations/",d=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,f.ln)(d),null!=b.conversationId&&(0,f.ln)(b.conversationId),b.ephemeral)?(h.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,g.isConversationDeleted)(b.conversationId)?(h.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})}var j=c(34115),k=c(96249),l=c(37860),m=c(26485),n=c(80808),o=c(59448),p=c(11659),q=c(86028),r=c(12763),s=c(82464),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c;try{b=await r.modelService.loadModels()}catch(a){u.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await s.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){u.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,t.nC)(a,{models:b,servers:c})}async function w(a){let b=await p.flowService.getFlow(a);return b?v(b):(u.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var x=c(85701),y=c(35796);let z=(0,d.h)("backend/execution/flow/runFlow");p.flowService.getFlowByName||(p.flowService.getFlowByName=async a=>(await p.flowService.loadFlows()).find(b=>b.name===a)||null,z.info("Added getFlowByName method directly to flowService instance."));let A=p.flowService;async function B(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await p.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,l.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){z.warn("Failed to publish runFlow flow-run event:",a)}}async function C(a){let b,c,d,h=Date.now(),l=a.flujo??!0,r=a.requireApproval??!1,s=a.debug??!1,t=a.continueDebug??!1,u=a.userTurn??!1,C="ephemeral"===a.mode,D=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),E={model:a.modelName,messages:D,processNodeId:a.processNodeId};z.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:D.length,mode:C?"ephemeral":"conversation",flujo:l,requireApproval:r,flujodebug:s,conversationId:a.conversationId});let F=a.conversationId||crypto.randomUUID(),G=`conversations/${F}`,H="new",I=!1;if(z.info(`Effective Conversation ID for this run: ${F}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(F))c=e.FlowExecutor.conversationStates.get(F),z.info(`Resuming conversation ${F} from memory`,{currentNodeId:c.currentNodeId}),H="memory";else if(!C)try{(c=await (0,f.YM)(G,void 0))?(z.info(`Loaded conversation state from storage: ${F}`),H="storage",await (0,j.jM)(c),e.FlowExecutor.conversationStates.set(F,c)):z.info(`No state found in storage for conversation: ${F}. Will create new state.`)}catch(a){z.warn(`Error loading conversation state from storage for ${F}:`,a)}if(c?((b=c).conversationId!==F&&(z.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${F}). Using effectiveConvId.`),b.conversationId=F),"new"!==H&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(z.info(`Resuming completed/errored/fresh conversation ${F}. Resetting status to 'running'.`),I="error"===b.status,b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===H&&e.FlowExecutor.conversationStates.set(F,b)),E.processNodeId&&"new"!==H&&(z.info(`Edit detected: Resetting currentNodeId for conversation ${F} to provided processNodeId: ${E.processNodeId}`),b.currentNodeId=E.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},q.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(F,b),z.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(z.info(`Creating new conversation state object for ID: ${F}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:F,currentNodeId:void 0,status:"running",title:a.title?.trim()||"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:s,executionTrace:s&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=r,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),C&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId),b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>x.A)return z.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:m.O,sharedState:b};let J=[...b.messages??[]];if("new"===H){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&E.model){let a=E.model.substring(5),d=await A.getFlowByName(a);if(!d)return z.error(`Flow not found: ${a}`),{status:"error",conversationId:F,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:m.O,sharedState:b};c=d.id}if(!c)return z.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:m.O,sharedState:b};b.flowId=c;let d=(E.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=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} during init to: ${b.title}`))}await i(G,b),z.debug(`Saved initial state for new conversation ${F}.`)}catch(a){z.error(`Failed to save initial state for new conversation ${F}:`,a)}e.FlowExecutor.conversationStates.set(F,b)}else E.messages&&E.messages.length>0&&(b.messages=E.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),z.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(u||void 0===b.debugMode)&&(b.debugMode=s),u&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,j.UG)(b,J)}catch(a){z.warn(`Conversation-log reconcile failed for ${F}; continuing`,a)}if(u&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(z.info(`New user turn for ${F}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(F,b))}if(I&&u&&!C&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;if(a?.role!=="user"){let a;for(let c=b.messages.length-1;c>=0;c--)if("user"===b.messages[c].role){a=b.messages[c].processNodeId;break}if(!a&&b.flowId)try{let c=await p.flowService.getFlow(b.flowId);a=c?.nodes?.find(a=>"start"===a.type)?.id}catch(a){z.warn(`Could not resolve start node for error-resume of ${F}`,a)}a&&a!==b.currentNodeId&&(z.info(`Error-resume for ${F}: replaying turn from entry node ${a} (was ${b.currentNodeId}).`),b.currentNodeId=a,e.FlowExecutor.conversationStates.set(F,b))}}u&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),z.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${F}.`));let K=!1,L=0,M=a.emit??k.$.emitterFor(F),N=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),O=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,M({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}:{}})},P=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),N.has(a.id)||(N.add(a.id),"system"!==a.role&&(M({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),O(a)))};if(M({type:"run:start",flowId:b.flowId}),(u||"new"===H)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
|
|
1
|
+
"use strict";exports.id=7463,exports.ids=[7463],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>o});var d=c(8336),e=c(17587),f=c(78606),g=c(27386),h=c(33132);function i(a){return a.data?.type??a.type??"unknown"}function j(a){return a.data?.label||a.id}function k(a){return a.data?.edgeType==="mcp"}function l(a){return a.data?.edgeType==="resource"}function m(a){return k(a)||l(a)}function n(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!k(b))continue;let c=null;if(b.source===a?c=b.target:b.target===a&&(c=b.source),!c)continue;let f=d.get(c);if(!f||"mcp"!==i(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}function o(a,b={}){let c=[],p=Array.isArray(a?.nodes)?a.nodes:[],q=Array.isArray(a?.edges)?a.edges:[],r=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?j(e):void 0}),s=new Map((b.models??[]).map(a=>[a.id,a])),t=new Map((b.servers??[]).map(a=>[a.name,a])),u=!!b.models,v=!!b.servers,w=p.filter(a=>"start"===i(a)),x=p.filter(a=>"finish"===i(a)),y=p.filter(a=>"process"===i(a)),z=p.filter(a=>"mcp"===i(a));if(0===w.length)r("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(w.length>1)for(let a of w.slice(1))r("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===x.length&&r("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),y)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(u&&!s.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";r("error","process-model-missing",`Process node "${j(a)}" is bound to a model that no longer exists${c}.`,a)}}else r("error","process-missing-model",`Process node "${j(a)}" has no model bound.`,a)}for(let a of z){let b=(a.data?.properties??{}).boundServer;if(b){if(v&&!t.has(b))r("warning","mcp-server-missing",`MCP node "${j(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(v){let c=t.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;r("warning","mcp-server-disconnected",`MCP node "${j(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else r("warning","mcp-missing-server",`MCP node "${j(a)}" is not bound to a server.`,a);q.some(b=>k(b)&&(b.source===a.id||b.target===a.id))||r("warning","mcp-node-unconnected",`MCP node "${j(a)}" is not connected to any Process node.`,a)}for(let a of p.filter(a=>"resource"===i(a))){let b=a.data?.properties??{},c="run"===b.scope?"run":"mcp",d="string"==typeof b.boundServer?b.boundServer:"",e="string"==typeof b.uri?b.uri:"",f="string"==typeof b.runName?b.runName.trim():"";"mcp"!==c||d&&e||r("warning","resource-missing-binding",`Resource node "${j(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||f||r("warning","resource-missing-binding",`Resource node "${j(a)}" is a run artifact with no name; give it a name so steps can produce/consume it.`,a),"run"===c&&f&&!(0,g.qW)(f)&&r("warning","resource-run-name",`Resource node "${j(a)}" is named "${f}", which is not a valid artifact name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${res:...}.`,a),"mcp"===c&&d&&v&&!t.has(d)&&r("warning","resource-server-missing",`Resource node "${j(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=q.filter(b=>l(b)&&(b.source===a.id||b.target===a.id));0===h.length&&r("warning","resource-node-unconnected",`Resource node "${j(a)}" is not connected to any Process node.`,a);let i=h.filter(b=>b.target===a.id);"mcp"===c&&i.length>0&&r("error","resource-produce-static",`Resource node "${j(a)}" is a static MCP resource, but a step writes INTO it. Only run artifacts (scope "run") can be produced by a step — flip the edge or make this a run artifact.`,a),"run"===c&&i.length>1&&r("warning","resource-multiple-producers",`Resource node "${j(a)}" is produced by ${i.length} steps; the last writer wins. Consider one producer per artifact.`,a),"run"===c&&0===i.length&&h.length>0&&r("warning","resource-consumed-never-produced",`Resource node "${j(a)}" is consumed but no step in this flow produces it; it resolves to nothing unless an earlier run captured it.`,a)}for(let a of p.filter(a=>"signal"===i(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||r("warning","signal-missing-topic",`Signal node "${j(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(w.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)!m(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(q);for(let b of w)a.get(b.id)?.length||r("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}(w.map(a=>a.id),a);for(let a of[...y,...x])b.has(a.id)||r("warning","unreachable-node",`${"finish"===i(a)?"Finish":"Process"} node "${j(a)}" is not reachable from the Start node.`,a)}for(let a of p.filter(a=>"subflow"===i(a))){let b=q.filter(b=>!m(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&r("error","subflow-multiple-outgoing",`Subflow node "${j(a)}" has ${b.length} outgoing connections; a subflow can only have one (either A > B > C or a bidirectional A <> B).`,a);let c=a.data?.properties??{},d="string"==typeof c.subflowId&&c.subflowId?c.subflowId:void 0,e=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&e.length>0&&r("error","subflow-both-targets",`Subflow node "${j(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let f=!0===c.mapOverList;f&&e.length>0&&r("error","subflow-map-and-parallel",`Subflow node "${j(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),f&&!d&&0===e.length&&r("error","subflow-map-no-child",`Subflow node "${j(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let h=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];h.length>0&&!d&&r("error","subflow-spawn-no-child",`Subflow node "${j(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),h.length>0&&e.length>0&&r("error","subflow-spawn-and-parallel",`Subflow node "${j(a)}" combines "spawnBriefs" with "parallelSubflowIds"; spawn briefs run one sub-agent per brief and cannot be combined with a multi-flow fan-out list.`,a),h.length>0&&f&&r("error","subflow-spawn-and-map",`Subflow node "${j(a)}" combines "spawnBriefs" with "mapOverList"; use one lane source or the other.`,a);let i="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(i&&((0,g.qW)(i)||r("warning","subflow-parallel-var-name",`Subflow node "${j(a)}" reads dynamic fan-out targets from "${i}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to capture with \${var:...}.`,a),f&&r("error","subflow-map-and-parallel-var",`Subflow node "${j(a)}" combines "mapOverList" with dynamic fan-out ("parallelSubflowIdsVar"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),p.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===i})||r("warning","subflow-parallel-var-uncaptured",`Subflow node "${j(a)}" reads dynamic fan-out targets from variable "${i}", but no node captures it (captureVariable). It may be seeded by the caller; otherwise it resolves to no targets and the node falls back to its static parallel list.`,a)),!0===c.allowCallerFanout&&f&&r("error","subflow-map-and-caller-fanout",`Subflow node "${j(a)}" combines "mapOverList" with agentic fan-out ("allowCallerFanout"); map-over-list runs a single child once per item and cannot be combined with fan-out.`,a),e.length>0||h.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&r("warning","subflow-concurrency-limit",`Subflow node "${j(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(p.map(a=>[a.id,a])),b=new Set;for(let c of q){if(m(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let e=a.get(c.source),g=e?i(e):"unknown";if("process"!==g){r("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${e?j(e):c.source}" has a routing condition, but only process nodes can route on a condition.`,e??void 0);continue}b.add(c.source),(0,f.C)(d.kind)?"always"===d.kind||("string"!=typeof d.value||0===d.value.length?r("warning","edge-condition-value",`Process node "${j(e)}" has an outgoing edge condition with no "value"; it will never match.`,e):"regex"!==d.kind||(0,f.wM)(d.value)||r("warning","edge-condition-regex",`Process node "${j(e)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,e)):r("warning","edge-condition-kind",`Process node "${j(e)}" has an outgoing edge whose condition kind "${String(d.kind)}" is unknown; it will never match.`,e)}for(let c of b){let b=a.get(c);b&&(q.some(a=>!m(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||r("warning","edge-condition-no-fallback",`Process node "${j(b)}" has conditioned outgoing edges but no bare fallback edge; if no condition matches, the flow ends here.`,b))}}{let a=new Set;for(let b of p){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,g.qW)(d)||r("warning","capture-var-name",`${"subflow"===i(b)?"Subflow":"Process"} node "${j(b)}" captures into "${d}", which is not a valid variable name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${var:...}.`,b)}}let b=["promptTemplate","isolatedPrompt"],c=new Set;for(let d of p){let e=d.data?.properties??{};for(let f of b){let b=e[f];if("string"==typeof b&&b)for(let e of(0,g.T9)(b)){if(a.has(e))continue;let b=`${d.id}:${e}`;c.has(b)||(c.add(b),r("warning","var-ref-uncaptured",`${j(d)} references \${var:${e}} but no step in this flow captures "${e}" (via captureVariable). It resolves to empty unless supplied as a run input — check for a typo or a step ordered after this one.`,d))}}}}{for(let a of p){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,h.g2)(b.trim());(0,h.ng)(c)||r("warning","capture-kv-name",`${"subflow"===i(a)?"Subflow":"Process"} node "${j(a)}" captures into kv "${b.trim()}", whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it will be awkward to reference with \${kv:...}.`,a)}}let a=["promptTemplate","isolatedPrompt"],b=new Set;for(let c of p){let d=c.data?.properties??{};for(let e of a){let a=d[e];if("string"==typeof a&&a)for(let d of(0,h.pf)(a)){let{key:a}=(0,h.g2)(d);if((0,h.ng)(a))continue;let e=`${c.id}:${d}`;b.has(e)||(b.add(e),r("warning","kv-ref-name",`${j(c)} references \${kv:${d}}, whose key is not a valid name (letters, digits, _ and - only, not starting with a digit); it resolves to empty.`,c))}}}}for(let a of y){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let f=n(a.id,p,q),g=null,h=new Set;for(let k of(0,d.A$)(c)){if("handoff"===k.server){let b=`handoff:${k.name}`;if(h.has(b))continue;h.add(b),g||(g=function(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=[],g=new Set;for(let b of c){if(m(b))continue;let c=null;b.source===a?c=b.target:b.target===a&&b.data?.bidirectional&&(c=b.source),!c||g.has(c)||(g.add(c),f.push(c))}let h=f.map(a=>d.get(a)).filter(a=>!!a).map(a=>({id:a.id,label:a.data?.label,type:i(a)}));return new Set((0,e.E9)(h).values())}(a.id,p,q)),g.has(k.name)||r("warning","handoff-pill-obsolete",`Process node "${j(a)}" references handoff tool "${k.name}", which no longer exists (the target node was removed, or renamed so the tool name changed). Update or remove the pill.`,a);continue}let c=`${k.kind}:${k.server}:${k.name}`;!h.has(c)&&(h.add(c),f.has(k.server)?"tool"===k.kind&&b.serverTools&&b.serverTools[k.server]&&!b.serverTools[k.server].includes(k.name)&&r("warning","tool-unavailable",`Process node "${j(a)}" references tool "${k.name}" which server "${k.server}" no longer provides.`,a):r("error","tool-pill-disconnected",`Process node "${j(a)}" references ${k.kind} "${k.name}" from server "${k.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a))}}if(b.serverTools)for(let a of y)for(let c of n(a.id,p,q)){let d=b.serverTools[c];Array.isArray(d)&&0===d.length&&r("warning","mcp-server-no-tools",`Process node "${j(a)}" is connected to MCP server "${c}", which currently exposes 0 tools. The connection has no effect until the server provides tools.`,a)}let A=c.filter(a=>"error"===a.severity).length,B=c.length-A;return{issues:c,errorCount:A,warningCount:B,isRunnable:0===A}}},67463:(a,b,c)=>{c.d(b,{runFlow:()=>C});var d=c(18230),e=c(1604),f=c(79111),g=c(44479);let h=(0,d.h)("backend/execution/flow/persistConversationState");async function i(a,b){let c="conversations/",d=String(a).startsWith(c)?String(a).slice(c.length):String(a);return((0,f.ln)(d),null!=b.conversationId&&(0,f.ln)(b.conversationId),b.ephemeral)?(h.debug(`Refusing to persist ephemeral state (key ${a}); ephemeral runs never reach the conversations store.`),Promise.resolve()):(0,g.isConversationDeleted)(b.conversationId)?(h.info(`Refusing to persist state for deleted conversation ${b.conversationId} (key ${a}).`),Promise.resolve()):(0,f.VH)(a,{...b,executionTrace:void 0,emit:void 0})}var j=c(34115),k=c(96249),l=c(37860),m=c(26485),n=c(59057),o=c(59448),p=c(11659),q=c(86028),r=c(12763),s=c(82464),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c;try{b=await r.modelService.loadModels()}catch(a){u.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await s.mcpService.loadServerConfigs();Array.isArray(a)&&(c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){u.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}return(0,t.nC)(a,{models:b,servers:c})}async function w(a){let b=await p.flowService.getFlow(a);return b?v(b):(u.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}var x=c(85701),y=c(35796);let z=(0,d.h)("backend/execution/flow/runFlow");p.flowService.getFlowByName||(p.flowService.getFlowByName=async a=>(await p.flowService.loadFlows()).find(b=>b.name===a)||null,z.info("Added getFlowByName method directly to flowService instance."));let A=p.flowService;async function B(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await p.flowService.getFlow(e))?.name??void 0}catch{}let f="api"===a.source?"api":"chat",g=c&&c.length>4096?`${c.slice(0,4096)}…`:c;(0,l.eh)().publish({flowId:e,flowName:d,executionId:a.plannedExecutionId,runId:a.conversationId||"",conversationId:a.conversationId||"",status:b,outputText:g,firedBy:f,chainDepth:a.chainDepth??0,timestamp:new Date().toISOString()})}catch(a){z.warn("Failed to publish runFlow flow-run event:",a)}}async function C(a){let b,c,d,h=Date.now(),l=a.flujo??!0,r=a.requireApproval??!1,s=a.debug??!1,t=a.continueDebug??!1,u=a.userTurn??!1,C="ephemeral"===a.mode,D=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),E={model:a.modelName,messages:D,processNodeId:a.processNodeId};z.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:D.length,mode:C?"ephemeral":"conversation",flujo:l,requireApproval:r,flujodebug:s,conversationId:a.conversationId});let F=a.conversationId||crypto.randomUUID(),G=`conversations/${F}`,H="new",I=!1;if(z.info(`Effective Conversation ID for this run: ${F}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(F))c=e.FlowExecutor.conversationStates.get(F),z.info(`Resuming conversation ${F} from memory`,{currentNodeId:c.currentNodeId}),H="memory";else if(!C)try{(c=await (0,f.YM)(G,void 0))?(z.info(`Loaded conversation state from storage: ${F}`),H="storage",await (0,j.jM)(c),e.FlowExecutor.conversationStates.set(F,c)):z.info(`No state found in storage for conversation: ${F}. Will create new state.`)}catch(a){z.warn(`Error loading conversation state from storage for ${F}:`,a)}if(c?((b=c).conversationId!==F&&(z.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${F}). Using effectiveConvId.`),b.conversationId=F),"new"!==H&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(z.info(`Resuming completed/errored/fresh conversation ${F}. Resetting status to 'running'.`),I="error"===b.status,b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===H&&e.FlowExecutor.conversationStates.set(F,b)),E.processNodeId&&"new"!==H&&(z.info(`Edit detected: Resetting currentNodeId for conversation ${F} to provided processNodeId: ${E.processNodeId}`),b.currentNodeId=E.processNodeId,b.status="running",b.lastResponse=void 0,b.pendingToolCalls=void 0,b.handoffRequested=void 0,b.isCancelled=!1,b.trackingInfo={executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:[]},q.G.ENABLE_EXECUTION_TRACKER&&b.executionTrace&&(b.executionTrace=[]),e.FlowExecutor.conversationStates.set(F,b),z.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(z.info(`Creating new conversation state object for ID: ${F}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:F,currentNodeId:void 0,status:"running",title:a.title?.trim()||"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:s,executionTrace:s&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=r,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),C&&(b.ephemeral=!0),a.parentRunId&&(b.parentRunId=a.parentRunId,b.parentConversationId=a.parentRunId,!b.rootConversationId)){let c=e.FlowExecutor.conversationStates.get(a.parentRunId);b.rootConversationId=c?.rootConversationId??c?.conversationId??a.parentRunId}if(b.runDepth=a.depth??b.runDepth??0,b.chainDepth=a.chainDepth??b.chainDepth??0,b.onApprovalRequired=a.onApprovalRequired??b.onApprovalRequired??"auto",b.runDepth>x.A)return z.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:m.O,sharedState:b};let J=[...b.messages??[]];if("new"===H){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&E.model){let a=E.model.substring(5),d=await A.getFlowByName(a);if(!d)return z.error(`Flow not found: ${a}`),{status:"error",conversationId:F,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:m.O,sharedState:b};c=d.id}if(!c)return z.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:F,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:m.O,sharedState:b};b.flowId=c;let d=(E.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=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} during init to: ${b.title}`))}await i(G,b),z.debug(`Saved initial state for new conversation ${F}.`)}catch(a){z.error(`Failed to save initial state for new conversation ${F}:`,a)}e.FlowExecutor.conversationStates.set(F,b)}else E.messages&&E.messages.length>0&&(b.messages=E.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),z.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`)),(u||void 0===b.debugMode)&&(b.debugMode=s),u&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[]);try{await (0,j.UG)(b,J)}catch(a){z.warn(`Conversation-log reconcile failed for ${F}; continuing`,a)}if(u&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(z.info(`New user turn for ${F}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(F,b))}if(I&&u&&!C&&"new"!==H&&!E.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;if(a?.role!=="user"){let a;for(let c=b.messages.length-1;c>=0;c--)if("user"===b.messages[c].role){a=b.messages[c].processNodeId;break}if(!a&&b.flowId)try{let c=await p.flowService.getFlow(b.flowId);a=c?.nodes?.find(a=>"start"===a.type)?.id}catch(a){z.warn(`Could not resolve start node for error-resume of ${F}`,a)}a&&a!==b.currentNodeId&&(z.info(`Error-resume for ${F}: replaying turn from entry node ${a} (was ${b.currentNodeId}).`),b.currentNodeId=a,e.FlowExecutor.conversationStates.set(F,b))}}u&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),z.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${F}.`));let K=!1,L=0,M=a.emit??k.$.emitterFor(F),N=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),O=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,M({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}:{}})},P=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),N.has(a.id)||(N.add(a.id),"system"!==a.role&&(M({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),O(a)))};if(M({type:"run:start",flowId:b.flowId}),(u||"new"===H)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
|
|
2
2
|
`+c.map(a=>`• ${a.message}`).join("\n");z.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${F}`,{errorCount:c.length,codes:c.map(a=>a.code)}),b.lastResponse={success:!1,error:e,errorDetails:{message:e,type:"invalid_request_error",code:"flow_invalid",status:400}},d=m.O,K=!0}}catch(a){z.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let Q=()=>!!b.isCancelled||!!(0,g.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),R=!!b.debugMode&&!t,S=()=>{b.status="paused_debug",M({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!K)for(;;){if(L++,z.debug(`--- Starting Execution Step ${L} for Conv ${F} ---`),L>150){z.warn(`Max internal iterations (150) reached for conv ${F}. Breaking loop.`),d!==m.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=m.O);break}if(Q()){z.info(`Cancellation flag detected for conv ${F}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O;break}if(b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,z.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${F}.`);let c=await n.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!c.success){z.error(`Debug tool processing failed for conv ${F}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}let f=c.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...f),e.FlowExecutor.conversationStates.set(F,b),P();try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state after debug tool execution for conv ${F}:`,a)}if(R){z.info(`[Debug Step] Paused after tool execution for conv ${F}.`),S();break}continue}if(!R&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b);if(a&&b.breakpoints.includes(a)&&b.lastBreakNodeId!==a){z.info(`Breakpoint hit at node ${a} for conv ${F}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,M({type:"breakpoint:hit",node:{nodeId:a}}),M({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state on breakpoint for conv ${F}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);z.verbose(`Message history before step ${L}`,a)}else z.verbose(`No messages in history before step ${L}`);let a=await e.FlowExecutor.executeStep(b,M);if(b=a.sharedState,d=a.action,P(),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=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} after step ${L} to: ${b.title}`))}if(z.info(`Step ${L} completed for conv ${F}. Action: ${d}`,{currentNodeId:b.currentNodeId}),z.verbose(`Shared state after step ${L}`,b),z.debug(`[Action Handling] Step ${L}: Received action "${d}" for conv ${F}`),d===m.O){z.info(`[Action Handling] Step ${L}: Handling ERROR_ACTION for conv ${F}`),z.error(`Error action received during step ${L} for conv ${F}`,{error:b.lastResponse});break}if(d===m.g4){z.info(`[Action Handling] Step ${L}: Handling FINAL_RESPONSE_ACTION for conv ${F}`),z.info(`Final response action received at step ${L} for conv ${F}`),b.status="completed",z.info(`Setting conversation status to 'completed' for conv ${F}`);break}if(d===m.Jp){z.info(`[Action Handling] Step ${L}: Handling TOOL_CALL_ACTION for conv ${F}`),z.info(`Tool call action received at step ${L} for conv ${F}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(l){if(r&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";z.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${F})`),b.status="error",b.pendingToolCalls=a.tool_calls,b.lastResponse={success:!1,error:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,errorDetails:{message:`Headless run requires approval for tool "${e}" but no approver is available (approvalPolicy: fail).`,type:"approval_required",name:e}},d=m.O;break}if(r){z.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${F}`),b.status="awaiting_tool_approval",b.pendingToolCalls=a.tool_calls,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(F,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=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} before pausing to: ${b.title}`))}await i(G,b),z.verbose(`Saved state before pausing for approval for conv ${F}`)}catch(a){z.error(`Failed to save state before pausing for approval for conv ${F}:`,a)}M({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if(R){z.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${F}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(F,b);try{b.updatedAt=Date.now(),await i(G,b)}catch(a){z.error(`Failed to save state before debug tool pause for conv ${F}:`,a)}S();break}{z.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${F}`);let c=await n.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!c.success){z.error(`Internal tool processing failed for conv ${F}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=m.O;break}z.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${F}`);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(F,b),P(),z.info(`Continuing loop for conv ${F} after internal tool processing (no approval needed).`);continue}}else{z.info(`[flujo=false] Tool call action received for conv ${F}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,o.$9)(a.function.name,b.toolNameMap)?(z.verbose("tool is internal:",a.function.name),f.push(a)):(z.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){z.info(`[flujo=false] Processing ${f.length} internal tools for conv ${F}. External tools (${g.length}) will be ignored this step.`);let a=await n.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:M,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Q});if(!a.success){z.error(`[flujo=false] Internal tool processing failed for conv ${F}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=m.O;break}z.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${F}`);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(F,b),z.info(`Continuing loop for conv ${F} after internal tool processing (flujo=false).`);continue}if(g.length>0){z.info(`[flujo=false] Found ${g.length} external tools for conv ${F}. 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+=`
|
|
3
3
|
<${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
|
|
4
4
|
</${b.function.name}>`)}catch(c){z.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:F}),a.push(`<${b.function.name}>
|
|
5
5
|
<error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
|
|
6
|
-
</${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=m.g4,z.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${F}.`);break}z.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${F} but no tools found after classification. Treating as final.`),d=m.g4;break}z.warn(`TOOL_CALL_ACTION received for conv ${F} but no tool_calls found in last message. Treating as final.`),d=m.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){z.info(`[Action Handling] Step ${L}: Handling Handoff Action (Edge ID) for conv ${F}`),z.info(`Handoff action received for conv ${F}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c=b.messages.length>0?b.messages[b.messages.length-1]:null;if(c?.role==="assistant"&&c.tool_calls){let e,f,g=c.tool_calls.filter(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_"))),h=a=>b.handoffNameMap?.[a]||a.replace("handoff_to_",""),i=g.filter(b=>"function"===b.type&&h(b.function.name)===a),j=i.length>0?i:g.slice(0,1);0===j.length&&z.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`);let k=[],l="";for(let c of(j.forEach((c,g)=>{if("function"===c.type)try{let a=JSON.parse(c.function.arguments||"{}"),b="string"==typeof a?.task?a.task.trim():"",d="string"==typeof a?.prompt?a.prompt.trim():"",g=b||(j.length>1?d:"");if(g&&k.push(g),!l&&d&&(l=d),!e&&Array.isArray(a?.parallelFlows)){let b=a.parallelFlows.filter(a=>"string"==typeof a&&""!==a.trim());b.length>0&&(e=b)}let h=a?.concurrencyLimit;void 0===f&&"number"==typeof h&&h>=1&&(f=Math.floor(h))}catch(a){z.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller input for this call`,{parseError:a})}b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Handoff processed",targetNodeId:a,...j.length>1?{lane:g+1,laneCount:j.length}:{}}),timestamp:Date.now(),processNodeId:b.currentNodeId})}),g))j.includes(c)||(b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Not executed",reason:"A different handoff was chosen this turn."}),timestamp:Date.now(),processNodeId:b.currentNodeId}),z.warn(`Handoff call ${"function"===c.type?c.function.name:c.id} targeted a different node than the chosen route; answered as not executed.`));if(l||1!==k.length||(l=k[0]),l||k.length>0||e&&e.length>0)b.handoffInput={targetNodeId:a,prompt:l,...k.length>0?{tasks:k}:{},...e&&e.length>0?{parallelFlows:e}:{},...void 0!==f?{concurrencyLimit:f}:{}},z.info(`Captured caller handoff input for node ${a}`,{promptChars:l.length,spawnBriefs:k.length,fanoutCount:e?.length??0});else try{let c=await p.flowService.getFlow(b.flowId),d=c?.nodes?.find(b=>b.id===a),e=d?.data?.properties;d?.type!=="subflow"||e?.inputMode!=="isolated"||e?.allowCallerPrompt
|
|
6
|
+
</${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=m.g4,z.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${F}.`);break}z.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${F} but no tools found after classification. Treating as final.`),d=m.g4;break}z.warn(`TOOL_CALL_ACTION received for conv ${F} but no tool_calls found in last message. Treating as final.`),d=m.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){z.info(`[Action Handling] Step ${L}: Handling Handoff Action (Edge ID) for conv ${F}`),z.info(`Handoff action received for conv ${F}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){let c=b.messages.length>0?b.messages[b.messages.length-1]:null;if(c?.role==="assistant"&&c.tool_calls){let e,f,g=c.tool_calls.filter(a=>"function"===a.type&&("handoff"===a.function.name||a.function.name.startsWith("handoff_to_"))),h=a=>b.handoffNameMap?.[a]||a.replace("handoff_to_",""),i=g.filter(b=>"function"===b.type&&h(b.function.name)===a),j=i.length>0?i:g.slice(0,1);0===j.length&&z.warn(`Handoff action received for edge ${d}, but could not find corresponding handoff tool call in last assistant message.`);let k=[],l="";for(let c of(j.forEach((c,g)=>{if("function"===c.type)try{let a=JSON.parse(c.function.arguments||"{}"),b="string"==typeof a?.task?a.task.trim():"",d="string"==typeof a?.prompt?a.prompt.trim():"",g=b||(j.length>1?d:"");if(g&&k.push(g),!l&&d&&(l=d),!e&&Array.isArray(a?.parallelFlows)){let b=a.parallelFlows.filter(a=>"string"==typeof a&&""!==a.trim());b.length>0&&(e=b)}let h=a?.concurrencyLimit;void 0===f&&"number"==typeof h&&h>=1&&(f=Math.floor(h))}catch(a){z.warn(`Could not parse handoff tool-call arguments for edge ${d}; ignoring caller input for this call`,{parseError:a})}b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Handoff processed",targetNodeId:a,...j.length>1?{lane:g+1,laneCount:j.length}:{}}),timestamp:Date.now(),processNodeId:b.currentNodeId})}),g))j.includes(c)||(b.messages.push({id:crypto.randomUUID(),role:"tool",tool_call_id:c.id,content:JSON.stringify({status:"Not executed",reason:"A different handoff was chosen this turn."}),timestamp:Date.now(),processNodeId:b.currentNodeId}),z.warn(`Handoff call ${"function"===c.type?c.function.name:c.id} targeted a different node than the chosen route; answered as not executed.`));if(l||1!==k.length||(l=k[0]),l||k.length>0||e&&e.length>0)b.handoffInput={targetNodeId:a,prompt:l,...k.length>0?{tasks:k}:{},...e&&e.length>0?{parallelFlows:e}:{},...void 0!==f?{concurrencyLimit:f}:{}},z.info(`Captured caller handoff input for node ${a}`,{promptChars:l.length,spawnBriefs:k.length,fanoutCount:e?.length??0});else try{let c=await p.flowService.getFlow(b.flowId),d=c?.nodes?.find(b=>b.id===a),e=d?.data?.properties;d?.type!=="subflow"||e?.inputMode!=="isolated"||e?.allowCallerPrompt===!1||e?.allowCallerFanout===!0||e?.promptTemplate?.trim()||z.warn(`Handoff to isolated subflow node ${a} has neither a caller-supplied prompt nor an authored promptTemplate; the subflow will start with an empty prompt and may stall. The routing model should have supplied the required "prompt" argument (issue #169).`,{targetNodeId:a})}catch(a){z.debug("Issue #169 empty-prompt handoff guard check failed (non-fatal)",{guardErr:a})}}else z.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);P();let f=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,M({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:a,edgeId:d}),z.info(`Transitioning conv ${F} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(F,b),R){z.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${F}.`),S();break}z.info(`Continuing loop for conv ${F} after handoff.`);continue}z.error(`Handoff failed for conv ${F}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=m.O;break}if(d===m.E5){z.info(`[Action Handling] Step ${L}: Handling STAY_ON_NODE_ACTION for conv ${F}`),z.info(`Stay on node action received for conv ${F} at step ${L}`);break}z.warn(`Unrecognized action '${d}' received at step ${L} for conv ${F}. Treating as final response.`),d=m.g4;break}}catch(a){if(z.error(`Unhandled error during execution loop for conv ${F}`,{loopError:a}),d!==m.O&&Q()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d!==m.O){let c=a?.details;b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a),errorDetails:a instanceof Error?{name:a.name,message:a.message,stack:a.stack,...c&&"object"==typeof c?c:{}}:void 0},d=m.O}}d!==m.O&&Q()&&(z.info(`Cancellation flag set at run end for conv ${F}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=m.O),d===m.O&&"error"!==b.status&&(b.status="error");let T=Date.now()-h,U=b.status||(d===m.g4?"completed":d===m.O?"error":"running");if(z.info(`Execution finished for conv ${F}. Final Action: ${d}, Final Status: ${U}`,{duration:`${T}ms`}),P(),("completed"===U||"error"===U)&&(M({type:"run:done",status:U}),"schedule"!==b.source&&(b.runDepth??0)===0)){let a=b.messages[b.messages.length-1],c=a&&"assistant"===a.role&&"string"==typeof a.content?a.content:void 0;B(b,U,c)}try{if(b.updatedAt=Date.now(),"New Conversation"===b.title&&b.messages.length>0){let a=b.messages.find(a=>"user"===a.role);a&&"string"==typeof a.content&&(b.title=(0,y.oO)(a.content),z.verbose(`Updated conversation title for ${F} before final return to: ${b.title}`))}await i(G,b),z.debug(`Saved final state for conversation ${F} before returning.`)}catch(a){z.error(`Failed to save final state for conversation ${F}:`,a)}(0,g.isConversationDeleted)(F)?e.FlowExecutor.conversationStates.delete(F):e.FlowExecutor.conversationStates.set(F,b);let V=()=>{C&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(F)},W={conversationId:b.conversationId||F,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return z.info(`Returning paused debug state for conv ${F}`),{...W,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===m.O){let a,c="Unknown error during execution",d=500;if("object"==typeof b.lastResponse&&null!==b.lastResponse)if("success"in b.lastResponse&&!1===b.lastResponse.success&&"error"in b.lastResponse&&"string"==typeof b.lastResponse.error){if(c=b.lastResponse.error,"errorDetails"in b.lastResponse&&"object"==typeof b.lastResponse.errorDetails&&null!==b.lastResponse.errorDetails){let e=b.lastResponse.errorDetails;(a={message:"string"==typeof e.message?e.message:c,type:"string"==typeof e.type?e.type:void 0,code:"string"==typeof e.code?e.code:void 0,param:"string"==typeof e.param?e.param:void 0,status:"number"==typeof e.status?e.status:void 0,stack:"string"==typeof e.stack?e.stack:void 0,name:"string"==typeof e.name?e.name:void 0}).status&&(d=a.status)}}else try{c=`Unexpected error state object: ${JSON.stringify(b.lastResponse)}`}catch{c="Unexpected error state object (unserializable)"}else"string"==typeof b.lastResponse&&(c=b.lastResponse);return a?a.message=a.message||c:a={message:c},z.error(`Returning error result for conv ${F}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),V(),{...W,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let X=b.messages.length>0?b.messages[b.messages.length-1]:null,Y="",Z="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(Z=b.lastResponse._flujo_xml_tools,Y=X?.role==="assistant"&&"string"==typeof X.content?X.content:"",Y+=(Y?"\n\n":"")+Z,b.lastResponse=Y):Y="string"==typeof b.lastResponse?b.lastResponse:X?.role==="assistant"&&"string"==typeof X.content?X.content:d!==m.Jp||l?"Processing complete.":"";let $=Z?void 0:X?.role==="assistant"?X.tool_calls:void 0;return z.info(`Returning success result for conv ${F}`,{action:d,status:b.status,flujo:l,requireApproval:r,flujodebug:s}),V(),{...W,status:b.status||(d===m.g4?"completed":"running"),outputText:Y,toolCalls:$,pendingToolCalls:b.pendingToolCalls}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=7485,exports.ids=[7485],exports.modules={67191:(a,b,c)=>{c.d(b,{A:()=>x});var d=c(38301),e=c(43249),f=c(2783),g=c(37489),h=c(6638),i=c(54716),j=c(99515),k=c(18168),l=c(68333),m=c(6636),n=c(29565),o=c(33105);function p(a){return(0,o.Ay)("MuiSwitch",a)}let q=(0,n.A)("MuiSwitch",["root","edgeStart","edgeEnd","switchBase","colorPrimary","colorSecondary","sizeSmall","sizeMedium","checked","disabled","input","thumb","track"]);var r=c(20385),s=c(21124);let t=(0,k.Ay)("span",{name:"MuiSwitch",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,c.edge&&b[`edge${(0,h.A)(c.edge)}`],b[`size${(0,h.A)(c.size)}`]]}})({display:"inline-flex",width:58,height:38,overflow:"hidden",padding:12,boxSizing:"border-box",position:"relative",flexShrink:0,zIndex:0,verticalAlign:"middle","@media print":{colorAdjust:"exact"},variants:[{props:{edge:"start"},style:{marginLeft:-8}},{props:{edge:"end"},style:{marginRight:-8}},{props:{size:"small"},style:{width:40,height:24,padding:7,[`& .${q.thumb}`]:{width:16,height:16},[`& .${q.switchBase}`]:{padding:4,[`&.${q.checked}`]:{transform:"translateX(16px)"}}}}]}),u=(0,k.Ay)(j.A,{name:"MuiSwitch",slot:"SwitchBase",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.switchBase,{[`& .${q.input}`]:b.input},"default"!==c.color&&b[`color${(0,h.A)(c.color)}`]]}})((0,l.A)(({theme:a})=>({position:"absolute",top:0,left:0,zIndex:1,color:a.vars?a.vars.palette.Switch.defaultColor:`${"light"===a.palette.mode?a.palette.common.white:a.palette.grey[300]}`,transition:a.transitions.create(["left","transform"],{duration:a.transitions.duration.shortest}),[`&.${q.checked}`]:{transform:"translateX(20px)"},[`&.${q.disabled}`]:{color:a.vars?a.vars.palette.Switch.defaultDisabledColor:`${"light"===a.palette.mode?a.palette.grey[100]:a.palette.grey[600]}`},[`&.${q.checked} + .${q.track}`]:{opacity:.5},[`&.${q.disabled} + .${q.track}`]:{opacity:a.vars?a.vars.opacity.switchTrackDisabled:`${"light"===a.palette.mode?.12:.2}`},[`& .${q.input}`]:{left:"-100%",width:"300%"}})),(0,l.A)(({theme:a})=>({"&:hover":{backgroundColor:a.vars?`rgba(${a.vars.palette.action.activeChannel} / ${a.vars.palette.action.hoverOpacity})`:(0,g.X4)(a.palette.action.active,a.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},variants:[...Object.entries(a.palette).filter((0,i.A)(["light"])).map(([b])=>({props:{color:b},style:{[`&.${q.checked}`]:{color:(a.vars||a).palette[b].main,"&:hover":{backgroundColor:a.vars?`rgba(${a.vars.palette[b].mainChannel} / ${a.vars.palette.action.hoverOpacity})`:(0,g.X4)(a.palette[b].main,a.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},[`&.${q.disabled}`]:{color:a.vars?a.vars.palette.Switch[`${b}DisabledColor`]:`${"light"===a.palette.mode?(0,g.a)(a.palette[b].main,.62):(0,g.e$)(a.palette[b].main,.55)}`}},[`&.${q.checked} + .${q.track}`]:{backgroundColor:(a.vars||a).palette[b].main}}}))]}))),v=(0,k.Ay)("span",{name:"MuiSwitch",slot:"Track",overridesResolver:(a,b)=>b.track})((0,l.A)(({theme:a})=>({height:"100%",width:"100%",borderRadius:7,zIndex:-1,transition:a.transitions.create(["opacity","background-color"],{duration:a.transitions.duration.shortest}),backgroundColor:a.vars?a.vars.palette.common.onBackground:`${"light"===a.palette.mode?a.palette.common.black:a.palette.common.white}`,opacity:a.vars?a.vars.opacity.switchTrack:`${"light"===a.palette.mode?.38:.3}`}))),w=(0,k.Ay)("span",{name:"MuiSwitch",slot:"Thumb",overridesResolver:(a,b)=>b.thumb})((0,l.A)(({theme:a})=>({boxShadow:(a.vars||a).shadows[1],backgroundColor:"currentColor",width:20,height:20,borderRadius:"50%"}))),x=d.forwardRef(function(a,b){let c=(0,m.b)({props:a,name:"MuiSwitch"}),{className:d,color:g="primary",edge:i=!1,size:j="medium",sx:k,slots:l={},slotProps:n={},...o}=c,q={...c,color:g,edge:i,size:j},x=(a=>{let{classes:b,edge:c,size:d,color:e,checked:g,disabled:i}=a,j={root:["root",c&&`edge${(0,h.A)(c)}`,`size${(0,h.A)(d)}`],switchBase:["switchBase",`color${(0,h.A)(e)}`,g&&"checked",i&&"disabled"],thumb:["thumb"],track:["track"],input:["input"]},k=(0,f.A)(j,p,b);return{...b,...k}})(q),y={slots:l,slotProps:n},[z,A]=(0,r.A)("root",{className:(0,e.A)(x.root,d),elementType:t,externalForwardedProps:y,ownerState:q,additionalProps:{sx:k}}),[B,C]=(0,r.A)("thumb",{className:x.thumb,elementType:w,externalForwardedProps:y,ownerState:q}),D=(0,s.jsx)(B,{...C}),[E,F]=(0,r.A)("track",{className:x.track,elementType:v,externalForwardedProps:y,ownerState:q});return(0,s.jsxs)(z,{...A,children:[(0,s.jsx)(u,{type:"checkbox",icon:D,checkedIcon:D,ref:b,ownerState:q,...o,classes:{...x,root:x.switchBase},slots:{...l.switchBase&&{root:l.switchBase},...l.input&&{input:l.input}},slotProps:{...n.switchBase&&{root:"function"==typeof n.switchBase?n.switchBase(q):n.switchBase},...n.input&&{input:"function"==typeof n.input?n.input(q):n.input}}}),(0,s.jsx)(E,{...F})]})})},95587:(a,b,c)=>{c.d(b,{A:()=>v});var d=c(38301),e=c(43249),f=c(2783),g=c(49628),h=c(18168),i=c(68333),j=c(6636),k=c(79515),l=c(6638),m=c(29565),n=c(33105);function o(a){return(0,n.Ay)("MuiFormControlLabel",a)}let p=(0,m.A)("MuiFormControlLabel",["root","labelPlacementStart","labelPlacementTop","labelPlacementBottom","disabled","label","error","required","asterisk"]);var q=c(83738),r=c(20385),s=c(21124);let t=(0,h.Ay)("label",{name:"MuiFormControlLabel",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[{[`& .${p.label}`]:b.label},b.root,b[`labelPlacement${(0,l.A)(c.labelPlacement)}`]]}})((0,i.A)(({theme:a})=>({display:"inline-flex",alignItems:"center",cursor:"pointer",verticalAlign:"middle",WebkitTapHighlightColor:"transparent",marginLeft:-11,marginRight:16,[`&.${p.disabled}`]:{cursor:"default"},[`& .${p.label}`]:{[`&.${p.disabled}`]:{color:(a.vars||a).palette.text.disabled}},variants:[{props:{labelPlacement:"start"},style:{flexDirection:"row-reverse",marginRight:-11}},{props:{labelPlacement:"top"},style:{flexDirection:"column-reverse"}},{props:{labelPlacement:"bottom"},style:{flexDirection:"column"}},{props:({labelPlacement:a})=>"start"===a||"top"===a||"bottom"===a,style:{marginLeft:16}}]}))),u=(0,h.Ay)("span",{name:"MuiFormControlLabel",slot:"Asterisk",overridesResolver:(a,b)=>b.asterisk})((0,i.A)(({theme:a})=>({[`&.${p.error}`]:{color:(a.vars||a).palette.error.main}}))),v=d.forwardRef(function(a,b){let c=(0,j.b)({props:a,name:"MuiFormControlLabel"}),{checked:h,className:i,componentsProps:m={},control:n,disabled:p,disableTypography:v,inputRef:w,label:x,labelPlacement:y="end",name:z,onChange:A,required:B,slots:C={},slotProps:D={},value:E,...F}=c,G=(0,g.A)(),H=p??n.props.disabled??G?.disabled,I=B??n.props.required,J={disabled:H,required:I};["checked","name","onChange","value","inputRef"].forEach(a=>{void 0===n.props[a]&&void 0!==c[a]&&(J[a]=c[a])});let K=(0,q.A)({props:c,muiFormControl:G,states:["error"]}),L={...c,disabled:H,labelPlacement:y,required:I,error:K.error},M=(a=>{let{classes:b,disabled:c,labelPlacement:d,error:e,required:g}=a,h={root:["root",c&&"disabled",`labelPlacement${(0,l.A)(d)}`,e&&"error",g&&"required"],label:["label",c&&"disabled"],asterisk:["asterisk",e&&"error"]};return(0,f.A)(h,o,b)})(L),N={slots:C,slotProps:{...m,...D}},[O,P]=(0,r.A)("typography",{elementType:k.default,externalForwardedProps:N,ownerState:L}),Q=x;return null==Q||Q.type===k.default||v||(Q=(0,s.jsx)(O,{component:"span",...P,className:(0,e.A)(M.label,P?.className),children:Q})),(0,s.jsxs)(t,{className:(0,e.A)(M.root,i),ownerState:L,ref:b,...F,children:[d.cloneElement(n,J),I?(0,s.jsxs)("div",{children:[Q,(0,s.jsxs)(u,{ownerState:L,"aria-hidden":!0,className:M.asterisk,children:[" ","*"]})]}):Q]})})}};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";exports.id=7498,exports.ids=[1925,4306,7498],exports.modules={1925:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},5248:(a,b,c)=>{c.d(b,{P:()=>m,p:()=>k});var d=c(32524),e=c(81226);function f(a){return!!a&&a.includes("mcp")}function g(a){return!!a&&a.includes("resource")}let h=a=>({source:`${a}-bottom`,target:`${a}-top`});function i(a,b){let c=a.filter(a=>"mcp"!==a.type&&"resource"!==a.type&&"string"==typeof a.id),d=new Map(c.map(a=>[a.id,a])),e=new Map,i=new Map,j=new Set;for(let a of c)e.set(a.id,0),i.set(a.id,0);let k=(a,b)=>{j.add(`${a}->${b}`),i.set(a,(i.get(a)??0)+1),e.set(b,(e.get(b)??0)+1)};for(let a of b)d.has(a.from)&&d.has(a.to)&&a.from!==a.to&&(k(a.from,a.to),a.bidirectional&&k(a.to,a.from));let l=[];for(let a of[...c].sort((a,b)=>a.y-b.y||a.x-b.x)){let b=l[l.length-1];b&&70>=Math.abs(a.y-b[0].y)?b.push(a):l.push([a])}let m=new Map;l.forEach((a,b)=>a.forEach(a=>m.set(a.id,b)));let n=new Map;for(let a=1;a<l.length;a++){let b=l[a],c=b.filter(a=>"subflow"===a.type);if(c.length>=2&&c.length===b.length){let b=l[a-1];if(1===b.length&&"process"===b[0].type)for(let a of c)n.set(a.id,b[0].id)}}let o=[],p=(a,b)=>{if(a===b||j.has(`${a}->${b}`))return!1;let c=d.get(a),e=d.get(b);return!(!c||!e||null!==function(a,b,c,d){if("start"===c)return"Start nodes cannot have incoming connections";if("finish"===a)return"Finish nodes cannot have outgoing connections";if("mcp"===a||"mcp"===c||f(b)||f(d))return("mcp"!==a||"process"!==c)&&("process"!==a||"mcp"!==c)?"MCP connections must link an MCP node to a Process node via MCP handles":"process"!==a||f(b)?null:"Connect MCP nodes from the Process node's left/right MCP handles";if("resource"===a||"resource"===c||g(b)||g(d)){if(("resource"!==a||"process"!==c)&&("process"!==a||"resource"!==c))return"Resource connections must link a Resource node to a Process node via resource handles";if("process"===a&&!g(b))return"Connect Resource nodes from the Process node's left/right resource handles"}return null}(c.type,h(c.type).source,e.type,h(e.type).target)||"subflow"===c.type&&(i.get(a)??0)>=1)},q=(a,b,c,d)=>{o.push({from:a,to:b,bidirectional:c,reason:d}),k(a,b),c&&k(b,a)},r=a=>{let b=m.get(a.id)??0;for(let c=b-1;c>=0;c--){let b=l[c].filter(b=>b.id!==a.id&&"finish"!==b.type&&!n.has(b.id));if(0!==b.length){if(1===b.length)return b[0];return b.reduce((b,c)=>Math.abs(c.x-a.x)<Math.abs(b.x-a.x)?c:b)}}return null};for(let a of l)for(let b of a){if("start"===b.type||(e.get(b.id)??0)>0)continue;let a=n.get(b.id);if(a){p(a,b.id)&&q(a,b.id,!0,"auto-bidirectional-subflow");continue}let c=r(b);c&&p(c.id,b.id)&&q(c.id,b.id,!1,"auto-connected")}let s=c.filter(a=>"start"===a.type),t=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(e.get(a.id)??0)===0),u=null;if(0===s.length){let a=t();if(a.length>0)u={targets:a.map(a=>a.id)};else{let a=c.filter(a=>"finish"!==a.type).sort((a,b)=>a.y-b.y)[0];a&&(u={targets:[a.id]})}}else{let a=s[0];for(let b of t())p(a.id,b.id)&&q(a.id,b.id,!1,"auto-connected")}let v=c.filter(a=>"finish"===a.type),w=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(i.get(a.id)??0)===0),x=null;if(0===v.length){let a=w();a.length>0&&(x={sources:a.map(a=>a.id)})}else{let a=v[0];for(let b of w())p(b.id,a.id)&&q(b.id,a.id,!1,"auto-connected")}return{addEdges:o,addStart:u,addFinish:x}}function j(a,b){if(!b.has(a))return a;for(let c=2;;c++){let d=`${a}_${c}`;if(!b.has(d))return d}}function k(a){let b=[];return{spec:function a(b,c){let d=Array.isArray(b?.nodes)?b.nodes.map(a=>({...a})):[],e=Array.isArray(b?.edges)?b.edges.map(a=>({...a})):[];for(let b of d)b?.type==="subflow"&&b.subflowSpec&&(b.subflowSpec=a(b.subflowSpec,c));let f=d.filter(a=>a&&"string"==typeof a.key&&!!a.key&&"mcp"!==a.type);if(0===f.length)return{...b,nodes:d,edges:e};let g=i(f.map((a,b)=>({id:a.key,type:a.type,x:0,y:1e3*b})),e.filter(a=>a&&"string"==typeof a.from&&"string"==typeof a.to).map(a=>({from:a.from,to:a.to,bidirectional:!0===a.bidirectional})));for(let a of g.addEdges)e.push({from:a.from,to:a.to,...a.bidirectional?{bidirectional:!0}:{}}),c.push({code:a.reason,message:n(a.reason),nodeId:a.to});let h=new Set(d.map(a=>a.key).filter(Boolean));if(g.addStart){let a=j("start",h);for(let b of(h.add(a),d.unshift({key:a,type:"start"}),g.addStart.targets))e.push({from:a,to:b});c.push({code:"auto-added-start",message:`Added a Start node connected to ${g.addStart.targets.length} entry step(s).`})}if(g.addFinish){let a=j("finish",h);for(let b of(h.add(a),d.push({key:a,type:"finish"}),g.addFinish.sources))e.push({from:b,to:a});c.push({code:"auto-added-finish",message:`Added a Finish node connected from ${g.addFinish.sources.length} final step(s).`})}return{...b,nodes:d,edges:e}}(a,b),changes:b}}function l(a){return a.data?.type??a.type??"unknown"}function m(a){var b,c;let f=(a?.nodes??[]).map(a=>({...a,position:{...a.position??{x:0,y:0}},data:{...a.data}})),g=[...a?.edges??[]],h={...a,nodes:f,edges:g},j=[],k=i(f.filter(a=>"mcp"!==l(a)&&"resource"!==l(a)).map(a=>({id:a.id,type:l(a),x:a.position?.x??0,y:a.position?.y??0})),g.filter(a=>!function(a){let b=a.data?.edgeType;return"mcp"===b||"resource"===b}(a)).map(a=>({from:a.source,to:a.target,bidirectional:a.data?.bidirectional===!0}))),m=new Map(f.map(a=>[a.id,a])),o=(a,b,c)=>{let d=m.get(a),f=m.get(b);d&&f&&g.push((0,e.pX)(d,f,c))};for(let a of k.addEdges)o(a.from,a.to,a.bidirectional),j.push({code:a.reason,message:n(a.reason),nodeId:a.to});if(k.addStart){let a=k.addStart.targets.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y<a.position.y?b:a,null),c=(b={x:a?.position.x??250,y:(a?.position.y??150)-150},{id:(0,d.A)(),type:"start",position:b,data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}});for(let a of(f.unshift(c),m.set(c.id,c),k.addStart.targets))o(c.id,a,!1);j.push({code:"auto-added-start",message:`Added a Start node connected to ${k.addStart.targets.length} entry step(s).`,nodeId:c.id})}if(k.addFinish){let a=k.addFinish.sources.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y>a.position.y?b:a,null),b=(c={x:a?.position.x??250,y:(a?.position.y??0)+150},{id:(0,d.A)(),type:"finish",position:c,data:{label:"Finish Node",type:"finish",properties:{}}});for(let a of(f.push(b),m.set(b.id,b),k.addFinish.sources))o(a,b.id,!1);j.push({code:"auto-added-finish",message:`Added a Finish node connected from ${k.addFinish.sources.length} final step(s).`,nodeId:b.id})}return{flow:h,changes:j}}function n(a){switch(a){case"auto-connected":return"Connected a disconnected step into the flow.";case"auto-bidirectional-subflow":return"Wired a parallel subflow with a two-way handoff to its orchestrator.";case"auto-added-start":return"Added a Start node.";case"auto-added-finish":return"Added a Finish node."}}},23310:(a,b,c)=>{c.d(b,{GN:()=>w,UC:()=>y,Xg:()=>x});var d=c(50846),e=c(20433),f=c(87182),g=c(54042),h=c(81226),i=c(84671),j=c(5248),k=c(88185),l=c(14265),m=c(1905),n=c(33233),o=c(9312);let p=(0,d.h)("backend/services/flow/generateFlow");function q(a,b,c,d){let e=c?`MULTI-LEVEL FLOWS — you MAY design subflows that are themselves brand-new flows:
|
|
2
|
+
- A subflow node normally references an EXISTING flow via "flow". To instead create a NEW child flow, use ONE of these on the subflow node (not "flow"):
|
|
3
|
+
- "subflowSpec": an inline nested FlowSpec (you author the whole child now), or
|
|
4
|
+
- "generateSubflow": a short natural-language description of the child — FLUJO will generate that child flow for you.
|
|
5
|
+
- Nest only when a self-contained sub-task genuinely deserves its own flow. Nesting is bounded: at most ${d} level(s) deep and ${h.lk} flows total. Keep it minimal.`:`SUBFLOWS: a subflow node's "flow" must reference an EXISTING flow (by name or id). Do NOT use "subflowSpec" or "generateSubflow" — multi-level generation is off for this run.`,f=b?`CAPABILITY ACQUISITION — you are allowed to EXPAND this FLUJO instance:
|
|
6
|
+
- If the task needs a capability none of the configured servers provides (voice, vision, browsing, email, code execution, …), use search_mcp_marketplace to find a server for it, then install_mcp_server to install the best match. Prefer servers that need no API keys (empty requiredEnv); if the best option needs keys, install a keyless alternative or note the requirement in the flow description.
|
|
7
|
+
- After a successful install, reference the returned server name in a process node's "servers" list and enable the tools it reported.
|
|
8
|
+
- Be ambitious: an actual capability (real audio, real browsing, real files) beats a text approximation. Search with several short terms ("voice", "tts", "speech") — the registry matches server NAMES only.`:`CAPABILITY DISCOVERY — you may search but NOT install:
|
|
9
|
+
- If the task needs a capability none of the configured servers provides, you may use search_mcp_marketplace to see what exists. Do NOT reference unconfigured servers in the spec; instead mention the recommended server (its registry name) in the flow "description" so the user can install it.`;return`You design workflows for FLUJO, an MCP-first workflow builder. The user describes what they want; you emit a flow specification as JSON.
|
|
10
|
+
|
|
11
|
+
OUTPUT FORMAT — when you are done (after any tool use), respond with ONLY one JSON object, no prose, no code fences.
|
|
12
|
+
|
|
13
|
+
${k.R}
|
|
14
|
+
|
|
15
|
+
GENERATED-FLOW DEFAULTS (context saving): process nodes you leave without an explicit inputMode/outputMode are compiled with inputMode "latest-message" and outputMode "latest-message" — each step sees only the current task and later steps see only its final response, not its tool calls/results. When a step genuinely needs the whole conversation or later steps need its intermediate work, set "full-history" / "full-conversation" explicitly.
|
|
16
|
+
|
|
17
|
+
${f}
|
|
18
|
+
|
|
19
|
+
${e}
|
|
20
|
+
|
|
21
|
+
${a}`}function r(a){return a.map(a=>`- [${a.severity}] ${a.message}`).join("\n")}function s(a){let b=[{type:"function",function:{name:"search_mcp_marketplace",description:'Search the public MCP server registry. The registry matches the query against server NAMES only (substring), so use short single terms ("voice", "tts", "browser") and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it requires.',parameters:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}}}];return a&&b.push({type:"function",function:{name:"install_mcp_server",description:"Install an MCP server from the registry (by the exact name returned by search) and connect it. Returns the server name to reference in the spec and the tools it provides — or needsEnv when required keys are missing (then pick an alternative or note it for the user). Installing can take a while (package download).",parameters:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'}},required:["name"]}}}),b}async function t(a,b,c,d){if("search_mcp_marketplace"===a){let a="string"==typeof b.query?b.query:"";try{return await (0,l.e3)(a)}catch(a){return{error:`Registry search failed: ${a instanceof Error?a.message:String(a)}`}}}if("install_mcp_server"===a){if(!c)return{error:"Installing is not allowed in this generation (allowInstall is off)."};let a="string"==typeof b.name?b.name:"",e=await (0,l.aM)(a,void 0,{resolveOnly:!0}),f=await (0,m.Ej)(),g=(0,n.e5)({caller:"generator",settings:f,registryName:a,allowInstall:c});e.plan&&await (0,m.NB)((0,n.UM)(e.plan,"generator",g,!1));let h=await (0,l.aM)(a);return h.plan&&await (0,m.NB)((0,n.UM)(h.plan,"generator",g,h.installed,h.error)),h.installed&&h.serverName&&(d.contextDirty=!0,d.installedServers.push({name:h.serverName,tools:(h.tools??[]).map(a=>a.name),...h.alreadyExisted?{alreadyExisted:!0}:{},...h.plan?.command?{command:h.plan.command}:{},...h.plan?.args?{args:h.plan.args}:{},...h.plan?.verificationStatus?{verificationStatus:h.plan.verificationStatus}:{}})),h}return{error:`Unknown tool: ${a}`}}async function u(a,b,c,d,e,f,h){let i={};for(let a of e){if("function"!==a.type)continue;let b=a.function.name;i[b]=a=>t(b,a,f,h)}for(let j=0;j<=8;j++){let k=e.length>0&&j<8,{completion:l}=await a.createCompletion({model:b,apiKey:c,messages:d,temperature:0,maxTokens:(0,g.normalizeMaxTokens)(b.maxTokens),...k?{tools:e,localToolExecutors:i}:{}}),m=l.choices?.[0]?.message,n=m?.tool_calls??[];if(0===n.length)return"string"==typeof m?.content?m.content:"";for(let a of(d.push({role:"assistant",content:m?.content??null,tool_calls:n}),n)){if("function"!==a.type)continue;let b={};try{b=JSON.parse(a.function.arguments||"{}")}catch{}p.info(`Generator tool call: ${a.function.name}(${a.function.arguments})`);let c=await t(a.function.name,b,f,h);d.push({role:"tool",tool_call_id:a.id,content:JSON.stringify(c)})}7===j&&d.push({role:"user",content:"Tool budget exhausted. Emit the COMPLETE flow specification now as a single JSON object using what you have."})}return""}function v(a){let b=a.indexOf("{");if(-1===b)return null;let c=0,d=!1,e=!1;for(let f=b;f<a.length;f++){let g=a[f];if(d){e?e=!1:"\\"===g?e=!0:'"'===g&&(d=!1);continue}if('"'===g)d=!0;else if("{"===g)c++;else if("}"===g&&0==--c)try{return JSON.parse(a.slice(b,f+1))}catch{break}}return null}async function w(a){var b;let c="string"==typeof a?.description?a.description.trim():"";if(!c)return{success:!1,error:"A flow description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let d=!0===a.allowInstall,g=!0===a.allowSubflows,k=g?"number"!=typeof(b=a.maxDepth)||Number.isNaN(b)?2:Math.max(0,Math.min(h.A_,Math.floor(b))):0,l=await e.modelService.getModel(a.modelId);if(!l)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let m=await e.modelService.resolveAndDecryptApiKey(l.ApiKey);if(!m)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let n=await (0,o.jY)(),t=(0,f.getCompletionAdapter)(l),w=s(d),x={installedServers:[],contextDirty:!1},y=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),z=1;async function A(a,b){let c,e=[{role:"system",content:q(n.catalog,d,g&&b<k,k)},{role:"user",content:a}];try{c=await u(t,l,m,e,w,d,x)}catch(a){return p.warn("A child subflow generation call failed; leaving the subflow unresolved",a),null}let f=v(c);return f&&"object"==typeof f?f:null}async function B(a,b){if(a&&Array.isArray(a.nodes))for(let c of a.nodes){if(c?.type!=="subflow"||c.flow)continue;if(c.subflowSpec){await B(c.subflowSpec,b+1);continue}let a="string"==typeof c.generateSubflow?c.generateSubflow.trim():"";if(!a)continue;if(b+1>k||z>=h.lk){p.info(`Not expanding generateSubflow (depth ${b+1}, ${z} flows so far): budget/depth reached`);continue}let d=await A(a,b+1);d?(z++,c.subflowSpec=d,delete c.generateSubflow,await B(d,b+1)):delete c.generateSubflow}}let C=[{role:"system",content:q(n.catalog,d,g,k)},{role:"user",content:c}],D=null,E=0;for(let a=0;a<=y;a++){let b;E++,z=1;try{b=await u(t,l,m,C,w,d,x)}catch(a){if(p.error("Generator model call failed",a),D)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}let c=v(b);if(!c){if(p.warn(`Attempt ${E}: model output contained no parseable JSON object`),x.contextDirty){try{n=await (0,o.jY)()}catch(a){p.warn("Re-gathering context after install failed; keeping the stale catalog",a)}x.contextDirty=!1}C.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}if(g)try{await B(c,0)}catch(a){p.warn("Subflow expansion failed; compiling the root spec as-is",a)}if(x.contextDirty){try{n=await (0,o.jY)()}catch(a){p.warn("Re-gathering context after install failed; validating with the stale catalog",a)}x.contextDirty=!1}let e=c,f=[];try{let a=(0,j.p)(c);a.changes.length>0&&(e=a.spec,f=a.changes,p.info(`Attempt ${E}: auto-repair adjusted the spec (${f.length} change(s))`))}catch(a){p.warn("Auto-repair of the generated spec failed; compiling the spec as-is",a)}let q=f.map(a=>({severity:"warning",code:a.code,message:a.message})),s=(0,h.dM)(e,n.compile,{maxDepth:k,maxFlows:h.lk});if(!s.flow){C.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
|
|
22
|
+
${r(s.issues)}
|
|
23
|
+
Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}for(let a of s.flows)(0,h.Zn)(a);let A=s.flows.map(a=>({flow:a,validation:(0,i.nC)(a,{models:n.compile.models,servers:n.validatorServers,serverTools:n.compile.serverTools})})),F=(0,o.RB)([...q,...s.issues],{issues:A.flatMap(a=>a.validation.issues),errorCount:0,warningCount:0,isRunnable:!0});if(D={flows:A,rootFlow:s.flow,validation:F},0===F.errorCount)break;p.info(`Attempt ${E}: bundle has ${F.errorCount} error(s)`+(a<y?"; asking the model to repair":"; repair budget exhausted")),a<y&&C.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
|
|
24
|
+
${r(F.issues)}
|
|
25
|
+
Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return D?(p.info(`Generated draft bundle rooted at "${D.rootFlow.name}" (${D.flows.length} flow(s)) in ${E} attempt(s): ${D.validation.errorCount} error(s), ${D.validation.warningCount} warning(s), ${x.installedServers.length} server(s) installed`),{success:!0,flow:D.rootFlow,validation:D.validation,flows:D.flows,rootFlowId:D.rootFlow.id,attempts:E,installedServers:x.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the description or a different generator model.",statusCode:422}}async function x(a){let b="string"==typeof a?.description?a.description.trim():"";if(!b)return{success:!1,error:"A change description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let c=a?.flow;if(!c||"object"!=typeof c||!Array.isArray(c.nodes)||!Array.isArray(c.edges))return{success:!1,error:"A valid flow to improve is required",statusCode:400};let d=await e.modelService.getModel(a.modelId);if(!d)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let g=await e.modelService.resolveAndDecryptApiKey(d.ApiKey);if(!g)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let j=!0===a.allowInstall,k=await (0,o.jY)(),l=(0,f.getCompletionAdapter)(d),m=s(j),n={installedServers:[],contextDirty:!1},t=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),w=(0,h.FH)(c),x={};for(let a of c.nodes)a?.id&&a.position&&"number"==typeof a.position.x&&"number"==typeof a.position.y&&(x[a.id]={x:a.position.x,y:a.position.y});let y=a=>({models:a.compile.models,servers:a.compile.servers,serverTools:a.compile.serverTools,flows:(a.compile.flows??[]).filter(a=>a.id!==c.id)}),z=`EXISTING FLOW (modify this — keep unchanged parts intact, and KEEP each node's "key" for any node you do NOT restructure so its canvas position is preserved):
|
|
26
|
+
${JSON.stringify(w)}
|
|
27
|
+
|
|
28
|
+
CHANGE REQUEST:
|
|
29
|
+
${b}
|
|
30
|
+
|
|
31
|
+
Re-emit the COMPLETE flow specification as a single JSON object (only the JSON), including the nodes you did not change.`,A=[{role:"system",content:q(k.catalog,j,!1,0)},{role:"user",content:z}],B=null,C=0;for(let a=0;a<=t;a++){let b;C++;try{b=await u(l,d,g,A,m,j,n)}catch(a){if(p.error("Improver model call failed",a),B)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}if(n.contextDirty){try{k=await (0,o.jY)()}catch(a){p.warn("Re-gathering context after install failed; using the stale catalog",a)}n.contextDirty=!1}let e=v(b);if(!e){p.warn(`Improve attempt ${C}: model output contained no parseable JSON object`),A.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}let f=(0,h.dM)(e,y(k),{maxDepth:0,maxFlows:1,positions:x});if(!f.flow){A.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
|
|
32
|
+
${r(f.issues)}
|
|
33
|
+
Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}f.flow.id=c.id,"string"==typeof e.name&&e.name.trim()||(f.flow.name=c.name),(0,h.Zn)(f.flow);let q=(0,i.nC)(f.flow,{models:k.compile.models,servers:k.validatorServers,serverTools:k.compile.serverTools}),s=(0,o.RB)(f.issues,q);if(B={flows:[{flow:f.flow,validation:q}],rootFlow:f.flow,validation:s},0===s.errorCount)break;p.info(`Improve attempt ${C}: flow has ${s.errorCount} error(s)`+(a<t?"; asking the model to repair":"; repair budget exhausted")),a<t&&A.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
|
|
34
|
+
${r(s.issues)}
|
|
35
|
+
Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return B?(p.info(`Improved draft "${B.rootFlow.name}" in ${C} attempt(s): ${B.validation.errorCount} error(s), ${B.validation.warningCount} warning(s), ${n.installedServers.length} server(s) installed`),{success:!0,flow:B.rootFlow,validation:B.validation,flows:B.flows,rootFlowId:B.rootFlow.id,attempts:C,installedServers:n.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the change request or a different generator model.",statusCode:422}}async function y(a){let b=a?.flow;if(!b||"object"!=typeof b||!Array.isArray(b.nodes)||!Array.isArray(b.edges))return{success:!1,error:"A valid flow to repair is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A repair model id is required",statusCode:400};let c=(0,i.nC)(b),d=c.issues.length>0?`
|
|
36
|
+
|
|
37
|
+
Known problems to fix:
|
|
38
|
+
${r(c.issues)}`:"";return x({flow:b,description:`Repair this flow's wiring so it is runnable, WITHOUT changing any node's prompt, model, or servers:
|
|
39
|
+
- add a Start node if one is missing, connected to the first step;
|
|
40
|
+
- add a Finish node if one is missing, connected from the last step;
|
|
41
|
+
- connect any disconnected process/subflow nodes.
|
|
42
|
+
Read node placement as intent: nodes stacked top-to-bottom are sequential steps, and nodes on the same horizontal line are parallel branches under a shared parent above them.${d}`,modelId:a.modelId,...void 0!==a.allowInstall?{allowInstall:a.allowInstall}:{},...void 0!==a.maxRepairs?{maxRepairs:a.maxRepairs}:{}})}}};
|
|
@@ -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.all([c.e(
|
|
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.all([c.e(8732),c.e(4322),c.e(6996),c.e(5734),c.e(5096),c.e(4545),c.e(1925)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(8732),c.e(4322),c.e(6996),c.e(5734),c.e(5096),c.e(4545),c.e(1925)]).then(c.bind(c,87182)),{normalizeMaxTokens:f}=await c.e(4042).then(c.bind(c,54042)),g=await d.getModel(a);if(!g)throw Error(`config: The AI-check model no longer exists (${a})`);let i=await d.resolveAndDecryptApiKey(g.ApiKey);if(!i)throw Error("config: Could not resolve the AI-check model API key");let j=e(g),{completion:k}=await j.createCompletion({model:g,apiKey:i,temperature:0,maxTokens:f(g.maxTokens),messages:[{role:"system",content:h},{role:"user",content:b}]}),l=k.choices?.[0]?.message?.content;return"string"==typeof l?l:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(8732),c.e(4322),c.e(6996),c.e(5734),c.e(1373),c.e(5096),c.e(4545),c.e(7821),c.e(346),c.e(724),c.e(2940),c.e(4671),c.e(7214),c.e(4306)]).then(c.bind(c,57214)),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??""}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=7579,exports.ids=[7579],exports.modules={17579:(a,b,c)=>{let d;c.d(b,{internalCallTool:()=>bj,internalToolDefinitions:()=>aQ});var e=c(33873),f=c.n(e),g=c(29021),h=c(18230),i=c(11659),j=c(12763),k=c(50010),l=c(35432),m=c(67463),n=c(89850),o=c(8336),p=c(78606);function q(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let r={type:"arrowclosed",width:20,height:20,color:"#1976d2"},s={stroke:"#1976d2",strokeWidth:2},t={type:"arrowclosed",width:20,height:20,color:"#009688"},u={stroke:"#009688",strokeWidth:2},v=new Set(["full-history","latest-message","isolated"]),w=new Set(["steps","final-only"]),x=new Set(["full-conversation","latest-message"]);function y(a){let b=(0,o.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 z(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}var A=c(54898),B=c(82464);let C=(0,h.h)("backend/services/flow/generationContext");function D(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function E(){let a=await j.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:D(a.description,100)}:{}})),c=[],d={};try{let a=await B.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await B.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){C.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await B.mcpService.listServerTools(b.name),f=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:D(a.description,100)}:{}}));d[b.name]=f.map(a=>a.name),c.push({name:b.name,connected:!0,tools:f})}}catch(a){C.warn("Could not load MCP servers for the authoring context",a)}let e=[];try{e=await i.flowService.loadFlows()}catch(a){C.warn("Could not load flows for the authoring context",a)}let f={models:b,servers:c,flows:e.map(a=>({id:a.id,name:a.name,...a.description?{description:D(a.description,300)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:f,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:e.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(f),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}let F=(0,h.h)("backend/services/flow/compileFlow");async function G(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await E(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let e=function(a,b={},c={}){let d=[],e=(a,b,c)=>d.push({severity:"error",code:a,message:b,nodeKey:c}),f=(a,b,c)=>d.push({severity:"warning",code:a,message:b,nodeKey:c}),g=b.models??[],h=new Set((b.servers??[]).map(a=>a.name)),i=b.serverTools??{},j=q(c.maxDepth,0,3,3),k=q(c.maxFlows,1,8,8),l=[],m=[...(b.flows??[]).map(a=>a.name)],o=[],A=0;var B=function a(d,B,C){let D=Array.isArray(d?.nodes)?d.nodes:[],E=Array.isArray(d?.edges)?d.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}}(d?.name,m);m.push(G),A++;let H=(0,n.A)(),I=[...C,G],J=new Map,K=[],L=[];for(let c of D){let d=c?.key;if(!d||"string"!=typeof d){e("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(J.has(d)){e("node-duplicate-key",`Duplicate node key "${d}" — keys must be unique; the later node was dropped.`,d);continue}let l=c.type;if("mcp"===l){e("mcp-node-not-allowed",`Node "${d}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,d);continue}if("start"!==l&&"process"!==l&&"finish"!==l&&"subflow"!==l&&"resource"!==l&&"signal"!==l){e("unknown-node-type",`Node "${d}" has unknown type "${String(l)}".`,d);continue}let m={},p="string"==typeof c.prompt?c.prompt:void 0;if("start"===l){let{text:a,stripped:b}=y(p??"");b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.promptTemplate=a}else if("process"===l){let{text:a,stripped:b}=y(p??"");if(b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.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,g);a?m.boundModel=a:(m.boundModel=c.model,f("model-unresolved",`Node "${d}": model "${c.model}" does not match any configured model (by id, display name, or name).`,d))}void 0!==c.inputMode&&(v.has(c.inputMode)?(m.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(m.isolatedPrompt=c.isolatedPrompt)):f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(x.has(c.outputMode)?m.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,d)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?f("invalid-max-turns",`Node "${d}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,d):m.maxTurns=q(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(m.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(m.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(m.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(m.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(m.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(m.captureResource=c.captureResource.trim()),"string"==typeof c.captureKv&&c.captureKv.trim()&&(m.captureKv=c.captureKv.trim())}else if("subflow"===l){if(function(c,d,g,h,i){let l=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,m=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0,n="string"==typeof c.parallelFlowsVariable?c.parallelFlowsVariable.trim():"";if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,l?"parallelFlows":null,m?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&f("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;(l||m)&&e("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(i.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?i.itemSplit=c.itemSplit:f("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(i.sequential=!0),F(c,i)):e("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}let p=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];if(p.length>0){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;l||m?e("subflow-spawn-and-parallel",`Node "${d}": "spawnBriefs" runs a SINGLE child once per brief and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d):!0===c.mapOverList?e("subflow-spawn-and-map",`Node "${d}": "spawnBriefs" cannot be combined with "mapOverList"; use one lane source or the other.`,d):a?(i.spawnBriefs=p,F(c,i)):e("subflow-spawn-no-child",`Node "${d}": "spawnBriefs" needs a single child ("flow" or "subflowSpec") to spawn once per brief.`,d)}if(n&&(!0===c.mapOverList?e("subflow-map-and-parallel-var",`Node "${d}": "parallelFlowsVariable" (dynamic fan-out) cannot be combined with "mapOverList".`,d):i.parallelSubflowIdsVar=n),c.flow){if(h.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return e("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=z(c.flow,[...b.flows??[],...o]);return a?i.subflowId=a:e("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(g+1>j)return e("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${j} level(s); this inline subflow was not compiled.`,d);if(A>=k)return e("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${k} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,g+1,h);return b?i.subflowId=b.id:e("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(l){let a=[];for(let f of c.parallelFlows){if("string"!=typeof f||!f){e("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(h.some(a=>a.toLowerCase()===f.toLowerCase())){e("subflow-cycle",`Node "${d}": parallel flow "${f}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=z(f,[...b.flows??[],...o]);c?a.includes(c)||a.push(c):e("parallel-flow-unresolved",`Node "${d}": parallel flow "${f}" does not match any existing flow (by id or name).`,d)}a.length>0?(i.parallelSubflowIds=a,F(c,i)):e("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(m){let b=[];for(let f of c.parallelSubflowSpecs){if(!f||"object"!=typeof f){e("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(g+1>j){e("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${j} level(s); a parallel inline subflow was not compiled.`,d);continue}if(A>=k){e("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${k} flows in one bundle; it was not compiled.`,d);continue}let c=a(f,g+1,h);c?b.push(c.id):e("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(i.parallelSubflowIds=b,F(c,i)):e("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}n&&i.parallelSubflowIdsVar?F(c,i):void 0!==c.generateSubflow&&null!==c.generateSubflow?e("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):e("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,d,B,I,m),void 0!==c.inputMode&&(v.has(c.inputMode)?m.inputMode=c.inputMode:f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(w.has(c.outputMode)?m.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,d)),void 0!==p){let{text:a,stripped:b}=y(p);b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(m.allowCallerPrompt=c.allowCallerPrompt),"boolean"==typeof c.allowCallerFanout&&(m.allowCallerFanout=c.allowCallerFanout),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(m.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(m.captureResource=c.captureResource.trim()),"string"==typeof c.captureKv&&c.captureKv.trim()&&(m.captureKv=c.captureKv.trim())}else if("resource"===l){let a="string"==typeof c.runName?c.runName.trim():"",b="string"==typeof c.server?c.server.trim():"",e="string"==typeof c.uri?c.uri.trim():"";a?(m.scope="run",m.runName=a,(b||e)&&f("resource-both-bindings",`Node "${d}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,d)):(m.scope="mcp",b&&(m.boundServer=b),e&&(m.uri=e),b&&e?h.has(b)||f("server-unknown",`Node "${d}": MCP server "${b}" is not configured in FLUJO.`,d):f("resource-missing-binding",`Node "${d}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,d))}else if("signal"===l){let a="string"==typeof c.topic?c.topic.trim():"";a?m.topic=a:f("signal-missing-topic",`Node "${d}": a signal node needs a "topic" to emit.`,d),"string"==typeof c.payloadTemplate&&c.payloadTemplate?m.payloadTemplate=c.payloadTemplate:void 0!==p&&(m.payloadTemplate=p)}let r={id:(0,n.A)(),type:l,position:{x:0,y:0},data:{label:c.label||`${l.charAt(0).toUpperCase()}${l.slice(1)} Node`,type:l,...c.description?{description:c.description}:{},properties:m}};if(J.set(d,r),K.push(r),"process"===l&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,e=b?.name;if(!e||"string"!=typeof e){f("server-missing-name",`Node "${d}": a server reference is missing its "name"; skipped.`,d);continue}if(a.has(e))continue;a.add(e),h.has(e)||f("server-unknown",`Node "${d}": MCP server "${e}" is not configured in FLUJO.`,d);let g=i[e];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&&f("tool-unknown",`Node "${d}": server "${e}" does not report tool(s): ${a.join(", ")}.`,d)}}else c=g?[...g]:[];let j={id:(0,n.A)(),type:"mcp",position:{x:0,y:0},data:{label:e,type:"mcp",properties:{boundServer:e,enabledTools:c}}};K.push(j),L.push({processKey:d,mcpNode:j})}}else"process"!==l&&Array.isArray(c.servers)&&c.servers.length>0&&f("servers-on-non-process",`Node "${d}": only process nodes can have "servers"; ignored.`,d)}if(0===J.size)return e("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let M=[],N=new Set;for(let a of E){let b,c=a?.from,d=a?.to,g=c?J.get(c):void 0,h=d?J.get(d):void 0;if(!g||!h){e("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(g===h){e("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===g.type||"resource"===h.type){if(("resource"!==g.type||"process"!==h.type)&&("process"!==g.type||"resource"!==h.type)){e("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&f("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&f("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(N.has(b)){f("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}N.add(b),M.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:{...t},style:{...u}}}(g,h));continue}if("start"===h.type){e("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===g.type){e("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let i=`${c}->${d}`;if(N.has(i)){f("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}N.add(i);let j=!0===a.bidirectional;j&&("start"===g.type||"finish"===h.type)&&(f("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),j=!1);let k=a.condition;k&&"object"==typeof k&&("process"!==g.type?f("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${g.type} node; conditions only route from process nodes and were dropped.`):(0,p.C)(k.kind)?"always"===k.kind?b={kind:"always",..."last-message"===k.target?{target:"last-message"}:{},...!0===k.negate?{negate:!0}:{}}:"string"!=typeof k.value||0===k.value.length?f("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==k.kind||(0,p.wM)(k.value)||f("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:k.kind,value:k.value,..."last-message"===k.target?{target:"last-message"}:{},...!0===k.ignoreCase?{ignoreCase:!0}:{},...!0===k.negate?{negate:!0}:{}}):f("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(k.kind)}"; the condition was dropped.`)),M.push(function(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}}(g,h,j,b))}for(let{processKey:a,mcpNode:b}of L){let c=J.get(a);M.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:{...r},markerStart:{...r},style:{...s}}}(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,J,M,L,0===B?c.positions:void 0);let O={id:H,name:G,...d?.description?{description:d.description}:{},nodes:K,edges:M};return l.push(O),o.push({id:O.id,name:O.name}),O}(a,0,[]),C=l,D=d;let E=D.filter(a=>"error"===a.severity).length;return{flow:B,flows:C,issues:D,errorCount:E,warningCount:D.length-E};function F(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?f("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:f("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}(a,d);if(!e.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:e.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(e.flow.id=b.updateFlowId);let f=e.flows.flatMap(a=>(0,A.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),g=function(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}(e.issues,{issues:f,errorCount:0,warningCount:0,isRunnable:!0}),h=!1;if(b.save&&0===g.errorCount){for(let a of e.flows)await i.flowService.saveFlow(a);h=!0,F.info(`Compiled and saved ${e.flows.length} flow(s); root "${e.flow.name}" (${e.flow.id})`)}else b.save&&F.info(`Compiled flow "${e.flow.name}" has ${g.errorCount} error(s); NOT saved`);return{success:!0,flow:e.flow,flows:e.flows,validation:g,saved:h}}var H=c(44561),I=c(79111),J=c(34115);let K=(0,h.h)("backend/execution/flow/loadConversationState");async function L(a){try{(0,I.ln)(a)}catch{K.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(H.FlowExecutor.conversationStates.has(a))return K.debug("Loaded state from memory",{conversationId:a}),H.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,I.YM)(b,void 0);if(c)return K.debug("Loaded state from storage",{conversationId:a}),await (0,J.jM)(c),H.FlowExecutor.conversationStates.set(a,c),c}catch(b){K.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}var M=c(96249),N=c(63129),O=c(51172);let P=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
|
|
1
|
+
"use strict";exports.id=7579,exports.ids=[7579],exports.modules={17579:(a,b,c)=>{let d;c.d(b,{internalCallTool:()=>bj,internalToolDefinitions:()=>aQ});var e=c(33873),f=c.n(e),g=c(29021),h=c(18230),i=c(11659),j=c(12763),k=c(50010),l=c(35432),m=c(67463),n=c(89850),o=c(8336),p=c(78606);function q(a,b,c,d){return"number"!=typeof a||Number.isNaN(a)?d:Math.max(b,Math.min(c,Math.floor(a)))}let r={type:"arrowclosed",width:20,height:20,color:"#1976d2"},s={stroke:"#1976d2",strokeWidth:2},t={type:"arrowclosed",width:20,height:20,color:"#009688"},u={stroke:"#009688",strokeWidth:2},v=new Set(["full-history","latest-message","isolated"]),w=new Set(["steps","final-only"]),x=new Set(["full-conversation","latest-message"]);function y(a){let b=(0,o.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 z(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}var A=c(54898),B=c(82464);let C=(0,h.h)("backend/services/flow/generationContext");function D(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function E(){let a=await j.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:D(a.description,100)}:{}})),c=[],d={};try{let a=await B.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await B.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){C.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await B.mcpService.listServerTools(b.name),f=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:D(a.description,100)}:{}}));d[b.name]=f.map(a=>a.name),c.push({name:b.name,connected:!0,tools:f})}}catch(a){C.warn("Could not load MCP servers for the authoring context",a)}let e=[];try{e=await i.flowService.loadFlows()}catch(a){C.warn("Could not load flows for the authoring context",a)}let f={models:b,servers:c,flows:e.map(a=>({id:a.id,name:a.name,...a.description?{description:D(a.description,300)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:f,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:e.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(f),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}let F=(0,h.h)("backend/services/flow/compileFlow");async function G(a,b={}){if(!a||"object"!=typeof a||Array.isArray(a))return{success:!1,error:"The spec must be a JSON object (a FlowSpec)",statusCode:400};let c=await E(),d=c.compile;if(b.updateFlowId){let a=d.flows??[];if(!a.some(a=>a.id===b.updateFlowId))return{success:!1,error:`No flow with id "${b.updateFlowId}" to update`,statusCode:404};d={...d,flows:a.filter(a=>a.id!==b.updateFlowId)}}let e=function(a,b={},c={}){let d=[],e=(a,b,c)=>d.push({severity:"error",code:a,message:b,nodeKey:c}),f=(a,b,c)=>d.push({severity:"warning",code:a,message:b,nodeKey:c}),g=b.models??[],h=new Set((b.servers??[]).map(a=>a.name)),i=b.serverTools??{},j=q(c.maxDepth,0,3,3),k=q(c.maxFlows,1,8,8),l=[],m=[...(b.flows??[]).map(a=>a.name)],o=[],A=0;var B=function a(d,B,C){let D=Array.isArray(d?.nodes)?d.nodes:[],E=Array.isArray(d?.edges)?d.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}}(d?.name,m);m.push(G),A++;let H=(0,n.A)(),I=[...C,G],J=new Map,K=[],L=[];for(let c of D){let d=c?.key;if(!d||"string"!=typeof d){e("node-missing-key",'A node is missing its "key" — every node needs a unique key.');continue}if(J.has(d)){e("node-duplicate-key",`Duplicate node key "${d}" — keys must be unique; the later node was dropped.`,d);continue}let l=c.type;if("mcp"===l){e("mcp-node-not-allowed",`Node "${d}": do not emit "mcp" nodes — attach servers to a process node via its "servers" list instead.`,d);continue}if("start"!==l&&"process"!==l&&"finish"!==l&&"subflow"!==l&&"resource"!==l&&"signal"!==l){e("unknown-node-type",`Node "${d}" has unknown type "${String(l)}".`,d);continue}let m={},p="string"==typeof c.prompt?c.prompt:void 0;if("start"===l){let{text:a,stripped:b}=y(p??"");b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.promptTemplate=a}else if("process"===l){let{text:a,stripped:b}=y(p??"");if(b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.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,g);a?m.boundModel=a:(m.boundModel=c.model,f("model-unresolved",`Node "${d}": model "${c.model}" does not match any configured model (by id, display name, or name).`,d))}void 0!==c.inputMode&&(v.has(c.inputMode)?(m.inputMode=c.inputMode,"isolated"===c.inputMode&&"string"==typeof c.isolatedPrompt&&(m.isolatedPrompt=c.isolatedPrompt)):f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(x.has(c.outputMode)?m.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid on a process node (full-conversation | latest-message); omitted.`,d)),void 0!==c.maxTurns&&("number"!=typeof c.maxTurns||Number.isNaN(c.maxTurns)?f("invalid-max-turns",`Node "${d}": maxTurns "${String(c.maxTurns)}" is not a number; omitted.`,d):m.maxTurns=q(c.maxTurns,1,1e3,1)),"boolean"==typeof c.excludeModelPrompt&&(m.excludeModelPrompt=c.excludeModelPrompt),"boolean"==typeof c.excludeStartNodePrompt&&(m.excludeStartNodePrompt=c.excludeStartNodePrompt),"boolean"==typeof c.excludeSystemPrompt&&(m.excludeSystemPrompt=c.excludeSystemPrompt),Array.isArray(c.allowedTools)&&(m.allowedTools=c.allowedTools.filter(a=>"string"==typeof a&&a)),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(m.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(m.captureResource=c.captureResource.trim()),"string"==typeof c.captureKv&&c.captureKv.trim()&&(m.captureKv=c.captureKv.trim())}else if("subflow"===l){if(function(c,d,g,h,i){let l=Array.isArray(c.parallelFlows)&&c.parallelFlows.length>0,m=Array.isArray(c.parallelSubflowSpecs)&&c.parallelSubflowSpecs.length>0,n="string"==typeof c.parallelFlowsVariable?c.parallelFlowsVariable.trim():"";if([void 0!==c.flow&&null!==c.flow?"flow":null,void 0!==c.subflowSpec&&null!==c.subflowSpec?"subflowSpec":null,l?"parallelFlows":null,m?"parallelSubflowSpecs":null,void 0!==c.generateSubflow&&null!==c.generateSubflow?"generateSubflow":null].filter(Boolean).length>1&&f("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;(l||m)&&e("subflow-map-and-parallel",`Node "${d}": "mapOverList" runs a SINGLE child once per item and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d),a?(i.mapOverList=!0,void 0!==c.itemSplit&&("json-array"===c.itemSplit||"lines"===c.itemSplit?i.itemSplit=c.itemSplit:f("invalid-item-split",`Node "${d}": itemSplit "${String(c.itemSplit)}" is not valid (json-array | lines); using json-array.`,d)),!0===c.sequential&&(i.sequential=!0),F(c,i)):e("subflow-map-no-child",`Node "${d}": "mapOverList" needs a single child ("flow" or "subflowSpec") to run once per item.`,d)}let p=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];if(p.length>0){let a=void 0!==c.flow&&null!==c.flow||void 0!==c.subflowSpec&&null!==c.subflowSpec;l||m?e("subflow-spawn-and-parallel",`Node "${d}": "spawnBriefs" runs a SINGLE child once per brief and cannot be combined with "parallelFlows"/"parallelSubflowSpecs".`,d):!0===c.mapOverList?e("subflow-spawn-and-map",`Node "${d}": "spawnBriefs" cannot be combined with "mapOverList"; use one lane source or the other.`,d):a?(i.spawnBriefs=p,F(c,i)):e("subflow-spawn-no-child",`Node "${d}": "spawnBriefs" needs a single child ("flow" or "subflowSpec") to spawn once per brief.`,d)}if(n&&(!0===c.mapOverList?e("subflow-map-and-parallel-var",`Node "${d}": "parallelFlowsVariable" (dynamic fan-out) cannot be combined with "mapOverList".`,d):i.parallelSubflowIdsVar=n),c.flow){if(h.some(a=>a.toLowerCase()===c.flow.toLowerCase()))return e("subflow-cycle",`Node "${d}": flow "${c.flow}" refers to an ancestor flow, which would create a cycle.`,d);let a=z(c.flow,[...b.flows??[],...o]);return a?i.subflowId=a:e("subflow-unresolved",`Node "${d}": flow "${c.flow}" does not match any existing flow (by id or name).`,d)}if(c.subflowSpec){if(g+1>j)return e("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${j} level(s); this inline subflow was not compiled.`,d);if(A>=k)return e("subflow-too-many",`Node "${d}": compiling this inline subflow would exceed the maximum of ${k} flows in one bundle; it was not compiled.`,d);let b=a(c.subflowSpec,g+1,h);return b?i.subflowId=b.id:e("subflow-child-empty",`Node "${d}": the inline "subflowSpec" produced no usable flow.`,d)}if(l){let a=[];for(let f of c.parallelFlows){if("string"!=typeof f||!f){e("parallel-flow-invalid",`Node "${d}": a "parallelFlows" entry is missing or not a string.`,d);continue}if(h.some(a=>a.toLowerCase()===f.toLowerCase())){e("subflow-cycle",`Node "${d}": parallel flow "${f}" refers to an ancestor flow, which would create a cycle.`,d);continue}let c=z(f,[...b.flows??[],...o]);c?a.includes(c)||a.push(c):e("parallel-flow-unresolved",`Node "${d}": parallel flow "${f}" does not match any existing flow (by id or name).`,d)}a.length>0?(i.parallelSubflowIds=a,F(c,i)):e("parallel-empty",`Node "${d}": "parallelFlows" resolved to no runnable lanes.`,d);return}if(m){let b=[];for(let f of c.parallelSubflowSpecs){if(!f||"object"!=typeof f){e("parallel-spec-invalid",`Node "${d}": a "parallelSubflowSpecs" entry is not a FlowSpec object.`,d);continue}if(g+1>j){e("subflow-too-deep",`Node "${d}": nested subflows may not go deeper than ${j} level(s); a parallel inline subflow was not compiled.`,d);continue}if(A>=k){e("subflow-too-many",`Node "${d}": compiling a parallel inline subflow would exceed the maximum of ${k} flows in one bundle; it was not compiled.`,d);continue}let c=a(f,g+1,h);c?b.push(c.id):e("subflow-child-empty",`Node "${d}": a "parallelSubflowSpecs" entry produced no usable flow.`,d)}b.length>0?(i.parallelSubflowIds=b,F(c,i)):e("parallel-empty",`Node "${d}": "parallelSubflowSpecs" produced no runnable lanes.`,d);return}n&&i.parallelSubflowIdsVar?F(c,i):void 0!==c.generateSubflow&&null!==c.generateSubflow?e("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):e("subflow-missing-flow",`Node "${d}": subflow nodes need a "flow" (existing flow), a "subflowSpec" (inline child), "parallelFlows"/"parallelSubflowSpecs" (concurrent children), or "generateSubflow".`,d)}(c,d,B,I,m),void 0!==c.inputMode&&(v.has(c.inputMode)?m.inputMode=c.inputMode:f("invalid-input-mode",`Node "${d}": inputMode "${String(c.inputMode)}" is not valid (full-history | latest-message | isolated); omitted.`,d)),void 0!==c.outputMode&&(w.has(c.outputMode)?m.outputMode=c.outputMode:f("invalid-output-mode",`Node "${d}": outputMode "${String(c.outputMode)}" is not valid (steps | final-only); omitted.`,d)),void 0!==p){let{text:a,stripped:b}=y(p);b&&f("pill-stripped",`Node "${d}": binding pills are not supported in generated prompts and were replaced with plain names.`,d),m.promptTemplate=a}"boolean"==typeof c.allowCallerPrompt&&(m.allowCallerPrompt=c.allowCallerPrompt),"boolean"==typeof c.allowCallerFanout&&(m.allowCallerFanout=c.allowCallerFanout),"string"==typeof c.captureVariable&&c.captureVariable.trim()&&(m.captureVariable=c.captureVariable.trim()),"string"==typeof c.captureResource&&c.captureResource.trim()&&(m.captureResource=c.captureResource.trim()),"string"==typeof c.captureKv&&c.captureKv.trim()&&(m.captureKv=c.captureKv.trim())}else if("resource"===l){let a="string"==typeof c.runName?c.runName.trim():"",b="string"==typeof c.server?c.server.trim():"",e="string"==typeof c.uri?c.uri.trim():"";a?(m.scope="run",m.runName=a,(b||e)&&f("resource-both-bindings",`Node "${d}": a resource node is EITHER a run artifact ("runName") or a static MCP resource ("server"+"uri"); kept the run artifact.`,d)):(m.scope="mcp",b&&(m.boundServer=b),e&&(m.uri=e),b&&e?h.has(b)||f("server-unknown",`Node "${d}": MCP server "${b}" is not configured in FLUJO.`,d):f("resource-missing-binding",`Node "${d}": a static resource node needs both "server" and "uri" (or a "runName" for a run artifact).`,d))}else if("signal"===l){let a="string"==typeof c.topic?c.topic.trim():"";a?m.topic=a:f("signal-missing-topic",`Node "${d}": a signal node needs a "topic" to emit.`,d),"string"==typeof c.payloadTemplate&&c.payloadTemplate?m.payloadTemplate=c.payloadTemplate:void 0!==p&&(m.payloadTemplate=p)}let r={id:(0,n.A)(),type:l,position:{x:0,y:0},data:{label:"finish"===l?"Finish Node":c.label||`${l.charAt(0).toUpperCase()}${l.slice(1)} Node`,type:l,...c.description?{description:c.description}:{},properties:m}};if(J.set(d,r),K.push(r),"process"===l&&Array.isArray(c.servers)){let a=new Set;for(let b of c.servers){let c,e=b?.name;if(!e||"string"!=typeof e){f("server-missing-name",`Node "${d}": a server reference is missing its "name"; skipped.`,d);continue}if(a.has(e))continue;a.add(e),h.has(e)||f("server-unknown",`Node "${d}": MCP server "${e}" is not configured in FLUJO.`,d);let g=i[e];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&&f("tool-unknown",`Node "${d}": server "${e}" does not report tool(s): ${a.join(", ")}.`,d)}}else c=g?[...g]:[];let j={id:(0,n.A)(),type:"mcp",position:{x:0,y:0},data:{label:e,type:"mcp",properties:{boundServer:e,enabledTools:c}}};K.push(j),L.push({processKey:d,mcpNode:j})}}else"process"!==l&&Array.isArray(c.servers)&&c.servers.length>0&&f("servers-on-non-process",`Node "${d}": only process nodes can have "servers"; ignored.`,d)}if(0===J.size)return e("no-usable-nodes","No usable nodes — the spec must contain at least a start node and one step."),null;let M=[],N=new Set;for(let a of E){let b,c=a?.from,d=a?.to,g=c?J.get(c):void 0,h=d?J.get(d):void 0;if(!g||!h){e("edge-unknown-node",`Edge "${String(c)}" -> "${String(d)}" references a node key that does not exist (or was dropped).`);continue}if(g===h){e("edge-self-loop",`Edge "${c}" -> "${d}": a node cannot connect to itself.`);continue}if("resource"===g.type||"resource"===h.type){if(("resource"!==g.type||"process"!==h.type)&&("process"!==g.type||"resource"!==h.type)){e("resource-edge-invalid",`Edge "${c}" -> "${d}": resource nodes connect only to process nodes.`);continue}a.condition&&f("resource-edge-condition",`Edge "${c}" -> "${d}": conditions do not apply to resource wiring; dropped.`),!0===a.bidirectional&&f("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(N.has(b)){f("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}N.add(b),M.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:{...t},style:{...u}}}(g,h));continue}if("start"===h.type){e("edge-into-start",`Edge "${c}" -> "${d}": nothing may connect INTO a start node.`);continue}if("finish"===g.type){e("edge-out-of-finish",`Edge "${c}" -> "${d}": nothing may connect OUT OF a finish node.`);continue}let i=`${c}->${d}`;if(N.has(i)){f("edge-duplicate",`Edge "${c}" -> "${d}" appears more than once; kept the first.`);continue}N.add(i);let j=!0===a.bidirectional;j&&("start"===g.type||"finish"===h.type)&&(f("bidirectional-illegal",`Edge "${c}" -> "${d}" cannot be bidirectional; downgraded to one-way.`),j=!1);let k=a.condition;k&&"object"==typeof k&&("process"!==g.type?f("edge-condition-non-process",`Edge "${c}" -> "${d}" has a condition but leaves a ${g.type} node; conditions only route from process nodes and were dropped.`):(0,p.C)(k.kind)?"always"===k.kind?b={kind:"always",..."last-message"===k.target?{target:"last-message"}:{},...!0===k.negate?{negate:!0}:{}}:"string"!=typeof k.value||0===k.value.length?f("edge-condition-value",`Edge "${c}" -> "${d}" has a condition with no "value"; the condition was dropped.`):("regex"!==k.kind||(0,p.wM)(k.value)||f("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:k.kind,value:k.value,..."last-message"===k.target?{target:"last-message"}:{},...!0===k.ignoreCase?{ignoreCase:!0}:{},...!0===k.negate?{negate:!0}:{}}):f("edge-condition-kind",`Edge "${c}" -> "${d}" has an unknown condition kind "${String(k.kind)}"; the condition was dropped.`)),M.push(function(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}}(g,h,j,b))}for(let{processKey:a,mcpNode:b}of L){let c=J.get(a);M.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:{...r},markerStart:{...r},style:{...s}}}(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,J,M,L,0===B?c.positions:void 0);let O={id:H,name:G,...d?.description?{description:d.description}:{},nodes:K,edges:M};return l.push(O),o.push({id:O.id,name:O.name}),O}(a,0,[]),C=l,D=d;let E=D.filter(a=>"error"===a.severity).length;return{flow:B,flows:C,issues:D,errorCount:E,warningCount:D.length-E};function F(a,b){void 0!==a.concurrencyLimit&&("number"!=typeof a.concurrencyLimit||Number.isNaN(a.concurrencyLimit)?f("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:f("invalid-error-strategy",`Node "${a.key}": errorStrategy "${String(a.errorStrategy)}" is not valid (fail-fast | collect-all); using collect-all.`,a.key))}}(a,d);if(!e.flow)return{success:!1,error:"The spec could not be compiled into a flow",statusCode:422,issues:e.issues.map(a=>({severity:a.severity,code:a.code,message:a.message}))};b.updateFlowId&&(e.flow.id=b.updateFlowId);let f=e.flows.flatMap(a=>(0,A.nC)(a,{models:c.compile.models,servers:c.validatorServers,serverTools:c.compile.serverTools}).issues),g=function(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}(e.issues,{issues:f,errorCount:0,warningCount:0,isRunnable:!0}),h=!1;if(b.save&&0===g.errorCount){for(let a of e.flows)await i.flowService.saveFlow(a);h=!0,F.info(`Compiled and saved ${e.flows.length} flow(s); root "${e.flow.name}" (${e.flow.id})`)}else b.save&&F.info(`Compiled flow "${e.flow.name}" has ${g.errorCount} error(s); NOT saved`);return{success:!0,flow:e.flow,flows:e.flows,validation:g,saved:h}}var H=c(1604),I=c(79111),J=c(34115);let K=(0,h.h)("backend/execution/flow/loadConversationState");async function L(a){try{(0,I.ln)(a)}catch{K.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(H.FlowExecutor.conversationStates.has(a))return K.debug("Loaded state from memory",{conversationId:a}),H.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,I.YM)(b,void 0);if(c)return K.debug("Loaded state from storage",{conversationId:a}),await (0,J.jM)(c),H.FlowExecutor.conversationStates.set(a,c),c}catch(b){K.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}var M=c(96249),N=c(63129),O=c(51172);let P=`A FlowSpec is a JSON object describing a FLUJO flow semantically — node keys and edges, no coordinates, no ids, no layout:
|
|
2
2
|
{
|
|
3
3
|
"name": "short_flow_name", // letters/digits/_/- only
|
|
4
4
|
"description": "what the flow does",
|
|
@@ -43,7 +43,7 @@ NODE TYPES:
|
|
|
43
43
|
"captureResource": "NAME", // optional; ALSO save the subflow's output as a tracked run resource (\${res:NAME}, rule 9b)
|
|
44
44
|
"captureKv": "NAME", // optional; ALSO save the subflow's output to a PERSISTENT cross-run key (\${kv:NAME}, rule 9d)
|
|
45
45
|
"outputMode": "steps" | "final-only" }
|
|
46
|
-
- { "key": "...", "type": "finish"
|
|
46
|
+
- { "key": "...", "type": "finish" } // a finish node is ALWAYS named "Finish Node"; omit "label" (any label you supply is ignored)
|
|
47
47
|
- { "key": "...", "type": "signal", "label": "...", // fire-and-forget event (rule 11): emits {topic, payload} then passes through unchanged
|
|
48
48
|
"topic": "<event topic other flows' triggers listen for>", // REQUIRED — a signal with no topic emits nothing
|
|
49
49
|
"payloadTemplate": "event body, may use \${var:NAME}" } // optional; defaults to the node prompt
|