flujo-ai 3.33.0 → 3.34.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 +240 -240
- package/.next/app-path-routes-manifest.json +14 -14
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +21 -21
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/api/approvals/[id]/route.js.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.nft.json +1 -1
- package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/backup/route.js.nft.json +1 -1
- package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
- package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
- package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/compile/route.js +1 -1
- package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generate/route.js +1 -1
- package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generator/route.js +25 -4
- package/.next/server/app/api/flow/generator/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generator/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.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.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_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/app-sandbox/route_client-reference-manifest.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/oauth-capability/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.nft.json +1 -1
- package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/build/route.js +1 -1
- package/.next/server/app/api/packages/build/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/resolve/route.js +1 -1
- package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js.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/registry/auth/resend/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/feedback/route.js +1 -1
- package/.next/server/app/api/registry/feedback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/packages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/active/route.js.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/telemetry/daily-active/route.js +1 -1
- package/.next/server/app/api/telemetry/daily-active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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 +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +3 -3
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +2 -2
- package/.next/server/app/executions/page.js +2 -2
- package/.next/server/app/executions/page.js.nft.json +1 -1
- package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +3 -3
- package/.next/server/app/flows/page.js +3 -3
- package/.next/server/app/flows/page.js.nft.json +1 -1
- package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/flows.html +1 -1
- package/.next/server/app/flows.rsc +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/mcp/page.js +1 -1
- package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-flows/route.js +1 -1
- package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
- package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
- package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp.html +1 -1
- package/.next/server/app/mcp.rsc +3 -3
- package/.next/server/app/models/page.js +1 -1
- package/.next/server/app/models/page.js.nft.json +1 -1
- package/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/packages/page.js +1 -1
- package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/packages.html +1 -1
- package/.next/server/app/packages.rsc +3 -3
- package/.next/server/app/page.js +4 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/v1/chat/completions/route.js.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.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.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.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.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.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.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/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.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.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.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/models/route.js.nft.json +1 -1
- package/.next/server/app/v1/models/route_client-reference-manifest.js +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 +2 -2
- package/.next/server/app-paths-manifest.json +14 -14
- package/.next/server/chunks/1114.js +1 -1
- package/.next/server/chunks/1226.js +1 -1
- package/.next/server/chunks/1227.js +1 -1
- package/.next/server/chunks/166.js +5 -5
- package/.next/server/chunks/1664.js +1 -1
- package/.next/server/chunks/227.js +1 -1
- package/.next/server/chunks/2273.js +1 -1
- package/.next/server/chunks/3717.js +1 -0
- package/.next/server/chunks/4466.js +1 -1
- package/.next/server/chunks/4551.js +1 -1
- package/.next/server/chunks/4771.js +1 -1
- package/.next/server/chunks/519.js +2 -0
- package/.next/server/chunks/5285.js +1 -0
- package/.next/server/chunks/5309.js +78 -0
- package/.next/server/chunks/544.js +4 -4
- package/.next/server/chunks/5463.js +1 -1
- package/.next/server/chunks/5544.js +4 -4
- package/.next/server/chunks/{5708.js → 6041.js} +1 -1
- package/.next/server/chunks/6747.js +42 -13
- package/.next/server/chunks/7628.js +1 -1
- package/.next/server/chunks/7630.js +11 -0
- package/.next/server/chunks/8284.js +42 -0
- package/.next/server/chunks/8645.js +1 -1
- package/.next/server/chunks/9235.js +25 -4
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2005.4eea65c00d9a29cd.js +1 -0
- package/.next/static/chunks/3429-34fb1a84aed96703.js +1 -0
- package/.next/static/chunks/{2005-f9d38c39f10c321f.js → 4386-e9621d3c94969a68.js} +1 -1
- package/.next/static/chunks/4919-6c8a48e3cc642349.js +1 -0
- package/.next/static/chunks/7561-2b366ddcbc3cc0ec.js +1 -0
- package/.next/static/chunks/8404-5aa8ea49197b98b8.js +1 -0
- package/.next/static/chunks/{8650-41c2afc0eba37fb8.js → 8650-5294c6ed1173b014.js} +1 -1
- package/.next/static/chunks/app/chat/{page-1d100e5d974c919e.js → page-bc7807593b8b7394.js} +1 -1
- package/.next/static/chunks/app/executions/page-8296fd69c439ccee.js +1 -0
- package/.next/static/chunks/app/flows/page-87fb466e491fc068.js +1 -0
- package/.next/static/chunks/app/{layout-38b88f3b057f4852.js → layout-abed1f211e03152f.js} +1 -1
- package/.next/static/chunks/app/mcp/page-1648e6fde0c41461.js +1 -0
- package/.next/static/chunks/app/models/{page-808c0568ebc5e2c7.js → page-a5e2437356b06db8.js} +1 -1
- package/.next/static/chunks/app/packages/page-fba5696f33d9cdfb.js +1 -0
- package/.next/static/chunks/app/page-2f9da78a4891731a.js +1 -0
- package/.next/static/chunks/app/settings/page-2fc3a70bfd25c48b.js +1 -0
- package/.next/static/chunks/{webpack-dccb4f149ebdedcc.js → webpack-d5d737ff6a86674f.js} +1 -1
- package/.next/trace +10 -10
- package/README.md +16 -15
- package/package.json +5 -5
- package/.next/server/chunks/2985.js +0 -1
- package/.next/server/chunks/4366.js +0 -2
- package/.next/server/chunks/5040.js +0 -48
- package/.next/server/chunks/8187.js +0 -78
- package/.next/server/chunks/8851.js +0 -1
- package/.next/static/chunks/289-98f50bfcf833d661.js +0 -1
- package/.next/static/chunks/3089.df88f3b16898aad7.js +0 -1
- package/.next/static/chunks/8041-05830e887c133085.js +0 -1
- package/.next/static/chunks/8404-bfa9203e4296f3fb.js +0 -1
- package/.next/static/chunks/95-b9691d3cb15556dc.js +0 -1
- package/.next/static/chunks/app/executions/page-10ec7d58c7fbdd6f.js +0 -1
- package/.next/static/chunks/app/flows/page-9a78a2915268b2f8.js +0 -1
- package/.next/static/chunks/app/mcp/page-56b43b2f8752e9a5.js +0 -1
- package/.next/static/chunks/app/packages/page-af6ec89522915206.js +0 -1
- package/.next/static/chunks/app/page-30bf4293efa47a47.js +0 -1
- package/.next/static/chunks/app/settings/page-59ae1b658838f0bc.js +0 -1
- /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → Zz_Vh59XdtLIPcf-PxCpo}/_buildManifest.js +0 -0
- /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → Zz_Vh59XdtLIPcf-PxCpo}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8650],{1877:(e,t,r)=>{r.d(t,{Hm:()=>i,xc:()=>o,yo:()=>a});let n=["key","secret","token","password"],o=e=>n.some(t=>e.toLowerCase().includes(t)),i=e=>o(e)||"authorization"===e.trim().toLowerCase(),a=e=>{if(!e)return e;if(e.includes("_-_-_")){let t=e.split("_-_-_");return 3===t.length?t[2]:e}let t=/^mcp_(.+)_[0-9a-z]+$/.exec(e);if(t&&t[1])return t[1];let r=e.indexOf("__");return r>0&&r+2<e.length?e.slice(r+2):e}},9164:(e,t,r)=>{r.r(t),r.d(t,{StorageProvider:()=>p,default:()=>f,useStorage:()=>d});var n=r(95155),o=r(12115),i=r(29692),a=r(1877),s=r(87021),l=r(31373);let c=(0,s.h)("frontend/contexts/StorageContext"),u=(0,o.createContext)({setKey:async()=>{},changeKey:async()=>!1,verifyKey:async()=>!1,isEncryptionInitialized:async()=>!1,globalEnvVars:{},setGlobalEnvVars:async()=>{},deleteGlobalEnvVar:async()=>{},encryptValue:async()=>null,decryptValue:async()=>null,isUserEncryptionEnabled:async()=>!1,isLoading:!0,settings:{speech:{enabled:!0},update:{checkOnStartup:!1}},settingsHydrated:!1,updateSettings:async()=>{}}),d=()=>(0,o.useContext)(u),p=e=>{let{children:t}=e,[r,s]=(0,o.useState)(!1),[d,p]=(0,o.useState)(!1),[f,h]=(0,o.useState)({}),[y,m]=(0,o.useState)({speech:{enabled:!0},update:{checkOnStartup:!1}}),g=(0,o.useCallback)(async()=>{c.debug("isEncryptionInitialized: Entering method");try{let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_initialized"})});if(!e.ok)throw Error("Failed to check encryption status");let t=await e.json();return!0===t.initialized}catch(e){return c.warn("isEncryptionInitialized: Failed to check encryption status:",e),!1}},[]),v=(0,o.useCallback)(async e=>{c.debug("setKey: Entering method");try{if(!(await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize",password:e})})).ok)throw Error("Failed to set encryption key")}catch(e){c.warn("setKey: Failed to set encryption key:",e)}},[]),w=(0,o.useCallback)(async(e,t)=>{c.debug("changeKey: Entering method");try{let r=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",oldPassword:e,newPassword:t})});if(!r.ok)throw Error("Failed to change encryption key");let n=await r.json();if(n.success&&sessionStorage.getItem("encryption_token")){let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"authenticate",password:t})});if(e.ok){let t=await e.json();t.success&&t.token&&(sessionStorage.setItem("encryption_token",t.token),sessionStorage.setItem("encryption_authenticated","true"),sessionStorage.removeItem("encryption_key"))}}return!0===n.success}catch(e){return c.warn("changeKey: Failed to change encryption key:",e),!1}},[]),b=(0,o.useCallback)(async e=>{c.debug("verifyKey: Entering method");try{let t=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"verify_password",password:e})});if(!t.ok)throw Error("Failed to verify encryption key");let r=await t.json();return r.valid&&r.token&&(sessionStorage.setItem("encryption_token",r.token),sessionStorage.setItem("encryption_authenticated","true"),sessionStorage.removeItem("encryption_key")),!0===r.valid}catch(e){return c.warn("verifyKey: Failed to verify encryption key:",e),!1}},[]),x=(0,o.useCallback)(async()=>{let e={speech:{enabled:!0},update:{checkOnStartup:!1}};try{var t;let r=await fetch("/api/storage?key=".concat(encodeURIComponent(i.Zg.SPEECH_SETTINGS),"&defaultValue=").concat(encodeURIComponent(JSON.stringify(e))));if(!r.ok)return void c.debug("loadSettings: settings read not ok, keeping defaults",{status:r.status});let n=await r.json();c.debug("Loaded settings from storage",{settings:n.value}),m(null!=(t=n.value)?t:e),p(!0)}catch(e){c.warn("loadSettings: failed to load settings:",e)}},[]);(0,o.useEffect)(()=>{let e=()=>{c.info("Encryption unlocked signal received; reloading settings"),x()};return window.addEventListener(l.ZB,e),()=>window.removeEventListener(l.ZB,e)},[x]),(0,o.useEffect)(()=>{(async()=>{c.debug("loadData: Entering method");try{c.info("Calling initialization API to verify storage");let e=await fetch("/api/init");if(e.ok)c.info("Storage initialization completed successfully");else{let t=await e.json();c.warn("Storage initialization warning:",t.error)}await g()||await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize_default"})});let t=await fetch("/api/env?includeSecrets=false");if(t.ok){let e=await t.json();c.debug("Loaded environment variables",{count:Object.keys(e.variables||{}).length}),h(e.variables||{})}else c.error("loadData: Failed to load environment variables"),h({});await x(),s(!0)}catch(e){c.error("loadData: Error loading data:",e),s(!0)}})()},[g,x]);let E=(0,o.useCallback)(async(e,t)=>{c.debug("encryptValue: Entering method");try{let r=sessionStorage.getItem("encryption_token"),n=sessionStorage.getItem("encryption_key"),o={action:"encrypt",data:e};r?o.token=r:t?o.password=t:n&&(o.password=n);let i=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!i.ok)throw Error("Failed to encrypt value");return(await i.json()).result}catch(e){return c.warn("encryptValue: Failed to encrypt value:",e),null}},[]),C=(0,o.useCallback)(async(e,t)=>(c.debug("decryptValue: Entering method - THIS METHOD IS DEPRECATED"),c.warn("decryptValue: Frontend decryption is deprecated for security reasons"),null),[]),S=(0,o.useCallback)(async()=>{c.debug("isUserEncryptionEnabled: Entering method");try{let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_user_encryption"})});if(!e.ok)throw Error("Failed to check user encryption status");let t=await e.json();return!0===t.userEncryption}catch(e){return c.warn("isUserEncryptionEnabled: Failed to check user encryption status:",e),!1}},[]),k=(0,o.useCallback)(async e=>{c.debug("setGlobalEnvVars: Entering method");try{await g()||await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize_default"})});let t=await fetch("/api/env",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"setAll",variables:e})});if(!t.ok){let e=await t.json();c.error("setGlobalEnvVars: Failed to set environment variables:",e.error);return}let r={};for(let[t,n]of Object.entries(e)){let e="object"==typeof n&&null!==n&&"value"in n?n.value:n,o="object"==typeof n&&null!==n&&"metadata"in n?n.metadata:{isSecret:(0,a.xc)(t)};o.isSecret?r[t]={value:"********",metadata:o}:r[t]={value:e,metadata:o}}h(r)}catch(e){c.error("setGlobalEnvVars: Error setting environment variables:",e)}},[g]),j=(0,o.useCallback)(async e=>{c.debug("deleteGlobalEnvVar: Deleting environment variable: ".concat(e));try{let t=await fetch("/api/env",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"delete",key:e})});if(!t.ok){let e=await t.json();c.error("deleteGlobalEnvVar: Failed to delete environment variable:",e.error);return}h(t=>{let r={...t};return delete r[e],r})}catch(e){c.error("deleteGlobalEnvVar: Error deleting environment variable:",e)}},[]),A=(0,o.useCallback)(async e=>{c.debug("updateSettings: Updating settings",{newSettings:e});try{await (0,i.VH)(i.Zg.SPEECH_SETTINGS,e),m(e)}catch(e){c.error("updateSettings: Error updating settings:",e)}},[]);return(0,n.jsx)(u.Provider,{value:{setKey:v,changeKey:w,verifyKey:b,isEncryptionInitialized:g,globalEnvVars:f,setGlobalEnvVars:k,deleteGlobalEnvVar:j,encryptValue:E,decryptValue:C,isUserEncryptionEnabled:S,isLoading:!r,settings:y,settingsHydrated:d,updateSettings:A},children:t})},f=u},23731:(e,t,r)=>{r.d(t,{uJ:()=>A,Ay:()=>F,Yw:()=>T});var n=r(95155),o=r(12115),i=r(33567),a=r(94049),s=r(4474),l=r(25635),c=r(22003),u=r(78470),d=r(91871),p=r(50430),f=r(26188),h=r(38952),y=r(63186),m=r(62962),g=r(39486),v=r(82446),w=r(9127),b=r(17897),x=r(41080);let E=(0,r(87021).h)("frontend/components/Chat/McpAppFrame"),C={name:"FLUJO",version:"3.33.0"},S=new Set(["https:","http:"]),k=["inline","fullscreen","pip"],j=new Set(["text"]),A=262144;function T(e){try{return new TextEncoder().encode(JSON.stringify(e)).length}catch(e){return 1/0}}let R=null;async function P(){return R||(R=fetch("/api/mcp/app-sandbox").then(async e=>{if(!e.ok)throw Error("Sandbox endpoint discovery failed (".concat(e.status,")"));return await e.json()}).catch(e=>{throw R=null,e})),function(e,t){let r;if("string"!=typeof e.token||0===e.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==e.url){if("string"!=typeof e.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{r=new URL(e.url)}catch(e){throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==r.protocol&&"https:"!==r.protocol||r.username||r.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===t.protocol&&"https:"!==r.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==t.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(e.port)||e.port<1||e.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(r=new URL("/sandbox.html",t.origin)).port=String(e.port)}if(r.origin===t.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return r.searchParams.set("token",e.token),r.href}(await R,window.location)}function M(e,t){let r=[],n=new Set;for(let o of null!=e?e:[]){if(0===o.length||o.length>2048||/[^\x21-\x7e]/.test(o))continue;let e=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(o);if(!e||!t.includes(e[1].toLowerCase()))continue;let i=e[3].split(".");if(e[3].length>253||i.some(e=>0===e.length||e.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)))continue;let a=e[4]?Number(e[4]):void 0;if(void 0!==a&&(!Number.isInteger(a)||a<1||a>65535))continue;let s=o.toLowerCase();if(!n.has(s)&&(n.add(s),r.push(o),r.length>=64))break}return r}function O(e){if(e)try{return JSON.parse(e)}catch(e){return}}async function L(e,t,r,n){let o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0;if(await e.sendToolInput({arguments:function(e){let t=O(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}(t)}),void 0!==n)return void await e.sendToolCancelled({reason:n});let i=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(void 0===e)return!0===t?{content:[],isError:!0}:null;let r=O(e);return r&&"object"==typeof r&&Array.isArray(r.content)?{...r,...!0===t?{isError:!0}:{}}:{content:[{type:"text",text:e}],...!0===t?{isError:!0}:{}}}(r,o);i&&await e.sendToolResult(i)}function _(e,t,r){return t.includes(e)&&r.includes(e)}function I(e,t){let r=e.getBoundingClientRect(),n=Math.max(1,Math.round(r.width||e.clientWidth||1));return t?{width:n,height:Math.max(1,Math.round(r.height||e.clientHeight||1))}:{width:n,maxHeight:6e3}}async function U(e,t,r){try{let n=await b.S.listServerTools(e),o=Array.isArray(n.tools)?n.tools:[],i=r?o.find(e=>(null==e?void 0:e.name)===r):o.find(e=>(0,x.Gt)(null==e?void 0:e._meta)===t);if((null==i?void 0:i.name)&&(null==i?void 0:i.inputSchema)&&(0,x.Gt)(i._meta)===t)return{tool:i}}catch(e){E.debug("Could not resolve the full MCP App tool definition",e)}}let F=e=>{let{serverName:t,uri:r,toolName:R,toolArgs:O,toolResultContent:F,toolUpdateId:z,toolCancelledReason:N,toolIsError:H,onAppMessage:D,onUpdateModelContext:J,onRequestDock:V,onDockable:G,onAvailableDisplayModes:B,hostDisplayMode:K,onRequestDisplayMode:W,onRequestClose:q,onRegisterTeardown:Z,teardownRegistrationKey:$,docked:X=!1,visible:Y=!0}=e,Q=(0,i.A)(),[ee,et]=(0,o.useState)(!1),[er,en]=(0,o.useState)(!1),[eo,ei]=(0,o.useState)(null),[ea,es]=(0,o.useState)(X?"pip":"inline"),[el,ec]=(0,o.useState)([]),eu=null!=K?K:ea,ed=(0,o.useMemo)(()=>X?["pip","fullscreen"]:["inline","fullscreen",...V?["pip"]:[]],[X,V]),ep=(0,o.useRef)(null),ef=(0,o.useRef)(null),eh=(0,o.useRef)(null),ey=(0,o.useRef)(!1),em=(0,o.useRef)(0),eg=(0,o.useRef)(!1),ev=(0,o.useRef)(null),ew=(0,o.useRef)(null),eb=(0,o.useRef)(!1),ex=(0,o.useRef)(!0),eE=(0,o.useRef)([]),eC=(0,o.useRef)(eu),eS=(0,o.useRef)(ed),ek=(0,o.useRef)(Promise.resolve()),ej=(0,o.useRef)(void 0),eA=(0,o.useRef)({args:O,resultContent:F,cancelledReason:N,isError:H,updateId:z});eA.current={args:O,resultContent:F,cancelledReason:N,isError:H,updateId:z};let eT=(0,o.useRef)(D);(0,o.useEffect)(()=>{eT.current=D},[D]);let eR=(0,o.useRef)(J);(0,o.useEffect)(()=>{eR.current=J},[J]);let eP=(0,o.useRef)(V);(0,o.useEffect)(()=>{eP.current=V},[V]);let eM=(0,o.useRef)(G);(0,o.useEffect)(()=>{eM.current=G},[G]);let eO=(0,o.useRef)(B);(0,o.useEffect)(()=>{eO.current=B},[B]);let eL=(0,o.useRef)(W);(0,o.useEffect)(()=>{eL.current=W},[W]);let e_=(0,o.useRef)(q);(0,o.useEffect)(()=>{e_.current=q},[q]);let eI=(0,o.useRef)(X);(0,o.useEffect)(()=>{eI.current=X},[X]),(0,o.useEffect)(()=>{eC.current=eu},[eu]),(0,o.useEffect)(()=>{eS.current=ed},[ed]);let eU=(0,o.useCallback)(()=>{var e;if(ew.current)return ew.current;em.current+=1;let t=eh.current,r=ef.current,n=eg.current;eh.current=null,ef.current=null,eg.current=!1,ey.current=!1,eE.current=[],null==(e=ev.current)||e.disconnect(),ev.current=null;let o=(async()=>{if(t&&n){let e;try{await Promise.race([t.teardownResource({},{timeout:1e3}),new Promise(t=>{e=setTimeout(t,1e3)})])}catch(e){E.debug("MCP App did not acknowledge resource teardown",e)}finally{e&&clearTimeout(e)}}try{await (null==t?void 0:t.close())}catch(e){}null==r||r.remove()})();return ew.current=o,o.finally(()=>{ew.current===o&&(ew.current=null)}),o},[]),eF=(0,o.useCallback)(()=>{!eb.current&&eP.current&&(eb.current=!0,eU().then(()=>{var e;ex.current&&(null==(e=eP.current)||e.call(eP),et(!1))}).finally(()=>{eb.current=!1}))},[eU]),ez=(0,o.useCallback)((e,t,r,n,o)=>{ek.current=ek.current.catch(()=>void 0).then(async()=>{eh.current===e&&eg.current&&await L(e,t,r,n,o)}).catch(e=>{E.warn("MCP App tool delivery failed",e)})},[]),eN=(0,o.useCallback)(async()=>{if(ew.current&&await ew.current,ey.current||!ep.current)return;let e=em.current+1;em.current=e;let n=()=>em.current===e&&ey.current;ey.current=!0,ec([]),en(!0),ei(null);try{var o,i,a;let s,[l,c]=await Promise.all([b.S.readResourceFromApp(t,r),U(t,r,R)]);if(!n())return;if((null==l?void 0:l.httpStatus)===403)throw Error((null==l?void 0:l.error)||"MCP Apps access was disabled for this server");if(!l||!1===l.success)throw Error((null==l?void 0:l.error)||"Failed to read the UI resource.");let u=function(e,t){var r,n,o;let i,a=null==e?void 0:e.contents;if(!Array.isArray(a)||0===a.length)throw Error("Resource has no contents");let s=a.find(e=>e.uri===t&&"string"==typeof e.mimeType&&(0,x.q$)(e.mimeType)&&("string"==typeof e.text||"string"==typeof e.blob));if(!s)throw Error("Resource ".concat(t," did not return MCP App HTML"));try{i="string"==typeof s.text?s.text:function(e){let t=Uint8Array.from(atob(e),e=>e.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(t)}(s.blob)}catch(e){throw Error("Resource ".concat(t," contains invalid base64 UTF-8 HTML"))}if(new TextEncoder().encode(i).length>x.Pt)throw Error("Resource exceeds the ".concat(Math.round(x.Pt/1024)," KiB size cap"));let l=null==(r=null!=(n=s._meta)?n:s.meta)?void 0:r.ui,c=w.c0.safeParse(null==l?void 0:l.csp);if((null==l?void 0:l.csp)!==void 0&&!c.success)throw Error("Resource ".concat(t," declares an invalid CSP policy"));let u=w.Ml.safeParse(null==l?void 0:l.permissions);if((null==l?void 0:l.permissions)!==void 0&&!u.success)throw Error("Resource ".concat(t," declares invalid sandbox permissions"));return{html:i,csp:c.success?{connectDomains:M((o=c.data).connectDomains,["https","wss"]),resourceDomains:M(o.resourceDomains,["https"]),frameDomains:M(o.frameDomains,["https"]),baseUriDomains:M(o.baseUriDomains,["https"])}:void 0,permissions:u.success&&u.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(l.data,r),d=await P();if(!n()||!ep.current)return;let p=document.createElement("iframe");p.title="MCP App: ".concat(r),p.setAttribute("sandbox","allow-scripts allow-same-origin"),p.referrerPolicy="origin";let f=(0,w.Sy)(u.permissions);f&&p.setAttribute("allow",f),p.style.cssText=eI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",ep.current.appendChild(p),ef.current=p;let h=new URL(d);u.csp&&h.searchParams.set("csp",JSON.stringify(u.csp));let y=h.origin,m=new Promise((e,t)=>{let r=setTimeout(()=>{window.removeEventListener("message",n),t(Error("Timed out waiting for the sandbox proxy."))},1e4),n=t=>{var o,i;t.source===p.contentWindow&&t.origin===y&&(null==(o=t.data)?void 0:o.jsonrpc)==="2.0"&&(null==(i=t.data)?void 0:i.method)==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(r),window.removeEventListener("message",n),e())};window.addEventListener("message",n)});if(p.src=h.href,await m,!n()||ef.current!==p)return;let g=eC.current,v="inline";eC.current=v,s=new w.T1(function(e,t){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(r,n,o)=>{let{method:i,params:a}=r;if("tools/call"===i){var s;E.info("MCP App tools/call: ".concat(e,"/").concat(null==a?void 0:a.name));let r=await b.S.callToolFromApp(e,a.name,null!=(s=a.arguments)?s:{},void 0,null==o?void 0:o.signal);if((null==r?void 0:r.httpStatus)===403){let e=(null==r?void 0:r.error)||"MCP Apps access was disabled for this server";throw t(e),Error(e)}if(!r||!1===r.success)throw Error((null==r?void 0:r.error)||"Tool call failed: ".concat(null==a?void 0:a.name));return r.data}if("resources/read"===i){let r=await b.S.readResourceFromApp(e,a.uri);if((null==r?void 0:r.httpStatus)===403){let e=(null==r?void 0:r.error)||"MCP Apps access was disabled for this server";throw t(e),Error(e)}if(!r||!1===r.success)throw Error((null==r?void 0:r.error)||"Resource read failed: ".concat(null==a?void 0:a.uri));return r.data}if("resources/list"===i)return{resources:[]};if("resources/templates/list"===i)return{resourceTemplates:[]};throw Error("MCP App requested unsupported method: ".concat(i))}}}(t,t=>{em.current===e&&eh.current===s&&(ei(t),en(!1),eU())}),C,{openLinks:{},serverTools:{},serverResources:{},logging:{},...eT.current?{message:{text:{}}}:{},...eR.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:u.csp,permissions:u.permissions}},{hostContext:{...c?{toolInfo:c}:{},theme:"dark"===Q.palette.mode?"dark":"light",platform:"web",displayMode:v,availableDisplayModes:eS.current,containerDimensions:I(ep.current,eI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:null!=(a=null==(o=(i=window).matchMedia)?void 0:o.call(i,"(hover: hover)").matches)&&a}}}),eh.current=s;let O=()=>n()&&eh.current===s;if(s.onopenlink=async e=>{let{url:n}=e;if(!O())return{isError:!0};let o=function(e){try{let t=new URL(e);if(!S.has(t.protocol)||t.username||t.password)return null;return t.href}catch(e){return null}}(n);if(!o)return E.warn("MCP App open-link rejected by URL policy",{serverName:t,uri:r}),{isError:!0};let i=window.open(o,"_blank","noopener,noreferrer");return i?(i.opener=null,{}):{isError:!0}},s.ondownloadfile=async e=>{let{contents:t}=e;if(!O())return{isError:!0};try{for(let e of null!=t?t:[]){let t,n=null==e?void 0:e.resource;if(!n)continue;let o=("string"==typeof n.uri?n.uri.split("/").pop():"")||"download",i="string"==typeof n.mimeType?n.mimeType:"application/octet-stream";if("string"==typeof n.blob){let e=Uint8Array.from(atob(n.blob),e=>e.charCodeAt(0));t=new Blob([e],{type:i})}else{var r;t=new Blob([String(null!=(r=n.text)?r:"")],{type:i})}let a=URL.createObjectURL(t),s=document.createElement("a");s.href=a,s.download=o,document.body.appendChild(s),s.click(),s.remove(),setTimeout(()=>URL.revokeObjectURL(a),4e3)}return{}}catch(e){return E.warn("MCP App download failed",e),{isError:!0}}},s.onloggingmessage=e=>{O()&&E.debug("MCP App log",null==e?void 0:e.data)},s.onmessage=async e=>{if(!O())return{};if(!eT.current)throw Error("This host cannot deliver ui/message in this surface");let t=function(e){if((null==e?void 0:e.role)!=="user")throw Error('This host accepts ui/message only with role "user"');let t=null==e?void 0:e.content,r=Array.isArray(t)?t:t&&"object"==typeof t?[t]:[];if(0===r.length||r.some(e=>(null==e?void 0:e.type)!=="text"||"string"!=typeof e.text))throw Error("This host accepts text-only ui/message content");let n=r.map(e=>e.text).join("\n").trim();if(!n)throw Error("ui/message text must not be empty");return n}(e);if(!await eT.current(t))throw Error("ui/message was not delivered");return{}},s.onupdatemodelcontext=async e=>{if(!O())return{};let n=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return"ui/update-model-context params must be an object";if(void 0!==e.content){if(!Array.isArray(e.content))return"Model context content must be an array";for(let t of e.content)if(!t||"object"!=typeof t||Array.isArray(t)||!j.has(t.type))return"Model context contains a modality this host did not advertise"}return void 0!==e.structuredContent&&(!e.structuredContent||"object"!=typeof e.structuredContent||Array.isArray(e.structuredContent))?"Model structuredContent must be an object":T(e)>A?"Model context exceeds ".concat(A," bytes"):null}(e);if(n)throw Error(n);let o="".concat(t,"::").concat(r);if(!eR.current)throw Error("This host cannot preserve model context in this surface");if(!await eR.current(o,e))throw Error("MCP App model context was not stored");return{}},s.onsizechange=async e=>{var t,r;let{width:n,height:o}=e;if(!O()||eI.current)return;let i=(null==(t=ep.current)?void 0:t.getBoundingClientRect().width)||(null==(r=ep.current)?void 0:r.clientWidth)||0,a=function(e,t){let r={};if(Number.isFinite(e.width)&&e.width>0){let n=Number.isFinite(t)&&t>0?t:6e3;r.width=Math.min(e.width,n,6e3)}return Number.isFinite(e.height)&&e.height>0&&(r.height=Math.min(e.height,6e3)),r}({width:n,height:o},i);void 0!==a.height&&(p.style.height="".concat(a.height,"px")),void 0!==a.width&&(p.style.width="".concat(a.width,"px"),p.style.maxWidth="100%")},s.onrequestdisplaymode=async e=>{let{mode:t}=e;if(!O())return{mode:eC.current};let r=eC.current,n=eE.current;if(!_(t,eS.current,n))return{mode:r};if("pip"===t&&!eI.current&&eP.current)return setTimeout(eF,0),{mode:r};let o=r;return(o=eL.current?await eL.current(t,[...n]):t)===r||_(o,eS.current,n)||(o=r),o!==r&&(eC.current=o,es(o),await s.sendHostContextChange({displayMode:o})),{mode:o}},s.onrequestteardown=()=>{O()&&eU().finally(()=>{e_.current?e_.current():(eC.current="inline",es("inline"),et(!1))})},s.oninitialized=()=>{var e,t,r,n,o,i,a,l,c;if(!O())return;let u=null==(e=s.getAppCapabilities())?void 0:e.availableDisplayModes,d=Array.isArray(u)?[...new Set(u.filter(e=>k.includes(e)))]:[];eE.current=d,ec(d),null==(t=eM.current)||t.call(eM,d.includes("pip")),null==(r=eO.current)||r.call(eO,[...d]),eg.current=!0;let p=function(e,t,r,n){return t?_("pip",r,n)?"fullscreen"===e&&_("fullscreen",r,n)?"fullscreen":"pip":null:"fullscreen"===e&&_("fullscreen",r,n)?"fullscreen":"inline"}(g,eI.current,eS.current,d);if(null===p){ei("This app does not declare support for the canvas (pip) display mode."),en(!1),eU();return}eC.current=p,es(p),p!==v&&s.sendHostContextChange({displayMode:p});let f=ep.current;if(f&&"undefined"!=typeof ResizeObserver){let e=()=>{if(!O()||!eg.current)return;let e=f.getBoundingClientRect();e.width<=0||eI.current&&e.height<=0||s.sendHostContextChange({containerDimensions:I(f,eI.current)})};null==(n=ev.current)||n.disconnect(),ev.current=new ResizeObserver(e),ev.current.observe(f),e()}let h=eA.current;ej.current=null!=(c=h.updateId)?c:"".concat(null!=(o=h.args)?o:"","\0").concat(null!=(i=h.resultContent)?i:"","\0").concat(null!=(a=h.cancelledReason)?a:"","\0").concat(null!=(l=h.isError)?l:""),(void 0!==h.args||void 0!==h.resultContent||void 0!==h.cancelledReason||!0===h.isError)&&ez(s,h.args,h.resultContent,h.cancelledReason,h.isError),en(!1)},await s.connect(function(e,t){let r=new w.hJ(e,t),n={start:async()=>{r.onmessage=(e,t)=>{var r;null==(r=n.onmessage)||r.call(n,"ui/message"!==e.method||!e.params||Array.isArray(e.params.content)||!e.params.content||"object"!=typeof e.params.content?e:{...e,params:{...e.params,content:[e.params.content]}},t)},r.onerror=e=>{var t;return null==(t=n.onerror)?void 0:t.call(n,e)},r.onclose=()=>{var e;return null==(e=n.onclose)?void 0:e.call(n)},await r.start()},send:(e,t)=>r.send(e,t),close:()=>r.close(),setProtocolVersion:e=>{var t;return null==(t=r.setProtocolVersion)?void 0:t.call(r,e)}};return n}(p.contentWindow,p.contentWindow)),!O())return;await s.sendSandboxResourceReady({html:u.html,csp:u.csp,permissions:u.permissions})}catch(e){if(!n())return;E.warn("Failed to mount MCP App ".concat(r," from ").concat(t),e),ei(e instanceof Error?e.message:"Failed to load the app."),en(!1),eU()}},[eF,ez,t,eU,Q.palette.mode,R,r]),eH=(0,o.useCallback)(()=>{let e=!ee;if(!e&&"fullscreen"===eC.current){var t;eC.current="inline",es("inline"),null==(t=eh.current)||t.sendHostContextChange({displayMode:"inline"})}et(e),e&&setTimeout(()=>{eN()},0)},[ee,eN]);if((0,o.useEffect)(()=>{X&&!ey.current&&eN()},[X,eN]),(0,o.useEffect)(()=>{let e=null!=z?z:"".concat(null!=O?O:"","\0").concat(null!=F?F:"","\0").concat(null!=N?N:"","\0").concat(null!=H?H:"");eg.current&&eh.current&&e!==ej.current&&(ej.current=e,eU().then(()=>{ex.current&&(eI.current||ee)&&eN()}))},[ee,eN,eU,O,N,H,F,z]),(0,o.useEffect)(()=>{K&&eg.current&&eh.current&&eC.current!==K&&_(K,eS.current,eE.current)&&(eC.current=K,es(K),eh.current.sendHostContextChange({displayMode:K}))},[K]),(0,o.useEffect)(()=>{var e;eg.current&&eh.current&&(null==(e=eh.current)||e.sendHostContextChange({theme:"dark"===Q.palette.mode?"dark":"light"}))},[Q.palette.mode]),(0,o.useEffect)(()=>{let e=null!=$?$:"".concat(t,"::").concat(r);return null==Z||Z(e,eU),()=>null==Z?void 0:Z(e,null)},[Z,t,eU,$,r]),(0,o.useEffect)(()=>{let e=e=>{var r,n;let o=e.detail;(null==o?void 0:o.serverName)===t&&((null==(r=o.config)?void 0:r.enableMcpApps)===!1||(null==(n=o.config)?void 0:n.disabled)===!0)&&(ei("MCP Apps access was disabled for this server."),en(!1),eU().finally(()=>{var e;eI.current&&(null==(e=e_.current)||e.call(e_))}))};return window.addEventListener("flujo:mcp-server-config-changed",e),()=>{window.removeEventListener("flujo:mcp-server-config-changed",e)}},[t,eU]),(0,o.useEffect)(()=>(ex.current=!0,()=>{ex.current=!1,eU()}),[eU]),X)return(0,n.jsxs)(a.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Y?"visible":"hidden",pointerEvents:Y?"auto":"none",flexDirection:"column"},children:[er&&(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(s.default,{size:16,thickness:6}),(0,n.jsx)(l.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),eo&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eo}),(0,n.jsx)(a.default,{ref:ep,sx:{flex:1,minHeight:0,width:"100%",display:eo?"none":"block"}})]});let eD=el.includes("inline")&&el.includes("fullscreen")&&ed.includes("fullscreen"),eJ=el.includes("inline")&&el.includes("pip")&&ed.includes("pip")&&!!V;return(0,n.jsxs)(a.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===ea?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,n.jsx)(f.A,{fontSize:"small",color:"primary"}),(0,n.jsxs)(l.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",t]}),(0,n.jsx)(u.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,n.jsx)(h.A,{fontSize:"small",color:"action"})}),(0,n.jsx)(a.default,{sx:{flex:1}}),ee&&eJ&&(0,n.jsx)(d.A,{size:"small",onClick:eF,children:"Canvas"}),ee&&(0,n.jsx)(u.A,{title:eD?"fullscreen"===ea?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,n.jsx)("span",{children:(0,n.jsx)(d.A,{size:"small",disabled:!eD,onClick:()=>{var e;let t="fullscreen"===ea?"inline":"fullscreen";_(t,ed,el)&&(eC.current=t,es(t),null==(e=eh.current)||e.sendHostContextChange({displayMode:t}))},sx:{minWidth:0},children:"fullscreen"===ea?(0,n.jsx)(v.A,{fontSize:"small"}):(0,n.jsx)(g.A,{fontSize:"small"})})})}),(0,n.jsx)(d.A,{size:"small",onClick:eH,startIcon:ee?(0,n.jsx)(m.A,{}):(0,n.jsx)(y.A,{}),children:ee?"Hide":"Open app"})]}),(0,n.jsx)(p.A,{in:ee,onExited:()=>{eU()},children:(0,n.jsxs)(a.default,{sx:{p:1,height:"fullscreen"===ea?"calc(100vh - 100px)":"auto"},children:[er&&(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(s.default,{size:16,thickness:6}),(0,n.jsx)(l.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),eo&&(0,n.jsx)(c.A,{severity:"error",sx:{my:1},children:eo}),(0,n.jsx)(a.default,{ref:ep,sx:{width:"100%",height:"fullscreen"===ea?"100%":"auto",display:eo?"none":"block"}})]})})]})}},31373:(e,t,r)=>{r.d(t,{UJ:()=>n,ZB:()=>o,bx:()=>a});let n="flujo:encryption-locked",o="flujo:encryption-unlocked",i=!1;function a(){if(i||"function"!=typeof window.fetch)return;i=!0;let e=window.fetch.bind(window);window.fetch=async function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];let i=await e(...r);return 423===i.status&&function(){try{sessionStorage.removeItem("encryption_authenticated"),sessionStorage.removeItem("encryption_token")}catch(e){}window.dispatchEvent(new CustomEvent(n))}(),i}}},41080:(e,t,r)=>{r.d(t,{Gt:()=>s,Pt:()=>o,q$:()=>a}),r(81029).hp;let n="ui://",o=2097152;function i(e){return"string"==typeof e&&e.length>n.length&&e.slice(0,n.length).toLowerCase()===n&&!/\s/.test(e)}function a(e){if("string"!=typeof e)return!1;let[t,...r]=e.toLowerCase().split(";");if("text/html"!==t.trim())return!1;let n=!1;for(let e of r){let t=e.indexOf("=");if(t<=0)return!1;let r=e.slice(0,t).trim(),o=e.slice(t+1).trim();if(!r||!o)return!1;if("profile"===r){if(n||"mcp-app"!==o)return!1;n=!0}}return n}function s(e){if(!e||"object"!=typeof e)return;let t=e["ui/resourceUri"];if(i(t))return t;for(let t of[e.ui,e["io.modelcontextprotocol/ui"]])if(t&&"object"==typeof t){let e=t.resourceUri;if(i(e))return e}}}}]);
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8650],{1877:(e,t,r)=>{r.d(t,{Hm:()=>i,xc:()=>o,yo:()=>a});let n=["key","secret","token","password"],o=e=>n.some(t=>e.toLowerCase().includes(t)),i=e=>o(e)||"authorization"===e.trim().toLowerCase(),a=e=>{if(!e)return e;if(e.includes("_-_-_")){let t=e.split("_-_-_");return 3===t.length?t[2]:e}let t=/^mcp_(.+)_[0-9a-z]+$/.exec(e);if(t&&t[1])return t[1];let r=e.indexOf("__");return r>0&&r+2<e.length?e.slice(r+2):e}},9164:(e,t,r)=>{r.r(t),r.d(t,{StorageProvider:()=>p,default:()=>f,useStorage:()=>d});var n=r(95155),o=r(12115),i=r(29692),a=r(1877),s=r(87021),l=r(31373);let c=(0,s.h)("frontend/contexts/StorageContext"),u=(0,o.createContext)({setKey:async()=>{},changeKey:async()=>!1,verifyKey:async()=>!1,isEncryptionInitialized:async()=>!1,globalEnvVars:{},setGlobalEnvVars:async()=>{},deleteGlobalEnvVar:async()=>{},encryptValue:async()=>null,decryptValue:async()=>null,isUserEncryptionEnabled:async()=>!1,isLoading:!0,settings:{speech:{enabled:!0},update:{checkOnStartup:!1}},settingsHydrated:!1,updateSettings:async()=>{}}),d=()=>(0,o.useContext)(u),p=e=>{let{children:t}=e,[r,s]=(0,o.useState)(!1),[d,p]=(0,o.useState)(!1),[f,h]=(0,o.useState)({}),[y,m]=(0,o.useState)({speech:{enabled:!0},update:{checkOnStartup:!1}}),g=(0,o.useCallback)(async()=>{c.debug("isEncryptionInitialized: Entering method");try{let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_initialized"})});if(!e.ok)throw Error("Failed to check encryption status");let t=await e.json();return!0===t.initialized}catch(e){return c.warn("isEncryptionInitialized: Failed to check encryption status:",e),!1}},[]),v=(0,o.useCallback)(async e=>{c.debug("setKey: Entering method");try{if(!(await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize",password:e})})).ok)throw Error("Failed to set encryption key")}catch(e){c.warn("setKey: Failed to set encryption key:",e)}},[]),w=(0,o.useCallback)(async(e,t)=>{c.debug("changeKey: Entering method");try{let r=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",oldPassword:e,newPassword:t})});if(!r.ok)throw Error("Failed to change encryption key");let n=await r.json();if(n.success&&sessionStorage.getItem("encryption_token")){let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"authenticate",password:t})});if(e.ok){let t=await e.json();t.success&&t.token&&(sessionStorage.setItem("encryption_token",t.token),sessionStorage.setItem("encryption_authenticated","true"),sessionStorage.removeItem("encryption_key"))}}return!0===n.success}catch(e){return c.warn("changeKey: Failed to change encryption key:",e),!1}},[]),b=(0,o.useCallback)(async e=>{c.debug("verifyKey: Entering method");try{let t=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"verify_password",password:e})});if(!t.ok)throw Error("Failed to verify encryption key");let r=await t.json();return r.valid&&r.token&&(sessionStorage.setItem("encryption_token",r.token),sessionStorage.setItem("encryption_authenticated","true"),sessionStorage.removeItem("encryption_key")),!0===r.valid}catch(e){return c.warn("verifyKey: Failed to verify encryption key:",e),!1}},[]),x=(0,o.useCallback)(async()=>{let e={speech:{enabled:!0},update:{checkOnStartup:!1}};try{var t;let r=await fetch("/api/storage?key=".concat(encodeURIComponent(i.Zg.SPEECH_SETTINGS),"&defaultValue=").concat(encodeURIComponent(JSON.stringify(e))));if(!r.ok)return void c.debug("loadSettings: settings read not ok, keeping defaults",{status:r.status});let n=await r.json();c.debug("Loaded settings from storage",{settings:n.value}),m(null!=(t=n.value)?t:e),p(!0)}catch(e){c.warn("loadSettings: failed to load settings:",e)}},[]);(0,o.useEffect)(()=>{let e=()=>{c.info("Encryption unlocked signal received; reloading settings"),x()};return window.addEventListener(l.ZB,e),()=>window.removeEventListener(l.ZB,e)},[x]),(0,o.useEffect)(()=>{(async()=>{c.debug("loadData: Entering method");try{c.info("Calling initialization API to verify storage");let e=await fetch("/api/init");if(e.ok)c.info("Storage initialization completed successfully");else{let t=await e.json();c.warn("Storage initialization warning:",t.error)}await g()||await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize_default"})});let t=await fetch("/api/env?includeSecrets=false");if(t.ok){let e=await t.json();c.debug("Loaded environment variables",{count:Object.keys(e.variables||{}).length}),h(e.variables||{})}else c.error("loadData: Failed to load environment variables"),h({});await x(),s(!0)}catch(e){c.error("loadData: Error loading data:",e),s(!0)}})()},[g,x]);let E=(0,o.useCallback)(async(e,t)=>{c.debug("encryptValue: Entering method");try{let r=sessionStorage.getItem("encryption_token"),n=sessionStorage.getItem("encryption_key"),o={action:"encrypt",data:e};r?o.token=r:t?o.password=t:n&&(o.password=n);let i=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!i.ok)throw Error("Failed to encrypt value");return(await i.json()).result}catch(e){return c.warn("encryptValue: Failed to encrypt value:",e),null}},[]),C=(0,o.useCallback)(async(e,t)=>(c.debug("decryptValue: Entering method - THIS METHOD IS DEPRECATED"),c.warn("decryptValue: Frontend decryption is deprecated for security reasons"),null),[]),S=(0,o.useCallback)(async()=>{c.debug("isUserEncryptionEnabled: Entering method");try{let e=await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"check_user_encryption"})});if(!e.ok)throw Error("Failed to check user encryption status");let t=await e.json();return!0===t.userEncryption}catch(e){return c.warn("isUserEncryptionEnabled: Failed to check user encryption status:",e),!1}},[]),k=(0,o.useCallback)(async e=>{c.debug("setGlobalEnvVars: Entering method");try{await g()||await fetch("/api/encryption/secure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"initialize_default"})});let t=await fetch("/api/env",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"setAll",variables:e})});if(!t.ok){let e=await t.json();c.error("setGlobalEnvVars: Failed to set environment variables:",e.error);return}let r={};for(let[t,n]of Object.entries(e)){let e="object"==typeof n&&null!==n&&"value"in n?n.value:n,o="object"==typeof n&&null!==n&&"metadata"in n?n.metadata:{isSecret:(0,a.xc)(t)};o.isSecret?r[t]={value:"********",metadata:o}:r[t]={value:e,metadata:o}}h(r)}catch(e){c.error("setGlobalEnvVars: Error setting environment variables:",e)}},[g]),j=(0,o.useCallback)(async e=>{c.debug("deleteGlobalEnvVar: Deleting environment variable: ".concat(e));try{let t=await fetch("/api/env",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"delete",key:e})});if(!t.ok){let e=await t.json();c.error("deleteGlobalEnvVar: Failed to delete environment variable:",e.error);return}h(t=>{let r={...t};return delete r[e],r})}catch(e){c.error("deleteGlobalEnvVar: Error deleting environment variable:",e)}},[]),A=(0,o.useCallback)(async e=>{c.debug("updateSettings: Updating settings",{newSettings:e});try{await (0,i.VH)(i.Zg.SPEECH_SETTINGS,e),m(e)}catch(e){c.error("updateSettings: Error updating settings:",e)}},[]);return(0,n.jsx)(u.Provider,{value:{setKey:v,changeKey:w,verifyKey:b,isEncryptionInitialized:g,globalEnvVars:f,setGlobalEnvVars:k,deleteGlobalEnvVar:j,encryptValue:E,decryptValue:C,isUserEncryptionEnabled:S,isLoading:!r,settings:y,settingsHydrated:d,updateSettings:A},children:t})},f=u},23731:(e,t,r)=>{r.d(t,{uJ:()=>A,Ay:()=>F,Yw:()=>T});var n=r(95155),o=r(12115),i=r(33567),a=r(94049),s=r(4474),l=r(25635),c=r(22003),u=r(78470),d=r(91871),p=r(50430),f=r(26188),h=r(38952),y=r(63186),m=r(62962),g=r(39486),v=r(82446),w=r(9127),b=r(17897),x=r(41080);let E=(0,r(87021).h)("frontend/components/Chat/McpAppFrame"),C={name:"FLUJO",version:"3.34.0"},S=new Set(["https:","http:"]),k=["inline","fullscreen","pip"],j=new Set(["text"]),A=262144;function T(e){try{return new TextEncoder().encode(JSON.stringify(e)).length}catch(e){return 1/0}}let R=null;async function P(){return R||(R=fetch("/api/mcp/app-sandbox").then(async e=>{if(!e.ok)throw Error("Sandbox endpoint discovery failed (".concat(e.status,")"));return await e.json()}).catch(e=>{throw R=null,e})),function(e,t){let r;if("string"!=typeof e.token||0===e.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==e.url){if("string"!=typeof e.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{r=new URL(e.url)}catch(e){throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==r.protocol&&"https:"!==r.protocol||r.username||r.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===t.protocol&&"https:"!==r.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==t.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(e.port)||e.port<1||e.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(r=new URL("/sandbox.html",t.origin)).port=String(e.port)}if(r.origin===t.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return r.searchParams.set("token",e.token),r.href}(await R,window.location)}function M(e,t){let r=[],n=new Set;for(let o of null!=e?e:[]){if(0===o.length||o.length>2048||/[^\x21-\x7e]/.test(o))continue;let e=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(o);if(!e||!t.includes(e[1].toLowerCase()))continue;let i=e[3].split(".");if(e[3].length>253||i.some(e=>0===e.length||e.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)))continue;let a=e[4]?Number(e[4]):void 0;if(void 0!==a&&(!Number.isInteger(a)||a<1||a>65535))continue;let s=o.toLowerCase();if(!n.has(s)&&(n.add(s),r.push(o),r.length>=64))break}return r}function O(e){if(e)try{return JSON.parse(e)}catch(e){return}}async function L(e,t,r,n){let o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0;if(await e.sendToolInput({arguments:function(e){let t=O(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}(t)}),void 0!==n)return void await e.sendToolCancelled({reason:n});let i=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(void 0===e)return!0===t?{content:[],isError:!0}:null;let r=O(e);return r&&"object"==typeof r&&Array.isArray(r.content)?{...r,...!0===t?{isError:!0}:{}}:{content:[{type:"text",text:e}],...!0===t?{isError:!0}:{}}}(r,o);i&&await e.sendToolResult(i)}function _(e,t,r){return t.includes(e)&&r.includes(e)}function I(e,t){let r=e.getBoundingClientRect(),n=Math.max(1,Math.round(r.width||e.clientWidth||1));return t?{width:n,height:Math.max(1,Math.round(r.height||e.clientHeight||1))}:{width:n,maxHeight:6e3}}async function U(e,t,r){try{let n=await b.S.listServerTools(e),o=Array.isArray(n.tools)?n.tools:[],i=r?o.find(e=>(null==e?void 0:e.name)===r):o.find(e=>(0,x.Gt)(null==e?void 0:e._meta)===t);if((null==i?void 0:i.name)&&(null==i?void 0:i.inputSchema)&&(0,x.Gt)(i._meta)===t)return{tool:i}}catch(e){E.debug("Could not resolve the full MCP App tool definition",e)}}let F=e=>{let{serverName:t,uri:r,toolName:R,toolArgs:O,toolResultContent:F,toolUpdateId:z,toolCancelledReason:N,toolIsError:H,onAppMessage:D,onUpdateModelContext:J,onRequestDock:V,onDockable:G,onAvailableDisplayModes:B,hostDisplayMode:K,onRequestDisplayMode:W,onRequestClose:q,onRegisterTeardown:Z,teardownRegistrationKey:$,docked:X=!1,visible:Y=!0}=e,Q=(0,i.A)(),[ee,et]=(0,o.useState)(!1),[er,en]=(0,o.useState)(!1),[eo,ei]=(0,o.useState)(null),[ea,es]=(0,o.useState)(X?"pip":"inline"),[el,ec]=(0,o.useState)([]),eu=null!=K?K:ea,ed=(0,o.useMemo)(()=>X?["pip","fullscreen"]:["inline","fullscreen",...V?["pip"]:[]],[X,V]),ep=(0,o.useRef)(null),ef=(0,o.useRef)(null),eh=(0,o.useRef)(null),ey=(0,o.useRef)(!1),em=(0,o.useRef)(0),eg=(0,o.useRef)(!1),ev=(0,o.useRef)(null),ew=(0,o.useRef)(null),eb=(0,o.useRef)(!1),ex=(0,o.useRef)(!0),eE=(0,o.useRef)([]),eC=(0,o.useRef)(eu),eS=(0,o.useRef)(ed),ek=(0,o.useRef)(Promise.resolve()),ej=(0,o.useRef)(void 0),eA=(0,o.useRef)({args:O,resultContent:F,cancelledReason:N,isError:H,updateId:z});eA.current={args:O,resultContent:F,cancelledReason:N,isError:H,updateId:z};let eT=(0,o.useRef)(D);(0,o.useEffect)(()=>{eT.current=D},[D]);let eR=(0,o.useRef)(J);(0,o.useEffect)(()=>{eR.current=J},[J]);let eP=(0,o.useRef)(V);(0,o.useEffect)(()=>{eP.current=V},[V]);let eM=(0,o.useRef)(G);(0,o.useEffect)(()=>{eM.current=G},[G]);let eO=(0,o.useRef)(B);(0,o.useEffect)(()=>{eO.current=B},[B]);let eL=(0,o.useRef)(W);(0,o.useEffect)(()=>{eL.current=W},[W]);let e_=(0,o.useRef)(q);(0,o.useEffect)(()=>{e_.current=q},[q]);let eI=(0,o.useRef)(X);(0,o.useEffect)(()=>{eI.current=X},[X]),(0,o.useEffect)(()=>{eC.current=eu},[eu]),(0,o.useEffect)(()=>{eS.current=ed},[ed]);let eU=(0,o.useCallback)(()=>{var e;if(ew.current)return ew.current;em.current+=1;let t=eh.current,r=ef.current,n=eg.current;eh.current=null,ef.current=null,eg.current=!1,ey.current=!1,eE.current=[],null==(e=ev.current)||e.disconnect(),ev.current=null;let o=(async()=>{if(t&&n){let e;try{await Promise.race([t.teardownResource({},{timeout:1e3}),new Promise(t=>{e=setTimeout(t,1e3)})])}catch(e){E.debug("MCP App did not acknowledge resource teardown",e)}finally{e&&clearTimeout(e)}}try{await (null==t?void 0:t.close())}catch(e){}null==r||r.remove()})();return ew.current=o,o.finally(()=>{ew.current===o&&(ew.current=null)}),o},[]),eF=(0,o.useCallback)(()=>{!eb.current&&eP.current&&(eb.current=!0,eU().then(()=>{var e;ex.current&&(null==(e=eP.current)||e.call(eP),et(!1))}).finally(()=>{eb.current=!1}))},[eU]),ez=(0,o.useCallback)((e,t,r,n,o)=>{ek.current=ek.current.catch(()=>void 0).then(async()=>{eh.current===e&&eg.current&&await L(e,t,r,n,o)}).catch(e=>{E.warn("MCP App tool delivery failed",e)})},[]),eN=(0,o.useCallback)(async()=>{if(ew.current&&await ew.current,ey.current||!ep.current)return;let e=em.current+1;em.current=e;let n=()=>em.current===e&&ey.current;ey.current=!0,ec([]),en(!0),ei(null);try{var o,i,a;let s,[l,c]=await Promise.all([b.S.readResourceFromApp(t,r),U(t,r,R)]);if(!n())return;if((null==l?void 0:l.httpStatus)===403)throw Error((null==l?void 0:l.error)||"MCP Apps access was disabled for this server");if(!l||!1===l.success)throw Error((null==l?void 0:l.error)||"Failed to read the UI resource.");let u=function(e,t){var r,n,o;let i,a=null==e?void 0:e.contents;if(!Array.isArray(a)||0===a.length)throw Error("Resource has no contents");let s=a.find(e=>e.uri===t&&"string"==typeof e.mimeType&&(0,x.q$)(e.mimeType)&&("string"==typeof e.text||"string"==typeof e.blob));if(!s)throw Error("Resource ".concat(t," did not return MCP App HTML"));try{i="string"==typeof s.text?s.text:function(e){let t=Uint8Array.from(atob(e),e=>e.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(t)}(s.blob)}catch(e){throw Error("Resource ".concat(t," contains invalid base64 UTF-8 HTML"))}if(new TextEncoder().encode(i).length>x.Pt)throw Error("Resource exceeds the ".concat(Math.round(x.Pt/1024)," KiB size cap"));let l=null==(r=null!=(n=s._meta)?n:s.meta)?void 0:r.ui,c=w.c0.safeParse(null==l?void 0:l.csp);if((null==l?void 0:l.csp)!==void 0&&!c.success)throw Error("Resource ".concat(t," declares an invalid CSP policy"));let u=w.Ml.safeParse(null==l?void 0:l.permissions);if((null==l?void 0:l.permissions)!==void 0&&!u.success)throw Error("Resource ".concat(t," declares invalid sandbox permissions"));return{html:i,csp:c.success?{connectDomains:M((o=c.data).connectDomains,["https","wss"]),resourceDomains:M(o.resourceDomains,["https"]),frameDomains:M(o.frameDomains,["https"]),baseUriDomains:M(o.baseUriDomains,["https"])}:void 0,permissions:u.success&&u.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(l.data,r),d=await P();if(!n()||!ep.current)return;let p=document.createElement("iframe");p.title="MCP App: ".concat(r),p.setAttribute("sandbox","allow-scripts allow-same-origin"),p.referrerPolicy="origin";let f=(0,w.Sy)(u.permissions);f&&p.setAttribute("allow",f),p.style.cssText=eI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",ep.current.appendChild(p),ef.current=p;let h=new URL(d);u.csp&&h.searchParams.set("csp",JSON.stringify(u.csp));let y=h.origin,m=new Promise((e,t)=>{let r=setTimeout(()=>{window.removeEventListener("message",n),t(Error("Timed out waiting for the sandbox proxy."))},1e4),n=t=>{var o,i;t.source===p.contentWindow&&t.origin===y&&(null==(o=t.data)?void 0:o.jsonrpc)==="2.0"&&(null==(i=t.data)?void 0:i.method)==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(r),window.removeEventListener("message",n),e())};window.addEventListener("message",n)});if(p.src=h.href,await m,!n()||ef.current!==p)return;let g=eC.current,v="inline";eC.current=v,s=new w.T1(function(e,t){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(r,n,o)=>{let{method:i,params:a}=r;if("tools/call"===i){var s;E.info("MCP App tools/call: ".concat(e,"/").concat(null==a?void 0:a.name));let r=await b.S.callToolFromApp(e,a.name,null!=(s=a.arguments)?s:{},void 0,null==o?void 0:o.signal);if((null==r?void 0:r.httpStatus)===403){let e=(null==r?void 0:r.error)||"MCP Apps access was disabled for this server";throw t(e),Error(e)}if(!r||!1===r.success)throw Error((null==r?void 0:r.error)||"Tool call failed: ".concat(null==a?void 0:a.name));return r.data}if("resources/read"===i){let r=await b.S.readResourceFromApp(e,a.uri);if((null==r?void 0:r.httpStatus)===403){let e=(null==r?void 0:r.error)||"MCP Apps access was disabled for this server";throw t(e),Error(e)}if(!r||!1===r.success)throw Error((null==r?void 0:r.error)||"Resource read failed: ".concat(null==a?void 0:a.uri));return r.data}if("resources/list"===i)return{resources:[]};if("resources/templates/list"===i)return{resourceTemplates:[]};throw Error("MCP App requested unsupported method: ".concat(i))}}}(t,t=>{em.current===e&&eh.current===s&&(ei(t),en(!1),eU())}),C,{openLinks:{},serverTools:{},serverResources:{},logging:{},...eT.current?{message:{text:{}}}:{},...eR.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:u.csp,permissions:u.permissions}},{hostContext:{...c?{toolInfo:c}:{},theme:"dark"===Q.palette.mode?"dark":"light",platform:"web",displayMode:v,availableDisplayModes:eS.current,containerDimensions:I(ep.current,eI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:null!=(a=null==(o=(i=window).matchMedia)?void 0:o.call(i,"(hover: hover)").matches)&&a}}}),eh.current=s;let O=()=>n()&&eh.current===s;if(s.onopenlink=async e=>{let{url:n}=e;if(!O())return{isError:!0};let o=function(e){try{let t=new URL(e);if(!S.has(t.protocol)||t.username||t.password)return null;return t.href}catch(e){return null}}(n);if(!o)return E.warn("MCP App open-link rejected by URL policy",{serverName:t,uri:r}),{isError:!0};let i=window.open(o,"_blank","noopener,noreferrer");return i?(i.opener=null,{}):{isError:!0}},s.ondownloadfile=async e=>{let{contents:t}=e;if(!O())return{isError:!0};try{for(let e of null!=t?t:[]){let t,n=null==e?void 0:e.resource;if(!n)continue;let o=("string"==typeof n.uri?n.uri.split("/").pop():"")||"download",i="string"==typeof n.mimeType?n.mimeType:"application/octet-stream";if("string"==typeof n.blob){let e=Uint8Array.from(atob(n.blob),e=>e.charCodeAt(0));t=new Blob([e],{type:i})}else{var r;t=new Blob([String(null!=(r=n.text)?r:"")],{type:i})}let a=URL.createObjectURL(t),s=document.createElement("a");s.href=a,s.download=o,document.body.appendChild(s),s.click(),s.remove(),setTimeout(()=>URL.revokeObjectURL(a),4e3)}return{}}catch(e){return E.warn("MCP App download failed",e),{isError:!0}}},s.onloggingmessage=e=>{O()&&E.debug("MCP App log",null==e?void 0:e.data)},s.onmessage=async e=>{if(!O())return{};if(!eT.current)throw Error("This host cannot deliver ui/message in this surface");let t=function(e){if((null==e?void 0:e.role)!=="user")throw Error('This host accepts ui/message only with role "user"');let t=null==e?void 0:e.content,r=Array.isArray(t)?t:t&&"object"==typeof t?[t]:[];if(0===r.length||r.some(e=>(null==e?void 0:e.type)!=="text"||"string"!=typeof e.text))throw Error("This host accepts text-only ui/message content");let n=r.map(e=>e.text).join("\n").trim();if(!n)throw Error("ui/message text must not be empty");return n}(e);if(!await eT.current(t))throw Error("ui/message was not delivered");return{}},s.onupdatemodelcontext=async e=>{if(!O())return{};let n=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return"ui/update-model-context params must be an object";if(void 0!==e.content){if(!Array.isArray(e.content))return"Model context content must be an array";for(let t of e.content)if(!t||"object"!=typeof t||Array.isArray(t)||!j.has(t.type))return"Model context contains a modality this host did not advertise"}return void 0!==e.structuredContent&&(!e.structuredContent||"object"!=typeof e.structuredContent||Array.isArray(e.structuredContent))?"Model structuredContent must be an object":T(e)>A?"Model context exceeds ".concat(A," bytes"):null}(e);if(n)throw Error(n);let o="".concat(t,"::").concat(r);if(!eR.current)throw Error("This host cannot preserve model context in this surface");if(!await eR.current(o,e))throw Error("MCP App model context was not stored");return{}},s.onsizechange=async e=>{var t,r;let{width:n,height:o}=e;if(!O()||eI.current)return;let i=(null==(t=ep.current)?void 0:t.getBoundingClientRect().width)||(null==(r=ep.current)?void 0:r.clientWidth)||0,a=function(e,t){let r={};if(Number.isFinite(e.width)&&e.width>0){let n=Number.isFinite(t)&&t>0?t:6e3;r.width=Math.min(e.width,n,6e3)}return Number.isFinite(e.height)&&e.height>0&&(r.height=Math.min(e.height,6e3)),r}({width:n,height:o},i);void 0!==a.height&&(p.style.height="".concat(a.height,"px")),void 0!==a.width&&(p.style.width="".concat(a.width,"px"),p.style.maxWidth="100%")},s.onrequestdisplaymode=async e=>{let{mode:t}=e;if(!O())return{mode:eC.current};let r=eC.current,n=eE.current;if(!_(t,eS.current,n))return{mode:r};if("pip"===t&&!eI.current&&eP.current)return setTimeout(eF,0),{mode:r};let o=r;return(o=eL.current?await eL.current(t,[...n]):t)===r||_(o,eS.current,n)||(o=r),o!==r&&(eC.current=o,es(o),await s.sendHostContextChange({displayMode:o})),{mode:o}},s.onrequestteardown=()=>{O()&&eU().finally(()=>{e_.current?e_.current():(eC.current="inline",es("inline"),et(!1))})},s.oninitialized=()=>{var e,t,r,n,o,i,a,l,c;if(!O())return;let u=null==(e=s.getAppCapabilities())?void 0:e.availableDisplayModes,d=Array.isArray(u)?[...new Set(u.filter(e=>k.includes(e)))]:[];eE.current=d,ec(d),null==(t=eM.current)||t.call(eM,d.includes("pip")),null==(r=eO.current)||r.call(eO,[...d]),eg.current=!0;let p=function(e,t,r,n){return t?_("pip",r,n)?"fullscreen"===e&&_("fullscreen",r,n)?"fullscreen":"pip":null:"fullscreen"===e&&_("fullscreen",r,n)?"fullscreen":"inline"}(g,eI.current,eS.current,d);if(null===p){ei("This app does not declare support for the canvas (pip) display mode."),en(!1),eU();return}eC.current=p,es(p),p!==v&&s.sendHostContextChange({displayMode:p});let f=ep.current;if(f&&"undefined"!=typeof ResizeObserver){let e=()=>{if(!O()||!eg.current)return;let e=f.getBoundingClientRect();e.width<=0||eI.current&&e.height<=0||s.sendHostContextChange({containerDimensions:I(f,eI.current)})};null==(n=ev.current)||n.disconnect(),ev.current=new ResizeObserver(e),ev.current.observe(f),e()}let h=eA.current;ej.current=null!=(c=h.updateId)?c:"".concat(null!=(o=h.args)?o:"","\0").concat(null!=(i=h.resultContent)?i:"","\0").concat(null!=(a=h.cancelledReason)?a:"","\0").concat(null!=(l=h.isError)?l:""),(void 0!==h.args||void 0!==h.resultContent||void 0!==h.cancelledReason||!0===h.isError)&&ez(s,h.args,h.resultContent,h.cancelledReason,h.isError),en(!1)},await s.connect(function(e,t){let r=new w.hJ(e,t),n={start:async()=>{r.onmessage=(e,t)=>{var r;null==(r=n.onmessage)||r.call(n,"ui/message"!==e.method||!e.params||Array.isArray(e.params.content)||!e.params.content||"object"!=typeof e.params.content?e:{...e,params:{...e.params,content:[e.params.content]}},t)},r.onerror=e=>{var t;return null==(t=n.onerror)?void 0:t.call(n,e)},r.onclose=()=>{var e;return null==(e=n.onclose)?void 0:e.call(n)},await r.start()},send:(e,t)=>r.send(e,t),close:()=>r.close(),setProtocolVersion:e=>{var t;return null==(t=r.setProtocolVersion)?void 0:t.call(r,e)}};return n}(p.contentWindow,p.contentWindow)),!O())return;await s.sendSandboxResourceReady({html:u.html,csp:u.csp,permissions:u.permissions})}catch(e){if(!n())return;E.warn("Failed to mount MCP App ".concat(r," from ").concat(t),e),ei(e instanceof Error?e.message:"Failed to load the app."),en(!1),eU()}},[eF,ez,t,eU,Q.palette.mode,R,r]),eH=(0,o.useCallback)(()=>{let e=!ee;if(!e&&"fullscreen"===eC.current){var t;eC.current="inline",es("inline"),null==(t=eh.current)||t.sendHostContextChange({displayMode:"inline"})}et(e),e&&setTimeout(()=>{eN()},0)},[ee,eN]);if((0,o.useEffect)(()=>{X&&!ey.current&&eN()},[X,eN]),(0,o.useEffect)(()=>{let e=null!=z?z:"".concat(null!=O?O:"","\0").concat(null!=F?F:"","\0").concat(null!=N?N:"","\0").concat(null!=H?H:"");eg.current&&eh.current&&e!==ej.current&&(ej.current=e,eU().then(()=>{ex.current&&(eI.current||ee)&&eN()}))},[ee,eN,eU,O,N,H,F,z]),(0,o.useEffect)(()=>{K&&eg.current&&eh.current&&eC.current!==K&&_(K,eS.current,eE.current)&&(eC.current=K,es(K),eh.current.sendHostContextChange({displayMode:K}))},[K]),(0,o.useEffect)(()=>{var e;eg.current&&eh.current&&(null==(e=eh.current)||e.sendHostContextChange({theme:"dark"===Q.palette.mode?"dark":"light"}))},[Q.palette.mode]),(0,o.useEffect)(()=>{let e=null!=$?$:"".concat(t,"::").concat(r);return null==Z||Z(e,eU),()=>null==Z?void 0:Z(e,null)},[Z,t,eU,$,r]),(0,o.useEffect)(()=>{let e=e=>{var r,n;let o=e.detail;(null==o?void 0:o.serverName)===t&&((null==(r=o.config)?void 0:r.enableMcpApps)===!1||(null==(n=o.config)?void 0:n.disabled)===!0)&&(ei("MCP Apps access was disabled for this server."),en(!1),eU().finally(()=>{var e;eI.current&&(null==(e=e_.current)||e.call(e_))}))};return window.addEventListener("flujo:mcp-server-config-changed",e),()=>{window.removeEventListener("flujo:mcp-server-config-changed",e)}},[t,eU]),(0,o.useEffect)(()=>(ex.current=!0,()=>{ex.current=!1,eU()}),[eU]),X)return(0,n.jsxs)(a.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Y?"visible":"hidden",pointerEvents:Y?"auto":"none",flexDirection:"column"},children:[er&&(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(s.default,{size:16,thickness:6}),(0,n.jsx)(l.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),eo&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eo}),(0,n.jsx)(a.default,{ref:ep,sx:{flex:1,minHeight:0,width:"100%",display:eo?"none":"block"}})]});let eD=el.includes("inline")&&el.includes("fullscreen")&&ed.includes("fullscreen"),eJ=el.includes("inline")&&el.includes("pip")&&ed.includes("pip")&&!!V;return(0,n.jsxs)(a.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===ea?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,n.jsx)(f.A,{fontSize:"small",color:"primary"}),(0,n.jsxs)(l.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",t]}),(0,n.jsx)(u.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,n.jsx)(h.A,{fontSize:"small",color:"action"})}),(0,n.jsx)(a.default,{sx:{flex:1}}),ee&&eJ&&(0,n.jsx)(d.A,{size:"small",onClick:eF,children:"Canvas"}),ee&&(0,n.jsx)(u.A,{title:eD?"fullscreen"===ea?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,n.jsx)("span",{children:(0,n.jsx)(d.A,{size:"small",disabled:!eD,onClick:()=>{var e;let t="fullscreen"===ea?"inline":"fullscreen";_(t,ed,el)&&(eC.current=t,es(t),null==(e=eh.current)||e.sendHostContextChange({displayMode:t}))},sx:{minWidth:0},children:"fullscreen"===ea?(0,n.jsx)(v.A,{fontSize:"small"}):(0,n.jsx)(g.A,{fontSize:"small"})})})}),(0,n.jsx)(d.A,{size:"small",onClick:eH,startIcon:ee?(0,n.jsx)(m.A,{}):(0,n.jsx)(y.A,{}),children:ee?"Hide":"Open app"})]}),(0,n.jsx)(p.A,{in:ee,onExited:()=>{eU()},children:(0,n.jsxs)(a.default,{sx:{p:1,height:"fullscreen"===ea?"calc(100vh - 100px)":"auto"},children:[er&&(0,n.jsxs)(a.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(s.default,{size:16,thickness:6}),(0,n.jsx)(l.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),eo&&(0,n.jsx)(c.A,{severity:"error",sx:{my:1},children:eo}),(0,n.jsx)(a.default,{ref:ep,sx:{width:"100%",height:"fullscreen"===ea?"100%":"auto",display:eo?"none":"block"}})]})})]})}},31373:(e,t,r)=>{r.d(t,{UJ:()=>n,ZB:()=>o,bx:()=>a});let n="flujo:encryption-locked",o="flujo:encryption-unlocked",i=!1;function a(){if(i||"function"!=typeof window.fetch)return;i=!0;let e=window.fetch.bind(window);window.fetch=async function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];let i=await e(...r);return 423===i.status&&function(){try{sessionStorage.removeItem("encryption_authenticated"),sessionStorage.removeItem("encryption_token")}catch(e){}window.dispatchEvent(new CustomEvent(n))}(),i}}},41080:(e,t,r)=>{r.d(t,{Gt:()=>s,Pt:()=>o,q$:()=>a}),r(81029).hp;let n="ui://",o=2097152;function i(e){return"string"==typeof e&&e.length>n.length&&e.slice(0,n.length).toLowerCase()===n&&!/\s/.test(e)}function a(e){if("string"!=typeof e)return!1;let[t,...r]=e.toLowerCase().split(";");if("text/html"!==t.trim())return!1;let n=!1;for(let e of r){let t=e.indexOf("=");if(t<=0)return!1;let r=e.slice(0,t).trim(),o=e.slice(t+1).trim();if(!r||!o)return!1;if("profile"===r){if(n||"mcp-app"!==o)return!1;n=!0}}return n}function s(e){if(!e||"object"!=typeof e)return;let t=e["ui/resourceUri"];if(i(t))return t;for(let t of[e.ui,e["io.modelcontextprotocol/ui"]])if(t&&"object"==typeof t){let e=t.resourceUri;if(i(e))return e}}}}]);
|