flujo-ai 3.48.6 → 3.48.7
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-path-routes-manifest.json +60 -60
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- 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/route.js +1 -1
- package/.next/server/app/api/approvals/route.js.nft.json +1 -1
- package/.next/server/app/api/automation-map/route.js +1 -1
- package/.next/server/app/api/automation-map/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/[voiceAction]/route.js +1 -1
- package/.next/server/app/api/avatar/[voiceAction]/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/connections/route.js +1 -1
- package/.next/server/app/api/avatar/connections/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/local-speech/route.js +1 -1
- package/.next/server/app/api/avatar/local-speech/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/remote/[voiceAction]/route.js +1 -1
- package/.next/server/app/api/avatar/remote/[voiceAction]/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/remote/availability/route.js +1 -1
- package/.next/server/app/api/avatar/remote/availability/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/voice/route.js +1 -1
- package/.next/server/app/api/avatar/voice/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/work-model/route.js +1 -1
- package/.next/server/app/api/avatar/work-model/route.js.nft.json +1 -1
- package/.next/server/app/api/avatar/world/route.js +1 -1
- package/.next/server/app/api/avatar/world/route.js.nft.json +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/browse/route.js +1 -1
- package/.next/server/app/api/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/bugs/enhance/route.js +1 -1
- package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
- package/.next/server/app/api/credential-migration/route.js +1 -1
- package/.next/server/app/api/credential-migration/route.js.nft.json +1 -1
- package/.next/server/app/api/credential-transfer/restore/route.js +1 -1
- package/.next/server/app/api/credential-transfer/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/credential-transfer/route.js +1 -1
- package/.next/server/app/api/credential-transfer/route.js.nft.json +1 -1
- package/.next/server/app/api/cwd/route.js +1 -1
- package/.next/server/app/api/cwd/route.js.nft.json +1 -1
- package/.next/server/app/api/encryption/secure/route.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
- package/.next/server/app/api/env/route.js +1 -1
- package/.next/server/app/api/env/route.js.nft.json +1 -1
- package/.next/server/app/api/factory-observatory/route.js +1 -1
- package/.next/server/app/api/factory-observatory/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/convert-process-to-subflow/route.js +1 -1
- package/.next/server/app/api/flow/[id]/convert-process-to-subflow/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/models/route.js +1 -1
- package/.next/server/app/api/flow/[id]/models/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/route.js +1 -1
- package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route.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/route.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/assist/route.js +1 -1
- package/.next/server/app/api/flow/assist/route.js.nft.json +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/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/visual/route.js +1 -1
- package/.next/server/app/api/flow/generate/visual/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generator/route.js +1 -1
- package/.next/server/app/api/flow/generator/route.js.nft.json +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/model-agent/route.js +1 -1
- package/.next/server/app/api/flow/model-agent/route.js.nft.json +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/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/repair/route.js +1 -1
- package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/route.js +1 -1
- package/.next/server/app/api/flow/route.js.nft.json +1 -1
- package/.next/server/app/api/git/route.js +1 -1
- package/.next/server/app/api/git/route.js.nft.json +1 -1
- package/.next/server/app/api/harness/[id]/route.js +1 -1
- package/.next/server/app/api/harness/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/harness/comparisons/[id]/route.js +1 -1
- package/.next/server/app/api/harness/comparisons/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/harness/comparisons/route.js +1 -1
- package/.next/server/app/api/harness/comparisons/route.js.nft.json +1 -1
- package/.next/server/app/api/harness/profiles/route.js +1 -1
- package/.next/server/app/api/harness/profiles/route.js.nft.json +1 -1
- package/.next/server/app/api/harness/route.js +1 -1
- package/.next/server/app/api/harness/route.js.nft.json +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/local-models/capability/route.js +1 -1
- package/.next/server/app/api/local-models/capability/route.js.nft.json +1 -1
- package/.next/server/app/api/local-models/pull/route.js +1 -1
- package/.next/server/app/api/local-models/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/local-models/suggest/route.js +1 -1
- package/.next/server/app/api/local-models/suggest/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/app-consent/route.js +1 -1
- package/.next/server/app/api/mcp/app-consent/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/app-sandbox/route.js +1 -1
- package/.next/server/app/api/mcp/app-sandbox/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/assistant/route.js +1 -1
- package/.next/server/app/api/mcp/assistant/route.js.nft.json +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/flujo/authoring/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/authoring/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/automation/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/automation/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/flows/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/flows/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/resources/read/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/resources/read/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/resources/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/resources/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/servers/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/servers/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/skills/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/state/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/state/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/flujo/tools/route.js +1 -1
- package/.next/server/app/api/mcp/flujo/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/model-risk-assessment/route.js +1 -1
- package/.next/server/app/api/mcp/model-risk-assessment/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth-capability/route.js +1 -1
- package/.next/server/app/api/mcp/oauth-capability/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/security-review/route.js +1 -1
- package/.next/server/app/api/mcp/security-review/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/host-consent/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/host-consent/route.js.nft.json +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/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]/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/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]/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]/skills/approve/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/approve/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/get/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/get/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/load/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/load/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/skills/route.js.nft.json +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]/stdio-oauth/confirm/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/confirm/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/start/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/stdio-oauth/start/route.js.nft.json +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]/stream/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/stream/route.js.nft.json +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/route.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js.nft.json +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/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-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/spotlight/route.js +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route.js.nft.json +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/allowance/route.js +1 -1
- package/.next/server/app/api/model/allowance/route.js.nft.json +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/route.js +1 -1
- package/.next/server/app/api/model/route.js.nft.json +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/network-exposure/route.js +1 -1
- package/.next/server/app/api/network-exposure/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/callback/route.js +1 -1
- package/.next/server/app/api/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/initiate/route.js +1 -1
- package/.next/server/app/api/oauth/initiate/route.js.nft.json +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/operations/status/route.js +1 -1
- package/.next/server/app/api/operations/status/route.js.nft.json +1 -1
- package/.next/server/app/api/original-owner/route.js +1 -1
- package/.next/server/app/api/original-owner/route.js.nft.json +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/derive-secrets/route.js +1 -1
- package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/route.js +1 -1
- package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/status/route.js +1 -1
- package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/installed/route.js +1 -1
- package/.next/server/app/api/packages/installed/route.js.nft.json +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/scan-targets/route.js +1 -1
- package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/search/route.js +1 -1
- package/.next/server/app/api/packages/search/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/uninstall/route.js +1 -1
- package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/persona-recovery/route.js +2 -2
- package/.next/server/app/api/persona-recovery/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/worker-recovery/route.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/worker-recovery/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/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/route.js +1 -1
- package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route.js +1 -1
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/reference-search/files/route.js +1 -1
- package/.next/server/app/api/reference-search/files/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/auth/resend/route.js +1 -1
- package/.next/server/app/api/registry/auth/resend/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/auth/reset/route.js +1 -1
- package/.next/server/app/api/registry/auth/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/auth/route.js +1 -1
- package/.next/server/app/api/registry/auth/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/feedback/route.js +1 -1
- package/.next/server/app/api/registry/feedback/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/oauth/callback/route.js +1 -1
- package/.next/server/app/api/registry/oauth/callback/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route.js +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/packages/route.js +1 -1
- package/.next/server/app/api/registry/packages/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/publish/route.js +1 -1
- package/.next/server/app/api/registry/publish/route.js.nft.json +1 -1
- package/.next/server/app/api/registry/settings/route.js +1 -1
- package/.next/server/app/api/registry/settings/route.js.nft.json +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/runs/active/route.js +1 -1
- package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
- package/.next/server/app/api/runtime-environment/route.js +1 -1
- package/.next/server/app/api/runtime-environment/route.js.nft.json +1 -1
- package/.next/server/app/api/setup/ai-cli/route.js +1 -1
- package/.next/server/app/api/setup/ai-cli/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/abort/route.js +1 -1
- package/.next/server/app/api/snapshot/abort/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/begin/route.js +1 -1
- package/.next/server/app/api/snapshot/begin/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/download/route.js +1 -1
- package/.next/server/app/api/snapshot/download/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/finalize/route.js +1 -1
- package/.next/server/app/api/snapshot/finalize/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/info/route.js +1 -1
- package/.next/server/app/api/snapshot/info/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshot/status/route.js +1 -1
- package/.next/server/app/api/snapshot/status/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshots/cleanup/route.js +1 -1
- package/.next/server/app/api/snapshots/cleanup/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshots/open-folder/route.js +1 -1
- package/.next/server/app/api/snapshots/open-folder/route.js.nft.json +1 -1
- package/.next/server/app/api/snapshots/route.js +1 -1
- package/.next/server/app/api/snapshots/route.js.nft.json +1 -1
- package/.next/server/app/api/statistics/route.js +1 -1
- package/.next/server/app/api/statistics/route.js.nft.json +1 -1
- package/.next/server/app/api/storage/route.js +1 -1
- package/.next/server/app/api/storage/route.js.nft.json +1 -1
- package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
- package/.next/server/app/api/telemetry/daily-active/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/[id]/route.js +1 -1
- package/.next/server/app/api/tickets/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/route.js +1 -1
- package/.next/server/app/api/tickets/route.js.nft.json +1 -1
- package/.next/server/app/api/transcription/route.js +1 -1
- package/.next/server/app/api/transcription/route.js.nft.json +1 -1
- package/.next/server/app/api/update/route.js +1 -1
- package/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/server/app/api/waves/route.js +1 -1
- package/.next/server/app/api/waves/route.js.nft.json +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/workspaces/route.js +1 -1
- package/.next/server/app/api/workspaces/route.js.nft.json +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/flows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp/page.js +1 -1
- 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-proxy/[server]/route.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
- package/.next/server/app/settings/page.js +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/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/conversation-chains/route.js +1 -1
- package/.next/server/app/v1/chat/conversation-chains/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.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]/cancel/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/attach/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/attach/route.js.nft.json +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/state/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/state/route.js.nft.json +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]/edit-state/route.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]/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]/inject/route.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]/model-turns/[dispatchId]/media/[mediaId]/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/media/[mediaId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/[dispatchId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/model-turns/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/recovery/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/recovery/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.js.nft.json +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]/revert/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/revert/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/wire-preview/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/wire-preview/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/events/route.js +1 -1
- package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/flows/[flowRef]/readiness/route.js +1 -1
- package/.next/server/app/v1/flows/[flowRef]/readiness/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/cancel/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/events/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/interventions/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/interventions/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/private-notes/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/private-notes/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/resume/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/resume/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/start/route.js +1 -1
- package/.next/server/app/v1/meetings/[meetingId]/start/route.js.nft.json +1 -1
- package/.next/server/app/v1/meetings/route.js +1 -1
- package/.next/server/app/v1/meetings/route.js.nft.json +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/persona-drafts/[draftId]/route.js +1 -1
- package/.next/server/app/v1/persona-drafts/[draftId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/persona-drafts/route.js +1 -1
- package/.next/server/app/v1/persona-drafts/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/launch/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/launch/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/[grantId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/app-grants/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/behaviors/[behaviorId]/activate/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/behaviors/[behaviorId]/activate/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/behaviors/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/behaviors/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/copy/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/copy/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/composition/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/core/reconcile/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/core/reconcile/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/deletion-preview/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/deletion-preview/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/execution-preview/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/execution-preview/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/export/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/export/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/export-preview/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/export-preview/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/goal-admissions/[admissionKey]/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/goal-admissions/[admissionKey]/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/apply/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/apply/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/promote/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/promote/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/reject/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/reject/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/undo/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/[proposalId]/undo/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/improvements/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/activate/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/activate/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/correct/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/correct/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/pin/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/pin/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/resolve-conflict/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/resolve-conflict/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/[memoryId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/memories/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/runtime-recovery/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/runtime-recovery/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/storage-stats/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/storage-stats/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/assign/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/assign/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/control/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/control/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/runtime/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/runtime/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/source/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/[workItemId]/source/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/promote-todo/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/promote-todo/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/route.js +1 -1
- package/.next/server/app/v1/personas/[personaId]/work-items/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/readiness/route.js +1 -1
- package/.next/server/app/v1/personas/readiness/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/route.js +1 -1
- package/.next/server/app/v1/personas/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/settings-options/route.js +1 -1
- package/.next/server/app/v1/personas/settings-options/route.js.nft.json +1 -1
- package/.next/server/app/v1/personas/summary/route.js +1 -1
- package/.next/server/app/v1/personas/summary/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/duplicate/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/duplicate/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/impact/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/impact/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/restore/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/restore/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/rollback/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/rollback/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/[roleId]/versions/route.js +1 -1
- package/.next/server/app/v1/roles/[roleId]/versions/route.js.nft.json +1 -1
- package/.next/server/app/v1/roles/route.js +1 -1
- package/.next/server/app/v1/roles/route.js.nft.json +1 -1
- package/.next/server/app/v1/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/v1/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app-paths-manifest.json +60 -60
- package/.next/server/chunks/14645.js +1 -1
- package/.next/server/chunks/21392.js +3 -3
- package/.next/server/chunks/{83503.js → 25847.js} +3 -3
- package/.next/server/chunks/31519.js +3 -3
- package/.next/server/chunks/34679.js +1 -1
- package/.next/server/chunks/52152.js +3 -3
- package/.next/server/chunks/73633.js +1 -1
- package/.next/server/chunks/81306.js +1 -1
- package/.next/server/chunks/82300.js +3 -3
- package/.next/server/chunks/83718.js +1 -1
- package/.next/server/chunks/8464.js +1 -1
- package/.next/server/chunks/{78608.js → 87864.js} +3 -3
- package/.next/server/chunks/89031.js +1 -1
- package/.next/server/chunks/97235.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/preview-props.json +3 -3
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2103-5f61569b0629e957.js → 2103-be5e06316fbab625.js} +1 -1
- package/.next/static/chunks/app/chat/{page-569fe5a097bb2c06.js → page-314d31c432c2d88b.js} +1 -1
- package/.next/static/chunks/webpack-1449ea081feba501.js +1 -0
- package/.next/trace-build +1 -1
- package/README.md +1 -1
- package/mcp-servers/bash/package.json +1 -1
- package/mcp-servers/browser/package.json +1 -1
- package/mcp-servers/filesystem/package.json +1 -1
- package/mcp-servers/flujo/package.json +1 -1
- package/package.json +5 -5
- package/.next/static/chunks/webpack-d7e41a6b1b459ed1.js +0 -1
- /package/.next/static/{QzwOWTB7GKoP7AaFNpYr5 → dA-lF06zcBoG4LavbX9MD}/_buildManifest.js +0 -0
- /package/.next/static/{QzwOWTB7GKoP7AaFNpYr5 → dA-lF06zcBoG4LavbX9MD}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2103],{22103:(e,t,r)=>{r.d(t,{uJ:()=>U,Ay:()=>Z,Yw:()=>F});var n=r(95155),i=r(12115),o=r(28683),s=r(52673),l=r(4550),a=r(37911),c=r(99306),u=r(89009),d=r(9098),h=r(70668),p=r(32038),f=r(42108),m=r(39734),w=r(88078),g=r(73254),y=r(98598),x=r(32635),b=r(6255),v=r(6310),A=r(80967),C=r(97312);function E(e){return null===e||"object"!=typeof e||Array.isArray(e)?void 0:e}var R=r(16803);let j=e=>null===e||"object"!=typeof e||Array.isArray(e)?void 0:e;function S(e){return"string"==typeof e&&e.length>0&&e.length<=512&&e.trim()===e}var M=r(16007),k=r(49103),P=r(77586);let T=(0,k.h)("frontend/components/Chat/McpAppFrame"),$={name:"FLUJO",version:"3.48.6"},L=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],H=new Set(["text"]),U=262144,I=e=>null===e||"object"!=typeof e||Array.isArray(e)?void 0:e,D=e=>{let t=I(e);return t?.type==="text"&&"string"==typeof t.text};function F(e){try{return new TextEncoder().encode(JSON.stringify(e)).length}catch{return 1/0}}let N=new Map;function W(e,t,r,n){return JSON.stringify([e,t,r,n??null])}async function O(e,t,r){let n=(0,M.dJ)(),i=W(n,e,t,r);if(!N.has(i)){let o=new URLSearchParams;o.set("serverName",e),o.set("uri",t),r&&o.set("conversationId",r);let s=fetch((0,M.TA)(`/api/mcp/app-sandbox${o.toString()?`?${o}`:""}`,n)).then(async e=>{if(!e.ok){let t="";try{let r=await e.json();"string"==typeof r.error&&r.error.trim()&&(t=`: ${r.error.trim()}`)}catch{}throw Error(`Sandbox endpoint discovery failed (${e.status})${t}`)}return await e.json()}).catch(e=>{throw N.delete(i),e});N.set(i,s)}let o=await N.get(i);return{href:function(e,t){let r;if("boolean"!=typeof e.shared)throw Error("Sandbox endpoint discovery did not describe its origin mode");if(!function(e){if("string"!=typeof e)return!1;let t=e.trim();if(0===t.length||t.length>253||t!==e||t!==t.toLowerCase()||/[^\w.-]|[^\x00-\x7f]/i.test(t)||/^\d+(\.\d+)*$/.test(t)||t.includes(":")||/[/?#@]/.test(t))return!1;let r=t.split(".");return!(0===r.length||r.some(e=>0===e.length))&&r.every(e=>e.length<=63&&/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(e))}(e.originKey))throw Error("Sandbox endpoint discovery returned an invalid origin key");if("string"!=typeof e.token||0===e.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if("string"!=typeof e.url)throw Error("Sandbox endpoint discovery did not return an isolated app URL");try{r=new URL(e.url)}catch{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");if(e.shared){if(r.searchParams.get("originKey")!==e.originKey)throw Error("Shared sandbox URL is not bound to the verified app origin key")}else if(!r.hostname.split(".").includes(e.originKey))throw Error("Sandbox URL is not bound to the verified app origin key");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}(o,window.location),allowAll:!0===o.allowAll}}function B(e,t,r=!1,n=!1){let i=e=>{let r=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!r||!t.includes(r[1].toLowerCase()))return!1;let n=r[3].split(".");if(r[3].length>253||n.some(e=>0===e.length||e.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)))return!1;let i=r[4]?Number(r[4]):void 0;return void 0===i||Number.isInteger(i)&&i>=1&&i<=65535},o=[],s=new Set;for(let l of e??[]){if(0===l.length||l.length>2048||/[^\x21-\x7e]/.test(l))continue;if("*"===l){if(n)return["*"];continue}let e=r?(0,R._w)(l,t.includes("wss")?["http","ws"]:["http"]):void 0;if(!e&&!i(l))continue;let a=e??l,c=a.toLowerCase();if(!s.has(c)&&(s.add(c),o.push(a),o.length>=64))break}return o}function J(e=window.location){return!!e&&"http:"===e.protocol}function _(e,t=J(),r=!1){return{connectDomains:B(e.connectDomains,["https","wss"],t,r),resourceDomains:B(e.resourceDomains,["https"],t,r),frameDomains:B(e.frameDomains,["https"],t,r),baseUriDomains:B(e.baseUriDomains,["https"],t,r)}}function q(e){if(e)try{return JSON.parse(e)}catch{return}}async function K(e,t,r,n,i){let o;if(await e.sendToolInput({arguments:(o=q(t))&&"object"==typeof o&&!Array.isArray(o)?o:{}}),void 0!==n)return void await e.sendToolCancelled({reason:n});let s=function(e,t){if(void 0===e)return!0===t?{content:[],isError:!0}:null;let r=b.TFo.safeParse(q(e));return r.success?{...r.data,...!0===t?{isError:!0}:{}}:{content:[{type:"text",text:e}],...!0===t?{isError:!0}:{}}}(r,i);s&&await e.sendToolResult(s)}function Y(e,t,r){return t.includes(e)&&r.includes(e)}function X(e,t,r,n,i,o){let s=void 0===t?`${r??""}\0${n??""}\0${i??""}\0${o??""}`:`${typeof t}:${String(t)}`;return`${e??""}\0${s}`}function V(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 G(e,t,r){try{let n=await C.S.listServerTools(e),i=Array.isArray(n.tools)?n.tools:[],o=r?i.find(e=>e?.name===r):i.find(e=>(0,R.Gt)(e?._meta)===t);if(o?.name&&o?.inputSchema&&(0,R.Gt)(o._meta)===t)return{tool:o}}catch(e){T.debug("Could not resolve the full MCP App tool definition",e)}}let Z=({conversationId:e,ownerScopeId:t,serverName:r,uri:b,toolName:k,toolArgs:B,toolResultContent:q,toolOwnerScope:Z,toolUpdateId:Q,toolCancelledReason:ee,toolIsError:et,onAppMessage:er,onUpdateModelContext:en,onRequestDock:ei,onDockable:eo,onAvailableDisplayModes:es,hostDisplayMode:el,onRequestDisplayMode:ea,onRequestClose:ec,onRegisterTeardown:eu,teardownRegistrationKey:ed,docked:eh=!1,visible:ep=!0,defaultExpanded:ef=!1,autoDock:em=!1,linkedToolCallCount:ew=1,onUserOpen:eg})=>{let{t:ey}=(0,v.s9)(),{settings:ex,settingsHydrated:eb}=(0,A.useStorage)(),ev=!1!==eb,eA=ex?.experimental?.requireMcpAppLaunchClick===!0,eC=(0,o.A)(),eE=(0,i.useId)(),eR=(0,i.useMemo)(()=>{var n;let i;return(i=S((n={toolOwnerScope:Z,toolResultContent:q,conversationId:e,ownerScopeId:t,serverName:r,uri:b,frameInstanceId:eE}).toolOwnerScope)?n.toolOwnerScope:function(e){if(void 0!==e)try{let t="string"==typeof e?JSON.parse(e):e,r=j(j(t)?._meta),n=r?.["io.flujo/host-owner-scope"];return S(n)?n:void 0}catch{return}}(n.toolResultContent))||(n.conversationId?`conversation:${n.conversationId}`:n.ownerScopeId?.trim()?`app:${n.ownerScopeId.trim().slice(0,500)}`:`app:${n.serverName}:${n.uri}:${n.frameInstanceId}`)},[e,eE,t,r,Z,q,b]),[ej,eS]=(0,i.useState)(ef),[eM,ek]=(0,i.useState)(!1),[eP,eT]=(0,i.useState)(null),[e$,eL]=(0,i.useState)(ev&&!eA?"granted":"loading"),[ez,eH]=(0,i.useState)(!1),[eU,eI]=(0,i.useState)(null),eD=(0,i.useRef)(!1);eD.current=ev&&("internal"===e$||"granted"===e$)&&(eh||ej);let eF=(0,i.useRef)(null);(0,i.useEffect)(()=>{eF.current=eP},[eP]),(0,i.useEffect)(()=>{if(!ev)return void eL("loading");if(!eA){eL("granted"),eI(null);return}let t=!0;eL("loading");let n=new URLSearchParams({serverName:r,uri:b});return e&&n.set("conversationId",e),fetch(`/api/mcp/app-consent?${n}`).then(async e=>e.ok?e.json():Promise.reject(Error("Consent lookup failed"))).then(e=>{t&&["internal","granted","prompt","denied"].includes(e.status??"")&&eL(e.status)}).catch(()=>{t&&eL("denied")}),()=>{t=!1}},[ev,eA,e,r,b]);let eN=(0,i.useCallback)(async t=>{eH(!0),eI(null);try{let n=await fetch("/api/mcp/app-consent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:r,uri:b,conversationId:e,decision:t})});if(!n.ok)throw Error("Unable to save MCP App consent");let i=await n.json();eL("granted"===i.status?"granted":"denied")}catch{eI(ey("chat.app.consentSaveFailed"))}finally{eH(!1)}},[e,r,ey,b]),eW=(0,i.useCallback)(async()=>{eH(!0),eI(null);try{let e=new URLSearchParams({serverName:r,uri:b});if(!(await fetch(`/api/mcp/app-consent?${e}`,{method:"DELETE"})).ok)throw Error("Unable to reset MCP App consent");eL("prompt")}catch{eI(ey("chat.app.consentSaveFailed"))}finally{eH(!1)}},[r,ey,b]),[eO,eB]=(0,i.useState)(eh?"pip":"inline"),[eJ,e_]=(0,i.useState)(null),[eq,eK]=(0,i.useState)([]),[eY,eX]=(0,i.useState)(!1),eV=(0,i.useRef)(ef),{activeCursor:eG,startPointerDrag:eZ}=(0,P.LI)(),eQ=el??eO,e0=(0,i.useMemo)(()=>eh?["pip","fullscreen"]:["inline","fullscreen",...ei?["pip"]:[]],[eh,ei]),e1=(0,i.useRef)(null),e3=(0,i.useRef)(null),e2=(0,i.useRef)(null),e4=(0,i.useRef)(200),e6=(0,i.useRef)(null),e8=(0,i.useRef)(!1),e5=(0,i.useRef)(0),e9=(0,i.useRef)(!1),e7=(0,i.useRef)(null),te=(0,i.useRef)(null),tt=(0,i.useRef)(!1),tr=(0,i.useRef)(!0),tn=(0,i.useRef)([]),ti=(0,i.useRef)(eQ),to=(0,i.useRef)(e0),ts=(0,i.useRef)(k),tl=(0,i.useRef)(k),ta=(0,i.useRef)(eR),tc=(0,i.useRef)(eR);ta.current=eR;let tu=(0,i.useRef)(Promise.resolve()),td=(0,i.useRef)(void 0),th=(0,i.useRef)({toolName:k,args:B,resultContent:q,cancelledReason:ee,isError:et,updateId:Q});(0,i.useEffect)(()=>{eh||"fullscreen"!==eQ||e_(e=>{if(e)return e;let t=Math.min(Math.max(520,Math.round(.86*window.innerWidth)),window.innerWidth-24),r=Math.min(Math.max(360,Math.round(.84*window.innerHeight)),window.innerHeight-24);return{x:Math.round((window.innerWidth-t)/2),y:Math.round((window.innerHeight-r)/2),width:t,height:r}})},[eh,eQ]),(0,i.useEffect)(()=>{if(eh||"fullscreen"!==eQ)return;let e=()=>{let e={width:Math.min(480,window.innerWidth),height:Math.min(320,window.innerHeight)};e_(t=>t?(0,P.eH)(t,{width:window.innerWidth,height:window.innerHeight},e):t)};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[eh,eQ]);let tp=(0,i.useCallback)(e=>{if("fullscreen"!==eQ||!e3.current||e.target.closest('button,[role="button"]'))return;e.preventDefault();let t=e3.current.getBoundingClientRect(),r=e.clientX,n=e.clientY;eZ(e,"move",e=>{e_({...(0,P.RA)({x:t.left+e.clientX-r,y:t.top+e.clientY-n},{width:t.width,height:t.height},{width:window.innerWidth,height:window.innerHeight}),width:t.width,height:t.height})})},[eQ,eZ]),tf=(0,i.useCallback)((e,t,r)=>{if("fullscreen"!==eQ||!e3.current)return;let n=e3.current.getBoundingClientRect(),i={x:n.left,y:n.top,width:n.width,height:n.height},o=e.clientX,s=e.clientY;eZ(e,r,e=>{e_((0,P.hU)(i,t,e.clientX-o,e.clientY-s,{width:window.innerWidth,height:window.innerHeight},{width:Math.min(480,window.innerWidth),height:Math.min(320,window.innerHeight)}))})},[eQ,eZ]),tm=(0,P.ri)(e3,"fullscreen"===eO&&!eh);th.current={toolName:k,args:B,resultContent:q,cancelledReason:ee,isError:et,updateId:Q},ts.current=k;let tw=(0,i.useRef)(er);(0,i.useEffect)(()=>{tw.current=er},[er]);let tg=(0,i.useRef)(en);(0,i.useEffect)(()=>{tg.current=en},[en]);let ty=(0,i.useRef)(ei);(0,i.useEffect)(()=>{ty.current=ei},[ei]);let tx=(0,i.useRef)(em);(0,i.useEffect)(()=>{em&&(tx.current=!0)},[em]);let tb=(0,i.useRef)(eo);(0,i.useEffect)(()=>{tb.current=eo},[eo]);let tv=(0,i.useRef)(es);(0,i.useEffect)(()=>{tv.current=es},[es]);let tA=(0,i.useRef)(ea);(0,i.useEffect)(()=>{tA.current=ea},[ea]);let tC=(0,i.useRef)(ec);(0,i.useEffect)(()=>{tC.current=ec},[ec]);let tE=(0,i.useRef)(eh);(0,i.useEffect)(()=>{tE.current=eh},[eh]),(0,i.useEffect)(()=>{ti.current=eQ},[eQ]),(0,i.useEffect)(()=>{to.current=e0},[e0]);let tR=(0,i.useCallback)(()=>{if(te.current)return te.current;e5.current+=1;let e=e6.current,t=e2.current,r=e9.current;e6.current=null,e2.current=null,e9.current=!1,e8.current=!1,tn.current=[],e7.current?.disconnect(),e7.current=null;let n=(async()=>{if(e&&r){let t;try{await Promise.race([e.teardownResource({},{timeout:1e3}),new Promise(e=>{t=setTimeout(e,1e3)})])}catch(e){T.debug("MCP App did not acknowledge resource teardown",e)}finally{t&&clearTimeout(t)}}try{await e?.close()}catch{}t?.remove()})();return te.current=n,n.finally(()=>{te.current===n&&(te.current=null)}),n},[]),tj=(0,i.useCallback)(()=>{tt.current||!ty.current||eF.current||(tt.current=!0,tR().then(()=>{tr.current&&(ty.current?.(),eS(!1))}).finally(()=>{tt.current=!1}))},[tR]),tS=(0,i.useCallback)((e,t,r,n,i)=>{tu.current=tu.current.catch(()=>void 0).then(async()=>{e6.current===e&&e9.current&&await K(e,t,r,n,i)}).catch(e=>{T.warn("MCP App tool delivery failed",e)})},[]),tM=(0,i.useCallback)(async()=>{if(te.current&&await te.current,e8.current||!e1.current)return;let t=e5.current+1;e5.current=t;let n=()=>e5.current===t&&e8.current;e8.current=!0,eK([]),ek(!0),eT(null);try{var i,o,s,l,a,c;let u,d,[h,p]=await Promise.all([C.S.readResourceFromApp(r,b),G(r,b,ts.current)]);if(!n())return;if(h?.httpStatus===403)throw Error(h?.error||ey("chat.app.accessDisabled"));if(!h||!1===h.success)throw Error(h?.error||ey("chat.app.readFailed"));let f=function(e,t){let r,n=e?.contents;if(!Array.isArray(n)||0===n.length)throw Error("Resource has no contents");let i=n.find(e=>e.uri===t&&"string"==typeof e.mimeType&&(0,R.q$)(e.mimeType)&&("string"==typeof e.text||"string"==typeof e.blob));if(!i)throw Error(`Resource ${t} did not return MCP App HTML`);try{if("string"==typeof i.text)r=i.text;else if("string"==typeof i.blob){var o;let e;o=i.blob,e=Uint8Array.from(atob(o),e=>e.charCodeAt(0)),r=new TextDecoder("utf-8",{fatal:!0}).decode(e)}else throw Error("Missing app resource body")}catch{throw Error(`Resource ${t} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(r).length>R.Pt)throw Error(`Resource exceeds the ${Math.round(R.Pt/1024)} KiB size cap`);let s=I(i._meta??i.meta),l=I(s?.ui),a=x.c0.safeParse(l?.csp);if(l?.csp!==void 0&&!a.success)throw Error(`Resource ${t} declares an invalid CSP policy`);let c=x.Ml.safeParse(l?.permissions);if(l?.permissions!==void 0&&!c.success)throw Error(`Resource ${t} declares invalid sandbox permissions`);return{html:r,csp:a.success?_(a.data):void 0,rawCsp:a.success?a.data:void 0,permissions:c.success&&c.data.clipboardWrite?{clipboardWrite:{}}:void 0,prefersBorder:"boolean"==typeof l?.prefersBorder?l.prefersBorder:void 0}}(h.data,b);eX(!1===f.prefersBorder);let m=await O(r,b,e);if(!n()||!e1.current)return;m.allowAll&&f.rawCsp&&(f.csp=_(f.rawCsp,J(),!0));let w=document.createElement("iframe");w.title=ey("chat.app.frameTitle",{uri:b}),w.setAttribute("sandbox","allow-scripts allow-same-origin"),w.referrerPolicy="origin";let g=(0,x.Sy)(f.permissions);g&&w.setAttribute("allow",g);let y=!1===f.prefersBorder?"transparent":"#fff";w.style.cssText=tE.current||"fullscreen"===ti.current?`width:100%;height:100%;border:none;background:${y};`:`width:100%;min-height:120px;height:200px;border:none;background:${y};`+(!1===f.prefersBorder?"":"border-radius:4px;"),e1.current.appendChild(w),e2.current=w;let v=new URL(m.href);f.csp&&v.searchParams.set("csp",JSON.stringify(f.csp));let A=v.origin,j=new Promise((e,t)=>{let r=setTimeout(()=>{window.removeEventListener("message",n),t(Error(ey("chat.app.proxyTimeout")))},1e4),n=t=>{t.source===w.contentWindow&&t.origin===A&&t.data?.jsonrpc==="2.0"&&t.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(r),window.removeEventListener("message",n),e())};window.addEventListener("message",n)});if(w.src=v.href,await j,!n()||e2.current!==w)return;let S=ti.current,M="inline";ti.current=M;let k=new x.T1((i=ta.current,o=e=>{e5.current===t&&e6.current===k&&(eT(e),ek(!1),tR().finally(()=>{tE.current&&tC.current?.()}))},s=C.S,l=e=>T.info(`MCP App tools/call: ${r}/${e}`),{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(e,t)=>{let{method:n,params:a}=e;if("tools/call"===n){let e=E(a),n="string"==typeof e?.name?e.name:void 0;if(!n)throw Error("MCP App tool call is missing a tool name");l?.(n);let c=await s.callToolFromApp(r,n,E(e?.arguments)??{},void 0,t?.signal,i);if(c?.httpStatus===403){let e=c.error||"MCP Apps access was disabled for this server";throw o(e),Error(e)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${n}`);return c.data}if("resources/read"===n){let e=E(a),n="string"==typeof e?.uri?e.uri:void 0;if(!n)throw Error("MCP App resource read is missing a URI");let i=await s.readResourceFromApp(r,n,t?.signal);if(i?.httpStatus===403){let e=i.error||"MCP Apps access was disabled for this server";throw o(e),Error(e)}if(!i||!1===i.success)throw Error(i?.error||`Resource read failed: ${n}`);return i.data}if("resources/list"===n)return{resources:[]};if("resources/templates/list"===n)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${n}`)}}),$,{openLinks:{},serverTools:{},serverResources:{},logging:{},...tw.current?{message:{text:{}}}:{},...tg.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:f.csp,permissions:f.permissions}},{hostContext:{...p?{toolInfo:p}:{},theme:"dark"===eC.palette.mode?"dark":"light",platform:"web",displayMode:M,availableDisplayModes:to.current,containerDimensions:V(e1.current,tE.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}});e6.current=k;let P=()=>n()&&e6.current===k;if(k.onopenlink=async({url:e})=>{if(!P())return{isError:!0};let t=function(e){try{let t=new URL(e);if(!L.has(t.protocol)||t.username||t.password)return null;return t.href}catch{return null}}(e);if(!t)return T.warn("MCP App open-link rejected by URL policy",{serverName:r,uri:b}),{isError:!0};let n=window.open(t,"_blank","noopener,noreferrer");return n&&(n.opener=null),{}},k.ondownloadfile=async({contents:e})=>{if(!P())return{isError:!0};try{for(let t of e??[]){let e,r=I(I(t)?.resource);if(!r)continue;let n=("string"==typeof r.uri?r.uri.split("/").pop():"")||"download",i="string"==typeof r.mimeType?r.mimeType:"application/octet-stream";if("string"==typeof r.blob){let t=Uint8Array.from(atob(r.blob),e=>e.charCodeAt(0));e=new Blob([t],{type:i})}else e=new Blob([String(r.text??"")],{type:i});let o=URL.createObjectURL(e),s=document.createElement("a");s.href=o,s.download=n,document.body.appendChild(s),s.click(),s.remove(),setTimeout(()=>URL.revokeObjectURL(o),4e3)}return{}}catch(e){return T.warn("MCP App download failed",e),{isError:!0}}},k.onloggingmessage=e=>{P()&&T.debug("MCP App log",e?.data)},k.onmessage=async e=>{if(!P())return{};if(!tw.current)throw Error("This host cannot deliver ui/message in this surface");let t=function(e){let t=I(e);if(t?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let r=t.content,n=Array.isArray(r)?r:r&&"object"==typeof r?[r]:[];if(0===n.length||!n.every(D))throw Error("This host accepts text-only ui/message content");let i=n.map(e=>e.text).join("\n").trim();if(!i)throw Error("ui/message text must not be empty");return i}(e);if(!await tw.current(t))throw Error("ui/message was not delivered");return{}},k.onupdatemodelcontext=async e=>{if(!P())return{};let t=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)||!H.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":F(e)>U?`Model context exceeds ${U} bytes`:null}(e);if(t)throw Error(t);let n=`${r}::${b}`;if(!tg.current)throw Error("This host cannot preserve model context in this surface");if(!await tg.current(n,e))throw Error("MCP App model context was not stored");return{}},k.onsizechange=async({width:e,height:t})=>{if(!P()||tE.current)return;let r=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:e,height:t},e1.current?.getBoundingClientRect().width||e1.current?.clientWidth||0);void 0!==r.height&&(e4.current=r.height,"fullscreen"!==ti.current&&(w.style.height=`${r.height}px`)),void 0!==r.width&&(w.style.width=`${r.width}px`,w.style.maxWidth="100%")},k.onrequestdisplaymode=async({mode:e})=>{if(!P())return{mode:ti.current};let t=ti.current,r=tn.current;if(!Y(e,to.current,r))return{mode:t};if("pip"===e&&!tE.current&&ty.current)return setTimeout(tj,0),{mode:t};let n=t;return(n=tA.current?await tA.current(e,[...r]):e)===t||Y(n,to.current,r)||(n=t),n!==t&&(ti.current=n,eB(n),await k.sendHostContextChange({displayMode:n})),{mode:n}},k.onrequestteardown=()=>{P()&&tR().finally(()=>{tC.current?tC.current():(ti.current="inline",eB("inline"),eS(!1))})},k.oninitialized=()=>{var e,t,r,n;if(!P())return;let i=k.getAppCapabilities()?.availableDisplayModes,o=Array.isArray(i)?[...new Set(i.filter(e=>z.includes(e)))]:[];tn.current=o,eK(o),tb.current?.(o.includes("pip")),tv.current?.([...o]),e9.current=!0;let s=(e=S,t=tE.current,r=to.current,n=o,t?Y("pip",r,n)?"fullscreen"===e&&Y("fullscreen",r,n)?"fullscreen":"pip":null:"fullscreen"===e&&Y("fullscreen",r,n)?"fullscreen":"inline");if(null===s){eT(ey("chat.app.canvasUnsupported")),ek(!1),tR();return}tx.current&&o.includes("pip")&&!tE.current&&ty.current&&setTimeout(tj,0),ti.current=s,eB(s),s!==M&&k.sendHostContextChange({displayMode:s});let l=e1.current;if(l&&"u">typeof ResizeObserver){let e=()=>{if(!P()||!e9.current)return;let e=l.getBoundingClientRect();e.width<=0||tE.current&&e.height<=0||k.sendHostContextChange({containerDimensions:V(l,tE.current)})};e7.current?.disconnect(),e7.current=new ResizeObserver(e),e7.current.observe(l),e()}let a=th.current;td.current=X(a.toolName,a.updateId,a.args,a.resultContent,a.cancelledReason,a.isError),(void 0!==a.args||void 0!==a.resultContent||void 0!==a.cancelledReason||!0===a.isError)&&tS(k,a.args,a.resultContent,a.cancelledReason,a.isError),ek(!1)},await k.connect((a=w.contentWindow,c=w.contentWindow,u=new x.hJ(a,c),d={start:async()=>{u.onmessage=(e,t)=>{d.onmessage?.("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)},u.onerror=e=>d.onerror?.(e),u.onclose=()=>d.onclose?.(),await u.start()},send:(e,t)=>u.send(e,t),close:()=>u.close(),setProtocolVersion:e=>u.setProtocolVersion?.(e)})),!P())return;await k.sendSandboxResourceReady({html:f.html,csp:f.csp,permissions:f.permissions})}catch(e){if(!n())return;T.warn(`Failed to mount MCP App ${b} from ${r}`,e),eT(e instanceof Error?e.message:ey("chat.app.loadFailed")),ek(!1),tR()}},[tj,eR,tS,r,tR,eC.palette.mode,b,ey]),tk=(0,i.useCallback)(()=>{!eM&&eD.current&&(ek(!0),eT(null),eF.current=null,tR().then(()=>{tr.current&&eD.current&&(N.delete(W((0,M.dJ)(),r,b,e)),tM())}))},[e,eM,tM,r,tR,b]),tP=(0,i.useCallback)(()=>{let e=!ej;e||"fullscreen"!==ti.current||(ti.current="inline",eB("inline"),e6.current?.sendHostContextChange({displayMode:"inline"})),e&&eg?.(),eS(e),e&&("internal"===e$||"granted"===e$)&&setTimeout(()=>{tM()},0)},[e$,ej,tM,eg]);(0,i.useEffect)(()=>{let e=eV.current;eV.current=ef,eh||!ef||e||ej||eS(!0)},[ef,eh,ej]),(0,i.useEffect)(()=>{eh&&("internal"===e$||"granted"===e$)&&!e8.current&&tM()},[e$,eh,tM]),(0,i.useEffect)(()=>{if(!eh&&("internal"===e$||"granted"===e$)&&ej&&!e8.current){let e=window.setTimeout(()=>{tM()},0);return()=>window.clearTimeout(e)}},[e$,ef,eh,ej,tM]),(0,i.useEffect)(()=>{let e=e2.current;if(e){if(eh||"fullscreen"===eQ){e.style.width="100%",e.style.height="100%",e.style.minHeight="0",e.style.borderRadius="0";return}e.style.width="100%",e.style.height=`${e4.current}px`,e.style.minHeight="120px",e.style.borderRadius=eY?"0":"4px"}},[eY,eh,eQ]),(0,i.useEffect)(()=>{tl.current===k&&tc.current===eR||(tl.current=k,tc.current=eR,(e8.current||te.current)&&tR().then(()=>{tr.current&&(tE.current||ej)&&tM()}))},[ej,tM,eR,tR,k]),(0,i.useEffect)(()=>{let e=X(k,Q,B,q,ee,et);e9.current&&e6.current&&e!==td.current&&(td.current=e,tR().then(()=>{tr.current&&(tE.current||ej)&&tM()}))},[ej,tM,tR,B,ee,et,k,q,Q]),(0,i.useEffect)(()=>{el&&e9.current&&e6.current&&ti.current!==el&&Y(el,to.current,tn.current)&&(ti.current=el,eB(el),e6.current.sendHostContextChange({displayMode:el}))},[el]),(0,i.useEffect)(()=>{e9.current&&e6.current&&e6.current?.sendHostContextChange({theme:"dark"===eC.palette.mode?"dark":"light"})},[eC.palette.mode]),(0,i.useEffect)(()=>{let e=ed??`${r}::${b}`;return eu?.(e,tR),()=>eu?.(e,null)},[eu,r,tR,ed,b]),(0,i.useEffect)(()=>{let e=e=>{let t=e.detail;t?.serverName===r&&(t.config?.enableMcpApps===!1||t.config?.disabled===!0)&&(eT(ey("chat.app.accessDisabled")),ek(!1),tR().finally(()=>{tE.current&&tC.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",e),()=>{window.removeEventListener("flujo:mcp-server-config-changed",e)}},[r,tR,ey]),(0,i.useEffect)(()=>(tr.current=!0,()=>{tr.current=!1,tR()}),[tR]);let tT=("internal"===e$||"granted"===e$)&&(0,n.jsx)(s.A,{disabled:eM,onClick:tk,sx:{minHeight:44,flexShrink:0},children:ey("chat.app.reload")});if(eh)return(0,n.jsxs)(l.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:ep?"visible":"hidden",pointerEvents:ep?"auto":"none",flexDirection:"column"},children:[(0,n.jsx)(l.default,{sx:{display:"flex",justifyContent:"flex-end",flexShrink:0},children:tT}),ev&&eA&&"loading"===e$&&(0,n.jsx)(a.A,{variant:"body2",sx:{p:2},children:ey("chat.app.consentChecking")}),"prompt"===e$&&(0,n.jsxs)(l.default,{sx:{p:2},children:[(0,n.jsx)(a.A,{variant:"body2",sx:{mb:1},children:ey("chat.app.consentPrompt")}),(0,n.jsxs)(a.A,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:[r," — ",b]}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-once")},children:ey("chat.app.consentAllowOnce")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eN("deny-always")},children:ey("chat.app.consentNeverAllow")})]}),"denied"===e$&&(0,n.jsxs)(l.default,{sx:{p:2},children:[(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",sx:{mb:1},children:ey("chat.app.consentBlocked")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eW()},children:ey("chat.app.consentAskAgain")})]}),eU&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eU}),("internal"===e$||"granted"===e$)&&eM&&(0,n.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(u.default,{size:16,thickness:6}),(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",children:ey("chat.app.loading")})]}),eP&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eP}),(0,n.jsx)(l.default,{ref:e1,sx:{flex:1,minHeight:0,width:"100%",display:eP?"none":"block"}})]});let t$=eq.includes("inline")&&eq.includes("fullscreen")&&e0.includes("fullscreen"),tL=eq.includes("inline")&&eq.includes("pip")&&e0.includes("pip")&&!!ei;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(l.default,{ref:e3,sx:{mt:1,...eY?{border:0,borderRadius:0}:{border:"1px solid",borderColor:"divider",borderRadius:1},overflow:"hidden",..."fullscreen"===eO?{position:"fixed",left:(eJ?.x??16)-tm.x,top:(eJ?.y??16)-tm.y,width:eJ?.width??"calc(100vw - 32px)",height:eJ?.height??"calc(100vh - 32px)",minWidth:"min(480px, 100vw)",minHeight:"min(320px, 100vh)",maxWidth:"100vw",maxHeight:"100vh",zIndex:1300,bgcolor:"background.paper",boxShadow:6,display:"flex",flexDirection:"column"}:{}},children:["fullscreen"===eO&&(0,n.jsx)(P.y1,{label:ey("chat.canvas.resize"),onResizeStart:tf}),(0,n.jsxs)(l.default,{onPointerDown:tp,sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover",cursor:"fullscreen"===eO?"move":"default",userSelect:"none",flexWrap:"wrap",flexShrink:0},children:[(0,n.jsx)(p.A,{fontSize:"small",color:"primary"}),(0,n.jsx)(a.A,{variant:"body2",sx:{fontWeight:500},children:ey("chat.app.fromServer",{server:r})}),ew>1&&(0,n.jsxs)(a.A,{variant:"caption",color:"text.secondary",children:["\xd7",ew]}),(0,n.jsx)(d.A,{title:ey("chat.app.sandboxHelp"),children:(0,n.jsx)(f.A,{fontSize:"small",color:"action"})}),(0,n.jsx)(l.default,{sx:{flex:1}}),ej&&tT,ej&&tL&&(0,n.jsx)(s.A,{size:"small",onClick:tj,children:ey("chat.app.canvas")}),ej&&(0,n.jsx)(d.A,{title:t$?"fullscreen"===eO?ey("chat.app.exitFullscreen"):ey("chat.app.fullscreen"):ey("chat.app.fullscreenUnsupported"),children:(0,n.jsx)("span",{children:(0,n.jsx)(s.A,{size:"small",disabled:!t$,"aria-label":"fullscreen"===eO?ey("chat.app.exitFullscreen"):ey("chat.app.fullscreen"),onClick:()=>{let e="fullscreen"===eO?"inline":"fullscreen";Y(e,e0,eq)&&(ti.current=e,eB(e),e6.current?.sendHostContextChange({displayMode:e}))},sx:{minWidth:0},children:"fullscreen"===eO?(0,n.jsx)(y.A,{fontSize:"small"}):(0,n.jsx)(g.A,{fontSize:"small"})})})}),(0,n.jsx)(s.A,{size:"small",onClick:tP,startIcon:ej?(0,n.jsx)(w.A,{}):(0,n.jsx)(m.A,{}),children:ej?ey("chat.app.hide"):ey("chat.app.open")})]}),ej&&"prompt"===e$&&(0,n.jsxs)(l.default,{sx:{p:1},children:[(0,n.jsx)(a.A,{variant:"body2",sx:{mb:1},children:ey("chat.app.consentPrompt")}),(0,n.jsx)(a.A,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:b}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-once")},children:ey("chat.app.consentAllowOnce")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eN("deny-always")},children:ey("chat.app.consentNeverAllow")})]}),ej&&"denied"===e$&&(0,n.jsxs)(l.default,{sx:{p:1},children:[(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",sx:{mb:1},children:ey("chat.app.consentBlocked")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eW()},children:ey("chat.app.consentAskAgain")})]}),ej&&eU&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eU}),(0,n.jsx)(h.A,{in:ej&&("internal"===e$||"granted"===e$),onExited:()=>{tR()},sx:"fullscreen"===eO?{flex:1,minHeight:0,display:"flex",flexDirection:"column","& .MuiCollapse-wrapper, & .MuiCollapse-wrapperInner":{height:"100%",minHeight:0,display:"flex",flexDirection:"column"}}:void 0,children:(0,n.jsxs)(l.default,{sx:{p:1,height:"fullscreen"===eO?"100%":"auto",minHeight:0,display:"flex",flexDirection:"column"},children:[eM&&(0,n.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(u.default,{size:16,thickness:6}),(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",children:ey("chat.app.loading")})]}),eP&&(0,n.jsx)(c.A,{severity:"error",sx:{my:1},children:eP}),(0,n.jsx)(l.default,{ref:e1,sx:{width:"100%",flex:"fullscreen"===eO?1:void 0,minHeight:0,height:"fullscreen"===eO?"100%":"auto",display:eP?"none":"block"}})]})})]}),(0,n.jsx)(P.Fy,{cursor:eG})]})}},77586:(e,t,r)=>{r.d(t,{Fy:()=>p,LI:()=>h,RA:()=>a,eH:()=>u,hU:()=>c,ri:()=>d,y1:()=>w});var n=r(95155),i=r(12115),o=r(4550);let s=(e,t,r)=>Math.min(Math.max(e,t),Math.max(t,r)),l={x:0,y:0};function a(e,t,r){return{x:s(e.x,0,Math.max(0,r.width-t.width)),y:s(e.y,0,Math.max(0,r.height-t.height))}}function c(e,t,r,n,i,o){let l=t.includes("left"),a=t.includes("right"),c=t.includes("top"),u=t.includes("bottom"),d=e.x+e.width,h=e.y+e.height,p=e.x,f=e.y,m=e.width,w=e.height;return l?(p=s(e.x+r,0,d-o.width),m=d-p):a&&(m=s(e.width+r,o.width,i.width-e.x)),c?(f=s(e.y+n,0,h-o.height),w=h-f):u&&(w=s(e.height+n,o.height,i.height-e.y)),{x:p,y:f,width:m,height:w}}function u(e,t,r){let n=s(e.width,r.width,t.width),i=s(e.height,r.height,t.height);return{x:s(e.x,0,t.width-n),y:s(e.y,0,t.height-i),width:n,height:i}}function d(e,t){let[r,n]=(0,i.useState)(l);return(0,i.useEffect)(()=>{if(!t)return void n(e=>0===e.x&&0===e.y?e:l);let r=()=>{let t=function(e){if(!e||"function"!=typeof window.getComputedStyle)return l;let t=window.getComputedStyle(e);if("fixed"!==t.position)return l;let r=Number.parseFloat(t.left),n=Number.parseFloat(t.top);if(!Number.isFinite(r)||!Number.isFinite(n))return l;let i=e.getBoundingClientRect(),o=Math.round(i.left-r),s=Math.round(i.top-n);return{x:1>Math.abs(o)?0:o,y:1>Math.abs(s)?0:s}}(e.current);n(e=>e.x===t.x&&e.y===t.y?e:t)};return r(),window.addEventListener("resize",r),window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("resize",r),window.removeEventListener("scroll",r,!0)}},[t,e]),r}function h(){let[e,t]=(0,i.useState)(null),r=(0,i.useRef)(null),n=(0,i.useRef)(!0);return(0,i.useEffect)(()=>(n.current=!0,()=>{n.current=!1,r.current?.(!1),r.current=null}),[]),{activeCursor:e,startPointerDrag:(0,i.useCallback)((e,i,o)=>{r.current?.(),e.preventDefault(),e.stopPropagation();let s=e.currentTarget,l=e.pointerId,a=s.ownerDocument,c=a.defaultView??window,u=a.body.style.userSelect,d=a.body.style.cursor;try{s.setPointerCapture?.(l)}catch{}a.body.style.userSelect="none",a.body.style.cursor=i??"",t(i);let h=e=>{e.pointerId===l&&(e.preventDefault(),o(e))},p=(e=!0)=>{c.removeEventListener("pointermove",h,!0),c.removeEventListener("pointerup",f,!0),c.removeEventListener("pointercancel",f,!0);try{s.hasPointerCapture?.(l)&&s.releasePointerCapture(l)}catch{}a.body.style.userSelect=u,a.body.style.cursor=d,e&&n.current&&t(null),r.current===p&&(r.current=null)},f=e=>{e.pointerId===l&&p()};r.current=p,c.addEventListener("pointermove",h,!0),c.addEventListener("pointerup",f,!0),c.addEventListener("pointercancel",f,!0)},[])}}let p=({cursor:e})=>e?(0,n.jsx)(o.default,{"aria-hidden":!0,"data-testid":"pointer-drag-shield",sx:{position:"fixed",inset:0,zIndex:0x7ffffffe,cursor:e,touchAction:"none"}}):null,f={top:{top:-3,left:10,right:10,height:8},right:{right:-3,top:10,bottom:10,width:8},bottom:{bottom:-3,left:10,right:10,height:8},left:{left:-3,top:10,bottom:10,width:8},"top-left":{top:-3,left:-3,width:14,height:14},"top-right":{top:-3,right:-3,width:14,height:14},"bottom-left":{bottom:-3,left:-3,width:14,height:14},"bottom-right":{bottom:-3,right:-3,width:14,height:14}},m=Object.keys(f),w=({label:e,onResizeStart:t})=>(0,n.jsx)(n.Fragment,{children:m.map(r=>{let i="top"===r||"bottom"===r?"ns-resize":"left"===r||"right"===r?"ew-resize":"top-left"===r||"bottom-right"===r?"nwse-resize":"nesw-resize";return(0,n.jsx)(o.default,{component:"span",role:"separator","aria-label":`${e} (${r})`,onPointerDown:e=>t(e,r,i),sx:{position:"absolute",zIndex:8,cursor:i,touchAction:"none",...f[r],..."bottom-right"===r?{"&::after":{content:'""',position:"absolute",right:3,bottom:3,width:7,height:7,borderRight:2,borderBottom:2,borderColor:"text.secondary",opacity:.7}}:{}}},r)})})}}]);
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2103],{22103:(e,t,r)=>{r.d(t,{uJ:()=>U,Ay:()=>Z,Yw:()=>F});var n=r(95155),i=r(12115),o=r(28683),s=r(52673),l=r(4550),a=r(37911),c=r(99306),u=r(89009),d=r(9098),h=r(70668),p=r(32038),f=r(42108),m=r(39734),w=r(88078),g=r(73254),y=r(98598),x=r(32635),b=r(6255),v=r(6310),A=r(80967),C=r(97312);function E(e){return null===e||"object"!=typeof e||Array.isArray(e)?void 0:e}var R=r(16803);let j=e=>null===e||"object"!=typeof e||Array.isArray(e)?void 0:e;function S(e){return"string"==typeof e&&e.length>0&&e.length<=512&&e.trim()===e}var M=r(16007),k=r(49103),P=r(77586);let T=(0,k.h)("frontend/components/Chat/McpAppFrame"),$={name:"FLUJO",version:"3.48.7"},L=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],H=new Set(["text"]),U=262144,I=e=>null===e||"object"!=typeof e||Array.isArray(e)?void 0:e,D=e=>{let t=I(e);return t?.type==="text"&&"string"==typeof t.text};function F(e){try{return new TextEncoder().encode(JSON.stringify(e)).length}catch{return 1/0}}let N=new Map;function W(e,t,r,n){return JSON.stringify([e,t,r,n??null])}async function O(e,t,r){let n=(0,M.dJ)(),i=W(n,e,t,r);if(!N.has(i)){let o=new URLSearchParams;o.set("serverName",e),o.set("uri",t),r&&o.set("conversationId",r);let s=fetch((0,M.TA)(`/api/mcp/app-sandbox${o.toString()?`?${o}`:""}`,n)).then(async e=>{if(!e.ok){let t="";try{let r=await e.json();"string"==typeof r.error&&r.error.trim()&&(t=`: ${r.error.trim()}`)}catch{}throw Error(`Sandbox endpoint discovery failed (${e.status})${t}`)}return await e.json()}).catch(e=>{throw N.delete(i),e});N.set(i,s)}let o=await N.get(i);return{href:function(e,t){let r;if("boolean"!=typeof e.shared)throw Error("Sandbox endpoint discovery did not describe its origin mode");if(!function(e){if("string"!=typeof e)return!1;let t=e.trim();if(0===t.length||t.length>253||t!==e||t!==t.toLowerCase()||/[^\w.-]|[^\x00-\x7f]/i.test(t)||/^\d+(\.\d+)*$/.test(t)||t.includes(":")||/[/?#@]/.test(t))return!1;let r=t.split(".");return!(0===r.length||r.some(e=>0===e.length))&&r.every(e=>e.length<=63&&/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(e))}(e.originKey))throw Error("Sandbox endpoint discovery returned an invalid origin key");if("string"!=typeof e.token||0===e.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if("string"!=typeof e.url)throw Error("Sandbox endpoint discovery did not return an isolated app URL");try{r=new URL(e.url)}catch{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");if(e.shared){if(r.searchParams.get("originKey")!==e.originKey)throw Error("Shared sandbox URL is not bound to the verified app origin key")}else if(!r.hostname.split(".").includes(e.originKey))throw Error("Sandbox URL is not bound to the verified app origin key");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}(o,window.location),allowAll:!0===o.allowAll}}function B(e,t,r=!1,n=!1){let i=e=>{let r=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!r||!t.includes(r[1].toLowerCase()))return!1;let n=r[3].split(".");if(r[3].length>253||n.some(e=>0===e.length||e.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)))return!1;let i=r[4]?Number(r[4]):void 0;return void 0===i||Number.isInteger(i)&&i>=1&&i<=65535},o=[],s=new Set;for(let l of e??[]){if(0===l.length||l.length>2048||/[^\x21-\x7e]/.test(l))continue;if("*"===l){if(n)return["*"];continue}let e=r?(0,R._w)(l,t.includes("wss")?["http","ws"]:["http"]):void 0;if(!e&&!i(l))continue;let a=e??l,c=a.toLowerCase();if(!s.has(c)&&(s.add(c),o.push(a),o.length>=64))break}return o}function J(e=window.location){return!!e&&"http:"===e.protocol}function _(e,t=J(),r=!1){return{connectDomains:B(e.connectDomains,["https","wss"],t,r),resourceDomains:B(e.resourceDomains,["https"],t,r),frameDomains:B(e.frameDomains,["https"],t,r),baseUriDomains:B(e.baseUriDomains,["https"],t,r)}}function q(e){if(e)try{return JSON.parse(e)}catch{return}}async function K(e,t,r,n,i){let o;if(await e.sendToolInput({arguments:(o=q(t))&&"object"==typeof o&&!Array.isArray(o)?o:{}}),void 0!==n)return void await e.sendToolCancelled({reason:n});let s=function(e,t){if(void 0===e)return!0===t?{content:[],isError:!0}:null;let r=b.TFo.safeParse(q(e));return r.success?{...r.data,...!0===t?{isError:!0}:{}}:{content:[{type:"text",text:e}],...!0===t?{isError:!0}:{}}}(r,i);s&&await e.sendToolResult(s)}function Y(e,t,r){return t.includes(e)&&r.includes(e)}function X(e,t,r,n,i,o){let s=void 0===t?`${r??""}\0${n??""}\0${i??""}\0${o??""}`:`${typeof t}:${String(t)}`;return`${e??""}\0${s}`}function V(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 G(e,t,r){try{let n=await C.S.listServerTools(e),i=Array.isArray(n.tools)?n.tools:[],o=r?i.find(e=>e?.name===r):i.find(e=>(0,R.Gt)(e?._meta)===t);if(o?.name&&o?.inputSchema&&(0,R.Gt)(o._meta)===t)return{tool:o}}catch(e){T.debug("Could not resolve the full MCP App tool definition",e)}}let Z=({conversationId:e,ownerScopeId:t,serverName:r,uri:b,toolName:k,toolArgs:B,toolResultContent:q,toolOwnerScope:Z,toolUpdateId:Q,toolCancelledReason:ee,toolIsError:et,onAppMessage:er,onUpdateModelContext:en,onRequestDock:ei,onDockable:eo,onAvailableDisplayModes:es,hostDisplayMode:el,onRequestDisplayMode:ea,onRequestClose:ec,onRegisterTeardown:eu,teardownRegistrationKey:ed,docked:eh=!1,visible:ep=!0,defaultExpanded:ef=!1,autoDock:em=!1,linkedToolCallCount:ew=1,onUserOpen:eg})=>{let{t:ey}=(0,v.s9)(),{settings:ex,settingsHydrated:eb}=(0,A.useStorage)(),ev=!1!==eb,eA=ex?.experimental?.requireMcpAppLaunchClick===!0,eC=(0,o.A)(),eE=(0,i.useId)(),eR=(0,i.useMemo)(()=>{var n;let i;return(i=S((n={toolOwnerScope:Z,toolResultContent:q,conversationId:e,ownerScopeId:t,serverName:r,uri:b,frameInstanceId:eE}).toolOwnerScope)?n.toolOwnerScope:function(e){if(void 0!==e)try{let t="string"==typeof e?JSON.parse(e):e,r=j(j(t)?._meta),n=r?.["io.flujo/host-owner-scope"];return S(n)?n:void 0}catch{return}}(n.toolResultContent))||(n.conversationId?`conversation:${n.conversationId}`:n.ownerScopeId?.trim()?`app:${n.ownerScopeId.trim().slice(0,500)}`:`app:${n.serverName}:${n.uri}:${n.frameInstanceId}`)},[e,eE,t,r,Z,q,b]),[ej,eS]=(0,i.useState)(ef),[eM,ek]=(0,i.useState)(!1),[eP,eT]=(0,i.useState)(null),[e$,eL]=(0,i.useState)(ev&&!eA?"granted":"loading"),[ez,eH]=(0,i.useState)(!1),[eU,eI]=(0,i.useState)(null),eD=(0,i.useRef)(!1);eD.current=ev&&("internal"===e$||"granted"===e$)&&(eh||ej);let eF=(0,i.useRef)(null);(0,i.useEffect)(()=>{eF.current=eP},[eP]),(0,i.useEffect)(()=>{if(!ev)return void eL("loading");if(!eA){eL("granted"),eI(null);return}let t=!0;eL("loading");let n=new URLSearchParams({serverName:r,uri:b});return e&&n.set("conversationId",e),fetch(`/api/mcp/app-consent?${n}`).then(async e=>e.ok?e.json():Promise.reject(Error("Consent lookup failed"))).then(e=>{t&&["internal","granted","prompt","denied"].includes(e.status??"")&&eL(e.status)}).catch(()=>{t&&eL("denied")}),()=>{t=!1}},[ev,eA,e,r,b]);let eN=(0,i.useCallback)(async t=>{eH(!0),eI(null);try{let n=await fetch("/api/mcp/app-consent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({serverName:r,uri:b,conversationId:e,decision:t})});if(!n.ok)throw Error("Unable to save MCP App consent");let i=await n.json();eL("granted"===i.status?"granted":"denied")}catch{eI(ey("chat.app.consentSaveFailed"))}finally{eH(!1)}},[e,r,ey,b]),eW=(0,i.useCallback)(async()=>{eH(!0),eI(null);try{let e=new URLSearchParams({serverName:r,uri:b});if(!(await fetch(`/api/mcp/app-consent?${e}`,{method:"DELETE"})).ok)throw Error("Unable to reset MCP App consent");eL("prompt")}catch{eI(ey("chat.app.consentSaveFailed"))}finally{eH(!1)}},[r,ey,b]),[eO,eB]=(0,i.useState)(eh?"pip":"inline"),[eJ,e_]=(0,i.useState)(null),[eq,eK]=(0,i.useState)([]),[eY,eX]=(0,i.useState)(!1),eV=(0,i.useRef)(ef),{activeCursor:eG,startPointerDrag:eZ}=(0,P.LI)(),eQ=el??eO,e0=(0,i.useMemo)(()=>eh?["pip","fullscreen"]:["inline","fullscreen",...ei?["pip"]:[]],[eh,ei]),e1=(0,i.useRef)(null),e3=(0,i.useRef)(null),e2=(0,i.useRef)(null),e4=(0,i.useRef)(200),e6=(0,i.useRef)(null),e8=(0,i.useRef)(!1),e5=(0,i.useRef)(0),e9=(0,i.useRef)(!1),e7=(0,i.useRef)(null),te=(0,i.useRef)(null),tt=(0,i.useRef)(!1),tr=(0,i.useRef)(!0),tn=(0,i.useRef)([]),ti=(0,i.useRef)(eQ),to=(0,i.useRef)(e0),ts=(0,i.useRef)(k),tl=(0,i.useRef)(k),ta=(0,i.useRef)(eR),tc=(0,i.useRef)(eR);ta.current=eR;let tu=(0,i.useRef)(Promise.resolve()),td=(0,i.useRef)(void 0),th=(0,i.useRef)({toolName:k,args:B,resultContent:q,cancelledReason:ee,isError:et,updateId:Q});(0,i.useEffect)(()=>{eh||"fullscreen"!==eQ||e_(e=>{if(e)return e;let t=Math.min(Math.max(520,Math.round(.86*window.innerWidth)),window.innerWidth-24),r=Math.min(Math.max(360,Math.round(.84*window.innerHeight)),window.innerHeight-24);return{x:Math.round((window.innerWidth-t)/2),y:Math.round((window.innerHeight-r)/2),width:t,height:r}})},[eh,eQ]),(0,i.useEffect)(()=>{if(eh||"fullscreen"!==eQ)return;let e=()=>{let e={width:Math.min(480,window.innerWidth),height:Math.min(320,window.innerHeight)};e_(t=>t?(0,P.eH)(t,{width:window.innerWidth,height:window.innerHeight},e):t)};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[eh,eQ]);let tp=(0,i.useCallback)(e=>{if("fullscreen"!==eQ||!e3.current||e.target.closest('button,[role="button"]'))return;e.preventDefault();let t=e3.current.getBoundingClientRect(),r=e.clientX,n=e.clientY;eZ(e,"move",e=>{e_({...(0,P.RA)({x:t.left+e.clientX-r,y:t.top+e.clientY-n},{width:t.width,height:t.height},{width:window.innerWidth,height:window.innerHeight}),width:t.width,height:t.height})})},[eQ,eZ]),tf=(0,i.useCallback)((e,t,r)=>{if("fullscreen"!==eQ||!e3.current)return;let n=e3.current.getBoundingClientRect(),i={x:n.left,y:n.top,width:n.width,height:n.height},o=e.clientX,s=e.clientY;eZ(e,r,e=>{e_((0,P.hU)(i,t,e.clientX-o,e.clientY-s,{width:window.innerWidth,height:window.innerHeight},{width:Math.min(480,window.innerWidth),height:Math.min(320,window.innerHeight)}))})},[eQ,eZ]),tm=(0,P.ri)(e3,"fullscreen"===eO&&!eh);th.current={toolName:k,args:B,resultContent:q,cancelledReason:ee,isError:et,updateId:Q},ts.current=k;let tw=(0,i.useRef)(er);(0,i.useEffect)(()=>{tw.current=er},[er]);let tg=(0,i.useRef)(en);(0,i.useEffect)(()=>{tg.current=en},[en]);let ty=(0,i.useRef)(ei);(0,i.useEffect)(()=>{ty.current=ei},[ei]);let tx=(0,i.useRef)(em);(0,i.useEffect)(()=>{em&&(tx.current=!0)},[em]);let tb=(0,i.useRef)(eo);(0,i.useEffect)(()=>{tb.current=eo},[eo]);let tv=(0,i.useRef)(es);(0,i.useEffect)(()=>{tv.current=es},[es]);let tA=(0,i.useRef)(ea);(0,i.useEffect)(()=>{tA.current=ea},[ea]);let tC=(0,i.useRef)(ec);(0,i.useEffect)(()=>{tC.current=ec},[ec]);let tE=(0,i.useRef)(eh);(0,i.useEffect)(()=>{tE.current=eh},[eh]),(0,i.useEffect)(()=>{ti.current=eQ},[eQ]),(0,i.useEffect)(()=>{to.current=e0},[e0]);let tR=(0,i.useCallback)(()=>{if(te.current)return te.current;e5.current+=1;let e=e6.current,t=e2.current,r=e9.current;e6.current=null,e2.current=null,e9.current=!1,e8.current=!1,tn.current=[],e7.current?.disconnect(),e7.current=null;let n=(async()=>{if(e&&r){let t;try{await Promise.race([e.teardownResource({},{timeout:1e3}),new Promise(e=>{t=setTimeout(e,1e3)})])}catch(e){T.debug("MCP App did not acknowledge resource teardown",e)}finally{t&&clearTimeout(t)}}try{await e?.close()}catch{}t?.remove()})();return te.current=n,n.finally(()=>{te.current===n&&(te.current=null)}),n},[]),tj=(0,i.useCallback)(()=>{tt.current||!ty.current||eF.current||(tt.current=!0,tR().then(()=>{tr.current&&(ty.current?.(),eS(!1))}).finally(()=>{tt.current=!1}))},[tR]),tS=(0,i.useCallback)((e,t,r,n,i)=>{tu.current=tu.current.catch(()=>void 0).then(async()=>{e6.current===e&&e9.current&&await K(e,t,r,n,i)}).catch(e=>{T.warn("MCP App tool delivery failed",e)})},[]),tM=(0,i.useCallback)(async()=>{if(te.current&&await te.current,e8.current||!e1.current)return;let t=e5.current+1;e5.current=t;let n=()=>e5.current===t&&e8.current;e8.current=!0,eK([]),ek(!0),eT(null);try{var i,o,s,l,a,c;let u,d,[h,p]=await Promise.all([C.S.readResourceFromApp(r,b),G(r,b,ts.current)]);if(!n())return;if(h?.httpStatus===403)throw Error(h?.error||ey("chat.app.accessDisabled"));if(!h||!1===h.success)throw Error(h?.error||ey("chat.app.readFailed"));let f=function(e,t){let r,n=e?.contents;if(!Array.isArray(n)||0===n.length)throw Error("Resource has no contents");let i=n.find(e=>e.uri===t&&"string"==typeof e.mimeType&&(0,R.q$)(e.mimeType)&&("string"==typeof e.text||"string"==typeof e.blob));if(!i)throw Error(`Resource ${t} did not return MCP App HTML`);try{if("string"==typeof i.text)r=i.text;else if("string"==typeof i.blob){var o;let e;o=i.blob,e=Uint8Array.from(atob(o),e=>e.charCodeAt(0)),r=new TextDecoder("utf-8",{fatal:!0}).decode(e)}else throw Error("Missing app resource body")}catch{throw Error(`Resource ${t} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(r).length>R.Pt)throw Error(`Resource exceeds the ${Math.round(R.Pt/1024)} KiB size cap`);let s=I(i._meta??i.meta),l=I(s?.ui),a=x.c0.safeParse(l?.csp);if(l?.csp!==void 0&&!a.success)throw Error(`Resource ${t} declares an invalid CSP policy`);let c=x.Ml.safeParse(l?.permissions);if(l?.permissions!==void 0&&!c.success)throw Error(`Resource ${t} declares invalid sandbox permissions`);return{html:r,csp:a.success?_(a.data):void 0,rawCsp:a.success?a.data:void 0,permissions:c.success&&c.data.clipboardWrite?{clipboardWrite:{}}:void 0,prefersBorder:"boolean"==typeof l?.prefersBorder?l.prefersBorder:void 0}}(h.data,b);eX(!1===f.prefersBorder);let m=await O(r,b,e);if(!n()||!e1.current)return;m.allowAll&&f.rawCsp&&(f.csp=_(f.rawCsp,J(),!0));let w=document.createElement("iframe");w.title=ey("chat.app.frameTitle",{uri:b}),w.setAttribute("sandbox","allow-scripts allow-same-origin"),w.referrerPolicy="origin";let g=(0,x.Sy)(f.permissions);g&&w.setAttribute("allow",g);let y=!1===f.prefersBorder?"transparent":"#fff";w.style.cssText=tE.current||"fullscreen"===ti.current?`width:100%;height:100%;border:none;background:${y};`:`width:100%;min-height:120px;height:200px;border:none;background:${y};`+(!1===f.prefersBorder?"":"border-radius:4px;"),e1.current.appendChild(w),e2.current=w;let v=new URL(m.href);f.csp&&v.searchParams.set("csp",JSON.stringify(f.csp));let A=v.origin,j=new Promise((e,t)=>{let r=setTimeout(()=>{window.removeEventListener("message",n),t(Error(ey("chat.app.proxyTimeout")))},1e4),n=t=>{t.source===w.contentWindow&&t.origin===A&&t.data?.jsonrpc==="2.0"&&t.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(r),window.removeEventListener("message",n),e())};window.addEventListener("message",n)});if(w.src=v.href,await j,!n()||e2.current!==w)return;let S=ti.current,M="inline";ti.current=M;let k=new x.T1((i=ta.current,o=e=>{e5.current===t&&e6.current===k&&(eT(e),ek(!1),tR().finally(()=>{tE.current&&tC.current?.()}))},s=C.S,l=e=>T.info(`MCP App tools/call: ${r}/${e}`),{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(e,t)=>{let{method:n,params:a}=e;if("tools/call"===n){let e=E(a),n="string"==typeof e?.name?e.name:void 0;if(!n)throw Error("MCP App tool call is missing a tool name");l?.(n);let c=await s.callToolFromApp(r,n,E(e?.arguments)??{},void 0,t?.signal,i);if(c?.httpStatus===403){let e=c.error||"MCP Apps access was disabled for this server";throw o(e),Error(e)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${n}`);return c.data}if("resources/read"===n){let e=E(a),n="string"==typeof e?.uri?e.uri:void 0;if(!n)throw Error("MCP App resource read is missing a URI");let i=await s.readResourceFromApp(r,n,t?.signal);if(i?.httpStatus===403){let e=i.error||"MCP Apps access was disabled for this server";throw o(e),Error(e)}if(!i||!1===i.success)throw Error(i?.error||`Resource read failed: ${n}`);return i.data}if("resources/list"===n)return{resources:[]};if("resources/templates/list"===n)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${n}`)}}),$,{openLinks:{},serverTools:{},serverResources:{},logging:{},...tw.current?{message:{text:{}}}:{},...tg.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:f.csp,permissions:f.permissions}},{hostContext:{...p?{toolInfo:p}:{},theme:"dark"===eC.palette.mode?"dark":"light",platform:"web",displayMode:M,availableDisplayModes:to.current,containerDimensions:V(e1.current,tE.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}});e6.current=k;let P=()=>n()&&e6.current===k;if(k.onopenlink=async({url:e})=>{if(!P())return{isError:!0};let t=function(e){try{let t=new URL(e);if(!L.has(t.protocol)||t.username||t.password)return null;return t.href}catch{return null}}(e);if(!t)return T.warn("MCP App open-link rejected by URL policy",{serverName:r,uri:b}),{isError:!0};let n=window.open(t,"_blank","noopener,noreferrer");return n&&(n.opener=null),{}},k.ondownloadfile=async({contents:e})=>{if(!P())return{isError:!0};try{for(let t of e??[]){let e,r=I(I(t)?.resource);if(!r)continue;let n=("string"==typeof r.uri?r.uri.split("/").pop():"")||"download",i="string"==typeof r.mimeType?r.mimeType:"application/octet-stream";if("string"==typeof r.blob){let t=Uint8Array.from(atob(r.blob),e=>e.charCodeAt(0));e=new Blob([t],{type:i})}else e=new Blob([String(r.text??"")],{type:i});let o=URL.createObjectURL(e),s=document.createElement("a");s.href=o,s.download=n,document.body.appendChild(s),s.click(),s.remove(),setTimeout(()=>URL.revokeObjectURL(o),4e3)}return{}}catch(e){return T.warn("MCP App download failed",e),{isError:!0}}},k.onloggingmessage=e=>{P()&&T.debug("MCP App log",e?.data)},k.onmessage=async e=>{if(!P())return{};if(!tw.current)throw Error("This host cannot deliver ui/message in this surface");let t=function(e){let t=I(e);if(t?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let r=t.content,n=Array.isArray(r)?r:r&&"object"==typeof r?[r]:[];if(0===n.length||!n.every(D))throw Error("This host accepts text-only ui/message content");let i=n.map(e=>e.text).join("\n").trim();if(!i)throw Error("ui/message text must not be empty");return i}(e);if(!await tw.current(t))throw Error("ui/message was not delivered");return{}},k.onupdatemodelcontext=async e=>{if(!P())return{};let t=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)||!H.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":F(e)>U?`Model context exceeds ${U} bytes`:null}(e);if(t)throw Error(t);let n=`${r}::${b}`;if(!tg.current)throw Error("This host cannot preserve model context in this surface");if(!await tg.current(n,e))throw Error("MCP App model context was not stored");return{}},k.onsizechange=async({width:e,height:t})=>{if(!P()||tE.current)return;let r=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:e,height:t},e1.current?.getBoundingClientRect().width||e1.current?.clientWidth||0);void 0!==r.height&&(e4.current=r.height,"fullscreen"!==ti.current&&(w.style.height=`${r.height}px`)),void 0!==r.width&&(w.style.width=`${r.width}px`,w.style.maxWidth="100%")},k.onrequestdisplaymode=async({mode:e})=>{if(!P())return{mode:ti.current};let t=ti.current,r=tn.current;if(!Y(e,to.current,r))return{mode:t};if("pip"===e&&!tE.current&&ty.current)return setTimeout(tj,0),{mode:t};let n=t;return(n=tA.current?await tA.current(e,[...r]):e)===t||Y(n,to.current,r)||(n=t),n!==t&&(ti.current=n,eB(n),await k.sendHostContextChange({displayMode:n})),{mode:n}},k.onrequestteardown=()=>{P()&&tR().finally(()=>{tC.current?tC.current():(ti.current="inline",eB("inline"),eS(!1))})},k.oninitialized=()=>{var e,t,r,n;if(!P())return;let i=k.getAppCapabilities()?.availableDisplayModes,o=Array.isArray(i)?[...new Set(i.filter(e=>z.includes(e)))]:[];tn.current=o,eK(o),tb.current?.(o.includes("pip")),tv.current?.([...o]),e9.current=!0;let s=(e=S,t=tE.current,r=to.current,n=o,t?Y("pip",r,n)?"fullscreen"===e&&Y("fullscreen",r,n)?"fullscreen":"pip":null:"fullscreen"===e&&Y("fullscreen",r,n)?"fullscreen":"inline");if(null===s){eT(ey("chat.app.canvasUnsupported")),ek(!1),tR();return}tx.current&&o.includes("pip")&&!tE.current&&ty.current&&setTimeout(tj,0),ti.current=s,eB(s),s!==M&&k.sendHostContextChange({displayMode:s});let l=e1.current;if(l&&"u">typeof ResizeObserver){let e=()=>{if(!P()||!e9.current)return;let e=l.getBoundingClientRect();e.width<=0||tE.current&&e.height<=0||k.sendHostContextChange({containerDimensions:V(l,tE.current)})};e7.current?.disconnect(),e7.current=new ResizeObserver(e),e7.current.observe(l),e()}let a=th.current;td.current=X(a.toolName,a.updateId,a.args,a.resultContent,a.cancelledReason,a.isError),(void 0!==a.args||void 0!==a.resultContent||void 0!==a.cancelledReason||!0===a.isError)&&tS(k,a.args,a.resultContent,a.cancelledReason,a.isError),ek(!1)},await k.connect((a=w.contentWindow,c=w.contentWindow,u=new x.hJ(a,c),d={start:async()=>{u.onmessage=(e,t)=>{d.onmessage?.("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)},u.onerror=e=>d.onerror?.(e),u.onclose=()=>d.onclose?.(),await u.start()},send:(e,t)=>u.send(e,t),close:()=>u.close(),setProtocolVersion:e=>u.setProtocolVersion?.(e)})),!P())return;await k.sendSandboxResourceReady({html:f.html,csp:f.csp,permissions:f.permissions})}catch(e){if(!n())return;T.warn(`Failed to mount MCP App ${b} from ${r}`,e),eT(e instanceof Error?e.message:ey("chat.app.loadFailed")),ek(!1),tR()}},[tj,eR,tS,r,tR,eC.palette.mode,b,ey]),tk=(0,i.useCallback)(()=>{!eM&&eD.current&&(ek(!0),eT(null),eF.current=null,tR().then(()=>{tr.current&&eD.current&&(N.delete(W((0,M.dJ)(),r,b,e)),tM())}))},[e,eM,tM,r,tR,b]),tP=(0,i.useCallback)(()=>{let e=!ej;e||"fullscreen"!==ti.current||(ti.current="inline",eB("inline"),e6.current?.sendHostContextChange({displayMode:"inline"})),e&&eg?.(),eS(e),e&&("internal"===e$||"granted"===e$)&&setTimeout(()=>{tM()},0)},[e$,ej,tM,eg]);(0,i.useEffect)(()=>{let e=eV.current;eV.current=ef,eh||!ef||e||ej||eS(!0)},[ef,eh,ej]),(0,i.useEffect)(()=>{eh&&("internal"===e$||"granted"===e$)&&!e8.current&&tM()},[e$,eh,tM]),(0,i.useEffect)(()=>{if(!eh&&("internal"===e$||"granted"===e$)&&ej&&!e8.current){let e=window.setTimeout(()=>{tM()},0);return()=>window.clearTimeout(e)}},[e$,ef,eh,ej,tM]),(0,i.useEffect)(()=>{let e=e2.current;if(e){if(eh||"fullscreen"===eQ){e.style.width="100%",e.style.height="100%",e.style.minHeight="0",e.style.borderRadius="0";return}e.style.width="100%",e.style.height=`${e4.current}px`,e.style.minHeight="120px",e.style.borderRadius=eY?"0":"4px"}},[eY,eh,eQ]),(0,i.useEffect)(()=>{tl.current===k&&tc.current===eR||(tl.current=k,tc.current=eR,(e8.current||te.current)&&tR().then(()=>{tr.current&&(tE.current||ej)&&tM()}))},[ej,tM,eR,tR,k]),(0,i.useEffect)(()=>{let e=X(k,Q,B,q,ee,et);e9.current&&e6.current&&e!==td.current&&(td.current=e,tR().then(()=>{tr.current&&(tE.current||ej)&&tM()}))},[ej,tM,tR,B,ee,et,k,q,Q]),(0,i.useEffect)(()=>{el&&e9.current&&e6.current&&ti.current!==el&&Y(el,to.current,tn.current)&&(ti.current=el,eB(el),e6.current.sendHostContextChange({displayMode:el}))},[el]),(0,i.useEffect)(()=>{e9.current&&e6.current&&e6.current?.sendHostContextChange({theme:"dark"===eC.palette.mode?"dark":"light"})},[eC.palette.mode]),(0,i.useEffect)(()=>{let e=ed??`${r}::${b}`;return eu?.(e,tR),()=>eu?.(e,null)},[eu,r,tR,ed,b]),(0,i.useEffect)(()=>{let e=e=>{let t=e.detail;t?.serverName===r&&(t.config?.enableMcpApps===!1||t.config?.disabled===!0)&&(eT(ey("chat.app.accessDisabled")),ek(!1),tR().finally(()=>{tE.current&&tC.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",e),()=>{window.removeEventListener("flujo:mcp-server-config-changed",e)}},[r,tR,ey]),(0,i.useEffect)(()=>(tr.current=!0,()=>{tr.current=!1,tR()}),[tR]);let tT=("internal"===e$||"granted"===e$)&&(0,n.jsx)(s.A,{disabled:eM,onClick:tk,sx:{minHeight:44,flexShrink:0},children:ey("chat.app.reload")});if(eh)return(0,n.jsxs)(l.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:ep?"visible":"hidden",pointerEvents:ep?"auto":"none",flexDirection:"column"},children:[(0,n.jsx)(l.default,{sx:{display:"flex",justifyContent:"flex-end",flexShrink:0},children:tT}),ev&&eA&&"loading"===e$&&(0,n.jsx)(a.A,{variant:"body2",sx:{p:2},children:ey("chat.app.consentChecking")}),"prompt"===e$&&(0,n.jsxs)(l.default,{sx:{p:2},children:[(0,n.jsx)(a.A,{variant:"body2",sx:{mb:1},children:ey("chat.app.consentPrompt")}),(0,n.jsxs)(a.A,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:[r," — ",b]}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-once")},children:ey("chat.app.consentAllowOnce")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eN("deny-always")},children:ey("chat.app.consentNeverAllow")})]}),"denied"===e$&&(0,n.jsxs)(l.default,{sx:{p:2},children:[(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",sx:{mb:1},children:ey("chat.app.consentBlocked")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eW()},children:ey("chat.app.consentAskAgain")})]}),eU&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eU}),("internal"===e$||"granted"===e$)&&eM&&(0,n.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(u.default,{size:16,thickness:6}),(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",children:ey("chat.app.loading")})]}),eP&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eP}),(0,n.jsx)(l.default,{ref:e1,sx:{flex:1,minHeight:0,width:"100%",display:eP?"none":"block"}})]});let t$=eq.includes("inline")&&eq.includes("fullscreen")&&e0.includes("fullscreen"),tL=eq.includes("inline")&&eq.includes("pip")&&e0.includes("pip")&&!!ei;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(l.default,{ref:e3,sx:{mt:1,...eY?{border:0,borderRadius:0}:{border:"1px solid",borderColor:"divider",borderRadius:1},overflow:"hidden",..."fullscreen"===eO?{position:"fixed",left:(eJ?.x??16)-tm.x,top:(eJ?.y??16)-tm.y,width:eJ?.width??"calc(100vw - 32px)",height:eJ?.height??"calc(100vh - 32px)",minWidth:"min(480px, 100vw)",minHeight:"min(320px, 100vh)",maxWidth:"100vw",maxHeight:"100vh",zIndex:1300,bgcolor:"background.paper",boxShadow:6,display:"flex",flexDirection:"column"}:{}},children:["fullscreen"===eO&&(0,n.jsx)(P.y1,{label:ey("chat.canvas.resize"),onResizeStart:tf}),(0,n.jsxs)(l.default,{onPointerDown:tp,sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover",cursor:"fullscreen"===eO?"move":"default",userSelect:"none",flexWrap:"wrap",flexShrink:0},children:[(0,n.jsx)(p.A,{fontSize:"small",color:"primary"}),(0,n.jsx)(a.A,{variant:"body2",sx:{fontWeight:500},children:ey("chat.app.fromServer",{server:r})}),ew>1&&(0,n.jsxs)(a.A,{variant:"caption",color:"text.secondary",children:["\xd7",ew]}),(0,n.jsx)(d.A,{title:ey("chat.app.sandboxHelp"),children:(0,n.jsx)(f.A,{fontSize:"small",color:"action"})}),(0,n.jsx)(l.default,{sx:{flex:1}}),ej&&tT,ej&&tL&&(0,n.jsx)(s.A,{size:"small",onClick:tj,children:ey("chat.app.canvas")}),ej&&(0,n.jsx)(d.A,{title:t$?"fullscreen"===eO?ey("chat.app.exitFullscreen"):ey("chat.app.fullscreen"):ey("chat.app.fullscreenUnsupported"),children:(0,n.jsx)("span",{children:(0,n.jsx)(s.A,{size:"small",disabled:!t$,"aria-label":"fullscreen"===eO?ey("chat.app.exitFullscreen"):ey("chat.app.fullscreen"),onClick:()=>{let e="fullscreen"===eO?"inline":"fullscreen";Y(e,e0,eq)&&(ti.current=e,eB(e),e6.current?.sendHostContextChange({displayMode:e}))},sx:{minWidth:0},children:"fullscreen"===eO?(0,n.jsx)(y.A,{fontSize:"small"}):(0,n.jsx)(g.A,{fontSize:"small"})})})}),(0,n.jsx)(s.A,{size:"small",onClick:tP,startIcon:ej?(0,n.jsx)(w.A,{}):(0,n.jsx)(m.A,{}),children:ej?ey("chat.app.hide"):ey("chat.app.open")})]}),ej&&"prompt"===e$&&(0,n.jsxs)(l.default,{sx:{p:1},children:[(0,n.jsx)(a.A,{variant:"body2",sx:{mb:1},children:ey("chat.app.consentPrompt")}),(0,n.jsx)(a.A,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:b}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-once")},children:ey("chat.app.consentAllowOnce")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eN("deny-always")},children:ey("chat.app.consentNeverAllow")})]}),ej&&"denied"===e$&&(0,n.jsxs)(l.default,{sx:{p:1},children:[(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",sx:{mb:1},children:ey("chat.app.consentBlocked")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,onClick:()=>{eN("allow-always")},children:ey("chat.app.consentAllowAlways")}),(0,n.jsx)(s.A,{size:"small",disabled:ez,color:"inherit",onClick:()=>{eW()},children:ey("chat.app.consentAskAgain")})]}),ej&&eU&&(0,n.jsx)(c.A,{severity:"error",sx:{m:1},children:eU}),(0,n.jsx)(h.A,{in:ej&&("internal"===e$||"granted"===e$),onExited:()=>{tR()},sx:"fullscreen"===eO?{flex:1,minHeight:0,display:"flex",flexDirection:"column","& .MuiCollapse-wrapper, & .MuiCollapse-wrapperInner":{height:"100%",minHeight:0,display:"flex",flexDirection:"column"}}:void 0,children:(0,n.jsxs)(l.default,{sx:{p:1,height:"fullscreen"===eO?"100%":"auto",minHeight:0,display:"flex",flexDirection:"column"},children:[eM&&(0,n.jsxs)(l.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,n.jsx)(u.default,{size:16,thickness:6}),(0,n.jsx)(a.A,{variant:"body2",color:"text.secondary",children:ey("chat.app.loading")})]}),eP&&(0,n.jsx)(c.A,{severity:"error",sx:{my:1},children:eP}),(0,n.jsx)(l.default,{ref:e1,sx:{width:"100%",flex:"fullscreen"===eO?1:void 0,minHeight:0,height:"fullscreen"===eO?"100%":"auto",display:eP?"none":"block"}})]})})]}),(0,n.jsx)(P.Fy,{cursor:eG})]})}},77586:(e,t,r)=>{r.d(t,{Fy:()=>p,LI:()=>h,RA:()=>a,eH:()=>u,hU:()=>c,ri:()=>d,y1:()=>w});var n=r(95155),i=r(12115),o=r(4550);let s=(e,t,r)=>Math.min(Math.max(e,t),Math.max(t,r)),l={x:0,y:0};function a(e,t,r){return{x:s(e.x,0,Math.max(0,r.width-t.width)),y:s(e.y,0,Math.max(0,r.height-t.height))}}function c(e,t,r,n,i,o){let l=t.includes("left"),a=t.includes("right"),c=t.includes("top"),u=t.includes("bottom"),d=e.x+e.width,h=e.y+e.height,p=e.x,f=e.y,m=e.width,w=e.height;return l?(p=s(e.x+r,0,d-o.width),m=d-p):a&&(m=s(e.width+r,o.width,i.width-e.x)),c?(f=s(e.y+n,0,h-o.height),w=h-f):u&&(w=s(e.height+n,o.height,i.height-e.y)),{x:p,y:f,width:m,height:w}}function u(e,t,r){let n=s(e.width,r.width,t.width),i=s(e.height,r.height,t.height);return{x:s(e.x,0,t.width-n),y:s(e.y,0,t.height-i),width:n,height:i}}function d(e,t){let[r,n]=(0,i.useState)(l);return(0,i.useEffect)(()=>{if(!t)return void n(e=>0===e.x&&0===e.y?e:l);let r=()=>{let t=function(e){if(!e||"function"!=typeof window.getComputedStyle)return l;let t=window.getComputedStyle(e);if("fixed"!==t.position)return l;let r=Number.parseFloat(t.left),n=Number.parseFloat(t.top);if(!Number.isFinite(r)||!Number.isFinite(n))return l;let i=e.getBoundingClientRect(),o=Math.round(i.left-r),s=Math.round(i.top-n);return{x:1>Math.abs(o)?0:o,y:1>Math.abs(s)?0:s}}(e.current);n(e=>e.x===t.x&&e.y===t.y?e:t)};return r(),window.addEventListener("resize",r),window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("resize",r),window.removeEventListener("scroll",r,!0)}},[t,e]),r}function h(){let[e,t]=(0,i.useState)(null),r=(0,i.useRef)(null),n=(0,i.useRef)(!0);return(0,i.useEffect)(()=>(n.current=!0,()=>{n.current=!1,r.current?.(!1),r.current=null}),[]),{activeCursor:e,startPointerDrag:(0,i.useCallback)((e,i,o)=>{r.current?.(),e.preventDefault(),e.stopPropagation();let s=e.currentTarget,l=e.pointerId,a=s.ownerDocument,c=a.defaultView??window,u=a.body.style.userSelect,d=a.body.style.cursor;try{s.setPointerCapture?.(l)}catch{}a.body.style.userSelect="none",a.body.style.cursor=i??"",t(i);let h=e=>{e.pointerId===l&&(e.preventDefault(),o(e))},p=(e=!0)=>{c.removeEventListener("pointermove",h,!0),c.removeEventListener("pointerup",f,!0),c.removeEventListener("pointercancel",f,!0);try{s.hasPointerCapture?.(l)&&s.releasePointerCapture(l)}catch{}a.body.style.userSelect=u,a.body.style.cursor=d,e&&n.current&&t(null),r.current===p&&(r.current=null)},f=e=>{e.pointerId===l&&p()};r.current=p,c.addEventListener("pointermove",h,!0),c.addEventListener("pointerup",f,!0),c.addEventListener("pointercancel",f,!0)},[])}}let p=({cursor:e})=>e?(0,n.jsx)(o.default,{"aria-hidden":!0,"data-testid":"pointer-drag-shield",sx:{position:"fixed",inset:0,zIndex:0x7ffffffe,cursor:e,touchAction:"none"}}):null,f={top:{top:-3,left:10,right:10,height:8},right:{right:-3,top:10,bottom:10,width:8},bottom:{bottom:-3,left:10,right:10,height:8},left:{left:-3,top:10,bottom:10,width:8},"top-left":{top:-3,left:-3,width:14,height:14},"top-right":{top:-3,right:-3,width:14,height:14},"bottom-left":{bottom:-3,left:-3,width:14,height:14},"bottom-right":{bottom:-3,right:-3,width:14,height:14}},m=Object.keys(f),w=({label:e,onResizeStart:t})=>(0,n.jsx)(n.Fragment,{children:m.map(r=>{let i="top"===r||"bottom"===r?"ns-resize":"left"===r||"right"===r?"ew-resize":"top-left"===r||"bottom-right"===r?"nwse-resize":"nesw-resize";return(0,n.jsx)(o.default,{component:"span",role:"separator","aria-label":`${e} (${r})`,onPointerDown:e=>t(e,r,i),sx:{position:"absolute",zIndex:8,cursor:i,touchAction:"none",...f[r],..."bottom-right"===r?{"&::after":{content:'""',position:"absolute",right:3,bottom:3,width:7,height:7,borderRight:2,borderBottom:2,borderColor:"text.secondary",opacity:.7}}:{}}},r)})})}}]);
|