flujo-ai 3.28.0 → 3.29.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 +383 -373
- package/.next/app-path-routes-manifest.json +28 -26
- package/.next/build-manifest.json +5 -5
- package/.next/react-loadable-manifest.json +5 -4
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page.js +2 -2
- 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 +3 -3
- 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.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.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.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/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.nft.json +1 -1
- package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/route.js +1 -1
- package/.next/server/app/api/git/route_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.js +2 -1
- package/.next/server/app/api/local-models/capability/route.js.nft.json +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.js +2 -1
- package/.next/server/app/api/local-models/pull/route.js.nft.json +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/app-sandbox/route.js +1 -1
- package/.next/server/app/api/mcp/app-sandbox/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/oauth-capability/route.js +1 -1
- package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth-capability/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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js +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.nft.json +1 -1
- package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/route.js +1 -1
- package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/status/route.js +1 -1
- package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/installed/route.js +1 -1
- package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/scan-targets/route.js +1 -0
- package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -0
- package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/packages/uninstall/route.js +1 -1
- package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route_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 -1
- package/.next/server/app/api/registry/auth/resend/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/reset/route.js +1 -1
- package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/route.js +1 -1
- package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/callback/route.js +1 -1
- package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route.js +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/publish/route.js +1 -1
- package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/settings/route.js +1 -1
- package/.next/server/app/api/registry/settings/route_client-reference-manifest.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.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_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 +8 -8
- 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 +4 -4
- 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 +4 -4
- package/.next/server/app/executions/page.js +2 -39
- 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 +4 -4
- 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 +11 -11
- 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 +4 -4
- 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 +2 -2
- package/.next/server/app/packages/page.js.nft.json +1 -1
- package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/packages.html +1 -1
- package/.next/server/app/packages.rsc +4 -4
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +4 -4
- 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 +4 -4
- 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]/inject/route.js +2 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route_client-reference-manifest.js +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.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/chat/events/route.js +2 -2
- package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/events/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 +2 -2
- 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 +4 -4
- package/.next/server/app-paths-manifest.json +28 -26
- package/.next/server/chunks/1083.js +1 -1
- package/.next/server/chunks/1114.js +1 -1
- package/.next/server/chunks/1226.js +1 -1
- package/.next/server/chunks/1314.js +1 -1
- package/.next/server/chunks/{6529.js → 1578.js} +2 -2
- package/.next/server/chunks/1634.js +1 -0
- package/.next/server/chunks/166.js +5 -5
- package/.next/server/chunks/1819.js +1 -1
- package/.next/server/chunks/2180.js +1 -0
- package/.next/server/chunks/227.js +2 -2
- package/.next/server/chunks/2368.js +2 -0
- package/.next/server/chunks/2859.js +1 -1
- package/.next/server/chunks/{7674.js → 3030.js} +1 -1
- package/.next/server/chunks/3101.js +1 -0
- package/.next/server/chunks/3128.js +4 -4
- package/.next/server/chunks/3570.js +228 -105
- package/.next/server/chunks/3629.js +1 -1
- package/.next/server/chunks/3984.js +4 -4
- package/.next/server/chunks/4239.js +1 -1
- package/.next/server/chunks/4265.js +1 -1
- package/.next/server/chunks/4366.js +2 -0
- package/.next/server/chunks/4426.js +1 -1
- package/.next/server/chunks/4551.js +6 -0
- package/.next/server/chunks/4663.js +1 -0
- package/.next/server/chunks/4671.js +1 -1
- package/.next/server/chunks/4681.js +1 -1
- package/.next/server/chunks/4685.js +1 -0
- package/.next/server/chunks/4771.js +2 -2
- package/.next/server/chunks/4961.js +2 -0
- package/.next/server/chunks/5040.js +53 -0
- package/.next/server/chunks/5067.js +1 -1
- package/.next/server/chunks/544.js +135 -0
- package/.next/server/chunks/5463.js +1 -1
- package/.next/server/chunks/5544.js +5 -5
- package/.next/server/chunks/5561.js +1 -0
- package/.next/server/chunks/5708.js +1 -1
- package/.next/server/chunks/5786.js +2 -0
- package/.next/server/chunks/5829.js +1 -0
- package/.next/server/chunks/5863.js +37 -0
- package/.next/server/chunks/5880.js +1 -1
- package/.next/server/chunks/6034.js +77 -0
- package/.next/server/chunks/{5471.js → 6219.js} +1 -1
- package/.next/server/chunks/6226.js +6 -0
- package/.next/server/chunks/6432.js +1 -0
- package/.next/server/chunks/6496.js +1 -0
- package/.next/server/chunks/6518.js +2 -0
- package/.next/server/chunks/6588.js +2 -0
- package/.next/server/chunks/6793.js +1 -0
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7579.js +4 -4
- package/.next/server/chunks/7634.js +4 -0
- package/.next/server/chunks/7821.js +1 -1
- package/.next/server/chunks/793.js +15 -5
- package/.next/server/chunks/7969.js +1 -0
- package/.next/server/chunks/{6537.js → 8001.js} +1 -1
- package/.next/server/chunks/8092.js +1 -0
- package/.next/server/chunks/8321.js +1 -0
- package/.next/server/chunks/8339.js +1 -1
- package/.next/server/chunks/8356.js +1 -0
- package/.next/server/chunks/8387.js +1 -1
- package/.next/server/chunks/848.js +39 -0
- package/.next/server/chunks/8667.js +1 -1
- package/.next/server/chunks/8739.js +1 -1
- package/.next/server/chunks/9174.js +1 -0
- package/.next/server/chunks/9251.js +1 -0
- package/.next/server/chunks/9253.js +3 -0
- package/.next/server/chunks/94.js +1 -1
- package/.next/server/chunks/9537.js +39 -0
- package/.next/server/chunks/9671.js +1 -1
- package/.next/server/chunks/9724.js +16 -6
- package/.next/server/chunks/9857.js +1 -0
- package/.next/server/chunks/{3298.js → 9868.js} +2 -2
- 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/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/JGMk-MwwdpQ94asqw-mUR/_buildManifest.js +1 -0
- package/.next/static/chunks/1572-b663a83bba28a0a1.js +8 -0
- package/.next/static/chunks/1988-bd73f26184e930c1.js +1 -0
- package/.next/static/chunks/2233-1139c1d3ef356980.js +1 -0
- package/.next/static/chunks/2266-d812473724cc6643.js +1 -0
- package/.next/static/chunks/2988-0b197a9b468a2df9.js +1 -0
- package/.next/static/chunks/3089.a0856f8093b90939.js +1 -0
- package/.next/static/chunks/3659-0ab9580d5ee5deea.js +1 -0
- package/.next/static/chunks/3672-cd86ace43288da79.js +1 -0
- package/.next/static/chunks/435-17c79f3b9f8dd38d.js +1 -0
- package/.next/static/chunks/454.5fc2f8eef98483e3.js +1 -0
- package/.next/static/chunks/4740-62814d07b2b7f760.js +1 -0
- package/.next/static/chunks/5418-45aa7e646ad024be.js +1 -0
- package/.next/static/chunks/5661-1b976072cc3d2fed.js +1 -0
- package/.next/static/chunks/6404-86615a5f5ce5c00f.js +1 -0
- package/.next/static/chunks/7445-d8a8be6e451c522e.js +1 -0
- package/.next/static/chunks/8054-f33d06ecea5d36e4.js +1 -0
- package/.next/static/chunks/812-dfe7ba07ddb7a565.js +1 -0
- package/.next/static/chunks/8404-14ef0345dc401ac5.js +1 -0
- package/.next/static/chunks/8863-c140a742178a4a87.js +1 -0
- package/.next/static/chunks/9562-5494feecd8c6f7a3.js +1 -0
- package/.next/static/chunks/9581-6d2523fd68a5e3c4.js +1 -0
- package/.next/static/chunks/app/api/approvals/[id]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/approvals/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/backup/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/browse/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/bugs/enhance/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/cwd/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/encryption/secure/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/env/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/versions/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/compile/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/generate/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/improve/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/quick-chat/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/repair/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/flow/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/git/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/init/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/local-models/capability/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/local-models/pull/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/local-models/suggest/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/app-sandbox/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/cancel/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/oauth-capability/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/model/[id]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/model/provider/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/model/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/model/test/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/oauth/initiate/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/oauth/reset/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/build/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/derive-secrets/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/install/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/install/status/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/installed/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/resolve/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/scan-targets/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/packages/uninstall/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/resend/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/reset/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/oauth/callback/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/oauth/initiate/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/publish/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/registry/settings/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/restore/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/runs/active/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/storage/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/update/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/waves/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[id]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/chat/page-2b69c5e35164f553.js +1 -0
- package/.next/static/chunks/app/executions/page-1d8557a642114697.js +1 -0
- package/.next/static/chunks/app/flows/page-3f0d7cca2edff792.js +1 -0
- package/.next/static/chunks/app/layout-81f91fb3b894951a.js +1 -0
- package/.next/static/chunks/app/mcp/page-0e90177062130679.js +1 -0
- package/.next/static/chunks/app/mcp-flows/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/mcp-proxy/[server]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/models/page-c69e10b83c06535d.js +1 -0
- package/.next/static/chunks/app/packages/page-bf8aad441c664433.js +1 -0
- package/.next/static/chunks/app/settings/page-4a9952c514f284e0.js +1 -0
- package/.next/static/chunks/app/v1/chat/completions/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/chat/events/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/v1/models/route-7d60cffa598f4779.js +1 -0
- package/.next/static/chunks/app/waves/{page-97ad6b51c9cae4b3.js → page-3ca939f0f7e817b1.js} +1 -1
- package/.next/static/chunks/webpack-08eb993682e1fb1a.js +1 -0
- package/.next/static/css/30253fcfa8035221.css +1 -0
- package/.next/trace +10 -10
- package/.next/types/app/api/packages/scan-targets/route.ts +347 -0
- package/.next/types/app/v1/chat/conversations/[conversationId]/inject/route.ts +347 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/README.md +6 -1
- package/package.json +2 -1
- package/.next/server/chunks/1197.js +0 -2
- package/.next/server/chunks/1373.js +0 -1
- package/.next/server/chunks/1604.js +0 -70
- package/.next/server/chunks/1659.js +0 -1
- package/.next/server/chunks/2434.js +0 -2
- package/.next/server/chunks/2940.js +0 -46
- package/.next/server/chunks/3304.js +0 -1
- package/.next/server/chunks/346.js +0 -1
- package/.next/server/chunks/4042.js +0 -1
- package/.next/server/chunks/4661.js +0 -1
- package/.next/server/chunks/4765.js +0 -1
- package/.next/server/chunks/5958.js +0 -2
- package/.next/server/chunks/6005.js +0 -1
- package/.next/server/chunks/6126.js +0 -53
- package/.next/server/chunks/6849.js +0 -66
- package/.next/server/chunks/7214.js +0 -6
- package/.next/server/chunks/724.js +0 -27
- package/.next/server/chunks/7463.js +0 -6
- package/.next/server/chunks/7538.js +0 -21
- package/.next/server/chunks/8037.js +0 -1
- package/.next/server/chunks/8522.js +0 -2
- package/.next/server/chunks/8572.js +0 -1
- package/.next/server/chunks/869.js +0 -2
- package/.next/server/chunks/8979.js +0 -37
- package/.next/server/chunks/8994.js +0 -2
- package/.next/server/chunks/9165.js +0 -1
- package/.next/server/chunks/9387.js +0 -15
- package/.next/server/chunks/9400.js +0 -2
- package/.next/server/chunks/9472.js +0 -2
- package/.next/server/chunks/9583.js +0 -1
- package/.next/static/Q6ITx_bZyoEOnKdZu_C7j/_buildManifest.js +0 -1
- package/.next/static/chunks/1594-309fa6363f215d76.js +0 -1
- package/.next/static/chunks/1809-e56cf3c476261e34.js +0 -1
- package/.next/static/chunks/1937-6bbdcdc660db562c.js +0 -1
- package/.next/static/chunks/1988-1b651d581fc44a36.js +0 -1
- package/.next/static/chunks/2164-7d6451e88a447de7.js +0 -1
- package/.next/static/chunks/218-6cbe09820faa3272.js +0 -1
- package/.next/static/chunks/2566-60acd5838abd9f3f.js +0 -1
- package/.next/static/chunks/2800-4fa29a3eeb693593.js +0 -1
- package/.next/static/chunks/3089.9e15df4ffd0fe4e8.js +0 -1
- package/.next/static/chunks/3556-b9855146c7506696.js +0 -1
- package/.next/static/chunks/3948-1cb8fc7a64805254.js +0 -1
- package/.next/static/chunks/5328-4e556503b70e72b4.js +0 -1
- package/.next/static/chunks/5512.682bef7fd3a7c286.js +0 -1
- package/.next/static/chunks/6195-8c4c57628e9013d5.js +0 -1
- package/.next/static/chunks/6669-a949326b30ea1d39.js +0 -1
- package/.next/static/chunks/6777-4b0d05731a089de4.js +0 -1
- package/.next/static/chunks/7304-e7cd725083617b81.js +0 -8
- package/.next/static/chunks/7445-2802e158c9093556.js +0 -1
- package/.next/static/chunks/795-704a0e742ecc2ef6.js +0 -1
- package/.next/static/chunks/812-3ceea0da38ad2891.js +0 -1
- package/.next/static/chunks/8551-a28272acfda62ac9.js +0 -1
- package/.next/static/chunks/9554-cb5bd72cb40e8dbe.js +0 -1
- package/.next/static/chunks/9562-ef0ddd4e6b9023cf.js +0 -1
- package/.next/static/chunks/app/api/approvals/[id]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/approvals/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/backup/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/browse/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/bugs/enhance/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/cwd/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/encryption/secure/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/env/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/versions/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/compile/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/generate/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/improve/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/quick-chat/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/repair/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/flow/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/git/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/init/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/local-models/capability/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/local-models/pull/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/local-models/suggest/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/app-sandbox/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/cancel/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/oauth-capability/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/model/[id]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/model/provider/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/model/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/model/test/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/oauth/callback/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/oauth/initiate/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/oauth/reset/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/build/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/derive-secrets/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/install/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/install/status/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/installed/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/resolve/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/packages/uninstall/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/resend/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/reset/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/oauth/callback/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/oauth/initiate/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/publish/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/registry/settings/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/restore/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/runs/active/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/storage/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/update/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/waves/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[id]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/chat/page-c39160ddf90bbae9.js +0 -1
- package/.next/static/chunks/app/executions/page-10d09f36de30939f.js +0 -1
- package/.next/static/chunks/app/flows/page-0d8fb471adfc2981.js +0 -1
- package/.next/static/chunks/app/layout-eea7078d7553c21a.js +0 -1
- package/.next/static/chunks/app/mcp/page-8ad71bf5801bfe5f.js +0 -1
- package/.next/static/chunks/app/mcp-flows/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/mcp-proxy/[server]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/models/page-17e8e6668f92f58d.js +0 -1
- package/.next/static/chunks/app/packages/page-9f61751e98134f3d.js +0 -1
- package/.next/static/chunks/app/settings/page-afbf8790e99fecaf.js +0 -1
- package/.next/static/chunks/app/v1/chat/completions/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/chat/events/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/app/v1/models/route-c745e5b53b81491a.js +0 -1
- package/.next/static/chunks/webpack-0d4a4e773990ac44.js +0 -1
- package/.next/static/css/40f9bef305b11bf5.css +0 -1
- /package/.next/static/{Q6ITx_bZyoEOnKdZu_C7j → JGMk-MwwdpQ94asqw-mUR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";exports.id=4551,exports.ids=[4551],exports.modules={54898:(a,b,c)=>{c.d(b,{nC:()=>q});var d=c(8336),e=c(17587),f=c(78606),g=c(27386),h=c(33132),i=c(36600);function j(a){return a.data?.type??a.type??"unknown"}function k(a){return a.data?.label||a.id}function l(a){return a.data?.edgeType==="mcp"}function m(a){return a.data?.edgeType==="resource"}function n(a){return l(a)||m(a)}function o(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!l(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"!==j(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}function p(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=[],g=new Set;for(let b of c){if(n(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:j(a)}));return new Set((0,e.E9)(h).values())}function q(a,b={}){let c=[],e=Array.isArray(a?.nodes)?a.nodes:[],r=Array.isArray(a?.edges)?a.edges:[],s=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?k(e):void 0}),t=new Map((b.models??[]).map(a=>[a.id,a])),u=new Map((b.servers??[]).map(a=>[a.name,a])),v=!!b.models,w=!!b.servers,x=e.filter(a=>"start"===j(a)),y=e.filter(a=>"finish"===j(a)),z=e.filter(a=>"process"===j(a)),A=e.filter(a=>"mcp"===j(a));if(0===x.length)s("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(x.length>1)for(let a of x.slice(1))s("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===y.length&&s("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),z)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(v&&!t.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";s("error","process-model-missing",`Process node "${k(a)}" is bound to a model that no longer exists${c}.`,a)}}else s("error","process-missing-model",`Process node "${k(a)}" has no model bound.`,a)}for(let a of A){let b=(a.data?.properties??{}).boundServer;if(b){if(w&&!u.has(b))s("warning","mcp-server-missing",`MCP node "${k(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(w){let c=u.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;s("warning","mcp-server-disconnected",`MCP node "${k(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else s("warning","mcp-missing-server",`MCP node "${k(a)}" is not bound to a server.`,a);r.some(b=>l(b)&&(b.source===a.id||b.target===a.id))||s("warning","mcp-node-unconnected",`MCP node "${k(a)}" is not connected to any Process node.`,a)}for(let a of e.filter(a=>"resource"===j(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||s("warning","resource-missing-binding",`Resource node "${k(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||f||s("warning","resource-missing-binding",`Resource node "${k(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)&&s("warning","resource-run-name",`Resource node "${k(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&&w&&!u.has(d)&&s("warning","resource-server-missing",`Resource node "${k(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=r.filter(b=>m(b)&&(b.source===a.id||b.target===a.id));0===h.length&&s("warning","resource-node-unconnected",`Resource node "${k(a)}" is not connected to any Process node.`,a);let i=h.filter(b=>b.target===a.id);"mcp"===c&&i.length>0&&s("error","resource-produce-static",`Resource node "${k(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&&s("warning","resource-multiple-producers",`Resource node "${k(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&&s("warning","resource-consumed-never-produced",`Resource node "${k(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 e.filter(a=>"signal"===j(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||s("warning","signal-missing-topic",`Signal node "${k(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(x.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)!n(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(r);for(let b of x)a.get(b.id)?.length||s("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}(x.map(a=>a.id),a);for(let a of[...z,...y])b.has(a.id)||s("warning","unreachable-node",`${"finish"===j(a)?"Finish":"Process"} node "${k(a)}" is not reachable from the Start node.`,a)}for(let a of e.filter(a=>"subflow"===j(a))){let b=r.filter(b=>!n(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&s("error","subflow-multiple-outgoing",`Subflow node "${k(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,f=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&f.length>0&&s("error","subflow-both-targets",`Subflow node "${k(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let h=!0===c.mapOverList;h&&f.length>0&&s("error","subflow-map-and-parallel",`Subflow node "${k(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),h&&!d&&0===f.length&&s("error","subflow-map-no-child",`Subflow node "${k(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let i=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];i.length>0&&!d&&s("error","subflow-spawn-no-child",`Subflow node "${k(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),i.length>0&&f.length>0&&s("error","subflow-spawn-and-parallel",`Subflow node "${k(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),i.length>0&&h&&s("error","subflow-spawn-and-map",`Subflow node "${k(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,g.qW)(j)||s("warning","subflow-parallel-var-name",`Subflow node "${k(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),h&&s("error","subflow-map-and-parallel-var",`Subflow node "${k(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),e.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===j})||s("warning","subflow-parallel-var-uncaptured",`Subflow node "${k(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&&h&&s("error","subflow-map-and-caller-fanout",`Subflow node "${k(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),f.length>0||i.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&s("warning","subflow-concurrency-limit",`Subflow node "${k(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(e.map(a=>[a.id,a])),b=new Set;for(let c of r){if(n(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let e=a.get(c.source),g=e?j(e):"unknown";if("process"!==g){s("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${e?k(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?s("warning","edge-condition-value",`Process node "${k(e)}" has an outgoing edge condition with no "value"; it will never match.`,e):"regex"!==d.kind||(0,f.wM)(d.value)||s("warning","edge-condition-regex",`Process node "${k(e)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,e)):s("warning","edge-condition-kind",`Process node "${k(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&&(r.some(a=>!n(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||s("warning","edge-condition-no-fallback",`Process node "${k(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 e){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,g.qW)(d)||s("warning","capture-var-name",`${"subflow"===j(b)?"Subflow":"Process"} node "${k(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 e){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),s("warning","var-ref-uncaptured",`${k(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 e){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,h.g2)(b.trim());(0,h.ng)(c)||s("warning","capture-kv-name",`${"subflow"===j(a)?"Subflow":"Process"} node "${k(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 e){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),s("warning","kv-ref-name",`${k(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 z){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let f=o(a.id,e,r),g=null,h=new Set,j=new Set;for(let l of(0,d.A$)(c)){if("handoff"===l.server){let b=`handoff:${l.name}`;if(j.has(b))continue;j.add(b),h.add(l.name),g||(g=p(a.id,e,r)),g.has(l.name)||s("warning","handoff-pill-obsolete",`Process node "${k(a)}" references handoff tool "${l.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=`${l.kind}:${l.server}:${l.name}`;if(!j.has(c))if(j.add(c),f.has(l.server)){if("tool"===l.kind&&b.serverTools&&b.serverTools[l.server]&&!b.serverTools[l.server].includes(l.name)){let b=(0,i.C)(l.server)?` (a stored server named "${l.server}" shadows the built-in — their toolsets may differ)`:"";s("warning","tool-unavailable",`Process node "${k(a)}" references tool "${l.name}" which server "${l.server}" does not currently expose.${b}`,a)}}else s("error","tool-pill-disconnected",`Process node "${k(a)}" references ${l.kind} "${l.name}" from server "${l.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a)}if(h.size>0)for(let b of g??p(a.id,e,r))h.has(b)||s("warning","handoff-target-unreferenced",`Process node "${k(a)}" can hand off to "${b}" but its prompt never references \${tool:handoff__${b}}, so the model may never route there.`,a)}if(b.serverTools)for(let a of z){let c=o(a.id,e,r),d=new Set;for(let e of c){let c=b.serverTools[e];if(Array.isArray(c)&&0===c.length&&s("warning","mcp-server-no-tools",`Process node "${k(a)}" is connected to MCP server "${e}", which currently exposes 0 tools. The connection has no effect until the server provides tools.`,a),Array.isArray(c))for(let b of Array.isArray(a.data?.properties?.enabledTools)?a.data.properties.enabledTools:[]){let f=`enabledTool:${e}:${b}`;if(!d.has(f)&&!c.includes(b)){d.add(f);let c=(0,i.C)(e)?` (stored server "${e}" shadows the built-in — their toolsets may differ)`:"";s("warning","tool-unavailable",`Process node "${k(a)}" has enabledTool "${b}" which server "${e}" does not currently expose.${c}`,a)}}}}let B=c.filter(a=>"error"===a.severity).length,C=c.length-B;return{issues:c,errorCount:B,warningCount:C,isRunnable:0===B}}},64551:(a,b,c)=>{c.d(b,{runFlow:()=>J});var d=c(18230),e=c(32205),f=c(76654),g=c(34115);let h=globalThis,i=h.__flujoSteeringInbox??(h.__flujoSteeringInbox=new Map);var j=c(96249),k=c(37860),l=c(26485),m=c(48720),n=c(59448),o=c(11659),p=c(79111),q=c(86028),r=c(12763),s=c(52122),t=c(54898);let u=(0,d.h)("backend/execution/flow/validateFlowForRun");async function v(a){let b,c,d,e;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)&&(d=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)}try{let b=new Map((Array.isArray(d)?d:[]).map(a=>[a.name,!!a.disabled])),c=new Set;for(let b of a.nodes??[]){let a=b?.data?.type??b?.type,d=b?.data?.properties?.boundServer;"mcp"===a&&"string"==typeof d&&d&&c.add(d)}let f=await Promise.all([...c].map(async a=>{if(b.get(a))return null;let c=await s.mcpService.listServerTools(a);if(c.error||!Array.isArray(c.tools))return null;let d=c.tools.map(a=>a?.name).filter(a=>"string"==typeof a);return[a,d]}));for(let a of(e={},f))a&&(e[a[0]]=a[1])}catch(a){u.warn("validateFlowObjectForRun: could not gather serverTools; skipping tool checks",a),e=void 0}return(0,t.nC)(a,{models:b,servers:c,serverTools:e})}async function w(a){let b=await o.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(44479),z=c(35796),A=c(81970),B=c(18205),C=c(22124);let D=(0,d.h)("backend/execution/flow/runFlow");o.flowService.getFlowByName||(o.flowService.getFlowByName=async a=>(await o.flowService.loadFlows()).find(b=>b.name===a)||null,D.info("Added getFlowByName method directly to flowService instance."));let E=o.flowService,F=f.persistConversationState;async function G(a){let b;if("boolean"==typeof a.unattended)return a.unattended;try{let c=a.flowSnapshot??(a.flowId?await o.flowService.getFlow(a.flowId)??void 0:void 0);b=c?.unattended}catch(a){D.debug("resolveUnattended: flow load failed; using source default",{err:a})}let c="boolean"==typeof b?b:"schedule"===a.source;return a.unattended=c,c}async function H(a,b,c){let d;if(!await G(a))return"complete";let e=a.currentNodeId;if(!e)return"complete";try{d=a.flowSnapshot??(a.flowId?await o.flowService.getFlow(a.flowId)??void 0:void 0)}catch(a){return D.debug("[Unattended] flow load failed; completing normally",{err:a}),"complete"}if(!d)return"complete";let f=d.nodes?.find(a=>a.id===e);if(!f||"process"!==f.type)return"complete";let g=new Set((d.nodes??[]).filter(a=>"mcp"===a.type).map(a=>a.id)),h=Array.from(new Set((d.edges??[]).filter(a=>a.source===e&&"mcpEdge"!==a.type&&a.data?.edgeType!=="mcp"&&a.data?.bidirectional!==!0&&!g.has(a.target)).map(a=>a.target))).filter(a=>(d.nodes??[]).some(b=>b.id===a));if(1===h.length){let d=h[0];D.info(`[Unattended] Process node ${e} ended on plain text; auto-advancing to sole forward successor ${d} for conv ${a.conversationId}.`);let f=a.currentNodeId;return a.currentNodeId=d,a.handoffRequested=void 0,c.delete(e),b({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:d,edgeId:`unattended-auto:${e}->${d}`}),"advanced"}if(h.length>1){let b=c.get(e)??0;if(b<1)return c.set(e,b+1),D.info(`[Unattended] Process node ${e} ended on plain text with ${h.length} forward successors; nudging to hand off (attempt ${b+1}/1).`),a.messages.push({id:crypto.randomUUID(),role:"user",content:"You ended your turn without calling a tool or handing off, but this is an unattended run that cannot stop at this step. To continue you MUST call one of your handoff tools to route to the next step. If your work at this step is complete, hand off to the finishing/next step now.",timestamp:Date.now(),processNodeId:e}),"nudged";D.warn(`[Unattended] Process node ${e} still did not hand off after 1 nudge(s); completing the run to avoid a loop.`)}return"complete"}async function I(a,b,c){try{let d,e=a.flowId;if(!e)return;try{d=(await o.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,k.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){D.warn("Failed to publish runFlow flow-run event:",a)}}async function J(a){let b,c,d,f=Date.now(),h=a.flujo??!0,k=a.requireApproval??!1,r=a.debug??!1,s=a.continueDebug??!1,t=a.userTurn??!1,u="ephemeral"===a.mode,G=a.messages??(void 0!==a.prompt?[{role:"user",content:a.prompt}]:[]),J={model:a.modelName,messages:G,processNodeId:a.processNodeId};D.info("runFlow invoked",{flowId:a.flowId,model:a.modelName,messageCount:G.length,mode:u?"ephemeral":"conversation",flujo:h,requireApproval:k,flujodebug:r,conversationId:a.conversationId});let K=a.conversationId||crypto.randomUUID(),L=`conversations/${K}`,M="new",N=!1;if(D.info(`Effective Conversation ID for this run: ${K}`,{providedId:a.conversationId}),e.FlowExecutor.conversationStates.has(K))c=e.FlowExecutor.conversationStates.get(K),D.info(`Resuming conversation ${K} from memory`,{currentNodeId:c.currentNodeId}),M="memory";else if(!u)try{(c=await (0,p.YM)(L,void 0))?(D.info(`Loaded conversation state from storage: ${K}`),M="storage",await (0,g.recoverMessagesFromLog)(c),e.FlowExecutor.conversationStates.set(K,c)):D.info(`No state found in storage for conversation: ${K}. Will create new state.`)}catch(a){D.warn(`Error loading conversation state from storage for ${K}:`,a)}if(c?((b=c).conversationId!==K&&(D.warn(`Loaded state's internal conversationId (${b.conversationId}) differs from effectiveConvId (${K}). Using effectiveConvId.`),b.conversationId=K),"new"!==M&&("completed"===b.status||"error"===b.status||void 0===b.status)&&(D.info(`Resuming completed/errored/fresh conversation ${K}. Resetting status to 'running'.`),N="error"===b.status,b.status="running",b.lastResponse=void 0,b.isCancelled=!1,"storage"===M&&e.FlowExecutor.conversationStates.set(K,b)),J.processNodeId&&"new"!==M&&(D.info(`Edit detected: Resetting currentNodeId for conversation ${K} to provided processNodeId: ${J.processNodeId}`),b.currentNodeId=J.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(K,b),D.verbose(`State updated in memory with reset currentNodeId: ${b.currentNodeId}`))):(D.info(`Creating new conversation state object for ID: ${K}`),b={trackingInfo:{executionId:crypto.randomUUID(),startTime:Date.now(),nodeExecutionTracker:(q.G.ENABLE_EXECUTION_TRACKER,[])},messages:[],flowId:"",conversationId:K,currentNodeId:void 0,status:"running",title:a.title?.trim()||"New Conversation",createdAt:Date.now(),updatedAt:Date.now(),debugMode:r,executionTrace:r&&q.G.ENABLE_EXECUTION_TRACKER?[]:void 0,variables:{}}),a.variables&&"object"==typeof a.variables)for(let[c,d]of(b.variables=b.variables??{},Object.entries(a.variables)))null!=d&&(b.variables[c]="string"==typeof d?d:String(d));if(b.requireApproval=k,a.source&&(b.source=a.source),a.plannedExecutionId&&(b.plannedExecutionId=a.plannedExecutionId),u&&(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 D.error(`runFlow aborted: subflow depth ${b.runDepth} exceeds max ${x.A}`),b.status="error",{status:"error",conversationId:K,outputText:"",messages:b.messages,error:{message:`Subflow recursion limit (${x.A}) exceeded`,statusCode:500},finalAction:l.O,sharedState:b};let O=[...b.messages??[]];if("new"===M){a.flowDefinition&&(b.flowSnapshot=a.flowDefinition,b.flowId=a.flowDefinition.id);let c=a.flowDefinition?a.flowDefinition.id:a.flowId;if(!c&&J.model){let a=J.model.substring(5),d=await E.getFlowByName(a);if(!d)return D.error(`Flow not found: ${a}`),{status:"error",conversationId:K,outputText:"",messages:b.messages,flowNotFound:{name:a},error:{message:`Flow not found: ${a}`,statusCode:400},finalAction:l.O,sharedState:b};c=d.id}if(!c)return D.error("No flow specified for run (neither flowId nor model provided)."),{status:"error",conversationId:K,outputText:"",messages:b.messages,error:{message:"No flow specified (provide flowId or model).",statusCode:400},finalAction:l.O,sharedState:b};b.flowId=c;let d=(J.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;let f=[...d].reverse().find(a=>"user"===a.role);f&&(b.lastUserMessageAt=f.timestamp??Date.now());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,z.oO)(a.content),D.verbose(`Updated conversation title for ${K} during init to: ${b.title}`))}await F(L,b),D.debug(`Saved initial state for new conversation ${K}.`)}catch(a){D.error(`Failed to save initial state for new conversation ${K}:`,a)}e.FlowExecutor.conversationStates.set(K,b)}else{if(J.messages&&J.messages.length>0&&(b.messages=J.messages.filter(a=>!(a.depth>0)).map(a=>({...a,id:a.id||crypto.randomUUID(),timestamp:a.timestamp||Date.now(),processNodeId:a.processNodeId||void 0})),D.info(`Updated conversation ${b.conversationId} with ${b.messages.length} messages from request`),t)){let a=[...b.messages].reverse().find(a=>"user"===a.role);a&&(b.lastUserMessageAt=a.timestamp??Date.now())}(t||void 0===b.debugMode)&&(b.debugMode=r),t&&(b.debugPendingToolCalls=void 0),b.debugMode&&q.G.ENABLE_EXECUTION_TRACKER&&!b.executionTrace&&(b.executionTrace=[])}try{await (0,g.reconcileConversationLog)(b,O);let a=(0,g.repairDanglingToolCalls)(b);a.length&&(D.info(`Repaired ${a.length} dangling tool call(s) for ${K} at run start (issue #256).`),await (0,g.appendRawForState)(b,a.map(a=>({type:"message",message:a}))))}catch(a){D.warn(`Conversation-log reconcile failed for ${K}; continuing`,a)}if(t&&"new"!==M&&!J.processNodeId){let a=b.messages.length>0?b.messages[b.messages.length-1]:void 0;a?.role==="user"&&a.processNodeId&&a.processNodeId!==b.currentNodeId&&(D.info(`New user turn for ${K}: directing execution to node ${a.processNodeId} (was ${b.currentNodeId}).`),b.currentNodeId=a.processNodeId,e.FlowExecutor.conversationStates.set(K,b))}if(N&&t&&!u&&"new"!==M&&!J.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 o.flowService.getFlow(b.flowId);a=c?.nodes?.find(a=>"start"===a.type)?.id}catch(a){D.warn(`Could not resolve start node for error-resume of ${K}`,a)}a&&a!==b.currentNodeId&&(D.info(`Error-resume for ${K}: replaying turn from entry node ${a} (was ${b.currentNodeId}).`),b.currentNodeId=a,e.FlowExecutor.conversationStates.set(K,b))}}t&&b.flowId&&(e.FlowExecutor.clearFlowCache(b.flowId),D.debug(`Cleared compiled-flow cache for ${b.flowId} at start of user turn ${K}.`));let P=!1,Q=0,R=new Map,S=new Map,T=a.emit??j.$.emitterFor(K),U=new Set(b.messages.map(a=>a.id).filter(a=>!!a)),V=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,T({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}:{}})},W=()=>{for(let a of b.messages)a.id||(a.id=crypto.randomUUID()),U.has(a.id)||(U.add(a.id),"system"!==a.role&&(T({type:"message",message:a,node:a.processNodeId?{nodeId:a.processNodeId}:void 0}),V(a)))};T({type:"run:start",flowId:b.flowId});let X=[];if(b.flowId)try{let a=b.flowSnapshot??await o.flowService.getFlow(b.flowId);if(a)for(let c of a.nodes||[]){let a=c.data?.properties?.boundServer;c.data?.type==="mcp"&&a&&(X.push(a),(0,A.F7)(a,{conversationId:K,getUnattended:()=>!!b.unattended}))}}catch(a){D.debug("Could not enumerate MCP servers for elicitation context; skipping",{err:a})}if((t||"new"===M)&&b.flowId)try{let a=b.flowSnapshot?await v(b.flowSnapshot):await w(b.flowId);if(!a.isRunnable){let c=a.issues.filter(a=>"error"===a.severity),e=`This flow can't run yet — please fix the following before running:
|
|
2
|
+
`+c.map(a=>`• ${a.message}`).join("\n");D.warn(`Pre-run validation blocked flow ${b.flowId} for conv ${K}`,{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=l.O,P=!0}}catch(a){D.warn(`Pre-run validation could not complete for ${b.flowId}; proceeding`,a)}let Y=()=>!!b.isCancelled||!!(0,y.isCancelledByAncestry)(b.parentRunId,e.FlowExecutor.conversationStates)&&(b.isCancelled=!0,!0),Z=async()=>{if(0===(i.get(K)?.length??0))return!1;if((()=>{let a=new Set;for(let c of b.messages)if("tool"===c.role){let b=c.tool_call_id;b&&a.add(b)}return b.messages.some(b=>"assistant"===b.role&&Array.isArray(b.tool_calls)&&b.tool_calls.some(b=>b.id&&!a.has(b.id)))})())return D.debug(`Steering message(s) waiting for ${K} but a tool exchange is in flight; deferring.`),!1;let a=function(a){let b=i.get(a);return b&&0!==b.length?(i.delete(a),b):[]}(K);if(0===a.length)return!1;try{for(let c of a)!c.processNodeId&&b.currentNodeId&&(c.processNodeId=b.currentNodeId);return b.messages.push(...a),b.lastUserMessageAt=a[a.length-1].timestamp??Date.now(),e.FlowExecutor.conversationStates.set(K,b),W(),b.ephemeral||await (0,g.appendRawForState)(b,a.map(a=>({type:"message",message:a}))),D.info(`Folded ${a.length} steering message(s) into the live run for ${K}.`),!0}catch(b){return!function(a,b){if(0===b.length)return;let c=i.get(a)??[];i.set(a,[...b,...c])}(K,a),D.warn(`Failed to fold steering message(s) for ${K}; re-queued`,b),!1}},$=!!b.debugMode&&!s,_=()=>{b.status="paused_debug",T({type:"run:paused",reason:"debug",node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0})};try{if(!P)for(;;){if(Q++,D.debug(`--- Starting Execution Step ${Q} for Conv ${K} ---`),Q>150){D.warn(`Max internal iterations (150) reached for conv ${K}. Breaking loop.`),d!==l.O&&(b.lastResponse={success:!1,error:"Maximum internal iterations (150) reached."},d=l.O);break}if(Y()){D.info(`Cancellation flag detected for conv ${K}. Terminating execution.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=l.O;break}if(await Z(),b.debugPendingToolCalls&&b.debugPendingToolCalls.length>0){let a=b.debugPendingToolCalls;b.debugPendingToolCalls=void 0,D.info(`[Debug Step] Executing ${a.length} pending tool call(s) for conv ${K}.`);let c=await m.s.processToolCalls({toolCalls:a,toolNameMap:b.toolNameMap,emit:T,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Y,mcpNodes:b.currentMCPNodes});if(!c.success){D.error(`Debug tool processing failed for conv ${K}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=l.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(K,b),W();try{b.updatedAt=Date.now(),await F(L,b)}catch(a){D.error(`Failed to save state after debug tool execution for conv ${K}:`,a)}if($){D.info(`[Debug Step] Paused after tool execution for conv ${K}.`),_();break}continue}if(!$&&b.breakpoints&&b.breakpoints.length>0){let a=await e.FlowExecutor.peekNextNodeId(b),c=b.breakpoints.includes("*");if(a&&(c||b.breakpoints.includes(a))&&b.lastBreakNodeId!==a){c&&(b.breakpoints=b.breakpoints.filter(a=>"*"!==a)),D.info(`Breakpoint hit at node ${a}${c?" (attach)":""} for conv ${K}. Pausing.`),b.status="paused_debug",b.debugMode=!0,b.lastBreakNodeId=a,T({type:"breakpoint:hit",node:{nodeId:a}}),T({type:"run:paused",reason:"breakpoint",node:{nodeId:a}});try{b.updatedAt=Date.now(),await F(L,b)}catch(a){D.error(`Failed to save state on breakpoint for conv ${K}:`,a)}break}a&&b.lastBreakNodeId&&a!==b.lastBreakNodeId&&(b.lastBreakNodeId=void 0)}if(b.messages.length>0){let a=b.messages.slice(-3);D.verbose(`Message history before step ${Q}`,a)}else D.verbose(`No messages in history before step ${Q}`);let a=await e.FlowExecutor.executeStep(b,T);if(b=a.sharedState,d=a.action,W(),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,z.oO)(a.content),D.verbose(`Updated conversation title for ${K} after step ${Q} to: ${b.title}`))}if(D.info(`Step ${Q} completed for conv ${K}. Action: ${d}`,{currentNodeId:b.currentNodeId}),D.verbose(`Shared state after step ${Q}`,b),D.debug(`[Action Handling] Step ${Q}: Received action "${d}" for conv ${K}`),d===l.O){D.info(`[Action Handling] Step ${Q}: Handling ERROR_ACTION for conv ${K}`),D.error(`Error action received during step ${Q} for conv ${K}`,{error:b.lastResponse});break}if(d===l.g4){if(D.info(`[Action Handling] Step ${Q}: Handling FINAL_RESPONSE_ACTION for conv ${K}`),D.info(`Final response action received at step ${Q} for conv ${K}`),b.forceSummaryTurn){b.forceSummaryTurn=!1,b.capped=!0,b.status="capped",D.info(`[#253] Graceful landing complete for conv ${K}; status=capped.`);break}let a=await H(b,T,R);if("advanced"===a||"nudged"===a){W(),e.FlowExecutor.conversationStates.set(K,b);continue}if(await Z()){D.info(`Steering message arrived as ${K} was completing; continuing the run to answer it.`),e.FlowExecutor.conversationStates.set(K,b);continue}b.status="completed",D.info(`Setting conversation status to 'completed' for conv ${K}`);break}if(d===l.Jp){D.info(`[Action Handling] Step ${Q}: Handling TOOL_CALL_ACTION for conv ${K}`),D.info(`Tool call action received at step ${Q} for conv ${K}`);let a=b.messages.length>0?b.messages[b.messages.length-1]:null;if(a?.role==="assistant"&&a.tool_calls)if(h){let c=b.currentNodeId;if(c&&!b.forceSummaryTurn){let d=(S.get(c)??0)+1;S.set(c,d);let f=b.turnBudgets?.[c]??C.m;if(d>=f){D.info(`[#253] Turn budget (${f}) reached for node ${c} on conv ${K}; forcing a graceful summary turn instead of executing tools.`);let d=Date.now(),h=a.tool_calls.map(a=>({id:crypto.randomUUID(),role:"tool",tool_call_id:a.id,content:"Turn budget reached: this tool was not executed. No further tool calls are possible. Provide a final text-only summary instead.",timestamp:d,processNodeId:c})),i={id:crypto.randomUUID(),role:"user",content:"SYSTEM NOTICE — TURN BUDGET REACHED. You have used up the maximum number of agentic turns allotted for this task, so no further tool calls are possible. This overrides every previous instruction to keep working or to call a tool. Produce a single, final, text-only message that:\n1. Summarizes what was accomplished so far.\n2. Lists the tasks that remain unfinished.\n3. Recommends concrete next steps for whoever continues this work.\nDo NOT attempt to call any tool. Answer with plain text only.",timestamp:d+1,processNodeId:c};if(b.messages.push(...h,i),b.forceSummaryTurn=!0,b.cappedReason="maxTurns",e.FlowExecutor.conversationStates.set(K,b),W(),!b.ephemeral)try{await (0,g.appendRawForState)(b,[...h,i].map(a=>({type:"message",message:a})))}catch(a){D.warn(`Failed to append graceful-cap messages to log for ${K}`,a)}continue}}if(k&&"fail"===b.onApprovalRequired){let c=a.tool_calls[0],e=c&&"function"===c.type?c.function.name:"unknown";D.info(`[flujo=true, onApprovalRequired=fail] Failing fast for tool "${e}" (conv ${K})`),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=l.O;break}if(k){let c=[],d=[],f=b.permissionRules??[],g=b.savedPermissionRules??[];if(f.length>0||g.length>0)for(let e of a.tool_calls){let a=(0,n.ud)(e.function.name,b.toolNameMap);if(!a){c.push(e);continue}let h={};try{h=JSON.parse(e.function.arguments)}catch{}let i=(0,B.SX)(h),j=(0,B.R6)(f,g,a.server,a.tool,i);"deny"===j||"allow"===j?d.push(e):c.push(e)}else c.push(...a.tool_calls);if(d.length>0){let a=await m.s.processToolCalls({toolCalls:d,toolNameMap:b.toolNameMap,emit:T,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Y,mcpNodes:b.currentMCPNodes,permissionRules:f,savedPermissionRules:g,unattended:b.unattended});if(a.success){let c=a.value.toolCallMessages.map(a=>({...a,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:b.currentNodeId}));b.messages.push(...c),W()}}if(0===c.length){e.FlowExecutor.conversationStates.set(K,b);continue}D.info(`[flujo=true, requireApproval=true] Pausing execution for tool approval for conv ${K}`),b.status="awaiting_tool_approval",b.pendingToolCalls=c,b.lastResponse=void 0,e.FlowExecutor.conversationStates.set(K,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,z.oO)(a.content),D.verbose(`Updated conversation title for ${K} before pausing to: ${b.title}`))}await F(L,b),D.verbose(`Saved state before pausing for approval for conv ${K}`)}catch(a){D.error(`Failed to save state before pausing for approval for conv ${K}:`,a)}T({type:"run:awaiting_approval",pendingToolCalls:a.tool_calls});break}if($){D.info(`[Debug Step] Paused before executing ${a.tool_calls.length} tool call(s) for conv ${K}.`),b.debugPendingToolCalls=a.tool_calls,e.FlowExecutor.conversationStates.set(K,b);try{b.updatedAt=Date.now(),await F(L,b)}catch(a){D.error(`Failed to save state before debug tool pause for conv ${K}:`,a)}_();break}{D.info(`[flujo=true, requireApproval=false] Processing ${a.tool_calls.length} tools internally for conv ${K}`);let c=await m.s.processToolCalls({toolCalls:a.tool_calls,toolNameMap:b.toolNameMap,emit:T,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Y,mcpNodes:b.currentMCPNodes,permissionRules:b.permissionRules,savedPermissionRules:b.savedPermissionRules,unattended:b.unattended});if(!c.success){D.error(`Internal tool processing failed for conv ${K}`,{error:c.error}),b.lastResponse={success:!1,error:"Tool processing failed",errorDetails:c.error},d=l.O;break}D.info(`Adding ${c.value.toolCallMessages.length} tool result messages for conv ${K}`);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(K,b),W(),D.info(`Continuing loop for conv ${K} after internal tool processing (no approval needed).`);continue}}else{D.info(`[flujo=false] Tool call action received for conv ${K}. Checking tool types.`);let c=a.tool_calls||[],f=[],g=[];if(c.forEach(a=>{"function"===a.type&&(0,n.$9)(a.function.name,b.toolNameMap)?(D.verbose("tool is internal:",a.function.name),f.push(a)):(D.verbose("tool is external:",a.function.name),g.push(a))}),f.length>0){D.info(`[flujo=false] Processing ${f.length} internal tools for conv ${K}. External tools (${g.length}) will be ignored this step.`);let a=await m.s.processToolCalls({toolCalls:f,toolNameMap:b.toolNameMap,emit:T,conversationId:b.ephemeral?void 0:b.conversationId,node:b.currentNodeId?{nodeId:b.currentNodeId}:void 0,shouldAbort:Y,mcpNodes:b.currentMCPNodes});if(!a.success){D.error(`[flujo=false] Internal tool processing failed for conv ${K}`,{error:a.error}),b.lastResponse={success:!1,error:"Internal tool processing failed",errorDetails:a.error},d=l.O;break}D.info(`Adding ${a.value.toolCallMessages.length} internal tool result messages for conv ${K}`);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(K,b),D.info(`Continuing loop for conv ${K} after internal tool processing (flujo=false).`);continue}if(g.length>0){D.info(`[flujo=false] Found ${g.length} external tools for conv ${K}. 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
|
+
<${a}>${b}</${a}>`}a.push(`<${b.function.name}>${d}
|
|
4
|
+
</${b.function.name}>`)}catch(c){D.error(`[flujo=false] Failed to parse arguments for external tool ${b.function.name}`,{args:b.function.arguments,error:c,convId:K}),a.push(`<${b.function.name}>
|
|
5
|
+
<error>Failed to parse arguments: ${c instanceof Error?c.message:String(c)}</error>
|
|
6
|
+
</${b.function.name}>`)}b.lastResponse={_flujo_xml_tools:a.join("\n\n")},d=l.g4,D.info(`[flujo=false] Prepared XML for external tools. Exiting loop for conv ${K}.`);break}D.warn(`[flujo=false] TOOL_CALL_ACTION received for conv ${K} but no tools found after classification. Treating as final.`),d=l.g4;break}D.warn(`TOOL_CALL_ACTION received for conv ${K} but no tool_calls found in last message. Treating as final.`),d=l.g4;break}let c=await e.FlowExecutor.resolveHandoff(b,d);if(c.isSuccessorEdge){D.info(`[Action Handling] Step ${Q}: Handling Handoff Action (Edge ID) for conv ${K}`),D.info(`Handoff action received for conv ${K}. Edge: ${d}`);let a=c.targetNodeId;if("string"==typeof a&&a.length>0){b.handoffInput=void 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&&D.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){D.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}),D.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}:{}},D.info(`Captured caller handoff input for node ${a}`,{promptChars:l.length,spawnBriefs:k.length,fanoutCount:e?.length??0});else try{let c=await o.flowService.getFlow(b.flowId),d=c?.nodes?.find(b=>b.id===a),e=d?.data?.properties,f=d?.type==="subflow"?e?.promptTemplate:e?.isolatedPrompt;d?.type!=="subflow"&&d?.type!=="process"||e?.inputMode!=="isolated"||e?.allowCallerPrompt===!1||e?.allowCallerFanout===!0||f?.trim()||D.warn(`Handoff to isolated ${d?.type} node ${a} has neither a caller-supplied prompt nor an authored message; the target 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){D.debug("Issue #169 empty-prompt handoff guard check failed (non-fatal)",{guardErr:a})}}else D.warn(`Handoff action received for edge ${d}, but the last message was not an assistant message with tool calls.`);W();let f=b.currentNodeId;if(b.currentNodeId=a,b.handoffRequested=void 0,T({type:"handoff",from:f?{nodeId:f}:void 0,toNodeId:a,edgeId:d}),D.info(`Transitioning conv ${K} to node ${b.currentNodeId}`),e.FlowExecutor.conversationStates.set(K,b),$){D.info(`[Debug Step] Paused after handoff to node ${b.currentNodeId} for conv ${K}.`),_();break}D.info(`Continuing loop for conv ${K} after handoff.`);continue}D.error(`Handoff failed for conv ${K}: Successor node for edge ${d} has invalid ID.`),b.lastResponse={success:!1,error:`Handoff failed: Target node for edge ${d} has invalid ID.`},d=l.O;break}if(d===l.E5){D.info(`[Action Handling] Step ${Q}: Handling STAY_ON_NODE_ACTION for conv ${K}`),D.info(`Stay on node action received for conv ${K} at step ${Q}`);break}D.warn(`Unrecognized action '${d}' received at step ${Q} for conv ${K}. Treating as final response.`),d=l.g4;break}}catch(a){if(D.error(`Unhandled error during execution loop for conv ${K}`,{loopError:a}),d!==l.O&&Y()&&(b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=l.O),d!==l.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=l.O}}for(let a of(d!==l.O&&Y()&&(D.info(`Cancellation flag set at run end for conv ${K}; reporting cancelled instead of '${b.status}'.`),b.status="error",b.lastResponse={success:!1,error:"Execution cancelled by user."},d=l.O),d===l.O&&"error"!==b.status&&(b.status="error"),X))(0,A.mR)(a);let aa=Date.now()-f,ab=b.status||(d===l.g4?"completed":d===l.O?"error":"running");if(D.info(`Execution finished for conv ${K}. Final Action: ${d}, Final Status: ${ab}`,{duration:`${aa}ms`}),W(),("completed"===ab||"error"===ab||"capped"===ab)&&(T({type:"run:done",status:ab}),"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;I(b,"capped"===ab?"completed":ab,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,z.oO)(a.content),D.verbose(`Updated conversation title for ${K} before final return to: ${b.title}`))}await F(L,b),D.debug(`Saved final state for conversation ${K} before returning.`)}catch(a){D.error(`Failed to save final state for conversation ${K}:`,a)}(0,y.isConversationDeleted)(K)?e.FlowExecutor.conversationStates.delete(K):e.FlowExecutor.conversationStates.set(K,b);let ac=()=>{u&&("completed"===b.status||"error"===b.status)&&e.FlowExecutor.conversationStates.delete(K)},ad={conversationId:b.conversationId||K,messages:b.messages,usage:b.usage,finalAction:d,sharedState:b};if("paused_debug"===b.status)return D.info(`Returning paused debug state for conv ${K}`),{...ad,status:"paused_debug",outputText:"",pendingToolCalls:b.pendingToolCalls};if("error"===b.status||d===l.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},D.error(`Returning error result for conv ${K}`,{errorMessage:c,errorDetails:a,statusCode:d}),"error"!==b.status&&(b.status="error"),ac(),{...ad,status:"error",outputText:"",error:{message:c,details:a,statusCode:d}}}let ae=b.messages.length>0?b.messages[b.messages.length-1]:null,af="",ag="";"object"==typeof b.lastResponse&&null!==b.lastResponse&&"_flujo_xml_tools"in b.lastResponse?(ag=b.lastResponse._flujo_xml_tools,af=ae?.role==="assistant"&&"string"==typeof ae.content?ae.content:"",af+=(af?"\n\n":"")+ag,b.lastResponse=af):af="string"==typeof b.lastResponse?b.lastResponse:ae?.role==="assistant"&&"string"==typeof ae.content?ae.content:d!==l.Jp||h?"Processing complete.":"";let ah=ag?void 0:ae?.role==="assistant"?ae.tool_calls:void 0;return D.info(`Returning success result for conv ${K}`,{action:d,status:b.status,flujo:h,requireApproval:k,flujodebug:r}),ac(),{...ad,status:b.status||(d===l.g4?"completed":"running"),outputText:af,toolCalls:ah,pendingToolCalls:b.pendingToolCalls}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=4663,exports.ids=[4663],exports.modules={15059:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2m6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56M12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96M4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2s.06 1.34.14 2zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56m2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8M12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96M14.34 14H9.66c-.09-.66-.16-1.32-.16-2s.07-1.35.16-2h4.68c.09.65.16 1.32.16 2s-.07 1.34-.16 2m.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56M16.36 14c.08-.66.14-1.32.14-2s-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2z"}),"Language")},25750:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"m12 16.5 4-4h-3v-9h-2v9H8zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2"}),"SystemUpdateAlt")},29320:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39"}),"Public")},30717:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8z"}),"Folder")},30873:(a,b,c)=>{c.d(b,{A:()=>I});var d=c(38301),e=c(2783),f=c(74846),g=c(62383),h=c(69979);let i=function(a={}){let{autoHideDuration:b=null,disableWindowBlurListener:c=!1,onClose:e,open:i,resumeHideDuration:j}=a,k=(0,f.A)();d.useEffect(()=>{if(i)return document.addEventListener("keydown",a),()=>{document.removeEventListener("keydown",a)};function a(a){a.defaultPrevented||"Escape"!==a.key||e?.(a,"escapeKeyDown")}},[i,e]);let l=(0,g.A)((a,b)=>{e?.(a,b)}),m=(0,g.A)(a=>{e&&null!=a&&k.start(a,()=>{l(null,"timeout")})});d.useEffect(()=>(i&&m(b),k.clear),[i,b,m,k]);let n=k.clear,o=d.useCallback(()=>{null!=b&&m(null!=j?j:.5*b)},[b,j,m]);return d.useEffect(()=>{if(!c&&i)return window.addEventListener("focus",o),window.addEventListener("blur",n),()=>{window.removeEventListener("focus",o),window.removeEventListener("blur",n)}},[c,i,o,n]),{getRootProps:(b={})=>{let c={...(0,h.A)(a),...(0,h.A)(b)};return{role:"presentation",...b,...c,onBlur:a=>{let b=c.onBlur;b?.(a),o()},onFocus:a=>{let b=c.onFocus;b?.(a),n()},onMouseEnter:a=>{let b=c.onMouseEnter;b?.(a),n()},onMouseLeave:a=>{let b=c.onMouseLeave;b?.(a),o()}}},onClickAway:a=>{e?.(a,"clickaway")}}};var j=c(67943),k=c(46757),l=c(51939);function m(a){return a.substring(2).toLowerCase()}function n(a){let{children:b,disableReactTree:c=!1,mouseEvent:e="onClick",onClickAway:f,touchEvent:h="onTouchEnd"}=a,i=d.useRef(!1),n=d.useRef(null),o=d.useRef(!1),p=d.useRef(!1);d.useEffect(()=>(setTimeout(()=>{o.current=!0},0),()=>{o.current=!1}),[]);let q=(0,j.A)((0,l.A)(b),n),r=(0,g.A)(a=>{let b=p.current;p.current=!1;let d=(0,k.A)(n.current);if(!(!o.current||!n.current||"clientX"in a&&(d.documentElement.clientWidth<a.clientX||d.documentElement.clientHeight<a.clientY))){if(i.current){i.current=!1;return}(a.composedPath?a.composedPath().includes(n.current):!d.documentElement.contains(a.target)||n.current.contains(a.target))||!c&&b||f(a)}}),s=a=>c=>{p.current=!0;let d=b.props[a];d&&d(c)},t={ref:q};return!1!==h&&(t[h]=s(h)),d.useEffect(()=>{if(!1!==h){let a=m(h),b=(0,k.A)(n.current),c=()=>{i.current=!0};return b.addEventListener(a,r),b.addEventListener("touchmove",c),()=>{b.removeEventListener(a,r),b.removeEventListener("touchmove",c)}}},[r,h]),!1!==e&&(t[e]=s(e)),d.useEffect(()=>{if(!1!==e){let a=m(e),b=(0,k.A)(n.current);return b.addEventListener(a,r),()=>{b.removeEventListener(a,r)}}},[r,e]),d.cloneElement(b,t)}var o=c(18168),p=c(60839),q=c(68333),r=c(6636),s=c(6638),t=c(4927),u=c(43249),v=c(37489),w=c(54573),x=c(29565),y=c(33105);function z(a){return(0,y.Ay)("MuiSnackbarContent",a)}(0,x.A)("MuiSnackbarContent",["root","message","action"]);var A=c(21124);let B=(0,o.Ay)(w.A,{name:"MuiSnackbarContent",slot:"Root",overridesResolver:(a,b)=>b.root})((0,q.A)(({theme:a})=>{let b="light"===a.palette.mode?.8:.98,c=(0,v.tL)(a.palette.background.default,b);return{...a.typography.body2,color:a.vars?a.vars.palette.SnackbarContent.color:a.palette.getContrastText(c),backgroundColor:a.vars?a.vars.palette.SnackbarContent.bg:c,display:"flex",alignItems:"center",flexWrap:"wrap",padding:"6px 16px",borderRadius:(a.vars||a).shape.borderRadius,flexGrow:1,[a.breakpoints.up("sm")]:{flexGrow:"initial",minWidth:288}}})),C=(0,o.Ay)("div",{name:"MuiSnackbarContent",slot:"Message",overridesResolver:(a,b)=>b.message})({padding:"8px 0"}),D=(0,o.Ay)("div",{name:"MuiSnackbarContent",slot:"Action",overridesResolver:(a,b)=>b.action})({display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}),E=d.forwardRef(function(a,b){let c=(0,r.b)({props:a,name:"MuiSnackbarContent"}),{action:d,className:f,message:g,role:h="alert",...i}=c,j=(a=>{let{classes:b}=a;return(0,e.A)({root:["root"],action:["action"],message:["message"]},z,b)})(c);return(0,A.jsxs)(B,{role:h,square:!0,elevation:6,className:(0,u.A)(j.root,f),ownerState:c,ref:b,...i,children:[(0,A.jsx)(C,{className:j.message,ownerState:c,children:g}),d?(0,A.jsx)(D,{className:j.action,ownerState:c,children:d}):null]})});function F(a){return(0,y.Ay)("MuiSnackbar",a)}(0,x.A)("MuiSnackbar",["root","anchorOriginTopCenter","anchorOriginBottomCenter","anchorOriginTopRight","anchorOriginBottomRight","anchorOriginTopLeft","anchorOriginBottomLeft"]);var G=c(20385);let H=(0,o.Ay)("div",{name:"MuiSnackbar",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,b[`anchorOrigin${(0,s.A)(c.anchorOrigin.vertical)}${(0,s.A)(c.anchorOrigin.horizontal)}`]]}})((0,q.A)(({theme:a})=>({zIndex:(a.vars||a).zIndex.snackbar,position:"fixed",display:"flex",left:8,right:8,justifyContent:"center",alignItems:"center",variants:[{props:({ownerState:a})=>"top"===a.anchorOrigin.vertical,style:{top:8,[a.breakpoints.up("sm")]:{top:24}}},{props:({ownerState:a})=>"top"!==a.anchorOrigin.vertical,style:{bottom:8,[a.breakpoints.up("sm")]:{bottom:24}}},{props:({ownerState:a})=>"left"===a.anchorOrigin.horizontal,style:{justifyContent:"flex-start",[a.breakpoints.up("sm")]:{left:24,right:"auto"}}},{props:({ownerState:a})=>"right"===a.anchorOrigin.horizontal,style:{justifyContent:"flex-end",[a.breakpoints.up("sm")]:{right:24,left:"auto"}}},{props:({ownerState:a})=>"center"===a.anchorOrigin.horizontal,style:{[a.breakpoints.up("sm")]:{left:"50%",right:"auto",transform:"translateX(-50%)"}}}]}))),I=d.forwardRef(function(a,b){let c=(0,r.b)({props:a,name:"MuiSnackbar"}),f=(0,p.A)(),g={enter:f.transitions.duration.enteringScreen,exit:f.transitions.duration.leavingScreen},{action:h,anchorOrigin:{vertical:j,horizontal:k}={vertical:"bottom",horizontal:"left"},autoHideDuration:l=null,children:m,className:o,ClickAwayListenerProps:q,ContentProps:u,disableWindowBlurListener:v=!1,message:w,onBlur:x,onClose:y,onFocus:z,onMouseEnter:B,onMouseLeave:C,open:D,resumeHideDuration:I,slots:J={},slotProps:K={},TransitionComponent:L,transitionDuration:M=g,TransitionProps:{onEnter:N,onExited:O,...P}={},...Q}=c,R={...c,anchorOrigin:{vertical:j,horizontal:k},autoHideDuration:l,disableWindowBlurListener:v,TransitionComponent:L,transitionDuration:M},S=(a=>{let{classes:b,anchorOrigin:c}=a,d={root:["root",`anchorOrigin${(0,s.A)(c.vertical)}${(0,s.A)(c.horizontal)}`]};return(0,e.A)(d,F,b)})(R),{getRootProps:T,onClickAway:U}=i({...R}),[V,W]=d.useState(!0),X={slots:{transition:L,...J},slotProps:{content:u,clickAwayListener:q,transition:P,...K}},[Y,Z]=(0,G.A)("root",{ref:b,className:[S.root,o],elementType:H,getSlotProps:T,externalForwardedProps:{...X,...Q},ownerState:R}),[$,{ownerState:_,...aa}]=(0,G.A)("clickAwayListener",{elementType:n,externalForwardedProps:X,getSlotProps:a=>({onClickAway:(...b)=>{a.onClickAway?.(...b),U(...b)}}),ownerState:R}),[ab,ac]=(0,G.A)("content",{elementType:E,shouldForwardComponentProp:!0,externalForwardedProps:X,additionalProps:{message:w,action:h},ownerState:R}),[ad,ae]=(0,G.A)("transition",{elementType:t.A,externalForwardedProps:X,getSlotProps:a=>({onEnter:(...b)=>{a.onEnter?.(...b),((a,b)=>{W(!1),N&&N(a,b)})(...b)},onExited:(...b)=>{a.onExited?.(...b),(a=>{W(!0),O&&O(a)})(...b)}}),additionalProps:{appear:!0,in:D,timeout:M,direction:"top"===j?"down":"up"},ownerState:R});return!D&&V?null:(0,A.jsx)($,{...aa,...J.clickAwayListener&&{ownerState:_},children:(0,A.jsx)(Y,{...Z,children:(0,A.jsx)(ad,{...ae,children:m||(0,A.jsx)(ab,{...ac})})})})})},46410:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2m0 12H4V8h16z"}),"FolderOpen")},51694:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M4 7v2c0 .55-.45 1-1 1H2v4h1c.55 0 1 .45 1 1v2c0 1.65 1.35 3 3 3h3v-2H7c-.55 0-1-.45-1-1v-2c0-1.3-.84-2.42-2-2.83v-.34C5.16 11.42 6 10.3 6 9V7c0-.55.45-1 1-1h3V4H7C5.35 4 4 5.35 4 7m17 3c-.55 0-1-.45-1-1V7c0-1.65-1.35-3-3-3h-3v2h3c.55 0 1 .45 1 1v2c0 1.3.84 2.42 2 2.83v.34c-1.16.41-2 1.52-2 2.83v2c0 .55-.45 1-1 1h-3v2h3c1.65 0 3-1.35 3-3v-2c0-.55.45-1 1-1h1v-4z"}),"DataObject")},52399:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8z"}),"ArrowUpward")},55641:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M16.91 14.09 17 14l2 2 4-4.04L21 10h-8.17zM3.98 6.81C2.2 7.85 1 9.79 1 12c0 3.31 2.69 6 6 6 2.21 0 4.15-1.2 5.18-2.99l7.59 7.59 1.41-1.41L2.81 2.81 1.39 4.22zm5.93 5.93C9.58 14.03 8.4 15 7 15c-1.65 0-3-1.35-3-3 0-1.4.97-2.58 2.26-2.91z"}),"KeyOff")},64956:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M11 7 9.6 8.4l2.6 2.6H2v2h10.2l-2.6 2.6L11 17l5-5zm9 12h-8v2h8c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-8v2h8z"}),"Login")},71756:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"m1 9 2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9m8 8 3 3 3-3c-1.65-1.66-4.34-1.66-6 0m-4-4 2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13"}),"Wifi")},83013:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M4.5 11h-2V9H1v6h1.5v-2.5h2V15H6V9H4.5zm2.5-.5h1.5V15H10v-4.5h1.5V9H7zm5.5 0H14V15h1.5v-4.5H17V9h-4.5zm9-1.5H18v6h1.5v-2h2c.8 0 1.5-.7 1.5-1.5v-1c0-.8-.7-1.5-1.5-1.5m0 2.5h-2v-1h2z"}),"Http")},91314:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"}),"Home")},91901:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)([(0,e.jsx)("circle",{cx:"20",cy:"12",r:"2"},"0"),(0,e.jsx)("circle",{cx:"4",cy:"12",r:"2"},"1"),(0,e.jsx)("circle",{cx:"12",cy:"20",r:"2"},"2"),(0,e.jsx)("path",{d:"M10.05 8.59 6.03 4.55h-.01l-.31-.32-1.42 1.41 4.02 4.05.01-.01.31.32zm3.893.027 4.405-4.392L19.76 5.64l-4.405 4.393zM10.01 15.36l-1.42-1.41-4.03 4.01-.32.33 1.41 1.41 4.03-4.02zm9.75 2.94-3.99-4.01-.36-.35L14 15.35l3.99 4.01.35.35z"},"3"),(0,e.jsx)("circle",{cx:"12",cy:"4",r:"2"},"4")],"Stream")},95786:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2m-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2m3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1z"}),"Lock")},98810:(a,b,c)=>{c.d(b,{A:()=>f});var d=c(11801),e=c(21124);let f=(0,d.A)((0,e.jsx)("path",{d:"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8zM6 20V4h7v5h5v11z"}),"InsertDriveFileOutlined")}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=4671,exports.ids=[4671],exports.modules={84671:(a,b,c)=>{c.d(b,{nC:()=>p});var d=c(49181),e=c(89224),f=c(67512),g=c(41527),h=c(58505);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,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())}function p(a,b={}){let c=[],e=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=e.filter(a=>"start"===i(a)),x=e.filter(a=>"finish"===i(a)),y=e.filter(a=>"process"===i(a)),z=e.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 e.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 e.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 e.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,f=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&f.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 h=!0===c.mapOverList;h&&f.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),h&&!d&&0===f.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 i=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];i.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),i.length>0&&f.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),i.length>0&&h&&r("error","subflow-spawn-and-map",`Subflow node "${j(a)}" combines "spawnBriefs" with "mapOverList"; use one lane source or the other.`,a);let k="string"==typeof c.parallelSubflowIdsVar?c.parallelSubflowIdsVar.trim():"";if(k&&((0,g.qW)(k)||r("warning","subflow-parallel-var-name",`Subflow node "${j(a)}" reads dynamic fan-out targets from "${k}", 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),h&&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),e.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===k})||r("warning","subflow-parallel-var-uncaptured",`Subflow node "${j(a)}" reads dynamic fan-out targets from variable "${k}", 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&&h&&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),f.length>0||i.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(e.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 e){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 e){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 e){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 e){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,e,q),g=null,h=new Set,i=new Set;for(let k of(0,d.A$)(c)){if("handoff"===k.server){let b=`handoff:${k.name}`;if(i.has(b))continue;i.add(b),h.add(k.name),g||(g=o(a.id,e,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}`;!i.has(c)&&(i.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(h.size>0)for(let b of g??o(a.id,e,q))h.has(b)||r("warning","handoff-target-unreferenced",`Process node "${j(a)}" can hand off to "${b}" but its prompt never references \${tool:handoff__${b}}, so the model may never route there.`,a)}if(b.serverTools)for(let a of y)for(let c of n(a.id,e,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}}}};
|
|
1
|
+
"use strict";exports.id=4671,exports.ids=[4671],exports.modules={84671:(a,b,c)=>{c.d(b,{nC:()=>q});var d=c(49181),e=c(89224),f=c(67512),g=c(41527),h=c(58505),i=c(54413);function j(a){return a.data?.type??a.type??"unknown"}function k(a){return a.data?.label||a.id}function l(a){return a.data?.edgeType==="mcp"}function m(a){return a.data?.edgeType==="resource"}function n(a){return l(a)||m(a)}function o(a,b,c){let d=new Map(b.map(a=>[a.id,a])),e=new Set;for(let b of c){if(!l(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"!==j(f))continue;let g=f.data?.properties?.boundServer;"string"==typeof g&&g&&e.add(g)}return e}function p(a,b,c){let d=new Map(b.map(a=>[a.id,a])),f=[],g=new Set;for(let b of c){if(n(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:j(a)}));return new Set((0,e.E9)(h).values())}function q(a,b={}){let c=[],e=Array.isArray(a?.nodes)?a.nodes:[],r=Array.isArray(a?.edges)?a.edges:[],s=(a,b,d,e)=>c.push({severity:a,code:b,message:d,nodeId:e?.id,nodeLabel:e?k(e):void 0}),t=new Map((b.models??[]).map(a=>[a.id,a])),u=new Map((b.servers??[]).map(a=>[a.name,a])),v=!!b.models,w=!!b.servers,x=e.filter(a=>"start"===j(a)),y=e.filter(a=>"finish"===j(a)),z=e.filter(a=>"process"===j(a)),A=e.filter(a=>"mcp"===j(a));if(0===x.length)s("error","no-start-node","The flow has no Start node, so it has no entry point.");else if(x.length>1)for(let a of x.slice(1))s("error","multiple-start-nodes","The flow has more than one Start node; only one is allowed.",a);for(let a of(0===y.length&&s("warning","no-finish-node","The flow has no Finish node; it will run but never reaches a defined end."),z)){let b=a.data?.properties??{},c=b.boundModel;if(c){if(v&&!t.has(c)){let c="string"==typeof b.modelName&&b.modelName?` (was "${b.modelName}")`:"";s("error","process-model-missing",`Process node "${k(a)}" is bound to a model that no longer exists${c}.`,a)}}else s("error","process-missing-model",`Process node "${k(a)}" has no model bound.`,a)}for(let a of A){let b=(a.data?.properties??{}).boundServer;if(b){if(w&&!u.has(b))s("warning","mcp-server-missing",`MCP node "${k(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(w){let c=u.get(b);if(c.status&&"connected"!==c.status){let d="disabled"===c.status?"disabled":`not connected (${c.status})`;s("warning","mcp-server-disconnected",`MCP node "${k(a)}" is bound to server "${b}", which is currently ${d}. It will provide tools again once it reconnects.`,a)}}}else s("warning","mcp-missing-server",`MCP node "${k(a)}" is not bound to a server.`,a);r.some(b=>l(b)&&(b.source===a.id||b.target===a.id))||s("warning","mcp-node-unconnected",`MCP node "${k(a)}" is not connected to any Process node.`,a)}for(let a of e.filter(a=>"resource"===j(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||s("warning","resource-missing-binding",`Resource node "${k(a)}" has no ${!d?"server":"resource URI"} bound; connected steps will receive nothing.`,a),"run"!==c||f||s("warning","resource-missing-binding",`Resource node "${k(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)&&s("warning","resource-run-name",`Resource node "${k(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&&w&&!u.has(d)&&s("warning","resource-server-missing",`Resource node "${k(a)}" is bound to server "${d}", which isn't in your current MCP server list.`,a);let h=r.filter(b=>m(b)&&(b.source===a.id||b.target===a.id));0===h.length&&s("warning","resource-node-unconnected",`Resource node "${k(a)}" is not connected to any Process node.`,a);let i=h.filter(b=>b.target===a.id);"mcp"===c&&i.length>0&&s("error","resource-produce-static",`Resource node "${k(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&&s("warning","resource-multiple-producers",`Resource node "${k(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&&s("warning","resource-consumed-never-produced",`Resource node "${k(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 e.filter(a=>"signal"===j(a))){let b=a.data?.properties??{};("string"==typeof b.topic?b.topic.trim():"")||s("warning","signal-missing-topic",`Signal node "${k(a)}" has no topic; it emits nothing. Give it a topic that a flow-event trigger can listen for.`,a)}if(x.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)!n(b)&&(c(b.source,b.target),b.data?.bidirectional&&c(b.target,b.source));return b}(r);for(let b of x)a.get(b.id)?.length||s("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}(x.map(a=>a.id),a);for(let a of[...z,...y])b.has(a.id)||s("warning","unreachable-node",`${"finish"===j(a)?"Finish":"Process"} node "${k(a)}" is not reachable from the Start node.`,a)}for(let a of e.filter(a=>"subflow"===j(a))){let b=r.filter(b=>!n(b)&&(b.source===a.id||b.target===a.id&&!!b.data?.bidirectional));b.length>1&&s("error","subflow-multiple-outgoing",`Subflow node "${k(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,f=Array.isArray(c.parallelSubflowIds)?c.parallelSubflowIds.filter(a=>"string"==typeof a&&!!a):[];d&&f.length>0&&s("error","subflow-both-targets",`Subflow node "${k(a)}" sets both a single "subflowId" and "parallelSubflowIds"; use one or the other.`,a);let h=!0===c.mapOverList;h&&f.length>0&&s("error","subflow-map-and-parallel",`Subflow node "${k(a)}" combines "mapOverList" with "parallelSubflowIds"; map-over-list runs a single child once per item and cannot be combined with parallel fan-out.`,a),h&&!d&&0===f.length&&s("error","subflow-map-no-child",`Subflow node "${k(a)}" has "mapOverList" but no child flow ("subflowId"); select a flow to run once per item.`,a);let i=Array.isArray(c.spawnBriefs)?c.spawnBriefs.filter(a=>"string"==typeof a&&""!==a.trim()):[];i.length>0&&!d&&s("error","subflow-spawn-no-child",`Subflow node "${k(a)}" has spawn briefs but no sub-agent flow ("subflowId"); select the flow to spawn once per brief.`,a),i.length>0&&f.length>0&&s("error","subflow-spawn-and-parallel",`Subflow node "${k(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),i.length>0&&h&&s("error","subflow-spawn-and-map",`Subflow node "${k(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,g.qW)(j)||s("warning","subflow-parallel-var-name",`Subflow node "${k(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),h&&s("error","subflow-map-and-parallel-var",`Subflow node "${k(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),e.some(a=>{let b=a.data?.properties?.captureVariable;return"string"==typeof b&&b.trim()===j})||s("warning","subflow-parallel-var-uncaptured",`Subflow node "${k(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&&h&&s("error","subflow-map-and-caller-fanout",`Subflow node "${k(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),f.length>0||i.length>0){let b=c.concurrencyLimit;"number"==typeof b&&b<1&&s("warning","subflow-concurrency-limit",`Subflow node "${k(a)}" has a concurrencyLimit of ${b}; it must be at least 1 (the runtime default will be used).`,a)}}{let a=new Map(e.map(a=>[a.id,a])),b=new Set;for(let c of r){if(n(c))continue;let d=c.data?.condition;if(!d||"object"!=typeof d)continue;let e=a.get(c.source),g=e?j(e):"unknown";if("process"!==g){s("error","edge-condition-non-process",`An edge leaving ${"unknown"===g?"an unknown":`the ${g}`} node "${e?k(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?s("warning","edge-condition-value",`Process node "${k(e)}" has an outgoing edge condition with no "value"; it will never match.`,e):"regex"!==d.kind||(0,f.wM)(d.value)||s("warning","edge-condition-regex",`Process node "${k(e)}" has an outgoing edge with a regex condition that does not compile; it will never match.`,e)):s("warning","edge-condition-kind",`Process node "${k(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&&(r.some(a=>!n(a)&&(a.source===c?!a.data?.condition||"always"===a.data.condition.kind&&!a.data.condition.negate:!!(a.target===c&&a.data?.bidirectional)))||s("warning","edge-condition-no-fallback",`Process node "${k(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 e){let c=b.data?.properties?.captureVariable;if("string"==typeof c&&c.trim()){let d=c.trim();a.add(d),(0,g.qW)(d)||s("warning","capture-var-name",`${"subflow"===j(b)?"Subflow":"Process"} node "${k(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 e){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),s("warning","var-ref-uncaptured",`${k(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 e){let b=a.data?.properties?.captureKv;if("string"==typeof b&&b.trim()){let{key:c}=(0,h.g2)(b.trim());(0,h.ng)(c)||s("warning","capture-kv-name",`${"subflow"===j(a)?"Subflow":"Process"} node "${k(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 e){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),s("warning","kv-ref-name",`${k(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 z){let c=a.data?.properties?.promptTemplate;if("string"!=typeof c||!c)continue;let f=o(a.id,e,r),g=null,h=new Set,j=new Set;for(let l of(0,d.A$)(c)){if("handoff"===l.server){let b=`handoff:${l.name}`;if(j.has(b))continue;j.add(b),h.add(l.name),g||(g=p(a.id,e,r)),g.has(l.name)||s("warning","handoff-pill-obsolete",`Process node "${k(a)}" references handoff tool "${l.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=`${l.kind}:${l.server}:${l.name}`;if(!j.has(c))if(j.add(c),f.has(l.server)){if("tool"===l.kind&&b.serverTools&&b.serverTools[l.server]&&!b.serverTools[l.server].includes(l.name)){let b=(0,i.C)(l.server)?` (a stored server named "${l.server}" shadows the built-in — their toolsets may differ)`:"";s("warning","tool-unavailable",`Process node "${k(a)}" references tool "${l.name}" which server "${l.server}" does not currently expose.${b}`,a)}}else s("error","tool-pill-disconnected",`Process node "${k(a)}" references ${l.kind} "${l.name}" from server "${l.server}", but it is not connected to that server (the MCP node was removed or the server was renamed).`,a)}if(h.size>0)for(let b of g??p(a.id,e,r))h.has(b)||s("warning","handoff-target-unreferenced",`Process node "${k(a)}" can hand off to "${b}" but its prompt never references \${tool:handoff__${b}}, so the model may never route there.`,a)}if(b.serverTools)for(let a of z){let c=o(a.id,e,r),d=new Set;for(let e of c){let c=b.serverTools[e];if(Array.isArray(c)&&0===c.length&&s("warning","mcp-server-no-tools",`Process node "${k(a)}" is connected to MCP server "${e}", which currently exposes 0 tools. The connection has no effect until the server provides tools.`,a),Array.isArray(c))for(let b of Array.isArray(a.data?.properties?.enabledTools)?a.data.properties.enabledTools:[]){let f=`enabledTool:${e}:${b}`;if(!d.has(f)&&!c.includes(b)){d.add(f);let c=(0,i.C)(e)?` (stored server "${e}" shadows the built-in — their toolsets may differ)`:"";s("warning","tool-unavailable",`Process node "${k(a)}" has enabledTool "${b}" which server "${e}" does not currently expose.${c}`,a)}}}}let B=c.filter(a=>"error"===a.severity).length,C=c.length-B;return{issues:c,errorCount:B,warningCount:C,isRunnable:0===B}}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=4681,exports.ids=[4681],exports.modules={44681:(a,b,c)=>{c.d(b,{Q:()=>j,validateFlowForRun:()=>k});var d=c(50846),e=c(87821),f=c(20433),g=c(
|
|
1
|
+
"use strict";exports.id=4681,exports.ids=[4681],exports.modules={44681:(a,b,c)=>{c.d(b,{Q:()=>j,validateFlowForRun:()=>k});var d=c(50846),e=c(87821),f=c(20433),g=c(60453),h=c(84671);let i=(0,d.h)("backend/execution/flow/validateFlowForRun");async function j(a){let b,c,d,e;try{b=await f.modelService.loadModels()}catch(a){i.warn("validateFlowObjectForRun: could not load models; skipping model checks",a)}try{let a=await g.mcpService.loadServerConfigs();Array.isArray(a)&&(d=a,c=a.map(a=>({name:a.name,status:a.disabled?"disabled":void 0})))}catch(a){i.warn("validateFlowObjectForRun: could not load servers; skipping server checks",a)}try{let b=new Map((Array.isArray(d)?d:[]).map(a=>[a.name,!!a.disabled])),c=new Set;for(let b of a.nodes??[]){let a=b?.data?.type??b?.type,d=b?.data?.properties?.boundServer;"mcp"===a&&"string"==typeof d&&d&&c.add(d)}let f=await Promise.all([...c].map(async a=>{if(b.get(a))return null;let c=await g.mcpService.listServerTools(a);if(c.error||!Array.isArray(c.tools))return null;let d=c.tools.map(a=>a?.name).filter(a=>"string"==typeof a);return[a,d]}));for(let a of(e={},f))a&&(e[a[0]]=a[1])}catch(a){i.warn("validateFlowObjectForRun: could not gather serverTools; skipping tool checks",a),e=void 0}return(0,h.nC)(a,{models:b,servers:c,serverTools:e})}async function k(a){let b=await e.flowService.getFlow(a);return b?j(b):(i.warn(`validateFlowForRun: flow ${a} could not be loaded; skipping pre-run checks`),{issues:[],errorCount:0,warningCount:0,isRunnable:!0})}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=4685,exports.ids=[4685],exports.modules={8070:(a,b,c)=>{c.d(b,{$Q:()=>z,C2:()=>A,IK:()=>Q,M6:()=>I,Uw:()=>P,lA:()=>S,nH:()=>x,pF:()=>V,v2:()=>R,vm:()=>O,vp:()=>y,z3:()=>U,z9:()=>T});var d=c(21124),e=c(38301),f=c(95791),g=c(46973),h=c(18168),i=c(60839),j=c(54573),k=c(81637),l=c(79515),m=c(44079),n=c(99561),o=c(48823),p=c(76159),q=c(83144),r=c(88970),s=c(87351),t=c(93995),u=c(88698),v=c(17332),w=c(63908);let x="#009688",y="#7E57C2",z="#E91E63",A="#F48FB1",B={start:{main:()=>"#795548",light:()=>"#A1887F"},process:{main:a=>a.palette.secondary.main,light:a=>a.palette.secondary.light},finish:{main:a=>a.palette.success.main,light:a=>a.palette.success.light},mcp:{main:a=>a.palette.info.main,light:a=>a.palette.info.light},subflow:{main:a=>a.palette.warning.main,light:a=>a.palette.warning.light},resource:{main:()=>x,light:()=>"#4DB6AC"},signal:{main:()=>y,light:()=>"#B39DDB"},trigger:{main:()=>z,light:()=>A}},C=(a,b)=>(B[a]??B.start).main(b),D=(0,h.Ay)(j.A,{shouldForwardProp:a=>!["nodeType","selected"].includes(a)})(({theme:a,nodeType:b,selected:c})=>({padding:a.spacing(1.5),width:"200px",borderRadius:"8px",backgroundColor:a.palette.background.paper,border:`2px solid ${C(b,a)}`,boxShadow:c?`0 0 0 2px ${a.palette.primary.main}, 0 3px 10px rgba(0,0,0,0.2)`:a.shadows[2],transition:"all 0.2s ease","&:hover":{boxShadow:`0 0 0 1px ${C(b,a)}, 0 3px 10px rgba(0,0,0,0.1)`}})),E=(0,h.Ay)(k.default,{shouldForwardProp:a=>"nodeType"!==a})(({theme:a,nodeType:b})=>({display:"flex",alignItems:"center",justifyContent:"space-between",borderBottom:`1px solid ${(B[b]??B.start).light(a)}`,marginBottom:a.spacing(1),paddingBottom:a.spacing(.5)})),F=(0,h.Ay)(k.default)({display:"flex",alignItems:"center",gap:"8px"}),G=(0,h.Ay)(k.default)(({theme:a})=>({marginTop:a.spacing(1),fontSize:"0.8rem"})),H=(0,h.Ay)(k.default)(({theme:a})=>({display:"flex",justifyContent:"space-between",padding:a.spacing(.5,0),borderBottom:`1px dashed ${"dark"===a.palette.mode?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.1)"}`})),I=(a,b)=>C(a,b),J=a=>({backgroundColor:a.palette.info.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),K=a=>({backgroundColor:a.palette.secondary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),L=a=>({backgroundColor:a.palette.primary.main,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),M=a=>({backgroundColor:x,borderColor:"dark"===a.palette.mode?a.palette.background.paper:"white",width:16,height:16,borderRadius:8,borderWidth:2}),N=({data:a,nodeType:b,selected:c})=>{let h=(0,i.A)(),[j,k]=(0,e.useState)(!1),A=a||{label:"No Label",properties:{}},B=A.properties||{},C="signal"===b?"string"==typeof B.topic&&B.topic.trim()?B.topic.trim():"string"==typeof A.label&&A.label?A.label:"Signal":"string"==typeof A.label?A.label:"No Label",I="signal"===b?Object.fromEntries(Object.entries(B).filter(([a])=>"topic"!==a)):B,N=Object.keys(I).length;return(0,d.jsx)(d.Fragment,{children:(0,d.jsxs)(D,{elevation:2,nodeType:b,selected:c,children:[(()=>{if("mcp"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"mcp-top",type:"target",position:g.yX.Top,style:J(h)}),(0,d.jsx)(f.h7,{id:"mcp-right",type:"target",position:g.yX.Right,style:J(h)}),(0,d.jsx)(f.h7,{id:"mcp-bottom",type:"source",position:g.yX.Bottom,style:J(h)}),(0,d.jsx)(f.h7,{id:"mcp-left",type:"target",position:g.yX.Left,style:J(h)})]});if("process"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"process-top",type:"target",position:g.yX.Top,style:K(h)}),(0,d.jsx)(f.h7,{id:"process-bottom",type:"source",position:g.yX.Bottom,style:K(h)}),(0,d.jsx)(f.h7,{id:"process-left-mcp",type:"source",position:g.yX.Left,style:{...L(h),top:"30%"}}),(0,d.jsx)(f.h7,{id:"process-right-mcp",type:"source",position:g.yX.Right,style:{...L(h),top:"30%"}}),(0,d.jsx)(f.h7,{id:"process-left-resource",type:"source",position:g.yX.Left,style:{...M(h),top:"70%"}}),(0,d.jsx)(f.h7,{id:"process-right-resource",type:"source",position:g.yX.Right,style:{...M(h),top:"70%"}})]});if("resource"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"resource-in",type:"target",position:g.yX.Left,style:M(h)}),(0,d.jsx)(f.h7,{id:"resource-out",type:"source",position:g.yX.Right,style:M(h)})]});if("start"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"start-top",type:"target",position:g.yX.Top,style:K(h)}),(0,d.jsx)(f.h7,{id:"start-bottom",type:"source",position:g.yX.Bottom,style:K(h)})]});if("finish"===b)return(0,d.jsx)(f.h7,{id:"finish-top",type:"target",position:g.yX.Top,style:K(h)});else if("subflow"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"subflow-top",type:"target",position:g.yX.Top,style:K(h)}),(0,d.jsx)(f.h7,{id:"subflow-bottom",type:"source",position:g.yX.Bottom,style:K(h)})]});else if("signal"===b)return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.h7,{id:"signal-top",type:"target",position:g.yX.Top,style:K(h)}),(0,d.jsx)(f.h7,{id:"signal-bottom",type:"source",position:g.yX.Bottom,style:K(h)})]});else if("trigger"===b)return(0,d.jsx)(f.h7,{id:"trigger-bottom",type:"source",position:g.yX.Bottom,style:{...K(h),backgroundColor:z}});return null})(),(0,d.jsxs)(E,{nodeType:b,children:[(0,d.jsxs)(F,{children:[(a=>{switch(a){case"start":default:return(0,d.jsx)(o.A,{sx:{color:"#795548"}});case"process":return(0,d.jsx)(p.A,{color:"secondary"});case"finish":return(0,d.jsx)(q.A,{color:"success"});case"mcp":return(0,d.jsx)(p.A,{color:"info"});case"subflow":return(0,d.jsx)(r.A,{sx:{color:"warning.main"}});case"resource":return(0,d.jsx)(s.A,{sx:{color:x}});case"signal":return(0,d.jsx)(t.A,{sx:{color:y}});case"trigger":return(0,d.jsx)(u.A,{sx:{color:z}})}})(b),(0,d.jsx)(l.default,{variant:"subtitle2",fontWeight:"bold",children:C})]}),N>0&&(0,d.jsx)(m.A,{size:"small",onClick:a=>{a.stopPropagation(),k(!j)},sx:{padding:.5},children:j?(0,d.jsx)(w.A,{fontSize:"small"}):(0,d.jsx)(v.A,{fontSize:"small"})})]}),(0,d.jsx)(n.A,{in:j,children:(0,d.jsx)(G,{children:Object.entries(I).map(([a,b])=>(0,d.jsxs)(H,{children:[(0,d.jsxs)(l.default,{variant:"caption",sx:{fontWeight:"bold"},children:[a,":"]}),(0,d.jsxs)(l.default,{variant:"caption",children:[String(b).substring(0,30),String(b).length>30?"...":""]})]},a))})}),N>0&&!j&&(0,d.jsx)(l.default,{variant:"caption",color:"text.secondary",children:`${N} properties configured`})]})})},O=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"start",selected:a.selected})}),P=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"process",selected:a.selected})}),Q=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"finish",selected:a.selected})}),R=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"mcp",selected:a.selected})}),S=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"subflow",selected:a.selected})}),T=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"resource",selected:a.selected})}),U=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"signal",selected:a.selected})}),V=(0,e.memo)(function(a){return(0,d.jsx)(N,{...a,nodeType:"trigger",selected:a.selected})})},21570:(a,b,c)=>{c.d(b,{A:()=>p});var d=c(21124);c(38301);var e=c(40512),f=c(83899),g=c(81637),h=c(79515),i=c(44079),j=c(91059),k=c(52327),l=c(19925),m=c(68730),n=c(30137),o=c(24330);let p=({open:a,onClose:b,title:c,description:p,maxWidth:q="md",...r})=>(0,d.jsxs)(e.A,{open:a,onClose:b,maxWidth:q,fullWidth:!0,children:[(0,d.jsx)(f.A,{component:"div",children:(0,d.jsxs)(g.default,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[(0,d.jsx)(h.default,{variant:"h6",children:c}),(0,d.jsx)(i.A,{edge:"end",color:"inherit",onClick:b,"aria-label":"close",children:(0,d.jsx)(n.A,{})})]})}),(0,d.jsx)(j.A,{}),(0,d.jsxs)(k.A,{sx:{p:3},children:[p&&(0,d.jsx)(h.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:p}),(0,d.jsx)(o.A,{...r})]}),(0,d.jsx)(l.A,{children:(0,d.jsx)(m.A,{onClick:b,children:"Cancel"})})]})},24330:(a,b,c)=>{c.d(b,{A:()=>o});var d=c(21124),e=c(38301),f=c(82666),g=c(81637),h=c(37674),i=c(67101),j=c(8521),k=c(79515),l=c(40973),m=c(59737);let n={xs:12,sm:6,md:4},o=({isLoading:a=!1,error:b=null,emptyMessage:c="Nothing to choose from.",loadingMessage:o="Loading…",skeleton:p,skeletonCount:q=4,columns:r=n,items:s,searchable:t=!1,searchPlaceholder:u="Search…",searchTerm:v,onSearchChange:w,groups:x,collapsedKeys:y,onToggleGroup:z})=>{let A={...n,...r},[B,C]=(0,e.useState)(""),D=void 0!==v,E=D?v:B,[F,G]=(0,e.useState)(new Set),H=y??F,I=a=>(0,d.jsx)(f.Ay,{container:!0,spacing:2,alignItems:"stretch",children:a.map(a=>(0,d.jsx)(f.Ay,{item:!0,xs:A.xs,sm:A.sm,md:A.md,lg:A.lg,sx:{display:"flex"},children:(0,d.jsx)(g.default,{sx:{width:"100%"},children:a.content})},a.key))}),J=t?(0,d.jsx)(h.A,{placeholder:u,variant:"outlined",size:"small",fullWidth:!0,value:E,onChange:a=>(a=>{w?.(a),D||C(a)})(a.target.value),sx:{mb:2},InputProps:{startAdornment:(0,d.jsx)(i.A,{position:"start",children:(0,d.jsx)(l.A,{fontSize:"small"})})}}):null,K=a=>(0,d.jsxs)(g.default,{children:[J,a]});if(a)return K(p?(0,d.jsx)(f.Ay,{container:!0,spacing:2,children:Array.from({length:q}).map((a,b)=>(0,d.jsx)(f.Ay,{item:!0,xs:A.xs,sm:A.sm,md:A.md,lg:A.lg,children:p},`skeleton-${b}`))}):(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2},children:[(0,d.jsx)(j.default,{size:20}),(0,d.jsx)(k.default,{variant:"body2",color:"text.secondary",children:o})]}));if(b)return K((0,d.jsx)(k.default,{color:"error",variant:"body2",sx:{py:2},children:b}));let L=D?"":E.trim().toLowerCase(),M=a=>!L||(a.searchText??"").toLowerCase().includes(L),N=(0,d.jsx)(k.default,{variant:"body2",color:"text.secondary",sx:{py:2},children:c});if(x){let a=x.map(a=>({...a,items:a.items.filter(M)})).filter(a=>a.items.length>0);return K(0===a.length?N:(0,d.jsx)(d.Fragment,{children:a.map(a=>(0,d.jsx)(m.A,{label:a.label,count:a.items.length,expanded:!H.has(a.key),onToggle:()=>(a=>{if(z)return void z(a);G(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})})(a.key),children:I(a.items)},a.key))}))}let O=(s??[]).filter(M);return K(0===O.length?N:I(O))}},39438:(a,b,c)=>{c.d(b,{A:()=>H,o:()=>G});var d=c(21124),e=c(38301),f=c(18168),g=c(30818),h=c(81637),i=c(37489),j=c(60839),k=c(79515),l=c(43312),m=c(44079),n=c(423),o=c(27114),p=c(41893),q=c(98463),r=c(72197),s=c(91034),t=c(38941),u=c(12033),v=c(1312),w=c(5501),x=c(99587),y=c(48823),z=c(22797),A=c(21358),B=c(8070),C=c(78352);let D=(0,c(19815).h)("components/Flow/FlowDashboard/FlowCard"),E=(0,f.Ay)(g.A,{shouldForwardProp:a=>"selected"!==a})(({theme:a,selected:b})=>({display:"flex",flexDirection:"column",height:"100%",transition:"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",position:"relative",border:b?`2px solid ${a.palette.primary.main}`:"none",boxShadow:b?a.shadows[4]:a.shadows[1],"&:hover":{boxShadow:a.shadows[6],transform:"translateY(-4px)"},"&::before":b?{content:'""',position:"absolute",top:0,left:0,width:"100%",height:"4px",backgroundColor:a.palette.primary.main}:{}})),F=(0,f.Ay)(h.default)(({theme:a})=>({height:"140px",backgroundColor:(0,i.X4)(a.palette.background.default,.7),borderRadius:a.shape.borderRadius,display:"flex",alignItems:"center",justifyContent:"center",margin:a.spacing(1),overflow:"hidden",position:"relative"})),G=()=>(0,d.jsxs)(g.A,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[(0,d.jsx)(h.default,{sx:{p:1},children:(0,d.jsx)(r.A,{variant:"rectangular",height:140})}),(0,d.jsxs)(o.A,{sx:{flexGrow:1},children:[(0,d.jsx)(r.A,{variant:"text",width:"80%",height:30}),(0,d.jsxs)(h.default,{sx:{display:"flex",gap:1,mt:1},children:[(0,d.jsx)(r.A,{variant:"rectangular",width:60,height:20}),(0,d.jsx)(r.A,{variant:"rectangular",width:90,height:20})]})]}),(0,d.jsxs)(q.A,{sx:{justifyContent:"flex-end",p:1},children:[(0,d.jsx)(r.A,{variant:"circular",width:28,height:28}),(0,d.jsx)(r.A,{variant:"circular",width:28,height:28}),(0,d.jsx)(r.A,{variant:"circular",width:28,height:28})]})]}),H=({flow:a,selected:b,onSelect:c,onDelete:f,onCopy:g,onEdit:r,onOpenInChat:G,onSetFolder:H,onToggleFavorite:I,folders:J=[],validation:K,pickerMode:L=!1})=>{D.debug("Rendering FlowCard",{flowId:a.id,flowName:a.name});let M=(0,j.A)(),[N,O]=(0,e.useState)(null),P=K?.errorCount??0,Q=K?.warningCount??0,R=P>0?"error":Q>0?"warning":null,S=K?(0,d.jsxs)(h.default,{children:[(0,d.jsx)(k.default,{variant:"caption",sx:{fontWeight:600,display:"block",mb:.5},children:P>0?`${P} problem${1===P?"":"s"} — won't run`:`${Q} warning${1===Q?"":"s"}`}),K.issues.slice(0,5).map((a,b)=>(0,d.jsxs)(k.default,{variant:"caption",sx:{display:"block"},children:["• ",a.message]},b)),K.issues.length>5&&(0,d.jsxs)(k.default,{variant:"caption",sx:{display:"block",fontStyle:"italic"},children:["…and ",K.issues.length-5," more"]})]}):null;return(0,d.jsxs)(E,{selected:b,children:[I&&(0,d.jsx)(l.A,{title:a.favorite?"Remove from favorites":"Add to favorites",arrow:!0,placement:"top",children:(0,d.jsx)(m.A,{size:"small",onClick:b=>{b.stopPropagation(),I&&I(a.id)},sx:{position:"absolute",top:4,left:4,zIndex:2,color:a.favorite?M.palette.warning.main:M.palette.text.secondary,backgroundColor:(0,i.X4)(M.palette.background.paper,.6),"&:hover":{backgroundColor:(0,i.X4)(M.palette.background.paper,.9)}},children:a.favorite?(0,d.jsx)(w.A,{fontSize:"small"}):(0,d.jsx)(x.A,{fontSize:"small"})})}),R&&(0,d.jsx)(l.A,{title:S,arrow:!0,placement:"top",children:(0,d.jsxs)(h.default,{sx:{position:"absolute",top:8,right:8,zIndex:2,display:"flex",alignItems:"center",gap:.5,px:.75,py:.25,borderRadius:1,color:"#fff",backgroundColor:"error"===R?M.palette.error.main:M.palette.warning.main,boxShadow:M.shadows[2],pointerEvents:"auto"},children:["error"===R?(0,d.jsx)(z.A,{sx:{fontSize:16}}):(0,d.jsx)(A.A,{sx:{fontSize:16}}),(0,d.jsx)(k.default,{variant:"caption",sx:{fontWeight:700,lineHeight:1},children:"error"===R?P:Q})]})}),(0,d.jsxs)(n.A,{onClick:()=>c(a.id),sx:{display:"flex",flexDirection:"column",alignItems:"stretch",height:"100%",position:"relative"},children:[(0,d.jsx)(F,{children:(()=>{if(0===a.nodes.length)return(0,d.jsx)(h.default,{sx:{width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center"},children:(0,d.jsx)(k.default,{color:"textSecondary",align:"center",children:"Empty Flow"})});let b=a.nodes.map(a=>a.position?.x??0),c=a.nodes.map(a=>a.position?.y??0),e=Math.min(...b),f=Math.min(...c),g=Math.max(...b)+180,i=Math.max(...c)+70,j=`${e-40} ${f-40} ${g-e+80} ${i-f+80}`,l=a=>({cx:(a.position?.x??0)+90,cy:(a.position?.y??0)+35});return(0,d.jsx)(h.default,{sx:{width:"100%",height:"100%",p:1},children:(0,d.jsxs)("svg",{width:"100%",height:"100%",viewBox:j,preserveAspectRatio:"xMidYMid meet",style:{display:"block"},children:[a.edges.map((b,c)=>{let e=a.nodes.find(a=>a.id===b.source),f=a.nodes.find(a=>a.id===b.target);if(!e||!f)return null;let g=l(e),h=l(f);return(0,d.jsx)("line",{x1:g.cx,y1:g.cy,x2:h.cx,y2:h.cy,stroke:M.palette.text.secondary,strokeWidth:2,opacity:.5,vectorEffect:"non-scaling-stroke"},b.id||c)}),a.nodes.map(a=>{let b=a.position?.x??0,c=a.position?.y??0,e=a.data?.type??"process",f=(0,B.M6)(e,M);return(0,d.jsxs)("g",{children:[(0,d.jsx)("rect",{x:b,y:c,width:180,height:70,rx:12,fill:f,opacity:.85,stroke:M.palette.background.paper,strokeWidth:2,vectorEffect:"non-scaling-stroke"}),(0,d.jsx)("text",{x:b+90,y:c+35,textAnchor:"middle",dominantBaseline:"central",fill:"#fff",fontSize:35,fontWeight:"bold",children:e.substring(0,1).toUpperCase()})]},a.id)})]})})})()}),(0,d.jsxs)(o.A,{sx:{flexGrow:1,pb:0},children:[(0,d.jsx)(k.default,{variant:"h6",component:"div",noWrap:!0,children:a.name}),a.description&&(0,d.jsx)(l.A,{title:a.description,placement:"bottom-start",children:(0,d.jsx)(k.default,{variant:"body2",color:"text.secondary",sx:{mt:.5,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:a.description})}),(0,d.jsxs)(h.default,{sx:{display:"flex",gap:.5,mt:1,flexWrap:"wrap"},children:[(0,d.jsx)(p.A,{size:"small",label:`${a.nodes.length} nodes`,color:"primary",variant:"outlined",sx:{fontSize:"0.7rem",height:20}}),(0,d.jsx)(p.A,{size:"small",label:`${a.edges.length} connections`,color:"secondary",variant:"outlined",sx:{fontSize:"0.7rem",height:20}})]})]})]}),!L&&(0,d.jsxs)(q.A,{sx:{justifyContent:"flex-end",p:1,opacity:.7,"&:hover":{opacity:1}},children:[G&&(0,d.jsx)(l.A,{title:"Start a conversation with this flow",children:(0,d.jsx)(m.A,{size:"small",onClick:b=>{b.stopPropagation(),G&&G(a.id)},color:"primary",children:(0,d.jsx)(y.A,{fontSize:"small"})})}),r&&(0,d.jsx)(l.A,{title:"Edit flow metadata",children:(0,d.jsx)(m.A,{size:"small",onClick:b=>{b.stopPropagation(),r&&r(a.id)},children:(0,d.jsx)(u.A,{fontSize:"small"})})}),g&&(0,d.jsx)(l.A,{title:"Copy flow",children:(0,d.jsx)(m.A,{size:"small",onClick:b=>{b.stopPropagation(),g&&g(a.id)},children:(0,d.jsx)(t.A,{fontSize:"small"})})}),H&&(0,d.jsx)(l.A,{title:a.folder?`Folder: ${a.folder}`:"Move to folder",children:(0,d.jsx)(m.A,{size:"small",onClick:a=>{a.stopPropagation(),O(a.currentTarget)},color:a.folder?"primary":"default",children:(0,d.jsx)(v.A,{fontSize:"small"})})}),f&&(0,d.jsx)(l.A,{title:"Delete flow",children:(0,d.jsx)(m.A,{size:"small",onClick:b=>{b.stopPropagation(),f&&f(a.id)},color:"error",children:(0,d.jsx)(s.A,{fontSize:"small"})})})]}),!L&&H&&(0,d.jsx)(C.A,{anchorEl:N,open:!!N,currentFolder:a.folder,folders:J,onClose:()=>O(null),onAssign:b=>H(a.id,b)})]})}},45231:(a,b,c)=>{c.d(b,{E:()=>k});var d=c(38301),e=c(2560),f=c(7329),g=c(32640),h=c(61160),i=c(66675);let j={models:{defaultSort:"name-asc",sort:(a,b)=>(0,g.CR)(a,b),deriveSortGroup:(a,b)=>(0,g.eZ)(a,b),getFolder:a=>a.folder,getSearchText:a=>`${(0,g.Lg)(a)} ${a.name??""}`},mcp:{defaultSort:"name-asc",sort:(a,b)=>(0,h.oO)(a,b),deriveSortGroup:(a,b)=>(0,h.mO)(a,b),getFolder:a=>a.folder,getSearchText:a=>`${a.name??""} ${a.rootPath??a.path??""}`},flows:{defaultSort:"name-asc",sort:(a,b)=>(0,i.NP)(a,b),deriveSortGroup:(a,b)=>(0,i.ts)(a,b),getFolder:a=>a.folder,getSearchText:a=>a.name??""}};function k(a,b){let c=j[a],[g,h]=(0,d.useState)(""),[i]=(0,e.Xk)(`flujo-ui:${a}:sort`,c.defaultSort),[k]=(0,e.Xk)(`flujo-ui:${a}:group`,"none"),[l,m]=(0,e.Xk)(`flujo-ui:${a}:collapsed`,[]),n=(0,d.useMemo)(()=>new Set(l),[l]),o=(0,d.useMemo)(()=>{let a=g.trim().toLowerCase(),d=a?b.filter(b=>c.getSearchText(b).toLowerCase().includes(a)):b;return c.sort([...d],i)},[b,g,i,c]),p=(0,d.useMemo)(()=>"folder"===k?(0,f.Je)(o,a=>c.getFolder(a)):"sort"===k?(0,f.Az)(o,a=>c.deriveSortGroup(a,i)):null,[k,o,i,c]);return{searchTerm:g,setSearchTerm:h,sortOption:i,groupMode:k,items:o,groups:p,collapsedKeys:n,toggleGroup:(0,d.useCallback)(a=>{m(b=>b.includes(a)?b.filter(b=>b!==a):[...b,a])},[m])}}},66675:(a,b,c)=>{c.d(b,{K:()=>f,NP:()=>i,ts:()=>g});var d=c(7329);function e(a){return a.updatedAt??a.createdAt??0}function f(a,b=Date.now()){if(!a)return{key:"recency:unknown",label:"No date"};let c=b-a;return c<864e5?{key:"recency:today",label:"Today"}:c<6048e5?{key:"recency:week",label:"This week"}:c<2592e6?{key:"recency:month",label:"This month"}:{key:"recency:older",label:"Older"}}function g(a,b){switch(b){case"name-asc":case"name-desc":return(0,d.po)(a.name);case"most-nodes":case"least-nodes":var c;return 0===(c=a.nodes.length)?{key:"nodes:0",label:"0 nodes"}:c<=2?{key:"nodes:1-2",label:"1–2 nodes"}:c<=5?{key:"nodes:3-5",label:"3–5 nodes"}:c<=10?{key:"nodes:6-10",label:"6–10 nodes"}:{key:"nodes:11+",label:"11+ nodes"};case"newest":case"oldest":return f(e(a));default:return{key:"all",label:"All flows"}}}function h(a,b){return a.name.localeCompare(b.name)||a.id.localeCompare(b.id)}function i(a,b){let c=(a,c)=>{switch(b){case"name-asc":return a.name.localeCompare(c.name);case"name-desc":return c.name.localeCompare(a.name);case"most-nodes":return c.nodes.length-a.nodes.length;case"least-nodes":return a.nodes.length-c.nodes.length;case"newest":{let b=e(c)-e(a);return 0!==b?b:h(a,c)}case"oldest":{let b=e(a)-e(c);return 0!==b?b:h(a,c)}default:return 0}};return[...a].sort((a,b)=>{let d=Number(!!b.favorite)-Number(!!a.favorite);return 0!==d?d:c(a,b)})}}};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";exports.id=4771,exports.ids=[4771],exports.modules={4771:(a,b,c)=>{c.d(b,{getSchedulerService:()=>F});var d=c(32524),e=c(92372),f=c(38844),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736),p=c(10960),q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(56793);let u=(0,g.h)("backend/services/scheduler/triggers/flowEvent");function v(a){return a&&a.length>8192?`${a.slice(0,8192)}… (truncated)`:a}var w=c(59911);let x=(0,g.h)("backend/services/scheduler/state"),y=a=>`planned-execution-state/${a}`;async function z(a){try{return await (0,e.YM)(y(a),{})}catch(b){return x.error(`Failed to load trigger state for ${a}:`,b),{}}}async function A(a,b){await (0,e.VH)(y(a),b)}async function B(a){await (0,e.N2)(y(a))}let C=(0,g.h)("backend/services/scheduler/index"),D={version:1,paused:!1,executions:[]};class E{static{this.MAX_QUEUE_DEPTH=50}async start(){this.started||(this.started=!0,C.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){C.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void C.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),C.error(`Failed to arm "${b.name}" (${b.id}):`,c)}C.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await z(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),C.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await z(a.id);await A(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>C.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(5096),c.e(7538),c.e(1925)]).then(c.bind(c,24463)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>C.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||(0,p.X)(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(5096),c.e(7538),c.e(1925)]).then(c.bind(c,24463)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;case"flow-event":this.armed.set(a.id,function(a,b){let c=a.maxChainDepth??5,d="string"==typeof a.source.topic?a.source.topic.trim():"",e=d.length>0,f=0,g=null,h=!1;if(a.outputMatch?.regex)try{g=new RegExp(a.outputMatch.regex)}catch(c){h=!0;let a=`Invalid output-match regex: ${c instanceof Error?c.message:String(c)}`;u.warn(a),b.onError(a)}let i=b=>{if(!a.outputMatch)return!0;if(h)return!1;let c=(b??"").slice(0,16384);return(!a.outputMatch.contains||!!c.includes(a.outputMatch.contains))&&(!g||!!g.test(c))},j=(d,e,g,h)=>{if(d>=c){let a=`Flow-event chain reached the depth limit (${c}); not firing again`;u.info(a),b.onSkip(a);return}let i=Date.now();if(a.minIntervalMs&&i-f<a.minIntervalMs)return void u.debug(`Flow-event cooldown active (${a.minIntervalMs}ms); ignoring event`);f=i,b.onFire({summary:e,context:g,chainDepth:d+1,sourceConversationId:h})},k=(0,t.eh)().subscribe(c=>{try{if(e){if(!(0,t.ru)(c)||c.topic!==d||!i(c.payload))return;j(c.chainDepth,`Signal "${c.topic}"`,{topic:c.topic,payload:v(c.payload),emitterFlowId:c.emitterFlowId,flowName:c.flowName,runId:c.runId,conversationId:c.conversationId,firedBy:c.firedBy},c.conversationId);return}if((0,t.ru)(c)||!(b=>{let c=a.source;return c.executionId?b.executionId===c.executionId:c.flowId?b.flowId===c.flowId:!!c.flowName&&b.flowName===c.flowName})(c)||!c.status||!(a.on??[]).includes(c.status)||!i(c.outputText))return;let b=c.flowName??c.flowId;j(c.chainDepth,`Flow "${b}" ${c.status}`,{flowId:c.flowId,flowName:c.flowName,executionId:c.executionId,runId:c.runId,conversationId:c.conversationId,status:c.status,firedBy:c.firedBy,outputText:v(c.outputText),error:c.error},c.conversationId)}catch(c){let a=c instanceof Error?c.message:String(c);u.warn(`Flow-event handling failed: ${a}`),b.onError(a)}});return{dispose:()=>k(),nextRun:()=>null}}(b,{onFire:({summary:b,context:c,chainDepth:d,sourceConversationId:e})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"flow-event",summary:b,context:c,chainDepth:d,parentConversationId:e}).catch(b=>C.error(`Flow-event fire failed for ${a.id}:`,b))},onSkip:b=>{let c=new Date().toISOString();(0,w.Hy)(a.id,{runId:(0,d.A)(),conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:"Flow event",error:b}).catch(b=>C.warn(`Failed to record flow-event skip for ${a.id}:`,b))},onError:b=>this.lastTriggerErrors.set(a.id,b)}));break;default:C.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,D);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();if(await this.saveFile({...b,paused:a}),await this.reconcile(),a){for(let a of[...this.queued.keys()])await this.cancelQueued(a,"scheduler paused",!0);await this.cancelAllExclusiveWaiting("scheduler paused",!0)}}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,w.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[A-Za-z0-9._:-]{1,128}$/.test(a.id))return{error:"The id must be 1-128 characters of letters, digits, dot, underscore, colon or hyphen"};if("."===a.id||".."===a.id)return{error:'The id must be a safe identifier, not "." or ".."'};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`,conflict:!0}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),await this.cancelQueued(a,"execution updated",!0),await this.cancelExclusiveWaiting(a,"execution updated",!0),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await this.cancelQueued(a,"execution deleted",!1),await this.cancelExclusiveWaiting(a,"execution deleted",!1),await (0,w.xC)(a),await B(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:(0,p.X)(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";if(void 0!==a.overlapStrategy&&!["skip","queue","parallel","error"].includes(a.overlapStrategy))return"Overlap strategy must be one of: skip, queue, parallel, error";if(void 0!==a.exclusive&&"boolean"!=typeof a.exclusive)return"Exclusive must be true or false";if(void 0!==a.nonExclusiveBehavior&&!["queue","skip","error"].includes(a.nonExclusiveBehavior))return"When exclusive is on, other triggers must be one of: queue, skip, error";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"flow-event":{let a=b.source;if(1!==[a?.executionId,a?.flowId,a?.flowName,a?.topic].filter(a=>"string"==typeof a&&a.trim().length>0).length)return"Choose exactly one source: a flow, a planned execution, or a signal topic";if(!("string"==typeof a?.topic&&a.topic.trim().length>0)){if(!Array.isArray(b.on)||0===b.on.length)return"Select at least one outcome to react to (completed or error)";if(b.on.some(a=>"completed"!==a&&"error"!==a))return'Outcomes must be "completed" or "error"'}if(b.outputMatch?.regex)try{new RegExp(b.outputMatch.regex)}catch(a){return`Invalid output-match regex: ${a instanceof Error?a.message:String(a)}`}if(void 0!==b.maxChainDepth&&(!Number.isInteger(b.maxChainDepth)||b.maxChainDepth<1))return"Max chain depth must be a positive whole number";if(void 0!==b.minIntervalMs&&(!Number.isFinite(b.minIntervalMs)||b.minIntervalMs<0))return"Minimum interval must be zero or more milliseconds";return null}default:return"Unknown trigger type"}}isRunning(a){let b=this.running.get(a);return void 0!==b&&b.size>0}addRunning(a,b,c){let d=this.running.get(a);d||(d=new Map,this.running.set(a,d)),d.set(b,c)}removeRunning(a,b){let c=this.running.get(a);c&&(c.delete(b),0===c.size&&this.running.delete(a))}earliestRunningSince(a){let b,c=this.running.get(a);if(c&&0!==c.size){for(let a of c.values())(void 0===b||a<b)&&(b=a);return b}}skippedRecord(a,b){let c=new Date().toISOString();return{runId:a.runId,conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:a.payload.summary,error:b}}async cancelQueued(a,b,c){let d=this.queued.get(a);if(d&&0!==d.length){for(let e of(this.queued.delete(a),d)){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled queued fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} queued fire(s) for ${a}: ${b}`)}}drainQueue(a){let b=this.queued.get(a);if(!b||0===b.length||this.isRunning(a))return;let c=b.shift();0===b.length&&this.queued.delete(a),c&&(async()=>{let b=await this.get(a);if(!b||!b.enabled||this.pausedCache){let a=b?b.enabled?"scheduler paused":"execution disabled":"execution deleted";c.resolve(this.skippedRecord(c,a));return}let d=await this.fire(b,c.payload,c.runId);c.resolve(d)})().catch(b=>C.error(`Queued fire failed for ${a}:`,b))}isSchedulerIdle(){for(let a of this.running.values())if(a.size>0)return!1;return!0}isExclusiveActive(){return null!==this.exclusiveHolder||this.exclusiveWaiting.length>0}currentExclusiveBehavior(){return null!==this.exclusiveHolder?this.exclusiveHolderBehavior:this.exclusiveWaiting[0]?.execution.nonExclusiveBehavior??"queue"}exclusiveGateFor(a){return!0!==a.exclusive&&this.isExclusiveActive()?this.currentExclusiveBehavior():null}drainExclusive(){if(null===this.exclusiveHolder&&this.exclusiveWaiting.length>0&&this.isSchedulerIdle())return void this.acquireNextExclusive();this.isExclusiveActive()||this.drainBlockedByExclusive()}acquireNextExclusive(){if(null!==this.exclusiveHolder||!this.isSchedulerIdle())return;let a=this.exclusiveWaiting.shift();if(!a)return;let b=a.execution.id;this.exclusiveHolder=b,this.exclusiveHolderBehavior=a.execution.nonExclusiveBehavior??"queue",(async()=>{let c=await this.get(b);if(!c||!c.enabled||this.pausedCache||!0!==c.exclusive){let d=c?c.enabled?this.pausedCache?"scheduler paused":"no longer exclusive":"execution disabled":"execution deleted";this.exclusiveHolder===b&&(this.exclusiveHolder=null),a.resolve(this.skippedRecord(a,d)),this.drainExclusive();return}this.exclusiveHolderBehavior=c.nonExclusiveBehavior??"queue";let d=await this.fire(c,a.payload,a.runId);a.resolve(d)})().catch(c=>{this.exclusiveHolder===b&&(this.exclusiveHolder=null),C.error(`Exclusive acquire failed for ${b}:`,c),a.resolve(this.skippedRecord(a,"exclusive acquire failed")),this.drainExclusive()})}drainBlockedByExclusive(){if(0===this.blockedByExclusive.length)return;let a=this.blockedByExclusive;for(let b of(this.blockedByExclusive=[],a))(async()=>{let a=await this.get(b.execution.id);if(!a||!a.enabled||this.pausedCache){let c=a?a.enabled?"scheduler paused":"execution disabled":"execution deleted";b.resolve(this.skippedRecord(b,c));return}let c=await this.fire(a,b.payload,b.runId);b.resolve(c)})().catch(a=>C.error(`Deferred non-exclusive fire failed for ${b.execution.id}:`,a))}async cancelExclusiveWaiting(a,b,c){let d=[];if(this.exclusiveWaiting=this.exclusiveWaiting.filter(b=>b.execution.id!==a||(d.push(b),!1)),this.blockedByExclusive=this.blockedByExclusive.filter(b=>b.execution.id!==a||(d.push(b),!1)),0!==d.length){for(let e of d){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled exclusive fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} exclusive-related fire(s) for ${a}: ${b}`)}}async cancelAllExclusiveWaiting(a,b){let c=[...this.exclusiveWaiting,...this.blockedByExclusive];if(this.exclusiveWaiting=[],this.blockedByExclusive=[],0!==c.length){for(let d of c){let c=this.skippedRecord(d,a);if(b)try{await (0,w.Hy)(d.execution.id,c)}catch(a){C.warn(`Failed to record cancelled exclusive fire for ${d.execution.id}:`,a)}d.resolve(c)}C.info(`Cancelled ${c.length} exclusive-related fire(s): ${a}`)}}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.earliestRunningSince(a.id),e=c?void 0:a.enabled?this.pausedCache?"paused":void 0:"disabled",f=this.exclusiveHolder??void 0,g=!0!==a.exclusive&&this.isExclusiveActive();return{armed:c,notArmedReason:e,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d,exclusiveHolderId:f,blockedByExclusive:g}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"},(0,d.A)(),!0)}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)(),f=!1){let g,i=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,w.Hy)(a.id,c),C.info(`Skipped fire for "${a.name}" — encryption locked`),c}let j="flow-event"===b.kind;if(!f&&!j){if(!0===a.exclusive){if(this.exclusiveHolder!==a.id){if(null!==this.exclusiveHolder||!this.isSchedulerIdle()){let c=this.exclusiveWaiting.length;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Exclusive wait queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Exclusive wait queue full for "${a.name}" — dropped fire`),c}return C.info(`Exclusive "${a.name}" waiting for scheduler to idle (depth ${c+1})`),new Promise(c=>{this.exclusiveWaiting.push({execution:a,payload:b,runId:e,resolve:c})})}this.exclusiveHolder=a.id,this.exclusiveHolderBehavior=a.nonExclusiveBehavior??"queue",C.info(`Exclusive "${a.name}" acquired the scheduler lock`)}}else if(this.isExclusiveActive()){let c=this.currentExclusiveBehavior();if("skip"===c){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Skipped — an exclusive execution holds the scheduler lock"};return await (0,w.Hy)(a.id,c),C.info(`Skipped non-exclusive fire for "${a.name}" — exclusive lock held`),c}if("error"===c){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Rejected — an exclusive execution holds the scheduler lock"};return await (0,w.Hy)(a.id,c),C.info(`Rejected non-exclusive fire for "${a.name}" — exclusive lock held`),c}let d=this.blockedByExclusive.length;if(d>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Exclusive-block queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Exclusive-block queue full for "${a.name}" — dropped fire`),c}return C.info(`Deferred non-exclusive fire for "${a.name}" — exclusive lock held (depth ${d+1})`),new Promise(c=>{this.blockedByExclusive.push({execution:a,payload:b,runId:e,resolve:c})})}}let k=a.overlapStrategy??"skip";if(!f&&this.isRunning(a.id)){if("skip"===k){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,w.Hy)(a.id,c),C.info(`Skipped overlapping fire for "${a.name}"`),c}if("error"===k){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Overlapping run rejected (overlapStrategy=error)"};return await (0,w.Hy)(a.id,c),C.info(`Rejected overlapping fire for "${a.name}" (overlapStrategy=error)`),c}if("queue"===k){let c=this.queued.get(a.id)?.length??0;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Overlap queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Overlap queue full for "${a.name}" — dropped fire`),c}return C.info(`Queued overlapping fire for "${a.name}" (depth ${c+1})`),new Promise(c=>{let d=this.queued.get(a.id)??[];d.push({execution:a,payload:b,runId:e,resolve:c}),this.queued.set(a.id,d)})}}this.addRunning(a.id,e,i);let l=(0,d.A)();try{C.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,w.Sw)(a.id),f=d.length>0?d[d.length-1]:null,h={executionName:a.name,trigger:b.kind,now:i,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:f?{at:f.firedAt,status:f.status}:null,nextPlannedRun:this.getStatus(a).nextRun??null},j=a.approvalPolicy??"auto",k=a.saveConversations||"pause"===j?"conversation":"ephemeral",{runFlow:m}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6849),c.e(1373),c.e(5096),c.e(7538),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)),n=await m({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,h),mode:k,conversationId:l,source:"schedule",plannedExecutionId:a.id,parentRunId:b.parentConversationId,chainDepth:b.chainDepth??0,requireApproval:"auto"!==j,onApprovalRequired:j,debug:!1,userTurn:!0});g=await this.recordFromResult(a,n,{runId:e,conversationId:l,firedAt:i,payload:b})}catch(c){g={runId:e,conversationId:l,firedAt:i,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},C.error(`Run crashed for "${a.name}":`,c)}finally{this.removeRunning(a.id,e),this.exclusiveHolder!==a.id||this.isRunning(a.id)||(this.exclusiveHolder=null,C.info(`Exclusive "${a.name}" released the scheduler lock`)),this.drainExclusive(),this.drainQueue(a.id)}return await this.get(a.id)===null?C.info(`Dropping run record for deleted execution ${a.id}`):(await (0,w.Hy)(a.id,g),("completed"===g.status||"error"===g.status)&&await this.publishFlowRunEvent(a,g,b)),g}async recordFromResult(a,b,c){let{runId:d,conversationId:e,firedAt:f,payload:g}=c,h=new Date().toISOString(),i="awaiting_tool_approval"===b.status,j="error"===b.status&&b.error?.details?.type==="approval_required";if(i||j){let c=(b.pendingToolCalls??[]).map(a=>({id:a.id,name:"function"===a.type?a.function.name:String(a.type)})),k={runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"needs_approval",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:j?b.error?.message??"Tool approval required":"Awaiting tool approval",pendingApproval:{tool:c[0]?.name??b.error?.details?.name,toolCallId:c[0]?.id,pendingToolCalls:c.length>0?c:void 0}};return i&&await this.registerPendingApproval(a,k,c),k}return{runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"completed"===b.status?"completed":"error",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:"completed"===b.status?void 0:b.error?.message??`Run ended with status "${b.status}"`}}async registerPendingApproval(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for pending approval (${a.flowId}):`,b)}let{putPendingApproval:f}=await c.e(9285).then(c.bind(c,39285));await f({approvalId:b.conversationId,conversationId:b.conversationId,plannedExecutionId:a.id,flowId:a.flowId,flowName:e,runId:b.runId,triggerSummary:b.triggerSummary,pendingToolCalls:d,createdAt:b.firedAt})}catch(b){C.warn(`Failed to register pending approval for "${a.name}":`,b)}}async publishFlowRunEvent(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for run event (${a.flowId}):`,b)}let f="schedule-catchup"===d.kind?"schedule":d.kind;(0,t.eh)().publish({flowId:a.flowId,flowName:e,executionId:a.id,runId:b.runId,conversationId:b.conversationId,status:"completed"===b.status?"completed":"error",outputText:b.outputText,error:b.error,firedBy:f,chainDepth:d.chainDepth??0,timestamp:b.finishedAt??new Date().toISOString()})}catch(b){C.warn(`Failed to publish flow-run event for "${a.name}":`,b)}}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
|
|
1
|
+
"use strict";exports.id=4771,exports.ids=[4771],exports.modules={4771:(a,b,c)=>{c.d(b,{getSchedulerService:()=>F});var d=c(32524),e=c(92372),f=c(38844),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736),p=c(10960),q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(56793);let u=(0,g.h)("backend/services/scheduler/triggers/flowEvent");function v(a){return a&&a.length>8192?`${a.slice(0,8192)}… (truncated)`:a}var w=c(59911);let x=(0,g.h)("backend/services/scheduler/state"),y=a=>`planned-execution-state/${a}`;async function z(a){try{return await (0,e.YM)(y(a),{})}catch(b){return x.error(`Failed to load trigger state for ${a}:`,b),{}}}async function A(a,b){await (0,e.VH)(y(a),b)}async function B(a){await (0,e.N2)(y(a))}let C=(0,g.h)("backend/services/scheduler/index"),D={version:1,paused:!1,executions:[]};class E{static{this.MAX_QUEUE_DEPTH=50}async start(){this.started||(this.started=!0,C.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){C.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void C.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),C.error(`Failed to arm "${b.name}" (${b.id}):`,c)}C.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await z(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),C.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await z(a.id);await A(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>C.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,60453)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>C.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||(0,p.X)(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,60453)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;case"flow-event":this.armed.set(a.id,function(a,b){let c=a.maxChainDepth??5,d="string"==typeof a.source.topic?a.source.topic.trim():"",e=d.length>0,f=0,g=null,h=!1;if(a.outputMatch?.regex)try{g=new RegExp(a.outputMatch.regex)}catch(c){h=!0;let a=`Invalid output-match regex: ${c instanceof Error?c.message:String(c)}`;u.warn(a),b.onError(a)}let i=b=>{if(!a.outputMatch)return!0;if(h)return!1;let c=(b??"").slice(0,16384);return(!a.outputMatch.contains||!!c.includes(a.outputMatch.contains))&&(!g||!!g.test(c))},j=(d,e,g,h)=>{if(d>=c){let a=`Flow-event chain reached the depth limit (${c}); not firing again`;u.info(a),b.onSkip(a);return}let i=Date.now();if(a.minIntervalMs&&i-f<a.minIntervalMs)return void u.debug(`Flow-event cooldown active (${a.minIntervalMs}ms); ignoring event`);f=i,b.onFire({summary:e,context:g,chainDepth:d+1,sourceConversationId:h})},k=(0,t.eh)().subscribe(c=>{try{if(e){if(!(0,t.ru)(c)||c.topic!==d||!i(c.payload))return;j(c.chainDepth,`Signal "${c.topic}"`,{topic:c.topic,payload:v(c.payload),emitterFlowId:c.emitterFlowId,flowName:c.flowName,runId:c.runId,conversationId:c.conversationId,firedBy:c.firedBy},c.conversationId);return}if((0,t.ru)(c)||!(b=>{let c=a.source;return c.executionId?b.executionId===c.executionId:c.flowId?b.flowId===c.flowId:!!c.flowName&&b.flowName===c.flowName})(c)||!c.status||!(a.on??[]).includes(c.status)||!i(c.outputText))return;let b=c.flowName??c.flowId;j(c.chainDepth,`Flow "${b}" ${c.status}`,{flowId:c.flowId,flowName:c.flowName,executionId:c.executionId,runId:c.runId,conversationId:c.conversationId,status:c.status,firedBy:c.firedBy,outputText:v(c.outputText),error:c.error},c.conversationId)}catch(c){let a=c instanceof Error?c.message:String(c);u.warn(`Flow-event handling failed: ${a}`),b.onError(a)}});return{dispose:()=>k(),nextRun:()=>null}}(b,{onFire:({summary:b,context:c,chainDepth:d,sourceConversationId:e})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"flow-event",summary:b,context:c,chainDepth:d,parentConversationId:e}).catch(b=>C.error(`Flow-event fire failed for ${a.id}:`,b))},onSkip:b=>{let c=new Date().toISOString();(0,w.Hy)(a.id,{runId:(0,d.A)(),conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:"Flow event",error:b}).catch(b=>C.warn(`Failed to record flow-event skip for ${a.id}:`,b))},onError:b=>this.lastTriggerErrors.set(a.id,b)}));break;default:C.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,D);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();if(await this.saveFile({...b,paused:a}),await this.reconcile(),a){for(let a of[...this.queued.keys()])await this.cancelQueued(a,"scheduler paused",!0);await this.cancelAllExclusiveWaiting("scheduler paused",!0)}}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,w.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[A-Za-z0-9._:-]{1,128}$/.test(a.id))return{error:"The id must be 1-128 characters of letters, digits, dot, underscore, colon or hyphen"};if("."===a.id||".."===a.id)return{error:'The id must be a safe identifier, not "." or ".."'};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`,conflict:!0}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),await this.cancelQueued(a,"execution updated",!0),await this.cancelExclusiveWaiting(a,"execution updated",!0),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await this.cancelQueued(a,"execution deleted",!1),await this.cancelExclusiveWaiting(a,"execution deleted",!1),await (0,w.xC)(a),await B(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:(0,p.X)(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";if(void 0!==a.overlapStrategy&&!["skip","queue","parallel","error"].includes(a.overlapStrategy))return"Overlap strategy must be one of: skip, queue, parallel, error";if(void 0!==a.exclusive&&"boolean"!=typeof a.exclusive)return"Exclusive must be true or false";if(void 0!==a.nonExclusiveBehavior&&!["queue","skip","error"].includes(a.nonExclusiveBehavior))return"When exclusive is on, other triggers must be one of: queue, skip, error";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"flow-event":{let a=b.source;if(1!==[a?.executionId,a?.flowId,a?.flowName,a?.topic].filter(a=>"string"==typeof a&&a.trim().length>0).length)return"Choose exactly one source: a flow, a planned execution, or a signal topic";if(!("string"==typeof a?.topic&&a.topic.trim().length>0)){if(!Array.isArray(b.on)||0===b.on.length)return"Select at least one outcome to react to (completed or error)";if(b.on.some(a=>"completed"!==a&&"error"!==a))return'Outcomes must be "completed" or "error"'}if(b.outputMatch?.regex)try{new RegExp(b.outputMatch.regex)}catch(a){return`Invalid output-match regex: ${a instanceof Error?a.message:String(a)}`}if(void 0!==b.maxChainDepth&&(!Number.isInteger(b.maxChainDepth)||b.maxChainDepth<1))return"Max chain depth must be a positive whole number";if(void 0!==b.minIntervalMs&&(!Number.isFinite(b.minIntervalMs)||b.minIntervalMs<0))return"Minimum interval must be zero or more milliseconds";return null}default:return"Unknown trigger type"}}isRunning(a){let b=this.running.get(a);return void 0!==b&&b.size>0}addRunning(a,b,c){let d=this.running.get(a);d||(d=new Map,this.running.set(a,d)),d.set(b,c)}removeRunning(a,b){let c=this.running.get(a);c&&(c.delete(b),0===c.size&&this.running.delete(a))}earliestRunningSince(a){let b,c=this.running.get(a);if(c&&0!==c.size){for(let a of c.values())(void 0===b||a<b)&&(b=a);return b}}skippedRecord(a,b){let c=new Date().toISOString();return{runId:a.runId,conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:a.payload.summary,error:b}}async cancelQueued(a,b,c){let d=this.queued.get(a);if(d&&0!==d.length){for(let e of(this.queued.delete(a),d)){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled queued fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} queued fire(s) for ${a}: ${b}`)}}drainQueue(a){let b=this.queued.get(a);if(!b||0===b.length||this.isRunning(a))return;let c=b.shift();0===b.length&&this.queued.delete(a),c&&(async()=>{let b=await this.get(a);if(!b||!b.enabled||this.pausedCache){let a=b?b.enabled?"scheduler paused":"execution disabled":"execution deleted";c.resolve(this.skippedRecord(c,a));return}let d=await this.fire(b,c.payload,c.runId);c.resolve(d)})().catch(b=>C.error(`Queued fire failed for ${a}:`,b))}isSchedulerIdle(){for(let a of this.running.values())if(a.size>0)return!1;return!0}isExclusiveActive(){return null!==this.exclusiveHolder||this.exclusiveWaiting.length>0}currentExclusiveBehavior(){return null!==this.exclusiveHolder?this.exclusiveHolderBehavior:this.exclusiveWaiting[0]?.execution.nonExclusiveBehavior??"queue"}exclusiveGateFor(a){return!0!==a.exclusive&&this.isExclusiveActive()?this.currentExclusiveBehavior():null}drainExclusive(){if(null===this.exclusiveHolder&&this.exclusiveWaiting.length>0&&this.isSchedulerIdle())return void this.acquireNextExclusive();this.isExclusiveActive()||this.drainBlockedByExclusive()}acquireNextExclusive(){if(null!==this.exclusiveHolder||!this.isSchedulerIdle())return;let a=this.exclusiveWaiting.shift();if(!a)return;let b=a.execution.id;this.exclusiveHolder=b,this.exclusiveHolderBehavior=a.execution.nonExclusiveBehavior??"queue",(async()=>{let c=await this.get(b);if(!c||!c.enabled||this.pausedCache||!0!==c.exclusive){let d=c?c.enabled?this.pausedCache?"scheduler paused":"no longer exclusive":"execution disabled":"execution deleted";this.exclusiveHolder===b&&(this.exclusiveHolder=null),a.resolve(this.skippedRecord(a,d)),this.drainExclusive();return}this.exclusiveHolderBehavior=c.nonExclusiveBehavior??"queue";let d=await this.fire(c,a.payload,a.runId);a.resolve(d)})().catch(c=>{this.exclusiveHolder===b&&(this.exclusiveHolder=null),C.error(`Exclusive acquire failed for ${b}:`,c),a.resolve(this.skippedRecord(a,"exclusive acquire failed")),this.drainExclusive()})}drainBlockedByExclusive(){if(0===this.blockedByExclusive.length)return;let a=this.blockedByExclusive;for(let b of(this.blockedByExclusive=[],a))(async()=>{let a=await this.get(b.execution.id);if(!a||!a.enabled||this.pausedCache){let c=a?a.enabled?"scheduler paused":"execution disabled":"execution deleted";b.resolve(this.skippedRecord(b,c));return}let c=await this.fire(a,b.payload,b.runId);b.resolve(c)})().catch(a=>C.error(`Deferred non-exclusive fire failed for ${b.execution.id}:`,a))}async cancelExclusiveWaiting(a,b,c){let d=[];if(this.exclusiveWaiting=this.exclusiveWaiting.filter(b=>b.execution.id!==a||(d.push(b),!1)),this.blockedByExclusive=this.blockedByExclusive.filter(b=>b.execution.id!==a||(d.push(b),!1)),0!==d.length){for(let e of d){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled exclusive fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} exclusive-related fire(s) for ${a}: ${b}`)}}async cancelAllExclusiveWaiting(a,b){let c=[...this.exclusiveWaiting,...this.blockedByExclusive];if(this.exclusiveWaiting=[],this.blockedByExclusive=[],0!==c.length){for(let d of c){let c=this.skippedRecord(d,a);if(b)try{await (0,w.Hy)(d.execution.id,c)}catch(a){C.warn(`Failed to record cancelled exclusive fire for ${d.execution.id}:`,a)}d.resolve(c)}C.info(`Cancelled ${c.length} exclusive-related fire(s): ${a}`)}}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.earliestRunningSince(a.id),e=c?void 0:a.enabled?this.pausedCache?"paused":void 0:"disabled",f=this.exclusiveHolder??void 0,g=!0!==a.exclusive&&this.isExclusiveActive();return{armed:c,notArmedReason:e,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d,exclusiveHolderId:f,blockedByExclusive:g}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"},(0,d.A)(),!0)}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)(),f=!1){let g,i=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,w.Hy)(a.id,c),C.info(`Skipped fire for "${a.name}" — encryption locked`),c}let j="flow-event"===b.kind;if(!f&&!j){if(!0===a.exclusive){if(this.exclusiveHolder!==a.id){if(null!==this.exclusiveHolder||!this.isSchedulerIdle()){let c=this.exclusiveWaiting.length;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Exclusive wait queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Exclusive wait queue full for "${a.name}" — dropped fire`),c}return C.info(`Exclusive "${a.name}" waiting for scheduler to idle (depth ${c+1})`),new Promise(c=>{this.exclusiveWaiting.push({execution:a,payload:b,runId:e,resolve:c})})}this.exclusiveHolder=a.id,this.exclusiveHolderBehavior=a.nonExclusiveBehavior??"queue",C.info(`Exclusive "${a.name}" acquired the scheduler lock`)}}else if(this.isExclusiveActive()){let c=this.currentExclusiveBehavior();if("skip"===c){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Skipped — an exclusive execution holds the scheduler lock"};return await (0,w.Hy)(a.id,c),C.info(`Skipped non-exclusive fire for "${a.name}" — exclusive lock held`),c}if("error"===c){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Rejected — an exclusive execution holds the scheduler lock"};return await (0,w.Hy)(a.id,c),C.info(`Rejected non-exclusive fire for "${a.name}" — exclusive lock held`),c}let d=this.blockedByExclusive.length;if(d>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Exclusive-block queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Exclusive-block queue full for "${a.name}" — dropped fire`),c}return C.info(`Deferred non-exclusive fire for "${a.name}" — exclusive lock held (depth ${d+1})`),new Promise(c=>{this.blockedByExclusive.push({execution:a,payload:b,runId:e,resolve:c})})}}let k=a.overlapStrategy??"skip";if(!f&&this.isRunning(a.id)){if("skip"===k){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,w.Hy)(a.id,c),C.info(`Skipped overlapping fire for "${a.name}"`),c}if("error"===k){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Overlapping run rejected (overlapStrategy=error)"};return await (0,w.Hy)(a.id,c),C.info(`Rejected overlapping fire for "${a.name}" (overlapStrategy=error)`),c}if("queue"===k){let c=this.queued.get(a.id)?.length??0;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Overlap queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Overlap queue full for "${a.name}" — dropped fire`),c}return C.info(`Queued overlapping fire for "${a.name}" (depth ${c+1})`),new Promise(c=>{let d=this.queued.get(a.id)??[];d.push({execution:a,payload:b,runId:e,resolve:c}),this.queued.set(a.id,d)})}}this.addRunning(a.id,e,i);let l=(0,d.A)();try{C.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,w.Sw)(a.id),f=d.length>0?d[d.length-1]:null,h={executionName:a.name,trigger:b.kind,now:i,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:f?{at:f.firedAt,status:f.status}:null,nextPlannedRun:this.getStatus(a).nextRun??null},j=a.approvalPolicy??"auto",k=a.saveConversations||"pause"===j?"conversation":"ephemeral",{runFlow:m}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(4671),c.e(6226),c.e(4306)]).then(c.bind(c,16226)),n=await m({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,h),mode:k,conversationId:l,source:"schedule",plannedExecutionId:a.id,parentRunId:b.parentConversationId,chainDepth:b.chainDepth??0,requireApproval:"auto"!==j,onApprovalRequired:j,debug:!1,userTurn:!0});g=await this.recordFromResult(a,n,{runId:e,conversationId:l,firedAt:i,payload:b})}catch(c){g={runId:e,conversationId:l,firedAt:i,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},C.error(`Run crashed for "${a.name}":`,c)}finally{this.removeRunning(a.id,e),this.exclusiveHolder!==a.id||this.isRunning(a.id)||(this.exclusiveHolder=null,C.info(`Exclusive "${a.name}" released the scheduler lock`)),this.drainExclusive(),this.drainQueue(a.id)}return await this.get(a.id)===null?C.info(`Dropping run record for deleted execution ${a.id}`):(await (0,w.Hy)(a.id,g),("completed"===g.status||"error"===g.status)&&await this.publishFlowRunEvent(a,g,b)),g}async recordFromResult(a,b,c){let{runId:d,conversationId:e,firedAt:f,payload:g}=c,h=new Date().toISOString(),i="awaiting_tool_approval"===b.status,j="error"===b.status&&b.error?.details?.type==="approval_required";if(i||j){let c=(b.pendingToolCalls??[]).map(a=>({id:a.id,name:"function"===a.type?a.function.name:String(a.type)})),k={runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"needs_approval",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:j?b.error?.message??"Tool approval required":"Awaiting tool approval",pendingApproval:{tool:c[0]?.name??b.error?.details?.name,toolCallId:c[0]?.id,pendingToolCalls:c.length>0?c:void 0}};return i&&await this.registerPendingApproval(a,k,c),k}return{runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"completed"===b.status?"completed":"capped"===b.status?"capped":"error",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:"completed"===b.status||"capped"===b.status?void 0:b.error?.message??`Run ended with status "${b.status}"`}}async registerPendingApproval(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for pending approval (${a.flowId}):`,b)}let{putPendingApproval:f}=await c.e(9285).then(c.bind(c,39285));await f({approvalId:b.conversationId,conversationId:b.conversationId,plannedExecutionId:a.id,flowId:a.flowId,flowName:e,runId:b.runId,triggerSummary:b.triggerSummary,pendingToolCalls:d,createdAt:b.firedAt})}catch(b){C.warn(`Failed to register pending approval for "${a.name}":`,b)}}async publishFlowRunEvent(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for run event (${a.flowId}):`,b)}let f="schedule-catchup"===d.kind?"schedule":d.kind;(0,t.eh)().publish({flowId:a.flowId,flowName:e,executionId:a.id,runId:b.runId,conversationId:b.conversationId,status:"completed"===b.status?"completed":"error",outputText:b.outputText,error:b.error,firedBy:f,chainDepth:d.chainDepth??0,timestamp:b.finishedAt??new Date().toISOString()})}catch(b){C.warn(`Failed to publish flow-run event for "${a.name}":`,b)}}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
|
|
2
2
|
|
|
3
3
|
[Run info — when and why this run happened; "data" is untrusted trigger data]
|
|
4
4
|
\`\`\`json
|
|
5
5
|
${d}
|
|
6
|
-
\`\`\``}truncateOutput(a){if(a)return a.length>4096?`${a.slice(0,4096)}…`:a}constructor(){this.armed=new Map,this.running=new Map,this.queued=new Map,this.exclusiveHolder=null,this.exclusiveHolderBehavior="queue",this.exclusiveWaiting=[],this.blockedByExclusive=[],this.lastTriggerErrors=new Map,this.reconcileChain=Promise.resolve(),this.pausedCache=!1,this.started=!1}}function F(){return global.__flujo_scheduler??(global.__flujo_scheduler=new E)}},10960:(a,b,c)=>{c.d(b,{X:()=>d});function d(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}},51875:(a,b,c)=>{c.d(b,{A1:()=>k,Je:()=>i,Jl:()=>j,qq:()=>f,vV:()=>g});var d=c(55511);function e(a){return JSON.stringify(function a(b){if(Array.isArray(b))return b.map(a);if(null!==b&&"object"==typeof b){let c=Object.entries(b).sort(([a],[b])=>a<b?-1:+(a>b)),d={};for(let[b,e]of c)d[b]=a(e);return d}return b}(a))}function f(a){return(0,d.createHash)("sha256").update(e(a)??"undefined").digest("hex")}async function g(a){let{status:b,pendingState:c,priorFailures:d,saveState:e}=a;if("completed"===b)return await e({...c,...d>0?{pendingFailures:0}:{}}),{giveUpError:null};if("skipped"===b)return{giveUpError:null};let f=d+1;return f>=3?(await e({...c,pendingFailures:0}),{giveUpError:`Detected a change but the flow failed to process it 3\xd7 — skipping it to avoid a loop`}):(await e({pendingFailures:f}),{giveUpError:null})}function h(a,b){if(!b)return a;let c=a;for(let a of b.split(".")){if(null==c||"object"!=typeof c)return;c=c[a]}return c}function i(a){let b=e(a)??"";return b.length<=8192?a:{truncated:!0,note:`Result too large to include fully (${b.length} chars); this is a preview.`,preview:b.slice(0,8192)}}function j(a,b){let c=f(a);return b.lastHash?b.lastHash===c?{fire:!1,newState:{}}:{fire:!0,summary:"Tool result changed",context:{result:i(a)},newState:{},pendingState:{lastHash:c}}:{fire:!1,newState:{lastHash:c}}}function k(a,b,c,d){let e=h(a,b);if(!Array.isArray(e))return{fire:!1,newState:{},error:`"${b||"(root)"}" did not resolve to a list in the tool result`};let g=e.map(a=>{let b=h(a,c);return{id:null==b||"object"==typeof b?`hash:${f(a)}`:String(b),item:a}}),j=d.seenIds,k=g.map(({id:a})=>a),l=(a,b)=>{let c=[...a??[]],d=new Set(c);for(let a of b)d.has(a)||(d.add(a),c.push(a));return c.slice(-1e3)};if(!j)return{fire:!1,newState:{seenIds:l(void 0,k)}};let m=new Set(j),n=g.filter(({id:a})=>!m.has(a));if(0===n.length)return{fire:!1,newState:{}};let o=n.slice(0,50);return{fire:!0,summary:1===n.length?"1 new item":`${n.length} new items`,context:{newItems:i(o.map(({item:a})=>a)),...n.length>50?{omitted:n.length-50}:{}},newState:{},pendingState:{seenIds:l(j,o.map(({id:a})=>a))}}}},52189:(a,b,c)=>{c.d(b,{O9:()=>e,Z9:()=>f,hk:()=>g,wv:()=>h});var d=c(73736);function e(a,b){try{let c=new d.l4(a,{timezone:b,paused:!0});return c.nextRun(),c.stop(),{valid:!0}}catch(a){return{valid:!1,error:a instanceof Error?a.message:"Invalid cron pattern"}}}function f(a,b,c){let e=new d.l4(a,{timezone:b,paused:!0});try{return e.nextRuns(c).map(a=>a.toISOString())}finally{e.stop()}}function g(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,paused:!0});try{let a=c.nextRun(new Date(b));return null!==a&&a.getTime()<=Date.now()}finally{c.stop()}}function h(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,unref:!0},b);return{dispose:()=>c.stop(),nextRun:()=>c.nextRun()?.toISOString()??null}}},
|
|
6
|
+
\`\`\``}truncateOutput(a){if(a)return a.length>4096?`${a.slice(0,4096)}…`:a}constructor(){this.armed=new Map,this.running=new Map,this.queued=new Map,this.exclusiveHolder=null,this.exclusiveHolderBehavior="queue",this.exclusiveWaiting=[],this.blockedByExclusive=[],this.lastTriggerErrors=new Map,this.reconcileChain=Promise.resolve(),this.pausedCache=!1,this.started=!1}}function F(){return global.__flujo_scheduler??(global.__flujo_scheduler=new E)}},10960:(a,b,c)=>{c.d(b,{X:()=>d});function d(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}},51875:(a,b,c)=>{c.d(b,{A1:()=>k,Je:()=>i,Jl:()=>j,qq:()=>f,vV:()=>g});var d=c(55511);function e(a){return JSON.stringify(function a(b){if(Array.isArray(b))return b.map(a);if(null!==b&&"object"==typeof b){let c=Object.entries(b).sort(([a],[b])=>a<b?-1:+(a>b)),d={};for(let[b,e]of c)d[b]=a(e);return d}return b}(a))}function f(a){return(0,d.createHash)("sha256").update(e(a)??"undefined").digest("hex")}async function g(a){let{status:b,pendingState:c,priorFailures:d,saveState:e}=a;if("completed"===b)return await e({...c,...d>0?{pendingFailures:0}:{}}),{giveUpError:null};if("skipped"===b)return{giveUpError:null};let f=d+1;return f>=3?(await e({...c,pendingFailures:0}),{giveUpError:`Detected a change but the flow failed to process it 3\xd7 — skipping it to avoid a loop`}):(await e({pendingFailures:f}),{giveUpError:null})}function h(a,b){if(!b)return a;let c=a;for(let a of b.split(".")){if(null==c||"object"!=typeof c)return;c=c[a]}return c}function i(a){let b=e(a)??"";return b.length<=8192?a:{truncated:!0,note:`Result too large to include fully (${b.length} chars); this is a preview.`,preview:b.slice(0,8192)}}function j(a,b){let c=f(a);return b.lastHash?b.lastHash===c?{fire:!1,newState:{}}:{fire:!0,summary:"Tool result changed",context:{result:i(a)},newState:{},pendingState:{lastHash:c}}:{fire:!1,newState:{lastHash:c}}}function k(a,b,c,d){let e=h(a,b);if(!Array.isArray(e))return{fire:!1,newState:{},error:`"${b||"(root)"}" did not resolve to a list in the tool result`};let g=e.map(a=>{let b=h(a,c);return{id:null==b||"object"==typeof b?`hash:${f(a)}`:String(b),item:a}}),j=d.seenIds,k=g.map(({id:a})=>a),l=(a,b)=>{let c=[...a??[]],d=new Set(c);for(let a of b)d.has(a)||(d.add(a),c.push(a));return c.slice(-1e3)};if(!j)return{fire:!1,newState:{seenIds:l(void 0,k)}};let m=new Set(j),n=g.filter(({id:a})=>!m.has(a));if(0===n.length)return{fire:!1,newState:{}};let o=n.slice(0,50);return{fire:!0,summary:1===n.length?"1 new item":`${n.length} new items`,context:{newItems:i(o.map(({item:a})=>a)),...n.length>50?{omitted:n.length-50}:{}},newState:{},pendingState:{seenIds:l(j,o.map(({id:a})=>a))}}}},52189:(a,b,c)=>{c.d(b,{O9:()=>e,Z9:()=>f,hk:()=>g,wv:()=>h});var d=c(73736);function e(a,b){try{let c=new d.l4(a,{timezone:b,paused:!0});return c.nextRun(),c.stop(),{valid:!0}}catch(a){return{valid:!1,error:a instanceof Error?a.message:"Invalid cron pattern"}}}function f(a,b,c){let e=new d.l4(a,{timezone:b,paused:!0});try{return e.nextRuns(c).map(a=>a.toISOString())}finally{e.stop()}}function g(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,paused:!0});try{let a=c.nextRun(new Date(b));return null!==a&&a.getTime()<=Date.now()}finally{c.stop()}}function h(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,unref:!0},b);return{dispose:()=>c.stop(),nextRun:()=>c.nextRun()?.toISOString()??null}}},59911:(a,b,c)=>{c.d(b,{Hy:()=>i,Sw:()=>h,s1:()=>j,tl:()=>k,xC:()=>l});var d=c(92372);let e=(0,c(50846).h)("backend/services/scheduler/runHistory"),f=a=>`planned-execution-runs/${a}`,g=new Map;async function h(a){try{return await (0,d.YM)(f(a),[])}catch(b){return e.error(`Failed to load run history for ${a}:`,b),[]}}async function i(a,b){let c=(g.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{let c=await h(a);c.push(b);let e=c.slice(-100);await (0,d.VH)(f(a),e)});g.set(a,c);try{await c}finally{g.get(a)===c&&g.delete(a)}}async function j(a,b,c){let e=g.get(a)??Promise.resolve(),i=null,j=e.catch(()=>{}).then(async()=>{let e=await h(a),g=e.findIndex(a=>a.runId===b);if(g<0){i=null;return}e[g]={...e[g],...c,runId:b},i=e[g],await (0,d.VH)(f(a),e)});g.set(a,j);try{await j}finally{g.get(a)===j&&g.delete(a)}return i}async function k(a){let b=await h(a);return b.length>0?b[b.length-1]:null}async function l(a){await (0,d.N2)(f(a))}}};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";exports.id=4961,exports.ids=[4961],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
|
|
2
|
+
${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},63281:(a,b,c)=>{c.d(b,{g:()=>g});var d=c(2117);let e=(0,c(19815).h)("frontend/services/flow/index");class f{async loadFlows(){e.debug("loadFlows: Entering method");try{if(this.flowsCache)return e.debug("loadFlows: Using cached flows",{count:this.flowsCache.length}),this.flowsCache;let a=await fetch("/api/flow");if(!a.ok){let b=await a.json();throw Error(b.error||"Failed to load flows")}let b=await a.json();return e.debug("loadFlows: Loaded flows from API",{count:b.length}),this.flowsCache=b,b}catch(a){return e.warn("loadFlows: Failed to load flows:",a),[]}}async getFlow(a){e.debug("getFlow: Entering method",{flowId:a});try{if(this.flowsCache){let b=this.flowsCache.find(b=>b.id===a);if(b)return e.debug("getFlow: Using cached flow",{flowId:a}),b}let b=await fetch(`/api/flow/${encodeURIComponent(a)}`);if(!b.ok){if(404===b.status)return e.debug(`getFlow: Flow ${a} not found`),null;let c=await b.json();throw Error(c.error||`Failed to get flow: ${a}`)}let c=await b.json();return e.debug("getFlow: Retrieved flow from API",{flowId:a}),c}catch(b){return e.warn(`getFlow: Failed to get flow ${a}:`,b),null}}async addFlow(a){e.debug("addFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch("/api/flow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to add flow"}}let c=await b.json();return this.flowsCache&&this.flowsCache.push(c),e.debug("addFlow: Flow added successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("addFlow: Failed to add flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to add flow"}}}async generateFlow(a,b,c){e.debug("generateFlow: Entering method",{modelId:b,allowInstall:c?.allowInstall,allowSubflows:c?.allowSubflows,maxDepth:c?.maxDepth});try{let d=await fetch("/api/flow/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({description:a,modelId:b,allowInstall:c?.allowInstall===!0,allowSubflows:c?.allowSubflows===!0,..."number"==typeof c?.maxDepth?{maxDepth:c.maxDepth}:{}})}),f=await d.json().catch(()=>null);if(!d.ok)return{success:!1,error:f?.error||"Failed to generate flow"};let g=Array.isArray(f.flows)&&f.flows.length>0?f.flows:[{flow:f.flow,validation:f.validation}];return e.debug("generateFlow: Draft generated",{flowId:f.flow?.id,flowCount:g.length,attempts:f.attempts,errorCount:f.validation?.errorCount,installedServers:f.installedServers?.length??0}),{success:!0,flow:f.flow,validation:f.validation,flows:g,rootFlowId:f.rootFlowId??f.flow?.id,attempts:f.attempts,installedServers:f.installedServers??[]}}catch(a){return e.warn("generateFlow: Failed to generate flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to generate flow"}}}async improveFlow(a,b,c,d){e.debug("improveFlow: Entering method",{flowId:a?.id,modelId:c,allowInstall:d?.allowInstall});try{let f=await fetch("/api/flow/improve",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({flow:a,description:b,modelId:c,allowInstall:d?.allowInstall===!0})}),g=await f.json().catch(()=>null);if(!f.ok)return{success:!1,error:g?.error||"Failed to improve flow"};return e.debug("improveFlow: Draft revised",{flowId:g.flow?.id,attempts:g.attempts,errorCount:g.validation?.errorCount,installedServers:g.installedServers?.length??0}),{success:!0,flow:g.flow,validation:g.validation,attempts:g.attempts,installedServers:g.installedServers??[]}}catch(a){return e.warn("improveFlow: Failed to improve flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to improve flow"}}}async updateFlow(a){e.debug("updateFlow: Entering method",{flowId:a.id,flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length});try{let b=await fetch(`/api/flow/${encodeURIComponent(a.id)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to update flow"}}let c=await b.json();if(this.flowsCache){let b=this.flowsCache.findIndex(b=>b.id===a.id);b>=0?this.flowsCache[b]=c:this.flowsCache.push(c)}return e.debug("updateFlow: Flow updated successfully",{flowId:a.id}),{success:!0}}catch(a){return e.warn("updateFlow: Failed to update flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to update flow"}}}async deleteFlow(a){e.debug("deleteFlow: Entering method",{flowId:a});try{let b=await fetch(`/api/flow/${encodeURIComponent(a)}`,{method:"DELETE"});if(!b.ok){let a=await b.json();return{success:!1,error:a.error||"Failed to delete flow"}}return this.flowsCache&&(this.flowsCache=this.flowsCache.filter(b=>b.id!==a)),e.debug("deleteFlow: Flow deleted successfully",{flowId:a}),{success:!0}}catch(a){return e.warn("deleteFlow: Failed to delete flow:",a),{success:!1,error:a instanceof Error?a.message:"Failed to delete flow"}}}async listFlowVersions(a){e.debug("listFlowVersions: Entering method",{flowId:a});try{let b=await fetch(`/api/flow/${encodeURIComponent(a)}/versions`);if(!b.ok){let a=await b.json().catch(()=>null);throw Error(a?.error||"Failed to list flow versions")}let c=await b.json();return Array.isArray(c.versions)?c.versions:[]}catch(b){return e.warn(`listFlowVersions: Failed for flow ${a}:`,b),[]}}async getFlowVersion(a,b){e.debug("getFlowVersion: Entering method",{flowId:a,versionId:b});try{let c=await fetch(`/api/flow/${encodeURIComponent(a)}/versions/${encodeURIComponent(b)}`);if(!c.ok){if(404===c.status)return null;let a=await c.json().catch(()=>null);throw Error(a?.error||"Failed to get flow version")}return await c.json()}catch(c){return e.warn(`getFlowVersion: Failed for ${a}/${b}:`,c),null}}createNode(a,b){return e.debug("createNode: Entering method",{type:a,position:b}),{id:(0,d.A)(),type:a,position:b,data:{label:`${"mcp"===a?"MCP":a.charAt(0).toUpperCase()+a.slice(1)} Node`,type:a,properties:{}}}}createStartNode(){return{id:(0,d.A)(),type:"start",position:{x:250,y:150},data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}}}createNewFlow(a="NewFlow"){e.debug("createNewFlow: Entering method",{name:a});let b=Date.now();return{id:(0,d.A)(),name:a,createdAt:b,updatedAt:b,nodes:[this.createStartNode()],edges:[]}}createHistoryEntry(a,b){return e.debug("createHistoryEntry: Entering method"),{nodes:[...a],edges:[...b]}}generateSampleFlow(a="Sample Flow"){return e.debug("generateSampleFlow: Entering method",{name:a}),{id:(0,d.A)(),name:a,nodes:[{id:"1",type:"start",position:{x:250,y:50},data:{label:"Start Node",type:"start",properties:{prompt:"Enter your query here",systemMessage:"You are a helpful assistant",temperature:0}}},{id:"2",type:"process",position:{x:250,y:200},data:{label:"Process Node",type:"process",properties:{operation:"transform",enabled:!0}}},{id:"3",type:"finish",position:{x:250,y:350},data:{label:"Finish Node",type:"finish",properties:{format:"json",template:'{ "result": {{data}} }'}}},{id:"4",type:"mcp",position:{x:450,y:200},data:{label:"MCP Node",type:"mcp",properties:{channels:2,mode:"parallel"}}}],edges:[{id:"e1-2",source:"1",target:"2",type:"custom"},{id:"e2-3",source:"2",target:"3",type:"custom"}]}}constructor(){this.flowsCache=null}}let g=new f},63654:(a,b,c)=>{c.d(b,{P:()=>f});let d=(0,c(19815).h)("frontend/services/plannedExecutions");class e{async list(){try{let a=await fetch("/api/planned-executions");if(!a.ok)throw Error(`HTTP ${a.status}`);return await a.json()}catch(a){return d.warn("Failed to list planned executions",a),{paused:!1,executions:[]}}}async create(a){try{let b=await fetch("/api/planned-executions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),c=await b.json();if(!b.ok)return{success:!1,error:c?.error||`HTTP ${b.status}`};return{success:!0,execution:c.execution}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Request failed"}}}async update(a,b){try{let c=await fetch(`/api/planned-executions/${a}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),d=await c.json();if(!c.ok)return{success:!1,error:d?.error||`HTTP ${c.status}`};return{success:!0,execution:d.execution}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Request failed"}}}async delete(a){try{let b=await fetch(`/api/planned-executions/${a}`,{method:"DELETE"});if(!b.ok){let a=await b.json().catch(()=>null);return{success:!1,error:a?.error||`HTTP ${b.status}`}}return{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Request failed"}}}async setPaused(a){try{let b=await fetch("/api/planned-executions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({paused:a})});if(!b.ok){let a=await b.json().catch(()=>null);return{success:!1,error:a?.error||`HTTP ${b.status}`}}return{success:!0}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Request failed"}}}async runNow(a){try{let b=await fetch(`/api/planned-executions/${a}/run`,{method:"POST"}),c=await b.json();if(!b.ok)return{success:!1,error:c?.error||`HTTP ${b.status}`};return{success:!0,record:c.record}}catch(a){return{success:!1,error:a instanceof Error?a.message:"Request failed"}}}async loadRuns(a){try{let b=await fetch(`/api/planned-executions/${a}/runs`);if(!b.ok)throw Error(`HTTP ${b.status}`);let c=await b.json();return Array.isArray(c?.runs)?c.runs:[]}catch(b){return d.warn(`Failed to load runs for ${a}`,b),[]}}async previewSchedule(a,b){try{let c=await fetch("/api/planned-executions/preview-schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cron:a,timezone:b})});if(!c.ok)throw Error(`HTTP ${c.status}`);return await c.json()}catch(a){return{valid:!1,error:a instanceof Error?a.message:"Preview failed",nextRuns:[]}}}}let f=new e}};
|