flujo-ai 3.23.0 → 3.26.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 +205 -186
- package/.next/app-path-routes-manifest.json +2 -2
- package/.next/build-manifest.json +7 -7
- package/.next/react-loadable-manifest.json +25 -20
- package/.next/routes-manifest.json +19 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +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 +1 -1
- package/.next/server/app/api/approvals/route.js.nft.json +1 -1
- package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/backup/route.js +1 -1
- package/.next/server/app/api/backup/route.js.nft.json +1 -1
- package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse/route.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/compile/route.js +1 -1
- package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generate/route.js +1 -1
- package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/improve/route.js +1 -1
- package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/quick-chat/route.js +1 -1
- package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/repair/route.js +1 -1
- package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/route.js.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/route.js +1 -1
- package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/[id]/route.js +1 -1
- package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/provider/route.js +1 -1
- package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
- package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/route.js +1 -1
- package/.next/server/app/api/model/route.js.nft.json +1 -1
- package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/test/route.js +1 -1
- package/.next/server/app/api/model/test/route.js.nft.json +1 -1
- package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/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/restore/route.js +1 -1
- package/.next/server/app/api/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/active/route.js +1 -1
- package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
- package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route.js +1 -1
- package/.next/server/app/api/update/route_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 +10 -10
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +4 -4
- package/.next/server/app/docs/page.js +11 -8
- 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 +3 -3
- package/.next/server/app/executions/page.js.nft.json +1 -1
- package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +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 +4 -4
- package/.next/server/app/mcp/page.js +5 -5
- 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/page.js +2 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +2 -57
- 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 +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/models/route.js +1 -1
- package/.next/server/app/v1/models/route.js.nft.json +1 -1
- package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/waves/page.js +3 -3
- package/.next/server/app/waves/page.js.nft.json +1 -1
- package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
- package/.next/server/app/waves.html +1 -1
- package/.next/server/app/waves.rsc +4 -4
- package/.next/server/app-paths-manifest.json +2 -2
- package/.next/server/chunks/1083.js +1 -1
- package/.next/server/chunks/1114.js +1 -0
- package/.next/server/chunks/1197.js +2 -2
- package/.next/server/chunks/1226.js +1 -1
- package/.next/server/chunks/166.js +5 -0
- package/.next/server/chunks/2373.js +1 -0
- package/.next/server/chunks/2859.js +1 -3
- package/.next/server/chunks/289.js +1 -1
- package/.next/server/chunks/3030.js +1 -1
- package/.next/server/chunks/3298.js +2 -0
- package/.next/server/chunks/3312.js +1 -0
- package/.next/server/chunks/3774.js +1 -1
- package/.next/server/chunks/3823.js +9 -8
- package/.next/server/chunks/3855.js +1 -0
- package/.next/server/chunks/3924.js +52 -0
- package/.next/server/chunks/4545.js +21 -0
- package/.next/server/chunks/4561.js +9 -8
- package/.next/server/chunks/4578.js +1 -0
- package/.next/server/chunks/4671.js +1 -1
- package/.next/server/chunks/4677.js +37 -0
- package/.next/server/chunks/4771.js +2 -2
- package/.next/server/chunks/4793.js +2 -0
- package/.next/server/chunks/4836.js +1 -0
- package/.next/server/chunks/5311.js +1 -1
- package/.next/server/chunks/5463.js +1 -0
- package/.next/server/chunks/5544.js +5 -0
- package/.next/server/chunks/5708.js +11 -8
- package/.next/server/chunks/584.js +1 -0
- package/.next/server/chunks/62.js +1 -1
- package/.next/server/chunks/6240.js +1 -0
- package/.next/server/chunks/6306.js +1 -0
- package/.next/server/chunks/{3928.js → 6745.js} +1 -1
- package/.next/server/chunks/6908.js +2 -2
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7214.js +6 -0
- package/.next/server/chunks/7362.js +11 -7
- package/.next/server/chunks/7463.js +6 -0
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7579.js +82 -0
- package/.next/server/chunks/7821.js +1 -1
- package/.next/server/chunks/8216.js +1 -0
- package/.next/server/chunks/8387.js +1 -0
- package/.next/server/chunks/856.js +5 -0
- package/.next/server/chunks/8652.js +1 -1
- package/.next/server/chunks/8739.js +2 -2
- package/.next/server/chunks/9165.js +1 -0
- package/.next/server/chunks/94.js +1 -0
- package/.next/server/chunks/9427.js +1 -0
- package/.next/server/edge-instrumentation.js +2 -0
- package/.next/server/edge-instrumentation.js.map +1 -0
- package/.next/server/edge-runtime-webpack.js +2 -0
- package/.next/server/edge-runtime-webpack.js.map +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +33 -2
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +14 -0
- package/.next/server/src/middleware.js.map +1 -0
- package/.next/static/chunks/1675-773454288de4309d.js +1 -0
- package/.next/static/chunks/1731-6e45fb529f9044a3.js +1 -0
- package/.next/static/chunks/1871-14c3e63ca865d85e.js +1 -0
- package/.next/static/chunks/2003-7710c23acaef11c9.js +1 -0
- package/.next/static/chunks/2318-76fcb6c769b1a569.js +1 -0
- package/.next/static/chunks/2566-6e2b9d9349814789.js +1 -0
- package/.next/static/chunks/2734-59fbe2f62a59df86.js +1 -0
- package/.next/static/chunks/3089.6b4e21e1faa304e2.js +1 -0
- package/.next/static/chunks/3109-11bdec9bdfd996c3.js +1 -0
- package/.next/static/chunks/3217.f728df99ab5da33c.js +1 -0
- package/.next/static/chunks/333-5f3c5be57c80c48c.js +1 -0
- package/.next/static/chunks/3333-b7b3e5758a568013.js +1 -0
- package/.next/static/chunks/3556-3b6f7c99b015b752.js +1 -0
- package/.next/static/chunks/{6730-c330b55cd0fe4f47.js → 4003-3b3768446ae333df.js} +1 -1
- package/.next/static/chunks/4523-a540747aa2ed34e8.js +1 -0
- package/.next/static/chunks/4635-0fe310d3be64e71e.js +1 -0
- package/.next/static/chunks/4690-ec7d397cfacedac3.js +1 -0
- package/.next/static/chunks/4775-cb9c0be621363a08.js +8 -0
- package/.next/static/chunks/5336-81da1080de29ebfc.js +1 -0
- package/.next/static/chunks/5512.d01d565f73109a1a.js +1 -0
- package/.next/static/chunks/6691-117567b2b40cd9f4.js +1 -0
- package/.next/static/chunks/7274-1184563607f2b5f5.js +1 -0
- package/.next/static/chunks/8166-e75acdc559b34fcd.js +1 -0
- package/.next/static/chunks/8345.fbc0af16acce7256.js +1 -0
- package/.next/static/chunks/8405.e728bc83a7c9fed6.js +1 -0
- package/.next/static/chunks/8470-72cf748472d4d501.js +1 -0
- package/.next/static/chunks/8607-5787e42775fc3acb.js +1 -0
- package/.next/static/chunks/8610-660d5088bc1dd7a7.js +1 -0
- package/.next/static/chunks/8834-faf121e257b517d5.js +1 -0
- package/.next/static/chunks/8989-401559d9f3bc80a0.js +1 -0
- package/.next/static/chunks/{9164-d9f1abba780231e0.js → 9164-829ab5b085ec06d6.js} +1 -1
- package/.next/static/chunks/9240-d0a51f4d504f34b1.js +1 -0
- package/.next/static/chunks/9562-b7922ceb400ec536.js +1 -0
- package/.next/static/chunks/9704-6b7415964d7c042a.js +1 -0
- package/.next/static/chunks/app/chat/page-04ad1fad78048afb.js +1 -0
- package/.next/static/chunks/app/docs/page-5475c616764dbb18.js +1 -0
- package/.next/static/chunks/app/executions/page-c18708ed96d228ec.js +1 -0
- package/.next/static/chunks/app/flows/page-f7e44aa545bcc56e.js +1 -0
- package/.next/static/chunks/app/layout-e6fbae80e0f456a6.js +1 -0
- package/.next/static/chunks/app/mcp/page-3638fbee04a3a6ea.js +1 -0
- package/.next/static/chunks/app/models/error-5732fbb053e182c5.js +1 -0
- package/.next/static/chunks/app/models/page-e690a986047b1e62.js +1 -0
- package/.next/static/chunks/app/{page-a859e4dbd180df98.js → page-0a95c40a65dbd2eb.js} +1 -1
- package/.next/static/chunks/app/settings/page-3ef9b95187e18a5a.js +1 -0
- package/.next/static/chunks/app/waves/page-c9a307e2236423a4.js +1 -0
- package/.next/static/chunks/{main-be8e823624954fab.js → main-9bda5041078d2b6a.js} +1 -1
- package/.next/static/chunks/webpack-a6844e1074885c2f.js +1 -0
- package/.next/static/css/40f9bef305b11bf5.css +1 -0
- package/.next/trace +10 -8
- package/README.md +31 -1
- package/next.config.mjs +139 -119
- package/package.json +1 -1
- package/.next/server/chunks/1119.js +0 -1
- package/.next/server/chunks/1439.js +0 -1
- package/.next/server/chunks/1556.js +0 -52
- package/.next/server/chunks/1910.js +0 -37
- package/.next/server/chunks/1999.js +0 -1
- package/.next/server/chunks/2246.js +0 -1
- package/.next/server/chunks/264.js +0 -17
- package/.next/server/chunks/2823.js +0 -6
- package/.next/server/chunks/3286.js +0 -6
- package/.next/server/chunks/4637.js +0 -81
- package/.next/server/chunks/6644.js +0 -1
- package/.next/server/chunks/7427.js +0 -1
- package/.next/server/chunks/7769.js +0 -6
- package/.next/server/chunks/8357.js +0 -1
- package/.next/server/chunks/8518.js +0 -2
- package/.next/static/chunks/1620-0d8ecd877f123f7b.js +0 -1
- package/.next/static/chunks/1871-dd8c10ed9d37100b.js +0 -1
- package/.next/static/chunks/1983-242862b3dc022a26.js +0 -1
- package/.next/static/chunks/2003-460f30484998c05d.js +0 -1
- package/.next/static/chunks/2619-04bc32f026a0d946.js +0 -1
- package/.next/static/chunks/3217.058098140ec3f563.js +0 -1
- package/.next/static/chunks/3736-5e2b3f6cda1bb923.js +0 -1
- package/.next/static/chunks/4207-41abb9622eb4b4f8.js +0 -1
- package/.next/static/chunks/4812-4a9aceb49632a973.js +0 -1
- package/.next/static/chunks/5501-f5b093c8dfd74196.js +0 -1
- package/.next/static/chunks/5545-2ab6e5d749e103cd.js +0 -1
- package/.next/static/chunks/6016.8201fa15ab6aa90e.js +0 -1
- package/.next/static/chunks/6288-a285bbbd701e0dbf.js +0 -1
- package/.next/static/chunks/6731-c230e88cf0032609.js +0 -1
- package/.next/static/chunks/6920-a83ad5c0d5a54cf3.js +0 -1
- package/.next/static/chunks/7430-6e78aaeac66988a9.js +0 -1
- package/.next/static/chunks/7583.7af90b94e3c263f2.js +0 -1
- package/.next/static/chunks/7687-7edf1a6e1f063b08.js +0 -1
- package/.next/static/chunks/8083.16fda2c7f6d10d0c.js +0 -1
- package/.next/static/chunks/8480-229fd353b68b570f.js +0 -1
- package/.next/static/chunks/8548-8e4a95334064e8b2.js +0 -1
- package/.next/static/chunks/8834-bda798efab40c60a.js +0 -1
- package/.next/static/chunks/9181-8d8ecd3f641b7209.js +0 -8
- package/.next/static/chunks/9356-99ba407b60b9dfe9.js +0 -1
- package/.next/static/chunks/9451-680fa09f81f18806.js +0 -1
- package/.next/static/chunks/9659-a279e3aaba407251.js +0 -1
- package/.next/static/chunks/app/chat/page-ea6752144d35c892.js +0 -1
- package/.next/static/chunks/app/docs/page-935b0386917b91bb.js +0 -1
- package/.next/static/chunks/app/executions/page-d72027b0179e8fa2.js +0 -1
- package/.next/static/chunks/app/flows/page-1844e86dd43fa285.js +0 -1
- package/.next/static/chunks/app/layout-2ebf01d97702a18a.js +0 -1
- package/.next/static/chunks/app/mcp/page-b6866f49f76a6801.js +0 -1
- package/.next/static/chunks/app/models/error-a3183f168e8a9b04.js +0 -1
- package/.next/static/chunks/app/models/page-5a13ea6ff5ac1b9c.js +0 -1
- package/.next/static/chunks/app/settings/page-7a68583660508ffd.js +0 -1
- package/.next/static/chunks/app/waves/page-ec33cf79f6103a9e.js +0 -1
- package/.next/static/chunks/webpack-f4a471ab560eb19e.js +0 -1
- package/.next/static/css/39393a79f7cb0dee.css +0 -1
- /package/.next/static/{WRUzIBdypUJvv0xAct8qc → Il6IDWxf3CN0dv-P6QQrp}/_buildManifest.js +0 -0
- /package/.next/static/{WRUzIBdypUJvv0xAct8qc → Il6IDWxf3CN0dv-P6QQrp}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974,9195],{55090:(e,t,n)=>{Promise.resolve().then(n.bind(n,89547))},69195:(e,t,n)=>{"use strict";n.r(t),n.d(t,{TourProvider:()=>d,useTour:()=>l});var a=n(95155),o=n(12115),i=n(9164),r=n(77326);let s=(0,n(87021).h)("frontend/contexts/TourContext"),c=(0,o.createContext)({isActive:!1,stepIndex:0,startTour:()=>{},next:()=>{},back:()=>{},endTour:()=>{}}),l=()=>(0,o.useContext)(c),d=e=>{var t;let{children:n}=e,{settings:l,updateSettings:d,isLoading:u,settingsHydrated:h}=(0,i.useStorage)(),[p,f]=(0,o.useState)(!1),[g,m]=(0,o.useState)(0),y=(0,o.useRef)(!1),b=(0,o.useCallback)(()=>{var e;d({...l,onboarding:{...null!=(e=l.onboarding)?e:{},completed:!0}}).catch(e=>s.warn("Failed to persist onboarding completion",e))},[l,d]),v=(0,o.useCallback)(()=>{s.info("Starting guided tour"),m(0),f(!0)},[]),w=(0,o.useCallback)(()=>{s.info("Ending guided tour"),f(!1),b()},[b]),k=(0,o.useCallback)(()=>{m(e=>e>=r.$.length-1?(f(!1),b(),e):e+1)},[b]),x=(0,o.useCallback)(()=>{m(e=>Math.max(0,e-1))},[]);return(0,o.useEffect)(()=>{var e;u||!h||y.current||(y.current=!0,(null==(e=l.onboarding)?void 0:e.completed)!==!0&&(s.info("First run detected — auto-starting guided tour"),v()))},[u,h,null==(t=l.onboarding)?void 0:t.completed,v]),(0,a.jsx)(c.Provider,{value:{isActive:p,stepIndex:g,startTour:v,next:k,back:x,endTour:w},children:n})}},77326:(e,t,n)=>{"use strict";n.d(t,{$:()=>a});let a=[{id:"welcome",path:"/",placement:"center",title:"Welcome to FLUJO \uD83D\uDC4B",body:"This quick tour walks you through going from zero to a running AI flow.\n\nYou'll add a model, connect a tool server, build a flow, and run it in chat. It takes about a minute — you can skip any time."},{id:"add-model",path:"/models",target:'[data-tour="add-model"]',placement:"bottom",title:"1. Add a model",body:'FLUJO needs at least one AI model to think with. Click "Add Model" to configure one.\n\nTip: an OpenRouter API key gives you access to several free models — paste the key, name the model, pick a free one, and add a custom instruction.'},{id:"add-mcp-server",path:"/mcp",target:'[data-tour="add-mcp-server"]',placement:"bottom",title:"2. Connect a tool server (MCP)",body:'MCP servers give your model real tools — file access, image generation, web search, and more.\n\nClick "Add Server" and install the "Everything" reference server to try the full range of capabilities while you learn.'},{id:"new-flow",path:"/flows",target:'[data-tour="new-flow"]',placement:"bottom",title:"3. Build a flow",body:'A flow wires everything together. Click "New Flow" to open the builder.\n\nConnect Start → Process → Finish, attach your model to the Process node, and bind the Everything MCP server so the model can use its tools.'},{id:"chat-input",path:"/chat",target:'[data-tour="chat-input"]',placement:"top",title:"4. Run it in chat",body:"Pick your flow from the selector, then send a message here.\n\nTry asking it to generate an image with the MCP server and tell you a joke — you'll see the flow execute live, step by step."},{id:"docs",path:"/chat",target:'[data-tour="nav-docs"]',placement:"bottom",title:"Need the API?",body:"FLUJO exposes an OpenAI-compatible API and a full REST surface. The Docs page lists every endpoint with its method, parameters, and response shape.\n\nYou can re-run this tour any time from Settings → Onboarding."},{id:"finish",path:"/chat",placement:"center",title:"You're all set \uD83C\uDF89",body:"That's the whole loop: models, tools, flows, and chat.\n\nExplore at your own pace — and remember the Docs page and Settings are there when you need them."}]},87021:(e,t,n)=>{"use strict";n.d(t,{h:()=>c});let a={LOG_LEVEL:3},o={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},i="number"==typeof a.LOG_LEVEL?a.LOG_LEVEL:o.ERROR;function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t>6)return String(e);if(!(e instanceof Error))return e;let n={name:e.name,message:e.message};for(let a of Object.getOwnPropertyNames(e)){if("name"===a||"message"===a)continue;let o=e[a];"function"!=typeof o&&("stack"===a?n.stack=o:"cause"===a?n.cause=r(o,t+1):"errors"===a&&Array.isArray(o)?n.errors=o.map(e=>r(e,t+1)):n[a]=o)}return n}function s(e,t,n,a,s){if(e>=("number"==typeof s?s:i)){if("function"==typeof a)try{a=a()}catch(e){a="[lazy log data threw]"}let i=new Date().toISOString(),s="[".concat(i,"] [").concat(t,"]"),c="".concat(s," ").concat(n);if(void 0!==a)if(a instanceof Error||"object"==typeof a)try{let e=a instanceof Error?r(a):a,t=JSON.stringify(e,(e,t)=>t instanceof Error?r(t):t,2);c+=":\n".concat(t)}catch(e){c+=": [Object cannot be stringified]"}else c+=": ".concat(a);switch(e){case o.VERBOSE:console.debug("[VERBOSE] ".concat(c));break;case o.DEBUG:console.debug(c);break;case o.INFO:console.info(c);break;case o.WARN:console.warn(c);break;case o.ERROR:console.error(c);break;default:console.log(c)}}}function c(e,t){let n,a=((n=e.replace(/^src\//,"")).startsWith("/")&&(n=n.substring(1)),n);return{verbose:(e,n)=>{s(o.VERBOSE,a,e,n,t)},debug:(e,n)=>{s(o.DEBUG,a,e,n,t)},info:(e,n)=>{s(o.INFO,a,e,n,t)},warn:(e,n)=>{s(o.WARN,a,e,n,t)},error:(e,n)=>{s(o.ERROR,a,e,n,t)}}}},89547:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>k});var a=n(95155),o=n(97322),i=n(22003),r=n(91871),s=n(4474),c=n(94049),l=n(25635),d=n(33077),u=n(2300),h=n(52619),p=n.n(h),f=n(15239),g=n(12115),m=n(87021),y=n(9164),b=n(69195);let v=(0,m.h)("app/page"),w=[{title:"Model Management",description:"Securely store and manage your AI model configurations and API keys.",icon:"/file.svg",link:"/models"},{title:"MCP Integration",description:"Connect and manage MCP servers with environment variables and tool testing.",icon:"/globe.svg",link:"/mcp"},{title:"Flow Builder",description:"Create and manage visual flows for your AI applications.",icon:"/window.svg",link:"/flows"}];function k(){var e;v.debug("Rendering HomePage");let{settings:t}=(0,y.useStorage)(),{startTour:n}=(0,b.useTour)(),[h,m]=(0,g.useState)(!0),[k,x]=(0,g.useState)(!1),[E,O]=(0,g.useState)(null),[A,S]=(0,g.useState)(!1),[j,C]=(0,g.useState)(null),R=(0,g.useRef)(!1);(0,g.useEffect)(()=>{var e;(null==t||null==(e=t.update)?void 0:e.checkOnStartup)&&!R.current&&(R.current=!0,(async()=>{try{v.info("Checking for FLUJO updates");let e=await fetch("/api/update");if(!e.ok)return;let t=await e.json();t.updateAvailable&&O({behindBy:t.behindBy,branch:t.branch})}catch(e){v.warn("Update check failed",e)}})())},[null==t||null==(e=t.update)?void 0:e.checkOnStartup]);let P=async()=>{S(!0),C(null);try{let e=await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"apply"})}),t=await e.json();if(!e.ok||!1===t.success){C(t.error||"Update failed."),S(!1);return}if(t.restarting){let e=!1,t=async()=>{try{if((await fetch("/api/cwd",{cache:"no-store"})).ok&&e)return void window.location.reload()}catch(t){e=!0}setTimeout(t,3e3)};setTimeout(t,5e3)}else S(!1),O(null)}catch(e){v.error("Update failed",e),C("Update failed."),S(!1)}};return(0,g.useEffect)(()=>{v.info("Checking encryption status"),(async()=>{try{v.debug("Fetching encryption initialization status");let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_initialized"})});if(e.ok){let t=await e.json();if(v.debug("Encryption initialization status received",{initialized:t.initialized}),m(!0===t.initialized),!0===t.initialized){v.debug("Checking if user encryption is enabled");let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_user_encryption"})});if(e.ok){let t=await e.json();v.debug("User encryption status received",{userEncryption:t.userEncryption}),x(!0===t.userEncryption)}}}else v.error("Failed to check encryption status"),m(!1)}catch(e){v.error("Error checking encryption status",e),m(!1)}})()},[]),(0,a.jsxs)(o.A,{maxWidth:"lg",sx:{py:8},children:[E&&(0,a.jsx)(i.A,{severity:"info",sx:{mb:4},action:(0,a.jsx)(r.A,{color:"inherit",size:"small",onClick:P,disabled:A,startIcon:A?(0,a.jsx)(s.default,{size:16,color:"inherit"}):void 0,children:A?"Updating…":"Update now"}),children:A?"Updating FLUJO and restarting — the page will reload automatically.":"A FLUJO update is available (".concat(E.behindBy," new commit").concat(1===E.behindBy?"":"s"," on ").concat(E.branch,").")}),j&&(0,a.jsx)(i.A,{severity:"error",sx:{mb:4},onClose:()=>C(null),children:j}),h?k?null:(0,a.jsxs)(i.A,{severity:"info",sx:{mb:4},children:["Your data is protected with default encryption. For enhanced security, set a custom encryption password in the ",(0,a.jsx)(p(),{href:"/settings",children:"settings"}),"."]}):(0,a.jsxs)(i.A,{severity:"warning",sx:{mb:4},children:["Warning: Encryption is not initialized. Sensitive data may not be properly protected. Please visit the ",(0,a.jsx)(p(),{href:"/settings",children:"settings"})," page."]}),(0,a.jsxs)(c.default,{sx:{textAlign:"center",mb:8},children:[(0,a.jsx)(l.default,{variant:"h2",component:"h1",gutterBottom:!0,children:"FLUJO"}),(0,a.jsx)(l.default,{variant:"h5",color:"text.secondary",sx:{mb:4},children:"A browser-based application for managing models, MCP servers, flows and chat interactions"}),(0,a.jsx)(r.A,{variant:"contained",size:"large",sx:{mr:2},onClick:n,children:"Get Started"})]}),(0,a.jsx)(d.Ay,{container:!0,spacing:4,children:w.map(e=>(0,a.jsx)(d.Ay,{item:!0,xs:12,md:4,children:(0,a.jsxs)(u.A,{component:p(),href:e.link,sx:{p:4,height:"100%",display:"flex",flexDirection:"column",alignItems:"center",textAlign:"center",textDecoration:"none",color:"text.primary",transition:"transform 0.2s","&:hover":{transform:"translateY(-4px)"}},children:[(0,a.jsx)(c.default,{sx:{mb:2,width:48,height:48,position:"relative"},children:(0,a.jsx)(f.default,{src:e.icon,alt:e.title,fill:!0,style:{objectFit:"contain"}})}),(0,a.jsx)(l.default,{variant:"h5",component:"h2",gutterBottom:!0,children:e.title}),(0,a.jsx)(l.default,{color:"text.secondary",children:e.description})]})},e.title))})]})}}},e=>{e.O(0,[2678,4754,9244,8548,1983,1871,2003,3077,2619,8834,9164,8441,1255,7358],()=>e(e.s=55090)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974,9195],{55090:(e,t,n)=>{Promise.resolve().then(n.bind(n,89547))},69195:(e,t,n)=>{"use strict";n.r(t),n.d(t,{TourProvider:()=>d,useTour:()=>l});var a=n(95155),o=n(12115),i=n(9164),r=n(77326);let s=(0,n(87021).h)("frontend/contexts/TourContext"),c=(0,o.createContext)({isActive:!1,stepIndex:0,startTour:()=>{},next:()=>{},back:()=>{},endTour:()=>{}}),l=()=>(0,o.useContext)(c),d=e=>{var t;let{children:n}=e,{settings:l,updateSettings:d,isLoading:u,settingsHydrated:h}=(0,i.useStorage)(),[p,f]=(0,o.useState)(!1),[g,m]=(0,o.useState)(0),y=(0,o.useRef)(!1),b=(0,o.useCallback)(()=>{var e;d({...l,onboarding:{...null!=(e=l.onboarding)?e:{},completed:!0}}).catch(e=>s.warn("Failed to persist onboarding completion",e))},[l,d]),v=(0,o.useCallback)(()=>{s.info("Starting guided tour"),m(0),f(!0)},[]),w=(0,o.useCallback)(()=>{s.info("Ending guided tour"),f(!1),b()},[b]),k=(0,o.useCallback)(()=>{m(e=>e>=r.$.length-1?(f(!1),b(),e):e+1)},[b]),x=(0,o.useCallback)(()=>{m(e=>Math.max(0,e-1))},[]);return(0,o.useEffect)(()=>{var e;u||!h||y.current||(y.current=!0,(null==(e=l.onboarding)?void 0:e.completed)!==!0&&(s.info("First run detected — auto-starting guided tour"),v()))},[u,h,null==(t=l.onboarding)?void 0:t.completed,v]),(0,a.jsx)(c.Provider,{value:{isActive:p,stepIndex:g,startTour:v,next:k,back:x,endTour:w},children:n})}},77326:(e,t,n)=>{"use strict";n.d(t,{$:()=>a});let a=[{id:"welcome",path:"/",placement:"center",title:"Welcome to FLUJO \uD83D\uDC4B",body:"This quick tour walks you through going from zero to a running AI flow.\n\nYou'll add a model, connect a tool server, build a flow, and run it in chat. It takes about a minute — you can skip any time."},{id:"add-model",path:"/models",target:'[data-tour="add-model"]',placement:"bottom",title:"1. Add a model",body:'FLUJO needs at least one AI model to think with. Click "Add Model" to configure one.\n\nTip: an OpenRouter API key gives you access to several free models — paste the key, name the model, pick a free one, and add a custom instruction.'},{id:"add-mcp-server",path:"/mcp",target:'[data-tour="add-mcp-server"]',placement:"bottom",title:"2. Connect a tool server (MCP)",body:'MCP servers give your model real tools — file access, image generation, web search, and more.\n\nClick "Add Server" and install the "Everything" reference server to try the full range of capabilities while you learn.'},{id:"new-flow",path:"/flows",target:'[data-tour="new-flow"]',placement:"bottom",title:"3. Build a flow",body:'A flow wires everything together. Click "New Flow" to open the builder.\n\nConnect Start → Process → Finish, attach your model to the Process node, and bind the Everything MCP server so the model can use its tools.'},{id:"chat-input",path:"/chat",target:'[data-tour="chat-input"]',placement:"top",title:"4. Run it in chat",body:"Pick your flow from the selector, then send a message here.\n\nTry asking it to generate an image with the MCP server and tell you a joke — you'll see the flow execute live, step by step."},{id:"docs",path:"/chat",target:'[data-tour="nav-docs"]',placement:"bottom",title:"Need the API?",body:"FLUJO exposes an OpenAI-compatible API and a full REST surface. The Docs page lists every endpoint with its method, parameters, and response shape.\n\nYou can re-run this tour any time from Settings → Onboarding."},{id:"finish",path:"/chat",placement:"center",title:"You're all set \uD83C\uDF89",body:"That's the whole loop: models, tools, flows, and chat.\n\nExplore at your own pace — and remember the Docs page and Settings are there when you need them."}]},87021:(e,t,n)=>{"use strict";n.d(t,{h:()=>c});let a={LOG_LEVEL:3},o={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},i="number"==typeof a.LOG_LEVEL?a.LOG_LEVEL:o.ERROR;function r(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t>6)return String(e);if(!(e instanceof Error))return e;let n={name:e.name,message:e.message};for(let a of Object.getOwnPropertyNames(e)){if("name"===a||"message"===a)continue;let o=e[a];"function"!=typeof o&&("stack"===a?n.stack=o:"cause"===a?n.cause=r(o,t+1):"errors"===a&&Array.isArray(o)?n.errors=o.map(e=>r(e,t+1)):n[a]=o)}return n}function s(e,t,n,a,s){if(e>=("number"==typeof s?s:i)){if("function"==typeof a)try{a=a()}catch(e){a="[lazy log data threw]"}let i=new Date().toISOString(),s="[".concat(i,"] [").concat(t,"]"),c="".concat(s," ").concat(n);if(void 0!==a)if(a instanceof Error||"object"==typeof a)try{let e=a instanceof Error?r(a):a,t=JSON.stringify(e,(e,t)=>t instanceof Error?r(t):t,2);c+=":\n".concat(t)}catch(e){c+=": [Object cannot be stringified]"}else c+=": ".concat(a);switch(e){case o.VERBOSE:console.debug("[VERBOSE] ".concat(c));break;case o.DEBUG:console.debug(c);break;case o.INFO:console.info(c);break;case o.WARN:console.warn(c);break;case o.ERROR:console.error(c);break;default:console.log(c)}}}function c(e,t){let n,a=((n=e.replace(/^src\//,"")).startsWith("/")&&(n=n.substring(1)),n);return{verbose:(e,n)=>{s(o.VERBOSE,a,e,n,t)},debug:(e,n)=>{s(o.DEBUG,a,e,n,t)},info:(e,n)=>{s(o.INFO,a,e,n,t)},warn:(e,n)=>{s(o.WARN,a,e,n,t)},error:(e,n)=>{s(o.ERROR,a,e,n,t)}}}},89547:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>k});var a=n(95155),o=n(97322),i=n(22003),r=n(91871),s=n(4474),c=n(94049),l=n(25635),d=n(33077),u=n(2300),h=n(52619),p=n.n(h),f=n(15239),g=n(12115),m=n(87021),y=n(9164),b=n(69195);let v=(0,m.h)("app/page"),w=[{title:"Model Management",description:"Securely store and manage your AI model configurations and API keys.",icon:"/file.svg",link:"/models"},{title:"MCP Integration",description:"Connect and manage MCP servers with environment variables and tool testing.",icon:"/globe.svg",link:"/mcp"},{title:"Flow Builder",description:"Create and manage visual flows for your AI applications.",icon:"/window.svg",link:"/flows"}];function k(){var e;v.debug("Rendering HomePage");let{settings:t}=(0,y.useStorage)(),{startTour:n}=(0,b.useTour)(),[h,m]=(0,g.useState)(!0),[k,x]=(0,g.useState)(!1),[E,O]=(0,g.useState)(null),[A,S]=(0,g.useState)(!1),[j,C]=(0,g.useState)(null),R=(0,g.useRef)(!1);(0,g.useEffect)(()=>{var e;(null==t||null==(e=t.update)?void 0:e.checkOnStartup)&&!R.current&&(R.current=!0,(async()=>{try{v.info("Checking for FLUJO updates");let e=await fetch("/api/update");if(!e.ok)return;let t=await e.json();t.updateAvailable&&O({behindBy:t.behindBy,branch:t.branch})}catch(e){v.warn("Update check failed",e)}})())},[null==t||null==(e=t.update)?void 0:e.checkOnStartup]);let P=async()=>{S(!0),C(null);try{let e=await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"apply"})}),t=await e.json();if(!e.ok||!1===t.success){C(t.error||"Update failed."),S(!1);return}if(t.restarting){let e=!1,t=async()=>{try{if((await fetch("/api/cwd",{cache:"no-store"})).ok&&e)return void window.location.reload()}catch(t){e=!0}setTimeout(t,3e3)};setTimeout(t,5e3)}else S(!1),O(null)}catch(e){v.error("Update failed",e),C("Update failed."),S(!1)}};return(0,g.useEffect)(()=>{v.info("Checking encryption status"),(async()=>{try{v.debug("Fetching encryption initialization status");let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_initialized"})});if(e.ok){let t=await e.json();if(v.debug("Encryption initialization status received",{initialized:t.initialized}),m(!0===t.initialized),!0===t.initialized){v.debug("Checking if user encryption is enabled");let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_user_encryption"})});if(e.ok){let t=await e.json();v.debug("User encryption status received",{userEncryption:t.userEncryption}),x(!0===t.userEncryption)}}}else v.error("Failed to check encryption status"),m(!1)}catch(e){v.error("Error checking encryption status",e),m(!1)}})()},[]),(0,a.jsxs)(o.A,{maxWidth:"lg",sx:{py:8},children:[E&&(0,a.jsx)(i.A,{severity:"info",sx:{mb:4},action:(0,a.jsx)(r.A,{color:"inherit",size:"small",onClick:P,disabled:A,startIcon:A?(0,a.jsx)(s.default,{size:16,color:"inherit"}):void 0,children:A?"Updating…":"Update now"}),children:A?"Updating FLUJO and restarting — the page will reload automatically.":"A FLUJO update is available (".concat(E.behindBy," new commit").concat(1===E.behindBy?"":"s"," on ").concat(E.branch,").")}),j&&(0,a.jsx)(i.A,{severity:"error",sx:{mb:4},onClose:()=>C(null),children:j}),h?k?null:(0,a.jsxs)(i.A,{severity:"info",sx:{mb:4},children:["Your data is protected with default encryption. For enhanced security, set a custom encryption password in the ",(0,a.jsx)(p(),{href:"/settings",children:"settings"}),"."]}):(0,a.jsxs)(i.A,{severity:"warning",sx:{mb:4},children:["Warning: Encryption is not initialized. Sensitive data may not be properly protected. Please visit the ",(0,a.jsx)(p(),{href:"/settings",children:"settings"})," page."]}),(0,a.jsxs)(c.default,{sx:{textAlign:"center",mb:8},children:[(0,a.jsx)(l.default,{variant:"h2",component:"h1",gutterBottom:!0,children:"FLUJO"}),(0,a.jsx)(l.default,{variant:"h5",color:"text.secondary",sx:{mb:4},children:"A browser-based application for managing models, MCP servers, flows and chat interactions"}),(0,a.jsx)(r.A,{variant:"contained",size:"large",sx:{mr:2},onClick:n,children:"Get Started"})]}),(0,a.jsx)(d.Ay,{container:!0,spacing:4,children:w.map(e=>(0,a.jsx)(d.Ay,{item:!0,xs:12,md:4,children:(0,a.jsxs)(u.A,{component:p(),href:e.link,sx:{p:4,height:"100%",display:"flex",flexDirection:"column",alignItems:"center",textAlign:"center",textDecoration:"none",color:"text.primary",transition:"transform 0.2s","&:hover":{transform:"translateY(-4px)"}},children:[(0,a.jsx)(c.default,{sx:{mb:2,width:48,height:48,position:"relative"},children:(0,a.jsx)(f.default,{src:e.icon,alt:e.title,fill:!0,style:{objectFit:"contain"}})}),(0,a.jsx)(l.default,{variant:"h5",component:"h2",gutterBottom:!0,children:e.title}),(0,a.jsx)(l.default,{color:"text.secondary",children:e.description})]})},e.title))})]})}}},e=>{e.O(0,[2678,4754,9244,7274,1871,2003,3077,4523,8834,9164,8441,1255,7358],()=>e(e.s=55090)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4662,9195],{748:(e,t,r)=>{"use strict";r.d(t,{kY:()=>o,Ic:()=>i});var a=r(26796),n=r(87021);let o={light:{background:"#FFFFFF",foreground:"#2C3E50",surface:"#F5F6FA",surfaceRaised:"#FFFFFF",paperBackground:"#F5F6FA",textSecondary:"#7F8C8D",textDisabled:"#9CA3AF",border:"#e5e7eb",heading:"#111",text:"#333",secondaryText:"#666",error:{background:"#fef2f2",border:"#fecaca",text:"#dc2626"},domain:{resource:"#009688",resourceSoft:"#4DB6AC",signal:"#7E57C2",startNode:"#795548",codeBackground:"#f5f5f5",http:{get:"#2e7d32",post:"#1565c0",put:"#e65100",patch:"#6a1b9a",delete:"#c62828"},transport:{stdio:{fg:"#1976d2",bg:"#e3f2fd"},websocket:{fg:"#2e7d32",bg:"#e8f5e8"},sse:{fg:"#f57c00",bg:"#fff3e0"},streamable:{fg:"#00796b",bg:"#e0f2f1"},default:{fg:"#757575",bg:"#f5f5f5"}}}},dark:{background:"#0f1319",foreground:"#eef1f5",surface:"#1a212b",surfaceRaised:"#242d3a",paperBackground:"#1a212b",textSecondary:"#b4bdca",textDisabled:"#6b7280",border:"#37404e",heading:"#f5f7fa",text:"#eef1f5",secondaryText:"#b4bdca",error:{background:"#2a1618",border:"#5a2a2e",text:"#ff6b6b"},domain:{resource:"#26a69a",resourceSoft:"#4DB6AC",signal:"#9575CD",startNode:"#a1887f",codeBackground:"#242d3a",http:{get:"#66bb6a",post:"#5b9dff",put:"#ffa726",patch:"#ba68c8",delete:"#ef5350"},transport:{stdio:{fg:"#90caf9",bg:"#1e2a3a"},websocket:{fg:"#a5d6a7",bg:"#1e2e22"},sse:{fg:"#ffcc80",bg:"#33281a"},streamable:{fg:"#80cbc4",bg:"#17322e"},default:{fg:"#b4bdca",bg:"#242d3a"}}}}},s=(0,n.h)("frontend/utils/theme");function i(){let{isDarkMode:e}=(0,a.useTheme)();return s.debug("useThemeUtils called with isDarkMode: ".concat(e)),{getThemeValue:(t,r)=>e?r:t,getThemeColor:t=>{let r=t.split("."),a=o[e?"dark":"light"];for(let e of r)if(!a||"object"!=typeof a||!(e in a))return s.warn("Theme color path not found: ".concat(t)),"";else a=a[e];return a},colors:e?o.dark:o.light,isDarkMode:e}}},8209:(e,t,r)=>{Promise.resolve().then(r.bind(r,46487))},26796:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ThemeProvider:()=>p,useTheme:()=>b});var a=r(95155),n=r(12115),o=r(87021),s=r(7160),i=r(29197),l=r(748),d=r(84563),c=r(29692);let u=(0,o.h)("frontend/contexts/ThemeContext"),h=(0,n.createContext)(void 0),p=e=>{let{children:t}=e,[r,o]=(0,n.useState)(!1),[p,b]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{u.debug("Loading theme preference from storage");let e=await (0,c.YM)(c.Zg.THEME,"light");u.info("Theme loaded from storage: ".concat(e));let t="dark"===e;b(t),t?document.documentElement.classList.add("dark-theme"):document.documentElement.classList.remove("dark-theme"),o(!0)})()},[]);let f=(0,n.useMemo)(()=>(function(e){let t="dark"===e?l.kY.dark:l.kY.light,r="dark"===e;return(0,i.A)({palette:{mode:e,primary:{main:r?"#4f93f5":"#007bff",light:r?"#6aa6f7":"#3395ff",dark:r?"#3a7ad4":"#0056b3"},secondary:{main:r?"#a3adba":"#6c757d"},error:{main:r?"#ff6b6b":"#dc2626",light:r?"#5a2a2e":"#fecaca",dark:r?"#2a1618":"#b91c1c"},warning:{main:r?"#e0a23c":"#f59e0b"},info:{main:r?"#56b6d6":"#3b82f6"},success:{main:r?"#3fae72":"#16a34a"},divider:t.border,background:{default:t.background,paper:t.surface},text:{primary:t.foreground,secondary:t.textSecondary,disabled:t.textDisabled}},typography:{fontFamily:"var(--font-geist-sans), Arial, sans-serif",h1:{fontWeight:700},h2:{fontWeight:700},h3:{fontWeight:600},h4:{fontWeight:600},h5:{fontWeight:600},h6:{fontWeight:600}},components:{MuiButton:{styleOverrides:{root:{textTransform:"none",borderRadius:"0.375rem"}}},MuiPaper:{styleOverrides:{root:{borderRadius:"0.5rem",backgroundImage:"none"}}},MuiTextField:{styleOverrides:{root:{"& .MuiOutlinedInput-root":{borderRadius:"0.375rem"}}}},MuiCard:{styleOverrides:{root:{borderRadius:"0.5rem",border:r?"1px solid ".concat(t.border):void 0,boxShadow:r?"0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3)":"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)"}}},MuiMenu:{styleOverrides:{paper:{backgroundColor:t.surfaceRaised,backgroundImage:"none"}}},MuiPopover:{styleOverrides:{paper:{backgroundColor:t.surfaceRaised,backgroundImage:"none"}}},MuiTooltip:{styleOverrides:{tooltip:r?{backgroundColor:t.surfaceRaised,border:"1px solid ".concat(t.border),color:t.foreground}:void 0}}}})})(p?"dark":"light"),[p]);return u.debug("Rendering ThemeProvider with isDarkMode: ".concat(p)),(0,a.jsx)(h.Provider,{value:{toggleTheme:()=>{b(e=>{let t=!e,r=t?"dark":"light";return u.info("Toggling theme to: ".concat(r)),t?document.documentElement.classList.add("dark-theme"):document.documentElement.classList.remove("dark-theme"),(0,c.VH)(c.Zg.THEME,r),t})},isDarkMode:p},children:(0,a.jsxs)(s.A,{theme:f,children:[(0,a.jsx)(d.Ay,{}),t]})})},b=()=>{let e=(0,n.useContext)(h);if(!e)throw u.error("useTheme hook used outside of ThemeProvider"),Error("useTheme must be used within a ThemeProvider");return u.debug("useTheme hook accessed"),e}},46487:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>er});var a=r(95155),n=r(94049),o=r(12115),s=r(25635),i=r(98267),l=r(20537),d=r(37960),c=r(63186),u=r(22003),h=r(28548),p=r(2300),b=r(9562),f=r(56422),g=r(41983),x=r(91871),m=r(21422),y=r(87830),v=r(68212),j=r(42063),k=r(9164);function w(){let{setKey:e,changeKey:t,verifyKey:r,isEncryptionInitialized:i,isUserEncryptionEnabled:l}=(0,k.useStorage)(),[d,c]=(0,o.useState)(""),[w,A]=(0,o.useState)(""),[S,C]=(0,o.useState)(!1),[E,R]=(0,o.useState)(""),[O,T]=(0,o.useState)(""),[P,F]=(0,o.useState)(!1),[I,B]=(0,o.useState)(!1),[W,M]=(0,o.useState)(null),[L,D]=(0,o.useState)(!1),[U,N]=(0,o.useState)(!1),[z,V]=(0,o.useState)(!1),G=()=>{setTimeout(()=>window.location.reload(),800)};(0,o.useEffect)(()=>{(async()=>{let e=await i(),t=await l();D(e),N(t)})()},[i,l]);let Y=async t=>{t.preventDefault(),V(!0),M(null);try{if(d.length<12){M({type:"error",text:"Encryption password must be at least 12 characters long for security"}),V(!1);return}if(d!==w){M({type:"error",text:"Passwords do not match"}),V(!1);return}await e(d),M({type:"success",text:"Encryption password set successfully"}),c(""),A(""),D(!0),G()}catch(e){M({type:"error",text:"Failed to set encryption password"})}finally{V(!1)}},_=async e=>{e.preventDefault(),V(!0),M(null);try{if(O.length<12){M({type:"error",text:"New password must be at least 12 characters long for security"}),V(!1);return}if(!await r(E)){M({type:"error",text:"Current password is incorrect"}),V(!1);return}await t(E,O)?(M({type:"success",text:"Encryption password changed successfully"}),R(""),T(""),G()):M({type:"error",text:"Failed to change encryption password"})}catch(e){M({type:"error",text:"An error occurred while changing the password"})}finally{V(!1)}};return(0,a.jsxs)(n.default,{sx:{width:"100%"},children:[(0,a.jsx)(s.default,{variant:"h6",gutterBottom:!0,children:"Encryption Settings"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:3},children:"Set an encryption password to secure sensitive data like API keys and credentials. This password is used to encrypt your data and is never stored directly."}),W&&(0,a.jsx)(u.A,{severity:W.type,sx:{mb:3},children:W.text}),(0,a.jsxs)(n.default,{sx:{display:"flex",alignItems:"center",mb:3},children:[(0,a.jsx)(s.default,{variant:"body1",sx:{mr:2},children:"Current encryption status:"}),L?U?(0,a.jsx)(h.A,{icon:(0,a.jsx)(m.A,{}),label:"Custom Password Protection",color:"success",variant:"outlined"}):(0,a.jsx)(h.A,{icon:(0,a.jsx)(y.A,{}),label:"Default Encryption",color:"primary",variant:"outlined"}):(0,a.jsx)(h.A,{label:"No Encryption",color:"error",variant:"outlined"})]}),L&&U?U?(0,a.jsxs)(p.A,{elevation:2,sx:{p:3},children:[(0,a.jsx)(s.default,{variant:"subtitle1",gutterBottom:!0,fontWeight:"bold",children:"Change Encryption Password"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"You can change your custom encryption password here. This will re-encrypt your data with the new password. Your data will remain intact."}),(0,a.jsxs)(n.default,{component:"form",onSubmit:_,children:[(0,a.jsx)(b.A,{fullWidth:!0,label:"Current Password",variant:"outlined",value:E,onChange:e=>R(e.target.value),type:P?"text":"password",InputProps:{endAdornment:(0,a.jsx)(f.A,{position:"end",children:(0,a.jsx)(g.A,{"aria-label":"toggle current password visibility",onClick:()=>F(!P),edge:"end",children:P?(0,a.jsx)(v.A,{}):(0,a.jsx)(j.A,{})})})},sx:{mb:2}}),(0,a.jsx)(b.A,{fullWidth:!0,label:"New Password",variant:"outlined",value:O,onChange:e=>T(e.target.value),type:I?"text":"password",InputProps:{endAdornment:(0,a.jsx)(f.A,{position:"end",children:(0,a.jsx)(g.A,{"aria-label":"toggle new password visibility",onClick:()=>B(!I),edge:"end",children:I?(0,a.jsx)(v.A,{}):(0,a.jsx)(j.A,{})})})},sx:{mb:3}}),(0,a.jsx)(x.A,{type:"submit",variant:"contained",color:"primary",disabled:!E||!O||z,children:"Change Password"})]})]}):null:(0,a.jsxs)(p.A,{elevation:2,sx:{p:3,mb:4},children:[(0,a.jsx)(s.default,{variant:"subtitle1",gutterBottom:!0,fontWeight:"bold",children:"Set Custom Encryption Password"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:L?"Your data is currently protected with default encryption. Set a custom password for enhanced security.":"Create a strong password to protect your sensitive data. Make sure to remember this password as it cannot be recovered if lost."}),(0,a.jsxs)(n.default,{component:"form",onSubmit:Y,children:[(0,a.jsx)(b.A,{fullWidth:!0,label:"New Password",variant:"outlined",value:d,onChange:e=>c(e.target.value),type:S?"text":"password",InputProps:{endAdornment:(0,a.jsx)(f.A,{position:"end",children:(0,a.jsx)(g.A,{"aria-label":"toggle password visibility",onClick:()=>C(!S),edge:"end",children:S?(0,a.jsx)(v.A,{}):(0,a.jsx)(j.A,{})})})},sx:{mb:2}}),(0,a.jsx)(b.A,{fullWidth:!0,label:"Confirm Password",variant:"outlined",value:w,onChange:e=>A(e.target.value),type:S?"text":"password",sx:{mb:3}}),(0,a.jsx)(x.A,{type:"submit",variant:"contained",color:"primary",disabled:!d||!w||z,children:L?"Upgrade to Custom Password":"Set Encryption Password"})]})]}),(0,a.jsx)(n.default,{sx:{mt:4},children:(0,a.jsxs)(u.A,{severity:U?"warning":"info",children:[(0,a.jsx)(s.default,{variant:"subtitle2",fontWeight:"bold",children:U?"Important Security Information":"About Default Encryption"}),U?(0,a.jsxs)(s.default,{variant:"body2",children:["• Your custom encryption password is never stored directly on the server",(0,a.jsx)("br",{}),"• If you forget your password, you will not be able to access your encrypted data",(0,a.jsx)("br",{}),"• Consider using a password manager to securely store this password"]}):(0,a.jsxs)(s.default,{variant:"body2",children:["• Your data is currently encrypted with a built-in default key",(0,a.jsx)("br",{}),"• This provides basic protection without requiring password setup",(0,a.jsx)("br",{}),"• For maximum security, set a custom password using the form above"]})]})})]})}var A=r(99944),S=r(9957),C=r(26796),E=r(87021);let R=(0,E.h)("frontend/components/Settings/ThemeSettings");function O(){let{isDarkMode:e,toggleTheme:t}=(0,C.useTheme)();return R.debug("Rendering ThemeSettings with isDarkMode: ".concat(e)),(0,a.jsxs)(n.default,{sx:{maxWidth:600},children:[(0,a.jsx)(s.default,{variant:"h6",gutterBottom:!0,children:"Theme Settings"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Customize the application appearance"}),(0,a.jsx)(A.A,{control:(0,a.jsx)(S.A,{checked:e,onChange:t,name:"darkMode"}),label:"Dark Mode"})]})}var T=r(71892),P=r(52397);function F(){let{globalEnvVars:e,setGlobalEnvVars:t,deleteGlobalEnvVar:r}=(0,k.useStorage)(),[i,l]=(0,o.useState)(null),d=async e=>{try{let r=Object.fromEntries(Object.entries(e).filter(e=>{let[t,r]=e;return"string"==typeof r||!r.metadata.isSecret||r.value!==P.gF}));await t(r),l({type:"success",text:"Global environment variables updated successfully"}),setTimeout(()=>{l(null)},3e3)}catch(e){l({type:"error",text:"Failed to update global environment variables"})}};return(0,a.jsxs)(n.default,{sx:{width:"100%"},children:[(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Define global environment variables that can be bound to MCP servers. This allows you to manage API keys and other sensitive information in one place."}),i&&(0,a.jsx)(u.A,{severity:i.type,sx:{mb:2},children:i.text}),(0,a.jsx)(T.A,{serverName:"Global",initialEnv:e,onSave:d,onDelete:r})]})}var I=r(17325),B=r(22822),W=r(4474),M=r(21067),L=r(2778),D=r(52363),U=r(65036),N=r(50001),z=r(75912),V=r(27156);let G=(0,E.h)("frontend/components/Settings/BackupSettings"),Y=[{key:"models",label:"Models",description:"AI model configurations",storageKey:V.Z.MODELS},{key:"mcpServers",label:"MCP Servers Configuration",description:"MCP server settings",storageKey:V.Z.MCP_SERVERS},{key:"mcpServersFolder",label:"MCP Servers Folder",description:"MCP server code and files",isFolder:!0},{key:"flows",label:"Flows",description:"Flow configurations",storageKey:V.Z.FLOWS},{key:"chatHistory",label:"Chat History",description:"Conversation history",storageKey:V.Z.CHAT_HISTORY},{key:"settings",label:"Settings",description:"Application settings",storageKey:V.Z.THEME},{key:"globalEnvVars",label:"Global Environment Variables",description:"Global environment variables",storageKey:V.Z.GLOBAL_ENV_VARS},{key:"encryptionKey",label:"Encryption Key",description:"Data encryption key",storageKey:V.Z.ENCRYPTION_KEY}];function _(){let[e,t]=(0,o.useState)(Y.reduce((e,t)=>({...e,[t.key]:!0}),{})),[r,i]=(0,o.useState)(Y.reduce((e,t)=>({...e,[t.key]:!0}),{})),[l,d]=(0,o.useState)(null),c=(0,o.useRef)(null),[h,b]=(0,o.useState)(null),[f,g]=(0,o.useState)(!1),[m,y]=(0,o.useState)(!1),v=r=>{t({...e,[r.target.name]:r.target.checked})},j=e=>{i({...r,[e.target.name]:e.target.checked})},k=async()=>{G.debug("Creating backup with selections:",e),g(!0),b(null);try{let t=Object.entries(e).filter(e=>{let[t,r]=e;return r}).map(e=>{let[t]=e;return t});if(0===t.length){b({type:"error",text:"Please select at least one item to backup"}),g(!1);return}let r=await fetch("/api/backup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({selections:t})});if(!r.ok)throw Error("Failed to create backup");let a=await r.blob(),n=window.URL.createObjectURL(a),o=document.createElement("a");o.style.display="none",o.href=n;let s=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19);o.download="flujo-backup-".concat(s,".zip"),document.body.appendChild(o),o.click(),window.URL.revokeObjectURL(n),document.body.removeChild(o),b({type:"success",text:"Backup created successfully"})}catch(e){G.error("Error creating backup:",e),b({type:"error",text:e instanceof Error?e.message:"Failed to create backup"})}finally{g(!1)}},w=async()=>{G.debug("Restoring from backup with selections:",r),g(!0),b(null),y(!1);try{let e=Object.entries(r).filter(e=>{let[t,r]=e;return r}).map(e=>{let[t]=e;return t}),t=new FormData;t.append("file",l),t.append("selections",JSON.stringify(e));let a=await fetch("/api/restore",{method:"POST",body:t});if(!a.ok){let e=await a.json();throw Error(e.error||"Failed to restore from backup")}b({type:"success",text:"Restore completed successfully. You may need to refresh the page to see the changes."}),c.current&&(c.current.value=""),d(null)}catch(e){G.error("Error restoring from backup:",e),b({type:"error",text:e instanceof Error?e.message:"Failed to restore from backup"})}finally{g(!1)}},S=r=>{let a={...e};Y.forEach(e=>{a[e.key]=r}),t(a)},C=e=>{let t={...r};Y.forEach(r=>{t[r.key]=e}),i(t)};return(0,a.jsxs)(n.default,{sx:{width:"100%"},children:[(0,a.jsx)(s.default,{variant:"h6",gutterBottom:!0,children:"Backup and Restore"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Create backups of your application data or restore from a previous backup."}),h&&(0,a.jsx)(u.A,{severity:h.type,sx:{mb:2},children:h.text}),(0,a.jsxs)(p.A,{sx:{p:3,mb:3},children:[(0,a.jsx)(s.default,{variant:"subtitle1",gutterBottom:!0,fontWeight:"bold",children:"Create Backup"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Select the components you want to include in the backup."}),(0,a.jsxs)(n.default,{sx:{mb:2},children:[(0,a.jsx)(x.A,{size:"small",onClick:()=>S(!0),sx:{mr:1},children:"Select All"}),(0,a.jsx)(x.A,{size:"small",onClick:()=>S(!1),children:"Deselect All"})]}),(0,a.jsx)(I.A,{sx:{mb:3},children:Y.map(t=>(0,a.jsx)(A.A,{control:(0,a.jsx)(B.A,{checked:e[t.key],onChange:v,name:t.key}),label:(0,a.jsxs)(n.default,{children:[(0,a.jsx)(s.default,{variant:"body1",children:t.label}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",children:t.description})]})},t.key))}),(0,a.jsx)(x.A,{variant:"contained",onClick:k,disabled:f||Object.values(e).every(e=>!e),startIcon:f?(0,a.jsx)(W.default,{size:20}):null,children:f?"Creating Backup...":"Create Backup"})]}),(0,a.jsxs)(p.A,{sx:{p:3},children:[(0,a.jsx)(s.default,{variant:"subtitle1",gutterBottom:!0,fontWeight:"bold",children:"Restore from Backup"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"Select a backup file and choose which components to restore."}),(0,a.jsxs)(n.default,{sx:{mb:3},children:[(0,a.jsxs)(x.A,{variant:"outlined",component:"label",sx:{mb:2},children:["Select Backup File",(0,a.jsx)("input",{type:"file",hidden:!0,accept:".zip",onChange:e=>{let t=e.target.files;t&&t.length>0&&(d(t[0]),b(null))},ref:c})]}),l&&(0,a.jsxs)(s.default,{variant:"body2",sx:{ml:1},children:["Selected file: ",l.name]})]}),(0,a.jsx)(M.A,{sx:{mb:2}}),(0,a.jsx)(s.default,{variant:"subtitle2",gutterBottom:!0,children:"Restore Options"}),(0,a.jsxs)(n.default,{sx:{mb:2},children:[(0,a.jsx)(x.A,{size:"small",onClick:()=>C(!0),sx:{mr:1},children:"Select All"}),(0,a.jsx)(x.A,{size:"small",onClick:()=>C(!1),children:"Deselect All"})]}),(0,a.jsx)(I.A,{sx:{mb:3},children:Y.map(e=>(0,a.jsx)(A.A,{control:(0,a.jsx)(B.A,{checked:r[e.key],onChange:j,name:e.key}),label:(0,a.jsxs)(n.default,{children:[(0,a.jsx)(s.default,{variant:"body1",children:e.label}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",children:e.description})]})},e.key))}),(0,a.jsx)(x.A,{variant:"contained",color:"warning",onClick:()=>l?0===Object.entries(r).filter(e=>{let[t,r]=e;return r}).map(e=>{let[t]=e;return t}).length?void b({type:"error",text:"Please select at least one item to restore"}):void y(!0):void b({type:"error",text:"Please select a backup file"}),disabled:f||!l||Object.values(r).every(e=>!e),startIcon:f?(0,a.jsx)(W.default,{size:20}):null,children:f?"Restoring...":"Restore from Backup"})]}),(0,a.jsxs)(L.A,{open:m,onClose:()=>y(!1),children:[(0,a.jsx)(D.A,{children:"Confirm Restore"}),(0,a.jsx)(U.A,{children:(0,a.jsx)(N.A,{children:"This will overwrite your existing data with the contents of the backup file. This action cannot be undone. Are you sure you want to continue?"})}),(0,a.jsxs)(z.A,{children:[(0,a.jsx)(x.A,{onClick:()=>y(!1),children:"Cancel"}),(0,a.jsx)(x.A,{onClick:w,color:"warning",variant:"contained",children:"Restore"})]})]})]})}var K=r(52641),J=r(84869);function H(){let{settings:e,updateSettings:t}=(0,k.useStorage)(),r=(0,J.G)(),o=(null==e?void 0:e.speech)||{enabled:!0};return(0,a.jsxs)(n.default,{sx:{p:2},children:[!r.supported&&(0,a.jsx)(u.A,{severity:"warning",sx:{mb:3},children:"Speech recognition is not supported in your browser. Please use Chrome, Edge, or Safari for the best experience."}),(0,a.jsxs)(K.A,{fullWidth:!0,sx:{mb:3},children:[(0,a.jsx)(A.A,{control:(0,a.jsx)(S.A,{checked:o.enabled,onChange:r=>{t({...e,speech:{...o,enabled:r.target.checked}})},name:"enabled",disabled:!r.supported}),label:"Enable speech recognition"}),(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mt:1},children:"When enabled, audio recordings will be transcribed using your browser's built-in offfline speech recognition capabilities."})]}),(0,a.jsxs)(p.A,{variant:"outlined",sx:{p:2,mb:3},children:[(0,a.jsx)(s.default,{variant:"subtitle2",gutterBottom:!0,children:"Speech Recognition Information"}),(0,a.jsxs)(n.default,{sx:{display:"flex",justifyContent:"space-between",mb:1},children:[(0,a.jsx)(s.default,{variant:"body2",children:"Technology:"}),(0,a.jsx)(s.default,{variant:"body2",children:"Web Speech API"})]}),(0,a.jsxs)(n.default,{sx:{display:"flex",justifyContent:"space-between",mb:1},children:[(0,a.jsx)(s.default,{variant:"body2",children:"Processing:"}),(0,a.jsx)(s.default,{variant:"body2",children:"Browser-based"})]}),(0,a.jsxs)(n.default,{sx:{display:"flex",justifyContent:"space-between",mb:1},children:[(0,a.jsx)(s.default,{variant:"body2",children:"Language:"}),(0,a.jsx)(s.default,{variant:"body2",children:"Automatically uses browser language"})]}),(0,a.jsxs)(n.default,{sx:{display:"flex",justifyContent:"space-between",mb:1},children:[(0,a.jsx)(s.default,{variant:"body2",children:"Privacy:"}),(0,a.jsx)(s.default,{variant:"body2",children:"Depends on browser implementation"})]})]}),(0,a.jsx)(u.A,{severity:"info",sx:{mt:3},children:(0,a.jsx)(s.default,{variant:"body2",children:"Speech recognition quality may vary based on your browser, microphone quality, and background noise. For best results, speak clearly and use a good quality microphone."})})]})}(0,E.h)("frontend/components/Settings/SpeechRecognitionSettings");let Z=(0,E.h)("frontend/components/Settings/UpdateSettings");function $(){let{settings:e,updateSettings:t}=(0,k.useStorage)(),r=(null==e?void 0:e.update)||{checkOnStartup:!1},[i,l]=(0,o.useState)(!1),[d,c]=(0,o.useState)(!1),[h,p]=(0,o.useState)(null),[b,f]=(0,o.useState)(null),g=null===b||"git"===b,m=async()=>{l(!0),p(null);try{let e=await fetch("/api/update"),t=await e.json();"string"==typeof t.updateMode&&f(t.updateMode),e.ok&&!1!==t.success?!1===t.isGitRepo?p({severity:"info",message:t.message}):t.updateAvailable?p({severity:"warning",message:"An update is available (".concat(t.behindBy," new commit").concat(1===t.behindBy?"":"s"," on ").concat(t.branch,").")}):p({severity:"success",message:"FLUJO is up to date (v".concat(t.currentVersion,").")}):p({severity:"error",message:t.error||"Failed to check for updates."})}catch(e){Z.error("Update check failed",e),p({severity:"error",message:"Failed to check for updates."})}finally{l(!1)}},y=async()=>{c(!0),p({severity:"info",message:"Updating FLUJO - this may take a few minutes..."});try{let e=await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"apply"})}),t=await e.json();if(!e.ok||!1===t.success){p({severity:"error",message:t.error||"Update failed."}),c(!1);return}if(p({severity:"success",message:t.message}),t.restarting){let e=!1,t=async()=>{try{if((await fetch("/api/cwd",{cache:"no-store"})).ok&&e)return void window.location.reload()}catch(t){e=!0}setTimeout(t,3e3)};setTimeout(t,5e3)}else c(!1)}catch(e){Z.error("Update failed",e),p({severity:"error",message:"Update failed."}),c(!1)}};return(0,a.jsxs)(n.default,{sx:{p:2},children:[(0,a.jsxs)(K.A,{fullWidth:!0,sx:{mb:2},children:[(0,a.jsx)(A.A,{control:(0,a.jsx)(S.A,{checked:r.checkOnStartup,onChange:a=>{t({...e,update:{...r,checkOnStartup:a.target.checked}})},name:"checkOnStartup"}),label:"Check for updates on startup"}),(0,a.jsxs)(s.default,{variant:"body2",color:"text.secondary",sx:{mt:1},children:["When enabled, FLUJO checks GitHub for a newer version when the home page loads and shows a one-click update banner if one is available. Updates run ",(0,a.jsx)("code",{children:"git pull"})," + rebuild in your install folder; your data is preserved."]}),!g&&(0,a.jsxs)(s.default,{variant:"body2",color:"text.secondary",sx:{mt:1},children:["This install can't update itself in place","container"===b?" (running in Docker) — pull a newer image instead.":"npm"===b?" (installed via npm) — rerun with the latest version instead.":" — it is not running from a git clone."]})]}),(0,a.jsxs)(n.default,{sx:{display:"flex",gap:2,mb:2},children:[(0,a.jsxs)(x.A,{variant:"outlined",onClick:m,disabled:i||d,children:[i?(0,a.jsx)(W.default,{size:20,sx:{mr:1}}):null,"Check now"]}),(0,a.jsxs)(x.A,{variant:"contained",onClick:y,disabled:d||!g,children:[d?(0,a.jsx)(W.default,{size:20,sx:{mr:1}}):null,"Update now"]})]}),h&&(0,a.jsx)(u.A,{severity:h.severity,sx:{mt:1},children:h.message})]})}var q=r(8907),Q=r(69195);function X(){let{startTour:e}=(0,Q.useTour)();return(0,a.jsxs)(n.default,{sx:{p:2},children:[(0,a.jsx)(s.default,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"The guided tour walks you through the full first-run path — adding a model, connecting an MCP tool server, building a flow, and running it in chat. It launches automatically the first time you open FLUJO; replay it any time below."}),(0,a.jsx)(x.A,{variant:"outlined",startIcon:(0,a.jsx)(q.A,{}),onClick:e,children:"Replay guided tour"})]})}function ee(){let[e,t]=(0,o.useState)("globalEnv"),r=e=>(r,a)=>{t(!!a&&e)};return(0,a.jsxs)(n.default,{sx:{p:3},children:[(0,a.jsx)(s.default,{variant:"h5",gutterBottom:!0,children:"Settings"}),(0,a.jsxs)(n.default,{sx:{mt:2},children:[(0,a.jsxs)(i.A,{expanded:"globalEnv"===e,onChange:r("globalEnv"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"globalEnv-content",id:"globalEnv-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Global Environment Variables"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(F,{})})]}),(0,a.jsxs)(i.A,{expanded:"encryption"===e,onChange:r("encryption"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"encryption-content",id:"encryption-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Encryption"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(w,{})})]}),(0,a.jsxs)(i.A,{expanded:"theme"===e,onChange:r("theme"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"theme-content",id:"theme-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Theme"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(O,{})})]}),(0,a.jsxs)(i.A,{expanded:"backup"===e,onChange:r("backup"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"backup-content",id:"backup-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Backup & Restore"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(_,{})})]}),(0,a.jsxs)(i.A,{expanded:"speech"===e,onChange:r("speech"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"speech-content",id:"speech-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Speech Recognition"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(H,{})})]}),(0,a.jsxs)(i.A,{expanded:"updates"===e,onChange:r("updates"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"updates-content",id:"updates-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Updates"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)($,{})})]}),(0,a.jsxs)(i.A,{expanded:"onboarding"===e,onChange:r("onboarding"),children:[(0,a.jsx)(l.A,{expandIcon:(0,a.jsx)(c.A,{}),"aria-controls":"onboarding-content",id:"onboarding-header",children:(0,a.jsx)(s.default,{variant:"h6",children:"Onboarding"})}),(0,a.jsx)(d.A,{children:(0,a.jsx)(X,{})})]})]})]})}let et=(0,E.h)("app/settings/page");function er(){return et.debug("Rendering SettingsPage"),(0,a.jsx)(n.default,{component:"main",sx:{minHeight:"100vh"},children:(0,a.jsx)(ee,{})})}},52397:(e,t,r)=>{"use strict";r.d(t,{RJ:()=>n,gF:()=>a});let a="masked:********",n="********"},69195:(e,t,r)=>{"use strict";r.r(t),r.d(t,{TourProvider:()=>c,useTour:()=>d});var a=r(95155),n=r(12115),o=r(9164),s=r(77326);let i=(0,r(87021).h)("frontend/contexts/TourContext"),l=(0,n.createContext)({isActive:!1,stepIndex:0,startTour:()=>{},next:()=>{},back:()=>{},endTour:()=>{}}),d=()=>(0,n.useContext)(l),c=e=>{var t;let{children:r}=e,{settings:d,updateSettings:c,isLoading:u,settingsHydrated:h}=(0,o.useStorage)(),[p,b]=(0,n.useState)(!1),[f,g]=(0,n.useState)(0),x=(0,n.useRef)(!1),m=(0,n.useCallback)(()=>{var e;c({...d,onboarding:{...null!=(e=d.onboarding)?e:{},completed:!0}}).catch(e=>i.warn("Failed to persist onboarding completion",e))},[d,c]),y=(0,n.useCallback)(()=>{i.info("Starting guided tour"),g(0),b(!0)},[]),v=(0,n.useCallback)(()=>{i.info("Ending guided tour"),b(!1),m()},[m]),j=(0,n.useCallback)(()=>{g(e=>e>=s.$.length-1?(b(!1),m(),e):e+1)},[m]),k=(0,n.useCallback)(()=>{g(e=>Math.max(0,e-1))},[]);return(0,n.useEffect)(()=>{var e;u||!h||x.current||(x.current=!0,(null==(e=d.onboarding)?void 0:e.completed)!==!0&&(i.info("First run detected — auto-starting guided tour"),y()))},[u,h,null==(t=d.onboarding)?void 0:t.completed,y]),(0,a.jsx)(l.Provider,{value:{isActive:p,stepIndex:f,startTour:y,next:j,back:k,endTour:v},children:r})}},71892:(e,t,r)=>{"use strict";r.d(t,{A:()=>R});var a=r(95155),n=r(12115),o=r(2300),s=r(94049),i=r(25635),l=r(91871),d=r(80777),c=r(33077),u=r(9562),h=r(56422),p=r(28548),b=r(99944),f=r(22822),g=r(41983),x=r(56682),m=r(87021),y=r(9164),v=r(86946),j=r(21422),k=r(12857),w=r(48363),A=r(4484),S=r(1877),C=r(52397);let E=(0,m.h)("frontend/components/mcp/MCPEnvManager/EnvEditor"),R=e=>{let{serverName:t,initialEnv:r,onSave:m,onDelete:R,onServerRestart:O}=e,{globalEnvVars:T}=(0,y.useStorage)(),[P,F]=(0,n.useState)([]),[I,B]=(0,n.useState)(!1),[W,M]=(0,n.useState)(!1),[L,D]=(0,n.useState)(!1),[U,N]=(0,n.useState)(null);(0,n.useEffect)(()=>{E.debug("Initializing environment variables for server: ".concat(t),{variableCount:Object.keys(r).length}),F(Object.entries(r).map(e=>{let[t,r]=e,a="object"==typeof r&&null!==r&&"value"in r?r.value:r,n="object"==typeof r&&null!==r&&"metadata"in r?r.metadata:{isSecret:(0,S.xc)(t)},o=a.match(/\$\{global:([^}]+)\}/);if(o){let e=o[1];return{key:t,value:a,isSecret:n.isSecret,isBound:!0,boundTo:e}}let s="string"==typeof a&&(a.startsWith("encrypted:")||a.startsWith("encrypted_failed:"));return{key:t,value:s?C.gF:a,isSecret:n.isSecret,isEncrypted:s}}))},[r]);let z=async e=>{E.debug("Removing environment variable at index: ".concat(e));let r=P[e];if("Global"===t&&R&&r.key)try{await R(r.key),F(P.filter((t,r)=>r!==e))}catch(e){E.error("Failed to delete environment variable: ".concat(r.key),e)}else F(P.filter((t,r)=>r!==e)),B(!0)},V=(e,t,r)=>{let a=[...P];if("isSecret"===t){let t=a[e];t.isSecret&&!r?a[e]={...t,isSecret:r,value:"",isEncrypted:!1,showWarning:!0}:a[e]={...t,isSecret:r}}else{let n={...a[e],[t]:r,isSecret:"key"===t?(0,S.xc)(r):a[e].isSecret};"key"===t&&(n.isValidKey=""===r||/^[a-zA-Z0-9_]+$/.test(r)),"value"===t&&(a[e].isEncrypted&&(n.isEncrypted=!1),a[e].showWarning&&r&&(n.showWarning=!1)),a[e]=n}F(a),B(!0)},G=async()=>{if(P.some(e=>""!==e.key&&!1===e.isValidKey))return void E.error("Cannot save: Some variable names contain invalid characters");E.debug("Saving environment variables for server: ".concat(t),{variableCount:P.length}),M(!0);try{let e=P.reduce((e,t)=>{let{key:r,value:a,isBound:n,boundTo:o,isSecret:s,isEncrypted:i}=t;return r&&(n&&o?e[r]={value:"${global:".concat(o,"}"),metadata:{isSecret:s}}:s&&a===C.gF||(e[r]={value:a,metadata:{isSecret:s}})),e},{});await m(e),B(!1),O&&"Global"!==t&&(E.debug("Restarting server after env variable changes: ".concat(t)),await O(t))}catch(e){E.error("Failed to save environment variables:",e)}M(!1)};return(0,a.jsxs)(o.A,{sx:{p:3,borderRadius:2,border:1,borderColor:e=>"dark"===e.palette.mode?"#3a3a3a":"#e5e7eb"},children:[(0,a.jsxs)(s.default,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,a.jsxs)(i.default,{variant:"h6",sx:{fontWeight:"semibold"},children:["Environment Variables - ",t]}),(0,a.jsx)(l.A,{variant:"contained",color:"primary",size:"small",startIcon:(0,a.jsx)(v.A,{}),onClick:()=>{E.debug("Adding new environment variable"),F([...P,{key:"",value:"",isSecret:!1}]),B(!0)},children:"Add Variable"})]}),(0,a.jsx)(d.A,{spacing:3,children:P.map((e,t)=>(0,a.jsxs)(c.Ay,{container:!0,spacing:2,alignItems:"flex-start",children:[(0,a.jsx)(c.Ay,{item:!0,xs:12,sm:5,children:(0,a.jsx)(u.A,{fullWidth:!0,placeholder:"Variable name",value:e.key,onChange:e=>V(t,"key",e.target.value),error:!1===e.isValidKey,helperText:!1===e.isValidKey?"Only alphanumeric characters and underscores allowed":"",size:"small"})}),(0,a.jsx)(c.Ay,{item:!0,xs:12,sm:5,children:(0,a.jsx)(u.A,{fullWidth:!0,type:e.isSecret?"password":"text",placeholder:e.showWarning?"Re-enter value":"Value",value:e.value,onChange:e=>V(t,"value",e.target.value),InputProps:{readOnly:e.isBound,startAdornment:e.isEncrypted?(0,a.jsx)(h.A,{position:"start",children:(0,a.jsx)(j.A,{fontSize:"small",titleAccess:"This value is stored encrypted"})}):null,endAdornment:e.isBound?(0,a.jsx)(h.A,{position:"end",children:(0,a.jsx)(p.A,{size:"small",label:"Bound to global: ".concat(e.boundTo),color:"primary",variant:"outlined",onDelete:()=>(e=>{E.debug("Unbinding variable at index: ".concat(e));let t=[...P];t[e]={...t[e],isBound:!1,boundTo:void 0},F(t),B(!0)})(t),deleteIcon:(0,a.jsx)(k.A,{fontSize:"small"})})}):null},error:e.showWarning,helperText:e.showWarning?"You must re-enter the value after switching from secret to normal mode":"",size:"small",sx:{bgcolor:t=>e.isBound?"dark"===t.palette.mode?"#1a1a1a":"#f9fafb":t.palette.background.paper}})}),(0,a.jsx)(c.Ay,{item:!0,xs:12,sm:2,children:(0,a.jsxs)(s.default,{sx:{display:"flex",alignItems:"center",mt:.5},children:[(0,a.jsx)(b.A,{control:(0,a.jsx)(f.A,{checked:e.isSecret,onChange:e=>V(t,"isSecret",e.target.checked),size:"small"}),label:"Secret",sx:{mr:1}}),!e.isBound&&(0,a.jsx)(g.A,{size:"small",color:"primary",onClick:()=>(e=>{E.debug("Opening bind modal for variable at index: ".concat(e)),N(e),D(!0)})(t),title:"Bind to global variable",sx:{mr:1},children:(0,a.jsx)(w.A,{fontSize:"small"})}),(0,a.jsx)(g.A,{size:"small",color:"error",onClick:()=>z(t),title:"Remove variable",children:(0,a.jsx)(A.A,{fontSize:"small"})})]})})]},t))}),(0,a.jsx)(x.A,{open:L,onClose:()=>{D(!1),N(null)},children:(0,a.jsxs)(s.default,{sx:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:400,maxWidth:"90%",bgcolor:"background.paper",boxShadow:24,p:4,borderRadius:2},children:[(0,a.jsx)(i.default,{variant:"h6",sx:{mb:2},children:"Bind to Global Variable"}),0===Object.keys(T).length?(0,a.jsx)(i.default,{color:"text.secondary",sx:{mb:2},children:"No global variables available. Add some in Settings first."}):(0,a.jsx)(s.default,{sx:{maxHeight:300,overflow:"auto",mb:2},children:Object.entries(T).map(e=>{let[t,r]=e;return(0,a.jsxs)(l.A,{fullWidth:!0,variant:"text",onClick:()=>(e=>{if(null!==U){E.debug("Binding variable at index ".concat(U," to global variable: ").concat(e));let t=[...P];t[U]={...t[U],isBound:!0,boundTo:e,value:"${global:".concat(e,"}")},F(t),D(!1),N(null),B(!0)}})(t),sx:{justifyContent:"space-between",textAlign:"left",mb:1,p:1,borderRadius:1},children:[(0,a.jsx)(i.default,{variant:"body2",children:t}),(0,a.jsx)(i.default,{variant:"caption",color:"text.secondary",children:r&&"object"==typeof r&&r.metadata&&r.metadata.isSecret?C.gF:r&&"object"==typeof r?r.value:r})]},t)})}),(0,a.jsx)(s.default,{sx:{display:"flex",justifyContent:"flex-end"},children:(0,a.jsx)(l.A,{variant:"outlined",onClick:()=>{D(!1),N(null)},children:"Cancel"})})]})}),I&&(0,a.jsx)(s.default,{sx:{display:"flex",justifyContent:"flex-end",mt:3},children:(0,a.jsx)(l.A,{variant:"contained",color:"success",onClick:G,disabled:W||P.some(e=>""!==e.key&&!1===e.isValidKey),children:W?"Saving...":"Save Changes"})})]})}},77326:(e,t,r)=>{"use strict";r.d(t,{$:()=>a});let a=[{id:"welcome",path:"/",placement:"center",title:"Welcome to FLUJO \uD83D\uDC4B",body:"This quick tour walks you through going from zero to a running AI flow.\n\nYou'll add a model, connect a tool server, build a flow, and run it in chat. It takes about a minute — you can skip any time."},{id:"add-model",path:"/models",target:'[data-tour="add-model"]',placement:"bottom",title:"1. Add a model",body:'FLUJO needs at least one AI model to think with. Click "Add Model" to configure one.\n\nTip: an OpenRouter API key gives you access to several free models — paste the key, name the model, pick a free one, and add a custom instruction.'},{id:"add-mcp-server",path:"/mcp",target:'[data-tour="add-mcp-server"]',placement:"bottom",title:"2. Connect a tool server (MCP)",body:'MCP servers give your model real tools — file access, image generation, web search, and more.\n\nClick "Add Server" and install the "Everything" reference server to try the full range of capabilities while you learn.'},{id:"new-flow",path:"/flows",target:'[data-tour="new-flow"]',placement:"bottom",title:"3. Build a flow",body:'A flow wires everything together. Click "New Flow" to open the builder.\n\nConnect Start → Process → Finish, attach your model to the Process node, and bind the Everything MCP server so the model can use its tools.'},{id:"chat-input",path:"/chat",target:'[data-tour="chat-input"]',placement:"top",title:"4. Run it in chat",body:"Pick your flow from the selector, then send a message here.\n\nTry asking it to generate an image with the MCP server and tell you a joke — you'll see the flow execute live, step by step."},{id:"docs",path:"/chat",target:'[data-tour="nav-docs"]',placement:"bottom",title:"Need the API?",body:"FLUJO exposes an OpenAI-compatible API and a full REST surface. The Docs page lists every endpoint with its method, parameters, and response shape.\n\nYou can re-run this tour any time from Settings → Onboarding."},{id:"finish",path:"/chat",placement:"center",title:"You're all set \uD83C\uDF89",body:"That's the whole loop: models, tools, flows, and chat.\n\nExplore at your own pace — and remember the Docs page and Settings are there when you need them."}]},84869:(e,t,r)=>{"use strict";r.d(t,{G:()=>s,S:()=>o});let a=(0,r(87021).h)("frontend/services/transcription/webSpeech"),n=()=>"webkitSpeechRecognition"in window||"SpeechRecognition"in window;async function o(e,t){if(!n())throw Error("Web Speech API is not supported in this browser");a.debug("Starting Web Speech API transcription");try{let r=URL.createObjectURL(e),n=new Audio(r),o=new(window.SpeechRecognition||window.webkitSpeechRecognition);return o.continuous=!0,o.interimResults=!0,(null==t?void 0:t.language)&&(o.lang=t.language),new Promise((e,r)=>{let s="";o.onresult=e=>{let r="";for(let t=e.resultIndex;t<e.results.length;t++){let a=e.results[t][0].transcript;e.results[t].isFinal?s+=a+" ":r+=a}(null==t?void 0:t.onInterimResult)&&t.onInterimResult(s+r),a.debug("Recognition interim result",{finalLength:s.length,interimLength:r.length})},o.onend=()=>{a.debug("Recognition ended",{transcriptLength:s.length}),e(s.trim())},o.onerror=e=>{a.error("Recognition error",{error:e.error}),r(Error("Speech recognition error: ".concat(e.error)))},n.onplay=()=>{o.start(),a.debug("Recognition started")},n.onended=()=>{o.stop(),a.debug("Audio playback ended")},n.onerror=e=>{a.error("Audio playback error",{error:e}),o.stop(),r(Error("Error playing audio"))},n.play().catch(e=>{a.error("Error starting audio playback",{error:e}),r(e)})})}catch(e){throw a.error("Error in Web Speech API transcription",{error:e}),e}}function s(){return{supported:n(),message:n()?"Web Speech API is supported":"Web Speech API is not supported in this browser"}}},87021:(e,t,r)=>{"use strict";r.d(t,{h:()=>l});let a={LOG_LEVEL:3},n={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},o="number"==typeof a.LOG_LEVEL?a.LOG_LEVEL:n.ERROR;function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t>6)return String(e);if(!(e instanceof Error))return e;let r={name:e.name,message:e.message};for(let a of Object.getOwnPropertyNames(e)){if("name"===a||"message"===a)continue;let n=e[a];"function"!=typeof n&&("stack"===a?r.stack=n:"cause"===a?r.cause=s(n,t+1):"errors"===a&&Array.isArray(n)?r.errors=n.map(e=>s(e,t+1)):r[a]=n)}return r}function i(e,t,r,a,i){if(e>=("number"==typeof i?i:o)){if("function"==typeof a)try{a=a()}catch(e){a="[lazy log data threw]"}let o=new Date().toISOString(),i="[".concat(o,"] [").concat(t,"]"),l="".concat(i," ").concat(r);if(void 0!==a)if(a instanceof Error||"object"==typeof a)try{let e=a instanceof Error?s(a):a,t=JSON.stringify(e,(e,t)=>t instanceof Error?s(t):t,2);l+=":\n".concat(t)}catch(e){l+=": [Object cannot be stringified]"}else l+=": ".concat(a);switch(e){case n.VERBOSE:console.debug("[VERBOSE] ".concat(l));break;case n.DEBUG:console.debug(l);break;case n.INFO:console.info(l);break;case n.WARN:console.warn(l);break;case n.ERROR:console.error(l);break;default:console.log(l)}}}function l(e,t){let r,a=((r=e.replace(/^src\//,"")).startsWith("/")&&(r=r.substring(1)),r);return{verbose:(e,r)=>{i(n.VERBOSE,a,e,r,t)},debug:(e,r)=>{i(n.DEBUG,a,e,r,t)},info:(e,r)=>{i(n.INFO,a,e,r,t)},warn:(e,r)=>{i(n.WARN,a,e,r,t)},error:(e,r)=>{i(n.ERROR,a,e,r,t)}}}}},e=>{e.O(0,[2678,4754,9244,7274,1871,9704,2003,9562,488,3272,3077,8598,9240,2403,9554,2318,9164,8441,1255,7358],()=>e(e.s=8209)),_N_E=e.O()}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[603],{7720:(e,t,n)=>{Promise.resolve().then(n.bind(n,68190))},68190:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>_});var l=n(95155),o=n(94049),r=n(12115),a=n(4474),i=n(25635),s=n(28548),c=n(22003),d=n(80777),u=n(2300),f=n(21067),h=n(2975),g=n(87021);let x=(0,g.h)("frontend/services/waves");class p{async list(){try{let e=await fetch("/api/waves");if(!e.ok)throw Error("HTTP ".concat(e.status));return await e.json()}catch(e){return x.warn("Failed to list waves",e),{paused:!1,generatedAt:new Date().toISOString(),waves:[],orphans:[]}}}}let m=new p;var b=n(76122),v=n(22539);n(8301);var w=n(14913),y=n(57883),j=n(78470),E=n(11096),I=n(28874);let S={schedule:{label:"Periodic",color:"#1976d2",timeline:!0},"mcp-poll":{label:"MCP Poll",color:"#7b1fa2",timeline:!0},"url-watch":{label:"URL Watch",color:"#0288d1",timeline:!0},webhook:{label:"Webhook",color:"#2e7d32",timeline:!1},"file-watch":{label:"File Watcher",color:"#ed6c02",timeline:!1},"flow-event":{label:"Event",color:"#616161",timeline:!1}};var k=n(14976);let A={"1h":36e5,"6h":216e5,"1d":864e5},O=["1h","6h","1d"];var R=n(55930);function N(e){let{subflows:t,depth:n=0}=e;return t&&0!==t.length?(0,l.jsx)(o.default,{sx:{pl:1.5*(0!==n),mt:.25},children:t.map((e,t)=>{var r;return(0,l.jsxs)(o.default,{sx:{borderLeft:n>0?"1px dashed rgba(0,0,0,0.2)":"none",pl:+(n>0)},children:[(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",gap:.5},children:[(0,l.jsx)(R.A,{sx:{fontSize:12,opacity:.6}}),(0,l.jsxs)(i.default,{variant:"caption",sx:{opacity:e.missing?.6:.85,fontStyle:e.missing?"italic":"normal"},children:[null!=(r=e.flowName)?r:e.flowId,e.missing?" (missing)":"",e.truncated?" …":""]})]}),e.children.length>0&&(0,l.jsx)(N,{subflows:e.children,depth:n+1})]},"".concat(e.flowId,"-").concat(t))})}):null}var W=n(67404);function z(e,t){return"".concat(e,"#").concat(t)}let M={trigger:function(e){var t,n,r,a,c,u;let{data:f}=e,{chainNode:h,now:g,runAt:x,isRoot:p,hasSuccessors:m,expanded:w}=f,y=null!=(u=S[c=h.triggerKind])?u:{label:c,color:"#616161",timeline:!1},k="";"timeline"===h.timing.mode?k=p?function(e,t){if(null==e||!Number.isFinite(e))return"no scheduled run";let n=e-t;if(n<=0)return"due now";let l=Math.floor(n/6e4),o=Math.floor(l/1440),r=Math.floor(l%1440/60),a=l%60;return o>0?"in ".concat(o,"d ").concat(r,"h"):r>0?"in ".concat(r,"h ").concat(String(a).padStart(2,"0"),"m"):"in ".concat(a,"m")}(x,g):"on schedule":"fixed"===h.timing.mode?k="fires when it happens":"event"===h.timing.mode&&(k="signal"===h.timing.via?'on signal "'.concat(null!=(t=h.timing.topic)?t:"",'"'):"when its upstream runs");let A=null!=(n=h.emittedSignals)?n:[];return(0,l.jsxs)(o.default,{sx:{minWidth:220,maxWidth:260,borderRadius:1,border:"1px solid rgba(0,0,0,0.15)",borderTop:"4px solid ".concat(y.color),outline:w?"2px solid ".concat(y.color):"none",bgcolor:"background.paper",boxShadow:w?4:2,p:1,opacity:h.enabled?1:.55,transition:"box-shadow 120ms ease, outline-color 120ms ease"},children:[(0,l.jsx)(v.h7,{type:"target",position:b.yX.Left,style:{background:y.color}}),(0,l.jsx)(v.h7,{type:"target",position:b.yX.Top,id:"up",style:{background:y.color}}),(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:.5},children:[(0,l.jsx)(s.A,{label:y.label,size:"small",sx:{bgcolor:y.color,color:"#fff",height:18,fontSize:10}}),p&&(0,l.jsx)(i.default,{variant:"caption",sx:{opacity:.6},children:"root"})]}),(0,l.jsx)(i.default,{variant:"subtitle2",sx:{mt:.5,fontWeight:600,lineHeight:1.2},noWrap:!0,title:h.name,children:h.name}),(0,l.jsx)(i.default,{variant:"caption",sx:{display:"block",opacity:.75},noWrap:!0,title:null!=(r=h.flowName)?r:h.flowId,children:null!=(a=h.flowName)?a:h.flowId}),(0,l.jsx)(i.default,{variant:"caption",sx:{display:"block",mt:.25,color:y.color,fontWeight:500},children:k}),A.length>0&&(0,l.jsxs)(o.default,{sx:{mt:.5},children:[(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",gap:.5,mb:.25},children:[(0,l.jsx)(E.A,{sx:{fontSize:13,color:"#7b1fa2"}}),(0,l.jsx)(i.default,{variant:"caption",sx:{opacity:.7},children:"Signals"})]}),(0,l.jsx)(d.A,{direction:"row",spacing:.5,flexWrap:"wrap",useFlexGap:!0,children:A.map(e=>(0,l.jsx)(j.A,{title:e.direct?"Emitted by this flow":"Emitted via a subflow",arrow:!0,children:(0,l.jsx)(s.A,{label:e.topic,size:"small",variant:e.direct?"filled":"outlined",sx:{height:18,fontSize:10,bgcolor:e.direct?"rgba(123,31,162,0.12)":"transparent",borderColor:"rgba(123,31,162,0.4)",color:"#7b1fa2"}})},e.topic))})]}),(0,l.jsx)(N,{subflows:h.subflows}),m&&!w&&(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",gap:.25,mt:.5,opacity:.55},children:[(0,l.jsx)(I.A,{sx:{fontSize:13,transform:"rotate(90deg)"}}),(0,l.jsx)(i.default,{variant:"caption",sx:{fontSize:10},children:"hover to follow chain"})]}),(0,l.jsx)(v.h7,{type:"source",position:b.yX.Right,style:{background:y.color}}),(0,l.jsx)(v.h7,{type:"source",position:b.yX.Bottom,id:"down",style:{background:y.color}})]})},clock:function(){return(0,l.jsxs)(o.default,{sx:{display:"flex",flexDirection:"column",alignItems:"center",gap:.25,width:84},children:[(0,l.jsx)(o.default,{sx:{width:56,height:56,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",bgcolor:"primary.main",color:"primary.contrastText",boxShadow:3},children:(0,l.jsx)(W.A,{})}),(0,l.jsx)(i.default,{variant:"caption",sx:{fontWeight:600},children:"now"}),(0,l.jsx)(i.default,{variant:"caption",sx:{opacity:.6,fontSize:10,textAlign:"center"},children:"time →"})]})}};function D(e){let{wave:t,height:n=460}=e,[a,s]=(0,r.useState)(()=>Date.now()),[c,d]=(0,r.useState)("6h"),[u,f]=(0,r.useState)(null),h=(0,r.useRef)(null),g=(0,r.useMemo)(()=>t.nodes.some(e=>"timeline"===e.timing.mode),[t]);(0,r.useEffect)(()=>{if(!g)return;let e=setInterval(()=>s(Date.now()),3e4);return()=>clearInterval(e)},[g]),(0,r.useEffect)(()=>()=>{h.current&&clearTimeout(h.current)},[]);let x=A[c],p=(0,r.useMemo)(()=>{let e=new Map;for(let n of t.nodes)e.set(n.executionId,n.name);return e},[t]),m=(0,r.useMemo)(()=>(function(e){var t,n;let{wave:l,now:o,windowMs:r,hoveredKey:a,timezone:i}=e,s=new Map;for(let e of l.nodes)s.set(e.executionId,e);let c=new Map,d=new Map;for(let e of l.nodes)c.set(e.executionId,[]),d.set(e.executionId,[]);let u=new Map;for(let e of l.edges)s.has(e.fromExecutionId)&&s.has(e.toExecutionId)&&(c.get(e.fromExecutionId).push(e.toExecutionId),d.get(e.toExecutionId).push(e.fromExecutionId),u.set("".concat(e.fromExecutionId,"->").concat(e.toExecutionId),e));for(let[,e]of c)e.sort();let f=l.rootExecutionIds.filter(e=>s.has(e));0===f.length&&(f=l.nodes.filter(e=>{var t,n;return(null!=(n=null==(t=d.get(e.executionId))?void 0:t.length)?n:0)===0}).map(e=>e.executionId)),f=[...f].sort();let h=new Map;{let e=new Set(f),n=[...f];for(;n.length>0;){let l=n.shift();for(let o of null!=(t=c.get(l))?t:[])e.has(o)||(e.add(o),h.set(o,l),n.push(o))}}let g=[];for(let e of f){let t=s.get(e);if("timeline"===t.timing.mode){let n=function(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:24,o=arguments.length>4?arguments[4]:void 0;if(!e||"string"!=typeof e||!e.trim()||!Number.isFinite(t)||!Number.isFinite(n)||n<=0)return[];let r=t+n,a=[];try{let n=o?new k.l4(e.trim(),{timezone:o}):new k.l4(e.trim()),i=new Date(t-1);for(let e=0;e<l;e++){let e=n.nextRun(i);if(!e)break;let t=e.getTime();if(t>r)break;a.push(t),i=e}}catch(e){return[]}return a}(t.timing.cron,o,r,void 0,i);if(n.length>0)n.forEach((t,n)=>g.push({baseId:e,occ:n,runAt:t}));else{let n=t.timing.nextRun?Date.parse(t.timing.nextRun):NaN;g.push({baseId:e,occ:0,runAt:Number.isFinite(n)?n:null})}}else g.push({baseId:e,occ:0,runAt:null})}let x=a?function(e){let t=e.lastIndexOf("#");return t>=0?e.slice(0,t):e}(a):null,p=a?function(e){let t=e.lastIndexOf("#");return t>=0?Number(e.slice(t+1)):0}(a):null,m=new Set;if(x){let e=x,t=new Set;for(;e&&!t.has(e);)t.add(e),m.add(e),e=h.get(e)}let b=new Map,v=e=>{if("timeline"!==s.get(e.baseId).timing.mode)return 0;if(null==e.runAt)return 1;var t=e.runAt;if(null==t||!Number.isFinite(t)||r<=0)return 0;let n=t-o;return n<=0?0:Math.min(1,n/r)},w=(e,t,n,l,o,r)=>{var a,i;let d=z(e,t);if(b.has(d))return;let u=s.get(e);b.set(d,{key:d,baseId:e,occ:t,chainNode:u,isRoot:r,runAt:o,level:n,x:l,y:24+150*n,hasSuccessors:(null!=(i=null==(a=c.get(e))?void 0:a.length)?i:0)>0,expanded:m.has(e)&&t===p})},y=(e,t,n,l)=>{var o;if(!(m.has(e)&&t===p))return;let r=(null!=(o=c.get(e))?o:[]).filter(e=>!b.has(z(e,t)));if(0===r.length)return;let a=(r.length-1)*250;r.forEach((e,o)=>{let r=l-a/2+250*o;w(e,t,n+1,r,null,!1),y(e,t,n+1,r)})};for(let e of g){let t=160+620*v(e);w(e.baseId,e.occ,0,t,e.runAt,!0),y(e.baseId,e.occ,0,t)}let j=[];for(let[e,t]of b){let l=t.occ;for(let o of null!=(n=c.get(t.baseId))?n:[]){let n=z(o,l),r=b.get(n);if(!r)continue;let a=u.get("".concat(t.baseId,"->").concat(o));a&&j.push({id:"".concat(e,"->").concat(n),source:e,target:n,chainEdge:a,recursive:r.level<=t.level})}}return{nodes:[...b.values()],edges:j}})({wave:t,now:a,windowMs:x,hoveredKey:u}),[t,a,x,u]),j=(0,r.useMemo)(()=>[{id:"__clock__",type:"clock",position:{x:16,y:24},data:{},draggable:!1,selectable:!1,connectable:!1},...m.nodes.map(e=>({id:e.key,type:"trigger",position:{x:e.x,y:e.y},data:{chainNode:e.chainNode,now:a,runAt:e.runAt,isRoot:e.isRoot,hasSuccessors:e.hasSuccessors,expanded:e.expanded},draggable:!1,connectable:!1}))],[m,a]),E=(0,r.useMemo)(()=>m.edges.map(e=>{let t=e.recursive?"#ed6c02":"signal"===e.chainEdge.via?"#7b1fa2":"#616161",n="".concat(e.recursive?"↻ ":"").concat(function(e,t){var n;if("signal"===e.via)return"⚡ ".concat(null!=(n=e.topic)?n:"signal");let l=e.on&&e.on.length>0?e.on.join(" / "):"completes";return"when ".concat(t?"".concat(t," "):"").concat(l)}(e.chainEdge,p.get(e.chainEdge.fromExecutionId)));return{id:e.id,source:e.source,target:e.target,sourceHandle:"down",targetHandle:"up",label:n,animated:!e.recursive,markerEnd:{type:b.TG.ArrowClosed,color:t},style:{stroke:t,strokeDasharray:e.recursive?"6 4":void 0},labelStyle:{fontSize:10,fill:t},labelBgStyle:{fill:"#fff",fillOpacity:.85}}}),[m,p]);return(0,l.jsx)(o.default,{sx:{height:n,width:"100%",border:"1px solid rgba(0,0,0,0.1)",borderRadius:1},children:(0,l.jsxs)(v.Gc,{nodes:j,edges:E,nodeTypes:M,fitView:!0,fitViewOptions:{padding:.15},minZoom:.2,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,zoomOnScroll:!1,zoomOnPinch:!1,zoomOnDoubleClick:!1,panOnScroll:!1,preventScrolling:!1,panOnDrag:!0,onNodeMouseEnter:(e,t)=>{h.current&&clearTimeout(h.current),f("clock"===t.type?null:t.id)},onNodeMouseLeave:()=>{h.current&&clearTimeout(h.current),h.current=setTimeout(()=>f(null),260)},proOptions:{hideAttribution:!0},children:[(0,l.jsx)(v.VS,{}),(0,l.jsx)(v.H2,{showInteractive:!1}),g&&(0,l.jsx)(v.Zk,{position:"top-right",children:(0,l.jsx)(w.A,{size:"small",exclusive:!0,value:c,onChange:(e,t)=>t&&d(t),sx:{bgcolor:"background.paper",boxShadow:1},children:O.map(e=>(0,l.jsx)(y.A,{value:e,sx:{px:1,py:.25},children:e},e))})}),(0,l.jsx)(v.Zk,{position:"bottom-right",children:(0,l.jsx)(i.default,{variant:"caption",sx:{opacity:.55,bgcolor:"background.paper",px:.5,borderRadius:.5},children:"hover a card to follow its chain"})})]})})}function C(e){return(0,l.jsx)(v.Ln,{children:(0,l.jsx)(D,{...e})})}let L=(0,g.h)("frontend/components/Waves");function F(){var e,t;let[n,g]=(0,r.useState)(null),[x,p]=(0,r.useState)(!0),b=(0,r.useCallback)(async()=>{g(await m.list()),p(!1)},[]);if((0,r.useEffect)(()=>{b().catch(e=>{L.warn("Initial waves load failed",e),p(!1)});let e=setInterval(()=>{b().catch(e=>L.warn("Waves refresh failed",e))},3e4);return()=>clearInterval(e)},[b]),x)return(0,l.jsx)(o.default,{sx:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%"},children:(0,l.jsx)(a.default,{})});let v=null!=(e=null==n?void 0:n.waves)?e:[],w=null!=(t=null==n?void 0:n.orphans)?t:[];return(0,l.jsxs)(o.default,{sx:{p:3,height:"100%",overflow:"auto"},children:[(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:1},children:[(0,l.jsx)(h.A,{color:"primary"}),(0,l.jsx)(i.default,{variant:"h5",sx:{fontWeight:600},children:"Waves"}),(null==n?void 0:n.paused)&&(0,l.jsx)(s.A,{label:"Scheduler paused",color:"warning",size:"small"})]}),(0,l.jsx)(i.default,{variant:"body2",sx:{opacity:.75,mb:2},children:"A read-only picture of how your Planned Executions chain together via signals and completion events. Each lane reads as a timeline — the clock on the left is “now”, and scheduled runs approach from the right. Hover a card to follow its chain; use the window control to zoom the timeline out and reveal upcoming runs. Nothing here arms or fires anything."}),0===v.length&&0===w.length&&(0,l.jsx)(c.A,{severity:"info",children:"No planned executions to visualize yet. Create some executions (and link them with flow-event triggers or signal nodes) to see waves here."}),(0,l.jsx)(d.A,{spacing:3,children:v.map(e=>{let t=e.nodes.filter(t=>e.rootExecutionIds.includes(t.executionId)).map(e=>e.name);return(0,l.jsxs)(u.A,{variant:"outlined",sx:{p:1.5},children:[(0,l.jsxs)(o.default,{sx:{display:"flex",alignItems:"center",gap:1,mb:1},children:[(0,l.jsx)(i.default,{variant:"subtitle1",sx:{fontWeight:600},children:t.length>0?t.join(", "):"Wave"}),(0,l.jsx)(s.A,{label:"".concat(e.nodes.length," execution(s)"),size:"small",variant:"outlined"}),e.hasCycle&&(0,l.jsx)(s.A,{label:"recursive",color:"warning",size:"small"})]}),(0,l.jsx)(C,{wave:e})]},e.id)})}),w.length>0&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(f.A,{sx:{my:3}}),(0,l.jsx)(i.default,{variant:"subtitle1",sx:{fontWeight:600,mb:1},children:"Unlinked event triggers"}),(0,l.jsx)(i.default,{variant:"body2",sx:{opacity:.75,mb:1},children:"These flow-event triggers reference a source that matches no known producer, so they never start from an organic trigger."}),(0,l.jsx)(d.A,{direction:"row",spacing:1,flexWrap:"wrap",useFlexGap:!0,children:w.map(e=>{var t;return(0,l.jsx)(s.A,{label:"".concat(e.name," → ").concat(null!=(t=e.flowName)?t:e.flowId),size:"small"},e.executionId)})})]})]})}let T=(0,g.h)("app/waves/page");function _(){return T.debug("Rendering WavesPage"),(0,l.jsx)(o.default,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:(0,l.jsx)(F,{})})}},87021:(e,t,n)=>{"use strict";n.d(t,{h:()=>s});let l={LOG_LEVEL:3},o={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},r="number"==typeof l.LOG_LEVEL?l.LOG_LEVEL:o.ERROR;function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t>6)return String(e);if(!(e instanceof Error))return e;let n={name:e.name,message:e.message};for(let l of Object.getOwnPropertyNames(e)){if("name"===l||"message"===l)continue;let o=e[l];"function"!=typeof o&&("stack"===l?n.stack=o:"cause"===l?n.cause=a(o,t+1):"errors"===l&&Array.isArray(o)?n.errors=o.map(e=>a(e,t+1)):n[l]=o)}return n}function i(e,t,n,l,i){if(e>=("number"==typeof i?i:r)){if("function"==typeof l)try{l=l()}catch(e){l="[lazy log data threw]"}let r=new Date().toISOString(),i="[".concat(r,"] [").concat(t,"]"),s="".concat(i," ").concat(n);if(void 0!==l)if(l instanceof Error||"object"==typeof l)try{let e=l instanceof Error?a(l):l,t=JSON.stringify(e,(e,t)=>t instanceof Error?a(t):t,2);s+=":\n".concat(t)}catch(e){s+=": [Object cannot be stringified]"}else s+=": ".concat(l);switch(e){case o.VERBOSE:console.debug("[VERBOSE] ".concat(s));break;case o.DEBUG:console.debug(s);break;case o.INFO:console.info(s);break;case o.WARN:console.warn(s);break;case o.ERROR:console.error(s);break;default:console.log(s)}}}function s(e,t){let n,l=((n=e.replace(/^src\//,"")).startsWith("/")&&(n=n.substring(1)),n);return{verbose:(e,n)=>{i(o.VERBOSE,l,e,n,t)},debug:(e,n)=>{i(o.DEBUG,l,e,n,t)},info:(e,n)=>{i(o.INFO,l,e,n,t)},warn:(e,n)=>{i(o.WARN,l,e,n,t)},error:(e,n)=>{i(o.ERROR,l,e,n,t)}}}}},e=>{e.O(0,[6714,3862,2678,4754,9244,7274,9704,2003,488,8470,3556,1675,333,8441,1255,7358],()=>e(e.s=7720)),_N_E=e.O()}]);
|