@agent-native/core 0.122.4 → 0.123.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +538 -0
- package/corpus/core/docs/content/actions.mdx +33 -20
- package/corpus/core/docs/content/agent-mentions.mdx +30 -19
- package/corpus/core/docs/content/agent-native-toolkit.mdx +8 -6
- package/corpus/core/docs/content/agent-resources.mdx +11 -0
- package/corpus/core/docs/content/agent-surfaces.mdx +41 -30
- package/corpus/core/docs/content/audit-log.mdx +78 -0
- package/corpus/core/docs/content/authentication.mdx +7 -5
- package/corpus/core/docs/content/automations.mdx +15 -9
- package/corpus/core/docs/content/client.mdx +11 -11
- package/corpus/core/docs/content/cloneable-saas.mdx +7 -1
- package/corpus/core/docs/content/code-agents-ui.mdx +9 -1
- package/corpus/core/docs/content/components.mdx +7 -0
- package/corpus/core/docs/content/context-awareness.mdx +1 -0
- package/corpus/core/docs/content/creating-templates.mdx +9 -1
- package/corpus/core/docs/content/custom-design-system.mdx +8 -0
- package/corpus/core/docs/content/data-programs.mdx +6 -0
- package/corpus/core/docs/content/deployment.mdx +2 -0
- package/corpus/core/docs/content/doctor.mdx +5 -3
- package/corpus/core/docs/content/extensions.mdx +26 -0
- package/corpus/core/docs/content/external-agents-catalog.mdx +533 -0
- package/corpus/core/docs/content/external-agents.mdx +20 -514
- package/corpus/core/docs/content/faq.mdx +2 -2
- package/corpus/core/docs/content/file-uploads.mdx +44 -0
- package/corpus/core/docs/content/frames.mdx +2 -2
- package/corpus/core/docs/content/generative-ui.mdx +8 -0
- package/corpus/core/docs/content/getting-started.mdx +45 -17
- package/corpus/core/docs/content/human-approval.mdx +9 -0
- package/corpus/core/docs/content/integrations.mdx +4 -3
- package/corpus/core/docs/content/internationalization.mdx +4 -11
- package/corpus/core/docs/content/key-concepts.mdx +1 -1
- package/corpus/core/docs/content/local-file-mode.mdx +5 -0
- package/corpus/core/docs/content/mcp-apps.mdx +2 -1
- package/corpus/core/docs/content/mcp-clients.mdx +32 -1
- package/corpus/core/docs/content/mcp-protocol.mdx +4 -3
- package/corpus/core/docs/content/messaging-internals.mdx +328 -0
- package/corpus/core/docs/content/messaging-recipes.mdx +194 -0
- package/corpus/core/docs/content/messaging.mdx +9 -307
- package/corpus/core/docs/content/multi-app-workspace.mdx +1 -1
- package/corpus/core/docs/content/multi-tenancy.mdx +1 -0
- package/corpus/core/docs/content/native-chat-ui.mdx +8 -0
- package/corpus/core/docs/content/notifications.mdx +18 -20
- package/corpus/core/docs/content/observability.mdx +1 -0
- package/corpus/core/docs/content/onboarding.mdx +20 -6
- package/corpus/core/docs/content/organizations-teams-permissions.mdx +99 -124
- package/corpus/core/docs/content/package-lifecycle.mdx +19 -7
- package/corpus/core/docs/content/progress.mdx +11 -0
- package/corpus/core/docs/content/real-time-collaboration.mdx +44 -3
- package/corpus/core/docs/content/recurring-jobs.mdx +14 -1
- package/corpus/core/docs/content/security.mdx +5 -2
- package/corpus/core/docs/content/server.mdx +2 -1
- package/corpus/core/docs/content/sharing.mdx +22 -3
- package/corpus/core/docs/content/skills-guide.mdx +62 -19
- package/corpus/core/docs/content/syncing-template-changes.mdx +9 -0
- package/corpus/core/docs/content/template-analytics-connectors.mdx +75 -0
- package/corpus/core/docs/content/template-analytics-dashboards.mdx +106 -0
- package/corpus/core/docs/content/template-analytics-developers.mdx +287 -0
- package/corpus/core/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
- package/corpus/core/docs/content/template-analytics.mdx +21 -263
- package/corpus/core/docs/content/template-assets-developers.mdx +456 -0
- package/corpus/core/docs/content/template-assets-generation.mdx +147 -0
- package/corpus/core/docs/content/template-assets-integrations.mdx +319 -0
- package/corpus/core/docs/content/template-assets-presets.mdx +185 -0
- package/corpus/core/docs/content/template-assets.mdx +12 -562
- package/corpus/core/docs/content/template-brain-agent.mdx +103 -0
- package/corpus/core/docs/content/template-brain-developers.mdx +379 -0
- package/corpus/core/docs/content/template-brain-knowledge.mdx +50 -0
- package/corpus/core/docs/content/template-brain-sources.mdx +163 -0
- package/corpus/core/docs/content/template-brain.mdx +30 -390
- package/corpus/core/docs/content/template-calendar-agent.mdx +133 -0
- package/corpus/core/docs/content/template-calendar-booking-links.mdx +73 -0
- package/corpus/core/docs/content/template-calendar-developers.mdx +366 -0
- package/corpus/core/docs/content/template-calendar-scheduling.mdx +128 -0
- package/corpus/core/docs/content/template-calendar.mdx +13 -260
- package/corpus/core/docs/content/template-chat-developers.mdx +88 -0
- package/corpus/core/docs/content/template-chat-first-edits.mdx +145 -0
- package/corpus/core/docs/content/template-chat.mdx +12 -77
- package/corpus/core/docs/content/template-clips-ai-and-editing.mdx +114 -0
- package/corpus/core/docs/content/template-clips-capture-everywhere.mdx +120 -0
- package/corpus/core/docs/content/template-clips-developers.mdx +373 -0
- package/corpus/core/docs/content/template-clips-sharing-and-teams.mdx +182 -0
- package/corpus/core/docs/content/template-clips.mdx +19 -508
- package/corpus/core/docs/content/template-content-databases.mdx +406 -0
- package/corpus/core/docs/content/template-content-developers.mdx +364 -0
- package/corpus/core/docs/content/template-content-editing.mdx +60 -0
- package/corpus/core/docs/content/template-content-sync.mdx +149 -0
- package/corpus/core/docs/content/template-content.mdx +21 -561
- package/corpus/core/docs/content/template-design-brand-and-figma.mdx +150 -0
- package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
- package/corpus/core/docs/content/template-design-developers.mdx +358 -0
- package/corpus/core/docs/content/template-design-quality-and-components.mdx +95 -0
- package/corpus/core/docs/content/template-design.mdx +20 -344
- package/corpus/core/docs/content/template-dispatch-developers.mdx +121 -0
- package/corpus/core/docs/content/template-dispatch-messaging-routing.mdx +114 -0
- package/corpus/core/docs/content/template-dispatch-operations.mdx +160 -0
- package/corpus/core/docs/content/template-dispatch-vault-integrations.mdx +316 -0
- package/corpus/core/docs/content/template-dispatch.mdx +24 -283
- package/corpus/core/docs/content/template-forms-building-publishing.mdx +135 -0
- package/corpus/core/docs/content/template-forms-developers.mdx +195 -0
- package/corpus/core/docs/content/template-forms-responses.mdx +120 -0
- package/corpus/core/docs/content/template-forms.mdx +21 -230
- package/corpus/core/docs/content/template-mail-agent.mdx +114 -0
- package/corpus/core/docs/content/template-mail-developers.mdx +356 -0
- package/corpus/core/docs/content/template-mail-drafts-and-queue.mdx +103 -0
- package/corpus/core/docs/content/template-mail-inbox.mdx +118 -0
- package/corpus/core/docs/content/template-mail.mdx +23 -274
- package/corpus/core/docs/content/template-plan-automations.mdx +213 -0
- package/corpus/core/docs/content/template-plan-developers.mdx +703 -0
- package/corpus/core/docs/content/template-plan-local-and-desktop.mdx +236 -0
- package/corpus/core/docs/content/template-plan-review-workflow.mdx +180 -0
- package/corpus/core/docs/content/template-plan.mdx +60 -910
- package/corpus/core/docs/content/template-slides-agent.mdx +102 -0
- package/corpus/core/docs/content/template-slides-design-and-media.mdx +94 -0
- package/corpus/core/docs/content/template-slides-developers.mdx +488 -0
- package/corpus/core/docs/content/template-slides-editing.mdx +56 -0
- package/corpus/core/docs/content/template-slides.mdx +20 -362
- package/corpus/core/docs/content/toolkit-capability-packages.mdx +38 -13
- package/corpus/core/docs/content/toolkit-context-knowledge.mdx +49 -9
- package/corpus/core/docs/content/toolkit-editors-canvases.mdx +72 -10
- package/corpus/core/docs/content/toolkit-resources.mdx +16 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +3 -3
- package/corpus/core/docs/content/toolkit-sharing.mdx +5 -7
- package/corpus/core/docs/content/using-your-agent.mdx +25 -2
- package/corpus/core/docs/content/voice-input.mdx +11 -7
- package/corpus/core/docs/content/what-is-agent-native.mdx +1 -0
- package/corpus/core/docs/content/workspace-connections.mdx +21 -11
- package/corpus/core/docs/content/workspace-management.mdx +1 -1
- package/corpus/core/package.json +1 -3
- package/corpus/core/src/a2a/client.ts +4 -2
- package/corpus/core/src/agent/action-warnings.ts +103 -0
- package/corpus/core/src/agent/durable-background.ts +42 -5
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +58 -6
- package/corpus/core/src/agent/engine/anthropic-engine.ts +51 -8
- package/corpus/core/src/agent/engine/builder-engine.ts +56 -18
- package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +10 -9
- package/corpus/core/src/agent/engine/credential-errors.ts +11 -0
- package/corpus/core/src/agent/engine/error-detail.ts +39 -0
- package/corpus/core/src/agent/engine/prompt-cache.ts +44 -0
- package/corpus/core/src/agent/engine/registry.ts +22 -30
- package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +2 -1
- package/corpus/core/src/agent/engine/translate-anthropic.ts +99 -0
- package/corpus/core/src/agent/loop-settings.ts +94 -7
- package/corpus/core/src/agent/production-agent.ts +667 -157
- package/corpus/core/src/agent/run-loop-with-resume.ts +27 -1
- package/corpus/core/src/agent/run-manager.ts +229 -39
- package/corpus/core/src/agent/run-store.ts +397 -64
- package/corpus/core/src/agent/thread-data-builder.ts +5 -1
- package/corpus/core/src/agent/types.ts +23 -6
- package/corpus/core/src/application-state/script-helpers.ts +5 -2
- package/corpus/core/src/cli/agents.ts +69 -1
- package/corpus/core/src/cli/app-skill.ts +1 -1
- package/corpus/core/src/cli/code-agent-executor.ts +7 -3
- package/corpus/core/src/cli/design-connect.ts +82 -8
- package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
- package/corpus/core/src/client/AssistantChat.tsx +623 -607
- package/corpus/core/src/client/agent-chat-adapter.ts +176 -29
- package/corpus/core/src/client/chat/message-components.tsx +13 -0
- package/corpus/core/src/client/embed-auth.ts +3 -1
- package/corpus/core/src/client/integrations/IntegrationCard.tsx +41 -24
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +37 -21
- package/corpus/core/src/client/integrations/webhook-url.ts +29 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +41 -27
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +7 -0
- package/corpus/core/src/client/org/TeamPage.tsx +144 -14
- package/corpus/core/src/client/org/hooks.ts +27 -0
- package/corpus/core/src/client/org/index.ts +2 -0
- package/corpus/core/src/client/require-session.tsx +40 -29
- package/corpus/core/src/client/session-replay.ts +1 -1
- package/corpus/core/src/client/settings/DemoModeSection.tsx +0 -5
- package/corpus/core/src/client/settings/SecretsSection.tsx +47 -42
- package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
- package/corpus/core/src/client/sse-event-processor.ts +83 -8
- package/corpus/core/src/client/use-action.ts +22 -13
- package/corpus/core/src/client/use-agent-engine-configured.ts +36 -4
- package/corpus/core/src/client/use-db-sync.ts +21 -1
- package/corpus/core/src/credentials/index.ts +124 -2
- package/corpus/core/src/deploy/build.ts +93 -30
- package/corpus/core/src/deploy/workspace-deploy.ts +21 -16
- package/corpus/core/src/guards/no-localhost-fallback.ts +76 -14
- package/corpus/core/src/integrations/google-docs-poller.ts +19 -12
- package/corpus/core/src/integrations/webhook-handler.ts +56 -33
- package/corpus/core/src/jobs/scheduler.ts +57 -23
- package/corpus/core/src/localization/default-messages.ts +23 -1
- package/corpus/core/src/observability/evals.ts +7 -8
- package/corpus/core/src/observability/traces.ts +2 -0
- package/corpus/core/src/org/accept-pending.ts +2 -2
- package/corpus/core/src/org/active-org.ts +73 -0
- package/corpus/core/src/org/auto-join-domain.ts +7 -2
- package/corpus/core/src/org/context.ts +169 -66
- package/corpus/core/src/org/handlers.ts +148 -10
- package/corpus/core/src/org/plugin.ts +8 -1
- package/corpus/core/src/org/types.ts +6 -1
- package/corpus/core/src/provider-api/index.ts +6 -1
- package/corpus/core/src/resources/handlers.ts +2 -6
- package/corpus/core/src/resources/script-helpers.ts +2 -1
- package/corpus/core/src/scripts/chat/search-chats.ts +5 -2
- package/corpus/core/src/scripts/describe-workspace-apps.ts +59 -0
- package/corpus/core/src/scripts/resources/delete-memory.ts +5 -2
- package/corpus/core/src/scripts/resources/delete.ts +5 -2
- package/corpus/core/src/scripts/resources/effective.ts +5 -2
- package/corpus/core/src/scripts/resources/list.ts +5 -2
- package/corpus/core/src/scripts/resources/read.ts +5 -2
- package/corpus/core/src/scripts/resources/save-memory.ts +5 -2
- package/corpus/core/src/scripts/resources/write.ts +5 -2
- package/corpus/core/src/server/agent-capabilities.ts +147 -0
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +11 -13
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +183 -57
- package/corpus/core/src/server/agent-chat/script-entries.ts +20 -7
- package/corpus/core/src/server/agent-chat-plugin.ts +27 -0
- package/corpus/core/src/server/auth.ts +38 -32
- package/corpus/core/src/server/core-routes-plugin.ts +229 -179
- package/corpus/core/src/server/credential-provider.ts +196 -44
- package/corpus/core/src/server/embed-session.ts +10 -0
- package/corpus/core/src/server/framework-request-handler.ts +43 -0
- package/corpus/core/src/server/google-auth-plugin.ts +13 -450
- package/corpus/core/src/server/index.ts +4 -1
- package/corpus/core/src/server/onboarding-html.ts +20 -56
- package/corpus/core/src/server/open-route.ts +6 -1
- package/corpus/core/src/server/poll.ts +1 -1
- package/corpus/core/src/server/prompts/framework-core-compact.ts +5 -5
- package/corpus/core/src/server/prompts/framework-core.ts +7 -9
- package/corpus/core/src/server/prompts/shared-rules.ts +20 -9
- package/corpus/core/src/server/request-context.ts +58 -2
- package/corpus/core/src/server/scoped-key-storage.ts +1 -1
- package/corpus/core/src/settings/org-settings.ts +9 -0
- package/corpus/core/src/settings/store.ts +29 -0
- package/corpus/core/src/shared/index.ts +13 -0
- package/corpus/core/src/shared/sign-in-journey.ts +331 -0
- package/corpus/core/src/styles/agent-native.css +8 -0
- package/corpus/core/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/chat/AGENTS.md +8 -0
- package/corpus/core/src/templates/chat/app/entry.client.tsx +3 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/default/AGENTS.md +68 -195
- package/corpus/core/src/templates/default/app/entry.client.tsx +3 -0
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +8 -0
- package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +62 -124
- package/corpus/core/src/templates/workspace-root/AGENTS.md +6 -1
- package/corpus/core/src/triggers/dispatcher.ts +28 -17
- package/corpus/core/src/vite/client.ts +20 -8
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +41 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +50 -22
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +8 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/analytics/.builder/skills/charts/SKILL.md +2 -2
- package/corpus/templates/analytics/actions/delete-dashboard-view.ts +24 -0
- package/corpus/templates/analytics/actions/delete-user-pref.ts +22 -0
- package/corpus/templates/analytics/actions/generate-chart.ts +8 -245
- package/corpus/templates/analytics/actions/get-theme.ts +27 -0
- package/corpus/templates/analytics/actions/get-user-pref.ts +22 -0
- package/corpus/templates/analytics/actions/list-dashboard-views.ts +25 -0
- package/corpus/templates/analytics/actions/save-dashboard-view.ts +33 -0
- package/corpus/templates/analytics/actions/set-theme.ts +22 -0
- package/corpus/templates/analytics/actions/set-user-pref.ts +24 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +134 -27
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -9
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +0 -17
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +10 -5
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +22 -52
- package/corpus/templates/analytics/app/hooks/use-user-pref.ts +21 -31
- package/corpus/templates/analytics/app/i18n-data.ts +10 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dual-axis.ts +73 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +8 -27
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +0 -57
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
- package/corpus/templates/analytics/app/root.tsx +0 -28
- package/corpus/templates/analytics/changelog/2026-07-26-error-issues-now-group-by-message-as-well-as-stack-frame-and.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-line-area-and-bar-dashboard-panels-can-plot-series-on-a-seco.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-scheduled-dashboard-email-reports-now-arrive-complete-and-re.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-session-replays-now-detect-rage-clicks-so-the-rage-click-fil.md +6 -0
- package/corpus/templates/analytics/docs/error-capture.md +8 -4
- package/corpus/templates/analytics/package.json +1 -2
- package/corpus/templates/analytics/scripts/preview-dashboard-report.ts +221 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -32
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +1168 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +111 -1358
- package/corpus/templates/analytics/server/lib/error-capture.ts +32 -15
- package/corpus/templates/analytics/server/lib/report-chart-svg.ts +901 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +77 -1
- package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -4
- package/corpus/templates/assets/.agents/skills/a2a-assets/SKILL.md +28 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/assets/.agents/skills/assets-navigation/SKILL.md +46 -0
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -0
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +28 -0
- package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +9 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +11 -0
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/assets/AGENTS.md +58 -125
- package/corpus/templates/assets/actions/variant-slots.ts +8 -4
- package/corpus/templates/assets/app/entry.client.tsx +3 -0
- package/corpus/templates/assets/package.json +0 -2
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +78 -4
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +15 -3
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/brain/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/brain/AGENTS.md +73 -119
- package/corpus/templates/brain/app/entry.client.tsx +3 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +56 -3
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/calendar/AGENTS.md +22 -45
- package/corpus/templates/calendar/app/entry.client.tsx +3 -0
- package/corpus/templates/calendar/server/handlers/events.ts +0 -364
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/chat/AGENTS.md +8 -0
- package/corpus/templates/chat/app/entry.client.tsx +3 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +42 -0
- package/corpus/templates/clips/.agents/skills/brain-export/SKILL.md +59 -0
- package/corpus/templates/clips/.agents/skills/bug-reports/SKILL.md +37 -0
- package/corpus/templates/clips/.agents/skills/crm-call-evidence/SKILL.md +41 -0
- package/corpus/templates/clips/.agents/skills/dictate/SKILL.md +4 -0
- package/corpus/templates/clips/.agents/skills/external-integrations/SKILL.md +45 -0
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +9 -0
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +45 -0
- package/corpus/templates/clips/.agents/skills/screen-memory/SKILL.md +43 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +38 -1
- package/corpus/templates/clips/AGENTS.md +82 -224
- package/corpus/templates/clips/actions/create-recording.ts +4 -0
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +6 -10
- package/corpus/templates/clips/app/routes/invite.$token.tsx +6 -5
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +4 -5
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -8
- package/corpus/templates/clips/changelog/2026-07-26-long-agent-chat-turns-now-finish-instead-of-stopping-partway.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-26-recordings-no-longer-get-stuck-on-uploading-uploads-now-hold.md +6 -0
- package/corpus/templates/clips/server/db/schema.ts +3 -0
- package/corpus/templates/clips/server/jobs/brain-export.ts +4 -0
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +0 -52
- package/corpus/templates/clips/server/lib/upload-lease.ts +241 -0
- package/corpus/templates/clips/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/clips/server/plugins/db.ts +18 -347
- package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +7 -1
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +123 -126
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +4 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +118 -0
- package/corpus/templates/clips/server/routes/api/uploads/reap.post.ts +69 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/content/.agents/skills/content/SKILL.md +4 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +8 -0
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +55 -0
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +12 -1
- package/corpus/templates/content/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/content/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/content/AGENTS.md +63 -131
- package/corpus/templates/content/app/routes/_app.tsx +4 -4
- package/corpus/templates/content/server/routes/api/notion/callback.get.ts +6 -24
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +15 -0
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +12 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/design/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/design/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +201 -102
- package/corpus/templates/design/AGENTS.md +58 -71
- package/corpus/templates/design/actions/open-visual-edit.ts +111 -2
- package/corpus/templates/design/app/components/design/AddLocalhostScreenDialog.tsx +236 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1 -1
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2 -2
- package/corpus/templates/design/app/entry.client.tsx +3 -0
- package/corpus/templates/design/app/i18n-data.ts +180 -0
- package/corpus/templates/design/app/pages/Present.tsx +6 -9
- package/corpus/templates/design/app/pages/VisualEdit.tsx +4 -7
- package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +20 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/dispatch/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/dispatch/app/entry.client.tsx +3 -0
- package/corpus/templates/dispatch/server/plugins/identity-sso.ts +27 -16
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/forms/DEVELOPING.md +1 -1
- package/corpus/templates/forms/app/entry.client.tsx +3 -0
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +3 -5
- package/corpus/templates/forms/app/routes/_app.tsx +4 -4
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/macros/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/macros/app/entry.client.tsx +3 -0
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +10 -0
- package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +3 -0
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +26 -2
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +37 -0
- package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +58 -0
- package/corpus/templates/mail/.agents/skills/mail-backends/SKILL.md +33 -0
- package/corpus/templates/mail/.agents/skills/provider-api-scans/SKILL.md +39 -0
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/mail/AGENTS.md +74 -143
- package/corpus/templates/mail/actions/create-alias.ts +36 -0
- package/corpus/templates/mail/actions/create-automation.ts +28 -0
- package/corpus/templates/mail/actions/create-scheduled-job.ts +45 -0
- package/corpus/templates/mail/actions/delete-alias.ts +26 -0
- package/corpus/templates/mail/actions/delete-automation.ts +21 -0
- package/corpus/templates/mail/actions/get-automation-settings.ts +32 -0
- package/corpus/templates/mail/actions/get-mail-preferences.ts +18 -0
- package/corpus/templates/mail/actions/list-aliases.ts +17 -0
- package/corpus/templates/mail/actions/list-automations.ts +18 -0
- package/corpus/templates/mail/actions/list-scheduled-jobs.ts +18 -0
- package/corpus/templates/mail/actions/update-alias.ts +37 -0
- package/corpus/templates/mail/actions/update-automation-settings.ts +33 -0
- package/corpus/templates/mail/actions/update-automation.ts +33 -0
- package/corpus/templates/mail/actions/update-mail-preferences.ts +68 -0
- package/corpus/templates/mail/actions/update-scheduled-job.ts +25 -0
- package/corpus/templates/mail/app/entry.client.tsx +3 -0
- package/corpus/templates/mail/app/hooks/use-aliases.ts +6 -36
- package/corpus/templates/mail/app/hooks/use-automations.ts +9 -16
- package/corpus/templates/mail/app/hooks/use-emails.ts +6 -5
- package/corpus/templates/mail/app/hooks/use-scheduled-jobs.ts +12 -15
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +15 -9
- package/corpus/templates/mail/server/handlers/automations.ts +5 -142
- package/corpus/templates/mail/server/handlers/emails.ts +1 -56
- package/corpus/templates/mail/server/handlers/scheduled-jobs.ts +0 -134
- package/corpus/templates/mail/server/lib/aliases.ts +18 -0
- package/corpus/templates/mail/server/lib/automations.ts +104 -0
- package/corpus/templates/mail/server/lib/jobs.ts +34 -0
- package/corpus/templates/mail/server/lib/mail-settings.ts +43 -0
- package/corpus/templates/mail/shared/automation-schema.ts +10 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/plan/.agents/skills/plan-authoring-flow/SKILL.md +98 -0
- package/corpus/templates/plan/.agents/skills/plan-browser-editing/SKILL.md +42 -0
- package/corpus/templates/plan/.agents/skills/plan-comments-and-feedback/SKILL.md +68 -0
- package/corpus/templates/plan/.agents/skills/plan-events/SKILL.md +22 -0
- package/corpus/templates/plan/.agents/skills/plan-hosted-writes/SKILL.md +42 -0
- package/corpus/templates/plan/.agents/skills/plan-local-codebase-chat/SKILL.md +38 -0
- package/corpus/templates/plan/.agents/skills/plan-review-recaps/SKILL.md +25 -0
- package/corpus/templates/plan/.agents/skills/plan-source-sync/SKILL.md +68 -0
- package/corpus/templates/plan/.agents/skills/plan-version-history/SKILL.md +25 -0
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/plan/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/plan/AGENTS.md +64 -296
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +9 -8
- package/corpus/templates/plan/app/pages/PlansPage.tsx +5 -10
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +7 -7
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -2
- package/corpus/templates/slides/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/slides/DEVELOPING.md +3 -3
- package/corpus/templates/slides/actions/_deck-write.ts +52 -0
- package/corpus/templates/slides/actions/add-deck.ts +73 -0
- package/corpus/templates/slides/actions/delete-deck.ts +60 -0
- package/corpus/templates/slides/actions/get-deck.ts +3 -1
- package/corpus/templates/slides/actions/save-deck.ts +144 -0
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +27 -20
- package/corpus/templates/slides/app/context/DeckContext.tsx +173 -100
- package/corpus/templates/slides/app/pages/Index.tsx +3 -6
- package/corpus/templates/slides/app/routes/slide.tsx +16 -12
- package/corpus/templates/slides/changelog/2026-07-26-a-newly-created-deck-now-appears-in-the-deck-list-right-away.md +6 -0
- package/corpus/templates/slides/server/handlers/decks.ts +2 -378
- package/corpus/templates/tasks/.agents/skills/action-reference/SKILL.md +47 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +19 -1
- package/corpus/templates/tasks/.agents/skills/custom-fields/SKILL.md +63 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/tasks/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/tasks/.agents/skills/store-conventions/SKILL.md +45 -0
- package/corpus/templates/tasks/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/tasks/.agents/skills/task-inbox-workflow/SKILL.md +66 -0
- package/corpus/templates/tasks/AGENTS.md +48 -113
- package/corpus/templates/tasks/app/entry.client.tsx +3 -0
- package/corpus/toolkit/CHANGELOG.md +12 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/PromptComposer.tsx +23 -20
- package/dist/a2a/client.d.ts +3 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +4 -2
- package/dist/a2a/client.js.map +1 -1
- package/dist/agent/action-warnings.d.ts +27 -0
- package/dist/agent/action-warnings.d.ts.map +1 -0
- package/dist/agent/action-warnings.js +73 -0
- package/dist/agent/action-warnings.js.map +1 -0
- package/dist/agent/durable-background.d.ts +8 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +37 -5
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +47 -6
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +41 -9
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +46 -19
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -1
- package/dist/agent/engine/continuation-dispatch-retry.js +11 -9
- package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -1
- package/dist/agent/engine/credential-errors.d.ts +6 -0
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +10 -0
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/engine/error-detail.d.ts +2 -0
- package/dist/agent/engine/error-detail.d.ts.map +1 -0
- package/dist/agent/engine/error-detail.js +37 -0
- package/dist/agent/engine/error-detail.js.map +1 -0
- package/dist/agent/engine/prompt-cache.d.ts +34 -0
- package/dist/agent/engine/prompt-cache.d.ts.map +1 -0
- package/dist/agent/engine/prompt-cache.js +39 -0
- package/dist/agent/engine/prompt-cache.js.map +1 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +23 -33
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts +1 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -1
- package/dist/agent/engine/tool-call-journal-seed.js +2 -2
- package/dist/agent/engine/tool-call-journal-seed.js.map +1 -1
- package/dist/agent/engine/translate-anthropic.d.ts +28 -0
- package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
- package/dist/agent/engine/translate-anthropic.js +75 -0
- package/dist/agent/engine/translate-anthropic.js.map +1 -1
- package/dist/agent/loop-settings.d.ts +35 -2
- package/dist/agent/loop-settings.d.ts.map +1 -1
- package/dist/agent/loop-settings.js +71 -8
- package/dist/agent/loop-settings.js.map +1 -1
- package/dist/agent/production-agent.d.ts +105 -20
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +516 -123
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +24 -2
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +52 -9
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +191 -36
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +87 -14
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +331 -59
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +6 -1
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +18 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +9 -5
- package/dist/agent/types.js.map +1 -1
- package/dist/application-state/script-helpers.d.ts.map +1 -1
- package/dist/application-state/script-helpers.js +2 -2
- package/dist/application-state/script-helpers.js.map +1 -1
- package/dist/cli/agents.d.ts +2 -0
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +48 -1
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/app-skill.js +1 -1
- package/dist/cli/app-skill.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +3 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +73 -8
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.js +169 -24
- package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +135 -125
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +17 -0
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +141 -31
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +9 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +12 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/embed-auth.d.ts.map +1 -1
- package/dist/client/embed-auth.js +3 -1
- package/dist/client/embed-auth.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +9 -4
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +13 -7
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/integrations/webhook-url.d.ts +7 -0
- package/dist/client/integrations/webhook-url.d.ts.map +1 -0
- package/dist/client/integrations/webhook-url.js +32 -0
- package/dist/client/integrations/webhook-url.js.map +1 -0
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +13 -11
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +52 -13
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +9 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +24 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +1 -1
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/require-session.d.ts +12 -17
- package/dist/client/require-session.d.ts.map +1 -1
- package/dist/client/require-session.js +36 -23
- package/dist/client/require-session.js.map +1 -1
- package/dist/client/session-replay.js +1 -1
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/DemoModeSection.d.ts +0 -1
- package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
- package/dist/client/settings/DemoModeSection.js +0 -4
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +12 -8
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts +0 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +1 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +33 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +83 -8
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +23 -14
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +9 -3
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +30 -3
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +3 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +18 -1
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/credentials/index.d.ts +29 -1
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +111 -2
- package/dist/credentials/index.js.map +1 -1
- package/dist/deploy/build.d.ts +14 -3
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +81 -24
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts +15 -0
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +19 -18
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/guards/no-localhost-fallback.d.ts +7 -0
- package/dist/guards/no-localhost-fallback.d.ts.map +1 -1
- package/dist/guards/no-localhost-fallback.js +75 -16
- package/dist/guards/no-localhost-fallback.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +8 -3
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +22 -4
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +17 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +60 -33
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +17 -1
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +17 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/evals.d.ts.map +1 -1
- package/dist/observability/evals.js +7 -10
- package/dist/observability/evals.js.map +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/observability/traces.d.ts +2 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/accept-pending.js +2 -2
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/active-org.d.ts +16 -0
- package/dist/org/active-org.d.ts.map +1 -0
- package/dist/org/active-org.js +57 -0
- package/dist/org/active-org.js.map +1 -0
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +3 -2
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts +19 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +159 -71
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +24 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +129 -10
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.d.ts +2 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +9 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/types.d.ts +6 -1
- package/dist/org/types.d.ts.map +1 -1
- package/dist/org/types.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +3 -2
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +2 -7
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +2 -2
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +2 -2
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/scripts/describe-workspace-apps.d.ts +4 -0
- package/dist/scripts/describe-workspace-apps.d.ts.map +1 -0
- package/dist/scripts/describe-workspace-apps.js +34 -0
- package/dist/scripts/describe-workspace-apps.js.map +1 -0
- package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
- package/dist/scripts/resources/delete-memory.js +2 -2
- package/dist/scripts/resources/delete-memory.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +2 -2
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/effective.d.ts.map +1 -1
- package/dist/scripts/resources/effective.js +2 -2
- package/dist/scripts/resources/effective.js.map +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +2 -2
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +2 -2
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/save-memory.d.ts.map +1 -1
- package/dist/scripts/resources/save-memory.js +2 -2
- package/dist/scripts/resources/save-memory.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +2 -2
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-capabilities.d.ts +21 -0
- package/dist/server/agent-capabilities.d.ts.map +1 -0
- package/dist/server/agent-capabilities.js +106 -0
- package/dist/server/agent-capabilities.js.map +1 -0
- package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +11 -13
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +32 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +117 -56
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
- package/dist/server/agent-chat/script-entries.js +18 -8
- package/dist/server/agent-chat/script-entries.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +27 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts +9 -9
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +32 -33
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +45 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +162 -139
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +35 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +155 -40
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/embed-session.d.ts.map +1 -1
- package/dist/server/embed-session.js +10 -0
- package/dist/server/embed-session.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +38 -0
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +12 -444
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +20 -56
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +6 -1
- package/dist/server/open-route.js.map +1 -1
- package/dist/server/poll.js +1 -1
- package/dist/server/poll.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +5 -6
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +7 -10
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/prompts/shared-rules.d.ts +20 -2
- package/dist/server/prompts/shared-rules.d.ts.map +1 -1
- package/dist/server/prompts/shared-rules.js +20 -10
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/request-context.d.ts +26 -1
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +52 -2
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/scoped-key-storage.js +1 -1
- package/dist/server/scoped-key-storage.js.map +1 -1
- package/dist/settings/org-settings.d.ts +2 -0
- package/dist/settings/org-settings.d.ts.map +1 -1
- package/dist/settings/org-settings.js +5 -1
- package/dist/settings/org-settings.js.map +1 -1
- package/dist/settings/store.d.ts +6 -0
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +25 -0
- package/dist/settings/store.js.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/sign-in-journey.d.ts +102 -0
- package/dist/shared/sign-in-journey.d.ts.map +1 -0
- package/dist/shared/sign-in-journey.js +269 -0
- package/dist/shared/sign-in-journey.js.map +1 -0
- package/dist/styles/agent-native.css +8 -0
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/dist/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/dist/templates/chat/AGENTS.md +8 -0
- package/dist/templates/chat/app/entry.client.tsx +3 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/default/AGENTS.md +68 -195
- package/dist/templates/default/app/entry.client.tsx +3 -0
- package/dist/templates/default/app/i18n/ar-SA.ts +8 -0
- package/dist/templates/default/app/i18n/de-DE.ts +8 -0
- package/dist/templates/default/app/i18n/en-US.ts +8 -0
- package/dist/templates/default/app/i18n/es-ES.ts +8 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +8 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +8 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +8 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +8 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +8 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +8 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +8 -0
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/dist/templates/workspace-core/AGENTS.md +62 -124
- package/dist/templates/workspace-root/AGENTS.md +6 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +10 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +18 -8
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.mdx +33 -20
- package/docs/content/agent-mentions.mdx +30 -19
- package/docs/content/agent-native-toolkit.mdx +8 -6
- package/docs/content/agent-resources.mdx +11 -0
- package/docs/content/agent-surfaces.mdx +41 -30
- package/docs/content/audit-log.mdx +78 -0
- package/docs/content/authentication.mdx +7 -5
- package/docs/content/automations.mdx +15 -9
- package/docs/content/client.mdx +11 -11
- package/docs/content/cloneable-saas.mdx +7 -1
- package/docs/content/code-agents-ui.mdx +9 -1
- package/docs/content/components.mdx +7 -0
- package/docs/content/context-awareness.mdx +1 -0
- package/docs/content/creating-templates.mdx +9 -1
- package/docs/content/custom-design-system.mdx +8 -0
- package/docs/content/data-programs.mdx +6 -0
- package/docs/content/deployment.mdx +2 -0
- package/docs/content/doctor.mdx +5 -3
- package/docs/content/extensions.mdx +26 -0
- package/docs/content/external-agents-catalog.mdx +533 -0
- package/docs/content/external-agents.mdx +20 -514
- package/docs/content/faq.mdx +2 -2
- package/docs/content/file-uploads.mdx +44 -0
- package/docs/content/frames.mdx +2 -2
- package/docs/content/generative-ui.mdx +8 -0
- package/docs/content/getting-started.mdx +45 -17
- package/docs/content/human-approval.mdx +9 -0
- package/docs/content/integrations.mdx +4 -3
- package/docs/content/internationalization.mdx +4 -11
- package/docs/content/key-concepts.mdx +1 -1
- package/docs/content/local-file-mode.mdx +5 -0
- package/docs/content/mcp-apps.mdx +2 -1
- package/docs/content/mcp-clients.mdx +32 -1
- package/docs/content/mcp-protocol.mdx +4 -3
- package/docs/content/messaging-internals.mdx +328 -0
- package/docs/content/messaging-recipes.mdx +194 -0
- package/docs/content/messaging.mdx +9 -307
- package/docs/content/multi-app-workspace.mdx +1 -1
- package/docs/content/multi-tenancy.mdx +1 -0
- package/docs/content/native-chat-ui.mdx +8 -0
- package/docs/content/notifications.mdx +18 -20
- package/docs/content/observability.mdx +1 -0
- package/docs/content/onboarding.mdx +20 -6
- package/docs/content/organizations-teams-permissions.mdx +99 -124
- package/docs/content/package-lifecycle.mdx +19 -7
- package/docs/content/progress.mdx +11 -0
- package/docs/content/real-time-collaboration.mdx +44 -3
- package/docs/content/recurring-jobs.mdx +14 -1
- package/docs/content/security.mdx +5 -2
- package/docs/content/server.mdx +2 -1
- package/docs/content/sharing.mdx +22 -3
- package/docs/content/skills-guide.mdx +62 -19
- package/docs/content/syncing-template-changes.mdx +9 -0
- package/docs/content/template-analytics-connectors.mdx +75 -0
- package/docs/content/template-analytics-dashboards.mdx +106 -0
- package/docs/content/template-analytics-developers.mdx +287 -0
- package/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
- package/docs/content/template-analytics.mdx +21 -263
- package/docs/content/template-assets-developers.mdx +456 -0
- package/docs/content/template-assets-generation.mdx +147 -0
- package/docs/content/template-assets-integrations.mdx +319 -0
- package/docs/content/template-assets-presets.mdx +185 -0
- package/docs/content/template-assets.mdx +12 -562
- package/docs/content/template-brain-agent.mdx +103 -0
- package/docs/content/template-brain-developers.mdx +379 -0
- package/docs/content/template-brain-knowledge.mdx +50 -0
- package/docs/content/template-brain-sources.mdx +163 -0
- package/docs/content/template-brain.mdx +30 -390
- package/docs/content/template-calendar-agent.mdx +133 -0
- package/docs/content/template-calendar-booking-links.mdx +73 -0
- package/docs/content/template-calendar-developers.mdx +366 -0
- package/docs/content/template-calendar-scheduling.mdx +128 -0
- package/docs/content/template-calendar.mdx +13 -260
- package/docs/content/template-chat-developers.mdx +88 -0
- package/docs/content/template-chat-first-edits.mdx +145 -0
- package/docs/content/template-chat.mdx +12 -77
- package/docs/content/template-clips-ai-and-editing.mdx +114 -0
- package/docs/content/template-clips-capture-everywhere.mdx +120 -0
- package/docs/content/template-clips-developers.mdx +373 -0
- package/docs/content/template-clips-sharing-and-teams.mdx +182 -0
- package/docs/content/template-clips.mdx +19 -508
- package/docs/content/template-content-databases.mdx +406 -0
- package/docs/content/template-content-developers.mdx +364 -0
- package/docs/content/template-content-editing.mdx +60 -0
- package/docs/content/template-content-sync.mdx +149 -0
- package/docs/content/template-content.mdx +21 -561
- package/docs/content/template-design-brand-and-figma.mdx +150 -0
- package/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
- package/docs/content/template-design-developers.mdx +358 -0
- package/docs/content/template-design-quality-and-components.mdx +95 -0
- package/docs/content/template-design.mdx +20 -344
- package/docs/content/template-dispatch-developers.mdx +121 -0
- package/docs/content/template-dispatch-messaging-routing.mdx +114 -0
- package/docs/content/template-dispatch-operations.mdx +160 -0
- package/docs/content/template-dispatch-vault-integrations.mdx +316 -0
- package/docs/content/template-dispatch.mdx +24 -283
- package/docs/content/template-forms-building-publishing.mdx +135 -0
- package/docs/content/template-forms-developers.mdx +195 -0
- package/docs/content/template-forms-responses.mdx +120 -0
- package/docs/content/template-forms.mdx +21 -230
- package/docs/content/template-mail-agent.mdx +114 -0
- package/docs/content/template-mail-developers.mdx +356 -0
- package/docs/content/template-mail-drafts-and-queue.mdx +103 -0
- package/docs/content/template-mail-inbox.mdx +118 -0
- package/docs/content/template-mail.mdx +23 -274
- package/docs/content/template-plan-automations.mdx +213 -0
- package/docs/content/template-plan-developers.mdx +703 -0
- package/docs/content/template-plan-local-and-desktop.mdx +236 -0
- package/docs/content/template-plan-review-workflow.mdx +180 -0
- package/docs/content/template-plan.mdx +60 -910
- package/docs/content/template-slides-agent.mdx +102 -0
- package/docs/content/template-slides-design-and-media.mdx +94 -0
- package/docs/content/template-slides-developers.mdx +488 -0
- package/docs/content/template-slides-editing.mdx +56 -0
- package/docs/content/template-slides.mdx +20 -362
- package/docs/content/toolkit-capability-packages.mdx +38 -13
- package/docs/content/toolkit-context-knowledge.mdx +49 -9
- package/docs/content/toolkit-editors-canvases.mdx +72 -10
- package/docs/content/toolkit-resources.mdx +16 -0
- package/docs/content/toolkit-settings.mdx +3 -3
- package/docs/content/toolkit-sharing.mdx +5 -7
- package/docs/content/using-your-agent.mdx +25 -2
- package/docs/content/voice-input.mdx +11 -7
- package/docs/content/what-is-agent-native.mdx +1 -0
- package/docs/content/workspace-connections.mdx +21 -11
- package/docs/content/workspace-management.mdx +1 -1
- package/package.json +2 -4
- package/src/a2a/client.ts +4 -2
- package/src/agent/action-warnings.ts +103 -0
- package/src/agent/durable-background.ts +42 -5
- package/src/agent/engine/ai-sdk-engine.ts +58 -6
- package/src/agent/engine/anthropic-engine.ts +51 -8
- package/src/agent/engine/builder-engine.ts +56 -18
- package/src/agent/engine/continuation-dispatch-retry.ts +10 -9
- package/src/agent/engine/credential-errors.ts +11 -0
- package/src/agent/engine/error-detail.ts +39 -0
- package/src/agent/engine/prompt-cache.ts +44 -0
- package/src/agent/engine/registry.ts +22 -30
- package/src/agent/engine/tool-call-journal-seed.ts +2 -1
- package/src/agent/engine/translate-anthropic.ts +99 -0
- package/src/agent/loop-settings.ts +94 -7
- package/src/agent/production-agent.ts +667 -157
- package/src/agent/run-loop-with-resume.ts +27 -1
- package/src/agent/run-manager.ts +229 -39
- package/src/agent/run-store.ts +397 -64
- package/src/agent/thread-data-builder.ts +5 -1
- package/src/agent/types.ts +23 -6
- package/src/application-state/script-helpers.ts +5 -2
- package/src/cli/agents.ts +69 -1
- package/src/cli/app-skill.ts +1 -1
- package/src/cli/code-agent-executor.ts +7 -3
- package/src/cli/design-connect.ts +82 -8
- package/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
- package/src/client/AssistantChat.tsx +623 -607
- package/src/client/agent-chat-adapter.ts +176 -29
- package/src/client/chat/message-components.tsx +13 -0
- package/src/client/embed-auth.ts +3 -1
- package/src/client/integrations/IntegrationCard.tsx +41 -24
- package/src/client/integrations/IntegrationsPanel.tsx +37 -21
- package/src/client/integrations/webhook-url.ts +29 -0
- package/src/client/org/OrgSwitcher.tsx +41 -27
- package/src/client/org/RequireActiveOrg.tsx +7 -0
- package/src/client/org/TeamPage.tsx +144 -14
- package/src/client/org/hooks.ts +27 -0
- package/src/client/org/index.ts +2 -0
- package/src/client/require-session.tsx +40 -29
- package/src/client/session-replay.ts +1 -1
- package/src/client/settings/DemoModeSection.tsx +0 -5
- package/src/client/settings/SecretsSection.tsx +47 -42
- package/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
- package/src/client/sse-event-processor.ts +83 -8
- package/src/client/use-action.ts +22 -13
- package/src/client/use-agent-engine-configured.ts +36 -4
- package/src/client/use-db-sync.ts +21 -1
- package/src/credentials/index.ts +124 -2
- package/src/deploy/build.ts +93 -30
- package/src/deploy/workspace-deploy.ts +21 -16
- package/src/guards/no-localhost-fallback.ts +76 -14
- package/src/integrations/google-docs-poller.ts +19 -12
- package/src/integrations/webhook-handler.ts +56 -33
- package/src/jobs/scheduler.ts +57 -23
- package/src/localization/default-messages.ts +23 -1
- package/src/observability/evals.ts +7 -8
- package/src/observability/traces.ts +2 -0
- package/src/org/accept-pending.ts +2 -2
- package/src/org/active-org.ts +73 -0
- package/src/org/auto-join-domain.ts +7 -2
- package/src/org/context.ts +169 -66
- package/src/org/handlers.ts +148 -10
- package/src/org/plugin.ts +8 -1
- package/src/org/types.ts +6 -1
- package/src/provider-api/index.ts +6 -1
- package/src/resources/handlers.ts +2 -6
- package/src/resources/script-helpers.ts +2 -1
- package/src/scripts/chat/search-chats.ts +5 -2
- package/src/scripts/describe-workspace-apps.ts +59 -0
- package/src/scripts/resources/delete-memory.ts +5 -2
- package/src/scripts/resources/delete.ts +5 -2
- package/src/scripts/resources/effective.ts +5 -2
- package/src/scripts/resources/list.ts +5 -2
- package/src/scripts/resources/read.ts +5 -2
- package/src/scripts/resources/save-memory.ts +5 -2
- package/src/scripts/resources/write.ts +5 -2
- package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +11 -31
- package/src/server/agent-capabilities.ts +147 -0
- package/src/server/agent-chat/framework-prompts.ts +11 -13
- package/src/server/agent-chat/prompt-resources.ts +183 -57
- package/src/server/agent-chat/script-entries.ts +20 -7
- package/src/server/agent-chat-plugin.ts +27 -0
- package/src/server/auth.ts +38 -32
- package/src/server/core-routes-plugin.ts +229 -179
- package/src/server/credential-provider.ts +196 -44
- package/src/server/embed-session.ts +10 -0
- package/src/server/framework-request-handler.ts +43 -0
- package/src/server/google-auth-plugin.ts +13 -450
- package/src/server/index.ts +4 -1
- package/src/server/onboarding-html.ts +20 -56
- package/src/server/open-route.ts +6 -1
- package/src/server/poll.ts +1 -1
- package/src/server/prompts/framework-core-compact.ts +5 -5
- package/src/server/prompts/framework-core.ts +7 -9
- package/src/server/prompts/shared-rules.ts +20 -9
- package/src/server/request-context.ts +58 -2
- package/src/server/scoped-key-storage.ts +1 -1
- package/src/settings/org-settings.ts +9 -0
- package/src/settings/store.ts +29 -0
- package/src/shared/index.ts +13 -0
- package/src/shared/sign-in-journey.ts +331 -0
- package/src/styles/agent-native.css +8 -0
- package/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/src/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/src/templates/chat/AGENTS.md +8 -0
- package/src/templates/chat/app/entry.client.tsx +3 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/default/AGENTS.md +68 -195
- package/src/templates/default/app/entry.client.tsx +3 -0
- package/src/templates/default/app/i18n/ar-SA.ts +8 -0
- package/src/templates/default/app/i18n/de-DE.ts +8 -0
- package/src/templates/default/app/i18n/en-US.ts +8 -0
- package/src/templates/default/app/i18n/es-ES.ts +8 -0
- package/src/templates/default/app/i18n/fr-FR.ts +8 -0
- package/src/templates/default/app/i18n/hi-IN.ts +8 -0
- package/src/templates/default/app/i18n/ja-JP.ts +8 -0
- package/src/templates/default/app/i18n/ko-KR.ts +8 -0
- package/src/templates/default/app/i18n/pt-BR.ts +8 -0
- package/src/templates/default/app/i18n/zh-CN.ts +8 -0
- package/src/templates/default/app/i18n/zh-TW.ts +8 -0
- package/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/src/templates/workspace-core/AGENTS.md +62 -124
- package/src/templates/workspace-root/AGENTS.md +6 -1
- package/src/triggers/dispatcher.ts +28 -17
- package/src/vite/client.ts +20 -8
- package/corpus/core/src/client/components/MissingKeyCard.tsx +0 -61
- package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +0 -495
- package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +0 -193
- package/corpus/core/src/client/settings/BrowserSection.tsx +0 -110
- package/corpus/templates/analytics/app/components/InlineMetric.tsx +0 -31
- package/corpus/templates/analytics/app/components/auth/LoginScreen.tsx +0 -4
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +0 -128
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +0 -264
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +0 -84
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +0 -92
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +0 -154
- package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +0 -49
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +0 -120
- package/corpus/templates/analytics/server/handlers/dashboard-views.ts +0 -85
- package/corpus/templates/analytics/server/handlers/user-prefs.ts +0 -58
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId]/[viewId].delete.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].post.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/theme.get.ts +0 -17
- package/corpus/templates/analytics/server/routes/api/theme.post.ts +0 -15
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].delete.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].put.ts +0 -1
- package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +0 -156
- package/corpus/templates/assets/app/components/library/LibraryCard.tsx +0 -213
- package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +0 -49
- package/corpus/templates/calendar/server/routes/api/events/[id].delete.ts +0 -1
- package/corpus/templates/calendar/server/routes/api/events/[id].get.ts +0 -1
- package/corpus/templates/calendar/server/routes/api/events/[id].put.ts +0 -1
- package/corpus/templates/content/app/components/layout/AppLayout.tsx +0 -9
- package/corpus/templates/content/server/routes/api/comments/[id].delete.ts +0 -69
- package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +0 -109
- package/corpus/templates/content/server/routes/api/documents/[id]/versions.get.ts +0 -53
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +0 -85
- package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +0 -129
- package/corpus/templates/forms/app/components/layout/AppLayout.tsx +0 -9
- package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +0 -213
- package/corpus/templates/mail/server/handlers/aliases.ts +0 -98
- package/corpus/templates/mail/server/routes/api/aliases/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/settings.get.ts +0 -22
- package/corpus/templates/mail/server/routes/api/automations/settings.put.ts +0 -25
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/settings.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/settings.patch.ts +0 -1
- package/corpus/templates/slides/app/components/deck/BuilderLogo.tsx +0 -22
- package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +0 -176
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +0 -244
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +0 -84
- package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +0 -43
- package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +0 -50
- package/corpus/templates/slides/server/routes/api/decks/[id].delete.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/[id].get.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/[id].put.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/index.get.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/index.post.ts +0 -1
- package/dist/client/components/MissingKeyCard.d.ts +0 -7
- package/dist/client/components/MissingKeyCard.d.ts.map +0 -1
- package/dist/client/components/MissingKeyCard.js +0 -32
- package/dist/client/components/MissingKeyCard.js.map +0 -1
- package/dist/client/extensions/agent-native-extension-runtime.d.ts +0 -69
- package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +0 -1
- package/dist/client/extensions/agent-native-extension-runtime.js +0 -348
- package/dist/client/extensions/agent-native-extension-runtime.js.map +0 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts +0 -2
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +0 -1
- package/dist/client/settings/BackgroundAgentSection.js +0 -68
- package/dist/client/settings/BackgroundAgentSection.js.map +0 -1
- package/dist/client/settings/BrowserSection.d.ts +0 -2
- package/dist/client/settings/BrowserSection.d.ts.map +0 -1
- package/dist/client/settings/BrowserSection.js +0 -40
- package/dist/client/settings/BrowserSection.js.map +0 -1
- package/dist/templates/chat/.react-router/types/+server-build.d.ts +0 -18
- package/dist/templates/chat/.react-router/types/app/+types/root.ts +0 -68
- package/src/client/components/MissingKeyCard.tsx +0 -61
- package/src/client/extensions/agent-native-extension-runtime.ts +0 -495
- package/src/client/settings/BackgroundAgentSection.tsx +0 -193
- package/src/client/settings/BrowserSection.tsx +0 -110
- package/src/templates/chat/.react-router/types/+server-build.d.ts +0 -18
- package/src/templates/chat/.react-router/types/app/+types/root.ts +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,6BAA6B,EAC7B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAE5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE,SAAS,cAAc;IACrB,OAAO,0BAA0B,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,qBAAqB,CAAC;IACvC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,yBAAyB,CAAC;IAChE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrE,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,eAAe,CAAC;QACtD,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,mBAAmB,CAAC;QACzD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,qBAAqB,CAAC;IAC1D,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5E,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,oBAAoB,CACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAC5D,CAAC;IACF,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AACpE,MAAM,wBAAwB,GAAG,sCAAsC,CAAC;AAExE,MAAM,YAAY,GAAG;IACnB,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,QAAQ;IACxB,eAAe,EAAE,SAAS;IAC1B,gBAAgB,EAAE,SAAS;IAC3B,YAAY,EAAE,SAAS;IACvB,WAAW,EAAE,SAAS;IACtB,gBAAgB,EAAE,cAAc;IAChC,eAAe,EAAE,kBAAkB;IACnC,kBAAkB,EAAE,gBAAgB;IACpC,qBAAqB,EAAE,kCAAkC;IACzD,kBAAkB,EAAE,+CAA+C;IACnE,cAAc,EAAE,yBAAyB;IACzC,qBAAqB,EAAE,8BAA8B;IACrD,qBAAqB,EAAE,qBAAqB;IAC5C,WAAW,EACT,gFAAgF;IAClF,YAAY,EAAE,qBAAqB;IACnC,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,kBAAkB;IACnC,sBAAsB,EAAE,uBAAuB;IAC/C,0BAA0B,EAAE,kBAAkB;IAC9C,wBAAwB,EAAE,gBAAgB;IAC1C,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,QAAQ;IACxB,aAAa,EAAE,OAAO;IACtB,gBAAgB,EAAE,yBAAyB;IAC3C,gBAAgB,EAAE,0BAA0B;IAC5C,gBAAgB,EACd,iFAAiF;IACnF,gBAAgB,EACd,wFAAwF;IAC1F,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,kBAAkB;IAClC,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,iBAAiB;IAC/B,eAAe,EAAE,6CAA6C;IAC9D,eAAe,EAAE,8BAA8B;IAC/C,UAAU,EAAE,aAAa;IACzB,kBAAkB,EAAE,aAAa;IACjC,UAAU,EAAE,2BAA2B;IACvC,kBAAkB,EAAE,mCAAmC;IACvD,WAAW,EAAE,cAAc;IAC3B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,kBAAkB,EAAE,8BAA8B;IAClD,WAAW,EAAE,+BAA+B;IAC5C,UAAU,EAAE,OAAO;IACnB,cAAc,EAAE,KAAK;IACrB,YAAY,EAAE,gBAAgB;IAC9B,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,oDAAoD;IAClE,gBAAgB,EAAE,sBAAsB;IACxC,kBAAkB,EAAE,yCAAyC;IAC7D,8BAA8B,EAC5B,iDAAiD;IACnD,oBAAoB,EAClB,iEAAiE;IACnE,wBAAwB,EACtB,uFAAuF;IACzF,uBAAuB,EAAE,iDAAiD;IAC1E,QAAQ,EAAE,aAAa;IACvB,oBAAoB,EAAE,+BAA+B;IACrD,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,MAAM;IACZ,gBAAgB,EAAE,iCAAiC;IACnD,wBAAwB,EAAE,0CAA0C;IACpE,iBAAiB,EAAE,kCAAkC;IACrD,qBAAqB,EAAE,kCAAkC;IACzD,iBAAiB,EAAE,wBAAwB;IAC3C,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,qBAAqB;IACzC,uBAAuB,EAAE,mCAAmC;IAC5D,sBAAsB,EAAE,sCAAsC;IAC9D,mBAAmB,EAAE,sCAAsC;IAC3D,cAAc,EAAE,mDAAmD;IACnE,gBAAgB,EAAE,6BAA6B;IAC/C,SAAS,EAAE,aAAa;IACxB,YAAY,EAAE,2BAA2B;IACzC,mBAAmB,EAAE,iCAAiC;IACtD,eAAe,EAAE,sCAAsC;IACvD,oBAAoB,EAAE,4CAA4C;IAClE,eAAe,EAAE,0CAA0C;IAC3D,mBAAmB,EACjB,sHAAsH;CACzH,CAAC;AAEF,MAAM,gBAAgB,GAA4C;IAChE,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE;QACP,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,MAAM;QACxB,eAAe,EAAE,QAAQ;QACzB,kBAAkB,EAAE,MAAM;QAC1B,qBAAqB,EAAE,UAAU;QACjC,kBAAkB,EAAE,qBAAqB;QACzC,cAAc,EAAE,QAAQ;QACxB,qBAAqB,EAAE,QAAQ;QAC/B,qBAAqB,EAAE,QAAQ;QAC/B,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE,cAAc;QAC5B,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,MAAM;QACvB,sBAAsB,EAAE,UAAU;QAClC,0BAA0B,EAAE,MAAM;QAClC,wBAAwB,EAAE,MAAM;QAChC,cAAc,EAAE,MAAM;QACtB,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,MAAM;QACxB,gBAAgB,EAAE,6BAA6B;QAC/C,gBAAgB,EACd,gCAAgC;QAClC,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,OAAO;QACvB,aAAa,EAAE,QAAQ;QACvB,YAAY,EAAE,MAAM;QACpB,eAAe,EAAE,mBAAmB;QACpC,eAAe,EAAE,YAAY;QAC7B,UAAU,EAAE,MAAM;QAClB,kBAAkB,EAAE,MAAM;QAC1B,UAAU,EAAE,YAAY;QACxB,kBAAkB,EAAE,0BAA0B;QAC9C,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,kBAAkB,EAAE,gBAAgB;QACpC,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,+BAA+B;QAC7C,gBAAgB,EAAE,QAAQ;QAC1B,kBAAkB,EAAE,WAAW;QAC/B,8BAA8B,EAAE,aAAa;QAC7C,oBAAoB,EAAE,kBAAkB;QACxC,wBAAwB,EACtB,4BAA4B;QAC9B,uBAAuB,EAAE,eAAe;QACxC,QAAQ,EAAE,SAAS;QACnB,oBAAoB,EAAE,aAAa;QACnC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,KAAK;QACX,gBAAgB,EAAE,YAAY;QAC9B,wBAAwB,EAAE,aAAa;QACvC,iBAAiB,EAAE,WAAW;QAC9B,qBAAqB,EAAE,YAAY;QACnC,iBAAiB,EAAE,YAAY;QAC/B,eAAe,EAAE,SAAS;QAC1B,kBAAkB,EAAE,MAAM;QAC1B,uBAAuB,EAAE,eAAe;QACxC,sBAAsB,EAAE,iBAAiB;QACzC,mBAAmB,EAAE,eAAe;QACpC,cAAc,EAAE,qBAAqB;QACrC,gBAAgB,EAAE,WAAW;QAC7B,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,SAAS;QACvB,mBAAmB,EAAE,mBAAmB;QACxC,eAAe,EAAE,WAAW;QAC5B,oBAAoB,EAAE,cAAc;QACpC,eAAe,EAAE,eAAe;QAChC,mBAAmB,EACjB,8EAA8E;KACjF;IACD,OAAO,EAAE;QACP,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,MAAM;QACxB,eAAe,EAAE,UAAU;QAC3B,kBAAkB,EAAE,MAAM;QAC1B,qBAAqB,EAAE,UAAU;QACjC,kBAAkB,EAAE,qBAAqB;QACzC,cAAc,EAAE,QAAQ;QACxB,qBAAqB,EAAE,QAAQ;QAC/B,qBAAqB,EAAE,QAAQ;QAC/B,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE,cAAc;QAC5B,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,MAAM;QACrB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,MAAM;QACvB,sBAAsB,EAAE,UAAU;QAClC,0BAA0B,EAAE,MAAM;QAClC,wBAAwB,EAAE,MAAM;QAChC,cAAc,EAAE,MAAM;QACtB,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,YAAY;QAC9B,gBAAgB,EAAE,yBAAyB;QAC3C,gBAAgB,EACd,iCAAiC;QACnC,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,OAAO;QACvB,aAAa,EAAE,QAAQ;QACvB,YAAY,EAAE,MAAM;QACpB,eAAe,EAAE,qBAAqB;QACtC,eAAe,EAAE,YAAY;QAC7B,UAAU,EAAE,OAAO;QACnB,kBAAkB,EAAE,OAAO;QAC3B,UAAU,EAAE,YAAY;QACxB,kBAAkB,EAAE,0BAA0B;QAC9C,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,kBAAkB,EAAE,gBAAgB;QACpC,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,kCAAkC;QAChD,gBAAgB,EAAE,QAAQ;QAC1B,kBAAkB,EAAE,WAAW;QAC/B,8BAA8B,EAAE,eAAe;QAC/C,oBAAoB,EAAE,kBAAkB;QACxC,wBAAwB,EACtB,4BAA4B;QAC9B,uBAAuB,EAAE,eAAe;QACxC,QAAQ,EAAE,SAAS;QACnB,oBAAoB,EAAE,aAAa;QACnC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,KAAK;QACX,gBAAgB,EAAE,YAAY;QAC9B,wBAAwB,EAAE,aAAa;QACvC,iBAAiB,EAAE,WAAW;QAC9B,qBAAqB,EAAE,YAAY;QACnC,iBAAiB,EAAE,YAAY;QAC/B,eAAe,EAAE,WAAW;QAC5B,kBAAkB,EAAE,MAAM;QAC1B,uBAAuB,EAAE,eAAe;QACxC,sBAAsB,EAAE,mBAAmB;QAC3C,mBAAmB,EAAE,iBAAiB;QACtC,cAAc,EAAE,uBAAuB;QACvC,gBAAgB,EAAE,WAAW;QAC7B,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,WAAW;QACzB,mBAAmB,EAAE,oBAAoB;QACzC,eAAe,EAAE,WAAW;QAC5B,oBAAoB,EAAE,cAAc;QACpC,eAAe,EAAE,kBAAkB;QACnC,mBAAmB,EACjB,gFAAgF;KACnF;IACD,OAAO,EAAE;QACP,aAAa,EAAE,QAAQ;QACvB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,gBAAgB;QACjC,gBAAgB,EAAE,YAAY;QAC9B,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,gBAAgB;QAC7B,gBAAgB,EAAE,qBAAqB;QACvC,eAAe,EAAE,iBAAiB;QAClC,kBAAkB,EAAE,wBAAwB;QAC5C,qBAAqB,EAAE,8BAA8B;QACrD,kBAAkB,EAAE,gDAAgD;QACpE,cAAc,EAAE,4BAA4B;QAC5C,qBAAqB,EAAE,4BAA4B;QACnD,qBAAqB,EAAE,0BAA0B;QACjD,WAAW,EACT,mFAAmF;QACrF,YAAY,EAAE,2BAA2B;QACzC,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,cAAc;QAC7B,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,YAAY;QACtB,eAAe,EAAE,sBAAsB;QACvC,sBAAsB,EAAE,uBAAuB;QAC/C,0BAA0B,EAAE,sBAAsB;QAClD,wBAAwB,EAAE,yBAAyB;QACnD,cAAc,EAAE,sBAAsB;QACtC,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,WAAW;QAC3B,aAAa,EAAE,SAAS;QACxB,gBAAgB,EAAE,+BAA+B;QACjD,gBAAgB,EAAE,6BAA6B;QAC/C,gBAAgB,EACd,uFAAuF;QACzF,gBAAgB,EACd,iFAAiF;QACnF,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,2BAA2B;QAC3C,aAAa,EAAE,mCAAmC;QAClD,YAAY,EAAE,yBAAyB;QACvC,eAAe,EACb,8DAA8D;QAChE,eAAe,EAAE,kCAAkC;QACnD,UAAU,EAAE,qBAAqB;QACjC,kBAAkB,EAAE,qBAAqB;QACzC,UAAU,EAAE,iCAAiC;QAC7C,kBAAkB,EAAE,wCAAwC;QAC5D,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ;QACf,kBAAkB,EAAE,sCAAsC;QAC1D,WAAW,EAAE,kCAAkC;QAC/C,UAAU,EAAE,UAAU;QACtB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,wBAAwB;QACtC,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,kDAAkD;QAChE,gBAAgB,EAAE,+BAA+B;QACjD,kBAAkB,EAAE,iDAAiD;QACrE,8BAA8B,EAC5B,wDAAwD;QAC1D,oBAAoB,EAClB,+EAA+E;QACjF,wBAAwB,EACtB,mGAAmG;QACrG,uBAAuB,EACrB,2DAA2D;QAC7D,QAAQ,EAAE,gBAAgB;QAC1B,oBAAoB,EAAE,gCAAgC;QACtD,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,2CAA2C;QAC7D,wBAAwB,EAAE,+CAA+C;QACzE,iBAAiB,EAAE,mCAAmC;QACtD,qBAAqB,EAAE,mCAAmC;QAC1D,iBAAiB,EAAE,8BAA8B;QACjD,eAAe,EAAE,iBAAiB;QAClC,kBAAkB,EAAE,sBAAsB;QAC1C,uBAAuB,EAAE,mCAAmC;QAC5D,sBAAsB,EAAE,kDAAkD;QAC1E,mBAAmB,EAAE,iDAAiD;QACtE,cAAc,EACZ,oEAAoE;QACtE,gBAAgB,EAAE,iDAAiD;QACnE,SAAS,EAAE,mBAAmB;QAC9B,YAAY,EAAE,+BAA+B;QAC7C,mBAAmB,EAAE,mCAAmC;QACxD,eAAe,EAAE,0CAA0C;QAC3D,oBAAoB,EAAE,mDAAmD;QACzE,eAAe,EACb,kEAAkE;QACpE,mBAAmB,EACjB,uJAAuJ;KAC1J;IACD,OAAO,EAAE;QACP,aAAa,EAAE,QAAQ;QACvB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,WAAW;QAC5B,gBAAgB,EAAE,WAAW;QAC7B,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,WAAW;QACxB,gBAAgB,EAAE,YAAY;QAC9B,eAAe,EAAE,uBAAuB;QACxC,kBAAkB,EAAE,+BAA+B;QACnD,qBAAqB,EAAE,gCAAgC;QACvD,kBAAkB,EAAE,sDAAsD;QAC1E,cAAc,EAAE,+BAA+B;QAC/C,qBAAqB,EAAE,sCAAsC;QAC7D,qBAAqB,EAAE,kCAAkC;QACzD,WAAW,EACT,8FAA8F;QAChG,YAAY,EAAE,0BAA0B;QACxC,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,cAAc;QACxB,eAAe,EAAE,2BAA2B;QAC5C,sBAAsB,EAAE,uBAAuB;QAC/C,0BAA0B,EAAE,2BAA2B;QACvD,wBAAwB,EAAE,wBAAwB;QAClD,cAAc,EAAE,8BAA8B;QAC9C,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,UAAU;QAC1B,aAAa,EAAE,UAAU;QACzB,gBAAgB,EAAE,+BAA+B;QACjD,gBAAgB,EAAE,sCAAsC;QACxD,gBAAgB,EACd,qFAAqF;QACvF,gBAAgB,EACd,mGAAmG;QACrG,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,qCAAqC;QACpD,YAAY,EAAE,uBAAuB;QACrC,eAAe,EACb,oEAAoE;QACtE,eAAe,EAAE,8BAA8B;QAC/C,UAAU,EAAE,qBAAqB;QACjC,kBAAkB,EAAE,qBAAqB;QACzC,UAAU,EAAE,8BAA8B;QAC1C,kBAAkB,EAAE,6CAA6C;QACjE,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,QAAQ;QACf,kBAAkB,EAAE,sCAAsC;QAC1D,WAAW,EAAE,uCAAuC;QACpD,UAAU,EAAE,YAAY;QACxB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,8BAA8B;QAC5C,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,6DAA6D;QAC3E,gBAAgB,EAAE,gCAAgC;QAClD,kBAAkB,EAAE,sDAAsD;QAC1E,8BAA8B,EAC5B,gEAAgE;QAClE,oBAAoB,EAClB,qFAAqF;QACvF,wBAAwB,EACtB,2GAA2G;QAC7G,uBAAuB,EACrB,oDAAoD;QACtD,QAAQ,EAAE,iBAAiB;QAC3B,oBAAoB,EAAE,0BAA0B;QAChD,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,QAAQ;QACd,gBAAgB,EAAE,sCAAsC;QACxD,wBAAwB,EACtB,kDAAkD;QACpD,iBAAiB,EAAE,oCAAoC;QACvD,qBAAqB,EAAE,oCAAoC;QAC3D,iBAAiB,EAAE,wCAAwC;QAC3D,eAAe,EAAE,qBAAqB;QACtC,kBAAkB,EAAE,wBAAwB;QAC5C,uBAAuB,EAAE,mCAAmC;QAC5D,sBAAsB,EAAE,uCAAuC;QAC/D,mBAAmB,EAAE,gDAAgD;QACrE,cAAc,EACZ,iEAAiE;QACnE,gBAAgB,EAAE,oDAAoD;QACtE,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,iCAAiC;QAC/C,mBAAmB,EAAE,mCAAmC;QACxD,eAAe,EAAE,2CAA2C;QAC5D,oBAAoB,EAClB,yDAAyD;QAC3D,eAAe,EAAE,yDAAyD;QAC1E,mBAAmB,EACjB,uIAAuI;KAC1I;IACD,OAAO,EAAE;QACP,aAAa,EAAE,SAAS;QACxB,cAAc,EAAE,QAAQ;QACxB,eAAe,EAAE,UAAU;QAC3B,gBAAgB,EAAE,YAAY;QAC9B,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,UAAU;QACvB,gBAAgB,EAAE,mBAAmB;QACrC,eAAe,EAAE,eAAe;QAChC,kBAAkB,EAAE,uBAAuB;QAC3C,qBAAqB,EAAE,oCAAoC;QAC3D,kBAAkB,EAAE,sCAAsC;QAC1D,cAAc,EAAE,gCAAgC;QAChD,qBAAqB,EAAE,iCAAiC;QACxD,qBAAqB,EAAE,4BAA4B;QACnD,WAAW,EACT,iGAAiG;QACnG,YAAY,EAAE,qBAAqB;QACnC,SAAS,EAAE,MAAM;QACjB,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,qBAAqB;QACtC,sBAAsB,EAAE,sBAAsB;QAC9C,0BAA0B,EAAE,qBAAqB;QACjD,wBAAwB,EAAE,mBAAmB;QAC7C,cAAc,EAAE,2BAA2B;QAC3C,eAAe,EAAE,OAAO;QACxB,cAAc,EAAE,QAAQ;QACxB,aAAa,EAAE,OAAO;QACtB,gBAAgB,EAAE,8BAA8B;QAChD,gBAAgB,EAAE,2CAA2C;QAC7D,gBAAgB,EACd,kFAAkF;QACpF,gBAAgB,EACd,2GAA2G;QAC7G,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,qBAAqB;QACrC,aAAa,EAAE,mBAAmB;QAClC,YAAY,EAAE,sBAAsB;QACpC,eAAe,EACb,iEAAiE;QACnE,eAAe,EAAE,kCAAkC;QACnD,UAAU,EAAE,iBAAiB;QAC7B,kBAAkB,EAAE,iBAAiB;QACrC,UAAU,EAAE,iCAAiC;QAC7C,kBAAkB,EAAE,wCAAwC;QAC5D,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,WAAW;QAClB,kBAAkB,EAAE,kCAAkC;QACtD,WAAW,EAAE,6CAA6C;QAC1D,UAAU,EAAE,aAAa;QACzB,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,6DAA6D;QAC3E,gBAAgB,EAAE,iCAAiC;QACnD,kBAAkB,EAChB,8DAA8D;QAChE,8BAA8B,EAC5B,gEAAgE;QAClE,oBAAoB,EAClB,8FAA8F;QAChG,wBAAwB,EACtB,kGAAkG;QACpG,uBAAuB,EACrB,kEAAkE;QACpE,QAAQ,EAAE,WAAW;QACrB,oBAAoB,EAAE,6BAA6B;QACnD,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,4CAA4C;QAC9D,wBAAwB,EACtB,0DAA0D;QAC5D,iBAAiB,EAAE,yCAAyC;QAC5D,qBAAqB,EAAE,yCAAyC;QAChE,iBAAiB,EAAE,sCAAsC;QACzD,eAAe,EAAE,sBAAsB;QACvC,kBAAkB,EAAE,8BAA8B;QAClD,uBAAuB,EAAE,mCAAmC;QAC5D,sBAAsB,EAAE,mDAAmD;QAC3E,mBAAmB,EAAE,mDAAmD;QACxE,cAAc,EACZ,6DAA6D;QAC/D,gBAAgB,EAAE,4CAA4C;QAC9D,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,+BAA+B;QAC7C,mBAAmB,EAAE,sCAAsC;QAC3D,eAAe,EAAE,oDAAoD;QACrE,oBAAoB,EAAE,qDAAqD;QAC3E,eAAe,EAAE,0DAA0D;QAC3E,mBAAmB,EACjB,sIAAsI;KACzI;IACD,OAAO,EAAE;QACP,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,MAAM;QACtB,eAAe,EAAE,OAAO;QACxB,gBAAgB,EAAE,MAAM;QACxB,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,OAAO;QACpB,gBAAgB,EAAE,SAAS;QAC3B,eAAe,EAAE,cAAc;QAC/B,kBAAkB,EAAE,YAAY;QAChC,qBAAqB,EAAE,kBAAkB;QACzC,kBAAkB,EAAE,0BAA0B;QAC9C,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,YAAY;QACnC,qBAAqB,EAAE,eAAe;QACtC,WAAW,EACT,0CAA0C;QAC5C,YAAY,EAAE,eAAe;QAC7B,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,UAAU;QACzB,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,UAAU;QAC3B,sBAAsB,EAAE,QAAQ;QAChC,0BAA0B,EAAE,UAAU;QACtC,wBAAwB,EAAE,UAAU;QACpC,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,OAAO;QACxB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,cAAc;QAChC,gBAAgB,EAAE,gBAAgB;QAClC,gBAAgB,EACd,0CAA0C;QAC5C,gBAAgB,EACd,4CAA4C;QAC9C,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,eAAe;QAC/B,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,UAAU;QACxB,eAAe,EAAE,2BAA2B;QAC5C,eAAe,EAAE,wBAAwB;QACzC,UAAU,EAAE,SAAS;QACrB,kBAAkB,EAAE,SAAS;QAC7B,UAAU,EAAE,iBAAiB;QAC7B,kBAAkB,EAAE,6BAA6B;QACjD,WAAW,EAAE,UAAU;QACvB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,KAAK;QACZ,kBAAkB,EAAE,sBAAsB;QAC1C,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,GAAG;QAChB,YAAY,EACV,0CAA0C;QAC5C,gBAAgB,EAAE,oBAAoB;QACtC,kBAAkB,EAAE,sBAAsB;QAC1C,8BAA8B,EAC5B,2BAA2B;QAC7B,oBAAoB,EAClB,wCAAwC;QAC1C,wBAAwB,EACtB,0CAA0C;QAC5C,uBAAuB,EACrB,gCAAgC;QAClC,QAAQ,EAAE,QAAQ;QAClB,oBAAoB,EAAE,eAAe;QACrC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,kBAAkB;QACpC,wBAAwB,EAAE,oBAAoB;QAC9C,iBAAiB,EAAE,0BAA0B;QAC7C,qBAAqB,EAAE,yBAAyB;QAChD,iBAAiB,EAAE,cAAc;QACjC,eAAe,EAAE,YAAY;QAC7B,kBAAkB,EAAE,WAAW;QAC/B,uBAAuB,EAAE,wBAAwB;QACjD,sBAAsB,EAAE,yBAAyB;QACjD,mBAAmB,EACjB,+BAA+B;QACjC,cAAc,EAAE,8BAA8B;QAC9C,gBAAgB,EAAE,qBAAqB;QACvC,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,sBAAsB;QACpC,mBAAmB,EAAE,0BAA0B;QAC/C,eAAe,EAAE,yBAAyB;QAC1C,oBAAoB,EAAE,yBAAyB;QAC/C,eAAe,EACb,iCAAiC;QACnC,mBAAmB,EACjB,iGAAiG;KACpG;IACD,OAAO,EAAE;QACP,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,KAAK;QACrB,eAAe,EAAE,KAAK;QACtB,gBAAgB,EAAE,OAAO;QACzB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,gBAAgB;QAClC,eAAe,EAAE,YAAY;QAC7B,kBAAkB,EAAE,UAAU;QAC9B,qBAAqB,EAAE,eAAe;QACtC,kBAAkB,EAAE,yBAAyB;QAC7C,cAAc,EAAE,YAAY;QAC5B,qBAAqB,EAAE,cAAc;QACrC,qBAAqB,EAAE,cAAc;QACrC,WAAW,EACT,2CAA2C;QAC7C,YAAY,EAAE,aAAa;QAC3B,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,QAAQ;QACvB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,SAAS;QAC1B,sBAAsB,EAAE,OAAO;QAC/B,0BAA0B,EAAE,SAAS;QACrC,wBAAwB,EAAE,SAAS;QACnC,cAAc,EAAE,UAAU;QAC1B,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,eAAe;QACjC,gBAAgB,EAAE,eAAe;QACjC,gBAAgB,EACd,2CAA2C;QAC7C,gBAAgB,EACd,6CAA6C;QAC/C,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,cAAc;QAC9B,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE,uBAAuB;QACxC,eAAe,EAAE,iBAAiB;QAClC,UAAU,EAAE,SAAS;QACrB,kBAAkB,EAAE,SAAS;QAC7B,UAAU,EAAE,eAAe;QAC3B,kBAAkB,EAAE,0BAA0B;QAC9C,WAAW,EAAE,OAAO;QACpB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,kBAAkB,EAAE,kBAAkB;QACtC,WAAW,EAAE,oBAAoB;QACjC,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,uCAAuC;QACrD,gBAAgB,EAAE,eAAe;QACjC,kBAAkB,EAAE,uBAAuB;QAC3C,8BAA8B,EAAE,yBAAyB;QACzD,oBAAoB,EAClB,qCAAqC;QACvC,wBAAwB,EACtB,gDAAgD;QAClD,uBAAuB,EAAE,8BAA8B;QACvD,QAAQ,EAAE,SAAS;QACnB,oBAAoB,EAAE,eAAe;QACrC,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,IAAI;QACV,gBAAgB,EAAE,iBAAiB;QACnC,wBAAwB,EAAE,uBAAuB;QACjD,iBAAiB,EAAE,uBAAuB;QAC1C,qBAAqB,EAAE,oBAAoB;QAC3C,iBAAiB,EAAE,iBAAiB;QACpC,eAAe,EAAE,UAAU;QAC3B,kBAAkB,EAAE,OAAO;QAC3B,uBAAuB,EAAE,iBAAiB;QAC1C,sBAAsB,EAAE,sBAAsB;QAC9C,mBAAmB,EAAE,wBAAwB;QAC7C,cAAc,EAAE,4BAA4B;QAC5C,gBAAgB,EAAE,qBAAqB;QACvC,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,wBAAwB;QACtC,mBAAmB,EAAE,2BAA2B;QAChD,eAAe,EAAE,uBAAuB;QACxC,oBAAoB,EAAE,6BAA6B;QACnD,eAAe,EAAE,2BAA2B;QAC5C,mBAAmB,EACjB,2FAA2F;KAC9F;IACD,OAAO,EAAE;QACP,aAAa,EAAE,QAAQ;QACvB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,QAAQ;QACzB,gBAAgB,EAAE,aAAa;QAC/B,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ;QACrB,gBAAgB,EAAE,oBAAoB;QACtC,eAAe,EAAE,mBAAmB;QACpC,kBAAkB,EAAE,iBAAiB;QACrC,qBAAqB,EAAE,6BAA6B;QACpD,kBAAkB,EAAE,kDAAkD;QACtE,cAAc,EAAE,oBAAoB;QACpC,qBAAqB,EAAE,iCAAiC;QACxD,qBAAqB,EAAE,oBAAoB;QAC3C,WAAW,EACT,6EAA6E;QAC/E,YAAY,EAAE,mBAAmB;QACjC,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,aAAa;QAC5B,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,iBAAiB;QAClC,sBAAsB,EAAE,yBAAyB;QACjD,0BAA0B,EAAE,iBAAiB;QAC7C,wBAAwB,EAAE,gBAAgB;QAC1C,cAAc,EAAE,uBAAuB;QACvC,eAAe,EAAE,OAAO;QACxB,cAAc,EAAE,WAAW;QAC3B,aAAa,EAAE,SAAS;QACxB,gBAAgB,EAAE,8BAA8B;QAChD,gBAAgB,EAAE,8BAA8B;QAChD,gBAAgB,EACd,yEAAyE;QAC3E,gBAAgB,EACd,2FAA2F;QAC7F,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,mBAAmB;QACnC,aAAa,EAAE,4BAA4B;QAC3C,YAAY,EAAE,oBAAoB;QAClC,eAAe,EACb,+DAA+D;QACjE,eAAe,EAAE,mCAAmC;QACpD,UAAU,EAAE,qBAAqB;QACjC,kBAAkB,EAAE,qBAAqB;QACzC,UAAU,EAAE,2BAA2B;QACvC,kBAAkB,EAAE,uCAAuC;QAC3D,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ;QACf,kBAAkB,EAAE,mCAAmC;QACvD,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,yBAAyB;QACvC,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,+CAA+C;QAC7D,gBAAgB,EAAE,uBAAuB;QACzC,kBAAkB,EAAE,oDAAoD;QACxE,8BAA8B,EAC5B,iDAAiD;QACnD,oBAAoB,EAClB,0EAA0E;QAC5E,wBAAwB,EACtB,8FAA8F;QAChG,uBAAuB,EAAE,8CAA8C;QACvE,QAAQ,EAAE,gBAAgB;QAC1B,oBAAoB,EAAE,gCAAgC;QACtD,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,uCAAuC;QACzD,wBAAwB,EACtB,mDAAmD;QACrD,iBAAiB,EAAE,gCAAgC;QACnD,qBAAqB,EAAE,gCAAgC;QACvD,iBAAiB,EAAE,wBAAwB;QAC3C,eAAe,EAAE,gBAAgB;QACjC,kBAAkB,EAAE,mBAAmB;QACvC,uBAAuB,EAAE,0BAA0B;QACnD,sBAAsB,EAAE,uCAAuC;QAC/D,mBAAmB,EAAE,yCAAyC;QAC9D,cAAc,EACZ,+DAA+D;QACjE,gBAAgB,EAAE,iDAAiD;QACnE,SAAS,EAAE,WAAW;QACtB,YAAY,EAAE,0BAA0B;QACxC,mBAAmB,EAAE,oCAAoC;QACzD,eAAe,EAAE,6CAA6C;QAC9D,oBAAoB,EAAE,6CAA6C;QACnE,eAAe,EAAE,kDAAkD;QACnE,mBAAmB,EACjB,6IAA6I;KAChJ;IACD,OAAO,EAAE;QACP,aAAa,EAAE,MAAM;QACrB,cAAc,EAAE,QAAQ;QACxB,eAAe,EAAE,SAAS;QAC1B,gBAAgB,EAAE,WAAW;QAC7B,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,SAAS;QACtB,gBAAgB,EAAE,gBAAgB;QAClC,eAAe,EAAE,iBAAiB;QAClC,kBAAkB,EAAE,oBAAoB;QACxC,qBAAqB,EAAE,6BAA6B;QACpD,kBAAkB,EAAE,wDAAwD;QAC5E,cAAc,EAAE,4BAA4B;QAC5C,qBAAqB,EAAE,2BAA2B;QAClD,qBAAqB,EAAE,yBAAyB;QAChD,WAAW,EACT,sFAAsF;QACxF,YAAY,EAAE,wBAAwB;QACtC,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,YAAY;QAC3B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,SAAS;QACnB,eAAe,EAAE,wBAAwB;QACzC,sBAAsB,EAAE,kBAAkB;QAC1C,0BAA0B,EAAE,wBAAwB;QACpD,wBAAwB,EAAE,mBAAmB;QAC7C,cAAc,EAAE,eAAe;QAC/B,eAAe,EAAE,MAAM;QACvB,cAAc,EAAE,eAAe;QAC/B,aAAa,EAAE,WAAW;QAC1B,gBAAgB,EAAE,uBAAuB;QACzC,gBAAgB,EAAE,+BAA+B;QACjD,gBAAgB,EACd,0EAA0E;QAC5E,gBAAgB,EACd,yFAAyF;QAC3F,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,iBAAiB;QACjC,aAAa,EAAE,kBAAkB;QACjC,YAAY,EAAE,sBAAsB;QACpC,eAAe,EAAE,4CAA4C;QAC7D,eAAe,EAAE,mCAAmC;QACpD,UAAU,EAAE,YAAY;QACxB,kBAAkB,EAAE,YAAY;QAChC,UAAU,EAAE,2BAA2B;QACvC,kBAAkB,EAAE,sCAAsC;QAC1D,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,UAAU;QACjB,kBAAkB,EAAE,gCAAgC;QACpD,WAAW,EAAE,wBAAwB;QACrC,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,mBAAmB;QAChC,YAAY,EAAE,oDAAoD;QAClE,gBAAgB,EAAE,gCAAgC;QAClD,kBAAkB,EAAE,mCAAmC;QACvD,8BAA8B,EAAE,mDAAmD;QACnF,oBAAoB,EAClB,kEAAkE;QACpE,wBAAwB,EACtB,uEAAuE;QACzE,uBAAuB,EAAE,iDAAiD;QAC1E,QAAQ,EAAE,mBAAmB;QAC7B,oBAAoB,EAAE,8BAA8B;QACpD,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,4BAA4B;QAC9C,wBAAwB,EAAE,oCAAoC;QAC9D,iBAAiB,EAAE,uCAAuC;QAC1D,qBAAqB,EAAE,uCAAuC;QAC9D,iBAAiB,EAAE,uBAAuB;QAC1C,eAAe,EAAE,uBAAuB;QACxC,kBAAkB,EAAE,kBAAkB;QACtC,uBAAuB,EAAE,kCAAkC;QAC3D,sBAAsB,EAAE,0CAA0C;QAClE,mBAAmB,EAAE,+CAA+C;QACpE,cAAc,EAAE,qDAAqD;QACrE,gBAAgB,EAAE,8BAA8B;QAChD,SAAS,EAAE,oBAAoB;QAC/B,YAAY,EAAE,2BAA2B;QACzC,mBAAmB,EAAE,kCAAkC;QACvD,eAAe,EAAE,2CAA2C;QAC5D,oBAAoB,EAAE,sDAAsD;QAC5E,eAAe,EAAE,qDAAqD;QACtE,mBAAmB,EACjB,+GAA+G;KAClH;IACD,OAAO,EAAE;QACP,aAAa,EAAE,OAAO;QACtB,cAAc,EAAE,QAAQ;QACxB,eAAe,EAAE,cAAc;QAC/B,gBAAgB,EAAE,QAAQ;QAC1B,YAAY,EAAE,QAAQ;QACtB,WAAW,EAAE,cAAc;QAC3B,gBAAgB,EAAE,eAAe;QACjC,eAAe,EAAE,0BAA0B;QAC3C,kBAAkB,EAAE,yBAAyB;QAC7C,qBAAqB,EAAE,mBAAmB;QAC1C,kBAAkB,EAAE,gDAAgD;QACpE,cAAc,EAAE,uBAAuB;QACvC,qBAAqB,EAAE,kBAAkB;QACzC,qBAAqB,EAAE,uBAAuB;QAC9C,WAAW,EACT,oEAAoE;QACtE,YAAY,EAAE,8BAA8B;QAC5C,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,YAAY;QAC3B,MAAM,EAAE,cAAc;QACtB,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,aAAa;QACvB,eAAe,EAAE,mBAAmB;QACpC,sBAAsB,EAAE,kBAAkB;QAC1C,0BAA0B,EAAE,mBAAmB;QAC/C,wBAAwB,EAAE,kBAAkB;QAC5C,cAAc,EAAE,cAAc;QAC9B,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,QAAQ;QACxB,aAAa,EAAE,OAAO;QACtB,gBAAgB,EAAE,uBAAuB;QACzC,gBAAgB,EAAE,yBAAyB;QAC3C,gBAAgB,EACd,kEAAkE;QACpE,gBAAgB,EACd,8EAA8E;QAChF,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,sBAAsB;QACtC,aAAa,EAAE,0BAA0B;QACzC,YAAY,EAAE,yBAAyB;QACvC,eAAe,EAAE,6CAA6C;QAC9D,eAAe,EAAE,wBAAwB;QACzC,UAAU,EAAE,cAAc;QAC1B,kBAAkB,EAAE,cAAc;QAClC,UAAU,EAAE,0BAA0B;QACtC,kBAAkB,EAAE,oCAAoC;QACxD,WAAW,EAAE,WAAW;QACxB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,OAAO;QACd,kBAAkB,EAAE,sCAAsC;QAC1D,WAAW,EAAE,0BAA0B;QACvC,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,qDAAqD;QACnE,gBAAgB,EAAE,uBAAuB;QACzC,kBAAkB,EAAE,mCAAmC;QACvD,8BAA8B,EAC5B,kDAAkD;QACpD,oBAAoB,EAClB,yDAAyD;QAC3D,wBAAwB,EACtB,gFAAgF;QAClF,uBAAuB,EAAE,uCAAuC;QAChE,QAAQ,EAAE,gBAAgB;QAC1B,oBAAoB,EAAE,yBAAyB;QAC/C,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,0BAA0B;QAC5C,wBAAwB,EAAE,gCAAgC;QAC1D,iBAAiB,EAAE,+BAA+B;QAClD,qBAAqB,EAAE,+BAA+B;QACtD,iBAAiB,EAAE,4BAA4B;QAC/C,eAAe,EAAE,oBAAoB;QACrC,kBAAkB,EAAE,aAAa;QACjC,uBAAuB,EAAE,sCAAsC;QAC/D,sBAAsB,EAAE,iDAAiD;QACzE,mBAAmB,EAAE,4CAA4C;QACjE,cAAc,EAAE,uDAAuD;QACvE,gBAAgB,EAAE,gCAAgC;QAClD,SAAS,EAAE,oBAAoB;QAC/B,YAAY,EAAE,4CAA4C;QAC1D,mBAAmB,EAAE,4BAA4B;QACjD,eAAe,EAAE,8BAA8B;QAC/C,oBAAoB,EAAE,4CAA4C;QAClE,eAAe,EAAE,qDAAqD;QACtE,mBAAmB,EACjB,4HAA4H;KAC/H;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAOzD,MAAM,0BAA0B,GAE5B;IACF,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE;gBACR,YAAY;gBACZ,kBAAkB;gBAClB,kBAAkB;aACnB;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE;gBACR,YAAY;gBACZ,kBAAkB;gBAClB,mBAAmB;aACpB;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,8DAA8D;YACvE,QAAQ,EAAE;gBACR,+CAA+C;gBAC/C,4DAA4D;gBAC5D,6EAA6E;aAC9E;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EACL,mEAAmE;YACrE,QAAQ,EAAE;gBACR,4DAA4D;gBAC5D,4DAA4D;gBAC5D,oEAAoE;aACrE;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EACL,0EAA0E;YAC5E,QAAQ,EAAE;gBACR,yDAAyD;gBACzD,4DAA4D;gBAC5D,+DAA+D;aAChE;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,kCAAkC;YAC3C,QAAQ,EAAE;gBACR,gBAAgB;gBAChB,wBAAwB;gBACxB,8BAA8B;aAC/B;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,mCAAmC;YAC5C,QAAQ,EAAE;gBACR,mBAAmB;gBACnB,uBAAuB;gBACvB,8BAA8B;aAC/B;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EACL,sEAAsE;YACxE,QAAQ,EAAE;gBACR,wDAAwD;gBACxD,4DAA4D;gBAC5D,uEAAuE;aACxE;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EACL,8EAA8E;YAChF,QAAQ,EAAE;gBACR,+BAA+B;gBAC/B,4DAA4D;gBAC5D,oEAAoE;aACrE;SACF;KACF;IACD,OAAO,EAAE;QACP,KAAK,EAAE;YACL,OAAO,EAAE,iEAAiE;YAC1E,QAAQ,EAAE;gBACR,gCAAgC;gBAChC,2CAA2C;gBAC3C,iDAAiD;aAClD;SACF;KACF;CACF,CAAC;AAEF,SAAS,2BAA2B,CAClC,SAA2C;IAE3C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACtE,IACE,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;YACrC,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAYD,SAAS,wBAAwB,CAAC,IAAwB;IACxD,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAwB;IACvD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CACL,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAC1E,CAAC;AACJ,CAAC;AAsDD,MAAM,UAAU,iBAAiB,CAAC,IAAI,GAA0B,EAAE;IAChE,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,kBAAkB,GAAG,UAAU,IAAI,UAAU,CAAC;IACpD,MAAM,WAAW,GAAG,oBAAoB,CACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAC5D,CAAC;IACF,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,4BAA4B,GAAG,+BAA+B,EAAE,CAAC;IACvE,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAE/C,MAAM,SAAS,GACb,IAAI,CAAC,SAAS;QACd,2BAA2B,CAAC;YAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;IACL,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC;IACjC,MAAM,aAAa,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,oBAAoB,GACxB,SAAS;QACP,CAAC,CAAC;YACE,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,QAAQ,EAAE,SAAS,CAAC,QAAQ;SAC7B;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,eAAe,GAAG,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,mBAAmB,GACvB,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC;QACzC,SAAS,EAAE,mBAAmB,EAAE,OAAO,CAAC,IAAI,EAAE;QAC5C,CAAC,CAAC;YACE,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE;YAC/C,OAAO,EAAE,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE;SACtD;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAAG,eAAe,CAAC,6BAA6B,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,qCAAqC,CAC1D,IAAI,CAAC,aAAa;QAChB,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,8BAA8B,CAAC,EAAE;QAC3E,CAAC,CAAC,eAAe,CAAC,8BAA8B,CAAC,CACpD,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CACxB,CAAC;SACE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,GAA8B,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,GAA0C,EAAE,EAAE,CAC9D,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,CAAC,GAA0C,EAAE,EAAE,CAClE,GAAG,CAAC,CAAC,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,mBAAmB,GAAG,CAAC,GAA0C,EAAE,EAAE,CACzE,GAAG,CAAC,CAAC,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,CACnB,IAAY,EACZ,GAA0C,EAC1C,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,CAAC,GAA8B,EAAE,EAAE,CAClD,QAAQ,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;IAChD,MAAM,cAAc,GAAG,CACrB,KAAyB,EACzB,GAA8B,EAC9B,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,MAAM,oBAAoB,GAAG,CAC3B,KAAyB,EACzB,GAA8B,EAC9B,EAAE,CACF,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7E,MAAM,mBAAmB,GAAG;QAC1B;;aAES,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;cACrD;QACV,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,KAAK,GACT,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,WAAW;gBAC1C,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,GAAG;gBAC7C,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,WAAW,GAAG,CAAC;YACzD,OAAO,mHAAmH,GAAG,CAAC,MAAM,CAAC;;cAE7H,GAAG,CAAC,KAAK,CAAC;cACV,CAAC;QACX,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,gBAAgB,GAAG;;kKAEuI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,YAAY,CAAC,eAAe,CAAC;;;;;;;;;;;EAW3P,mBAAmB;;OAEd,CAAC;IACN,MAAM,uBAAuB,GAC3B,IAAI,CAAC,iBAAiB,KAAK,SAAS;QACpC,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC,CAAC;YACE,QAAQ,EAAE,sBAAsB;YAChC,UAAU,EAAE,wBAAwB;SACrC;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,iBAAiB,GACrB,IAAI,CAAC,iBAAiB,KAAK,KAAK;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,uBAAuB,CAAC,CAAC;IAC1D,MAAM,mBAAmB,GAAG,iBAAiB;QAC3C,CAAC,CAAC,+BAA+B,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,qCAAqC,oBAAoB,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,cAAc,CAAC,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC,aAAa,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,qCAAqC,oBAAoB,CAAC,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,OAAO,cAAc,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM;QACzgB,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,uBAAuB,GAAG,mBAAmB;QACjD,CAAC,CAAC,uFAAuF,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC;aAChH,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC1B,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC;6HAC6E,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;aAChK;QACT,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;IACnD,MAAM,qBAAqB,GAAG,kBAAkB;QAC9C,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,kBAAkB,CAAC,IAAI;YACzB,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAC5B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,oBAAoB,GAAG,qBAAqB;SAC/C,GAAG,CACF,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,mCAAmC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CACzG;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,wBAAwB,GAAG,eAAe;QAC9C,CAAC,CAAC;yJACmJ,QAAQ,CAAC,kBAAkB,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,WAAW,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,WAAW;QAC7T,CAAC,CAAC;oFAC8E,QAAQ,CAAC,kBAAkB,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC;IACjO,MAAM,6BAA6B,GAAG,eAAe;QACnD,CAAC,CAAC;uGACiG,GAAG,CAAC,eAAe,CAAC;iDAC1E,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;cACjG,GAAG,CAAC,eAAe,CAAC;yIACuG,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;WAC9K;QACP,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,gBAAgB,GACpB,kBAAkB,IAAI,kBAAkB;QACtC,CAAC,CAAC;;;;iBAIS,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC;;;;;;uEAMoB,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,YAAY,CAAC,oBAAoB,CAAC;;;;;;wEAMjE,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC;EACnG,oBAAoB;;;;mHAI6F,QAAQ,CAAC,kBAAkB,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;EAC5P,wBAAwB;;EAExB,6BAA6B;SACtB;QACH,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAC;IACrD,MAAM,iBAAiB,GAAG,eAAe;QACvC,CAAC,CAAC;;;;;;;;;;;;;;;;UAgBI;QACN,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,eAAe,GAAG,YAAY;QAClC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2KL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,kBAAkB,GAAG,YAAY;QACrC,CAAC,CAAC;;;;;uCAKiC,GAAG,CAAC,YAAY,CAAC;gBACxC,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC;;8DAEuB,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC;EACnF,SAAU,CAAC,WAAW,CAAC,CAAC,CAAC,gEAAgE,GAAG,CAAC,SAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAC3H,SAAU,CAAC,QAAQ,EAAE,MAAM;YACzB,CAAC,CAAC,oCAAoC,SAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,6CAA6C,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC7K,CAAC,CAAC,EACN;EACJ,eAAe,CAAC,CAAC,CAAC,2KAA2K,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;;eAEhP,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;;;EAI3D,eAAe;YACb,CAAC,CAAC,gFAAgF,GAAG,CAAC,eAAe,CAAC;gBAC1F,GAAG,CAAC,eAAe,CAAC;8GAC0E,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;eAC/I;YACX,CAAC,CAAC,EACN;;;2BAG2B;QACvB,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpE,MAAM,eAAe,GAAG,YAAY;QAClC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkKE;QACJ,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;cACK,cAAc;;;wCAGY,gBAAgB;;SAE/C,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;8CAClE,eAAe,CAAC,cAAc,CAAC;qCACxC,eAAe,CAAC,eAAe,CAAC;EAEnE,YAAY;QACV,CAAC,CAAC,qCAAqC,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC;qCAC7B,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC;2CACjB,GAAG,CAAC,SAAU,CAAC,OAAO,CAAC;qCAC7B,GAAG,CAAC,cAAc,CAAC;gDACR,GAAG,CAAC,cAAc,CAAC;0CACzB,8BAA8B;2CAC7B,+BAA+B;4CAC9B,gCAAgC;yCACnC,6BAA6B;;sCAEhC,GAAG,CAAC,cAAc,CAAC;0CACf,6BAA6B,IAAI;QACvE,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8hBE,eAAe;;;OAGV,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;EACjD,gBAAgB;EAChB,kBAAkB;;oBAEA,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;qCAC3F,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;;;;yBAIxJ,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;MACxC,YAAY,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,IAAI,EAAE;;EAE3D,eAAe;EAEf,kBAAkB;QAChB,CAAC,CAAC;;2EAEqE,kBAAkB,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,CAAC,EAAE;;WAE1K,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;;;;EAI3D,gBAAgB;;EAEhB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,6CAA6C,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,UAAU;CACtH;QACG,CAAC,CAAC,EACN;EAEE,UAAU;QACR,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;2CACqC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;0CACrD,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;;;;4BAIpD,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;;yBAEvC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;kFACe,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,IAAI,mBAAmB,CAAC,wBAAwB,CAAC;0BACzI,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;mFACC,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,IAAI,mBAAmB,CAAC,4BAA4B,CAAC;6BAC/I,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;EAC/E,mBAAmB;EACnB,uBAAuB;;;;;+CAKsB,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,YAAY,CAAC,gBAAgB,CAAC;mEACtC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;kEACzD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;0DAC9D,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;;;wCAGtE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;4CACtD,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,mDAAmD,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;sCAC7K,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;;sEAE1B,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;;4EAEpC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;uEACrD,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;;;;;0BAM/E,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;;yBAErC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;sFACmB,GAAG,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,IAAI,mBAAmB,CAAC,0BAA0B,CAAC;2BAChJ,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;;;2GAG0C,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;;;;;0BAKvI,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;;2BAEnC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;;;6GAG8B,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;;UAG/J;;;SAGS,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,kBAAkB,EAAE,kBAAkB,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;MAC7K,kBAAkB;;;uBAGD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;qCASb,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;wCAC3B,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;yCAChC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;sCACrC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;8BACvC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;yCACrB,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;oCAC7C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;qCAC3B,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;wCAChC,IAAI,CAAC,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC;wCAC1C,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC;;;yBAGzD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA4KxC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;iDACrB,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;kCAC3D,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+K9D,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8UjB,UAAU;QACR,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqeN;EAEE,kBAAkB;QAChB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+CF;QACA,CAAC,CAAC,EACN;EAEE,kBAAkB;QAChB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwDE;QACJ,CAAC,CAAC;0DAEN;EACE,eAAe;EAEf,eAAe,IAAI,mBAAmB;QACpC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuCF;QACA,CAAC,CAAC,EACN;;;QAGQ,CAAC;AACT,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,EAAE,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;8CAMqC,eAAe,CAAC,cAAc,CAAC;qCACxC,eAAe,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiG7D,CAAC;AACT,CAAC","sourcesContent":["/**\n * First-run onboarding page for agent-native apps.\n *\n * Shown when Better Auth is active and the user isn't signed in.\n * Provides a path to create or sign into an account from day one.\n *\n * After first account exists, this page acts as a normal login page.\n */\n\nimport { getLocaleInitScript } from \"../localization/server.js\";\nimport {\n DEFAULT_LOCALE,\n LOCALE_METADATA,\n LOCALE_STORAGE_KEY,\n SUPPORTED_LOCALES,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport {\n AGENT_NATIVE_SOCIAL_IMAGE_ALT,\n AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT,\n AGENT_NATIVE_SOCIAL_IMAGE_PATH,\n AGENT_NATIVE_SOCIAL_IMAGE_TYPE,\n AGENT_NATIVE_SOCIAL_IMAGE_WIDTH,\n withAgentNativeSocialImageCacheBuster,\n} from \"../shared/social-meta.js\";\nimport { normalizeAppBasePath } from \"./app-base-path.js\";\nimport {\n BUILT_IN_AUTH_MARKETING,\n resolveBuiltInAuthMarketing,\n type AuthMarketingContent,\n} from \"./auth-marketing.js\";\nimport {\n resolveGoogleAuthMode,\n type GoogleAuthMode,\n} from \"./google-auth-mode.js\";\nimport { hasGoogleSignInCredentials } from \"./google-oauth-credentials.js\";\nimport { identitySsoLoginButtonHtml } from \"./identity-sso-store.js\";\nimport { getPublicOAuthOrigin } from \"./oauth-public-origin.js\";\nimport { getWorkspaceGatewayReturnOrigin } from \"./oauth-return-url.js\";\n\nfunction hasGoogleOAuth(): boolean {\n return hasGoogleSignInCredentials();\n}\n\nfunction getConnectionLabel(): string {\n const url = process.env.DATABASE_URL || \"\";\n if (!url) return \"SQLite (local file)\";\n if (url.startsWith(\"pglite:\")) return \"PGlite (local Postgres)\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n if (url.includes(\"neon.tech\")) return \"Neon Postgres\";\n if (url.includes(\"supabase\")) return \"Supabase Postgres\";\n return \"Postgres\";\n }\n if (url.startsWith(\"file:\")) return \"SQLite (local file)\";\n if (url.startsWith(\"libsql://\") || url.includes(\"turso.io\")) return \"Turso\";\n return \"SQL database\";\n}\n\nfunction withAppBasePath(path: string): string {\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n const basePath = normalizeAppBasePath(\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH,\n );\n return `${basePath}${cleanPath}`;\n}\n\nconst AGENT_NATIVE_TERMS_URL = \"https://www.agent-native.com/terms\";\nconst AGENT_NATIVE_PRIVACY_URL = \"https://www.agent-native.com/privacy\";\n\nconst EN_AUTH_COPY = {\n languageLabel: \"Language\",\n systemLanguage: \"System\",\n pageTitleSignIn: \"Sign in\",\n pageTitleWelcome: \"Welcome\",\n welcomeTitle: \"Welcome\",\n signInTitle: \"Sign in\",\n welcomeBackTitle: \"Welcome back\",\n checkEmailTitle: \"Check your email\",\n resetPasswordTitle: \"Reset password\",\n createAccountSubtitle: \"Create an account to get started\",\n googleOnlySubtitle: \"Use your workspace Google account to continue\",\n signInSubtitle: \"Sign in to your account\",\n finishAccountSubtitle: \"Finish creating your account\",\n resetPasswordSubtitle: \"Reset your password\",\n upgradeCopy:\n \"Continue signing in to attach this app to your account and migrate local data.\",\n googleButton: \"Sign in with Google\",\n dividerOr: \"or\",\n createAccount: \"Create account\",\n signIn: \"Sign in\",\n email: \"Email\",\n password: \"Password\",\n confirmPassword: \"Confirm password\",\n passwordMinPlaceholder: \"At least 8 characters\",\n confirmPasswordPlaceholder: \"Confirm password\",\n enterPasswordPlaceholder: \"Enter password\",\n signupProgress: \"Signup progress\",\n progressAccount: \"Account\",\n progressVerify: \"Verify\",\n progressStart: \"Start\",\n verificationSent: \"Verification email sent\",\n verifyCopyPrefix: \"We sent a secure link to\",\n verifyCopySuffix:\n \". Click it, return here, and this app will finish signing you in automatically.\",\n verificationNote:\n \"You can keep this tab open. If it has not refreshed after you come back, use Continue.\",\n continue: \"Continue\",\n resendEmail: \"Resend email\",\n back: \"Back\",\n forgotPassword: \"Forgot password?\",\n sendResetLink: \"Send reset link\",\n backToSignIn: \"Back to sign in\",\n localNotePrefix: \"Your account is stored in this app's own DB\",\n localNoteSuffix: \", not a third-party service.\",\n runLocally: \"Run Locally\",\n runLocallySentence: \"Run locally\",\n openSource: \"100% free and open source\",\n useOwnGoogleClient: \"Use your own Google OAuth client:\",\n copyCommand: \"Copy command\",\n copied: \"Copied\",\n close: \"Close\",\n closeGoogleChoices: \"Close Google sign-in choices\",\n legalPrefix: \"By signing up, you accept our\",\n legalTerms: \"Terms\",\n legalConnector: \"and\",\n legalPrivacy: \"Privacy Policy\",\n legalSuffix: \".\",\n invalidEmail: \"Enter a valid email address, like you@example.com.\",\n signInToContinue: \"Sign in to continue.\",\n finishSignInFailed: \"Could not finish sign-in automatically.\",\n enterPasswordAfterVerification:\n \"Enter your password after verifying your email.\",\n finishSignInManually:\n \"We could not finish sign-in automatically. Sign in to continue.\",\n stillWaitingVerification:\n \"Still waiting on verification. Click the link in your email, then try Continue again.\",\n checkVerificationFailed: \"Could not check verification. Please try again.\",\n checking: \"Checking...\",\n checkingVerification: \"Checking your verification...\",\n sending: \"Sending...\",\n sent: \"Sent\",\n sentVerification: \"Sent a fresh verification link.\",\n resendVerificationFailed: \"Could not resend the verification email.\",\n networkErrorRetry: \"Network error. Please try again.\",\n networkErrorDashRetry: \"Network error — please try again\",\n passwordsMismatch: \"Passwords do not match\",\n creatingAccount: \"Creating account…\",\n registrationFailed: \"Registration failed\",\n accountCreatedSigningIn: \"Account created — signing you in…\",\n emailVerifiedFinishing: \"Email verified. Finishing sign-in...\",\n emailVerifiedSignIn: \"Email verified. Sign in to continue.\",\n resetEmailSent: \"If that email exists, a reset link is on its way.\",\n resetEmailFailed: \"Could not send reset email.\",\n signingIn: \"Signing in…\",\n invalidLogin: \"Invalid email or password\",\n googleNotConfigured: \"Google OAuth is not configured.\",\n failedToConnect: \"Failed to connect. Please try again.\",\n migrateLocalFallback: \"Continue signing in to migrate local data.\",\n googlePopupHelp: \"Allow popups for this site and try again\",\n googleNeverFinished:\n \"Google sign-in did not finish. Check the Google OAuth redirect URI and server logs for [agent-native][google-oauth].\",\n};\n\nconst AUTH_LOCALE_COPY: Record<LocaleCode, typeof EN_AUTH_COPY> = {\n \"en-US\": EN_AUTH_COPY,\n \"zh-CN\": {\n languageLabel: \"语言\",\n systemLanguage: \"系统\",\n pageTitleSignIn: \"登录\",\n pageTitleWelcome: \"欢迎\",\n welcomeTitle: \"欢迎\",\n signInTitle: \"登录\",\n welcomeBackTitle: \"欢迎回来\",\n checkEmailTitle: \"检查你的邮箱\",\n resetPasswordTitle: \"重置密码\",\n createAccountSubtitle: \"创建账户即可开始\",\n googleOnlySubtitle: \"使用你的工作区 Google 账户继续\",\n signInSubtitle: \"登录你的账户\",\n finishAccountSubtitle: \"完成账户创建\",\n resetPasswordSubtitle: \"重置你的密码\",\n upgradeCopy: \"继续登录,将此应用关联到你的账户并迁移本地数据。\",\n googleButton: \"使用 Google 登录\",\n dividerOr: \"或\",\n createAccount: \"创建账户\",\n signIn: \"登录\",\n email: \"电子邮箱\",\n password: \"密码\",\n confirmPassword: \"确认密码\",\n passwordMinPlaceholder: \"至少 8 个字符\",\n confirmPasswordPlaceholder: \"确认密码\",\n enterPasswordPlaceholder: \"输入密码\",\n signupProgress: \"注册进度\",\n progressAccount: \"账户\",\n progressVerify: \"验证\",\n progressStart: \"开始\",\n verificationSent: \"验证邮件已发送\",\n verifyCopyPrefix: \"我们已向\",\n verifyCopySuffix: \"发送安全链接。点击链接后回到这里,应用会自动完成登录。\",\n verificationNote:\n \"你可以保持此标签页打开。如果回来后没有自动刷新,请点击继续。\",\n continue: \"继续\",\n resendEmail: \"重新发送邮件\",\n back: \"返回\",\n forgotPassword: \"忘记密码?\",\n sendResetLink: \"发送重置链接\",\n backToSignIn: \"返回登录\",\n localNotePrefix: \"你的账户存储在此应用自己的数据库中\",\n localNoteSuffix: \",而不是第三方服务。\",\n runLocally: \"本地运行\",\n runLocallySentence: \"本地运行\",\n openSource: \"100% 免费且开源\",\n useOwnGoogleClient: \"使用你自己的 Google OAuth 客户端:\",\n copyCommand: \"复制命令\",\n copied: \"已复制\",\n close: \"关闭\",\n closeGoogleChoices: \"关闭 Google 登录选项\",\n legalPrefix: \"注册即表示你接受我们的\",\n legalTerms: \"条款\",\n legalConnector: \"和\",\n legalPrivacy: \"隐私政策\",\n legalSuffix: \"。\",\n invalidEmail: \"请输入有效邮箱地址,例如 you@example.com。\",\n signInToContinue: \"登录以继续。\",\n finishSignInFailed: \"无法自动完成登录。\",\n enterPasswordAfterVerification: \"验证邮箱后请输入密码。\",\n finishSignInManually: \"无法自动完成登录。请登录以继续。\",\n stillWaitingVerification:\n \"仍在等待验证。请点击邮件中的链接,然后再次点击继续。\",\n checkVerificationFailed: \"无法检查验证状态。请重试。\",\n checking: \"正在检查...\",\n checkingVerification: \"正在检查验证状态...\",\n sending: \"正在发送...\",\n sent: \"已发送\",\n sentVerification: \"新的验证链接已发送。\",\n resendVerificationFailed: \"无法重新发送验证邮件。\",\n networkErrorRetry: \"网络错误。请重试。\",\n networkErrorDashRetry: \"网络错误 — 请重试\",\n passwordsMismatch: \"两次输入的密码不一致\",\n creatingAccount: \"正在创建账户…\",\n registrationFailed: \"注册失败\",\n accountCreatedSigningIn: \"账户已创建 — 正在登录…\",\n emailVerifiedFinishing: \"邮箱已验证。正在完成登录...\",\n emailVerifiedSignIn: \"邮箱已验证。请登录以继续。\",\n resetEmailSent: \"如果该邮箱存在,重置链接已在发送途中。\",\n resetEmailFailed: \"无法发送重置邮件。\",\n signingIn: \"正在登录…\",\n invalidLogin: \"邮箱或密码无效\",\n googleNotConfigured: \"Google OAuth 未配置。\",\n failedToConnect: \"连接失败。请重试。\",\n migrateLocalFallback: \"继续登录以迁移本地数据。\",\n googlePopupHelp: \"请允许此网站弹出窗口后重试\",\n googleNeverFinished:\n \"Google 登录未完成。请检查 Google OAuth 重定向 URI 和服务器日志中的 [agent-native][google-oauth]。\",\n },\n \"zh-TW\": {\n languageLabel: \"語言\",\n systemLanguage: \"系統\",\n pageTitleSignIn: \"登入\",\n pageTitleWelcome: \"歡迎\",\n welcomeTitle: \"歡迎\",\n signInTitle: \"登入\",\n welcomeBackTitle: \"歡迎回來\",\n checkEmailTitle: \"檢查你的電子郵件\",\n resetPasswordTitle: \"重設密碼\",\n createAccountSubtitle: \"建立帳號即可開始\",\n googleOnlySubtitle: \"使用你的工作區 Google 帳號繼續\",\n signInSubtitle: \"登入你的帳號\",\n finishAccountSubtitle: \"完成帳號建立\",\n resetPasswordSubtitle: \"重設你的密碼\",\n upgradeCopy: \"繼續登入,將此應用程式連結到你的帳號並遷移本機資料。\",\n googleButton: \"使用 Google 登入\",\n dividerOr: \"或\",\n createAccount: \"建立帳號\",\n signIn: \"登入\",\n email: \"電子郵件\",\n password: \"密碼\",\n confirmPassword: \"確認密碼\",\n passwordMinPlaceholder: \"至少 8 個字元\",\n confirmPasswordPlaceholder: \"確認密碼\",\n enterPasswordPlaceholder: \"輸入密碼\",\n signupProgress: \"註冊進度\",\n progressAccount: \"帳號\",\n progressVerify: \"驗證\",\n progressStart: \"開始\",\n verificationSent: \"驗證郵件已送出\",\n verifyCopyPrefix: \"我們已將安全連結寄到\",\n verifyCopySuffix: \"。點擊連結後回到這裡,應用程式會自動完成登入。\",\n verificationNote:\n \"你可以保持此分頁開啟。如果回來後沒有自動重新整理,請點擊繼續。\",\n continue: \"繼續\",\n resendEmail: \"重新寄送郵件\",\n back: \"返回\",\n forgotPassword: \"忘記密碼?\",\n sendResetLink: \"寄送重設連結\",\n backToSignIn: \"返回登入\",\n localNotePrefix: \"你的帳號儲存在此應用程式自己的資料庫中\",\n localNoteSuffix: \",而不是第三方服務。\",\n runLocally: \"在本機執行\",\n runLocallySentence: \"在本機執行\",\n openSource: \"100% 免費且開源\",\n useOwnGoogleClient: \"使用你自己的 Google OAuth 用戶端:\",\n copyCommand: \"複製指令\",\n copied: \"已複製\",\n close: \"關閉\",\n closeGoogleChoices: \"關閉 Google 登入選項\",\n legalPrefix: \"註冊即表示你接受我們的\",\n legalTerms: \"條款\",\n legalConnector: \"和\",\n legalPrivacy: \"隱私權政策\",\n legalSuffix: \"。\",\n invalidEmail: \"請輸入有效的電子郵件地址,例如 you@example.com。\",\n signInToContinue: \"登入以繼續。\",\n finishSignInFailed: \"無法自動完成登入。\",\n enterPasswordAfterVerification: \"驗證電子郵件後請輸入密碼。\",\n finishSignInManually: \"無法自動完成登入。請登入以繼續。\",\n stillWaitingVerification:\n \"仍在等待驗證。請點擊郵件中的連結,然後再次點擊繼續。\",\n checkVerificationFailed: \"無法檢查驗證狀態。請重試。\",\n checking: \"正在檢查...\",\n checkingVerification: \"正在檢查驗證狀態...\",\n sending: \"正在寄送...\",\n sent: \"已送出\",\n sentVerification: \"新的驗證連結已送出。\",\n resendVerificationFailed: \"無法重新寄送驗證郵件。\",\n networkErrorRetry: \"網路錯誤。請重試。\",\n networkErrorDashRetry: \"網路錯誤 - 請重試\",\n passwordsMismatch: \"兩次輸入的密碼不一致\",\n creatingAccount: \"正在建立帳號...\",\n registrationFailed: \"註冊失敗\",\n accountCreatedSigningIn: \"帳號已建立,正在登入...\",\n emailVerifiedFinishing: \"電子郵件已驗證。正在完成登入...\",\n emailVerifiedSignIn: \"電子郵件已驗證。請登入以繼續。\",\n resetEmailSent: \"如果該電子郵件存在,重設連結已在寄送途中。\",\n resetEmailFailed: \"無法寄送重設郵件。\",\n signingIn: \"正在登入...\",\n invalidLogin: \"電子郵件或密碼無效\",\n googleNotConfigured: \"Google OAuth 尚未設定。\",\n failedToConnect: \"連線失敗。請重試。\",\n migrateLocalFallback: \"繼續登入以遷移本機資料。\",\n googlePopupHelp: \"請允許此網站開啟彈出式視窗後重試\",\n googleNeverFinished:\n \"Google 登入未完成。請檢查 Google OAuth 重新導向 URI,以及伺服器記錄中的 [agent-native][google-oauth]。\",\n },\n \"es-ES\": {\n languageLabel: \"Idioma\",\n systemLanguage: \"Sistema\",\n pageTitleSignIn: \"Iniciar sesión\",\n pageTitleWelcome: \"Bienvenido\",\n welcomeTitle: \"Bienvenido\",\n signInTitle: \"Iniciar sesión\",\n welcomeBackTitle: \"Bienvenido de nuevo\",\n checkEmailTitle: \"Revisa tu email\",\n resetPasswordTitle: \"Restablecer contraseña\",\n createAccountSubtitle: \"Crea una cuenta para empezar\",\n googleOnlySubtitle: \"Usa tu cuenta de Google del espacio de trabajo\",\n signInSubtitle: \"Inicia sesión en tu cuenta\",\n finishAccountSubtitle: \"Termina de crear tu cuenta\",\n resetPasswordSubtitle: \"Restablece tu contraseña\",\n upgradeCopy:\n \"Sigue iniciando sesión para conectar esta app a tu cuenta y migrar datos locales.\",\n googleButton: \"Iniciar sesión con Google\",\n dividerOr: \"o\",\n createAccount: \"Crear cuenta\",\n signIn: \"Iniciar sesión\",\n email: \"Email\",\n password: \"Contraseña\",\n confirmPassword: \"Confirmar contraseña\",\n passwordMinPlaceholder: \"Al menos 8 caracteres\",\n confirmPasswordPlaceholder: \"Confirmar contraseña\",\n enterPasswordPlaceholder: \"Introduce la contraseña\",\n signupProgress: \"Progreso de registro\",\n progressAccount: \"Cuenta\",\n progressVerify: \"Verificar\",\n progressStart: \"Empezar\",\n verificationSent: \"Email de verificación enviado\",\n verifyCopyPrefix: \"Enviamos un enlace seguro a\",\n verifyCopySuffix:\n \". Haz clic en él, vuelve aquí y esta app terminará de iniciar sesión automáticamente.\",\n verificationNote:\n \"Puedes dejar esta pestaña abierta. Si no se actualiza al volver, usa Continuar.\",\n continue: \"Continuar\",\n resendEmail: \"Reenviar email\",\n back: \"Volver\",\n forgotPassword: \"¿Olvidaste tu contraseña?\",\n sendResetLink: \"Enviar enlace de restablecimiento\",\n backToSignIn: \"Volver a iniciar sesión\",\n localNotePrefix:\n \"Tu cuenta se almacena en la propia base de datos de esta app\",\n localNoteSuffix: \", no en un servicio de terceros.\",\n runLocally: \"Ejecutar localmente\",\n runLocallySentence: \"Ejecutar localmente\",\n openSource: \"100% gratis y de código abierto\",\n useOwnGoogleClient: \"Usa tu propio cliente de Google OAuth:\",\n copyCommand: \"Copiar comando\",\n copied: \"Copiado\",\n close: \"Cerrar\",\n closeGoogleChoices: \"Cerrar opciones de inicio con Google\",\n legalPrefix: \"Al registrarte, aceptas nuestros\",\n legalTerms: \"Términos\",\n legalConnector: \"y\",\n legalPrivacy: \"Política de privacidad\",\n legalSuffix: \".\",\n invalidEmail: \"Introduce un email válido, como you@example.com.\",\n signInToContinue: \"Inicia sesión para continuar.\",\n finishSignInFailed: \"No se pudo completar el inicio automáticamente.\",\n enterPasswordAfterVerification:\n \"Introduce tu contraseña después de verificar tu email.\",\n finishSignInManually:\n \"No se pudo completar el inicio automáticamente. Inicia sesión para continuar.\",\n stillWaitingVerification:\n \"Aún esperamos la verificación. Haz clic en el enlace del email y luego prueba Continuar de nuevo.\",\n checkVerificationFailed:\n \"No se pudo comprobar la verificación. Inténtalo de nuevo.\",\n checking: \"Comprobando...\",\n checkingVerification: \"Comprobando tu verificación...\",\n sending: \"Enviando...\",\n sent: \"Enviado\",\n sentVerification: \"Se envió un nuevo enlace de verificación.\",\n resendVerificationFailed: \"No se pudo reenviar el email de verificación.\",\n networkErrorRetry: \"Error de red. Inténtalo de nuevo.\",\n networkErrorDashRetry: \"Error de red — inténtalo de nuevo\",\n passwordsMismatch: \"Las contraseñas no coinciden\",\n creatingAccount: \"Creando cuenta…\",\n registrationFailed: \"Error al registrarse\",\n accountCreatedSigningIn: \"Cuenta creada — iniciando sesión…\",\n emailVerifiedFinishing: \"Email verificado. Terminando inicio de sesión...\",\n emailVerifiedSignIn: \"Email verificado. Inicia sesión para continuar.\",\n resetEmailSent:\n \"Si ese email existe, el enlace de restablecimiento está en camino.\",\n resetEmailFailed: \"No se pudo enviar el email de restablecimiento.\",\n signingIn: \"Iniciando sesión…\",\n invalidLogin: \"Email o contraseña no válidos\",\n googleNotConfigured: \"Google OAuth no está configurado.\",\n failedToConnect: \"No se pudo conectar. Inténtalo de nuevo.\",\n migrateLocalFallback: \"Sigue iniciando sesión para migrar datos locales.\",\n googlePopupHelp:\n \"Permite ventanas emergentes para este sitio e inténtalo de nuevo\",\n googleNeverFinished:\n \"El inicio de sesión con Google no terminó. Comprueba el URI de redirección de Google OAuth y los logs del servidor para [agent-native][google-oauth].\",\n },\n \"fr-FR\": {\n languageLabel: \"Langue\",\n systemLanguage: \"Système\",\n pageTitleSignIn: \"Connexion\",\n pageTitleWelcome: \"Bienvenue\",\n welcomeTitle: \"Bienvenue\",\n signInTitle: \"Connexion\",\n welcomeBackTitle: \"Bon retour\",\n checkEmailTitle: \"Vérifiez votre e-mail\",\n resetPasswordTitle: \"Réinitialiser le mot de passe\",\n createAccountSubtitle: \"Créez un compte pour commencer\",\n googleOnlySubtitle: \"Utilisez le compte Google de votre espace de travail\",\n signInSubtitle: \"Connectez-vous à votre compte\",\n finishAccountSubtitle: \"Terminez la création de votre compte\",\n resetPasswordSubtitle: \"Réinitialisez votre mot de passe\",\n upgradeCopy:\n \"Continuez la connexion pour associer cette app à votre compte et migrer les données locales.\",\n googleButton: \"Se connecter avec Google\",\n dividerOr: \"ou\",\n createAccount: \"Créer un compte\",\n signIn: \"Connexion\",\n email: \"E-mail\",\n password: \"Mot de passe\",\n confirmPassword: \"Confirmer le mot de passe\",\n passwordMinPlaceholder: \"Au moins 8 caractères\",\n confirmPasswordPlaceholder: \"Confirmer le mot de passe\",\n enterPasswordPlaceholder: \"Saisir le mot de passe\",\n signupProgress: \"Progression de l'inscription\",\n progressAccount: \"Compte\",\n progressVerify: \"Vérifier\",\n progressStart: \"Démarrer\",\n verificationSent: \"E-mail de vérification envoyé\",\n verifyCopyPrefix: \"Nous avons envoyé un lien sécurisé à\",\n verifyCopySuffix:\n \". Cliquez dessus, revenez ici, et cette app terminera automatiquement la connexion.\",\n verificationNote:\n \"Vous pouvez garder cet onglet ouvert. S'il ne s'actualise pas à votre retour, utilisez Continuer.\",\n continue: \"Continuer\",\n resendEmail: \"Renvoyer l'e-mail\",\n back: \"Retour\",\n forgotPassword: \"Mot de passe oublié ?\",\n sendResetLink: \"Envoyer le lien de réinitialisation\",\n backToSignIn: \"Retour à la connexion\",\n localNotePrefix:\n \"Votre compte est stocké dans la base de données propre à cette app\",\n localNoteSuffix: \", pas dans un service tiers.\",\n runLocally: \"Exécuter localement\",\n runLocallySentence: \"Exécuter localement\",\n openSource: \"100 % gratuit et open source\",\n useOwnGoogleClient: \"Utilisez votre propre client Google OAuth :\",\n copyCommand: \"Copier la commande\",\n copied: \"Copié\",\n close: \"Fermer\",\n closeGoogleChoices: \"Fermer les choix de connexion Google\",\n legalPrefix: \"En vous inscrivant, vous acceptez nos\",\n legalTerms: \"Conditions\",\n legalConnector: \"et\",\n legalPrivacy: \"Politique de confidentialité\",\n legalSuffix: \".\",\n invalidEmail: \"Saisissez une adresse e-mail valide, comme you@example.com.\",\n signInToContinue: \"Connectez-vous pour continuer.\",\n finishSignInFailed: \"Impossible de terminer la connexion automatiquement.\",\n enterPasswordAfterVerification:\n \"Saisissez votre mot de passe après avoir vérifié votre e-mail.\",\n finishSignInManually:\n \"Impossible de terminer la connexion automatiquement. Connectez-vous pour continuer.\",\n stillWaitingVerification:\n \"La vérification est toujours en attente. Cliquez sur le lien dans votre e-mail, puis réessayez Continuer.\",\n checkVerificationFailed:\n \"Impossible de vérifier l'état. Veuillez réessayer.\",\n checking: \"Vérification...\",\n checkingVerification: \"Vérification en cours...\",\n sending: \"Envoi...\",\n sent: \"Envoyé\",\n sentVerification: \"Nouveau lien de vérification envoyé.\",\n resendVerificationFailed:\n \"Impossible de renvoyer l'e-mail de vérification.\",\n networkErrorRetry: \"Erreur réseau. Veuillez réessayer.\",\n networkErrorDashRetry: \"Erreur réseau — veuillez réessayer\",\n passwordsMismatch: \"Les mots de passe ne correspondent pas\",\n creatingAccount: \"Création du compte…\",\n registrationFailed: \"Échec de l'inscription\",\n accountCreatedSigningIn: \"Compte créé — connexion en cours…\",\n emailVerifiedFinishing: \"E-mail vérifié. Connexion en cours...\",\n emailVerifiedSignIn: \"E-mail vérifié. Connectez-vous pour continuer.\",\n resetEmailSent:\n \"Si cet e-mail existe, un lien de réinitialisation est en route.\",\n resetEmailFailed: \"Impossible d'envoyer l'e-mail de réinitialisation.\",\n signingIn: \"Connexion…\",\n invalidLogin: \"E-mail ou mot de passe invalide\",\n googleNotConfigured: \"Google OAuth n'est pas configuré.\",\n failedToConnect: \"Connexion impossible. Veuillez réessayer.\",\n migrateLocalFallback:\n \"Continuez la connexion pour migrer les données locales.\",\n googlePopupHelp: \"Autorisez les fenêtres pop-up pour ce site et réessayez\",\n googleNeverFinished:\n \"La connexion Google n'a pas abouti. Vérifiez l'URI de redirection Google OAuth et les logs serveur pour [agent-native][google-oauth].\",\n },\n \"de-DE\": {\n languageLabel: \"Sprache\",\n systemLanguage: \"System\",\n pageTitleSignIn: \"Anmelden\",\n pageTitleWelcome: \"Willkommen\",\n welcomeTitle: \"Willkommen\",\n signInTitle: \"Anmelden\",\n welcomeBackTitle: \"Willkommen zurück\",\n checkEmailTitle: \"E-Mail prüfen\",\n resetPasswordTitle: \"Passwort zurücksetzen\",\n createAccountSubtitle: \"Erstelle ein Konto, um zu beginnen\",\n googleOnlySubtitle: \"Verwende dein Workspace-Google-Konto\",\n signInSubtitle: \"Melde dich bei deinem Konto an\",\n finishAccountSubtitle: \"Schließe die Kontoerstellung ab\",\n resetPasswordSubtitle: \"Setze dein Passwort zurück\",\n upgradeCopy:\n \"Melde dich weiter an, um diese App mit deinem Konto zu verbinden und lokale Daten zu migrieren.\",\n googleButton: \"Mit Google anmelden\",\n dividerOr: \"oder\",\n createAccount: \"Konto erstellen\",\n signIn: \"Anmelden\",\n email: \"E-Mail\",\n password: \"Passwort\",\n confirmPassword: \"Passwort bestätigen\",\n passwordMinPlaceholder: \"Mindestens 8 Zeichen\",\n confirmPasswordPlaceholder: \"Passwort bestätigen\",\n enterPasswordPlaceholder: \"Passwort eingeben\",\n signupProgress: \"Registrierungsfortschritt\",\n progressAccount: \"Konto\",\n progressVerify: \"Prüfen\",\n progressStart: \"Start\",\n verificationSent: \"Bestätigungs-E-Mail gesendet\",\n verifyCopyPrefix: \"Wir haben einen sicheren Link gesendet an\",\n verifyCopySuffix:\n \". Klicke darauf, kehre hierher zurück, und diese App meldet dich automatisch an.\",\n verificationNote:\n \"Du kannst diesen Tab geöffnet lassen. Wenn er nach deiner Rückkehr nicht aktualisiert wird, nutze Weiter.\",\n continue: \"Weiter\",\n resendEmail: \"E-Mail erneut senden\",\n back: \"Zurück\",\n forgotPassword: \"Passwort vergessen?\",\n sendResetLink: \"Reset-Link senden\",\n backToSignIn: \"Zurück zur Anmeldung\",\n localNotePrefix:\n \"Dein Konto wird in der eigenen Datenbank dieser App gespeichert\",\n localNoteSuffix: \", nicht bei einem Drittanbieter.\",\n runLocally: \"Lokal ausführen\",\n runLocallySentence: \"Lokal ausführen\",\n openSource: \"100 % kostenlos und Open Source\",\n useOwnGoogleClient: \"Eigenen Google-OAuth-Client verwenden:\",\n copyCommand: \"Befehl kopieren\",\n copied: \"Kopiert\",\n close: \"Schließen\",\n closeGoogleChoices: \"Google-Anmeldeoptionen schließen\",\n legalPrefix: \"Mit der Registrierung akzeptierst du unsere\",\n legalTerms: \"Bedingungen\",\n legalConnector: \"und\",\n legalPrivacy: \"Datenschutzrichtlinie\",\n legalSuffix: \".\",\n invalidEmail: \"Gib eine gültige E-Mail-Adresse ein, z. B. you@example.com.\",\n signInToContinue: \"Melde dich an, um fortzufahren.\",\n finishSignInFailed:\n \"Die Anmeldung konnte nicht automatisch abgeschlossen werden.\",\n enterPasswordAfterVerification:\n \"Gib dein Passwort ein, nachdem du deine E-Mail bestätigt hast.\",\n finishSignInManually:\n \"Die Anmeldung konnte nicht automatisch abgeschlossen werden. Melde dich an, um fortzufahren.\",\n stillWaitingVerification:\n \"Die Bestätigung steht noch aus. Klicke auf den Link in deiner E-Mail und versuche Weiter erneut.\",\n checkVerificationFailed:\n \"Bestätigung konnte nicht geprüft werden. Bitte erneut versuchen.\",\n checking: \"Prüfen...\",\n checkingVerification: \"Bestätigung wird geprüft...\",\n sending: \"Senden...\",\n sent: \"Gesendet\",\n sentVerification: \"Ein neuer Bestätigungslink wurde gesendet.\",\n resendVerificationFailed:\n \"Bestätigungs-E-Mail konnte nicht erneut gesendet werden.\",\n networkErrorRetry: \"Netzwerkfehler. Bitte erneut versuchen.\",\n networkErrorDashRetry: \"Netzwerkfehler — bitte erneut versuchen\",\n passwordsMismatch: \"Die Passwörter stimmen nicht überein\",\n creatingAccount: \"Konto wird erstellt…\",\n registrationFailed: \"Registrierung fehlgeschlagen\",\n accountCreatedSigningIn: \"Konto erstellt — Anmeldung läuft…\",\n emailVerifiedFinishing: \"E-Mail bestätigt. Anmeldung wird abgeschlossen...\",\n emailVerifiedSignIn: \"E-Mail bestätigt. Melde dich an, um fortzufahren.\",\n resetEmailSent:\n \"Falls diese E-Mail existiert, ist ein Reset-Link unterwegs.\",\n resetEmailFailed: \"Reset-E-Mail konnte nicht gesendet werden.\",\n signingIn: \"Anmeldung…\",\n invalidLogin: \"E-Mail oder Passwort ungültig\",\n googleNotConfigured: \"Google OAuth ist nicht konfiguriert.\",\n failedToConnect: \"Verbindung fehlgeschlagen. Bitte erneut versuchen.\",\n migrateLocalFallback: \"Melde dich weiter an, um lokale Daten zu migrieren.\",\n googlePopupHelp: \"Erlaube Pop-ups für diese Website und versuche es erneut\",\n googleNeverFinished:\n \"Die Google-Anmeldung wurde nicht abgeschlossen. Prüfe die Google-OAuth-Redirect-URI und Serverlogs für [agent-native][google-oauth].\",\n },\n \"ja-JP\": {\n languageLabel: \"言語\",\n systemLanguage: \"システム\",\n pageTitleSignIn: \"サインイン\",\n pageTitleWelcome: \"ようこそ\",\n welcomeTitle: \"ようこそ\",\n signInTitle: \"サインイン\",\n welcomeBackTitle: \"おかえりなさい\",\n checkEmailTitle: \"メールを確認してください\",\n resetPasswordTitle: \"パスワードをリセット\",\n createAccountSubtitle: \"アカウントを作成して始めましょう\",\n googleOnlySubtitle: \"ワークスペースの Google アカウントで続行\",\n signInSubtitle: \"アカウントにサインイン\",\n finishAccountSubtitle: \"アカウント作成を完了\",\n resetPasswordSubtitle: \"パスワードをリセットします\",\n upgradeCopy:\n \"サインインを続けて、このアプリをアカウントに接続し、ローカルデータを移行します。\",\n googleButton: \"Google でサインイン\",\n dividerOr: \"または\",\n createAccount: \"アカウントを作成\",\n signIn: \"サインイン\",\n email: \"メール\",\n password: \"パスワード\",\n confirmPassword: \"パスワードを確認\",\n passwordMinPlaceholder: \"8 文字以上\",\n confirmPasswordPlaceholder: \"パスワードを確認\",\n enterPasswordPlaceholder: \"パスワードを入力\",\n signupProgress: \"登録の進行状況\",\n progressAccount: \"アカウント\",\n progressVerify: \"確認\",\n progressStart: \"開始\",\n verificationSent: \"確認メールを送信しました\",\n verifyCopyPrefix: \"安全なリンクを送信しました:\",\n verifyCopySuffix:\n \"。リンクをクリックしてここに戻ると、このアプリが自動的にサインインを完了します。\",\n verificationNote:\n \"このタブは開いたままで構いません。戻っても更新されない場合は、続行を押してください。\",\n continue: \"続行\",\n resendEmail: \"メールを再送信\",\n back: \"戻る\",\n forgotPassword: \"パスワードをお忘れですか?\",\n sendResetLink: \"リセットリンクを送信\",\n backToSignIn: \"サインインに戻る\",\n localNotePrefix: \"アカウントはこのアプリ自身の DB に保存されます\",\n localNoteSuffix: \"。サードパーティサービスには保存されません。\",\n runLocally: \"ローカルで実行\",\n runLocallySentence: \"ローカルで実行\",\n openSource: \"100% 無料でオープンソース\",\n useOwnGoogleClient: \"自分の Google OAuth クライアントを使用:\",\n copyCommand: \"コマンドをコピー\",\n copied: \"コピーしました\",\n close: \"閉じる\",\n closeGoogleChoices: \"Google サインインの選択肢を閉じる\",\n legalPrefix: \"登録すると、以下に同意したものとみなされます:\",\n legalTerms: \"利用規約\",\n legalConnector: \"および\",\n legalPrivacy: \"プライバシーポリシー\",\n legalSuffix: \"。\",\n invalidEmail:\n \"you@example.com のような有効なメールアドレスを入力してください。\",\n signInToContinue: \"続行するにはサインインしてください。\",\n finishSignInFailed: \"サインインを自動で完了できませんでした。\",\n enterPasswordAfterVerification:\n \"メールを確認した後、パスワードを入力してください。\",\n finishSignInManually:\n \"サインインを自動で完了できませんでした。続行するにはサインインしてください。\",\n stillWaitingVerification:\n \"まだ確認待ちです。メール内のリンクをクリックしてから、もう一度続行してください。\",\n checkVerificationFailed:\n \"確認状態をチェックできませんでした。もう一度お試しください。\",\n checking: \"確認中...\",\n checkingVerification: \"確認状態をチェック中...\",\n sending: \"送信中...\",\n sent: \"送信済み\",\n sentVerification: \"新しい確認リンクを送信しました。\",\n resendVerificationFailed: \"確認メールを再送信できませんでした。\",\n networkErrorRetry: \"ネットワークエラーです。もう一度お試しください。\",\n networkErrorDashRetry: \"ネットワークエラー — もう一度お試しください\",\n passwordsMismatch: \"パスワードが一致しません\",\n creatingAccount: \"アカウントを作成中…\",\n registrationFailed: \"登録に失敗しました\",\n accountCreatedSigningIn: \"アカウントを作成しました — サインイン中…\",\n emailVerifiedFinishing: \"メールを確認しました。サインインを完了中...\",\n emailVerifiedSignIn:\n \"メールを確認しました。続行するにはサインインしてください。\",\n resetEmailSent: \"そのメールが存在する場合、リセットリンクを送信しました。\",\n resetEmailFailed: \"リセットメールを送信できませんでした。\",\n signingIn: \"サインイン中…\",\n invalidLogin: \"メールまたはパスワードが正しくありません\",\n googleNotConfigured: \"Google OAuth が設定されていません。\",\n failedToConnect: \"接続できませんでした。もう一度お試しください。\",\n migrateLocalFallback: \"サインインを続けてローカルデータを移行します。\",\n googlePopupHelp:\n \"このサイトのポップアップを許可してから、もう一度お試しください\",\n googleNeverFinished:\n \"Google サインインが完了しませんでした。Google OAuth リダイレクト URI と [agent-native][google-oauth] のサーバーログを確認してください。\",\n },\n \"ko-KR\": {\n languageLabel: \"언어\",\n systemLanguage: \"시스템\",\n pageTitleSignIn: \"로그인\",\n pageTitleWelcome: \"환영합니다\",\n welcomeTitle: \"환영합니다\",\n signInTitle: \"로그인\",\n welcomeBackTitle: \"다시 오신 것을 환영합니다\",\n checkEmailTitle: \"이메일을 확인하세요\",\n resetPasswordTitle: \"비밀번호 재설정\",\n createAccountSubtitle: \"계정을 만들고 시작하세요\",\n googleOnlySubtitle: \"워크스페이스 Google 계정으로 계속하기\",\n signInSubtitle: \"계정에 로그인하세요\",\n finishAccountSubtitle: \"계정 생성을 완료하세요\",\n resetPasswordSubtitle: \"비밀번호를 재설정하세요\",\n upgradeCopy:\n \"계속 로그인하여 이 앱을 계정에 연결하고 로컬 데이터를 마이그레이션하세요.\",\n googleButton: \"Google로 로그인\",\n dividerOr: \"또는\",\n createAccount: \"계정 만들기\",\n signIn: \"로그인\",\n email: \"이메일\",\n password: \"비밀번호\",\n confirmPassword: \"비밀번호 확인\",\n passwordMinPlaceholder: \"8자 이상\",\n confirmPasswordPlaceholder: \"비밀번호 확인\",\n enterPasswordPlaceholder: \"비밀번호 입력\",\n signupProgress: \"가입 진행 상황\",\n progressAccount: \"계정\",\n progressVerify: \"확인\",\n progressStart: \"시작\",\n verificationSent: \"확인 이메일을 보냈습니다\",\n verifyCopyPrefix: \"보안 링크를 보냈습니다:\",\n verifyCopySuffix:\n \". 링크를 클릭하고 여기로 돌아오면 이 앱이 자동으로 로그인을 완료합니다.\",\n verificationNote:\n \"이 탭을 열어 두어도 됩니다. 돌아온 뒤 새로고침되지 않으면 계속을 누르세요.\",\n continue: \"계속\",\n resendEmail: \"이메일 다시 보내기\",\n back: \"뒤로\",\n forgotPassword: \"비밀번호를 잊으셨나요?\",\n sendResetLink: \"재설정 링크 보내기\",\n backToSignIn: \"로그인으로 돌아가기\",\n localNotePrefix: \"계정은 이 앱의 자체 DB에 저장됩니다\",\n localNoteSuffix: \", 타사 서비스가 아닙니다.\",\n runLocally: \"로컬에서 실행\",\n runLocallySentence: \"로컬에서 실행\",\n openSource: \"100% 무료 오픈 소스\",\n useOwnGoogleClient: \"내 Google OAuth 클라이언트 사용:\",\n copyCommand: \"명령 복사\",\n copied: \"복사됨\",\n close: \"닫기\",\n closeGoogleChoices: \"Google 로그인 선택 닫기\",\n legalPrefix: \"가입하면 다음에 동의하게 됩니다:\",\n legalTerms: \"약관\",\n legalConnector: \"및\",\n legalPrivacy: \"개인정보 처리방침\",\n legalSuffix: \".\",\n invalidEmail: \"you@example.com 같은 올바른 이메일 주소를 입력하세요.\",\n signInToContinue: \"계속하려면 로그인하세요.\",\n finishSignInFailed: \"자동으로 로그인을 완료할 수 없습니다.\",\n enterPasswordAfterVerification: \"이메일을 확인한 후 비밀번호를 입력하세요.\",\n finishSignInManually:\n \"자동으로 로그인을 완료할 수 없습니다. 계속하려면 로그인하세요.\",\n stillWaitingVerification:\n \"아직 확인을 기다리고 있습니다. 이메일의 링크를 클릭한 뒤 계속을 다시 눌러주세요.\",\n checkVerificationFailed: \"확인 상태를 확인할 수 없습니다. 다시 시도하세요.\",\n checking: \"확인 중...\",\n checkingVerification: \"확인 상태 확인 중...\",\n sending: \"보내는 중...\",\n sent: \"보냄\",\n sentVerification: \"새 확인 링크를 보냈습니다.\",\n resendVerificationFailed: \"확인 이메일을 다시 보낼 수 없습니다.\",\n networkErrorRetry: \"네트워크 오류입니다. 다시 시도하세요.\",\n networkErrorDashRetry: \"네트워크 오류 — 다시 시도하세요\",\n passwordsMismatch: \"비밀번호가 일치하지 않습니다\",\n creatingAccount: \"계정 생성 중…\",\n registrationFailed: \"가입 실패\",\n accountCreatedSigningIn: \"계정 생성됨 — 로그인 중…\",\n emailVerifiedFinishing: \"이메일 확인됨. 로그인 완료 중...\",\n emailVerifiedSignIn: \"이메일 확인됨. 계속하려면 로그인하세요.\",\n resetEmailSent: \"해당 이메일이 있으면 재설정 링크가 발송됩니다.\",\n resetEmailFailed: \"재설정 이메일을 보낼 수 없습니다.\",\n signingIn: \"로그인 중…\",\n invalidLogin: \"이메일 또는 비밀번호가 올바르지 않습니다\",\n googleNotConfigured: \"Google OAuth가 구성되지 않았습니다.\",\n failedToConnect: \"연결하지 못했습니다. 다시 시도하세요.\",\n migrateLocalFallback: \"계속 로그인하여 로컬 데이터를 마이그레이션하세요.\",\n googlePopupHelp: \"이 사이트의 팝업을 허용한 뒤 다시 시도하세요\",\n googleNeverFinished:\n \"Google 로그인이 완료되지 않았습니다. Google OAuth 리디렉션 URI와 [agent-native][google-oauth] 서버 로그를 확인하세요.\",\n },\n \"pt-BR\": {\n languageLabel: \"Idioma\",\n systemLanguage: \"Sistema\",\n pageTitleSignIn: \"Entrar\",\n pageTitleWelcome: \"Boas-vindas\",\n welcomeTitle: \"Boas-vindas\",\n signInTitle: \"Entrar\",\n welcomeBackTitle: \"Bem-vindo de volta\",\n checkEmailTitle: \"Confira seu email\",\n resetPasswordTitle: \"Redefinir senha\",\n createAccountSubtitle: \"Crie uma conta para começar\",\n googleOnlySubtitle: \"Use sua conta Google do workspace para continuar\",\n signInSubtitle: \"Entre na sua conta\",\n finishAccountSubtitle: \"Finalize a criação da sua conta\",\n resetPasswordSubtitle: \"Redefina sua senha\",\n upgradeCopy:\n \"Continue entrando para conectar este app à sua conta e migrar dados locais.\",\n googleButton: \"Entrar com Google\",\n dividerOr: \"ou\",\n createAccount: \"Criar conta\",\n signIn: \"Entrar\",\n email: \"Email\",\n password: \"Senha\",\n confirmPassword: \"Confirmar senha\",\n passwordMinPlaceholder: \"Pelo menos 8 caracteres\",\n confirmPasswordPlaceholder: \"Confirmar senha\",\n enterPasswordPlaceholder: \"Digite a senha\",\n signupProgress: \"Progresso do cadastro\",\n progressAccount: \"Conta\",\n progressVerify: \"Verificar\",\n progressStart: \"Começar\",\n verificationSent: \"Email de verificação enviado\",\n verifyCopyPrefix: \"Enviamos um link seguro para\",\n verifyCopySuffix:\n \". Clique nele, volte aqui e este app terminará o login automaticamente.\",\n verificationNote:\n \"Você pode manter esta aba aberta. Se ela não atualizar quando você voltar, use Continuar.\",\n continue: \"Continuar\",\n resendEmail: \"Reenviar email\",\n back: \"Voltar\",\n forgotPassword: \"Esqueceu a senha?\",\n sendResetLink: \"Enviar link de redefinição\",\n backToSignIn: \"Voltar para entrar\",\n localNotePrefix:\n \"Sua conta fica armazenada no banco de dados próprio deste app\",\n localNoteSuffix: \", não em um serviço de terceiros.\",\n runLocally: \"Executar localmente\",\n runLocallySentence: \"Executar localmente\",\n openSource: \"100% grátis e open source\",\n useOwnGoogleClient: \"Use seu próprio cliente Google OAuth:\",\n copyCommand: \"Copiar comando\",\n copied: \"Copiado\",\n close: \"Fechar\",\n closeGoogleChoices: \"Fechar opções de login com Google\",\n legalPrefix: \"Ao se cadastrar, você aceita nossos\",\n legalTerms: \"Termos\",\n legalConnector: \"e\",\n legalPrivacy: \"Política de Privacidade\",\n legalSuffix: \".\",\n invalidEmail: \"Digite um email válido, como you@example.com.\",\n signInToContinue: \"Entre para continuar.\",\n finishSignInFailed: \"Não foi possível concluir o login automaticamente.\",\n enterPasswordAfterVerification:\n \"Digite sua senha depois de verificar seu email.\",\n finishSignInManually:\n \"Não foi possível concluir o login automaticamente. Entre para continuar.\",\n stillWaitingVerification:\n \"Ainda estamos aguardando a verificação. Clique no link do email e tente Continuar novamente.\",\n checkVerificationFailed: \"Não foi possível verificar. Tente novamente.\",\n checking: \"Verificando...\",\n checkingVerification: \"Verificando sua confirmação...\",\n sending: \"Enviando...\",\n sent: \"Enviado\",\n sentVerification: \"Enviamos um novo link de verificação.\",\n resendVerificationFailed:\n \"Não foi possível reenviar o email de verificação.\",\n networkErrorRetry: \"Erro de rede. Tente novamente.\",\n networkErrorDashRetry: \"Erro de rede — tente novamente\",\n passwordsMismatch: \"As senhas não conferem\",\n creatingAccount: \"Criando conta…\",\n registrationFailed: \"Falha no cadastro\",\n accountCreatedSigningIn: \"Conta criada — entrando…\",\n emailVerifiedFinishing: \"Email verificado. Concluindo login...\",\n emailVerifiedSignIn: \"Email verificado. Entre para continuar.\",\n resetEmailSent:\n \"Se esse email existir, um link de redefinição está a caminho.\",\n resetEmailFailed: \"Não foi possível enviar o email de redefinição.\",\n signingIn: \"Entrando…\",\n invalidLogin: \"Email ou senha inválidos\",\n googleNotConfigured: \"Google OAuth não está configurado.\",\n failedToConnect: \"Não foi possível conectar. Tente novamente.\",\n migrateLocalFallback: \"Continue entrando para migrar dados locais.\",\n googlePopupHelp: \"Permita pop-ups para este site e tente novamente\",\n googleNeverFinished:\n \"O login com Google não terminou. Confira o URI de redirecionamento do Google OAuth e os logs do servidor para [agent-native][google-oauth].\",\n },\n \"hi-IN\": {\n languageLabel: \"भाषा\",\n systemLanguage: \"सिस्टम\",\n pageTitleSignIn: \"साइन इन\",\n pageTitleWelcome: \"स्वागत है\",\n welcomeTitle: \"स्वागत है\",\n signInTitle: \"साइन इन\",\n welcomeBackTitle: \"वापस स्वागत है\",\n checkEmailTitle: \"अपना ईमेल देखें\",\n resetPasswordTitle: \"पासवर्ड रीसेट करें\",\n createAccountSubtitle: \"शुरू करने के लिए खाता बनाएं\",\n googleOnlySubtitle: \"जारी रखने के लिए अपना workspace Google खाता उपयोग करें\",\n signInSubtitle: \"अपने खाते में साइन इन करें\",\n finishAccountSubtitle: \"अपना खाता बनाना पूरा करें\",\n resetPasswordSubtitle: \"अपना पासवर्ड रीसेट करें\",\n upgradeCopy:\n \"इस ऐप को अपने खाते से जोड़ने और स्थानीय डेटा माइग्रेट करने के लिए साइन इन जारी रखें।\",\n googleButton: \"Google से साइन इन करें\",\n dividerOr: \"या\",\n createAccount: \"खाता बनाएं\",\n signIn: \"साइन इन\",\n email: \"ईमेल\",\n password: \"पासवर्ड\",\n confirmPassword: \"पासवर्ड की पुष्टि करें\",\n passwordMinPlaceholder: \"कम से कम 8 अक्षर\",\n confirmPasswordPlaceholder: \"पासवर्ड की पुष्टि करें\",\n enterPasswordPlaceholder: \"पासवर्ड दर्ज करें\",\n signupProgress: \"साइनअप प्रगति\",\n progressAccount: \"खाता\",\n progressVerify: \"सत्यापित करें\",\n progressStart: \"शुरू करें\",\n verificationSent: \"सत्यापन ईमेल भेजा गया\",\n verifyCopyPrefix: \"हमने एक सुरक्षित लिंक भेजा है\",\n verifyCopySuffix:\n \"पर। लिंक खोलें, यहां वापस आएं, और यह ऐप अपने आप आपका साइन इन पूरा करेगा।\",\n verificationNote:\n \"आप यह टैब खुला रख सकते हैं। वापस आने पर अगर यह refresh नहीं होता है, तो Continue दबाएं।\",\n continue: \"जारी रखें\",\n resendEmail: \"ईमेल फिर भेजें\",\n back: \"वापस\",\n forgotPassword: \"पासवर्ड भूल गए?\",\n sendResetLink: \"रीसेट लिंक भेजें\",\n backToSignIn: \"साइन इन पर वापस जाएं\",\n localNotePrefix: \"आपका खाता इस ऐप के अपने DB में संग्रहीत है\",\n localNoteSuffix: \", किसी third-party सेवा में नहीं।\",\n runLocally: \"लोकल चलाएं\",\n runLocallySentence: \"लोकल चलाएं\",\n openSource: \"100% मुफ्त और open source\",\n useOwnGoogleClient: \"अपना Google OAuth client उपयोग करें:\",\n copyCommand: \"कमांड कॉपी करें\",\n copied: \"कॉपी हो गया\",\n close: \"बंद करें\",\n closeGoogleChoices: \"Google साइन-इन विकल्प बंद करें\",\n legalPrefix: \"साइन अप करके, आप हमारी\",\n legalTerms: \"शर्तें\",\n legalConnector: \"और\",\n legalPrivacy: \"गोपनीयता नीति\",\n legalSuffix: \"स्वीकार करते हैं।\",\n invalidEmail: \"एक मान्य ईमेल पता दर्ज करें, जैसे you@example.com.\",\n signInToContinue: \"जारी रखने के लिए साइन इन करें।\",\n finishSignInFailed: \"साइन इन अपने आप पूरा नहीं हो सका।\",\n enterPasswordAfterVerification: \"ईमेल सत्यापित करने के बाद अपना पासवर्ड दर्ज करें।\",\n finishSignInManually:\n \"साइन इन अपने आप पूरा नहीं हो सका। जारी रखने के लिए साइन इन करें।\",\n stillWaitingVerification:\n \"सत्यापन का इंतजार है। ईमेल में लिंक खोलें, फिर Continue दोबारा दबाएं।\",\n checkVerificationFailed: \"सत्यापन जांच नहीं हो सकी। कृपया फिर कोशिश करें।\",\n checking: \"जांच हो रही है...\",\n checkingVerification: \"आपका सत्यापन जांच रहे हैं...\",\n sending: \"भेजा जा रहा है...\",\n sent: \"भेजा गया\",\n sentVerification: \"नया सत्यापन लिंक भेजा गया।\",\n resendVerificationFailed: \"सत्यापन ईमेल फिर नहीं भेजा जा सका।\",\n networkErrorRetry: \"नेटवर्क त्रुटि। कृपया फिर कोशिश करें।\",\n networkErrorDashRetry: \"नेटवर्क त्रुटि — कृपया फिर कोशिश करें\",\n passwordsMismatch: \"पासवर्ड मेल नहीं खाते\",\n creatingAccount: \"खाता बनाया जा रहा है…\",\n registrationFailed: \"रजिस्ट्रेशन असफल\",\n accountCreatedSigningIn: \"खाता बन गया — साइन इन हो रहा है…\",\n emailVerifiedFinishing: \"ईमेल सत्यापित। साइन इन पूरा हो रहा है...\",\n emailVerifiedSignIn: \"ईमेल सत्यापित। जारी रखने के लिए साइन इन करें।\",\n resetEmailSent: \"अगर वह ईमेल मौजूद है, तो reset लिंक भेजा जा रहा है।\",\n resetEmailFailed: \"रीसेट ईमेल नहीं भेजा जा सका।\",\n signingIn: \"साइन इन हो रहा है…\",\n invalidLogin: \"ईमेल या पासवर्ड अमान्य है\",\n googleNotConfigured: \"Google OAuth configured नहीं है।\",\n failedToConnect: \"कनेक्ट नहीं हो सका। कृपया फिर कोशिश करें।\",\n migrateLocalFallback: \"स्थानीय डेटा माइग्रेट करने के लिए साइन इन जारी रखें।\",\n googlePopupHelp: \"इस साइट के लिए pop-ups allow करें और फिर कोशिश करें\",\n googleNeverFinished:\n \"Google साइन इन पूरा नहीं हुआ। Google OAuth redirect URI और [agent-native][google-oauth] के server logs देखें।\",\n },\n \"ar-SA\": {\n languageLabel: \"اللغة\",\n systemLanguage: \"النظام\",\n pageTitleSignIn: \"تسجيل الدخول\",\n pageTitleWelcome: \"مرحبًا\",\n welcomeTitle: \"مرحبًا\",\n signInTitle: \"تسجيل الدخول\",\n welcomeBackTitle: \"مرحبًا بعودتك\",\n checkEmailTitle: \"تحقق من بريدك الإلكتروني\",\n resetPasswordTitle: \"إعادة تعيين كلمة المرور\",\n createAccountSubtitle: \"أنشئ حسابًا للبدء\",\n googleOnlySubtitle: \"استخدم حساب Google الخاص بمساحة العمل للمتابعة\",\n signInSubtitle: \"سجّل الدخول إلى حسابك\",\n finishAccountSubtitle: \"أكمل إنشاء حسابك\",\n resetPasswordSubtitle: \"أعد تعيين كلمة المرور\",\n upgradeCopy:\n \"تابع تسجيل الدخول لربط هذا التطبيق بحسابك وترحيل البيانات المحلية.\",\n googleButton: \"تسجيل الدخول باستخدام Google\",\n dividerOr: \"أو\",\n createAccount: \"إنشاء حساب\",\n signIn: \"تسجيل الدخول\",\n email: \"البريد الإلكتروني\",\n password: \"كلمة المرور\",\n confirmPassword: \"تأكيد كلمة المرور\",\n passwordMinPlaceholder: \"8 أحرف على الأقل\",\n confirmPasswordPlaceholder: \"تأكيد كلمة المرور\",\n enterPasswordPlaceholder: \"أدخل كلمة المرور\",\n signupProgress: \"تقدم التسجيل\",\n progressAccount: \"الحساب\",\n progressVerify: \"التحقق\",\n progressStart: \"البدء\",\n verificationSent: \"تم إرسال رسالة التحقق\",\n verifyCopyPrefix: \"أرسلنا رابطًا آمنًا إلى\",\n verifyCopySuffix:\n \". افتحه، ثم عُد إلى هنا وسيكمل هذا التطبيق تسجيل دخولك تلقائيًا.\",\n verificationNote:\n \"يمكنك إبقاء هذه النافذة مفتوحة. إذا لم يتم التحديث بعد عودتك، استخدم متابعة.\",\n continue: \"متابعة\",\n resendEmail: \"إعادة إرسال البريد\",\n back: \"رجوع\",\n forgotPassword: \"هل نسيت كلمة المرور؟\",\n sendResetLink: \"إرسال رابط إعادة التعيين\",\n backToSignIn: \"العودة إلى تسجيل الدخول\",\n localNotePrefix: \"يتم تخزين حسابك في قاعدة بيانات هذا التطبيق\",\n localNoteSuffix: \"، وليس في خدمة خارجية.\",\n runLocally: \"تشغيل محليًا\",\n runLocallySentence: \"تشغيل محليًا\",\n openSource: \"مجاني ومفتوح المصدر 100%\",\n useOwnGoogleClient: \"استخدم عميل Google OAuth الخاص بك:\",\n copyCommand: \"نسخ الأمر\",\n copied: \"تم النسخ\",\n close: \"إغلاق\",\n closeGoogleChoices: \"إغلاق خيارات تسجيل الدخول عبر Google\",\n legalPrefix: \"بالتسجيل، فإنك توافق على\",\n legalTerms: \"الشروط\",\n legalConnector: \"و\",\n legalPrivacy: \"سياسة الخصوصية\",\n legalSuffix: \".\",\n invalidEmail: \"أدخل بريدًا إلكترونيًا صالحًا، مثل you@example.com.\",\n signInToContinue: \"سجّل الدخول للمتابعة.\",\n finishSignInFailed: \"تعذر إكمال تسجيل الدخول تلقائيًا.\",\n enterPasswordAfterVerification:\n \"أدخل كلمة المرور بعد التحقق من بريدك الإلكتروني.\",\n finishSignInManually:\n \"تعذر إكمال تسجيل الدخول تلقائيًا. سجّل الدخول للمتابعة.\",\n stillWaitingVerification:\n \"ما زلنا ننتظر التحقق. افتح الرابط في بريدك الإلكتروني ثم جرّب متابعة مرة أخرى.\",\n checkVerificationFailed: \"تعذر التحقق من الحالة. حاول مرة أخرى.\",\n checking: \"جارٍ التحقق...\",\n checkingVerification: \"جارٍ التحقق من حالتك...\",\n sending: \"جارٍ الإرسال...\",\n sent: \"تم الإرسال\",\n sentVerification: \"تم إرسال رابط تحقق جديد.\",\n resendVerificationFailed: \"تعذر إعادة إرسال رسالة التحقق.\",\n networkErrorRetry: \"خطأ في الشبكة. حاول مرة أخرى.\",\n networkErrorDashRetry: \"خطأ في الشبكة — حاول مرة أخرى\",\n passwordsMismatch: \"كلمتا المرور غير متطابقتين\",\n creatingAccount: \"جارٍ إنشاء الحساب…\",\n registrationFailed: \"فشل التسجيل\",\n accountCreatedSigningIn: \"تم إنشاء الحساب — جارٍ تسجيل الدخول…\",\n emailVerifiedFinishing: \"تم التحقق من البريد. جارٍ إكمال تسجيل الدخول...\",\n emailVerifiedSignIn: \"تم التحقق من البريد. سجّل الدخول للمتابعة.\",\n resetEmailSent: \"إذا كان هذا البريد موجودًا، فسيصل رابط إعادة التعيين.\",\n resetEmailFailed: \"تعذر إرسال بريد إعادة التعيين.\",\n signingIn: \"جارٍ تسجيل الدخول…\",\n invalidLogin: \"البريد الإلكتروني أو كلمة المرور غير صحيحة\",\n googleNotConfigured: \"لم يتم إعداد Google OAuth.\",\n failedToConnect: \"تعذر الاتصال. حاول مرة أخرى.\",\n migrateLocalFallback: \"تابع تسجيل الدخول لترحيل البيانات المحلية.\",\n googlePopupHelp: \"اسمح بالنوافذ المنبثقة لهذا الموقع ثم حاول مرة أخرى\",\n googleNeverFinished:\n \"لم يكتمل تسجيل الدخول عبر Google. تحقق من URI إعادة التوجيه في Google OAuth وسجلات الخادم لـ [agent-native][google-oauth].\",\n },\n};\n\nconst defaultAuthCopy = AUTH_LOCALE_COPY[DEFAULT_LOCALE];\n\ntype AuthMarketingLocalization = Pick<\n AuthMarketingContent,\n \"tagline\" | \"description\" | \"features\"\n>;\n\nconst AUTH_MARKETING_LOCALE_COPY: Partial<\n Record<LocaleCode, Record<string, Partial<AuthMarketingLocalization>>>\n> = {\n \"zh-CN\": {\n forms: {\n tagline: \"你的 AI 代理与你一起构建、发布和分析表单。\",\n features: [\n \"用一句话创建完整表单\",\n \"即时发布,生成可分享链接和验证码\",\n \"按需获取回复摘要、导出和趋势分析\",\n ],\n },\n },\n \"zh-TW\": {\n forms: {\n tagline: \"你的 AI 代理會和你一起建立、發布與分析表單。\",\n features: [\n \"用一句話建立完整表單\",\n \"立即發布,產生可分享連結與驗證碼\",\n \"依需求取得回覆摘要、匯出與趨勢分析\",\n ],\n },\n },\n \"es-ES\": {\n forms: {\n tagline: \"Tu agente de IA crea, publica y analiza formularios contigo.\",\n features: [\n \"Crea formularios completos con una sola frase\",\n \"Publicación instantánea con enlaces compartibles y captcha\",\n \"Resúmenes de respuestas, exportaciones y análisis de tendencias al instante\",\n ],\n },\n },\n \"fr-FR\": {\n forms: {\n tagline:\n \"Votre agent IA crée, publie et analyse des formulaires avec vous.\",\n features: [\n \"Créez des formulaires complets à partir d'une seule phrase\",\n \"Publication instantanée avec liens partageables et captcha\",\n \"Résumés de réponses, exports et analyse des tendances à la demande\",\n ],\n },\n },\n \"de-DE\": {\n forms: {\n tagline:\n \"Dein KI-Agent erstellt, veröffentlicht und analysiert Formulare mit dir.\",\n features: [\n \"Erstelle vollständige Formulare aus einem einzigen Satz\",\n \"Sofortige Veröffentlichung mit teilbaren Links und Captcha\",\n \"Antwortzusammenfassungen, Exporte und Trendanalysen auf Abruf\",\n ],\n },\n },\n \"ja-JP\": {\n forms: {\n tagline: \"AI エージェントがフォームの作成、公開、分析を一緒に進めます。\",\n features: [\n \"一文から完全なフォームを作成\",\n \"共有リンクと CAPTCHA 付きで即時公開\",\n \"回答の要約、エクスポート、トレンド分析を必要なときに実行\",\n ],\n },\n },\n \"ko-KR\": {\n forms: {\n tagline: \"AI 에이전트가 양식 생성, 게시, 분석을 함께 도와줍니다.\",\n features: [\n \"한 문장으로 완성된 양식 만들기\",\n \"공유 링크와 captcha로 즉시 게시\",\n \"응답 요약, 내보내기, 추세 분석을 필요할 때 실행\",\n ],\n },\n },\n \"pt-BR\": {\n forms: {\n tagline:\n \"Seu agente de IA cria, publica e analisa formulários junto com você.\",\n features: [\n \"Crie formulários completos a partir de uma única frase\",\n \"Publicação instantânea com links compartilháveis e captcha\",\n \"Resumos de respostas, exportações e análise de tendências sob demanda\",\n ],\n },\n },\n \"hi-IN\": {\n forms: {\n tagline:\n \"आपका AI एजेंट आपके साथ फ़ॉर्म बनाता, प्रकाशित करता और उनका विश्लेषण करता है।\",\n features: [\n \"एक वाक्य से पूरे फ़ॉर्म बनाएं\",\n \"शेयर करने योग्य लिंक और captcha के साथ तुरंत प्रकाशित करें\",\n \"ज़रूरत पड़ने पर प्रतिक्रिया सारांश, exports और trend analysis पाएं\",\n ],\n },\n },\n \"ar-SA\": {\n forms: {\n tagline: \"يساعدك وكيل الذكاء الاصطناعي على إنشاء النماذج ونشرها وتحليلها.\",\n features: [\n \"أنشئ نماذج كاملة من جملة واحدة\",\n \"نشر فوري مع روابط قابلة للمشاركة وcaptcha\",\n \"ملخصات للإجابات وتصدير وتحليل اتجاهات عند الطلب\",\n ],\n },\n },\n};\n\nfunction resolveBuiltInMarketingSlug(\n marketing: AuthMarketingContent | undefined,\n): string | undefined {\n if (!marketing) return undefined;\n for (const [slug, builtIn] of Object.entries(BUILT_IN_AUTH_MARKETING)) {\n if (\n marketing.appName === builtIn.appName &&\n marketing.tagline === builtIn.tagline\n ) {\n return slug;\n }\n }\n return undefined;\n}\n\nexport interface SignupLegalNoticeOptions {\n termsUrl: string;\n privacyUrl: string;\n termsLabel?: string;\n privacyLabel?: string;\n prefix?: string;\n connector?: string;\n suffix?: string;\n}\n\nfunction normalizeRequestHostname(host: string | undefined): string {\n const firstHost = host?.split(\",\")[0]?.trim().toLowerCase() ?? \"\";\n if (!firstHost) return \"\";\n if (firstHost.startsWith(\"[\")) {\n const close = firstHost.indexOf(\"]\");\n return close > 0 ? firstHost.slice(1, close) : firstHost;\n }\n return firstHost.replace(/:\\d+$/, \"\");\n}\n\nfunction isAgentNativeHostedHost(host: string | undefined): boolean {\n const hostname = normalizeRequestHostname(host);\n return (\n hostname === \"agent-native.com\" || hostname.endsWith(\".agent-native.com\")\n );\n}\n\nexport interface OnboardingHtmlOptions {\n /**\n * Hide email/password forms and show ONLY the Google sign-in button.\n * Useful for templates (mail, calendar) where Google is required anyway.\n * If Google OAuth env vars are not configured, an error message is shown.\n */\n googleOnly?: boolean;\n /**\n * Product marketing content shown alongside the sign-in form.\n * When provided, the page uses a split layout: marketing on the left,\n * sign-in form on the right (stacked on mobile).\n */\n marketing?: {\n appName: string;\n tagline: string;\n description?: string;\n features?: string[];\n runLocalCommand?: string;\n };\n /**\n * Request context used only to recover branded first-party marketing when a\n * default auth guard serves before a template-specific auth plugin.\n */\n requestHost?: string;\n requestPath?: string;\n requestOrigin?: string;\n /**\n * Optional preflight copy shown before redirecting through Google sign-in.\n * Use this when a hosted app needs to warn about provider-specific consent\n * screens while leaving self-hosted deployments untouched.\n */\n googleSignInNotice?: {\n host?: string;\n title: string;\n body: string | string[];\n continueLabel?: string;\n cancelLabel?: string;\n };\n /**\n * Optional email signup legal copy. Builder-hosted `*.agent-native.com`\n * deployments get the Agent Native links automatically; self-hosted and\n * custom-domain apps must opt in with their own URLs.\n */\n signupLegalNotice?: SignupLegalNoticeOptions | false;\n /**\n * Google sign-in flow: `'popup'`, `'redirect'`, or `'auto'` (default).\n * Falls back to `GOOGLE_AUTH_MODE` env var, then `'auto'`. Builder web\n * iframes use popup; Builder desktop preview/editor surfaces use redirect.\n */\n googleAuthMode?: GoogleAuthMode;\n}\n\nexport function getOnboardingHtml(opts: OnboardingHtmlOptions = {}): string {\n const showGoogle = hasGoogleOAuth();\n const googleOnly = !!opts.googleOnly;\n // In a Google-only app, Google is the sole sign-in method, so always render\n // a working button — never gate it on env vars detected at render time. The\n // login page is a public, CDN-cacheable shell served to everyone (per-user\n // and per-config state is resolved client-side after load), so baking a\n // \"not configured\" message in here would freeze that error into the cache\n // for every visitor. A genuinely misconfigured server instead surfaces a\n // clear error at click time via the auth API.\n const renderGoogleButton = showGoogle || googleOnly;\n const appBasePath = normalizeAppBasePath(\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH,\n );\n const publicOAuthOrigin = getPublicOAuthOrigin();\n const workspaceGatewayReturnOrigin = getWorkspaceGatewayReturnOrigin();\n const googleAuthMode = resolveGoogleAuthMode(opts.googleAuthMode);\n const localeInitScript = getLocaleInitScript();\n\n const marketing: AuthMarketingContent | undefined =\n opts.marketing ??\n resolveBuiltInAuthMarketing({\n requestHost: opts.requestHost,\n requestPath: opts.requestPath,\n });\n const hasMarketing = !!marketing;\n const marketingSlug = resolveBuiltInMarketingSlug(marketing);\n const defaultMarketingCopy: Partial<AuthMarketingLocalization> | undefined =\n marketing\n ? {\n tagline: marketing.tagline,\n description: marketing.description,\n features: marketing.features,\n }\n : undefined;\n const runLocalCommand = marketing?.runLocalCommand?.trim();\n const signupLocalModeNote =\n isAgentNativeHostedHost(opts.requestHost) &&\n marketing?.signupLocalModeNote?.command.trim()\n ? {\n text: marketing.signupLocalModeNote.text.trim(),\n command: marketing.signupLocalModeNote.command.trim(),\n }\n : undefined;\n const brandMarkSrc = withAppBasePath(\"/agent-native-icon-dark.svg\");\n const socialImageUrl = withAgentNativeSocialImageCacheBuster(\n opts.requestOrigin\n ? `${opts.requestOrigin}${withAppBasePath(AGENT_NATIVE_SOCIAL_IMAGE_PATH)}`\n : withAppBasePath(AGENT_NATIVE_SOCIAL_IMAGE_PATH),\n );\n const esc = (s: string) =>\n s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n const t = (key: keyof typeof EN_AUTH_COPY) => defaultAuthCopy[key];\n const i18nAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n=\"${key}\"` : \"\";\n const i18nAriaAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n-aria-label=\"${key}\"` : \"\";\n const i18nPlaceholderAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n-placeholder=\"${key}\"` : \"\";\n const i18nDataAttr = (\n attr: string,\n key: keyof typeof EN_AUTH_COPY | undefined,\n ) => (key ? ` data-i18n-${attr}=\"${key}\"` : \"\");\n const i18nText = (key: keyof typeof EN_AUTH_COPY) =>\n `<span${i18nAttr(key)}>${esc(t(key))}</span>`;\n const localizedValue = (\n value: string | undefined,\n key: keyof typeof EN_AUTH_COPY,\n ) => (value === undefined ? i18nText(key) : esc(value));\n const localizedAnchorLabel = (\n value: string | undefined,\n key: keyof typeof EN_AUTH_COPY,\n ) =>\n value === undefined ? `${i18nAttr(key)}>${esc(t(key))}` : `>${esc(value)}`;\n const localeMenuItemsHtml = [\n ` <button type=\"button\" class=\"locale-menu-item\" role=\"menuitemradio\" aria-checked=\"false\" data-locale-value=\"system\">\n <span class=\"locale-menu-check\" aria-hidden=\"true\">✓</span>\n <span${i18nAttr(\"systemLanguage\")}>${esc(t(\"systemLanguage\"))}</span>\n </button>`,\n ...SUPPORTED_LOCALES.map((locale) => {\n const metadata = LOCALE_METADATA[locale];\n const label =\n metadata.nativeName === metadata.englishName\n ? `${metadata.nativeName} (${metadata.code})`\n : `${metadata.nativeName} (${metadata.englishName})`;\n return ` <button type=\"button\" class=\"locale-menu-item\" role=\"menuitemradio\" aria-checked=\"false\" data-locale-value=\"${esc(locale)}\">\n <span class=\"locale-menu-check\" aria-hidden=\"true\">✓</span>\n <span>${esc(label)}</span>\n </button>`;\n }),\n ].join(\"\\n\");\n const localePickerHtml = `\n<div class=\"locale-picker\">\n <button type=\"button\" class=\"locale-trigger\" id=\"auth-locale-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"auth-locale-menu\" aria-label=\"${esc(t(\"languageLabel\"))}\" title=\"${esc(t(\"languageLabel\"))}\"${i18nAriaAttr(\"languageLabel\")} data-i18n-title=\"languageLabel\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M4 5h7\" />\n <path d=\"M7.5 4v1\" />\n <path d=\"M9.5 5c-.8 4.4-2.6 7.2-5.5 9\" />\n <path d=\"M5 9c1.2 2.1 3.2 3.8 6 5\" />\n <path d=\"M13 20l4-9 4 9\" />\n <path d=\"M14.5 17h5\" />\n </svg>\n </button>\n <div class=\"locale-menu\" id=\"auth-locale-menu\" role=\"menu\" aria-labelledby=\"auth-locale-trigger\" hidden>\n${localeMenuItemsHtml}\n </div>\n</div>`;\n const hostedSignupLegalNotice: SignupLegalNoticeOptions | undefined =\n opts.signupLegalNotice === undefined &&\n isAgentNativeHostedHost(opts.requestHost)\n ? {\n termsUrl: AGENT_NATIVE_TERMS_URL,\n privacyUrl: AGENT_NATIVE_PRIVACY_URL,\n }\n : undefined;\n const signupLegalNotice =\n opts.signupLegalNotice === false\n ? undefined\n : (opts.signupLegalNotice ?? hostedSignupLegalNotice);\n const signupLegalNoteHtml = signupLegalNotice\n ? ` <p class=\"legal-note\">${localizedValue(signupLegalNotice.prefix, \"legalPrefix\")} <a href=\"${esc(signupLegalNotice.termsUrl)}\" target=\"_blank\" rel=\"noreferrer\"${localizedAnchorLabel(signupLegalNotice.termsLabel, \"legalTerms\")}</a> ${localizedValue(signupLegalNotice.connector, \"legalConnector\")} <a href=\"${esc(signupLegalNotice.privacyUrl)}\" target=\"_blank\" rel=\"noreferrer\"${localizedAnchorLabel(signupLegalNotice.privacyLabel, \"legalPrivacy\")}</a>${localizedValue(signupLegalNotice.suffix, \"legalSuffix\")}</p>`\n : \"\";\n const signupLocalModeNoteHtml = signupLocalModeNote\n ? ` <div class=\"signup-local-mode-note\" id=\"signup-local-mode-note\" data-command=\"${esc(signupLocalModeNote.command)}\">\n <p>${esc(signupLocalModeNote.text)}</p>\n <code>${esc(signupLocalModeNote.command)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-signup-local-mode\" onclick=\"__anCopySignupLocalModeCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>`\n : \"\";\n const googleSignInNotice = opts.googleSignInNotice;\n const googleNoticeBodyParts = googleSignInNotice\n ? (Array.isArray(googleSignInNotice.body)\n ? googleSignInNotice.body\n : [googleSignInNotice.body]\n ).filter((body) => body.trim().length > 0)\n : [];\n const googleNoticeBodyHtml = googleNoticeBodyParts\n .map(\n (body, index) =>\n `<p class=\"google-preflight-copy\"${index === 0 ? ' id=\"google-preflight-copy\"' : \"\"}>${esc(body)}</p>`,\n )\n .join(\"\\n\");\n const googleNoticeRunLocalHtml = runLocalCommand\n ? `\n <button type=\"button\" class=\"btn-secondary google-preflight-local\" id=\"google-preflight-run-local\" onclick=\"__anChooseRunLocalFromGoogleNotice()\"${i18nAttr(googleSignInNotice?.cancelLabel === undefined ? \"runLocallySentence\" : undefined)}>${esc(googleSignInNotice?.cancelLabel ?? t(\"runLocallySentence\"))}</button>`\n : `\n <button type=\"button\" class=\"btn-secondary\" onclick=\"__anHideGoogleNotice()\"${i18nAttr(googleSignInNotice?.cancelLabel === undefined ? \"close\" : undefined)}>${esc(googleSignInNotice?.cancelLabel ?? t(\"close\"))}</button>`;\n const googleNoticeRunLocalPanelHtml = runLocalCommand\n ? `\n <div class=\"google-preflight-command\" id=\"google-preflight-run-local-panel\" hidden data-command=\"${esc(runLocalCommand)}\">\n <p class=\"google-preflight-command-label\"${i18nAttr(\"useOwnGoogleClient\")}>${esc(t(\"useOwnGoogleClient\"))}</p>\n <code>${esc(runLocalCommand)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-google-preflight-run-local\" onclick=\"__anCopyGoogleNoticeRunLocalCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>`\n : \"\";\n const googleNoticeHtml =\n renderGoogleButton && googleSignInNotice\n ? `\n <div\n class=\"google-preflight\"\n id=\"google-preflight\"\n data-host=\"${esc(googleSignInNotice.host ?? \"\")}\"\n role=\"dialog\"\n aria-labelledby=\"google-preflight-title\"\n aria-describedby=\"google-preflight-copy\"\n tabindex=\"-1\"\n >\n <button type=\"button\" class=\"google-preflight-close\" aria-label=\"${esc(t(\"closeGoogleChoices\"))}\"${i18nAriaAttr(\"closeGoogleChoices\")} onclick=\"__anHideGoogleNotice()\">×</button>\n <div class=\"google-preflight-main\">\n <span class=\"google-preflight-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.24 3.957l-8.422 14.06a1.989 1.989 0 0 0 1.7 2.983h16.845a1.989 1.989 0 0 0 1.7 -2.983l-8.423 -14.06a1.989 1.989 0 0 0 -3.4 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 16h.01\"/></svg>\n </span>\n <div class=\"google-preflight-text\">\n <p class=\"google-preflight-title\" id=\"google-preflight-title\">${esc(googleSignInNotice.title)}</p>\n${googleNoticeBodyHtml}\n </div>\n </div>\n <div class=\"google-preflight-actions\">\n <button type=\"button\" class=\"btn-primary\" id=\"google-preflight-continue\" onclick=\"__anAcceptGoogleNotice()\"${i18nAttr(googleSignInNotice.continueLabel === undefined ? \"continue\" : undefined)}>${esc(googleSignInNotice.continueLabel ?? t(\"continue\"))}</button>\n${googleNoticeRunLocalHtml}\n </div>\n${googleNoticeRunLocalPanelHtml}\n </div>`\n : \"\";\n const identitySsoHtml = identitySsoLoginButtonHtml();\n const identitySsoScript = identitySsoHtml\n ? `\n function __anIdentitySsoUrl() {\n var params = new URLSearchParams();\n params.set('return', __anGetReturnPath());\n return __anPath('/_agent-native/identity/login') + '?' + params.toString();\n }\n function __anStartIdentitySso(event) {\n if (event && event.preventDefault) event.preventDefault();\n window.location.href = __anIdentitySsoUrl();\n return false;\n }\n (function __anPrepareIdentitySsoButton() {\n var identity = document.getElementById('identity-sso-btn');\n if (!identity) return;\n identity.setAttribute('href', __anIdentitySsoUrl());\n identity.addEventListener('click', __anStartIdentitySso);\n })();`\n : \"\";\n\n const marketingStyles = hasMarketing\n ? `\n body.has-marketing { padding: 0; position: relative; overflow-x: hidden; }\n #starfield {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0.35;\n pointer-events: none;\n z-index: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n #starfield { opacity: 0.18; }\n }\n .split {\n position: relative;\n z-index: 1;\n display: flex;\n min-height: 100vh;\n width: 100%;\n max-width: 1100px;\n margin: 0 auto;\n }\n .marketing-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding: 3rem 3.5rem;\n }\n .marketing-content { max-width: 480px; }\n .app-name {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n font-size: 2rem;\n font-weight: 700;\n color: #fff;\n margin-bottom: 0.625rem;\n letter-spacing: -0.02em;\n }\n .app-name img.brand-mark {\n height: 2.21375rem;\n width: auto;\n display: block;\n flex-shrink: 0;\n }\n .app-tagline {\n font-size: 1.25rem;\n color: #a1a1aa;\n line-height: 1.6;\n margin-bottom: 2rem;\n }\n .app-desc {\n font-size: 1rem;\n color: #71717a;\n line-height: 1.6;\n margin-bottom: 2rem;\n }\n .feature-list {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.875rem;\n }\n .feature-list li {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n font-size: 1rem;\n color: #a1a1aa;\n line-height: 1.5;\n }\n .feature-list li::before {\n content: '';\n flex-shrink: 0;\n width: 8px;\n height: 8px;\n margin-top: 6px;\n border-radius: 50%;\n background: #3f3f46;\n border: 1px solid #52525b;\n }\n .oss-link {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.8125rem;\n font-weight: 600;\n color: #00B5FF;\n text-decoration: none;\n transition: color 0.15s ease;\n }\n .oss-link:hover { color: #33C4FF; }\n .oss-link svg { width: 15px; height: 15px; flex-shrink: 0; }\n .marketing-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.75rem;\n margin-top: 2rem;\n }\n .run-local-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n background: rgba(255,255,255,0.08);\n color: #fff;\n border: 1px solid rgba(255,255,255,0.14);\n border-radius: 8px;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n }\n .run-local-button:hover {\n background: rgba(255,255,255,0.12);\n border-color: rgba(255,255,255,0.24);\n }\n .run-local-panel {\n max-width: 480px;\n margin-top: 0.75rem;\n padding: 0.75rem;\n background: rgba(20,20,20,0.86);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 10px;\n box-shadow: 0 14px 36px rgba(0,0,0,0.28);\n }\n .run-local-panel[hidden] { display: none; }\n .run-local-panel code {\n display: block;\n overflow-x: auto;\n padding-bottom: 0.125rem;\n color: #e5e5e5;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.75rem;\n line-height: 1.5;\n white-space: nowrap;\n }\n .copy-run-local {\n margin-top: 0.625rem;\n padding: 0.375rem 0.625rem;\n background: transparent;\n color: #a1a1aa;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 6px;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .copy-run-local:hover { color: #fff; border-color: rgba(255,255,255,0.22); }\n .form-panel {\n flex: 0 0 440px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n }\n .form-panel .card { max-width: 400px; }\n .form-panel .local-note { max-width: 400px; }\n @media (max-width: 900px) {\n .split { flex-direction: column; min-height: auto; }\n .marketing-panel { padding: 4.25rem 1.5rem 1.5rem; }\n .app-name { font-size: 1.375rem; }\n .app-name img.brand-mark { height: 1.58125rem; }\n .app-tagline { font-size: 1rem; margin-bottom: 1rem; }\n .app-desc { margin-bottom: 1rem; }\n .feature-list { gap: 0.5rem; }\n .form-panel { flex: none; padding: 1.5rem 1rem; }\n }\n`\n : \"\";\n\n const marketingPanelHtml = hasMarketing\n ? `<canvas id=\"starfield\"></canvas>\n<div class=\"split\">\n <div class=\"marketing-panel\">\n <div class=\"marketing-content\">\n <h2 class=\"app-name\">\n <img class=\"brand-mark\" src=\"${esc(brandMarkSrc)}\" alt=\"\" aria-hidden=\"true\" />\n <span>${esc(marketing!.appName)}</span>\n </h2>\n <p class=\"app-tagline\" data-marketing-field=\"tagline\">${esc(marketing!.tagline)}</p>\n${marketing!.description ? ` <p class=\"app-desc\" data-marketing-field=\"description\">${esc(marketing!.description)}</p>\\n` : \"\"}${\n marketing!.features?.length\n ? ` <ul class=\"feature-list\">\\n${marketing!.features.map((f, index) => ` <li data-marketing-feature-index=\"${index}\">${esc(f)}</li>`).join(\"\\n\")}\\n </ul>\\n`\n : \"\"\n } <div class=\"marketing-actions\">\n${runLocalCommand ? ` <button type=\"button\" class=\"run-local-button\" id=\"run-local-button\" aria-expanded=\"false\" aria-controls=\"run-local-panel\" onclick=\"__anToggleRunLocalCommand()\"${i18nAttr(\"runLocally\")}>${esc(t(\"runLocally\"))}</button>\\n` : \"\"} <a class=\"oss-link\" href=\"https://github.com/BuilderIO/agent-native\" target=\"_blank\" rel=\"noreferrer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 00-1.3-3.2 4.2 4.2 0 00-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 00-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 00-.1 3.2A4.6 4.6 0 004 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21\"/></svg>\n <span${i18nAttr(\"openSource\")}>${esc(t(\"openSource\"))}</span>\n </a>\n </div>\n${\n runLocalCommand\n ? ` <div class=\"run-local-panel\" id=\"run-local-panel\" hidden data-command=\"${esc(runLocalCommand)}\">\n <code>${esc(runLocalCommand)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-run-local\" onclick=\"__anCopyRunLocalCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>\\n`\n : \"\"\n}\n </div>\n </div>\n <div class=\"form-panel\">`\n : \"\";\n\n const marketingCloseHtml = hasMarketing ? `\\n </div>\\n</div>` : \"\";\n\n const starfieldScript = hasMarketing\n ? `\n (function initStarfield() {\n var canvas = document.getElementById('starfield');\n if (!canvas) return;\n var gl = canvas.getContext('webgl', { alpha: false, antialias: false });\n if (!gl) return;\n\n var vs = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vs, 'attribute vec2 position;void main(){gl_Position=vec4(position,0.0,1.0);}');\n gl.compileShader(vs);\n\n var fs = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fs, [\n 'precision highp float;',\n 'uniform float iTime;uniform vec2 iResolution;uniform vec3 uPointer;',\n '#define S(a,b,t) smoothstep(a,b,t)',\n '#define NUM_LAYERS 4.',\n 'float N21(vec2 p){vec3 a=fract(vec3(p.xyx)*vec3(213.897,653.453,253.098));a+=dot(a,a.yzx+79.76);return fract((a.x+a.y)*a.z);}',\n 'vec2 GetPos(vec2 id,vec2 offs,float t){float n=N21(id+offs);float n1=fract(n*10.);float n2=fract(n*100.);float a=t+n;return offs+vec2(sin(a*n1),cos(a*n2))*.4;}',\n 'vec2 Attract(vec2 p,vec2 cursor,float strength){vec2 delta=cursor-p;float d=length(delta);float pull=1.-smoothstep(.08,1.9,d);pull=pull*pull*(3.-2.*pull);return p+delta*pull*.095*strength;}',\n 'float df_line(vec2 a,vec2 b,vec2 p){vec2 pa=p-a,ba=b-a;float h=clamp(dot(pa,ba)/dot(ba,ba),0.,1.);return length(pa-ba*h);}',\n 'float line(vec2 a,vec2 b,vec2 uv){float r1=.025;float r2=.006;float d=df_line(a,b,uv);float d2=length(a-b);float fade=S(1.5,.5,d2);fade+=S(.05,.02,abs(d2-.75));return S(r1,r2,d)*fade;}',\n 'float NetLayer(vec2 st,float n,float t,vec2 pointer,float pointerStrength){',\n ' vec2 cell=floor(st);vec2 id=cell+n;vec2 cursor=pointer-cell;st=fract(st)-.5;',\n ' vec2 p0=Attract(GetPos(id,vec2(-1,-1),t),cursor,pointerStrength);vec2 p1=Attract(GetPos(id,vec2(0,-1),t),cursor,pointerStrength);vec2 p2=Attract(GetPos(id,vec2(1,-1),t),cursor,pointerStrength);',\n ' vec2 p3=Attract(GetPos(id,vec2(-1,0),t),cursor,pointerStrength);vec2 p4=Attract(GetPos(id,vec2(0,0),t),cursor,pointerStrength);vec2 p5=Attract(GetPos(id,vec2(1,0),t),cursor,pointerStrength);',\n ' vec2 p6=Attract(GetPos(id,vec2(-1,1),t),cursor,pointerStrength);vec2 p7=Attract(GetPos(id,vec2(0,1),t),cursor,pointerStrength);vec2 p8=Attract(GetPos(id,vec2(1,1),t),cursor,pointerStrength);',\n ' float m=0.;float sparkle=0.;float d;float s;float pulse;',\n ' m+=line(p4,p0,st);d=length(st-p0);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p0.x)+fract(p0.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p1,st);d=length(st-p1);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p1.x)+fract(p1.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p2,st);d=length(st-p2);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p2.x)+fract(p2.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p3,st);d=length(st-p3);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p3.x)+fract(p3.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p4,st);d=length(st-p4);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p4.x)+fract(p4.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p5,st);d=length(st-p5);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p5.x)+fract(p5.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p6,st);d=length(st-p6);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p6.x)+fract(p6.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p7,st);d=length(st-p7);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p7.x)+fract(p7.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p8,st);d=length(st-p8);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p8.x)+fract(p8.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p1,p3,st);m+=line(p1,p5,st);m+=line(p7,p5,st);m+=line(p7,p3,st);',\n ' float sPhase=(sin(t+n)+sin(t*.1))*.25+.5;sPhase+=pow(sin(t*.1)*.5+.5,50.)*5.;m+=sparkle*sPhase;',\n ' return m;',\n '}',\n 'void mainImage(out vec4 fragColor,in vec2 fragCoord){',\n ' vec2 uv=(fragCoord-iResolution.xy*.5)/iResolution.y;',\n ' float t=iTime*.03;float s=sin(t);float c=cos(t);mat2 rot=mat2(c,-s,s,c);vec2 st=uv*rot;vec2 pointerUv=(uPointer.xy-iResolution.xy*.5)/iResolution.y;',\n ' float m=0.;',\n ' for(float i=0.;i<1.;i+=1./NUM_LAYERS){float z=fract(t+i);float size=mix(15.,1.,z);float fade=S(0.,.6,z)*S(1.,.8,z);vec2 pointerSt=pointerUv*rot*size;vec2 layerSt=st*size;float warp=1.-smoothstep(.15,2.7,length(layerSt-pointerSt));warp=warp*warp*(3.-2.*warp)*uPointer.z;layerSt-=(pointerSt-layerSt)*warp*.035;m+=fade*NetLayer(layerSt,i,iTime*0.3,pointerSt,uPointer.z);}',\n ' float cursorLift=1.-smoothstep(.04,.48,length(uv-pointerUv));cursorLift=cursorLift*cursorLift*(3.-2.*cursorLift)*uPointer.z;m*=1.+cursorLift*1.6;',\n ' vec3 col=vec3(0.35)*m;col*=1.-dot(uv,uv);',\n ' float tt=min(iTime,5.0);col*=S(0.,20.,tt);',\n ' col=clamp(col,0.,1.);fragColor=vec4(col,1.);',\n '}',\n 'void main(){mainImage(gl_FragColor,gl_FragCoord.xy);}'\n ].join('\\\\n'));\n gl.compileShader(fs);\n\n var prog = gl.createProgram();\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.useProgram(prog);\n\n var buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]), gl.STATIC_DRAW);\n var pos = gl.getAttribLocation(prog, 'position');\n gl.enableVertexAttribArray(pos);\n gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);\n\n var uTime = gl.getUniformLocation(prog, 'iTime');\n var uRes = gl.getUniformLocation(prog, 'iResolution');\n var uPointer = gl.getUniformLocation(prog, 'uPointer');\n var reducedMotionQuery = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null;\n var reducedMotion = reducedMotionQuery ? reducedMotionQuery.matches : false;\n var pointerDpr = 1, hasPointer = false;\n var pointerX = 0, pointerY = 0, pointerStrength = 0;\n var targetX = 0, targetY = 0, targetStrength = 0;\n\n function resize() {\n var w = window.innerWidth, h = window.innerHeight;\n pointerDpr = Math.min(window.devicePixelRatio, 1.5);\n canvas.width = w * pointerDpr; canvas.height = h * pointerDpr;\n gl.viewport(0, 0, canvas.width, canvas.height);\n if (!hasPointer) {\n pointerX = targetX = canvas.width * 0.5;\n pointerY = targetY = canvas.height * 0.5;\n }\n }\n function onPointerMove(event) {\n var rect = canvas.getBoundingClientRect();\n var x = event.clientX - rect.left;\n var y = event.clientY - rect.top;\n hasPointer = true;\n targetX = x * pointerDpr;\n targetY = (rect.height - y) * pointerDpr;\n targetStrength = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height ? 1 : 0;\n }\n function fadePointer() {\n targetStrength = 0;\n }\n function easePointer(allowPointer) {\n if (!allowPointer) {\n pointerStrength = 0;\n return;\n }\n pointerX += (targetX - pointerX) * 0.22;\n pointerY += (targetY - pointerY) * 0.22;\n pointerStrength += (targetStrength - pointerStrength) * 0.14;\n if (pointerStrength < 0.001 && targetStrength === 0) pointerStrength = 0;\n }\n resize();\n window.addEventListener('resize', resize);\n window.addEventListener('pointermove', onPointerMove, { passive: true });\n window.addEventListener('mousemove', onPointerMove, { passive: true });\n document.addEventListener('pointerleave', fadePointer, { passive: true });\n window.addEventListener('blur', fadePointer);\n\n var start = performance.now(), last = 0, raf = 0, reducedMotionStaticTime = 20;\n function draw(timeSeconds, allowPointer) {\n easePointer(allowPointer !== false && !reducedMotion);\n gl.uniform1f(uTime, timeSeconds);\n gl.uniform2f(uRes, canvas.width, canvas.height);\n gl.uniform3f(uPointer, pointerX, pointerY, pointerStrength);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n function render(now) {\n if (reducedMotion) {\n raf = 0;\n return;\n }\n raf = requestAnimationFrame(render);\n if (now - last < 33) return;\n last = now;\n draw((now - start) * 0.001);\n }\n function startAnimation() {\n if (!raf) raf = requestAnimationFrame(render);\n }\n function stopAnimation() {\n if (raf) {\n cancelAnimationFrame(raf);\n raf = 0;\n }\n }\n function onReducedMotionChange() {\n reducedMotion = reducedMotionQuery ? reducedMotionQuery.matches : false;\n if (reducedMotion) {\n stopAnimation();\n last = 0;\n draw(reducedMotionStaticTime, false);\n } else {\n startAnimation();\n }\n }\n draw(reducedMotion ? reducedMotionStaticTime : 0, !reducedMotion);\n if (reducedMotionQuery) {\n if (reducedMotionQuery.addEventListener) {\n reducedMotionQuery.addEventListener('change', onReducedMotionChange);\n } else {\n reducedMotionQuery.addListener(onReducedMotionChange);\n }\n }\n if (!reducedMotion) startAnimation();\n })();`\n : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"${DEFAULT_LOCALE}\" dir=\"ltr\">\n<head>\n<meta charset=\"UTF-8\">\n<script data-agent-native-locale-init>${localeInitScript}</script>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>${hasMarketing ? esc(marketing!.appName) + \" — \" + esc(t(\"pageTitleSignIn\")) : esc(t(\"pageTitleWelcome\"))}</title>\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"${withAppBasePath(\"/favicon.svg\")}\">\n<link rel=\"apple-touch-icon\" href=\"${withAppBasePath(\"/icon-180.svg\")}\">\n${\n hasMarketing\n ? `<meta name=\"description\" content=\"${esc(marketing!.tagline)}\">\n<meta property=\"og:title\" content=\"${esc(marketing!.appName)}\">\n<meta property=\"og:description\" content=\"${esc(marketing!.tagline)}\">\n<meta property=\"og:image\" content=\"${esc(socialImageUrl)}\">\n<meta property=\"og:image:secure_url\" content=\"${esc(socialImageUrl)}\">\n<meta property=\"og:image:type\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_TYPE}\">\n<meta property=\"og:image:width\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_WIDTH}\">\n<meta property=\"og:image:height\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT}\">\n<meta property=\"og:image:alt\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_ALT}\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:image\" content=\"${esc(socialImageUrl)}\">\n<meta name=\"twitter:image:alt\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_ALT}\">`\n : \"\"\n}\n<style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background: #0a0a0a;\n color: #e5e5e5;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 1rem;\n }\n .locale-picker {\n position: fixed;\n top: max(1rem, env(safe-area-inset-top));\n inset-inline-end: max(1rem, env(safe-area-inset-right));\n z-index: 40;\n }\n .locale-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n padding: 0;\n background: rgba(20,20,20,0.82);\n color: #e5e5e5;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 8px;\n cursor: pointer;\n outline: none;\n backdrop-filter: blur(12px);\n }\n .locale-trigger svg {\n width: 1rem;\n height: 1rem;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n .locale-trigger:hover,\n .locale-trigger[aria-expanded=\"true\"] {\n border-color: rgba(255,255,255,0.22);\n background: rgba(28,28,28,0.92);\n }\n .locale-trigger:focus {\n border-color: rgba(255,255,255,0.42);\n box-shadow: 0 0 0 3px rgba(255,255,255,0.08);\n }\n .locale-menu {\n position: absolute;\n top: calc(100% + 0.375rem);\n inset-inline-end: 0;\n min-width: 14rem;\n max-height: min(22rem, calc(100vh - 4rem));\n overflow-y: auto;\n padding: 0.25rem;\n background: rgba(20,20,20,0.94);\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 10px;\n box-shadow: 0 18px 50px rgba(0,0,0,0.42);\n backdrop-filter: blur(14px);\n }\n .locale-menu[hidden] { display: none; }\n .locale-menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n min-height: 2rem;\n padding: 0.375rem 0.5rem;\n background: transparent;\n border: 0;\n border-radius: 7px;\n color: #a1a1aa;\n cursor: pointer;\n font: inherit;\n font-size: 0.8125rem;\n text-align: start;\n }\n .locale-menu-item:hover,\n .locale-menu-item:focus {\n background: rgba(255,255,255,0.07);\n color: #fff;\n outline: none;\n }\n .locale-menu-item[aria-checked=\"true\"] {\n color: #fff;\n background: rgba(255,255,255,0.08);\n }\n .locale-menu-check {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n color: #33C4FF;\n opacity: 0;\n }\n .locale-menu-item[aria-checked=\"true\"] .locale-menu-check {\n opacity: 1;\n }\n .card {\n width: 100%;\n max-width: 400px;\n padding: 2rem;\n background: #141414;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; color: #fff; }\n .subtitle { font-size: 0.8125rem; color: #888; margin-bottom: 1.5rem; }\n .tabs {\n display: inline-flex;\n width: 100%;\n padding: 4px;\n margin-bottom: 1.5rem;\n background: rgba(255,255,255,0.06);\n border-radius: 8px;\n }\n .tab {\n flex: 1;\n padding: 0.5rem 0.75rem;\n background: none;\n border: none;\n color: #888;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n border-radius: 6px;\n }\n .tab.active {\n background: #3a3a3a;\n color: #fff;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n }\n .tab:hover:not(.active) { color: #bbb; }\n .form { display: none; }\n .form.active { display: block; }\n .card.verifying .tabs,\n .card.verifying #google-btn,\n .card.verifying #google-err,\n .card.verifying #auth-divider,\n .card.verifying #upgrade-note {\n display: none;\n }\n label { display: block; font-size: 0.8125rem; color: #888; margin-bottom: 0.375rem; }\n input {\n width: 100%;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 6px;\n color: #e5e5e5;\n font-size: 0.875rem;\n outline: none;\n margin-bottom: 0.875rem;\n }\n input:focus { border-color: rgba(255,255,255,0.3); box-shadow: 0 0 0 1px rgba(255,255,255,0.1); }\n input::placeholder { color: #555; }\n button[type=\"submit\"], .btn-primary {\n width: 100%;\n margin-top: 0.25rem;\n padding: 0.5rem;\n background: #fff;\n color: #000;\n border: none;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n button[type=\"submit\"]:hover, .btn-primary:hover { background: #e5e5e5; }\n button[type=\"submit\"]:disabled { opacity: 0.5; cursor: not-allowed; }\n .btn-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n background: transparent;\n color: #888;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n font-size: 0.8125rem;\n cursor: pointer;\n }\n .btn-secondary:hover { color: #bbb; border-color: rgba(255,255,255,0.2); }\n .legal-note {\n margin-top: 0.625rem;\n color: #666;\n font-size: 0.6875rem;\n line-height: 1.45;\n text-align: center;\n }\n .legal-note a {\n color: #777;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n .legal-note a:hover { color: #aaa; }\n .signup-local-mode-note {\n margin-top: 0.75rem;\n padding: 0.625rem;\n color: #777;\n background: rgba(255,255,255,0.025);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n font-size: 0.6875rem;\n line-height: 1.45;\n text-align: left;\n }\n .signup-local-mode-note p {\n margin: 0 0 0.5rem;\n }\n .signup-local-mode-note code {\n display: block;\n overflow-x: auto;\n padding-bottom: 0.125rem;\n color: #b8b8b8;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.6875rem;\n line-height: 1.5;\n white-space: nowrap;\n }\n .signup-local-mode-note .copy-run-local {\n margin-top: 0.5rem;\n }\n .msg { margin-top: 0.75rem; font-size: 0.8125rem; display: none; }\n .msg.error { color: #f87171; }\n .msg.success { color: #33C4FF; }\n .msg.show { display: block; }\n .step-progress {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0.5rem;\n margin-bottom: 1.25rem;\n }\n .progress-step {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.375rem;\n color: #666;\n font-size: 0.6875rem;\n line-height: 1.2;\n text-align: center;\n }\n .progress-step::before {\n content: '';\n position: absolute;\n top: 11px;\n left: calc(-50% + 16px);\n width: calc(100% - 32px);\n height: 1px;\n background: rgba(255,255,255,0.1);\n }\n .progress-step:first-child::before { display: none; }\n .progress-step span {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 999px;\n border: 1px solid rgba(255,255,255,0.14);\n background: #151515;\n color: #777;\n font-size: 0.6875rem;\n font-weight: 600;\n }\n .progress-step strong { font-weight: 500; }\n .progress-step.complete,\n .progress-step.current { color: #e5e5e5; }\n .progress-step.complete span {\n background: rgba(0,181,255,0.16);\n border-color: rgba(0,181,255,0.55);\n color: #dff7ff;\n }\n .progress-step.current span {\n background: #fff;\n border-color: #fff;\n color: #000;\n box-shadow: 0 0 0 4px rgba(255,255,255,0.08);\n }\n .verification-panel {\n padding: 1rem;\n margin-bottom: 0.875rem;\n background: rgba(255,255,255,0.04);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n }\n .verification-kicker {\n margin-bottom: 0.5rem;\n color: #33C4FF;\n font-size: 0.75rem;\n font-weight: 500;\n }\n .verification-copy {\n color: #d4d4d8;\n font-size: 0.875rem;\n line-height: 1.55;\n }\n .verification-copy strong {\n color: #fff;\n font-weight: 600;\n word-break: break-word;\n }\n .verification-note {\n margin-top: 0.75rem;\n color: #71717a;\n font-size: 0.75rem;\n line-height: 1.45;\n }\n .inline-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n margin-top: 0.75rem;\n }\n .link-button {\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: #888;\n cursor: pointer;\n font-size: 0.75rem;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n .link-button:hover { color: #bbb; }\n .link-button:disabled { cursor: wait; opacity: 0.5; }\n .divider {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 1.25rem 0;\n font-size: 0.75rem;\n color: #555;\n }\n .divider::before, .divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba(255,255,255,0.08);\n }\n .upgrade-note {\n margin-bottom: 1rem;\n padding: 0.75rem;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n background: rgba(255,255,255,0.03);\n font-size: 0.75rem;\n line-height: 1.5;\n color: #a1a1aa;\n display: none;\n }\n .upgrade-note.show { display: block; }\n .btn-google {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.625rem;\n padding: 0.5rem;\n background: #fff;\n color: #000;\n border: none;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n .btn-google:hover { background: #e5e5e5; }\n .btn-google:disabled { opacity: 0.5; cursor: wait; }\n .btn-google svg { width: 18px; height: 18px; flex-shrink: 0; }\n .google-signin {\n position: relative;\n width: 100%;\n }\n .google-error { margin-top: 0.5rem; font-size: 0.8125rem; color: #f87171; display: none; }\n .google-error.show { display: block; }\n .google-debug {\n display: none;\n margin-top: 0.5rem;\n font-size: 0.6875rem;\n line-height: 1.45;\n color: #777;\n word-break: break-word;\n }\n .google-debug.show { display: block; }\n .google-preflight {\n display: none;\n position: absolute;\n top: calc(100% + 0.625rem);\n left: 0;\n right: 0;\n z-index: 20;\n padding: 0.875rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 10px;\n background: #1b1b1b;\n box-shadow: 0 18px 50px rgba(0,0,0,0.48);\n }\n .google-preflight.show { display: block; }\n .google-preflight::before {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n width: 10px;\n height: 10px;\n transform: translateX(-50%) rotate(45deg);\n background: #1b1b1b;\n border-left: 1px solid rgba(255,255,255,0.12);\n border-top: 1px solid rgba(255,255,255,0.12);\n }\n .google-preflight-main {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n padding-right: 1.25rem;\n }\n .google-preflight-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 7px;\n background: rgba(245,158,11,0.15);\n color: #fcd34d;\n }\n .google-preflight-icon svg { width: 1rem; height: 1rem; }\n .google-preflight-text { min-width: 0; }\n .google-preflight-title {\n color: #fff;\n font-size: 0.8125rem;\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n .google-preflight-close {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n background: transparent;\n border: none;\n border-radius: 999px;\n color: #888;\n cursor: pointer;\n font-size: 1.125rem;\n line-height: 1;\n }\n .google-preflight-close:hover { color: #fff; background: rgba(255,255,255,0.07); }\n .google-preflight-copy {\n color: #b4b4b8;\n font-size: 0.75rem;\n line-height: 1.55;\n }\n .google-preflight-copy + .google-preflight-copy { margin-top: 0.5rem; }\n .google-preflight-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.875rem;\n }\n .google-preflight-actions .btn-primary,\n .google-preflight-actions .btn-secondary {\n flex: 1;\n width: auto;\n margin-top: 0;\n white-space: nowrap;\n }\n .google-preflight-command {\n margin-top: 0.75rem;\n padding: 0.75rem;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 8px;\n background: rgba(0,0,0,0.24);\n }\n .google-preflight-command[hidden] { display: none; }\n .google-preflight-command-label {\n margin-bottom: 0.5rem;\n color: #d4d4d8;\n font-size: 0.75rem;\n font-weight: 500;\n }\n .google-preflight-command code {\n display: block;\n overflow-x: auto;\n color: #e5e5e5;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.71875rem;\n line-height: 1.45;\n white-space: nowrap;\n }\n @media (max-width: 480px) {\n .google-preflight {\n position: static;\n margin-top: 0.625rem;\n }\n .google-preflight::before { display: none; }\n .google-preflight-actions { flex-direction: column; }\n .google-preflight-actions .btn-primary,\n .google-preflight-actions .btn-secondary { width: 100%; }\n }\n .local-note {\n display: none;\n max-width: 400px;\n width: 100%;\n margin-top: 1rem;\n padding: 0.625rem 0.875rem;\n font-size: 0.6875rem;\n line-height: 1.5;\n color: #666;\n border: 1px dashed rgba(255,255,255,0.08);\n border-radius: 8px;\n text-align: center;\n }\n .local-note.show { display: block; }\n .local-note strong { color: #999; font-weight: 500; }\n .local-note a { color: #888; text-decoration: none; }\n .local-note a:hover { color: #bbb; }\n${marketingStyles}\n</style>\n</head>\n<body${hasMarketing ? ' class=\"has-marketing\"' : \"\"}>\n${localePickerHtml}\n${marketingPanelHtml}\n<div class=\"card\">\n <h1 id=\"heading\"${i18nAttr(googleOnly ? \"signInTitle\" : \"welcomeTitle\")}>${esc(t(googleOnly ? \"signInTitle\" : \"welcomeTitle\"))}</h1>\n <p class=\"subtitle\" id=\"subtitle\"${i18nAttr(googleOnly ? \"googleOnlySubtitle\" : \"createAccountSubtitle\")}>${esc(t(googleOnly ? \"googleOnlySubtitle\" : \"createAccountSubtitle\"))}</p>\n <p\n class=\"upgrade-note\"\n id=\"upgrade-note\"\n data-upgrade-copy=\"${esc(t(\"upgradeCopy\"))}\"\n ${i18nDataAttr(\"data-upgrade-copy\", \"upgradeCopy\").trim()}\n ></p>\n${identitySsoHtml}\n${\n renderGoogleButton\n ? `\n <div class=\"google-signin\" id=\"google-signin\">\n <button class=\"btn-google\" id=\"google-btn\" onclick=\"signInWithGoogle()\"${googleSignInNotice ? ' aria-haspopup=\"dialog\" aria-expanded=\"false\" aria-controls=\"google-preflight\"' : \"\"}>\n <svg viewBox=\"0 0 24 24\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/><path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/><path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/></svg>\n <span${i18nAttr(\"googleButton\")}>${esc(t(\"googleButton\"))}</span>\n </button>\n <p class=\"google-error\" id=\"google-err\"></p>\n <p class=\"google-debug\" id=\"google-debug\"></p>\n${googleNoticeHtml}\n </div>\n${googleOnly ? \"\" : `\\n <div class=\"divider\" id=\"auth-divider\"${i18nAttr(\"dividerOr\")}>${esc(t(\"dividerOr\"))}</div>\\n`}\n`\n : \"\"\n}\n${\n googleOnly\n ? \"\"\n : ` <div class=\"tabs\">\n <button class=\"tab\" data-tab=\"signup\"${i18nAttr(\"createAccount\")}>${esc(t(\"createAccount\"))}</button>\n <button class=\"tab\" data-tab=\"login\"${i18nAttr(\"signIn\")}>${esc(t(\"signIn\"))}</button>\n </div>\n\n <form id=\"signup-form\" class=\"form\">\n <label for=\"s-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"s-email\" type=\"email\" autocomplete=\"email\" autofocus placeholder=\"you@example.com\" required />\n <label for=\"s-pass\"${i18nAttr(\"password\")}>${esc(t(\"password\"))}</label>\n <input id=\"s-pass\" type=\"password\" autocomplete=\"new-password\" placeholder=\"${esc(t(\"passwordMinPlaceholder\"))}\"${i18nPlaceholderAttr(\"passwordMinPlaceholder\")} required minlength=\"8\" />\n <label for=\"s-pass2\"${i18nAttr(\"confirmPassword\")}>${esc(t(\"confirmPassword\"))}</label>\n <input id=\"s-pass2\" type=\"password\" autocomplete=\"new-password\" placeholder=\"${esc(t(\"confirmPasswordPlaceholder\"))}\"${i18nPlaceholderAttr(\"confirmPasswordPlaceholder\")} required minlength=\"8\" />\n <button type=\"submit\"${i18nAttr(\"createAccount\")}>${esc(t(\"createAccount\"))}</button>\n${signupLegalNoteHtml}\n${signupLocalModeNoteHtml}\n <p class=\"msg\" id=\"s-msg\"></p>\n </form>\n\n <div id=\"verification-step\" class=\"form verification-step\" aria-live=\"polite\">\n <div class=\"step-progress\" aria-label=\"${esc(t(\"signupProgress\"))}\"${i18nAriaAttr(\"signupProgress\")}>\n <div class=\"progress-step complete\"><span>1</span><strong${i18nAttr(\"progressAccount\")}>${esc(t(\"progressAccount\"))}</strong></div>\n <div class=\"progress-step current\"><span>2</span><strong${i18nAttr(\"progressVerify\")}>${esc(t(\"progressVerify\"))}</strong></div>\n <div class=\"progress-step\"><span>3</span><strong${i18nAttr(\"progressStart\")}>${esc(t(\"progressStart\"))}</strong></div>\n </div>\n <div class=\"verification-panel\">\n <p class=\"verification-kicker\"${i18nAttr(\"verificationSent\")}>${esc(t(\"verificationSent\"))}</p>\n <p class=\"verification-copy\"><span${i18nAttr(\"verifyCopyPrefix\")}>${esc(t(\"verifyCopyPrefix\"))}</span> <strong id=\"verify-email\"></strong><span${i18nAttr(\"verifyCopySuffix\")}>${esc(t(\"verifyCopySuffix\"))}</span></p>\n <p class=\"verification-note\"${i18nAttr(\"verificationNote\")}>${esc(t(\"verificationNote\"))}</p>\n </div>\n <button type=\"button\" class=\"btn-primary\" id=\"verify-continue\"${i18nAttr(\"continue\")}>${esc(t(\"continue\"))}</button>\n <div class=\"inline-actions\">\n <button type=\"button\" class=\"link-button\" id=\"resend-verification\"${i18nAttr(\"resendEmail\")}>${esc(t(\"resendEmail\"))}</button>\n <button type=\"button\" class=\"link-button\" id=\"back-to-signup\"${i18nAttr(\"back\")}>${esc(t(\"back\"))}</button>\n </div>\n <p class=\"msg\" id=\"verify-msg\"></p>\n </div>\n\n <form id=\"login-form\" class=\"form\">\n <label for=\"l-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"l-email\" type=\"email\" autocomplete=\"email\" placeholder=\"you@example.com\" required />\n <label for=\"l-pass\"${i18nAttr(\"password\")}>${esc(t(\"password\"))}</label>\n <input id=\"l-pass\" type=\"password\" autocomplete=\"current-password\" placeholder=\"${esc(t(\"enterPasswordPlaceholder\"))}\"${i18nPlaceholderAttr(\"enterPasswordPlaceholder\")} required />\n <button type=\"submit\"${i18nAttr(\"signIn\")}>${esc(t(\"signIn\"))}</button>\n <p class=\"msg error\" id=\"l-msg\"></p>\n <p style=\"margin-top:0.75rem;font-size:0.75rem;text-align:right\">\n <a href=\"#\" id=\"forgot-link\" style=\"color:#888;text-decoration:underline;text-underline-offset:2px\"${i18nAttr(\"forgotPassword\")}>${esc(t(\"forgotPassword\"))}</a>\n </p>\n </form>\n\n <form id=\"forgot-form\" class=\"form\">\n <label for=\"f-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"f-email\" type=\"email\" autocomplete=\"email\" placeholder=\"you@example.com\" required />\n <button type=\"submit\"${i18nAttr(\"sendResetLink\")}>${esc(t(\"sendResetLink\"))}</button>\n <p class=\"msg\" id=\"f-msg\"></p>\n <p style=\"margin-top:0.75rem;font-size:0.75rem;text-align:center\">\n <a href=\"#\" id=\"back-to-login\" style=\"color:#888;text-decoration:underline;text-underline-offset:2px\"${i18nAttr(\"backToSignIn\")}>${esc(t(\"backToSignIn\"))}</a>\n </p>\n </form>`\n}\n</div>\n<p class=\"local-note\" id=\"local-note\">\n <span${i18nAttr(\"localNotePrefix\")}>${esc(t(\"localNotePrefix\"))}</span> (<strong>${getConnectionLabel()}</strong>)<span${i18nAttr(\"localNoteSuffix\")}>${esc(t(\"localNoteSuffix\"))}</span>\n</p>${marketingCloseHtml}\n<script>\n function __anBasePath() {\n var configured = ${JSON.stringify(appBasePath)};\n if (configured) return configured;\n var marker = '/_agent-native';\n var idx = window.location.pathname.indexOf(marker);\n return idx > 0 ? window.location.pathname.slice(0, idx) : '';\n }\n function __anPath(path) {\n return __anBasePath() + path;\n }\n var __AN_AUTH_DEFAULT_LOCALE = ${JSON.stringify(DEFAULT_LOCALE)};\n var __AN_AUTH_SUPPORTED_LOCALES = ${JSON.stringify(SUPPORTED_LOCALES)};\n var __AN_AUTH_LOCALE_STORAGE_KEY = ${JSON.stringify(LOCALE_STORAGE_KEY)};\n var __AN_AUTH_LOCALE_METADATA = ${JSON.stringify(LOCALE_METADATA)};\n var __AN_AUTH_LOCALES = ${JSON.stringify(AUTH_LOCALE_COPY)};\n var __AN_AUTH_MARKETING_APP_NAME = ${JSON.stringify(marketing?.appName ?? \"\")};\n var __AN_AUTH_HAS_MARKETING = ${JSON.stringify(hasMarketing)};\n var __AN_AUTH_MARKETING_SLUG = ${JSON.stringify(marketingSlug ?? \"\")};\n var __AN_AUTH_MARKETING_DEFAULT = ${JSON.stringify(defaultMarketingCopy ?? {})};\n var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(AUTH_MARKETING_LOCALE_COPY)};\n var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;\n var __anAuthLocalePreference = 'system';\n var __anAuthView = ${JSON.stringify(googleOnly ? \"googleOnly\" : \"signup\")};\n function __anAuthLocaleIsSupported(value) {\n return __AN_AUTH_SUPPORTED_LOCALES.indexOf(value) !== -1;\n }\n function __anNormalizeAuthLocale(value) {\n if (typeof value !== 'string' || !value) return null;\n if (__anAuthLocaleIsSupported(value)) return value;\n try {\n var canonical = Intl.getCanonicalLocales(value)[0];\n if (__anAuthLocaleIsSupported(canonical)) return canonical;\n var language = canonical && canonical.split('-')[0].toLowerCase();\n for (var i = 0; i < __AN_AUTH_SUPPORTED_LOCALES.length; i++) {\n var locale = __AN_AUTH_SUPPORTED_LOCALES[i];\n if (locale.split('-')[0].toLowerCase() === language) return locale;\n }\n } catch(e) {}\n return null;\n }\n function __anNormalizeAuthLocalePreference(value) {\n if (value === 'system') return 'system';\n return __anNormalizeAuthLocale(value);\n }\n function __anReadAuthLocalePreference() {\n try {\n return __anNormalizeAuthLocalePreference(localStorage.getItem(__AN_AUTH_LOCALE_STORAGE_KEY)) || 'system';\n } catch(e) {\n return 'system';\n }\n }\n function __anWriteAuthLocalePreference(preference) {\n try {\n localStorage.setItem(__AN_AUTH_LOCALE_STORAGE_KEY, preference);\n } catch(e) {}\n }\n function __anBrowserAuthLocales() {\n try {\n if (navigator.languages && navigator.languages.length) return navigator.languages;\n if (navigator.language) return [navigator.language];\n } catch(e) {}\n return [];\n }\n function __anResolveAuthLocale(preference) {\n var normalizedPreference = __anNormalizeAuthLocalePreference(preference) || 'system';\n if (normalizedPreference !== 'system') return normalizedPreference;\n var rootLocale = __anNormalizeAuthLocale(document.documentElement.getAttribute('data-locale'));\n if (rootLocale) return rootLocale;\n var locales = __anBrowserAuthLocales();\n for (var i = 0; i < locales.length; i++) {\n var match = __anNormalizeAuthLocale(locales[i]);\n if (match) return match;\n }\n return __AN_AUTH_DEFAULT_LOCALE;\n }\n function __anT(key) {\n var localized = __AN_AUTH_LOCALES[__anAuthLocale] || __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};\n var fallback = __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};\n return localized[key] || fallback[key] || key;\n }\n function __anSetAuthI18nKey(node, key) {\n if (!node || !key) return;\n node.setAttribute('data-i18n', key);\n node.textContent = __anT(key);\n }\n function __anAuthHeadingKeys(view) {\n if (view === 'login') return { heading: 'welcomeBackTitle', subtitle: 'signInSubtitle' };\n if (view === 'forgot') return { heading: 'resetPasswordTitle', subtitle: 'resetPasswordSubtitle' };\n if (view === 'verification') return { heading: 'checkEmailTitle', subtitle: 'finishAccountSubtitle' };\n if (view === 'googleOnly') return { heading: 'signInTitle', subtitle: 'googleOnlySubtitle' };\n return { heading: 'welcomeTitle', subtitle: 'createAccountSubtitle' };\n }\n function __anRefreshAuthViewCopy() {\n var keys = __anAuthHeadingKeys(__anAuthView);\n __anSetAuthI18nKey(document.getElementById('heading'), keys.heading);\n __anSetAuthI18nKey(document.getElementById('subtitle'), keys.subtitle);\n }\n function __anSetAuthView(view) {\n __anAuthView = view || 'signup';\n __anRefreshAuthViewCopy();\n }\n function __anMarketingCopy() {\n if (!__AN_AUTH_MARKETING_SLUG) return __AN_AUTH_MARKETING_DEFAULT || {};\n var localeMarketing = (__AN_AUTH_MARKETING_LOCALES[__anAuthLocale] || {})[__AN_AUTH_MARKETING_SLUG] || {};\n return {\n tagline: localeMarketing.tagline || __AN_AUTH_MARKETING_DEFAULT.tagline,\n description: localeMarketing.description || __AN_AUTH_MARKETING_DEFAULT.description,\n features: localeMarketing.features || __AN_AUTH_MARKETING_DEFAULT.features || []\n };\n }\n function __anApplyAuthMarketingCopy() {\n var copy = __anMarketingCopy();\n var tagline = document.querySelector('[data-marketing-field=\"tagline\"]');\n if (tagline && copy.tagline) tagline.textContent = copy.tagline;\n var description = document.querySelector('[data-marketing-field=\"description\"]');\n if (description && copy.description) description.textContent = copy.description;\n document.querySelectorAll('[data-marketing-feature-index]').forEach(function(node) {\n var index = Number(node.getAttribute('data-marketing-feature-index'));\n var feature = copy.features && copy.features[index];\n if (feature) node.textContent = feature;\n });\n }\n function __anApplyAuthLocale(preference) {\n __anAuthLocalePreference = __anNormalizeAuthLocalePreference(preference) || __anReadAuthLocalePreference();\n __anAuthLocale = __anResolveAuthLocale(__anAuthLocalePreference);\n var root = document.documentElement;\n var meta = __AN_AUTH_LOCALE_METADATA[__anAuthLocale] || {};\n root.setAttribute('lang', __anAuthLocale);\n root.setAttribute('dir', meta.dir || 'ltr');\n root.setAttribute('data-locale', __anAuthLocale);\n document.querySelectorAll('[data-i18n]').forEach(function(node) {\n node.textContent = __anT(node.getAttribute('data-i18n'));\n });\n document.querySelectorAll('[data-i18n-placeholder]').forEach(function(node) {\n node.setAttribute('placeholder', __anT(node.getAttribute('data-i18n-placeholder')));\n });\n document.querySelectorAll('[data-i18n-aria-label]').forEach(function(node) {\n node.setAttribute('aria-label', __anT(node.getAttribute('data-i18n-aria-label')));\n });\n document.querySelectorAll('[data-i18n-title]').forEach(function(node) {\n node.setAttribute('title', __anT(node.getAttribute('data-i18n-title')));\n });\n document.querySelectorAll('[data-i18n-data-upgrade-copy]').forEach(function(node) {\n node.setAttribute('data-upgrade-copy', __anT(node.getAttribute('data-i18n-data-upgrade-copy')));\n });\n document.querySelectorAll('[data-locale-value]').forEach(function(node) {\n var checked = node.getAttribute('data-locale-value') === __anAuthLocalePreference;\n node.setAttribute('aria-checked', checked ? 'true' : 'false');\n });\n document.title = __AN_AUTH_HAS_MARKETING && __AN_AUTH_MARKETING_APP_NAME\n ? __AN_AUTH_MARKETING_APP_NAME + ' — ' + __anT('pageTitleSignIn')\n : __anT('pageTitleWelcome');\n __anApplyAuthMarketingCopy();\n __anRefreshAuthViewCopy();\n }\n function __anSetAuthLocaleMenuOpen(open) {\n var trigger = document.getElementById('auth-locale-trigger');\n var menu = document.getElementById('auth-locale-menu');\n if (!trigger || !menu) return;\n if (open) {\n menu.removeAttribute('hidden');\n } else {\n menu.setAttribute('hidden', '');\n }\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n (function __anInitAuthLocalePicker() {\n var trigger = document.getElementById('auth-locale-trigger');\n var menu = document.getElementById('auth-locale-menu');\n var preference = __anReadAuthLocalePreference();\n __anApplyAuthLocale(preference);\n if (!trigger || !menu) return;\n trigger.addEventListener('click', function(event) {\n event.preventDefault();\n __anSetAuthLocaleMenuOpen(menu.hasAttribute('hidden'));\n });\n menu.querySelectorAll('[data-locale-value]').forEach(function(item) {\n item.addEventListener('click', function() {\n var next = __anNormalizeAuthLocalePreference(item.getAttribute('data-locale-value')) || 'system';\n __anWriteAuthLocalePreference(next);\n __anApplyAuthLocale(next);\n __anSetAuthLocaleMenuOpen(false);\n trigger.focus();\n });\n });\n document.addEventListener('click', function(event) {\n var picker = document.querySelector('.locale-picker');\n if (picker && picker.contains(event.target)) return;\n __anSetAuthLocaleMenuOpen(false);\n });\n document.addEventListener('keydown', function(event) {\n if (event.key === 'Escape') __anSetAuthLocaleMenuOpen(false);\n });\n })();\n var __AN_PUBLIC_OAUTH_ORIGIN = ${JSON.stringify(publicOAuthOrigin)};\n var __AN_WORKSPACE_GATEWAY_RETURN_ORIGIN = ${JSON.stringify(workspaceGatewayReturnOrigin)};\n var __AN_GOOGLE_AUTH_MODE = ${JSON.stringify(googleAuthMode)};\n function __anConfiguredOAuthOrigin() {\n if (!__AN_PUBLIC_OAUTH_ORIGIN) return '';\n try {\n var origin = new URL(__AN_PUBLIC_OAUTH_ORIGIN).origin;\n return origin && origin !== window.location.origin ? origin : '';\n } catch(e) {\n return '';\n }\n }\n function __anAuthPath(path) {\n var origin = __anIsBuilderPreview() ? __anConfiguredOAuthOrigin() : '';\n return origin ? origin + path : __anPath(path);\n }\n function __anGoogleAuthUrlPath() {\n return __anIsBuilderPreview()\n ? __anAuthPath('/_agent-native/google/auth-url')\n : __anPath('/_agent-native/google/auth-url');\n }\n function __anBuilderPreviewReturnOrigin() {\n var candidates = [window.location.href, document.referrer || ''];\n try {\n if (window.location.ancestorOrigins) {\n for (var j = 0; j < window.location.ancestorOrigins.length; j++) {\n candidates.push(window.location.ancestorOrigins[j]);\n }\n }\n } catch(e) {}\n for (var i = 0; i < candidates.length; i++) {\n try {\n var url = new URL(candidates[i]);\n var host = url.hostname.toLowerCase();\n var isPreviewHost =\n host === 'builderio.xyz' || host.slice(-14) === '.builderio.xyz' ||\n host === 'builderio.dev' || host.slice(-14) === '.builderio.dev' ||\n host === 'builder.codes' || host.slice(-14) === '.builder.codes' ||\n host === 'builder.my' || host.slice(-11) === '.builder.my';\n if (url.protocol === 'https:' && isPreviewHost) return url.origin;\n } catch(e) {}\n }\n return '';\n }\n function __anWorkspaceGatewayReturnOrigin() {\n var previewOrigin = __anBuilderPreviewReturnOrigin();\n if (previewOrigin) return previewOrigin;\n if (__AN_WORKSPACE_GATEWAY_RETURN_ORIGIN) return __AN_WORKSPACE_GATEWAY_RETURN_ORIGIN;\n return __anIsBuilderDesktop() ? 'http://127.0.0.1:8080' : '';\n }\n function __anNormalizeWorkspaceReturnPath(ret) {\n try {\n var url = new URL(ret || '/', window.location.origin);\n var path = url.pathname || '/';\n if (path === '/dispatch/dispatch') {\n path = '/dispatch';\n } else if (path.indexOf('/dispatch/') === 0) {\n var rest = path.slice('/dispatch/'.length);\n var first = rest.split('/')[0];\n var dispatchRoutes = {\n overview: true, apps: true, metrics: true, vault: true,\n integrations: true, messaging: true, workspace: true,\n agents: true, destinations: true, identities: true,\n approvals: true, audit: true, team: true, 'thread-debug': true,\n 'new-app': true\n };\n if (first === 'dispatch') {\n path = '/dispatch' + rest.slice(first.length);\n } else if (first && !dispatchRoutes[first]) {\n path = '/' + rest;\n }\n }\n return path + url.search + url.hash;\n } catch(e) {\n return ret || '/';\n }\n }\n function __anOAuthReturnTarget(ret) {\n var path = __anNormalizeWorkspaceReturnPath(ret);\n var origin = __anWorkspaceGatewayReturnOrigin();\n return origin ? origin + path : path;\n }\n function __anSessionBridgeUrl(ret, sessionToken) {\n try {\n var url = new URL(ret || window.location.pathname + window.location.search, window.location.origin);\n url.searchParams.set('_session', sessionToken);\n return url.pathname + url.search + url.hash;\n } catch(e) {\n var sep = (ret || '/').indexOf('?') === -1 ? '?' : '&';\n return (ret || '/') + sep + '_session=' + encodeURIComponent(sessionToken);\n }\n }\n function __anFinishOAuthExchange(ret, flowId, sessionToken) {\n __anGoogleSignInInFlight = false;\n if (__anIsBuilderPreview()) {\n if (sessionToken) {\n __anSetOAuthDebug('OAuth exchange redeemed; applying session bridge to embedded app', flowId);\n window.location.replace(__anSessionBridgeUrl(ret, sessionToken));\n return;\n }\n __anSetOAuthDebug('OAuth exchange redeemed; reloading the embedded app', flowId);\n window.location.reload();\n return;\n }\n __anSetOAuthDebug('OAuth exchange redeemed; returning to the app', flowId);\n __anRedirectToSignedInApp(ret);\n }\n function __anHasControlCharacter(value) {\n for (var i = 0; i < value.length; i++) {\n if (value.charCodeAt(i) < 32) return true;\n }\n return false;\n }\n function __anNormalizeReturnPath(raw) {\n var value = typeof raw === 'string' ? raw : '';\n if (!value || __anHasControlCharacter(value)) return '';\n if (value.charAt(0) === '\\\\\\\\') return '';\n if (value.charAt(0) === '/' && (value.charAt(1) === '/' || value.charAt(1) === '\\\\\\\\')) return '';\n try {\n var url = new URL(value, window.location.origin);\n if (url.origin !== window.location.origin) return '';\n return url.pathname + url.search + url.hash;\n } catch(e) {\n return '';\n }\n }\n function __anCurrentReturnPath() {\n return window.location.pathname + window.location.search + window.location.hash;\n }\n function __anGetReturnPath() {\n try {\n var inner = new URLSearchParams(window.location.search).get('return');\n var normalized = __anNormalizeReturnPath(inner);\n if (normalized) return normalized;\n } catch(e) {}\n return __anCurrentReturnPath();\n }\n function __anMountedPathname(pathname) {\n var base = __anBasePath();\n if (base && pathname.indexOf(base + '/') === 0) return pathname.slice(base.length);\n if (base && pathname === base) return '/';\n return pathname || '/';\n }\n function __anIsAuthEntryPath(pathname) {\n var p = __anMountedPathname(pathname);\n return p === '/login' || p === '/signup' || p === '/_agent-native/sign-in';\n }\n function __anGetSignedInReturnPath() {\n try {\n var inner = new URLSearchParams(window.location.search).get('return');\n var normalized = __anNormalizeReturnPath(inner);\n if (normalized) return normalized;\n } catch(e) {}\n if (__anIsAuthEntryPath(window.location.pathname)) return __anPath('/');\n return __anCurrentReturnPath();\n }\n function __anRedirectToSignedInApp(ret) {\n window.location.replace(ret || __anGetSignedInReturnPath());\n }\n function __anMaybeRedirectSignedIn(ret) {\n return fetch(__anPath('/_agent-native/auth/session'), {\n headers: { 'Accept': 'application/json' },\n credentials: 'include',\n cache: 'no-store',\n }).then(function(res) {\n if (!res.ok) return null;\n return res.json().catch(function() { return null; });\n }).then(function(data) {\n if (data && data.email && !data.error) {\n __anRedirectToSignedInApp(ret);\n return true;\n }\n return false;\n }).catch(function() {\n return false;\n });\n }\n${identitySsoScript}\n\t (function __anRedirectIfAlreadySignedIn() {\n\t __anMaybeRedirectSignedIn();\n\t })();\n\t function __anSafeAttributionValue(value) {\n\t return typeof value === 'string' ? value.trim().slice(0, 120) : '';\n\t }\n\t function __anFirstTouchCookiePresent() {\n\t try {\n\t return document.cookie.split(';').some(function(part) {\n\t return part.trim().indexOf('an_ft=') === 0;\n\t });\n\t } catch(e) {\n\t return false;\n\t }\n\t }\n\t function __anWriteFirstTouchCookie(json) {\n\t try {\n\t document.cookie = 'an_ft=' + encodeURIComponent(json) + '; path=/; max-age=2592000; SameSite=Lax';\n\t } catch(e) {}\n\t }\n\t function __anExternalReferrerHost(referrer) {\n\t try {\n\t var url = new URL(referrer);\n\t if (url.host.toLowerCase() === window.location.host.toLowerCase()) return '';\n\t return __anSafeAttributionValue(url.host);\n\t } catch(e) {\n\t return '';\n\t }\n\t }\n\t function __anCaptureSignupAttribution() {\n\t try {\n\t var stored = '';\n\t try { stored = localStorage.getItem('an_attribution') || ''; } catch(e) {}\n\t if (stored) {\n\t if (!__anFirstTouchCookiePresent()) __anWriteFirstTouchCookie(stored);\n\t return;\n\t }\n\t if (__anFirstTouchCookiePresent()) return;\n\t var params = new URLSearchParams(window.location.search || '');\n\t var ft = {};\n\t ['ref', 'via', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach(function(key) {\n\t var value = __anSafeAttributionValue(params.get(key));\n\t if (value) ft[key] = value;\n\t });\n\t var returnPath = __anNormalizeReturnPath(params.get('return'));\n\t var landingPath = __anSafeAttributionValue(returnPath || window.location.pathname || '');\n\t if (landingPath) ft.landing_path = landingPath;\n\t var referrer = __anExternalReferrerHost(document.referrer || '');\n\t if (referrer) ft.landing_referrer = referrer;\n\t ft.landed_at = new Date().toISOString();\n\t var json = JSON.stringify(ft);\n\t try { localStorage.setItem('an_attribution', json); } catch(e) {}\n\t __anWriteFirstTouchCookie(json);\n\t } catch(e) {}\n\t }\n\t __anCaptureSignupAttribution();\n\t var __anBuilderPreviewSeen = false;\n function __anRememberBuilderPreview() {\n __anBuilderPreviewSeen = true;\n try { sessionStorage.setItem('__an_builder_preview_seen', '1'); } catch(e) {}\n }\n function __anHasBuilderPreviewSignal() {\n try {\n var params = new URLSearchParams(window.location.search);\n if (params.has('builder.preview') || params.has('builder.frameEditing') || params.has('__builder_editing__')) return true;\n } catch(e) {}\n return false;\n }\n function __anIsBuilderPreview() {\n if (__anBuilderPreviewSeen) return true;\n if (__anHasBuilderPreviewSignal()) {\n __anRememberBuilderPreview();\n return true;\n }\n try {\n if (sessionStorage.getItem('__an_builder_preview_seen') === '1') {\n __anBuilderPreviewSeen = true;\n return true;\n }\n } catch(e) {}\n try {\n var ref = document.referrer || '';\n var fromBuilder = ref.indexOf('builder.io') !== -1 || ref.indexOf('builder.my') !== -1 || ref.indexOf('builderio.xyz') !== -1 || ref.indexOf('builderio.dev') !== -1 || ref.indexOf('builder.codes') !== -1;\n if (fromBuilder) __anRememberBuilderPreview();\n return fromBuilder;\n } catch(e) {\n return false;\n }\n }\n __anIsBuilderPreview();\n function __anIsBuilderDesktop() {\n try {\n var ua = navigator.userAgent || '';\n return ua.indexOf('Electron') !== -1 && ua.indexOf('AgentNativeDesktop') === -1;\n } catch(e) {\n return false;\n }\n }\n function __anIsAgentNativeDesktop() {\n try {\n return (navigator.userAgent || '').indexOf('AgentNativeDesktop') !== -1;\n } catch(e) {\n return false;\n }\n }\n function __anIsInFrame() {\n try {\n return window.self !== window.top;\n } catch(e) {\n return true;\n }\n }\n function __anIsElectron() {\n try {\n return (navigator.userAgent || '').indexOf('Electron') !== -1;\n } catch(e) {\n return false;\n }\n }\n function __anResolveAuthFlow() {\n if (__anIsBuilderPreview()) return __anIsInFrame() ? 'popup' : 'redirect';\n // Per-session override for ad-hoc testing outside Builder: append\n // ?authMode=popup or ?authMode=redirect to the sign-in URL.\n try {\n var qp = new URLSearchParams(window.location.search).get('authMode');\n if (qp === 'popup' || qp === 'redirect') return qp;\n } catch(e) {}\n var mode = __AN_GOOGLE_AUTH_MODE || 'auto';\n if (mode === 'popup') return 'popup';\n if (mode === 'redirect') return 'redirect';\n return __anIsAgentNativeDesktop() ? 'redirect' : 'popup';\n }\n var __anOAuthPollTimer = null;\n var __anOAuthPollCount = 0;\n var __anGoogleSignInInFlight = false;\n var __anGoogleRecoverBound = false;\n function __anNewOAuthFlowId() {\n try {\n if (window.crypto && typeof window.crypto.randomUUID === 'function') {\n return window.crypto.randomUUID();\n }\n } catch(e) {}\n return 'builder-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2);\n }\n function __anFlowDebugId(flowId) {\n return flowId ? String(flowId).slice(-10) : '';\n }\n function __anSetOAuthDebug(message, flowId) {\n var text = message + (flowId ? ' (flow ' + __anFlowDebugId(flowId) + ')' : '');\n try {\n console.info('[agent-native][google-oauth] ' + text);\n } catch(e) {}\n // Only surface the debug overlay when explicitly opted in via #oauth-debug\n // hash or ?oauth_debug=1 query — otherwise it leaks raw flow IDs and\n // diagnostic strings into the user-facing sign-in screen.\n var showDebugOverlay = false;\n try {\n var loc = window.location || {};\n showDebugOverlay =\n (typeof loc.hash === 'string' && loc.hash.indexOf('oauth-debug') !== -1) ||\n (typeof loc.search === 'string' && loc.search.indexOf('oauth_debug=1') !== -1);\n } catch(e) {}\n var debug = document.getElementById('google-debug');\n if (debug) {\n debug.textContent = text;\n if (showDebugOverlay) debug.classList.add('show');\n }\n }\n function __anShowOAuthError(err, btn, message) {\n if (__anOAuthPollTimer) {\n clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = null;\n }\n err.textContent = message;\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n function __anRecoverGoogleSignInAfterReturn() {\n // The user left for the Google sign-in window and came back. If the flow\n // never completed (e.g. they closed the window to switch profiles), the\n // button is stuck disabled with no error path firing for up to 5 minutes.\n // Re-enable it so they can retry. Wait briefly first so a genuinely\n // in-flight exchange can still finish and navigate without a flicker.\n if (!__anGoogleSignInInFlight) return;\n setTimeout(function() {\n __anMaybeRedirectSignedIn(__anGetSignedInReturnPath()).then(function(redirected) {\n if (redirected) return;\n if (!__anGoogleSignInInFlight) return;\n var btn = document.getElementById('google-btn');\n if (!btn || !btn.disabled) return;\n // Keep the desktop-exchange poll alive. Agent Native Desktop opens\n // Google in the system browser, so focus can return before the\n // callback has stored the session token.\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n });\n }, 1200);\n }\n function __anBindGoogleRecover() {\n if (__anGoogleRecoverBound) return;\n __anGoogleRecoverBound = true;\n window.addEventListener('focus', __anRecoverGoogleSignInAfterReturn);\n document.addEventListener('visibilitychange', function() {\n if (document.visibilityState === 'visible') __anRecoverGoogleSignInAfterReturn();\n });\n }\n function __anHandlePopupOAuthFailure(ret, btn, err, flowId, redirectReason, builderFrameMessage) {\n if (__anIsBuilderPreview() && __anIsInFrame()) {\n __anShowOAuthError(err, btn, builderFrameMessage + ' ' + __anT('googlePopupHelp') + ' (flow ' + __anFlowDebugId(flowId) + ').');\n return;\n }\n __anStartRedirectOAuth(ret, btn, err, flowId, redirectReason);\n }\n function __anStartRedirectOAuth(ret, btn, err, flowId, reason) {\n var params = new URLSearchParams();\n var oauthReturn = __anIsBuilderPreview() ? __anOAuthReturnTarget(ret) : ret;\n if (oauthReturn) params.set('return', oauthReturn);\n params.set('redirect', '1');\n __anSetOAuthDebug(reason || 'Opening Google sign-in redirect', flowId);\n try {\n __anOpenOAuthUrl(__anGoogleAuthUrlPath() + '?' + params.toString());\n } catch(e) {\n __anShowOAuthError(err, btn, 'Could not start Google sign-in redirect' + (flowId ? ' for flow ' + __anFlowDebugId(flowId) : '') + ': ' + (e && e.message ? e.message : 'unknown error'));\n }\n }\n function __anWaitForOAuthExchange(flowId, ret, btn, err) {\n var started = Date.now();\n var timeoutMs = 5 * 60 * 1000;\n __anOAuthPollCount = 0;\n async function check() {\n __anOAuthPollCount++;\n try {\n var res = await fetch(__anPath('/_agent-native/auth/desktop-exchange') + '?flow_id=' + encodeURIComponent(flowId), { credentials: 'include' });\n var data = await res.json().catch(function() { return {}; });\n if (data && (data.email || data.token)) {\n if (__anOAuthPollTimer) clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = null;\n __anFinishOAuthExchange(ret, flowId, data.token);\n return;\n }\n if (data && data.error) {\n __anSetOAuthDebug('OAuth exchange returned an error: ' + (data.message || data.error), flowId);\n __anShowOAuthError(err, btn, data.message || data.error);\n return;\n }\n if (data && data.pending && (__anOAuthPollCount === 1 || __anOAuthPollCount % 5 === 0)) {\n __anSetOAuthDebug('Waiting for the Google callback; polling attempt ' + __anOAuthPollCount, flowId);\n }\n } catch(e) {\n if (__anOAuthPollCount === 1 || __anOAuthPollCount % 5 === 0) {\n __anSetOAuthDebug('Could not reach the OAuth exchange endpoint: ' + (e && e.message ? e.message : 'network error'), flowId);\n }\n }\n if (Date.now() - started > timeoutMs) {\n __anShowOAuthError(err, btn, __anT('googleNeverFinished') + ' Flow ' + __anFlowDebugId(flowId) + '.');\n }\n }\n if (__anOAuthPollTimer) clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = setInterval(check, 1000);\n setTimeout(check, 500);\n }\n function __anStartPopupOAuth(ret, btn, err) {\n var flowId = __anNewOAuthFlowId();\n var oauthReturn = __anIsBuilderPreview() ? __anOAuthReturnTarget(ret) : ret;\n var params = new URLSearchParams();\n if (oauthReturn) params.set('return', oauthReturn);\n params.set('desktop', '1');\n params.set('flow_id', flowId);\n params.set('redirect', '1');\n var url = __anGoogleAuthUrlPath() + '?' + params.toString();\n try { sessionStorage.setItem('__an_signin', '1'); } catch(e) {}\n __anSetOAuthDebug('Opening Google sign-in popup', flowId);\n try {\n var popup = window.open('', '_blank', 'width=640,height=760');\n if (!popup) {\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Google popup was blocked; falling back to redirect', 'Google popup was blocked.');\n return;\n }\n try { popup.opener = null; } catch(e) {}\n try {\n popup.location.href = url;\n } catch(e) {\n try { popup.close(); } catch(closeErr) {}\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Could not navigate Google popup; falling back to redirect', 'Could not navigate Google popup.');\n return;\n }\n __anSetOAuthDebug('Google popup opened; waiting for callback', flowId);\n } catch(e) {\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Could not open Google popup; falling back to redirect', 'Could not open Google popup.');\n return;\n }\n __anWaitForOAuthExchange(flowId, ret, btn, err);\n }\n function __anStartNativeDesktopOAuth(ret, btn, err) {\n var flowId = __anNewOAuthFlowId();\n var params = new URLSearchParams();\n if (ret) params.set('return', ret);\n params.set('desktop', '1');\n params.set('flow_id', flowId);\n params.set('redirect', '1');\n var url = __anGoogleAuthUrlPath() + '?' + params.toString();\n __anSetOAuthDebug('Opening Google sign-in in system browser', flowId);\n __anOpenOAuthUrl(url);\n __anWaitForOAuthExchange(flowId, ret, btn, err);\n }\n function __anOpenOAuthUrl(url) {\n try { sessionStorage.setItem('__an_signin', '1'); } catch(e) {}\n window.location.href = url;\n }\n (function revealLocalNote() {\n var h = location.hostname;\n if (h === 'localhost' || h === '127.0.0.1' || h === '::1' || h.endsWith('.local')) {\n var n = document.getElementById('local-note');\n if (n) n.classList.add('show');\n }\n })();\n (function revealUpgradeNote() {\n var shouldShow = false;\n try {\n var params = new URLSearchParams(location.search);\n shouldShow = params.get('signin') === '1' || params.get('upgrade-from-local') === '1';\n } catch(e) {}\n if (!shouldShow) {\n try { shouldShow = localStorage.getItem('an_migrate_from_local') === '1'; } catch(e) {}\n }\n if (!shouldShow) return;\n var n = document.getElementById('upgrade-note');\n if (!n) return;\n n.textContent = n.getAttribute('data-upgrade-copy') || __anT('migrateLocalFallback');\n n.classList.add('show');\n })();\n${\n googleOnly\n ? \"\"\n : ` var TAB_STORAGE_KEY = 'an.onboarding.tab';\n var tabs = document.querySelectorAll('.tab');\n var forms = document.querySelectorAll('.form');\n\t var pendingSignupEmail = '';\n\t var pendingSignupPassword = '';\n\t var verificationCheckInFlight = false;\n\t var RESEND_VERIFICATION_COOLDOWN_SECONDS = 60;\n\t var resendVerificationCooldownUntil = 0;\n\t var resendVerificationCooldownTimer = null;\n\t function setActiveTab(name, opts) {\n\t if (name !== 'signup' && name !== 'login') return;\n\t var form = document.getElementById(name + '-form');\n\t if (!form) return;\n var card = document.querySelector('.card');\n if (card) card.classList.remove('verifying');\n tabs.forEach(function(x) { x.classList.remove('active'); });\n forms.forEach(function(x) { x.classList.remove('active'); });\n var btn = document.querySelector('.tab[data-tab=\"' + name + '\"]');\n if (btn) btn.classList.add('active');\n form.classList.add('active');\n __anSetAuthView(name);\n if (opts && opts.persist) {\n try { localStorage.setItem(TAB_STORAGE_KEY, name); } catch (e) {}\n }\n }\n function showVerificationStep(email, password) {\n pendingSignupEmail = email || '';\n pendingSignupPassword = password || '';\n tabs.forEach(function(x) { x.classList.remove('active'); });\n forms.forEach(function(x) { x.classList.remove('active'); });\n var card = document.querySelector('.card');\n if (card) card.classList.add('verifying');\n var step = document.getElementById('verification-step');\n if (step) step.classList.add('active');\n var emailNode = document.getElementById('verify-email');\n if (emailNode) emailNode.textContent = pendingSignupEmail;\n __anSetAuthView('verification');\n var msg = document.getElementById('verify-msg');\n if (msg) {\n msg.classList.remove('show', 'error', 'success');\n msg.textContent = '';\n }\n try { localStorage.setItem(TAB_STORAGE_KEY, 'signup'); } catch (e) {}\n }\n function getVerificationMessageNode() {\n var verifyStep = document.getElementById('verification-step');\n if (verifyStep && verifyStep.classList.contains('active')) {\n return document.getElementById('verify-msg');\n }\n return document.getElementById('l-msg') || document.getElementById('verify-msg');\n }\n function isVerificationStepActive() {\n var verifyStep = document.getElementById('verification-step');\n return !!(verifyStep && verifyStep.classList.contains('active'));\n }\n function getPendingSignupEmail() {\n var signupEmail = document.getElementById('s-email');\n var loginEmail = document.getElementById('l-email');\n return (pendingSignupEmail || (signupEmail && signupEmail.value) || (loginEmail && loginEmail.value) || '').trim();\n }\n function getPendingSignupPassword() {\n var signupPassword = document.getElementById('s-pass');\n return pendingSignupPassword || (signupPassword && signupPassword.value) || '';\n }\n function __anNormalizeAuthEmail(value) {\n return String(value || '').trim().toLowerCase();\n }\n\t function __anIsValidAuthEmail(value) {\n\t return /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(__anNormalizeAuthEmail(value));\n\t }\n\t function __anIsVerifiedRedirectSuccess() {\n\t try {\n\t var params = new URLSearchParams(location.search);\n\t return params.has('verified') && !params.has('error');\n\t } catch (e) {\n\t return false;\n\t }\n\t }\n\t function __anShowEmailValidationError(input, msg) {\n\t if (msg) {\n\t msg.textContent = __anT('invalidEmail');\n\t msg.classList.add('show', 'error');\n }\n if (input && typeof input.focus === 'function') input.focus();\n }\n function movePendingSignupToLogin(message) {\n var email = getPendingSignupEmail();\n setActiveTab('login', { persist: true });\n var loginEmail = document.getElementById('l-email');\n var loginPassword = document.getElementById('l-pass');\n var msg = document.getElementById('l-msg');\n if (loginEmail && email) loginEmail.value = email;\n if (msg) {\n msg.textContent = message || __anT('signInToContinue');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n setTimeout(function() { if (loginPassword) loginPassword.focus(); }, 0);\n }\n async function signInWithPendingSignup() {\n var email = getPendingSignupEmail();\n var password = getPendingSignupPassword();\n if (!email || !password) {\n return { ok: false, needsManualSignIn: true };\n }\n var res = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, password: password }),\n });\n if (res.ok) {\n __anRedirectToSignedInApp();\n return { ok: true };\n }\n var data = await res.json().catch(function() { return {}; });\n var error = (data && (data.error || data.message)) || __anT('finishSignInFailed');\n return {\n ok: false,\n error: error,\n isWaitingForVerification: /not verified|verification/i.test(error),\n };\n }\n async function checkVerificationSession(fallbackText, opts) {\n opts = opts || {};\n if (verificationCheckInFlight) return;\n verificationCheckInFlight = true;\n var msg = getVerificationMessageNode();\n var continueBtn = document.getElementById('verify-continue');\n if (continueBtn && !opts.silent) {\n continueBtn.disabled = true;\n continueBtn.textContent = __anT('checking');\n }\n if (msg && !opts.silent) {\n msg.textContent = __anT('checkingVerification');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n try {\n var res = await fetch(__anPath('/_agent-native/auth/session'), {\n headers: { 'Accept': 'application/json' },\n });\n var data = await res.json().catch(function() { return {}; });\n if (res.ok && data && data.email && !data.error) {\n __anRedirectToSignedInApp();\n return;\n }\n var loginResult = await signInWithPendingSignup();\n if (loginResult.ok) return;\n if (loginResult.needsManualSignIn) {\n if (!opts.silent) {\n movePendingSignupToLogin(fallbackText || __anT('enterPasswordAfterVerification'));\n }\n return;\n }\n if (loginResult.error && !loginResult.isWaitingForVerification) {\n if (!opts.silent) {\n movePendingSignupToLogin(__anT('finishSignInManually'));\n }\n return;\n }\n if (msg && !opts.silent) {\n msg.textContent = fallbackText || __anT('stillWaitingVerification');\n msg.classList.remove('success');\n msg.classList.add('show', 'error');\n }\n } catch (err) {\n if (msg && !opts.silent) {\n msg.textContent = __anT('checkVerificationFailed');\n msg.classList.remove('success');\n msg.classList.add('show', 'error');\n }\n } finally {\n verificationCheckInFlight = false;\n if (continueBtn && !opts.silent) {\n continueBtn.disabled = false;\n continueBtn.textContent = __anT('continue');\n }\n }\n }\n\t function maybeCompleteVerificationAfterReturn() {\n\t if (!isVerificationStepActive()) return;\n\t checkVerificationSession(null, { silent: true });\n\t }\n\t function updateResendVerificationCooldown() {\n\t var btn = document.getElementById('resend-verification');\n\t if (!btn) return;\n\t var remaining = Math.ceil((resendVerificationCooldownUntil - Date.now()) / 1000);\n\t if (remaining > 0) {\n\t btn.disabled = true;\n\t btn.textContent = __anT('resendEmail') + ' (' + remaining + 's)';\n\t return;\n\t }\n\t if (resendVerificationCooldownTimer) {\n\t clearInterval(resendVerificationCooldownTimer);\n\t resendVerificationCooldownTimer = null;\n\t }\n\t resendVerificationCooldownUntil = 0;\n\t btn.disabled = false;\n\t btn.textContent = __anT('resendEmail');\n\t }\n\t function startResendVerificationCooldown(seconds) {\n\t resendVerificationCooldownUntil = Date.now() + seconds * 1000;\n\t updateResendVerificationCooldown();\n\t if (resendVerificationCooldownTimer) clearInterval(resendVerificationCooldownTimer);\n\t resendVerificationCooldownTimer = setInterval(updateResendVerificationCooldown, 1000);\n\t }\n\t async function resendVerificationEmail() {\n\t var btn = document.getElementById('resend-verification');\n\t var msg = document.getElementById('verify-msg');\n\t var email = pendingSignupEmail || document.getElementById('s-email').value;\n\t if (!email) return;\n\t if (resendVerificationCooldownUntil > Date.now()) {\n\t updateResendVerificationCooldown();\n\t return;\n\t }\n\t var original = btn ? btn.textContent : '';\n\t if (btn) {\n\t btn.disabled = true;\n\t btn.textContent = __anT('sending');\n }\n if (msg) msg.classList.remove('show', 'error', 'success');\n try {\n var res = await fetch(__anPath('/_agent-native/auth/ba/send-verification-email'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, callbackURL: __anGetReturnPath() }),\n });\n if (res.ok) {\n\t if (msg) {\n\t msg.textContent = __anT('sentVerification');\n\t msg.classList.add('show', 'success');\n\t }\n\t startResendVerificationCooldown(RESEND_VERIFICATION_COOLDOWN_SECONDS);\n\t return;\n\t }\n\t var data = await res.json().catch(function() { return {}; });\n\t if (msg) {\n msg.textContent = (data && (data.message || data.error)) || __anT('resendVerificationFailed');\n msg.classList.add('show', 'error');\n }\n if (btn) {\n btn.disabled = false;\n btn.textContent = original;\n }\n } catch (err) {\n if (msg) {\n msg.textContent = __anT('networkErrorRetry');\n msg.classList.add('show', 'error');\n }\n if (btn) {\n btn.disabled = false;\n btn.textContent = original;\n }\n }\n }\n (function initActiveTab() {\n var initial = 'signup';\n try {\n var params = new URLSearchParams(location.search);\n var qp = params.get('tab');\n var path = location.pathname;\n while (path.length > 1 && path.charAt(path.length - 1) === '/') path = path.slice(0, -1);\n if (qp === 'login' || qp === 'signup') {\n initial = qp;\n\t } else if (__anIsVerifiedRedirectSuccess()) {\n\t initial = 'login';\n\t } else if (path === '/login' || path.endsWith('/login')) {\n initial = 'login';\n } else if (path === '/signup' || path.endsWith('/signup')) {\n initial = 'signup';\n } else {\n var stored = localStorage.getItem(TAB_STORAGE_KEY);\n if (stored === 'login' || stored === 'signup') initial = stored;\n }\n } catch (e) {}\n setActiveTab(initial, { persist: false });\n\t try {\n\t if (__anIsVerifiedRedirectSuccess()) {\n\t var msg = document.getElementById('l-msg');\n if (msg) {\n msg.textContent = __anT('emailVerifiedFinishing');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n checkVerificationSession(__anT('emailVerifiedSignIn'));\n }\n } catch (e) {}\n })();\n tabs.forEach(function(t) { t.addEventListener('click', function() {\n setActiveTab(t.dataset.tab, { persist: true });\n }); });\n\n document.getElementById('signup-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var form = e.currentTarget;\n var btn = form.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('s-msg');\n msg.classList.remove('show', 'error', 'success');\n var pass = document.getElementById('s-pass').value;\n var pass2 = document.getElementById('s-pass2').value;\n if (pass !== pass2) {\n msg.textContent = __anT('passwordsMismatch');\n msg.classList.add('show', 'error');\n return;\n }\n var originalLabel = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('creatingAccount');\n try {\n var emailInput = document.getElementById('s-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = originalLabel;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/register'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email: email,\n password: pass,\n callbackURL: __anGetReturnPath(),\n }),\n });\n var data = await res.json().catch(function() { return {}; });\n if (res.ok) {\n // If email verification is required, the server won't return a session.\n // Try logging in — if it fails (unverified), show a \"check your email\" message.\n var loginRes = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, password: pass }),\n });\n if (loginRes.ok) {\n msg.textContent = __anT('accountCreatedSigningIn');\n msg.classList.add('show', 'success');\n __anRedirectToSignedInApp();\n return;\n }\n btn.disabled = false;\n btn.textContent = originalLabel;\n showVerificationStep(email, pass);\n return;\n }\n msg.textContent = data.error || __anT('registrationFailed');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = originalLabel;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = originalLabel;\n }\n });\n\n var verifyContinue = document.getElementById('verify-continue');\n if (verifyContinue) verifyContinue.addEventListener('click', function(e) {\n e.preventDefault();\n checkVerificationSession();\n });\n window.addEventListener('focus', maybeCompleteVerificationAfterReturn);\n document.addEventListener('visibilitychange', function() {\n if (document.visibilityState === 'visible') maybeCompleteVerificationAfterReturn();\n });\n var resendBtn = document.getElementById('resend-verification');\n if (resendBtn) resendBtn.addEventListener('click', function(e) {\n e.preventDefault();\n resendVerificationEmail();\n });\n var backToSignup = document.getElementById('back-to-signup');\n if (backToSignup) backToSignup.addEventListener('click', function(e) {\n e.preventDefault();\n setActiveTab('signup', { persist: true });\n var email = document.getElementById('s-email');\n setTimeout(function() { if (email) email.focus(); }, 0);\n });\n\n var forgotLink = document.getElementById('forgot-link');\n var backToLogin = document.getElementById('back-to-login');\n if (forgotLink) forgotLink.addEventListener('click', function(e) {\n e.preventDefault();\n document.getElementById('login-form').classList.remove('active');\n document.getElementById('forgot-form').classList.add('active');\n __anSetAuthView('forgot');\n var fEmail = document.getElementById('f-email');\n var lEmail = document.getElementById('l-email');\n if (lEmail && lEmail.value) fEmail.value = lEmail.value;\n setTimeout(function() { fEmail.focus(); }, 0);\n });\n if (backToLogin) backToLogin.addEventListener('click', function(e) {\n e.preventDefault();\n document.getElementById('forgot-form').classList.remove('active');\n document.getElementById('login-form').classList.add('active');\n __anSetAuthView('login');\n });\n\n var forgotForm = document.getElementById('forgot-form');\n if (forgotForm) forgotForm.addEventListener('submit', async function(e) {\n e.preventDefault();\n var btn = e.currentTarget.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('f-msg');\n msg.classList.remove('show', 'error', 'success');\n var original = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('sending');\n try {\n var emailInput = document.getElementById('f-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = original;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/ba/request-password-reset'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email }),\n });\n if (res.ok) {\n msg.textContent = __anT('resetEmailSent');\n msg.classList.add('show', 'success');\n btn.textContent = __anT('sent');\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = (data && (data.message || data.error)) || __anT('resetEmailFailed');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n }\n });\n\n document.getElementById('login-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var form = e.currentTarget;\n var btn = form.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('l-msg');\n msg.classList.remove('show', 'success');\n msg.classList.add('error');\n var originalLabel = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('signingIn');\n try {\n var emailInput = document.getElementById('l-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = originalLabel;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email: email,\n password: document.getElementById('l-pass').value,\n }),\n });\n if (res.ok) {\n __anRedirectToSignedInApp();\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = data.error || __anT('invalidLogin');\n msg.classList.add('show');\n btn.disabled = false;\n btn.textContent = originalLabel;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show');\n btn.disabled = false;\n btn.textContent = originalLabel;\n }\n });\n`\n}\n${\n renderGoogleButton\n ? `\n async function signInWithGoogle() {\n if (__anShouldShowGoogleNotice()) {\n __anShowGoogleNotice();\n return;\n }\n return __anStartGoogleSignIn();\n }\n async function __anStartGoogleSignIn() {\n var btn = document.getElementById('google-btn');\n var err = document.getElementById('google-err');\n var ret = __anGetReturnPath();\n btn.disabled = true;\n __anGoogleSignInInFlight = true;\n __anBindGoogleRecover();\n err.classList.remove('show');\n if (__anResolveAuthFlow() === 'popup') {\n __anStartPopupOAuth(ret, btn, err);\n return;\n }\n if (__anIsAgentNativeDesktop()) {\n __anStartNativeDesktopOAuth(ret, btn, err);\n return;\n }\n if (__anIsBuilderPreview()) {\n var flowId = __anNewOAuthFlowId();\n __anStartRedirectOAuth(ret, btn, err, flowId, 'Opening Google sign-in redirect from Builder preview');\n return;\n }\n try {\n var authUrl = __anGoogleAuthUrlPath() + '?return=' + encodeURIComponent(ret);\n var res = await fetch(authUrl);\n var data = await res.json();\n if (data.url) {\n __anOpenOAuthUrl(data.url);\n } else {\n err.textContent = data.message || __anT('googleNotConfigured');\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n } catch (e) {\n err.textContent = __anT('failedToConnect');\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n }`\n : \"\"\n}\n${\n googleSignInNotice\n ? `\n window.__anGoogleNoticeAccepted = false;\n function __anShouldShowGoogleNotice() {\n var notice = document.getElementById('google-preflight');\n if (!notice || window.__anGoogleNoticeAccepted) return false;\n var host = notice.getAttribute('data-host');\n return !host || window.location.hostname === host;\n }\n function __anSetGoogleNoticeOpen(open) {\n var notice = document.getElementById('google-preflight');\n var trigger = document.getElementById('google-btn');\n if (!notice) return;\n if (open) {\n notice.classList.add('show');\n if (trigger) trigger.setAttribute('aria-expanded', 'true');\n } else {\n notice.classList.remove('show');\n if (trigger) trigger.setAttribute('aria-expanded', 'false');\n }\n }\n function __anShowGoogleNotice() {\n var notice = document.getElementById('google-preflight');\n if (!notice) return;\n __anSetGoogleNoticeOpen(true);\n var continueBtn = document.getElementById('google-preflight-continue');\n if (continueBtn) continueBtn.focus();\n }\n function __anHideGoogleNotice() {\n __anSetGoogleNoticeOpen(false);\n }\n function __anChooseRunLocalFromGoogleNotice() {\n var panel = document.getElementById('google-preflight-run-local-panel');\n if (!panel) {\n __anHideGoogleNotice();\n return;\n }\n panel.removeAttribute('hidden');\n var copy = document.getElementById('copy-google-preflight-run-local');\n if (copy) copy.focus();\n }\n function __anAcceptGoogleNotice() {\n window.__anGoogleNoticeAccepted = true;\n __anHideGoogleNotice();\n __anStartGoogleSignIn();\n }\n (function __anInstallGoogleNoticeDismissal() {\n document.addEventListener('keydown', function(event) {\n if (event.key === 'Escape') __anHideGoogleNotice();\n });\n document.addEventListener('click', function(event) {\n var notice = document.getElementById('google-preflight');\n if (!notice || !notice.classList.contains('show')) return;\n var wrapper = document.getElementById('google-signin');\n if (wrapper && wrapper.contains(event.target)) return;\n __anHideGoogleNotice();\n });\n })();`\n : `\n function __anShouldShowGoogleNotice() { return false; }`\n}\n${starfieldScript}\n${\n runLocalCommand || signupLocalModeNote\n ? `\n function __anSetRunLocalCommandOpen(open) {\n var panel = document.getElementById('run-local-panel');\n var button = document.getElementById('run-local-button');\n if (!panel || !button) return;\n if (open) {\n panel.removeAttribute('hidden');\n } else {\n panel.setAttribute('hidden', '');\n }\n button.setAttribute('aria-expanded', String(open));\n }\n function __anToggleRunLocalCommand() {\n var panel = document.getElementById('run-local-panel');\n if (!panel) return;\n __anSetRunLocalCommandOpen(panel.hasAttribute('hidden'));\n }\n function __anCopyCommandFromPanel(panelId, buttonId) {\n var panel = document.getElementById(panelId);\n var button = document.getElementById(buttonId);\n if (!panel || !button) return;\n var command = panel.getAttribute('data-command') || '';\n var original = button.textContent || __anT('copyCommand');\n function markCopied() {\n button.textContent = __anT('copied');\n setTimeout(function() { button.textContent = original; }, 1600);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(command).then(markCopied).catch(function() {});\n }\n }\n function __anCopyRunLocalCommand() {\n __anCopyCommandFromPanel('run-local-panel', 'copy-run-local');\n }\n function __anCopySignupLocalModeCommand() {\n __anCopyCommandFromPanel('signup-local-mode-note', 'copy-signup-local-mode');\n }\n function __anCopyGoogleNoticeRunLocalCommand() {\n __anCopyCommandFromPanel('google-preflight-run-local-panel', 'copy-google-preflight-run-local');\n }`\n : \"\"\n}\n</script>\n</body>\n</html>`;\n}\n\n/** @deprecated Use getOnboardingHtml() instead */\nexport const ONBOARDING_HTML = getOnboardingHtml();\n\n/**\n * HTML for the password reset page — shown when the user clicks the link in\n * their reset email. Posts `{ newPassword, token }` to Better Auth's\n * `/reset-password` endpoint, then redirects to the login page.\n */\nexport function getResetPasswordHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>Reset password</title>\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"${withAppBasePath(\"/favicon.svg\")}\">\n<link rel=\"apple-touch-icon\" href=\"${withAppBasePath(\"/icon-180.svg\")}\">\n<style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 1rem; }\n .card { width: 100%; max-width: 400px; padding: 2rem; background: #141414; border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; color: #fff; }\n .subtitle { font-size: 0.8125rem; color: #888; margin-bottom: 1.5rem; }\n label { display: block; font-size: 0.8125rem; color: #888; margin-bottom: 0.375rem; }\n input { width: 100%; padding: 0.5rem 0.75rem; background: transparent; border: 1px solid rgba(255,255,255,0.12); border-radius: 6px; color: #e5e5e5; font-size: 0.875rem; outline: none; margin-bottom: 0.875rem; }\n input:focus { border-color: rgba(255,255,255,0.3); box-shadow: 0 0 0 1px rgba(255,255,255,0.1); }\n input::placeholder { color: #555; }\n button[type=\"submit\"] { width: 100%; margin-top: 0.25rem; padding: 0.5rem; background: #fff; color: #000; border: none; border-radius: 6px; font-size: 0.875rem; font-weight: 500; cursor: pointer; }\n button[type=\"submit\"]:hover { background: #e5e5e5; }\n button[type=\"submit\"]:disabled { opacity: 0.5; cursor: not-allowed; }\n .msg { margin-top: 0.75rem; font-size: 0.8125rem; display: none; }\n .msg.error { color: #f87171; }\n .msg.success { color: #33C4FF; }\n .msg.show { display: block; }\n .back { display: inline-block; margin-top: 1rem; font-size: 0.75rem; color: #888; text-decoration: none; }\n .back:hover { color: #bbb; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Choose a new password</h1>\n <p class=\"subtitle\">Set a new password for your account.</p>\n <form id=\"reset-form\">\n <label for=\"p1\">New password</label>\n <input id=\"p1\" type=\"password\" autocomplete=\"new-password\" autofocus placeholder=\"At least 8 characters\" required minlength=\"8\" />\n <label for=\"p2\">Confirm password</label>\n <input id=\"p2\" type=\"password\" autocomplete=\"new-password\" placeholder=\"Confirm password\" required minlength=\"8\" />\n <button type=\"submit\">Save new password</button>\n <p class=\"msg\" id=\"msg\"></p>\n </form>\n <a class=\"back\" id=\"back-link\" href=\"/\">Back to sign in</a>\n</div>\n<script>\n (function() {\n // Derive the app's base path so apps mounted under a prefix\n // (e.g. /mail, /calendar) get sent home instead of to the root domain.\n var RESET_PATH = '/_agent-native/auth/reset';\n var pathname = window.location.pathname;\n var idx = pathname.indexOf(RESET_PATH);\n var basePath = (idx >= 0 ? pathname.slice(0, idx) : '') || '';\n var homeHref = basePath + '/';\n var backLink = document.getElementById('back-link');\n if (backLink) backLink.setAttribute('href', homeHref);\n var params = new URLSearchParams(location.search);\n var token = params.get('token') || '';\n var msg = document.getElementById('msg');\n if (!token) {\n msg.textContent = 'Missing or invalid reset token. Request a new reset link.';\n msg.classList.add('show', 'error');\n document.getElementById('reset-form').style.display = 'none';\n return;\n }\n document.getElementById('reset-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var btn = e.currentTarget.querySelector('button[type=\"submit\"]');\n var p1 = document.getElementById('p1').value;\n var p2 = document.getElementById('p2').value;\n msg.classList.remove('show', 'error', 'success');\n if (p1 !== p2) {\n msg.textContent = 'Passwords do not match';\n msg.classList.add('show', 'error');\n return;\n }\n var original = btn.textContent;\n btn.disabled = true;\n btn.textContent = 'Saving…';\n try {\n var res = await fetch(basePath + '/_agent-native/auth/ba/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ newPassword: p1, token: token }),\n });\n if (res.ok) {\n msg.textContent = 'Password updated — redirecting to sign in…';\n msg.classList.add('show', 'success');\n setTimeout(function() { window.location.href = homeHref; }, 1200);\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = (data && (data.message || data.error)) || 'Reset failed. The link may have expired — request a new one.';\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n } catch (err) {\n msg.textContent = 'Network error — please try again';\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n }\n });\n })();\n</script>\n</body>\n</html>`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-run onboarding page for agent-native apps.\n *\n * Shown when Better Auth is active and the user isn't signed in.\n * Provides a path to create or sign into an account from day one.\n *\n * After first account exists, this page acts as a normal login page.\n */\n\nimport { getLocaleInitScript } from \"../localization/server.js\";\nimport {\n DEFAULT_LOCALE,\n LOCALE_METADATA,\n LOCALE_STORAGE_KEY,\n SUPPORTED_LOCALES,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { signInJourneyInlineScript } from \"../shared/sign-in-journey.js\";\nimport {\n AGENT_NATIVE_SOCIAL_IMAGE_ALT,\n AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT,\n AGENT_NATIVE_SOCIAL_IMAGE_PATH,\n AGENT_NATIVE_SOCIAL_IMAGE_TYPE,\n AGENT_NATIVE_SOCIAL_IMAGE_WIDTH,\n withAgentNativeSocialImageCacheBuster,\n} from \"../shared/social-meta.js\";\nimport { normalizeAppBasePath } from \"./app-base-path.js\";\nimport {\n BUILT_IN_AUTH_MARKETING,\n resolveBuiltInAuthMarketing,\n type AuthMarketingContent,\n} from \"./auth-marketing.js\";\nimport {\n resolveGoogleAuthMode,\n type GoogleAuthMode,\n} from \"./google-auth-mode.js\";\nimport { hasGoogleSignInCredentials } from \"./google-oauth-credentials.js\";\nimport { identitySsoLoginButtonHtml } from \"./identity-sso-store.js\";\nimport { getPublicOAuthOrigin } from \"./oauth-public-origin.js\";\nimport { getWorkspaceGatewayReturnOrigin } from \"./oauth-return-url.js\";\n\nfunction hasGoogleOAuth(): boolean {\n return hasGoogleSignInCredentials();\n}\n\nfunction getConnectionLabel(): string {\n const url = process.env.DATABASE_URL || \"\";\n if (!url) return \"SQLite (local file)\";\n if (url.startsWith(\"pglite:\")) return \"PGlite (local Postgres)\";\n if (url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\")) {\n if (url.includes(\"neon.tech\")) return \"Neon Postgres\";\n if (url.includes(\"supabase\")) return \"Supabase Postgres\";\n return \"Postgres\";\n }\n if (url.startsWith(\"file:\")) return \"SQLite (local file)\";\n if (url.startsWith(\"libsql://\") || url.includes(\"turso.io\")) return \"Turso\";\n return \"SQL database\";\n}\n\nfunction withAppBasePath(path: string): string {\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n const basePath = normalizeAppBasePath(\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH,\n );\n return `${basePath}${cleanPath}`;\n}\n\nconst AGENT_NATIVE_TERMS_URL = \"https://www.agent-native.com/terms\";\nconst AGENT_NATIVE_PRIVACY_URL = \"https://www.agent-native.com/privacy\";\n\nconst EN_AUTH_COPY = {\n languageLabel: \"Language\",\n systemLanguage: \"System\",\n pageTitleSignIn: \"Sign in\",\n pageTitleWelcome: \"Welcome\",\n welcomeTitle: \"Welcome\",\n signInTitle: \"Sign in\",\n welcomeBackTitle: \"Welcome back\",\n checkEmailTitle: \"Check your email\",\n resetPasswordTitle: \"Reset password\",\n createAccountSubtitle: \"Create an account to get started\",\n googleOnlySubtitle: \"Use your workspace Google account to continue\",\n signInSubtitle: \"Sign in to your account\",\n finishAccountSubtitle: \"Finish creating your account\",\n resetPasswordSubtitle: \"Reset your password\",\n upgradeCopy:\n \"Continue signing in to attach this app to your account and migrate local data.\",\n googleButton: \"Sign in with Google\",\n dividerOr: \"or\",\n createAccount: \"Create account\",\n signIn: \"Sign in\",\n email: \"Email\",\n password: \"Password\",\n confirmPassword: \"Confirm password\",\n passwordMinPlaceholder: \"At least 8 characters\",\n confirmPasswordPlaceholder: \"Confirm password\",\n enterPasswordPlaceholder: \"Enter password\",\n signupProgress: \"Signup progress\",\n progressAccount: \"Account\",\n progressVerify: \"Verify\",\n progressStart: \"Start\",\n verificationSent: \"Verification email sent\",\n verifyCopyPrefix: \"We sent a secure link to\",\n verifyCopySuffix:\n \". Click it, return here, and this app will finish signing you in automatically.\",\n verificationNote:\n \"You can keep this tab open. If it has not refreshed after you come back, use Continue.\",\n continue: \"Continue\",\n resendEmail: \"Resend email\",\n back: \"Back\",\n forgotPassword: \"Forgot password?\",\n sendResetLink: \"Send reset link\",\n backToSignIn: \"Back to sign in\",\n localNotePrefix: \"Your account is stored in this app's own DB\",\n localNoteSuffix: \", not a third-party service.\",\n runLocally: \"Run Locally\",\n runLocallySentence: \"Run locally\",\n openSource: \"100% free and open source\",\n useOwnGoogleClient: \"Use your own Google OAuth client:\",\n copyCommand: \"Copy command\",\n copied: \"Copied\",\n close: \"Close\",\n closeGoogleChoices: \"Close Google sign-in choices\",\n legalPrefix: \"By signing up, you accept our\",\n legalTerms: \"Terms\",\n legalConnector: \"and\",\n legalPrivacy: \"Privacy Policy\",\n legalSuffix: \".\",\n invalidEmail: \"Enter a valid email address, like you@example.com.\",\n signInToContinue: \"Sign in to continue.\",\n finishSignInFailed: \"Could not finish sign-in automatically.\",\n enterPasswordAfterVerification:\n \"Enter your password after verifying your email.\",\n finishSignInManually:\n \"We could not finish sign-in automatically. Sign in to continue.\",\n stillWaitingVerification:\n \"Still waiting on verification. Click the link in your email, then try Continue again.\",\n checkVerificationFailed: \"Could not check verification. Please try again.\",\n checking: \"Checking...\",\n checkingVerification: \"Checking your verification...\",\n sending: \"Sending...\",\n sent: \"Sent\",\n sentVerification: \"Sent a fresh verification link.\",\n resendVerificationFailed: \"Could not resend the verification email.\",\n networkErrorRetry: \"Network error. Please try again.\",\n networkErrorDashRetry: \"Network error — please try again\",\n passwordsMismatch: \"Passwords do not match\",\n creatingAccount: \"Creating account…\",\n registrationFailed: \"Registration failed\",\n accountCreatedSigningIn: \"Account created — signing you in…\",\n emailVerifiedFinishing: \"Email verified. Finishing sign-in...\",\n emailVerifiedSignIn: \"Email verified. Sign in to continue.\",\n resetEmailSent: \"If that email exists, a reset link is on its way.\",\n resetEmailFailed: \"Could not send reset email.\",\n signingIn: \"Signing in…\",\n invalidLogin: \"Invalid email or password\",\n googleNotConfigured: \"Google OAuth is not configured.\",\n failedToConnect: \"Failed to connect. Please try again.\",\n migrateLocalFallback: \"Continue signing in to migrate local data.\",\n googlePopupHelp: \"Allow popups for this site and try again\",\n googleNeverFinished:\n \"Google sign-in did not finish. Check the Google OAuth redirect URI and server logs for [agent-native][google-oauth].\",\n};\n\nconst AUTH_LOCALE_COPY: Record<LocaleCode, typeof EN_AUTH_COPY> = {\n \"en-US\": EN_AUTH_COPY,\n \"zh-CN\": {\n languageLabel: \"语言\",\n systemLanguage: \"系统\",\n pageTitleSignIn: \"登录\",\n pageTitleWelcome: \"欢迎\",\n welcomeTitle: \"欢迎\",\n signInTitle: \"登录\",\n welcomeBackTitle: \"欢迎回来\",\n checkEmailTitle: \"检查你的邮箱\",\n resetPasswordTitle: \"重置密码\",\n createAccountSubtitle: \"创建账户即可开始\",\n googleOnlySubtitle: \"使用你的工作区 Google 账户继续\",\n signInSubtitle: \"登录你的账户\",\n finishAccountSubtitle: \"完成账户创建\",\n resetPasswordSubtitle: \"重置你的密码\",\n upgradeCopy: \"继续登录,将此应用关联到你的账户并迁移本地数据。\",\n googleButton: \"使用 Google 登录\",\n dividerOr: \"或\",\n createAccount: \"创建账户\",\n signIn: \"登录\",\n email: \"电子邮箱\",\n password: \"密码\",\n confirmPassword: \"确认密码\",\n passwordMinPlaceholder: \"至少 8 个字符\",\n confirmPasswordPlaceholder: \"确认密码\",\n enterPasswordPlaceholder: \"输入密码\",\n signupProgress: \"注册进度\",\n progressAccount: \"账户\",\n progressVerify: \"验证\",\n progressStart: \"开始\",\n verificationSent: \"验证邮件已发送\",\n verifyCopyPrefix: \"我们已向\",\n verifyCopySuffix: \"发送安全链接。点击链接后回到这里,应用会自动完成登录。\",\n verificationNote:\n \"你可以保持此标签页打开。如果回来后没有自动刷新,请点击继续。\",\n continue: \"继续\",\n resendEmail: \"重新发送邮件\",\n back: \"返回\",\n forgotPassword: \"忘记密码?\",\n sendResetLink: \"发送重置链接\",\n backToSignIn: \"返回登录\",\n localNotePrefix: \"你的账户存储在此应用自己的数据库中\",\n localNoteSuffix: \",而不是第三方服务。\",\n runLocally: \"本地运行\",\n runLocallySentence: \"本地运行\",\n openSource: \"100% 免费且开源\",\n useOwnGoogleClient: \"使用你自己的 Google OAuth 客户端:\",\n copyCommand: \"复制命令\",\n copied: \"已复制\",\n close: \"关闭\",\n closeGoogleChoices: \"关闭 Google 登录选项\",\n legalPrefix: \"注册即表示你接受我们的\",\n legalTerms: \"条款\",\n legalConnector: \"和\",\n legalPrivacy: \"隐私政策\",\n legalSuffix: \"。\",\n invalidEmail: \"请输入有效邮箱地址,例如 you@example.com。\",\n signInToContinue: \"登录以继续。\",\n finishSignInFailed: \"无法自动完成登录。\",\n enterPasswordAfterVerification: \"验证邮箱后请输入密码。\",\n finishSignInManually: \"无法自动完成登录。请登录以继续。\",\n stillWaitingVerification:\n \"仍在等待验证。请点击邮件中的链接,然后再次点击继续。\",\n checkVerificationFailed: \"无法检查验证状态。请重试。\",\n checking: \"正在检查...\",\n checkingVerification: \"正在检查验证状态...\",\n sending: \"正在发送...\",\n sent: \"已发送\",\n sentVerification: \"新的验证链接已发送。\",\n resendVerificationFailed: \"无法重新发送验证邮件。\",\n networkErrorRetry: \"网络错误。请重试。\",\n networkErrorDashRetry: \"网络错误 — 请重试\",\n passwordsMismatch: \"两次输入的密码不一致\",\n creatingAccount: \"正在创建账户…\",\n registrationFailed: \"注册失败\",\n accountCreatedSigningIn: \"账户已创建 — 正在登录…\",\n emailVerifiedFinishing: \"邮箱已验证。正在完成登录...\",\n emailVerifiedSignIn: \"邮箱已验证。请登录以继续。\",\n resetEmailSent: \"如果该邮箱存在,重置链接已在发送途中。\",\n resetEmailFailed: \"无法发送重置邮件。\",\n signingIn: \"正在登录…\",\n invalidLogin: \"邮箱或密码无效\",\n googleNotConfigured: \"Google OAuth 未配置。\",\n failedToConnect: \"连接失败。请重试。\",\n migrateLocalFallback: \"继续登录以迁移本地数据。\",\n googlePopupHelp: \"请允许此网站弹出窗口后重试\",\n googleNeverFinished:\n \"Google 登录未完成。请检查 Google OAuth 重定向 URI 和服务器日志中的 [agent-native][google-oauth]。\",\n },\n \"zh-TW\": {\n languageLabel: \"語言\",\n systemLanguage: \"系統\",\n pageTitleSignIn: \"登入\",\n pageTitleWelcome: \"歡迎\",\n welcomeTitle: \"歡迎\",\n signInTitle: \"登入\",\n welcomeBackTitle: \"歡迎回來\",\n checkEmailTitle: \"檢查你的電子郵件\",\n resetPasswordTitle: \"重設密碼\",\n createAccountSubtitle: \"建立帳號即可開始\",\n googleOnlySubtitle: \"使用你的工作區 Google 帳號繼續\",\n signInSubtitle: \"登入你的帳號\",\n finishAccountSubtitle: \"完成帳號建立\",\n resetPasswordSubtitle: \"重設你的密碼\",\n upgradeCopy: \"繼續登入,將此應用程式連結到你的帳號並遷移本機資料。\",\n googleButton: \"使用 Google 登入\",\n dividerOr: \"或\",\n createAccount: \"建立帳號\",\n signIn: \"登入\",\n email: \"電子郵件\",\n password: \"密碼\",\n confirmPassword: \"確認密碼\",\n passwordMinPlaceholder: \"至少 8 個字元\",\n confirmPasswordPlaceholder: \"確認密碼\",\n enterPasswordPlaceholder: \"輸入密碼\",\n signupProgress: \"註冊進度\",\n progressAccount: \"帳號\",\n progressVerify: \"驗證\",\n progressStart: \"開始\",\n verificationSent: \"驗證郵件已送出\",\n verifyCopyPrefix: \"我們已將安全連結寄到\",\n verifyCopySuffix: \"。點擊連結後回到這裡,應用程式會自動完成登入。\",\n verificationNote:\n \"你可以保持此分頁開啟。如果回來後沒有自動重新整理,請點擊繼續。\",\n continue: \"繼續\",\n resendEmail: \"重新寄送郵件\",\n back: \"返回\",\n forgotPassword: \"忘記密碼?\",\n sendResetLink: \"寄送重設連結\",\n backToSignIn: \"返回登入\",\n localNotePrefix: \"你的帳號儲存在此應用程式自己的資料庫中\",\n localNoteSuffix: \",而不是第三方服務。\",\n runLocally: \"在本機執行\",\n runLocallySentence: \"在本機執行\",\n openSource: \"100% 免費且開源\",\n useOwnGoogleClient: \"使用你自己的 Google OAuth 用戶端:\",\n copyCommand: \"複製指令\",\n copied: \"已複製\",\n close: \"關閉\",\n closeGoogleChoices: \"關閉 Google 登入選項\",\n legalPrefix: \"註冊即表示你接受我們的\",\n legalTerms: \"條款\",\n legalConnector: \"和\",\n legalPrivacy: \"隱私權政策\",\n legalSuffix: \"。\",\n invalidEmail: \"請輸入有效的電子郵件地址,例如 you@example.com。\",\n signInToContinue: \"登入以繼續。\",\n finishSignInFailed: \"無法自動完成登入。\",\n enterPasswordAfterVerification: \"驗證電子郵件後請輸入密碼。\",\n finishSignInManually: \"無法自動完成登入。請登入以繼續。\",\n stillWaitingVerification:\n \"仍在等待驗證。請點擊郵件中的連結,然後再次點擊繼續。\",\n checkVerificationFailed: \"無法檢查驗證狀態。請重試。\",\n checking: \"正在檢查...\",\n checkingVerification: \"正在檢查驗證狀態...\",\n sending: \"正在寄送...\",\n sent: \"已送出\",\n sentVerification: \"新的驗證連結已送出。\",\n resendVerificationFailed: \"無法重新寄送驗證郵件。\",\n networkErrorRetry: \"網路錯誤。請重試。\",\n networkErrorDashRetry: \"網路錯誤 - 請重試\",\n passwordsMismatch: \"兩次輸入的密碼不一致\",\n creatingAccount: \"正在建立帳號...\",\n registrationFailed: \"註冊失敗\",\n accountCreatedSigningIn: \"帳號已建立,正在登入...\",\n emailVerifiedFinishing: \"電子郵件已驗證。正在完成登入...\",\n emailVerifiedSignIn: \"電子郵件已驗證。請登入以繼續。\",\n resetEmailSent: \"如果該電子郵件存在,重設連結已在寄送途中。\",\n resetEmailFailed: \"無法寄送重設郵件。\",\n signingIn: \"正在登入...\",\n invalidLogin: \"電子郵件或密碼無效\",\n googleNotConfigured: \"Google OAuth 尚未設定。\",\n failedToConnect: \"連線失敗。請重試。\",\n migrateLocalFallback: \"繼續登入以遷移本機資料。\",\n googlePopupHelp: \"請允許此網站開啟彈出式視窗後重試\",\n googleNeverFinished:\n \"Google 登入未完成。請檢查 Google OAuth 重新導向 URI,以及伺服器記錄中的 [agent-native][google-oauth]。\",\n },\n \"es-ES\": {\n languageLabel: \"Idioma\",\n systemLanguage: \"Sistema\",\n pageTitleSignIn: \"Iniciar sesión\",\n pageTitleWelcome: \"Bienvenido\",\n welcomeTitle: \"Bienvenido\",\n signInTitle: \"Iniciar sesión\",\n welcomeBackTitle: \"Bienvenido de nuevo\",\n checkEmailTitle: \"Revisa tu email\",\n resetPasswordTitle: \"Restablecer contraseña\",\n createAccountSubtitle: \"Crea una cuenta para empezar\",\n googleOnlySubtitle: \"Usa tu cuenta de Google del espacio de trabajo\",\n signInSubtitle: \"Inicia sesión en tu cuenta\",\n finishAccountSubtitle: \"Termina de crear tu cuenta\",\n resetPasswordSubtitle: \"Restablece tu contraseña\",\n upgradeCopy:\n \"Sigue iniciando sesión para conectar esta app a tu cuenta y migrar datos locales.\",\n googleButton: \"Iniciar sesión con Google\",\n dividerOr: \"o\",\n createAccount: \"Crear cuenta\",\n signIn: \"Iniciar sesión\",\n email: \"Email\",\n password: \"Contraseña\",\n confirmPassword: \"Confirmar contraseña\",\n passwordMinPlaceholder: \"Al menos 8 caracteres\",\n confirmPasswordPlaceholder: \"Confirmar contraseña\",\n enterPasswordPlaceholder: \"Introduce la contraseña\",\n signupProgress: \"Progreso de registro\",\n progressAccount: \"Cuenta\",\n progressVerify: \"Verificar\",\n progressStart: \"Empezar\",\n verificationSent: \"Email de verificación enviado\",\n verifyCopyPrefix: \"Enviamos un enlace seguro a\",\n verifyCopySuffix:\n \". Haz clic en él, vuelve aquí y esta app terminará de iniciar sesión automáticamente.\",\n verificationNote:\n \"Puedes dejar esta pestaña abierta. Si no se actualiza al volver, usa Continuar.\",\n continue: \"Continuar\",\n resendEmail: \"Reenviar email\",\n back: \"Volver\",\n forgotPassword: \"¿Olvidaste tu contraseña?\",\n sendResetLink: \"Enviar enlace de restablecimiento\",\n backToSignIn: \"Volver a iniciar sesión\",\n localNotePrefix:\n \"Tu cuenta se almacena en la propia base de datos de esta app\",\n localNoteSuffix: \", no en un servicio de terceros.\",\n runLocally: \"Ejecutar localmente\",\n runLocallySentence: \"Ejecutar localmente\",\n openSource: \"100% gratis y de código abierto\",\n useOwnGoogleClient: \"Usa tu propio cliente de Google OAuth:\",\n copyCommand: \"Copiar comando\",\n copied: \"Copiado\",\n close: \"Cerrar\",\n closeGoogleChoices: \"Cerrar opciones de inicio con Google\",\n legalPrefix: \"Al registrarte, aceptas nuestros\",\n legalTerms: \"Términos\",\n legalConnector: \"y\",\n legalPrivacy: \"Política de privacidad\",\n legalSuffix: \".\",\n invalidEmail: \"Introduce un email válido, como you@example.com.\",\n signInToContinue: \"Inicia sesión para continuar.\",\n finishSignInFailed: \"No se pudo completar el inicio automáticamente.\",\n enterPasswordAfterVerification:\n \"Introduce tu contraseña después de verificar tu email.\",\n finishSignInManually:\n \"No se pudo completar el inicio automáticamente. Inicia sesión para continuar.\",\n stillWaitingVerification:\n \"Aún esperamos la verificación. Haz clic en el enlace del email y luego prueba Continuar de nuevo.\",\n checkVerificationFailed:\n \"No se pudo comprobar la verificación. Inténtalo de nuevo.\",\n checking: \"Comprobando...\",\n checkingVerification: \"Comprobando tu verificación...\",\n sending: \"Enviando...\",\n sent: \"Enviado\",\n sentVerification: \"Se envió un nuevo enlace de verificación.\",\n resendVerificationFailed: \"No se pudo reenviar el email de verificación.\",\n networkErrorRetry: \"Error de red. Inténtalo de nuevo.\",\n networkErrorDashRetry: \"Error de red — inténtalo de nuevo\",\n passwordsMismatch: \"Las contraseñas no coinciden\",\n creatingAccount: \"Creando cuenta…\",\n registrationFailed: \"Error al registrarse\",\n accountCreatedSigningIn: \"Cuenta creada — iniciando sesión…\",\n emailVerifiedFinishing: \"Email verificado. Terminando inicio de sesión...\",\n emailVerifiedSignIn: \"Email verificado. Inicia sesión para continuar.\",\n resetEmailSent:\n \"Si ese email existe, el enlace de restablecimiento está en camino.\",\n resetEmailFailed: \"No se pudo enviar el email de restablecimiento.\",\n signingIn: \"Iniciando sesión…\",\n invalidLogin: \"Email o contraseña no válidos\",\n googleNotConfigured: \"Google OAuth no está configurado.\",\n failedToConnect: \"No se pudo conectar. Inténtalo de nuevo.\",\n migrateLocalFallback: \"Sigue iniciando sesión para migrar datos locales.\",\n googlePopupHelp:\n \"Permite ventanas emergentes para este sitio e inténtalo de nuevo\",\n googleNeverFinished:\n \"El inicio de sesión con Google no terminó. Comprueba el URI de redirección de Google OAuth y los logs del servidor para [agent-native][google-oauth].\",\n },\n \"fr-FR\": {\n languageLabel: \"Langue\",\n systemLanguage: \"Système\",\n pageTitleSignIn: \"Connexion\",\n pageTitleWelcome: \"Bienvenue\",\n welcomeTitle: \"Bienvenue\",\n signInTitle: \"Connexion\",\n welcomeBackTitle: \"Bon retour\",\n checkEmailTitle: \"Vérifiez votre e-mail\",\n resetPasswordTitle: \"Réinitialiser le mot de passe\",\n createAccountSubtitle: \"Créez un compte pour commencer\",\n googleOnlySubtitle: \"Utilisez le compte Google de votre espace de travail\",\n signInSubtitle: \"Connectez-vous à votre compte\",\n finishAccountSubtitle: \"Terminez la création de votre compte\",\n resetPasswordSubtitle: \"Réinitialisez votre mot de passe\",\n upgradeCopy:\n \"Continuez la connexion pour associer cette app à votre compte et migrer les données locales.\",\n googleButton: \"Se connecter avec Google\",\n dividerOr: \"ou\",\n createAccount: \"Créer un compte\",\n signIn: \"Connexion\",\n email: \"E-mail\",\n password: \"Mot de passe\",\n confirmPassword: \"Confirmer le mot de passe\",\n passwordMinPlaceholder: \"Au moins 8 caractères\",\n confirmPasswordPlaceholder: \"Confirmer le mot de passe\",\n enterPasswordPlaceholder: \"Saisir le mot de passe\",\n signupProgress: \"Progression de l'inscription\",\n progressAccount: \"Compte\",\n progressVerify: \"Vérifier\",\n progressStart: \"Démarrer\",\n verificationSent: \"E-mail de vérification envoyé\",\n verifyCopyPrefix: \"Nous avons envoyé un lien sécurisé à\",\n verifyCopySuffix:\n \". Cliquez dessus, revenez ici, et cette app terminera automatiquement la connexion.\",\n verificationNote:\n \"Vous pouvez garder cet onglet ouvert. S'il ne s'actualise pas à votre retour, utilisez Continuer.\",\n continue: \"Continuer\",\n resendEmail: \"Renvoyer l'e-mail\",\n back: \"Retour\",\n forgotPassword: \"Mot de passe oublié ?\",\n sendResetLink: \"Envoyer le lien de réinitialisation\",\n backToSignIn: \"Retour à la connexion\",\n localNotePrefix:\n \"Votre compte est stocké dans la base de données propre à cette app\",\n localNoteSuffix: \", pas dans un service tiers.\",\n runLocally: \"Exécuter localement\",\n runLocallySentence: \"Exécuter localement\",\n openSource: \"100 % gratuit et open source\",\n useOwnGoogleClient: \"Utilisez votre propre client Google OAuth :\",\n copyCommand: \"Copier la commande\",\n copied: \"Copié\",\n close: \"Fermer\",\n closeGoogleChoices: \"Fermer les choix de connexion Google\",\n legalPrefix: \"En vous inscrivant, vous acceptez nos\",\n legalTerms: \"Conditions\",\n legalConnector: \"et\",\n legalPrivacy: \"Politique de confidentialité\",\n legalSuffix: \".\",\n invalidEmail: \"Saisissez une adresse e-mail valide, comme you@example.com.\",\n signInToContinue: \"Connectez-vous pour continuer.\",\n finishSignInFailed: \"Impossible de terminer la connexion automatiquement.\",\n enterPasswordAfterVerification:\n \"Saisissez votre mot de passe après avoir vérifié votre e-mail.\",\n finishSignInManually:\n \"Impossible de terminer la connexion automatiquement. Connectez-vous pour continuer.\",\n stillWaitingVerification:\n \"La vérification est toujours en attente. Cliquez sur le lien dans votre e-mail, puis réessayez Continuer.\",\n checkVerificationFailed:\n \"Impossible de vérifier l'état. Veuillez réessayer.\",\n checking: \"Vérification...\",\n checkingVerification: \"Vérification en cours...\",\n sending: \"Envoi...\",\n sent: \"Envoyé\",\n sentVerification: \"Nouveau lien de vérification envoyé.\",\n resendVerificationFailed:\n \"Impossible de renvoyer l'e-mail de vérification.\",\n networkErrorRetry: \"Erreur réseau. Veuillez réessayer.\",\n networkErrorDashRetry: \"Erreur réseau — veuillez réessayer\",\n passwordsMismatch: \"Les mots de passe ne correspondent pas\",\n creatingAccount: \"Création du compte…\",\n registrationFailed: \"Échec de l'inscription\",\n accountCreatedSigningIn: \"Compte créé — connexion en cours…\",\n emailVerifiedFinishing: \"E-mail vérifié. Connexion en cours...\",\n emailVerifiedSignIn: \"E-mail vérifié. Connectez-vous pour continuer.\",\n resetEmailSent:\n \"Si cet e-mail existe, un lien de réinitialisation est en route.\",\n resetEmailFailed: \"Impossible d'envoyer l'e-mail de réinitialisation.\",\n signingIn: \"Connexion…\",\n invalidLogin: \"E-mail ou mot de passe invalide\",\n googleNotConfigured: \"Google OAuth n'est pas configuré.\",\n failedToConnect: \"Connexion impossible. Veuillez réessayer.\",\n migrateLocalFallback:\n \"Continuez la connexion pour migrer les données locales.\",\n googlePopupHelp: \"Autorisez les fenêtres pop-up pour ce site et réessayez\",\n googleNeverFinished:\n \"La connexion Google n'a pas abouti. Vérifiez l'URI de redirection Google OAuth et les logs serveur pour [agent-native][google-oauth].\",\n },\n \"de-DE\": {\n languageLabel: \"Sprache\",\n systemLanguage: \"System\",\n pageTitleSignIn: \"Anmelden\",\n pageTitleWelcome: \"Willkommen\",\n welcomeTitle: \"Willkommen\",\n signInTitle: \"Anmelden\",\n welcomeBackTitle: \"Willkommen zurück\",\n checkEmailTitle: \"E-Mail prüfen\",\n resetPasswordTitle: \"Passwort zurücksetzen\",\n createAccountSubtitle: \"Erstelle ein Konto, um zu beginnen\",\n googleOnlySubtitle: \"Verwende dein Workspace-Google-Konto\",\n signInSubtitle: \"Melde dich bei deinem Konto an\",\n finishAccountSubtitle: \"Schließe die Kontoerstellung ab\",\n resetPasswordSubtitle: \"Setze dein Passwort zurück\",\n upgradeCopy:\n \"Melde dich weiter an, um diese App mit deinem Konto zu verbinden und lokale Daten zu migrieren.\",\n googleButton: \"Mit Google anmelden\",\n dividerOr: \"oder\",\n createAccount: \"Konto erstellen\",\n signIn: \"Anmelden\",\n email: \"E-Mail\",\n password: \"Passwort\",\n confirmPassword: \"Passwort bestätigen\",\n passwordMinPlaceholder: \"Mindestens 8 Zeichen\",\n confirmPasswordPlaceholder: \"Passwort bestätigen\",\n enterPasswordPlaceholder: \"Passwort eingeben\",\n signupProgress: \"Registrierungsfortschritt\",\n progressAccount: \"Konto\",\n progressVerify: \"Prüfen\",\n progressStart: \"Start\",\n verificationSent: \"Bestätigungs-E-Mail gesendet\",\n verifyCopyPrefix: \"Wir haben einen sicheren Link gesendet an\",\n verifyCopySuffix:\n \". Klicke darauf, kehre hierher zurück, und diese App meldet dich automatisch an.\",\n verificationNote:\n \"Du kannst diesen Tab geöffnet lassen. Wenn er nach deiner Rückkehr nicht aktualisiert wird, nutze Weiter.\",\n continue: \"Weiter\",\n resendEmail: \"E-Mail erneut senden\",\n back: \"Zurück\",\n forgotPassword: \"Passwort vergessen?\",\n sendResetLink: \"Reset-Link senden\",\n backToSignIn: \"Zurück zur Anmeldung\",\n localNotePrefix:\n \"Dein Konto wird in der eigenen Datenbank dieser App gespeichert\",\n localNoteSuffix: \", nicht bei einem Drittanbieter.\",\n runLocally: \"Lokal ausführen\",\n runLocallySentence: \"Lokal ausführen\",\n openSource: \"100 % kostenlos und Open Source\",\n useOwnGoogleClient: \"Eigenen Google-OAuth-Client verwenden:\",\n copyCommand: \"Befehl kopieren\",\n copied: \"Kopiert\",\n close: \"Schließen\",\n closeGoogleChoices: \"Google-Anmeldeoptionen schließen\",\n legalPrefix: \"Mit der Registrierung akzeptierst du unsere\",\n legalTerms: \"Bedingungen\",\n legalConnector: \"und\",\n legalPrivacy: \"Datenschutzrichtlinie\",\n legalSuffix: \".\",\n invalidEmail: \"Gib eine gültige E-Mail-Adresse ein, z. B. you@example.com.\",\n signInToContinue: \"Melde dich an, um fortzufahren.\",\n finishSignInFailed:\n \"Die Anmeldung konnte nicht automatisch abgeschlossen werden.\",\n enterPasswordAfterVerification:\n \"Gib dein Passwort ein, nachdem du deine E-Mail bestätigt hast.\",\n finishSignInManually:\n \"Die Anmeldung konnte nicht automatisch abgeschlossen werden. Melde dich an, um fortzufahren.\",\n stillWaitingVerification:\n \"Die Bestätigung steht noch aus. Klicke auf den Link in deiner E-Mail und versuche Weiter erneut.\",\n checkVerificationFailed:\n \"Bestätigung konnte nicht geprüft werden. Bitte erneut versuchen.\",\n checking: \"Prüfen...\",\n checkingVerification: \"Bestätigung wird geprüft...\",\n sending: \"Senden...\",\n sent: \"Gesendet\",\n sentVerification: \"Ein neuer Bestätigungslink wurde gesendet.\",\n resendVerificationFailed:\n \"Bestätigungs-E-Mail konnte nicht erneut gesendet werden.\",\n networkErrorRetry: \"Netzwerkfehler. Bitte erneut versuchen.\",\n networkErrorDashRetry: \"Netzwerkfehler — bitte erneut versuchen\",\n passwordsMismatch: \"Die Passwörter stimmen nicht überein\",\n creatingAccount: \"Konto wird erstellt…\",\n registrationFailed: \"Registrierung fehlgeschlagen\",\n accountCreatedSigningIn: \"Konto erstellt — Anmeldung läuft…\",\n emailVerifiedFinishing: \"E-Mail bestätigt. Anmeldung wird abgeschlossen...\",\n emailVerifiedSignIn: \"E-Mail bestätigt. Melde dich an, um fortzufahren.\",\n resetEmailSent:\n \"Falls diese E-Mail existiert, ist ein Reset-Link unterwegs.\",\n resetEmailFailed: \"Reset-E-Mail konnte nicht gesendet werden.\",\n signingIn: \"Anmeldung…\",\n invalidLogin: \"E-Mail oder Passwort ungültig\",\n googleNotConfigured: \"Google OAuth ist nicht konfiguriert.\",\n failedToConnect: \"Verbindung fehlgeschlagen. Bitte erneut versuchen.\",\n migrateLocalFallback: \"Melde dich weiter an, um lokale Daten zu migrieren.\",\n googlePopupHelp: \"Erlaube Pop-ups für diese Website und versuche es erneut\",\n googleNeverFinished:\n \"Die Google-Anmeldung wurde nicht abgeschlossen. Prüfe die Google-OAuth-Redirect-URI und Serverlogs für [agent-native][google-oauth].\",\n },\n \"ja-JP\": {\n languageLabel: \"言語\",\n systemLanguage: \"システム\",\n pageTitleSignIn: \"サインイン\",\n pageTitleWelcome: \"ようこそ\",\n welcomeTitle: \"ようこそ\",\n signInTitle: \"サインイン\",\n welcomeBackTitle: \"おかえりなさい\",\n checkEmailTitle: \"メールを確認してください\",\n resetPasswordTitle: \"パスワードをリセット\",\n createAccountSubtitle: \"アカウントを作成して始めましょう\",\n googleOnlySubtitle: \"ワークスペースの Google アカウントで続行\",\n signInSubtitle: \"アカウントにサインイン\",\n finishAccountSubtitle: \"アカウント作成を完了\",\n resetPasswordSubtitle: \"パスワードをリセットします\",\n upgradeCopy:\n \"サインインを続けて、このアプリをアカウントに接続し、ローカルデータを移行します。\",\n googleButton: \"Google でサインイン\",\n dividerOr: \"または\",\n createAccount: \"アカウントを作成\",\n signIn: \"サインイン\",\n email: \"メール\",\n password: \"パスワード\",\n confirmPassword: \"パスワードを確認\",\n passwordMinPlaceholder: \"8 文字以上\",\n confirmPasswordPlaceholder: \"パスワードを確認\",\n enterPasswordPlaceholder: \"パスワードを入力\",\n signupProgress: \"登録の進行状況\",\n progressAccount: \"アカウント\",\n progressVerify: \"確認\",\n progressStart: \"開始\",\n verificationSent: \"確認メールを送信しました\",\n verifyCopyPrefix: \"安全なリンクを送信しました:\",\n verifyCopySuffix:\n \"。リンクをクリックしてここに戻ると、このアプリが自動的にサインインを完了します。\",\n verificationNote:\n \"このタブは開いたままで構いません。戻っても更新されない場合は、続行を押してください。\",\n continue: \"続行\",\n resendEmail: \"メールを再送信\",\n back: \"戻る\",\n forgotPassword: \"パスワードをお忘れですか?\",\n sendResetLink: \"リセットリンクを送信\",\n backToSignIn: \"サインインに戻る\",\n localNotePrefix: \"アカウントはこのアプリ自身の DB に保存されます\",\n localNoteSuffix: \"。サードパーティサービスには保存されません。\",\n runLocally: \"ローカルで実行\",\n runLocallySentence: \"ローカルで実行\",\n openSource: \"100% 無料でオープンソース\",\n useOwnGoogleClient: \"自分の Google OAuth クライアントを使用:\",\n copyCommand: \"コマンドをコピー\",\n copied: \"コピーしました\",\n close: \"閉じる\",\n closeGoogleChoices: \"Google サインインの選択肢を閉じる\",\n legalPrefix: \"登録すると、以下に同意したものとみなされます:\",\n legalTerms: \"利用規約\",\n legalConnector: \"および\",\n legalPrivacy: \"プライバシーポリシー\",\n legalSuffix: \"。\",\n invalidEmail:\n \"you@example.com のような有効なメールアドレスを入力してください。\",\n signInToContinue: \"続行するにはサインインしてください。\",\n finishSignInFailed: \"サインインを自動で完了できませんでした。\",\n enterPasswordAfterVerification:\n \"メールを確認した後、パスワードを入力してください。\",\n finishSignInManually:\n \"サインインを自動で完了できませんでした。続行するにはサインインしてください。\",\n stillWaitingVerification:\n \"まだ確認待ちです。メール内のリンクをクリックしてから、もう一度続行してください。\",\n checkVerificationFailed:\n \"確認状態をチェックできませんでした。もう一度お試しください。\",\n checking: \"確認中...\",\n checkingVerification: \"確認状態をチェック中...\",\n sending: \"送信中...\",\n sent: \"送信済み\",\n sentVerification: \"新しい確認リンクを送信しました。\",\n resendVerificationFailed: \"確認メールを再送信できませんでした。\",\n networkErrorRetry: \"ネットワークエラーです。もう一度お試しください。\",\n networkErrorDashRetry: \"ネットワークエラー — もう一度お試しください\",\n passwordsMismatch: \"パスワードが一致しません\",\n creatingAccount: \"アカウントを作成中…\",\n registrationFailed: \"登録に失敗しました\",\n accountCreatedSigningIn: \"アカウントを作成しました — サインイン中…\",\n emailVerifiedFinishing: \"メールを確認しました。サインインを完了中...\",\n emailVerifiedSignIn:\n \"メールを確認しました。続行するにはサインインしてください。\",\n resetEmailSent: \"そのメールが存在する場合、リセットリンクを送信しました。\",\n resetEmailFailed: \"リセットメールを送信できませんでした。\",\n signingIn: \"サインイン中…\",\n invalidLogin: \"メールまたはパスワードが正しくありません\",\n googleNotConfigured: \"Google OAuth が設定されていません。\",\n failedToConnect: \"接続できませんでした。もう一度お試しください。\",\n migrateLocalFallback: \"サインインを続けてローカルデータを移行します。\",\n googlePopupHelp:\n \"このサイトのポップアップを許可してから、もう一度お試しください\",\n googleNeverFinished:\n \"Google サインインが完了しませんでした。Google OAuth リダイレクト URI と [agent-native][google-oauth] のサーバーログを確認してください。\",\n },\n \"ko-KR\": {\n languageLabel: \"언어\",\n systemLanguage: \"시스템\",\n pageTitleSignIn: \"로그인\",\n pageTitleWelcome: \"환영합니다\",\n welcomeTitle: \"환영합니다\",\n signInTitle: \"로그인\",\n welcomeBackTitle: \"다시 오신 것을 환영합니다\",\n checkEmailTitle: \"이메일을 확인하세요\",\n resetPasswordTitle: \"비밀번호 재설정\",\n createAccountSubtitle: \"계정을 만들고 시작하세요\",\n googleOnlySubtitle: \"워크스페이스 Google 계정으로 계속하기\",\n signInSubtitle: \"계정에 로그인하세요\",\n finishAccountSubtitle: \"계정 생성을 완료하세요\",\n resetPasswordSubtitle: \"비밀번호를 재설정하세요\",\n upgradeCopy:\n \"계속 로그인하여 이 앱을 계정에 연결하고 로컬 데이터를 마이그레이션하세요.\",\n googleButton: \"Google로 로그인\",\n dividerOr: \"또는\",\n createAccount: \"계정 만들기\",\n signIn: \"로그인\",\n email: \"이메일\",\n password: \"비밀번호\",\n confirmPassword: \"비밀번호 확인\",\n passwordMinPlaceholder: \"8자 이상\",\n confirmPasswordPlaceholder: \"비밀번호 확인\",\n enterPasswordPlaceholder: \"비밀번호 입력\",\n signupProgress: \"가입 진행 상황\",\n progressAccount: \"계정\",\n progressVerify: \"확인\",\n progressStart: \"시작\",\n verificationSent: \"확인 이메일을 보냈습니다\",\n verifyCopyPrefix: \"보안 링크를 보냈습니다:\",\n verifyCopySuffix:\n \". 링크를 클릭하고 여기로 돌아오면 이 앱이 자동으로 로그인을 완료합니다.\",\n verificationNote:\n \"이 탭을 열어 두어도 됩니다. 돌아온 뒤 새로고침되지 않으면 계속을 누르세요.\",\n continue: \"계속\",\n resendEmail: \"이메일 다시 보내기\",\n back: \"뒤로\",\n forgotPassword: \"비밀번호를 잊으셨나요?\",\n sendResetLink: \"재설정 링크 보내기\",\n backToSignIn: \"로그인으로 돌아가기\",\n localNotePrefix: \"계정은 이 앱의 자체 DB에 저장됩니다\",\n localNoteSuffix: \", 타사 서비스가 아닙니다.\",\n runLocally: \"로컬에서 실행\",\n runLocallySentence: \"로컬에서 실행\",\n openSource: \"100% 무료 오픈 소스\",\n useOwnGoogleClient: \"내 Google OAuth 클라이언트 사용:\",\n copyCommand: \"명령 복사\",\n copied: \"복사됨\",\n close: \"닫기\",\n closeGoogleChoices: \"Google 로그인 선택 닫기\",\n legalPrefix: \"가입하면 다음에 동의하게 됩니다:\",\n legalTerms: \"약관\",\n legalConnector: \"및\",\n legalPrivacy: \"개인정보 처리방침\",\n legalSuffix: \".\",\n invalidEmail: \"you@example.com 같은 올바른 이메일 주소를 입력하세요.\",\n signInToContinue: \"계속하려면 로그인하세요.\",\n finishSignInFailed: \"자동으로 로그인을 완료할 수 없습니다.\",\n enterPasswordAfterVerification: \"이메일을 확인한 후 비밀번호를 입력하세요.\",\n finishSignInManually:\n \"자동으로 로그인을 완료할 수 없습니다. 계속하려면 로그인하세요.\",\n stillWaitingVerification:\n \"아직 확인을 기다리고 있습니다. 이메일의 링크를 클릭한 뒤 계속을 다시 눌러주세요.\",\n checkVerificationFailed: \"확인 상태를 확인할 수 없습니다. 다시 시도하세요.\",\n checking: \"확인 중...\",\n checkingVerification: \"확인 상태 확인 중...\",\n sending: \"보내는 중...\",\n sent: \"보냄\",\n sentVerification: \"새 확인 링크를 보냈습니다.\",\n resendVerificationFailed: \"확인 이메일을 다시 보낼 수 없습니다.\",\n networkErrorRetry: \"네트워크 오류입니다. 다시 시도하세요.\",\n networkErrorDashRetry: \"네트워크 오류 — 다시 시도하세요\",\n passwordsMismatch: \"비밀번호가 일치하지 않습니다\",\n creatingAccount: \"계정 생성 중…\",\n registrationFailed: \"가입 실패\",\n accountCreatedSigningIn: \"계정 생성됨 — 로그인 중…\",\n emailVerifiedFinishing: \"이메일 확인됨. 로그인 완료 중...\",\n emailVerifiedSignIn: \"이메일 확인됨. 계속하려면 로그인하세요.\",\n resetEmailSent: \"해당 이메일이 있으면 재설정 링크가 발송됩니다.\",\n resetEmailFailed: \"재설정 이메일을 보낼 수 없습니다.\",\n signingIn: \"로그인 중…\",\n invalidLogin: \"이메일 또는 비밀번호가 올바르지 않습니다\",\n googleNotConfigured: \"Google OAuth가 구성되지 않았습니다.\",\n failedToConnect: \"연결하지 못했습니다. 다시 시도하세요.\",\n migrateLocalFallback: \"계속 로그인하여 로컬 데이터를 마이그레이션하세요.\",\n googlePopupHelp: \"이 사이트의 팝업을 허용한 뒤 다시 시도하세요\",\n googleNeverFinished:\n \"Google 로그인이 완료되지 않았습니다. Google OAuth 리디렉션 URI와 [agent-native][google-oauth] 서버 로그를 확인하세요.\",\n },\n \"pt-BR\": {\n languageLabel: \"Idioma\",\n systemLanguage: \"Sistema\",\n pageTitleSignIn: \"Entrar\",\n pageTitleWelcome: \"Boas-vindas\",\n welcomeTitle: \"Boas-vindas\",\n signInTitle: \"Entrar\",\n welcomeBackTitle: \"Bem-vindo de volta\",\n checkEmailTitle: \"Confira seu email\",\n resetPasswordTitle: \"Redefinir senha\",\n createAccountSubtitle: \"Crie uma conta para começar\",\n googleOnlySubtitle: \"Use sua conta Google do workspace para continuar\",\n signInSubtitle: \"Entre na sua conta\",\n finishAccountSubtitle: \"Finalize a criação da sua conta\",\n resetPasswordSubtitle: \"Redefina sua senha\",\n upgradeCopy:\n \"Continue entrando para conectar este app à sua conta e migrar dados locais.\",\n googleButton: \"Entrar com Google\",\n dividerOr: \"ou\",\n createAccount: \"Criar conta\",\n signIn: \"Entrar\",\n email: \"Email\",\n password: \"Senha\",\n confirmPassword: \"Confirmar senha\",\n passwordMinPlaceholder: \"Pelo menos 8 caracteres\",\n confirmPasswordPlaceholder: \"Confirmar senha\",\n enterPasswordPlaceholder: \"Digite a senha\",\n signupProgress: \"Progresso do cadastro\",\n progressAccount: \"Conta\",\n progressVerify: \"Verificar\",\n progressStart: \"Começar\",\n verificationSent: \"Email de verificação enviado\",\n verifyCopyPrefix: \"Enviamos um link seguro para\",\n verifyCopySuffix:\n \". Clique nele, volte aqui e este app terminará o login automaticamente.\",\n verificationNote:\n \"Você pode manter esta aba aberta. Se ela não atualizar quando você voltar, use Continuar.\",\n continue: \"Continuar\",\n resendEmail: \"Reenviar email\",\n back: \"Voltar\",\n forgotPassword: \"Esqueceu a senha?\",\n sendResetLink: \"Enviar link de redefinição\",\n backToSignIn: \"Voltar para entrar\",\n localNotePrefix:\n \"Sua conta fica armazenada no banco de dados próprio deste app\",\n localNoteSuffix: \", não em um serviço de terceiros.\",\n runLocally: \"Executar localmente\",\n runLocallySentence: \"Executar localmente\",\n openSource: \"100% grátis e open source\",\n useOwnGoogleClient: \"Use seu próprio cliente Google OAuth:\",\n copyCommand: \"Copiar comando\",\n copied: \"Copiado\",\n close: \"Fechar\",\n closeGoogleChoices: \"Fechar opções de login com Google\",\n legalPrefix: \"Ao se cadastrar, você aceita nossos\",\n legalTerms: \"Termos\",\n legalConnector: \"e\",\n legalPrivacy: \"Política de Privacidade\",\n legalSuffix: \".\",\n invalidEmail: \"Digite um email válido, como you@example.com.\",\n signInToContinue: \"Entre para continuar.\",\n finishSignInFailed: \"Não foi possível concluir o login automaticamente.\",\n enterPasswordAfterVerification:\n \"Digite sua senha depois de verificar seu email.\",\n finishSignInManually:\n \"Não foi possível concluir o login automaticamente. Entre para continuar.\",\n stillWaitingVerification:\n \"Ainda estamos aguardando a verificação. Clique no link do email e tente Continuar novamente.\",\n checkVerificationFailed: \"Não foi possível verificar. Tente novamente.\",\n checking: \"Verificando...\",\n checkingVerification: \"Verificando sua confirmação...\",\n sending: \"Enviando...\",\n sent: \"Enviado\",\n sentVerification: \"Enviamos um novo link de verificação.\",\n resendVerificationFailed:\n \"Não foi possível reenviar o email de verificação.\",\n networkErrorRetry: \"Erro de rede. Tente novamente.\",\n networkErrorDashRetry: \"Erro de rede — tente novamente\",\n passwordsMismatch: \"As senhas não conferem\",\n creatingAccount: \"Criando conta…\",\n registrationFailed: \"Falha no cadastro\",\n accountCreatedSigningIn: \"Conta criada — entrando…\",\n emailVerifiedFinishing: \"Email verificado. Concluindo login...\",\n emailVerifiedSignIn: \"Email verificado. Entre para continuar.\",\n resetEmailSent:\n \"Se esse email existir, um link de redefinição está a caminho.\",\n resetEmailFailed: \"Não foi possível enviar o email de redefinição.\",\n signingIn: \"Entrando…\",\n invalidLogin: \"Email ou senha inválidos\",\n googleNotConfigured: \"Google OAuth não está configurado.\",\n failedToConnect: \"Não foi possível conectar. Tente novamente.\",\n migrateLocalFallback: \"Continue entrando para migrar dados locais.\",\n googlePopupHelp: \"Permita pop-ups para este site e tente novamente\",\n googleNeverFinished:\n \"O login com Google não terminou. Confira o URI de redirecionamento do Google OAuth e os logs do servidor para [agent-native][google-oauth].\",\n },\n \"hi-IN\": {\n languageLabel: \"भाषा\",\n systemLanguage: \"सिस्टम\",\n pageTitleSignIn: \"साइन इन\",\n pageTitleWelcome: \"स्वागत है\",\n welcomeTitle: \"स्वागत है\",\n signInTitle: \"साइन इन\",\n welcomeBackTitle: \"वापस स्वागत है\",\n checkEmailTitle: \"अपना ईमेल देखें\",\n resetPasswordTitle: \"पासवर्ड रीसेट करें\",\n createAccountSubtitle: \"शुरू करने के लिए खाता बनाएं\",\n googleOnlySubtitle: \"जारी रखने के लिए अपना workspace Google खाता उपयोग करें\",\n signInSubtitle: \"अपने खाते में साइन इन करें\",\n finishAccountSubtitle: \"अपना खाता बनाना पूरा करें\",\n resetPasswordSubtitle: \"अपना पासवर्ड रीसेट करें\",\n upgradeCopy:\n \"इस ऐप को अपने खाते से जोड़ने और स्थानीय डेटा माइग्रेट करने के लिए साइन इन जारी रखें।\",\n googleButton: \"Google से साइन इन करें\",\n dividerOr: \"या\",\n createAccount: \"खाता बनाएं\",\n signIn: \"साइन इन\",\n email: \"ईमेल\",\n password: \"पासवर्ड\",\n confirmPassword: \"पासवर्ड की पुष्टि करें\",\n passwordMinPlaceholder: \"कम से कम 8 अक्षर\",\n confirmPasswordPlaceholder: \"पासवर्ड की पुष्टि करें\",\n enterPasswordPlaceholder: \"पासवर्ड दर्ज करें\",\n signupProgress: \"साइनअप प्रगति\",\n progressAccount: \"खाता\",\n progressVerify: \"सत्यापित करें\",\n progressStart: \"शुरू करें\",\n verificationSent: \"सत्यापन ईमेल भेजा गया\",\n verifyCopyPrefix: \"हमने एक सुरक्षित लिंक भेजा है\",\n verifyCopySuffix:\n \"पर। लिंक खोलें, यहां वापस आएं, और यह ऐप अपने आप आपका साइन इन पूरा करेगा।\",\n verificationNote:\n \"आप यह टैब खुला रख सकते हैं। वापस आने पर अगर यह refresh नहीं होता है, तो Continue दबाएं।\",\n continue: \"जारी रखें\",\n resendEmail: \"ईमेल फिर भेजें\",\n back: \"वापस\",\n forgotPassword: \"पासवर्ड भूल गए?\",\n sendResetLink: \"रीसेट लिंक भेजें\",\n backToSignIn: \"साइन इन पर वापस जाएं\",\n localNotePrefix: \"आपका खाता इस ऐप के अपने DB में संग्रहीत है\",\n localNoteSuffix: \", किसी third-party सेवा में नहीं।\",\n runLocally: \"लोकल चलाएं\",\n runLocallySentence: \"लोकल चलाएं\",\n openSource: \"100% मुफ्त और open source\",\n useOwnGoogleClient: \"अपना Google OAuth client उपयोग करें:\",\n copyCommand: \"कमांड कॉपी करें\",\n copied: \"कॉपी हो गया\",\n close: \"बंद करें\",\n closeGoogleChoices: \"Google साइन-इन विकल्प बंद करें\",\n legalPrefix: \"साइन अप करके, आप हमारी\",\n legalTerms: \"शर्तें\",\n legalConnector: \"और\",\n legalPrivacy: \"गोपनीयता नीति\",\n legalSuffix: \"स्वीकार करते हैं।\",\n invalidEmail: \"एक मान्य ईमेल पता दर्ज करें, जैसे you@example.com.\",\n signInToContinue: \"जारी रखने के लिए साइन इन करें।\",\n finishSignInFailed: \"साइन इन अपने आप पूरा नहीं हो सका।\",\n enterPasswordAfterVerification: \"ईमेल सत्यापित करने के बाद अपना पासवर्ड दर्ज करें।\",\n finishSignInManually:\n \"साइन इन अपने आप पूरा नहीं हो सका। जारी रखने के लिए साइन इन करें।\",\n stillWaitingVerification:\n \"सत्यापन का इंतजार है। ईमेल में लिंक खोलें, फिर Continue दोबारा दबाएं।\",\n checkVerificationFailed: \"सत्यापन जांच नहीं हो सकी। कृपया फिर कोशिश करें।\",\n checking: \"जांच हो रही है...\",\n checkingVerification: \"आपका सत्यापन जांच रहे हैं...\",\n sending: \"भेजा जा रहा है...\",\n sent: \"भेजा गया\",\n sentVerification: \"नया सत्यापन लिंक भेजा गया।\",\n resendVerificationFailed: \"सत्यापन ईमेल फिर नहीं भेजा जा सका।\",\n networkErrorRetry: \"नेटवर्क त्रुटि। कृपया फिर कोशिश करें।\",\n networkErrorDashRetry: \"नेटवर्क त्रुटि — कृपया फिर कोशिश करें\",\n passwordsMismatch: \"पासवर्ड मेल नहीं खाते\",\n creatingAccount: \"खाता बनाया जा रहा है…\",\n registrationFailed: \"रजिस्ट्रेशन असफल\",\n accountCreatedSigningIn: \"खाता बन गया — साइन इन हो रहा है…\",\n emailVerifiedFinishing: \"ईमेल सत्यापित। साइन इन पूरा हो रहा है...\",\n emailVerifiedSignIn: \"ईमेल सत्यापित। जारी रखने के लिए साइन इन करें।\",\n resetEmailSent: \"अगर वह ईमेल मौजूद है, तो reset लिंक भेजा जा रहा है।\",\n resetEmailFailed: \"रीसेट ईमेल नहीं भेजा जा सका।\",\n signingIn: \"साइन इन हो रहा है…\",\n invalidLogin: \"ईमेल या पासवर्ड अमान्य है\",\n googleNotConfigured: \"Google OAuth configured नहीं है।\",\n failedToConnect: \"कनेक्ट नहीं हो सका। कृपया फिर कोशिश करें।\",\n migrateLocalFallback: \"स्थानीय डेटा माइग्रेट करने के लिए साइन इन जारी रखें।\",\n googlePopupHelp: \"इस साइट के लिए pop-ups allow करें और फिर कोशिश करें\",\n googleNeverFinished:\n \"Google साइन इन पूरा नहीं हुआ। Google OAuth redirect URI और [agent-native][google-oauth] के server logs देखें।\",\n },\n \"ar-SA\": {\n languageLabel: \"اللغة\",\n systemLanguage: \"النظام\",\n pageTitleSignIn: \"تسجيل الدخول\",\n pageTitleWelcome: \"مرحبًا\",\n welcomeTitle: \"مرحبًا\",\n signInTitle: \"تسجيل الدخول\",\n welcomeBackTitle: \"مرحبًا بعودتك\",\n checkEmailTitle: \"تحقق من بريدك الإلكتروني\",\n resetPasswordTitle: \"إعادة تعيين كلمة المرور\",\n createAccountSubtitle: \"أنشئ حسابًا للبدء\",\n googleOnlySubtitle: \"استخدم حساب Google الخاص بمساحة العمل للمتابعة\",\n signInSubtitle: \"سجّل الدخول إلى حسابك\",\n finishAccountSubtitle: \"أكمل إنشاء حسابك\",\n resetPasswordSubtitle: \"أعد تعيين كلمة المرور\",\n upgradeCopy:\n \"تابع تسجيل الدخول لربط هذا التطبيق بحسابك وترحيل البيانات المحلية.\",\n googleButton: \"تسجيل الدخول باستخدام Google\",\n dividerOr: \"أو\",\n createAccount: \"إنشاء حساب\",\n signIn: \"تسجيل الدخول\",\n email: \"البريد الإلكتروني\",\n password: \"كلمة المرور\",\n confirmPassword: \"تأكيد كلمة المرور\",\n passwordMinPlaceholder: \"8 أحرف على الأقل\",\n confirmPasswordPlaceholder: \"تأكيد كلمة المرور\",\n enterPasswordPlaceholder: \"أدخل كلمة المرور\",\n signupProgress: \"تقدم التسجيل\",\n progressAccount: \"الحساب\",\n progressVerify: \"التحقق\",\n progressStart: \"البدء\",\n verificationSent: \"تم إرسال رسالة التحقق\",\n verifyCopyPrefix: \"أرسلنا رابطًا آمنًا إلى\",\n verifyCopySuffix:\n \". افتحه، ثم عُد إلى هنا وسيكمل هذا التطبيق تسجيل دخولك تلقائيًا.\",\n verificationNote:\n \"يمكنك إبقاء هذه النافذة مفتوحة. إذا لم يتم التحديث بعد عودتك، استخدم متابعة.\",\n continue: \"متابعة\",\n resendEmail: \"إعادة إرسال البريد\",\n back: \"رجوع\",\n forgotPassword: \"هل نسيت كلمة المرور؟\",\n sendResetLink: \"إرسال رابط إعادة التعيين\",\n backToSignIn: \"العودة إلى تسجيل الدخول\",\n localNotePrefix: \"يتم تخزين حسابك في قاعدة بيانات هذا التطبيق\",\n localNoteSuffix: \"، وليس في خدمة خارجية.\",\n runLocally: \"تشغيل محليًا\",\n runLocallySentence: \"تشغيل محليًا\",\n openSource: \"مجاني ومفتوح المصدر 100%\",\n useOwnGoogleClient: \"استخدم عميل Google OAuth الخاص بك:\",\n copyCommand: \"نسخ الأمر\",\n copied: \"تم النسخ\",\n close: \"إغلاق\",\n closeGoogleChoices: \"إغلاق خيارات تسجيل الدخول عبر Google\",\n legalPrefix: \"بالتسجيل، فإنك توافق على\",\n legalTerms: \"الشروط\",\n legalConnector: \"و\",\n legalPrivacy: \"سياسة الخصوصية\",\n legalSuffix: \".\",\n invalidEmail: \"أدخل بريدًا إلكترونيًا صالحًا، مثل you@example.com.\",\n signInToContinue: \"سجّل الدخول للمتابعة.\",\n finishSignInFailed: \"تعذر إكمال تسجيل الدخول تلقائيًا.\",\n enterPasswordAfterVerification:\n \"أدخل كلمة المرور بعد التحقق من بريدك الإلكتروني.\",\n finishSignInManually:\n \"تعذر إكمال تسجيل الدخول تلقائيًا. سجّل الدخول للمتابعة.\",\n stillWaitingVerification:\n \"ما زلنا ننتظر التحقق. افتح الرابط في بريدك الإلكتروني ثم جرّب متابعة مرة أخرى.\",\n checkVerificationFailed: \"تعذر التحقق من الحالة. حاول مرة أخرى.\",\n checking: \"جارٍ التحقق...\",\n checkingVerification: \"جارٍ التحقق من حالتك...\",\n sending: \"جارٍ الإرسال...\",\n sent: \"تم الإرسال\",\n sentVerification: \"تم إرسال رابط تحقق جديد.\",\n resendVerificationFailed: \"تعذر إعادة إرسال رسالة التحقق.\",\n networkErrorRetry: \"خطأ في الشبكة. حاول مرة أخرى.\",\n networkErrorDashRetry: \"خطأ في الشبكة — حاول مرة أخرى\",\n passwordsMismatch: \"كلمتا المرور غير متطابقتين\",\n creatingAccount: \"جارٍ إنشاء الحساب…\",\n registrationFailed: \"فشل التسجيل\",\n accountCreatedSigningIn: \"تم إنشاء الحساب — جارٍ تسجيل الدخول…\",\n emailVerifiedFinishing: \"تم التحقق من البريد. جارٍ إكمال تسجيل الدخول...\",\n emailVerifiedSignIn: \"تم التحقق من البريد. سجّل الدخول للمتابعة.\",\n resetEmailSent: \"إذا كان هذا البريد موجودًا، فسيصل رابط إعادة التعيين.\",\n resetEmailFailed: \"تعذر إرسال بريد إعادة التعيين.\",\n signingIn: \"جارٍ تسجيل الدخول…\",\n invalidLogin: \"البريد الإلكتروني أو كلمة المرور غير صحيحة\",\n googleNotConfigured: \"لم يتم إعداد Google OAuth.\",\n failedToConnect: \"تعذر الاتصال. حاول مرة أخرى.\",\n migrateLocalFallback: \"تابع تسجيل الدخول لترحيل البيانات المحلية.\",\n googlePopupHelp: \"اسمح بالنوافذ المنبثقة لهذا الموقع ثم حاول مرة أخرى\",\n googleNeverFinished:\n \"لم يكتمل تسجيل الدخول عبر Google. تحقق من URI إعادة التوجيه في Google OAuth وسجلات الخادم لـ [agent-native][google-oauth].\",\n },\n};\n\nconst defaultAuthCopy = AUTH_LOCALE_COPY[DEFAULT_LOCALE];\n\ntype AuthMarketingLocalization = Pick<\n AuthMarketingContent,\n \"tagline\" | \"description\" | \"features\"\n>;\n\nconst AUTH_MARKETING_LOCALE_COPY: Partial<\n Record<LocaleCode, Record<string, Partial<AuthMarketingLocalization>>>\n> = {\n \"zh-CN\": {\n forms: {\n tagline: \"你的 AI 代理与你一起构建、发布和分析表单。\",\n features: [\n \"用一句话创建完整表单\",\n \"即时发布,生成可分享链接和验证码\",\n \"按需获取回复摘要、导出和趋势分析\",\n ],\n },\n },\n \"zh-TW\": {\n forms: {\n tagline: \"你的 AI 代理會和你一起建立、發布與分析表單。\",\n features: [\n \"用一句話建立完整表單\",\n \"立即發布,產生可分享連結與驗證碼\",\n \"依需求取得回覆摘要、匯出與趨勢分析\",\n ],\n },\n },\n \"es-ES\": {\n forms: {\n tagline: \"Tu agente de IA crea, publica y analiza formularios contigo.\",\n features: [\n \"Crea formularios completos con una sola frase\",\n \"Publicación instantánea con enlaces compartibles y captcha\",\n \"Resúmenes de respuestas, exportaciones y análisis de tendencias al instante\",\n ],\n },\n },\n \"fr-FR\": {\n forms: {\n tagline:\n \"Votre agent IA crée, publie et analyse des formulaires avec vous.\",\n features: [\n \"Créez des formulaires complets à partir d'une seule phrase\",\n \"Publication instantanée avec liens partageables et captcha\",\n \"Résumés de réponses, exports et analyse des tendances à la demande\",\n ],\n },\n },\n \"de-DE\": {\n forms: {\n tagline:\n \"Dein KI-Agent erstellt, veröffentlicht und analysiert Formulare mit dir.\",\n features: [\n \"Erstelle vollständige Formulare aus einem einzigen Satz\",\n \"Sofortige Veröffentlichung mit teilbaren Links und Captcha\",\n \"Antwortzusammenfassungen, Exporte und Trendanalysen auf Abruf\",\n ],\n },\n },\n \"ja-JP\": {\n forms: {\n tagline: \"AI エージェントがフォームの作成、公開、分析を一緒に進めます。\",\n features: [\n \"一文から完全なフォームを作成\",\n \"共有リンクと CAPTCHA 付きで即時公開\",\n \"回答の要約、エクスポート、トレンド分析を必要なときに実行\",\n ],\n },\n },\n \"ko-KR\": {\n forms: {\n tagline: \"AI 에이전트가 양식 생성, 게시, 분석을 함께 도와줍니다.\",\n features: [\n \"한 문장으로 완성된 양식 만들기\",\n \"공유 링크와 captcha로 즉시 게시\",\n \"응답 요약, 내보내기, 추세 분석을 필요할 때 실행\",\n ],\n },\n },\n \"pt-BR\": {\n forms: {\n tagline:\n \"Seu agente de IA cria, publica e analisa formulários junto com você.\",\n features: [\n \"Crie formulários completos a partir de uma única frase\",\n \"Publicação instantânea com links compartilháveis e captcha\",\n \"Resumos de respostas, exportações e análise de tendências sob demanda\",\n ],\n },\n },\n \"hi-IN\": {\n forms: {\n tagline:\n \"आपका AI एजेंट आपके साथ फ़ॉर्म बनाता, प्रकाशित करता और उनका विश्लेषण करता है।\",\n features: [\n \"एक वाक्य से पूरे फ़ॉर्म बनाएं\",\n \"शेयर करने योग्य लिंक और captcha के साथ तुरंत प्रकाशित करें\",\n \"ज़रूरत पड़ने पर प्रतिक्रिया सारांश, exports और trend analysis पाएं\",\n ],\n },\n },\n \"ar-SA\": {\n forms: {\n tagline: \"يساعدك وكيل الذكاء الاصطناعي على إنشاء النماذج ونشرها وتحليلها.\",\n features: [\n \"أنشئ نماذج كاملة من جملة واحدة\",\n \"نشر فوري مع روابط قابلة للمشاركة وcaptcha\",\n \"ملخصات للإجابات وتصدير وتحليل اتجاهات عند الطلب\",\n ],\n },\n },\n};\n\nfunction resolveBuiltInMarketingSlug(\n marketing: AuthMarketingContent | undefined,\n): string | undefined {\n if (!marketing) return undefined;\n for (const [slug, builtIn] of Object.entries(BUILT_IN_AUTH_MARKETING)) {\n if (\n marketing.appName === builtIn.appName &&\n marketing.tagline === builtIn.tagline\n ) {\n return slug;\n }\n }\n return undefined;\n}\n\nexport interface SignupLegalNoticeOptions {\n termsUrl: string;\n privacyUrl: string;\n termsLabel?: string;\n privacyLabel?: string;\n prefix?: string;\n connector?: string;\n suffix?: string;\n}\n\nfunction normalizeRequestHostname(host: string | undefined): string {\n const firstHost = host?.split(\",\")[0]?.trim().toLowerCase() ?? \"\";\n if (!firstHost) return \"\";\n if (firstHost.startsWith(\"[\")) {\n const close = firstHost.indexOf(\"]\");\n return close > 0 ? firstHost.slice(1, close) : firstHost;\n }\n return firstHost.replace(/:\\d+$/, \"\");\n}\n\nfunction isAgentNativeHostedHost(host: string | undefined): boolean {\n const hostname = normalizeRequestHostname(host);\n return (\n hostname === \"agent-native.com\" || hostname.endsWith(\".agent-native.com\")\n );\n}\n\nexport interface OnboardingHtmlOptions {\n /**\n * Hide email/password forms and show ONLY the Google sign-in button.\n * Useful for templates (mail, calendar) where Google is required anyway.\n * If Google OAuth env vars are not configured, an error message is shown.\n */\n googleOnly?: boolean;\n /**\n * Product marketing content shown alongside the sign-in form.\n * When provided, the page uses a split layout: marketing on the left,\n * sign-in form on the right (stacked on mobile).\n */\n marketing?: {\n appName: string;\n tagline: string;\n description?: string;\n features?: string[];\n runLocalCommand?: string;\n };\n /**\n * Request context used only to recover branded first-party marketing when a\n * default auth guard serves before a template-specific auth plugin.\n */\n requestHost?: string;\n requestPath?: string;\n requestOrigin?: string;\n /**\n * Optional preflight copy shown before redirecting through Google sign-in.\n * Use this when a hosted app needs to warn about provider-specific consent\n * screens while leaving self-hosted deployments untouched.\n */\n googleSignInNotice?: {\n host?: string;\n title: string;\n body: string | string[];\n continueLabel?: string;\n cancelLabel?: string;\n };\n /**\n * Optional email signup legal copy. Builder-hosted `*.agent-native.com`\n * deployments get the Agent Native links automatically; self-hosted and\n * custom-domain apps must opt in with their own URLs.\n */\n signupLegalNotice?: SignupLegalNoticeOptions | false;\n /**\n * Google sign-in flow: `'popup'`, `'redirect'`, or `'auto'` (default).\n * Falls back to `GOOGLE_AUTH_MODE` env var, then `'auto'`. Builder web\n * iframes use popup; Builder desktop preview/editor surfaces use redirect.\n */\n googleAuthMode?: GoogleAuthMode;\n}\n\nexport function getOnboardingHtml(opts: OnboardingHtmlOptions = {}): string {\n const showGoogle = hasGoogleOAuth();\n const googleOnly = !!opts.googleOnly;\n // In a Google-only app, Google is the sole sign-in method, so always render\n // a working button — never gate it on env vars detected at render time. The\n // login page is a public, CDN-cacheable shell served to everyone (per-user\n // and per-config state is resolved client-side after load), so baking a\n // \"not configured\" message in here would freeze that error into the cache\n // for every visitor. A genuinely misconfigured server instead surfaces a\n // clear error at click time via the auth API.\n const renderGoogleButton = showGoogle || googleOnly;\n const appBasePath = normalizeAppBasePath(\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH,\n );\n const publicOAuthOrigin = getPublicOAuthOrigin();\n const workspaceGatewayReturnOrigin = getWorkspaceGatewayReturnOrigin();\n const googleAuthMode = resolveGoogleAuthMode(opts.googleAuthMode);\n const localeInitScript = getLocaleInitScript();\n\n const marketing: AuthMarketingContent | undefined =\n opts.marketing ??\n resolveBuiltInAuthMarketing({\n requestHost: opts.requestHost,\n requestPath: opts.requestPath,\n });\n const hasMarketing = !!marketing;\n const marketingSlug = resolveBuiltInMarketingSlug(marketing);\n const defaultMarketingCopy: Partial<AuthMarketingLocalization> | undefined =\n marketing\n ? {\n tagline: marketing.tagline,\n description: marketing.description,\n features: marketing.features,\n }\n : undefined;\n const runLocalCommand = marketing?.runLocalCommand?.trim();\n const signupLocalModeNote =\n isAgentNativeHostedHost(opts.requestHost) &&\n marketing?.signupLocalModeNote?.command.trim()\n ? {\n text: marketing.signupLocalModeNote.text.trim(),\n command: marketing.signupLocalModeNote.command.trim(),\n }\n : undefined;\n const brandMarkSrc = withAppBasePath(\"/agent-native-icon-dark.svg\");\n const socialImageUrl = withAgentNativeSocialImageCacheBuster(\n opts.requestOrigin\n ? `${opts.requestOrigin}${withAppBasePath(AGENT_NATIVE_SOCIAL_IMAGE_PATH)}`\n : withAppBasePath(AGENT_NATIVE_SOCIAL_IMAGE_PATH),\n );\n const esc = (s: string) =>\n s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n const t = (key: keyof typeof EN_AUTH_COPY) => defaultAuthCopy[key];\n const i18nAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n=\"${key}\"` : \"\";\n const i18nAriaAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n-aria-label=\"${key}\"` : \"\";\n const i18nPlaceholderAttr = (key: keyof typeof EN_AUTH_COPY | undefined) =>\n key ? ` data-i18n-placeholder=\"${key}\"` : \"\";\n const i18nDataAttr = (\n attr: string,\n key: keyof typeof EN_AUTH_COPY | undefined,\n ) => (key ? ` data-i18n-${attr}=\"${key}\"` : \"\");\n const i18nText = (key: keyof typeof EN_AUTH_COPY) =>\n `<span${i18nAttr(key)}>${esc(t(key))}</span>`;\n const localizedValue = (\n value: string | undefined,\n key: keyof typeof EN_AUTH_COPY,\n ) => (value === undefined ? i18nText(key) : esc(value));\n const localizedAnchorLabel = (\n value: string | undefined,\n key: keyof typeof EN_AUTH_COPY,\n ) =>\n value === undefined ? `${i18nAttr(key)}>${esc(t(key))}` : `>${esc(value)}`;\n const localeMenuItemsHtml = [\n ` <button type=\"button\" class=\"locale-menu-item\" role=\"menuitemradio\" aria-checked=\"false\" data-locale-value=\"system\">\n <span class=\"locale-menu-check\" aria-hidden=\"true\">✓</span>\n <span${i18nAttr(\"systemLanguage\")}>${esc(t(\"systemLanguage\"))}</span>\n </button>`,\n ...SUPPORTED_LOCALES.map((locale) => {\n const metadata = LOCALE_METADATA[locale];\n const label =\n metadata.nativeName === metadata.englishName\n ? `${metadata.nativeName} (${metadata.code})`\n : `${metadata.nativeName} (${metadata.englishName})`;\n return ` <button type=\"button\" class=\"locale-menu-item\" role=\"menuitemradio\" aria-checked=\"false\" data-locale-value=\"${esc(locale)}\">\n <span class=\"locale-menu-check\" aria-hidden=\"true\">✓</span>\n <span>${esc(label)}</span>\n </button>`;\n }),\n ].join(\"\\n\");\n const localePickerHtml = `\n<div class=\"locale-picker\">\n <button type=\"button\" class=\"locale-trigger\" id=\"auth-locale-trigger\" aria-haspopup=\"menu\" aria-expanded=\"false\" aria-controls=\"auth-locale-menu\" aria-label=\"${esc(t(\"languageLabel\"))}\" title=\"${esc(t(\"languageLabel\"))}\"${i18nAriaAttr(\"languageLabel\")} data-i18n-title=\"languageLabel\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M4 5h7\" />\n <path d=\"M7.5 4v1\" />\n <path d=\"M9.5 5c-.8 4.4-2.6 7.2-5.5 9\" />\n <path d=\"M5 9c1.2 2.1 3.2 3.8 6 5\" />\n <path d=\"M13 20l4-9 4 9\" />\n <path d=\"M14.5 17h5\" />\n </svg>\n </button>\n <div class=\"locale-menu\" id=\"auth-locale-menu\" role=\"menu\" aria-labelledby=\"auth-locale-trigger\" hidden>\n${localeMenuItemsHtml}\n </div>\n</div>`;\n const hostedSignupLegalNotice: SignupLegalNoticeOptions | undefined =\n opts.signupLegalNotice === undefined &&\n isAgentNativeHostedHost(opts.requestHost)\n ? {\n termsUrl: AGENT_NATIVE_TERMS_URL,\n privacyUrl: AGENT_NATIVE_PRIVACY_URL,\n }\n : undefined;\n const signupLegalNotice =\n opts.signupLegalNotice === false\n ? undefined\n : (opts.signupLegalNotice ?? hostedSignupLegalNotice);\n const signupLegalNoteHtml = signupLegalNotice\n ? ` <p class=\"legal-note\">${localizedValue(signupLegalNotice.prefix, \"legalPrefix\")} <a href=\"${esc(signupLegalNotice.termsUrl)}\" target=\"_blank\" rel=\"noreferrer\"${localizedAnchorLabel(signupLegalNotice.termsLabel, \"legalTerms\")}</a> ${localizedValue(signupLegalNotice.connector, \"legalConnector\")} <a href=\"${esc(signupLegalNotice.privacyUrl)}\" target=\"_blank\" rel=\"noreferrer\"${localizedAnchorLabel(signupLegalNotice.privacyLabel, \"legalPrivacy\")}</a>${localizedValue(signupLegalNotice.suffix, \"legalSuffix\")}</p>`\n : \"\";\n const signupLocalModeNoteHtml = signupLocalModeNote\n ? ` <div class=\"signup-local-mode-note\" id=\"signup-local-mode-note\" data-command=\"${esc(signupLocalModeNote.command)}\">\n <p>${esc(signupLocalModeNote.text)}</p>\n <code>${esc(signupLocalModeNote.command)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-signup-local-mode\" onclick=\"__anCopySignupLocalModeCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>`\n : \"\";\n const googleSignInNotice = opts.googleSignInNotice;\n const googleNoticeBodyParts = googleSignInNotice\n ? (Array.isArray(googleSignInNotice.body)\n ? googleSignInNotice.body\n : [googleSignInNotice.body]\n ).filter((body) => body.trim().length > 0)\n : [];\n const googleNoticeBodyHtml = googleNoticeBodyParts\n .map(\n (body, index) =>\n `<p class=\"google-preflight-copy\"${index === 0 ? ' id=\"google-preflight-copy\"' : \"\"}>${esc(body)}</p>`,\n )\n .join(\"\\n\");\n const googleNoticeRunLocalHtml = runLocalCommand\n ? `\n <button type=\"button\" class=\"btn-secondary google-preflight-local\" id=\"google-preflight-run-local\" onclick=\"__anChooseRunLocalFromGoogleNotice()\"${i18nAttr(googleSignInNotice?.cancelLabel === undefined ? \"runLocallySentence\" : undefined)}>${esc(googleSignInNotice?.cancelLabel ?? t(\"runLocallySentence\"))}</button>`\n : `\n <button type=\"button\" class=\"btn-secondary\" onclick=\"__anHideGoogleNotice()\"${i18nAttr(googleSignInNotice?.cancelLabel === undefined ? \"close\" : undefined)}>${esc(googleSignInNotice?.cancelLabel ?? t(\"close\"))}</button>`;\n const googleNoticeRunLocalPanelHtml = runLocalCommand\n ? `\n <div class=\"google-preflight-command\" id=\"google-preflight-run-local-panel\" hidden data-command=\"${esc(runLocalCommand)}\">\n <p class=\"google-preflight-command-label\"${i18nAttr(\"useOwnGoogleClient\")}>${esc(t(\"useOwnGoogleClient\"))}</p>\n <code>${esc(runLocalCommand)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-google-preflight-run-local\" onclick=\"__anCopyGoogleNoticeRunLocalCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>`\n : \"\";\n const googleNoticeHtml =\n renderGoogleButton && googleSignInNotice\n ? `\n <div\n class=\"google-preflight\"\n id=\"google-preflight\"\n data-host=\"${esc(googleSignInNotice.host ?? \"\")}\"\n role=\"dialog\"\n aria-labelledby=\"google-preflight-title\"\n aria-describedby=\"google-preflight-copy\"\n tabindex=\"-1\"\n >\n <button type=\"button\" class=\"google-preflight-close\" aria-label=\"${esc(t(\"closeGoogleChoices\"))}\"${i18nAriaAttr(\"closeGoogleChoices\")} onclick=\"__anHideGoogleNotice()\">×</button>\n <div class=\"google-preflight-main\">\n <span class=\"google-preflight-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.24 3.957l-8.422 14.06a1.989 1.989 0 0 0 1.7 2.983h16.845a1.989 1.989 0 0 0 1.7 -2.983l-8.423 -14.06a1.989 1.989 0 0 0 -3.4 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 16h.01\"/></svg>\n </span>\n <div class=\"google-preflight-text\">\n <p class=\"google-preflight-title\" id=\"google-preflight-title\">${esc(googleSignInNotice.title)}</p>\n${googleNoticeBodyHtml}\n </div>\n </div>\n <div class=\"google-preflight-actions\">\n <button type=\"button\" class=\"btn-primary\" id=\"google-preflight-continue\" onclick=\"__anAcceptGoogleNotice()\"${i18nAttr(googleSignInNotice.continueLabel === undefined ? \"continue\" : undefined)}>${esc(googleSignInNotice.continueLabel ?? t(\"continue\"))}</button>\n${googleNoticeRunLocalHtml}\n </div>\n${googleNoticeRunLocalPanelHtml}\n </div>`\n : \"\";\n const identitySsoHtml = identitySsoLoginButtonHtml();\n const identitySsoScript = identitySsoHtml\n ? `\n function __anIdentitySsoUrl() {\n var params = new URLSearchParams();\n params.set('return', __anResumeHref());\n return __anPath('/_agent-native/identity/login') + '?' + params.toString();\n }\n function __anStartIdentitySso(event) {\n if (event && event.preventDefault) event.preventDefault();\n window.location.href = __anIdentitySsoUrl();\n return false;\n }\n (function __anPrepareIdentitySsoButton() {\n var identity = document.getElementById('identity-sso-btn');\n if (!identity) return;\n identity.setAttribute('href', __anIdentitySsoUrl());\n identity.addEventListener('click', __anStartIdentitySso);\n })();`\n : \"\";\n\n const marketingStyles = hasMarketing\n ? `\n body.has-marketing { padding: 0; position: relative; overflow-x: hidden; }\n #starfield {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0.35;\n pointer-events: none;\n z-index: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n #starfield { opacity: 0.18; }\n }\n .split {\n position: relative;\n z-index: 1;\n display: flex;\n min-height: 100vh;\n width: 100%;\n max-width: 1100px;\n margin: 0 auto;\n }\n .marketing-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding: 3rem 3.5rem;\n }\n .marketing-content { max-width: 480px; }\n .app-name {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n font-size: 2rem;\n font-weight: 700;\n color: #fff;\n margin-bottom: 0.625rem;\n letter-spacing: -0.02em;\n }\n .app-name img.brand-mark {\n height: 2.21375rem;\n width: auto;\n display: block;\n flex-shrink: 0;\n }\n .app-tagline {\n font-size: 1.25rem;\n color: #a1a1aa;\n line-height: 1.6;\n margin-bottom: 2rem;\n }\n .app-desc {\n font-size: 1rem;\n color: #71717a;\n line-height: 1.6;\n margin-bottom: 2rem;\n }\n .feature-list {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.875rem;\n }\n .feature-list li {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n font-size: 1rem;\n color: #a1a1aa;\n line-height: 1.5;\n }\n .feature-list li::before {\n content: '';\n flex-shrink: 0;\n width: 8px;\n height: 8px;\n margin-top: 6px;\n border-radius: 50%;\n background: #3f3f46;\n border: 1px solid #52525b;\n }\n .oss-link {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.8125rem;\n font-weight: 600;\n color: #00B5FF;\n text-decoration: none;\n transition: color 0.15s ease;\n }\n .oss-link:hover { color: #33C4FF; }\n .oss-link svg { width: 15px; height: 15px; flex-shrink: 0; }\n .marketing-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.75rem;\n margin-top: 2rem;\n }\n .run-local-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 2.25rem;\n padding: 0.5rem 0.875rem;\n background: rgba(255,255,255,0.08);\n color: #fff;\n border: 1px solid rgba(255,255,255,0.14);\n border-radius: 8px;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n }\n .run-local-button:hover {\n background: rgba(255,255,255,0.12);\n border-color: rgba(255,255,255,0.24);\n }\n .run-local-panel {\n max-width: 480px;\n margin-top: 0.75rem;\n padding: 0.75rem;\n background: rgba(20,20,20,0.86);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 10px;\n box-shadow: 0 14px 36px rgba(0,0,0,0.28);\n }\n .run-local-panel[hidden] { display: none; }\n .run-local-panel code {\n display: block;\n overflow-x: auto;\n padding-bottom: 0.125rem;\n color: #e5e5e5;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.75rem;\n line-height: 1.5;\n white-space: nowrap;\n }\n .copy-run-local {\n margin-top: 0.625rem;\n padding: 0.375rem 0.625rem;\n background: transparent;\n color: #a1a1aa;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 6px;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .copy-run-local:hover { color: #fff; border-color: rgba(255,255,255,0.22); }\n .form-panel {\n flex: 0 0 440px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n }\n .form-panel .card { max-width: 400px; }\n .form-panel .local-note { max-width: 400px; }\n @media (max-width: 900px) {\n .split { flex-direction: column; min-height: auto; }\n .marketing-panel { padding: 4.25rem 1.5rem 1.5rem; }\n .app-name { font-size: 1.375rem; }\n .app-name img.brand-mark { height: 1.58125rem; }\n .app-tagline { font-size: 1rem; margin-bottom: 1rem; }\n .app-desc { margin-bottom: 1rem; }\n .feature-list { gap: 0.5rem; }\n .form-panel { flex: none; padding: 1.5rem 1rem; }\n }\n`\n : \"\";\n\n const marketingPanelHtml = hasMarketing\n ? `<canvas id=\"starfield\"></canvas>\n<div class=\"split\">\n <div class=\"marketing-panel\">\n <div class=\"marketing-content\">\n <h2 class=\"app-name\">\n <img class=\"brand-mark\" src=\"${esc(brandMarkSrc)}\" alt=\"\" aria-hidden=\"true\" />\n <span>${esc(marketing!.appName)}</span>\n </h2>\n <p class=\"app-tagline\" data-marketing-field=\"tagline\">${esc(marketing!.tagline)}</p>\n${marketing!.description ? ` <p class=\"app-desc\" data-marketing-field=\"description\">${esc(marketing!.description)}</p>\\n` : \"\"}${\n marketing!.features?.length\n ? ` <ul class=\"feature-list\">\\n${marketing!.features.map((f, index) => ` <li data-marketing-feature-index=\"${index}\">${esc(f)}</li>`).join(\"\\n\")}\\n </ul>\\n`\n : \"\"\n } <div class=\"marketing-actions\">\n${runLocalCommand ? ` <button type=\"button\" class=\"run-local-button\" id=\"run-local-button\" aria-expanded=\"false\" aria-controls=\"run-local-panel\" onclick=\"__anToggleRunLocalCommand()\"${i18nAttr(\"runLocally\")}>${esc(t(\"runLocally\"))}</button>\\n` : \"\"} <a class=\"oss-link\" href=\"https://github.com/BuilderIO/agent-native\" target=\"_blank\" rel=\"noreferrer\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 00-1.3-3.2 4.2 4.2 0 00-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 00-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 00-.1 3.2A4.6 4.6 0 004 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21\"/></svg>\n <span${i18nAttr(\"openSource\")}>${esc(t(\"openSource\"))}</span>\n </a>\n </div>\n${\n runLocalCommand\n ? ` <div class=\"run-local-panel\" id=\"run-local-panel\" hidden data-command=\"${esc(runLocalCommand)}\">\n <code>${esc(runLocalCommand)}</code>\n <button type=\"button\" class=\"copy-run-local\" id=\"copy-run-local\" onclick=\"__anCopyRunLocalCommand()\"${i18nAttr(\"copyCommand\")}>${esc(t(\"copyCommand\"))}</button>\n </div>\\n`\n : \"\"\n}\n </div>\n </div>\n <div class=\"form-panel\">`\n : \"\";\n\n const marketingCloseHtml = hasMarketing ? `\\n </div>\\n</div>` : \"\";\n\n const starfieldScript = hasMarketing\n ? `\n (function initStarfield() {\n var canvas = document.getElementById('starfield');\n if (!canvas) return;\n var gl = canvas.getContext('webgl', { alpha: false, antialias: false });\n if (!gl) return;\n\n var vs = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vs, 'attribute vec2 position;void main(){gl_Position=vec4(position,0.0,1.0);}');\n gl.compileShader(vs);\n\n var fs = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fs, [\n 'precision highp float;',\n 'uniform float iTime;uniform vec2 iResolution;uniform vec3 uPointer;',\n '#define S(a,b,t) smoothstep(a,b,t)',\n '#define NUM_LAYERS 4.',\n 'float N21(vec2 p){vec3 a=fract(vec3(p.xyx)*vec3(213.897,653.453,253.098));a+=dot(a,a.yzx+79.76);return fract((a.x+a.y)*a.z);}',\n 'vec2 GetPos(vec2 id,vec2 offs,float t){float n=N21(id+offs);float n1=fract(n*10.);float n2=fract(n*100.);float a=t+n;return offs+vec2(sin(a*n1),cos(a*n2))*.4;}',\n 'vec2 Attract(vec2 p,vec2 cursor,float strength){vec2 delta=cursor-p;float d=length(delta);float pull=1.-smoothstep(.08,1.9,d);pull=pull*pull*(3.-2.*pull);return p+delta*pull*.095*strength;}',\n 'float df_line(vec2 a,vec2 b,vec2 p){vec2 pa=p-a,ba=b-a;float h=clamp(dot(pa,ba)/dot(ba,ba),0.,1.);return length(pa-ba*h);}',\n 'float line(vec2 a,vec2 b,vec2 uv){float r1=.025;float r2=.006;float d=df_line(a,b,uv);float d2=length(a-b);float fade=S(1.5,.5,d2);fade+=S(.05,.02,abs(d2-.75));return S(r1,r2,d)*fade;}',\n 'float NetLayer(vec2 st,float n,float t,vec2 pointer,float pointerStrength){',\n ' vec2 cell=floor(st);vec2 id=cell+n;vec2 cursor=pointer-cell;st=fract(st)-.5;',\n ' vec2 p0=Attract(GetPos(id,vec2(-1,-1),t),cursor,pointerStrength);vec2 p1=Attract(GetPos(id,vec2(0,-1),t),cursor,pointerStrength);vec2 p2=Attract(GetPos(id,vec2(1,-1),t),cursor,pointerStrength);',\n ' vec2 p3=Attract(GetPos(id,vec2(-1,0),t),cursor,pointerStrength);vec2 p4=Attract(GetPos(id,vec2(0,0),t),cursor,pointerStrength);vec2 p5=Attract(GetPos(id,vec2(1,0),t),cursor,pointerStrength);',\n ' vec2 p6=Attract(GetPos(id,vec2(-1,1),t),cursor,pointerStrength);vec2 p7=Attract(GetPos(id,vec2(0,1),t),cursor,pointerStrength);vec2 p8=Attract(GetPos(id,vec2(1,1),t),cursor,pointerStrength);',\n ' float m=0.;float sparkle=0.;float d;float s;float pulse;',\n ' m+=line(p4,p0,st);d=length(st-p0);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p0.x)+fract(p0.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p1,st);d=length(st-p1);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p1.x)+fract(p1.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p2,st);d=length(st-p2);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p2.x)+fract(p2.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p3,st);d=length(st-p3);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p3.x)+fract(p3.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p4,st);d=length(st-p4);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p4.x)+fract(p4.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p5,st);d=length(st-p5);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p5.x)+fract(p5.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p6,st);d=length(st-p6);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p6.x)+fract(p6.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p7,st);d=length(st-p7);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p7.x)+fract(p7.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p4,p8,st);d=length(st-p8);s=(.005/(d*d));s*=S(1.,.7,d);pulse=sin((fract(p8.x)+fract(p8.y)+t)*5.)*.4+.6;pulse=pow(pulse,20.);sparkle+=s*pulse;',\n ' m+=line(p1,p3,st);m+=line(p1,p5,st);m+=line(p7,p5,st);m+=line(p7,p3,st);',\n ' float sPhase=(sin(t+n)+sin(t*.1))*.25+.5;sPhase+=pow(sin(t*.1)*.5+.5,50.)*5.;m+=sparkle*sPhase;',\n ' return m;',\n '}',\n 'void mainImage(out vec4 fragColor,in vec2 fragCoord){',\n ' vec2 uv=(fragCoord-iResolution.xy*.5)/iResolution.y;',\n ' float t=iTime*.03;float s=sin(t);float c=cos(t);mat2 rot=mat2(c,-s,s,c);vec2 st=uv*rot;vec2 pointerUv=(uPointer.xy-iResolution.xy*.5)/iResolution.y;',\n ' float m=0.;',\n ' for(float i=0.;i<1.;i+=1./NUM_LAYERS){float z=fract(t+i);float size=mix(15.,1.,z);float fade=S(0.,.6,z)*S(1.,.8,z);vec2 pointerSt=pointerUv*rot*size;vec2 layerSt=st*size;float warp=1.-smoothstep(.15,2.7,length(layerSt-pointerSt));warp=warp*warp*(3.-2.*warp)*uPointer.z;layerSt-=(pointerSt-layerSt)*warp*.035;m+=fade*NetLayer(layerSt,i,iTime*0.3,pointerSt,uPointer.z);}',\n ' float cursorLift=1.-smoothstep(.04,.48,length(uv-pointerUv));cursorLift=cursorLift*cursorLift*(3.-2.*cursorLift)*uPointer.z;m*=1.+cursorLift*1.6;',\n ' vec3 col=vec3(0.35)*m;col*=1.-dot(uv,uv);',\n ' float tt=min(iTime,5.0);col*=S(0.,20.,tt);',\n ' col=clamp(col,0.,1.);fragColor=vec4(col,1.);',\n '}',\n 'void main(){mainImage(gl_FragColor,gl_FragCoord.xy);}'\n ].join('\\\\n'));\n gl.compileShader(fs);\n\n var prog = gl.createProgram();\n gl.attachShader(prog, vs);\n gl.attachShader(prog, fs);\n gl.linkProgram(prog);\n gl.useProgram(prog);\n\n var buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]), gl.STATIC_DRAW);\n var pos = gl.getAttribLocation(prog, 'position');\n gl.enableVertexAttribArray(pos);\n gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);\n\n var uTime = gl.getUniformLocation(prog, 'iTime');\n var uRes = gl.getUniformLocation(prog, 'iResolution');\n var uPointer = gl.getUniformLocation(prog, 'uPointer');\n var reducedMotionQuery = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null;\n var reducedMotion = reducedMotionQuery ? reducedMotionQuery.matches : false;\n var pointerDpr = 1, hasPointer = false;\n var pointerX = 0, pointerY = 0, pointerStrength = 0;\n var targetX = 0, targetY = 0, targetStrength = 0;\n\n function resize() {\n var w = window.innerWidth, h = window.innerHeight;\n pointerDpr = Math.min(window.devicePixelRatio, 1.5);\n canvas.width = w * pointerDpr; canvas.height = h * pointerDpr;\n gl.viewport(0, 0, canvas.width, canvas.height);\n if (!hasPointer) {\n pointerX = targetX = canvas.width * 0.5;\n pointerY = targetY = canvas.height * 0.5;\n }\n }\n function onPointerMove(event) {\n var rect = canvas.getBoundingClientRect();\n var x = event.clientX - rect.left;\n var y = event.clientY - rect.top;\n hasPointer = true;\n targetX = x * pointerDpr;\n targetY = (rect.height - y) * pointerDpr;\n targetStrength = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height ? 1 : 0;\n }\n function fadePointer() {\n targetStrength = 0;\n }\n function easePointer(allowPointer) {\n if (!allowPointer) {\n pointerStrength = 0;\n return;\n }\n pointerX += (targetX - pointerX) * 0.22;\n pointerY += (targetY - pointerY) * 0.22;\n pointerStrength += (targetStrength - pointerStrength) * 0.14;\n if (pointerStrength < 0.001 && targetStrength === 0) pointerStrength = 0;\n }\n resize();\n window.addEventListener('resize', resize);\n window.addEventListener('pointermove', onPointerMove, { passive: true });\n window.addEventListener('mousemove', onPointerMove, { passive: true });\n document.addEventListener('pointerleave', fadePointer, { passive: true });\n window.addEventListener('blur', fadePointer);\n\n var start = performance.now(), last = 0, raf = 0, reducedMotionStaticTime = 20;\n function draw(timeSeconds, allowPointer) {\n easePointer(allowPointer !== false && !reducedMotion);\n gl.uniform1f(uTime, timeSeconds);\n gl.uniform2f(uRes, canvas.width, canvas.height);\n gl.uniform3f(uPointer, pointerX, pointerY, pointerStrength);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n function render(now) {\n if (reducedMotion) {\n raf = 0;\n return;\n }\n raf = requestAnimationFrame(render);\n if (now - last < 33) return;\n last = now;\n draw((now - start) * 0.001);\n }\n function startAnimation() {\n if (!raf) raf = requestAnimationFrame(render);\n }\n function stopAnimation() {\n if (raf) {\n cancelAnimationFrame(raf);\n raf = 0;\n }\n }\n function onReducedMotionChange() {\n reducedMotion = reducedMotionQuery ? reducedMotionQuery.matches : false;\n if (reducedMotion) {\n stopAnimation();\n last = 0;\n draw(reducedMotionStaticTime, false);\n } else {\n startAnimation();\n }\n }\n draw(reducedMotion ? reducedMotionStaticTime : 0, !reducedMotion);\n if (reducedMotionQuery) {\n if (reducedMotionQuery.addEventListener) {\n reducedMotionQuery.addEventListener('change', onReducedMotionChange);\n } else {\n reducedMotionQuery.addListener(onReducedMotionChange);\n }\n }\n if (!reducedMotion) startAnimation();\n })();`\n : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"${DEFAULT_LOCALE}\" dir=\"ltr\">\n<head>\n<meta charset=\"UTF-8\">\n<script data-agent-native-locale-init>${localeInitScript}</script>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>${hasMarketing ? esc(marketing!.appName) + \" — \" + esc(t(\"pageTitleSignIn\")) : esc(t(\"pageTitleWelcome\"))}</title>\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"${withAppBasePath(\"/favicon.svg\")}\">\n<link rel=\"apple-touch-icon\" href=\"${withAppBasePath(\"/icon-180.svg\")}\">\n${\n hasMarketing\n ? `<meta name=\"description\" content=\"${esc(marketing!.tagline)}\">\n<meta property=\"og:title\" content=\"${esc(marketing!.appName)}\">\n<meta property=\"og:description\" content=\"${esc(marketing!.tagline)}\">\n<meta property=\"og:image\" content=\"${esc(socialImageUrl)}\">\n<meta property=\"og:image:secure_url\" content=\"${esc(socialImageUrl)}\">\n<meta property=\"og:image:type\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_TYPE}\">\n<meta property=\"og:image:width\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_WIDTH}\">\n<meta property=\"og:image:height\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT}\">\n<meta property=\"og:image:alt\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_ALT}\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:image\" content=\"${esc(socialImageUrl)}\">\n<meta name=\"twitter:image:alt\" content=\"${AGENT_NATIVE_SOCIAL_IMAGE_ALT}\">`\n : \"\"\n}\n<style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background: #0a0a0a;\n color: #e5e5e5;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 1rem;\n }\n .locale-picker {\n position: fixed;\n top: max(1rem, env(safe-area-inset-top));\n inset-inline-end: max(1rem, env(safe-area-inset-right));\n z-index: 40;\n }\n .locale-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n padding: 0;\n background: rgba(20,20,20,0.82);\n color: #e5e5e5;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 8px;\n cursor: pointer;\n outline: none;\n backdrop-filter: blur(12px);\n }\n .locale-trigger svg {\n width: 1rem;\n height: 1rem;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n .locale-trigger:hover,\n .locale-trigger[aria-expanded=\"true\"] {\n border-color: rgba(255,255,255,0.22);\n background: rgba(28,28,28,0.92);\n }\n .locale-trigger:focus {\n border-color: rgba(255,255,255,0.42);\n box-shadow: 0 0 0 3px rgba(255,255,255,0.08);\n }\n .locale-menu {\n position: absolute;\n top: calc(100% + 0.375rem);\n inset-inline-end: 0;\n min-width: 14rem;\n max-height: min(22rem, calc(100vh - 4rem));\n overflow-y: auto;\n padding: 0.25rem;\n background: rgba(20,20,20,0.94);\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 10px;\n box-shadow: 0 18px 50px rgba(0,0,0,0.42);\n backdrop-filter: blur(14px);\n }\n .locale-menu[hidden] { display: none; }\n .locale-menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n min-height: 2rem;\n padding: 0.375rem 0.5rem;\n background: transparent;\n border: 0;\n border-radius: 7px;\n color: #a1a1aa;\n cursor: pointer;\n font: inherit;\n font-size: 0.8125rem;\n text-align: start;\n }\n .locale-menu-item:hover,\n .locale-menu-item:focus {\n background: rgba(255,255,255,0.07);\n color: #fff;\n outline: none;\n }\n .locale-menu-item[aria-checked=\"true\"] {\n color: #fff;\n background: rgba(255,255,255,0.08);\n }\n .locale-menu-check {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n color: #33C4FF;\n opacity: 0;\n }\n .locale-menu-item[aria-checked=\"true\"] .locale-menu-check {\n opacity: 1;\n }\n .card {\n width: 100%;\n max-width: 400px;\n padding: 2rem;\n background: #141414;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; color: #fff; }\n .subtitle { font-size: 0.8125rem; color: #888; margin-bottom: 1.5rem; }\n .tabs {\n display: inline-flex;\n width: 100%;\n padding: 4px;\n margin-bottom: 1.5rem;\n background: rgba(255,255,255,0.06);\n border-radius: 8px;\n }\n .tab {\n flex: 1;\n padding: 0.5rem 0.75rem;\n background: none;\n border: none;\n color: #888;\n font-size: 0.8125rem;\n font-weight: 500;\n cursor: pointer;\n border-radius: 6px;\n }\n .tab.active {\n background: #3a3a3a;\n color: #fff;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n }\n .tab:hover:not(.active) { color: #bbb; }\n .form { display: none; }\n .form.active { display: block; }\n .card.verifying .tabs,\n .card.verifying #google-btn,\n .card.verifying #google-err,\n .card.verifying #auth-divider,\n .card.verifying #upgrade-note {\n display: none;\n }\n label { display: block; font-size: 0.8125rem; color: #888; margin-bottom: 0.375rem; }\n input {\n width: 100%;\n padding: 0.5rem 0.75rem;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 6px;\n color: #e5e5e5;\n font-size: 0.875rem;\n outline: none;\n margin-bottom: 0.875rem;\n }\n input:focus { border-color: rgba(255,255,255,0.3); box-shadow: 0 0 0 1px rgba(255,255,255,0.1); }\n input::placeholder { color: #555; }\n button[type=\"submit\"], .btn-primary {\n width: 100%;\n margin-top: 0.25rem;\n padding: 0.5rem;\n background: #fff;\n color: #000;\n border: none;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n button[type=\"submit\"]:hover, .btn-primary:hover { background: #e5e5e5; }\n button[type=\"submit\"]:disabled { opacity: 0.5; cursor: not-allowed; }\n .btn-secondary {\n width: 100%;\n margin-top: 0.75rem;\n padding: 0.5rem;\n background: transparent;\n color: #888;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n font-size: 0.8125rem;\n cursor: pointer;\n }\n .btn-secondary:hover { color: #bbb; border-color: rgba(255,255,255,0.2); }\n .legal-note {\n margin-top: 0.625rem;\n color: #666;\n font-size: 0.6875rem;\n line-height: 1.45;\n text-align: center;\n }\n .legal-note a {\n color: #777;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n .legal-note a:hover { color: #aaa; }\n .signup-local-mode-note {\n margin-top: 0.75rem;\n padding: 0.625rem;\n color: #777;\n background: rgba(255,255,255,0.025);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n font-size: 0.6875rem;\n line-height: 1.45;\n text-align: left;\n }\n .signup-local-mode-note p {\n margin: 0 0 0.5rem;\n }\n .signup-local-mode-note code {\n display: block;\n overflow-x: auto;\n padding-bottom: 0.125rem;\n color: #b8b8b8;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.6875rem;\n line-height: 1.5;\n white-space: nowrap;\n }\n .signup-local-mode-note .copy-run-local {\n margin-top: 0.5rem;\n }\n .msg { margin-top: 0.75rem; font-size: 0.8125rem; display: none; }\n .msg.error { color: #f87171; }\n .msg.success { color: #33C4FF; }\n .msg.show { display: block; }\n .step-progress {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0.5rem;\n margin-bottom: 1.25rem;\n }\n .progress-step {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.375rem;\n color: #666;\n font-size: 0.6875rem;\n line-height: 1.2;\n text-align: center;\n }\n .progress-step::before {\n content: '';\n position: absolute;\n top: 11px;\n left: calc(-50% + 16px);\n width: calc(100% - 32px);\n height: 1px;\n background: rgba(255,255,255,0.1);\n }\n .progress-step:first-child::before { display: none; }\n .progress-step span {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 999px;\n border: 1px solid rgba(255,255,255,0.14);\n background: #151515;\n color: #777;\n font-size: 0.6875rem;\n font-weight: 600;\n }\n .progress-step strong { font-weight: 500; }\n .progress-step.complete,\n .progress-step.current { color: #e5e5e5; }\n .progress-step.complete span {\n background: rgba(0,181,255,0.16);\n border-color: rgba(0,181,255,0.55);\n color: #dff7ff;\n }\n .progress-step.current span {\n background: #fff;\n border-color: #fff;\n color: #000;\n box-shadow: 0 0 0 4px rgba(255,255,255,0.08);\n }\n .verification-panel {\n padding: 1rem;\n margin-bottom: 0.875rem;\n background: rgba(255,255,255,0.04);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n }\n .verification-kicker {\n margin-bottom: 0.5rem;\n color: #33C4FF;\n font-size: 0.75rem;\n font-weight: 500;\n }\n .verification-copy {\n color: #d4d4d8;\n font-size: 0.875rem;\n line-height: 1.55;\n }\n .verification-copy strong {\n color: #fff;\n font-weight: 600;\n word-break: break-word;\n }\n .verification-note {\n margin-top: 0.75rem;\n color: #71717a;\n font-size: 0.75rem;\n line-height: 1.45;\n }\n .inline-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n margin-top: 0.75rem;\n }\n .link-button {\n padding: 0.25rem 0;\n background: none;\n border: none;\n color: #888;\n cursor: pointer;\n font-size: 0.75rem;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n .link-button:hover { color: #bbb; }\n .link-button:disabled { cursor: wait; opacity: 0.5; }\n .divider {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 1.25rem 0;\n font-size: 0.75rem;\n color: #555;\n }\n .divider::before, .divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba(255,255,255,0.08);\n }\n .upgrade-note {\n margin-bottom: 1rem;\n padding: 0.75rem;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n background: rgba(255,255,255,0.03);\n font-size: 0.75rem;\n line-height: 1.5;\n color: #a1a1aa;\n display: none;\n }\n .upgrade-note.show { display: block; }\n .btn-google {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.625rem;\n padding: 0.5rem;\n background: #fff;\n color: #000;\n border: none;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n .btn-google:hover { background: #e5e5e5; }\n .btn-google:disabled { opacity: 0.5; cursor: wait; }\n .btn-google svg { width: 18px; height: 18px; flex-shrink: 0; }\n .google-signin {\n position: relative;\n width: 100%;\n }\n .google-error { margin-top: 0.5rem; font-size: 0.8125rem; color: #f87171; display: none; }\n .google-error.show { display: block; }\n .google-debug {\n display: none;\n margin-top: 0.5rem;\n font-size: 0.6875rem;\n line-height: 1.45;\n color: #777;\n word-break: break-word;\n }\n .google-debug.show { display: block; }\n .google-preflight {\n display: none;\n position: absolute;\n top: calc(100% + 0.625rem);\n left: 0;\n right: 0;\n z-index: 20;\n padding: 0.875rem;\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 10px;\n background: #1b1b1b;\n box-shadow: 0 18px 50px rgba(0,0,0,0.48);\n }\n .google-preflight.show { display: block; }\n .google-preflight::before {\n content: '';\n position: absolute;\n top: -6px;\n left: 50%;\n width: 10px;\n height: 10px;\n transform: translateX(-50%) rotate(45deg);\n background: #1b1b1b;\n border-left: 1px solid rgba(255,255,255,0.12);\n border-top: 1px solid rgba(255,255,255,0.12);\n }\n .google-preflight-main {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n padding-right: 1.25rem;\n }\n .google-preflight-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 7px;\n background: rgba(245,158,11,0.15);\n color: #fcd34d;\n }\n .google-preflight-icon svg { width: 1rem; height: 1rem; }\n .google-preflight-text { min-width: 0; }\n .google-preflight-title {\n color: #fff;\n font-size: 0.8125rem;\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n .google-preflight-close {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem;\n height: 1.5rem;\n background: transparent;\n border: none;\n border-radius: 999px;\n color: #888;\n cursor: pointer;\n font-size: 1.125rem;\n line-height: 1;\n }\n .google-preflight-close:hover { color: #fff; background: rgba(255,255,255,0.07); }\n .google-preflight-copy {\n color: #b4b4b8;\n font-size: 0.75rem;\n line-height: 1.55;\n }\n .google-preflight-copy + .google-preflight-copy { margin-top: 0.5rem; }\n .google-preflight-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.875rem;\n }\n .google-preflight-actions .btn-primary,\n .google-preflight-actions .btn-secondary {\n flex: 1;\n width: auto;\n margin-top: 0;\n white-space: nowrap;\n }\n .google-preflight-command {\n margin-top: 0.75rem;\n padding: 0.75rem;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 8px;\n background: rgba(0,0,0,0.24);\n }\n .google-preflight-command[hidden] { display: none; }\n .google-preflight-command-label {\n margin-bottom: 0.5rem;\n color: #d4d4d8;\n font-size: 0.75rem;\n font-weight: 500;\n }\n .google-preflight-command code {\n display: block;\n overflow-x: auto;\n color: #e5e5e5;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", monospace;\n font-size: 0.71875rem;\n line-height: 1.45;\n white-space: nowrap;\n }\n @media (max-width: 480px) {\n .google-preflight {\n position: static;\n margin-top: 0.625rem;\n }\n .google-preflight::before { display: none; }\n .google-preflight-actions { flex-direction: column; }\n .google-preflight-actions .btn-primary,\n .google-preflight-actions .btn-secondary { width: 100%; }\n }\n .local-note {\n display: none;\n max-width: 400px;\n width: 100%;\n margin-top: 1rem;\n padding: 0.625rem 0.875rem;\n font-size: 0.6875rem;\n line-height: 1.5;\n color: #666;\n border: 1px dashed rgba(255,255,255,0.08);\n border-radius: 8px;\n text-align: center;\n }\n .local-note.show { display: block; }\n .local-note strong { color: #999; font-weight: 500; }\n .local-note a { color: #888; text-decoration: none; }\n .local-note a:hover { color: #bbb; }\n${marketingStyles}\n</style>\n</head>\n<body${hasMarketing ? ' class=\"has-marketing\"' : \"\"}>\n${localePickerHtml}\n${marketingPanelHtml}\n<div class=\"card\">\n <h1 id=\"heading\"${i18nAttr(googleOnly ? \"signInTitle\" : \"welcomeTitle\")}>${esc(t(googleOnly ? \"signInTitle\" : \"welcomeTitle\"))}</h1>\n <p class=\"subtitle\" id=\"subtitle\"${i18nAttr(googleOnly ? \"googleOnlySubtitle\" : \"createAccountSubtitle\")}>${esc(t(googleOnly ? \"googleOnlySubtitle\" : \"createAccountSubtitle\"))}</p>\n <p\n class=\"upgrade-note\"\n id=\"upgrade-note\"\n data-upgrade-copy=\"${esc(t(\"upgradeCopy\"))}\"\n ${i18nDataAttr(\"data-upgrade-copy\", \"upgradeCopy\").trim()}\n ></p>\n${identitySsoHtml}\n${\n renderGoogleButton\n ? `\n <div class=\"google-signin\" id=\"google-signin\">\n <button class=\"btn-google\" id=\"google-btn\" onclick=\"signInWithGoogle()\"${googleSignInNotice ? ' aria-haspopup=\"dialog\" aria-expanded=\"false\" aria-controls=\"google-preflight\"' : \"\"}>\n <svg viewBox=\"0 0 24 24\"><path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"/><path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/><path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/><path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/></svg>\n <span${i18nAttr(\"googleButton\")}>${esc(t(\"googleButton\"))}</span>\n </button>\n <p class=\"google-error\" id=\"google-err\"></p>\n <p class=\"google-debug\" id=\"google-debug\"></p>\n${googleNoticeHtml}\n </div>\n${googleOnly ? \"\" : `\\n <div class=\"divider\" id=\"auth-divider\"${i18nAttr(\"dividerOr\")}>${esc(t(\"dividerOr\"))}</div>\\n`}\n`\n : \"\"\n}\n${\n googleOnly\n ? \"\"\n : ` <div class=\"tabs\">\n <button class=\"tab\" data-tab=\"signup\"${i18nAttr(\"createAccount\")}>${esc(t(\"createAccount\"))}</button>\n <button class=\"tab\" data-tab=\"login\"${i18nAttr(\"signIn\")}>${esc(t(\"signIn\"))}</button>\n </div>\n\n <form id=\"signup-form\" class=\"form\">\n <label for=\"s-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"s-email\" type=\"email\" autocomplete=\"email\" autofocus placeholder=\"you@example.com\" required />\n <label for=\"s-pass\"${i18nAttr(\"password\")}>${esc(t(\"password\"))}</label>\n <input id=\"s-pass\" type=\"password\" autocomplete=\"new-password\" placeholder=\"${esc(t(\"passwordMinPlaceholder\"))}\"${i18nPlaceholderAttr(\"passwordMinPlaceholder\")} required minlength=\"8\" />\n <label for=\"s-pass2\"${i18nAttr(\"confirmPassword\")}>${esc(t(\"confirmPassword\"))}</label>\n <input id=\"s-pass2\" type=\"password\" autocomplete=\"new-password\" placeholder=\"${esc(t(\"confirmPasswordPlaceholder\"))}\"${i18nPlaceholderAttr(\"confirmPasswordPlaceholder\")} required minlength=\"8\" />\n <button type=\"submit\"${i18nAttr(\"createAccount\")}>${esc(t(\"createAccount\"))}</button>\n${signupLegalNoteHtml}\n${signupLocalModeNoteHtml}\n <p class=\"msg\" id=\"s-msg\"></p>\n </form>\n\n <div id=\"verification-step\" class=\"form verification-step\" aria-live=\"polite\">\n <div class=\"step-progress\" aria-label=\"${esc(t(\"signupProgress\"))}\"${i18nAriaAttr(\"signupProgress\")}>\n <div class=\"progress-step complete\"><span>1</span><strong${i18nAttr(\"progressAccount\")}>${esc(t(\"progressAccount\"))}</strong></div>\n <div class=\"progress-step current\"><span>2</span><strong${i18nAttr(\"progressVerify\")}>${esc(t(\"progressVerify\"))}</strong></div>\n <div class=\"progress-step\"><span>3</span><strong${i18nAttr(\"progressStart\")}>${esc(t(\"progressStart\"))}</strong></div>\n </div>\n <div class=\"verification-panel\">\n <p class=\"verification-kicker\"${i18nAttr(\"verificationSent\")}>${esc(t(\"verificationSent\"))}</p>\n <p class=\"verification-copy\"><span${i18nAttr(\"verifyCopyPrefix\")}>${esc(t(\"verifyCopyPrefix\"))}</span> <strong id=\"verify-email\"></strong><span${i18nAttr(\"verifyCopySuffix\")}>${esc(t(\"verifyCopySuffix\"))}</span></p>\n <p class=\"verification-note\"${i18nAttr(\"verificationNote\")}>${esc(t(\"verificationNote\"))}</p>\n </div>\n <button type=\"button\" class=\"btn-primary\" id=\"verify-continue\"${i18nAttr(\"continue\")}>${esc(t(\"continue\"))}</button>\n <div class=\"inline-actions\">\n <button type=\"button\" class=\"link-button\" id=\"resend-verification\"${i18nAttr(\"resendEmail\")}>${esc(t(\"resendEmail\"))}</button>\n <button type=\"button\" class=\"link-button\" id=\"back-to-signup\"${i18nAttr(\"back\")}>${esc(t(\"back\"))}</button>\n </div>\n <p class=\"msg\" id=\"verify-msg\"></p>\n </div>\n\n <form id=\"login-form\" class=\"form\">\n <label for=\"l-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"l-email\" type=\"email\" autocomplete=\"email\" placeholder=\"you@example.com\" required />\n <label for=\"l-pass\"${i18nAttr(\"password\")}>${esc(t(\"password\"))}</label>\n <input id=\"l-pass\" type=\"password\" autocomplete=\"current-password\" placeholder=\"${esc(t(\"enterPasswordPlaceholder\"))}\"${i18nPlaceholderAttr(\"enterPasswordPlaceholder\")} required />\n <button type=\"submit\"${i18nAttr(\"signIn\")}>${esc(t(\"signIn\"))}</button>\n <p class=\"msg error\" id=\"l-msg\"></p>\n <p style=\"margin-top:0.75rem;font-size:0.75rem;text-align:right\">\n <a href=\"#\" id=\"forgot-link\" style=\"color:#888;text-decoration:underline;text-underline-offset:2px\"${i18nAttr(\"forgotPassword\")}>${esc(t(\"forgotPassword\"))}</a>\n </p>\n </form>\n\n <form id=\"forgot-form\" class=\"form\">\n <label for=\"f-email\"${i18nAttr(\"email\")}>${esc(t(\"email\"))}</label>\n <input id=\"f-email\" type=\"email\" autocomplete=\"email\" placeholder=\"you@example.com\" required />\n <button type=\"submit\"${i18nAttr(\"sendResetLink\")}>${esc(t(\"sendResetLink\"))}</button>\n <p class=\"msg\" id=\"f-msg\"></p>\n <p style=\"margin-top:0.75rem;font-size:0.75rem;text-align:center\">\n <a href=\"#\" id=\"back-to-login\" style=\"color:#888;text-decoration:underline;text-underline-offset:2px\"${i18nAttr(\"backToSignIn\")}>${esc(t(\"backToSignIn\"))}</a>\n </p>\n </form>`\n}\n</div>\n<p class=\"local-note\" id=\"local-note\">\n <span${i18nAttr(\"localNotePrefix\")}>${esc(t(\"localNotePrefix\"))}</span> (<strong>${getConnectionLabel()}</strong>)<span${i18nAttr(\"localNoteSuffix\")}>${esc(t(\"localNoteSuffix\"))}</span>\n</p>${marketingCloseHtml}\n<script>\n function __anBasePath() {\n var configured = ${JSON.stringify(appBasePath)};\n if (configured) return configured;\n var marker = '/_agent-native';\n var idx = window.location.pathname.indexOf(marker);\n return idx > 0 ? window.location.pathname.slice(0, idx) : '';\n }\n function __anPath(path) {\n return __anBasePath() + path;\n }\n${signInJourneyInlineScript()}\n var __anJourney = __anCreateSignInJourney(__anBasePath());\n /**\n * Where this document sends the visitor once a session exists. One\n * function, one answer — the page used to have two (\"__anGetReturnPath\"\n * and \"__anGetSignedInReturnPath\") that disagreed about whether the\n * sign-in page itself was an acceptable destination, which is how\n * verification emails ended up linking back to a login form.\n */\n function __anResumeHref() {\n return __anJourney.journeyForLocation(window.location).resumeHref;\n }\n var __AN_AUTH_DEFAULT_LOCALE = ${JSON.stringify(DEFAULT_LOCALE)};\n var __AN_AUTH_SUPPORTED_LOCALES = ${JSON.stringify(SUPPORTED_LOCALES)};\n var __AN_AUTH_LOCALE_STORAGE_KEY = ${JSON.stringify(LOCALE_STORAGE_KEY)};\n var __AN_AUTH_LOCALE_METADATA = ${JSON.stringify(LOCALE_METADATA)};\n var __AN_AUTH_LOCALES = ${JSON.stringify(AUTH_LOCALE_COPY)};\n var __AN_AUTH_MARKETING_APP_NAME = ${JSON.stringify(marketing?.appName ?? \"\")};\n var __AN_AUTH_HAS_MARKETING = ${JSON.stringify(hasMarketing)};\n var __AN_AUTH_MARKETING_SLUG = ${JSON.stringify(marketingSlug ?? \"\")};\n var __AN_AUTH_MARKETING_DEFAULT = ${JSON.stringify(defaultMarketingCopy ?? {})};\n var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(AUTH_MARKETING_LOCALE_COPY)};\n var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;\n var __anAuthLocalePreference = 'system';\n var __anAuthView = ${JSON.stringify(googleOnly ? \"googleOnly\" : \"signup\")};\n function __anAuthLocaleIsSupported(value) {\n return __AN_AUTH_SUPPORTED_LOCALES.indexOf(value) !== -1;\n }\n function __anNormalizeAuthLocale(value) {\n if (typeof value !== 'string' || !value) return null;\n if (__anAuthLocaleIsSupported(value)) return value;\n try {\n var canonical = Intl.getCanonicalLocales(value)[0];\n if (__anAuthLocaleIsSupported(canonical)) return canonical;\n var language = canonical && canonical.split('-')[0].toLowerCase();\n for (var i = 0; i < __AN_AUTH_SUPPORTED_LOCALES.length; i++) {\n var locale = __AN_AUTH_SUPPORTED_LOCALES[i];\n if (locale.split('-')[0].toLowerCase() === language) return locale;\n }\n } catch(e) {}\n return null;\n }\n function __anNormalizeAuthLocalePreference(value) {\n if (value === 'system') return 'system';\n return __anNormalizeAuthLocale(value);\n }\n function __anReadAuthLocalePreference() {\n try {\n return __anNormalizeAuthLocalePreference(localStorage.getItem(__AN_AUTH_LOCALE_STORAGE_KEY)) || 'system';\n } catch(e) {\n return 'system';\n }\n }\n function __anWriteAuthLocalePreference(preference) {\n try {\n localStorage.setItem(__AN_AUTH_LOCALE_STORAGE_KEY, preference);\n } catch(e) {}\n }\n function __anBrowserAuthLocales() {\n try {\n if (navigator.languages && navigator.languages.length) return navigator.languages;\n if (navigator.language) return [navigator.language];\n } catch(e) {}\n return [];\n }\n function __anResolveAuthLocale(preference) {\n var normalizedPreference = __anNormalizeAuthLocalePreference(preference) || 'system';\n if (normalizedPreference !== 'system') return normalizedPreference;\n var rootLocale = __anNormalizeAuthLocale(document.documentElement.getAttribute('data-locale'));\n if (rootLocale) return rootLocale;\n var locales = __anBrowserAuthLocales();\n for (var i = 0; i < locales.length; i++) {\n var match = __anNormalizeAuthLocale(locales[i]);\n if (match) return match;\n }\n return __AN_AUTH_DEFAULT_LOCALE;\n }\n function __anT(key) {\n var localized = __AN_AUTH_LOCALES[__anAuthLocale] || __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};\n var fallback = __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};\n return localized[key] || fallback[key] || key;\n }\n function __anSetAuthI18nKey(node, key) {\n if (!node || !key) return;\n node.setAttribute('data-i18n', key);\n node.textContent = __anT(key);\n }\n function __anAuthHeadingKeys(view) {\n if (view === 'login') return { heading: 'welcomeBackTitle', subtitle: 'signInSubtitle' };\n if (view === 'forgot') return { heading: 'resetPasswordTitle', subtitle: 'resetPasswordSubtitle' };\n if (view === 'verification') return { heading: 'checkEmailTitle', subtitle: 'finishAccountSubtitle' };\n if (view === 'googleOnly') return { heading: 'signInTitle', subtitle: 'googleOnlySubtitle' };\n return { heading: 'welcomeTitle', subtitle: 'createAccountSubtitle' };\n }\n function __anRefreshAuthViewCopy() {\n var keys = __anAuthHeadingKeys(__anAuthView);\n __anSetAuthI18nKey(document.getElementById('heading'), keys.heading);\n __anSetAuthI18nKey(document.getElementById('subtitle'), keys.subtitle);\n }\n function __anSetAuthView(view) {\n __anAuthView = view || 'signup';\n __anRefreshAuthViewCopy();\n }\n function __anMarketingCopy() {\n if (!__AN_AUTH_MARKETING_SLUG) return __AN_AUTH_MARKETING_DEFAULT || {};\n var localeMarketing = (__AN_AUTH_MARKETING_LOCALES[__anAuthLocale] || {})[__AN_AUTH_MARKETING_SLUG] || {};\n return {\n tagline: localeMarketing.tagline || __AN_AUTH_MARKETING_DEFAULT.tagline,\n description: localeMarketing.description || __AN_AUTH_MARKETING_DEFAULT.description,\n features: localeMarketing.features || __AN_AUTH_MARKETING_DEFAULT.features || []\n };\n }\n function __anApplyAuthMarketingCopy() {\n var copy = __anMarketingCopy();\n var tagline = document.querySelector('[data-marketing-field=\"tagline\"]');\n if (tagline && copy.tagline) tagline.textContent = copy.tagline;\n var description = document.querySelector('[data-marketing-field=\"description\"]');\n if (description && copy.description) description.textContent = copy.description;\n document.querySelectorAll('[data-marketing-feature-index]').forEach(function(node) {\n var index = Number(node.getAttribute('data-marketing-feature-index'));\n var feature = copy.features && copy.features[index];\n if (feature) node.textContent = feature;\n });\n }\n function __anApplyAuthLocale(preference) {\n __anAuthLocalePreference = __anNormalizeAuthLocalePreference(preference) || __anReadAuthLocalePreference();\n __anAuthLocale = __anResolveAuthLocale(__anAuthLocalePreference);\n var root = document.documentElement;\n var meta = __AN_AUTH_LOCALE_METADATA[__anAuthLocale] || {};\n root.setAttribute('lang', __anAuthLocale);\n root.setAttribute('dir', meta.dir || 'ltr');\n root.setAttribute('data-locale', __anAuthLocale);\n document.querySelectorAll('[data-i18n]').forEach(function(node) {\n node.textContent = __anT(node.getAttribute('data-i18n'));\n });\n document.querySelectorAll('[data-i18n-placeholder]').forEach(function(node) {\n node.setAttribute('placeholder', __anT(node.getAttribute('data-i18n-placeholder')));\n });\n document.querySelectorAll('[data-i18n-aria-label]').forEach(function(node) {\n node.setAttribute('aria-label', __anT(node.getAttribute('data-i18n-aria-label')));\n });\n document.querySelectorAll('[data-i18n-title]').forEach(function(node) {\n node.setAttribute('title', __anT(node.getAttribute('data-i18n-title')));\n });\n document.querySelectorAll('[data-i18n-data-upgrade-copy]').forEach(function(node) {\n node.setAttribute('data-upgrade-copy', __anT(node.getAttribute('data-i18n-data-upgrade-copy')));\n });\n document.querySelectorAll('[data-locale-value]').forEach(function(node) {\n var checked = node.getAttribute('data-locale-value') === __anAuthLocalePreference;\n node.setAttribute('aria-checked', checked ? 'true' : 'false');\n });\n document.title = __AN_AUTH_HAS_MARKETING && __AN_AUTH_MARKETING_APP_NAME\n ? __AN_AUTH_MARKETING_APP_NAME + ' — ' + __anT('pageTitleSignIn')\n : __anT('pageTitleWelcome');\n __anApplyAuthMarketingCopy();\n __anRefreshAuthViewCopy();\n }\n function __anSetAuthLocaleMenuOpen(open) {\n var trigger = document.getElementById('auth-locale-trigger');\n var menu = document.getElementById('auth-locale-menu');\n if (!trigger || !menu) return;\n if (open) {\n menu.removeAttribute('hidden');\n } else {\n menu.setAttribute('hidden', '');\n }\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n (function __anInitAuthLocalePicker() {\n var trigger = document.getElementById('auth-locale-trigger');\n var menu = document.getElementById('auth-locale-menu');\n var preference = __anReadAuthLocalePreference();\n __anApplyAuthLocale(preference);\n if (!trigger || !menu) return;\n trigger.addEventListener('click', function(event) {\n event.preventDefault();\n __anSetAuthLocaleMenuOpen(menu.hasAttribute('hidden'));\n });\n menu.querySelectorAll('[data-locale-value]').forEach(function(item) {\n item.addEventListener('click', function() {\n var next = __anNormalizeAuthLocalePreference(item.getAttribute('data-locale-value')) || 'system';\n __anWriteAuthLocalePreference(next);\n __anApplyAuthLocale(next);\n __anSetAuthLocaleMenuOpen(false);\n trigger.focus();\n });\n });\n document.addEventListener('click', function(event) {\n var picker = document.querySelector('.locale-picker');\n if (picker && picker.contains(event.target)) return;\n __anSetAuthLocaleMenuOpen(false);\n });\n document.addEventListener('keydown', function(event) {\n if (event.key === 'Escape') __anSetAuthLocaleMenuOpen(false);\n });\n })();\n var __AN_PUBLIC_OAUTH_ORIGIN = ${JSON.stringify(publicOAuthOrigin)};\n var __AN_WORKSPACE_GATEWAY_RETURN_ORIGIN = ${JSON.stringify(workspaceGatewayReturnOrigin)};\n var __AN_GOOGLE_AUTH_MODE = ${JSON.stringify(googleAuthMode)};\n function __anConfiguredOAuthOrigin() {\n if (!__AN_PUBLIC_OAUTH_ORIGIN) return '';\n try {\n var origin = new URL(__AN_PUBLIC_OAUTH_ORIGIN).origin;\n return origin && origin !== window.location.origin ? origin : '';\n } catch(e) {\n return '';\n }\n }\n function __anAuthPath(path) {\n var origin = __anIsBuilderPreview() ? __anConfiguredOAuthOrigin() : '';\n return origin ? origin + path : __anPath(path);\n }\n function __anGoogleAuthUrlPath() {\n return __anIsBuilderPreview()\n ? __anAuthPath('/_agent-native/google/auth-url')\n : __anPath('/_agent-native/google/auth-url');\n }\n function __anBuilderPreviewReturnOrigin() {\n var candidates = [window.location.href, document.referrer || ''];\n try {\n if (window.location.ancestorOrigins) {\n for (var j = 0; j < window.location.ancestorOrigins.length; j++) {\n candidates.push(window.location.ancestorOrigins[j]);\n }\n }\n } catch(e) {}\n for (var i = 0; i < candidates.length; i++) {\n try {\n var url = new URL(candidates[i]);\n var host = url.hostname.toLowerCase();\n var isPreviewHost =\n host === 'builderio.xyz' || host.slice(-14) === '.builderio.xyz' ||\n host === 'builderio.dev' || host.slice(-14) === '.builderio.dev' ||\n host === 'builder.codes' || host.slice(-14) === '.builder.codes' ||\n host === 'builder.my' || host.slice(-11) === '.builder.my';\n if (url.protocol === 'https:' && isPreviewHost) return url.origin;\n } catch(e) {}\n }\n return '';\n }\n function __anWorkspaceGatewayReturnOrigin() {\n var previewOrigin = __anBuilderPreviewReturnOrigin();\n if (previewOrigin) return previewOrigin;\n if (__AN_WORKSPACE_GATEWAY_RETURN_ORIGIN) return __AN_WORKSPACE_GATEWAY_RETURN_ORIGIN;\n return __anIsBuilderDesktop() ? 'http://127.0.0.1:8080' : '';\n }\n function __anNormalizeWorkspaceReturnPath(ret) {\n try {\n var url = new URL(ret || '/', window.location.origin);\n var path = url.pathname || '/';\n if (path === '/dispatch/dispatch') {\n path = '/dispatch';\n } else if (path.indexOf('/dispatch/') === 0) {\n var rest = path.slice('/dispatch/'.length);\n var first = rest.split('/')[0];\n var dispatchRoutes = {\n overview: true, apps: true, metrics: true, vault: true,\n integrations: true, messaging: true, workspace: true,\n agents: true, destinations: true, identities: true,\n approvals: true, audit: true, team: true, 'thread-debug': true,\n 'new-app': true\n };\n if (first === 'dispatch') {\n path = '/dispatch' + rest.slice(first.length);\n } else if (first && !dispatchRoutes[first]) {\n path = '/' + rest;\n }\n }\n return path + url.search + url.hash;\n } catch(e) {\n return ret || '/';\n }\n }\n function __anOAuthReturnTarget(ret) {\n var path = __anNormalizeWorkspaceReturnPath(ret);\n var origin = __anWorkspaceGatewayReturnOrigin();\n return origin ? origin + path : path;\n }\n function __anSessionBridgeUrl(ret, sessionToken) {\n try {\n var url = new URL(ret || window.location.pathname + window.location.search, window.location.origin);\n url.searchParams.set('_session', sessionToken);\n return url.pathname + url.search + url.hash;\n } catch(e) {\n var sep = (ret || '/').indexOf('?') === -1 ? '?' : '&';\n return (ret || '/') + sep + '_session=' + encodeURIComponent(sessionToken);\n }\n }\n function __anFinishOAuthExchange(ret, flowId, sessionToken) {\n __anGoogleSignInInFlight = false;\n if (__anIsBuilderPreview()) {\n if (sessionToken) {\n __anSetOAuthDebug('OAuth exchange redeemed; applying session bridge to embedded app', flowId);\n window.location.replace(__anSessionBridgeUrl(ret, sessionToken));\n return;\n }\n __anSetOAuthDebug('OAuth exchange redeemed; reloading the embedded app', flowId);\n window.location.reload();\n return;\n }\n __anSetOAuthDebug('OAuth exchange redeemed; returning to the app', flowId);\n __anRedirectToSignedInApp(ret);\n }\n function __anRedirectToSignedInApp(ret) {\n window.location.replace(ret || __anResumeHref());\n }\n function __anMaybeRedirectSignedIn(ret) {\n return fetch(__anPath('/_agent-native/auth/session'), {\n headers: { 'Accept': 'application/json' },\n credentials: 'include',\n cache: 'no-store',\n }).then(function(res) {\n if (!res.ok) return null;\n return res.json().catch(function() { return null; });\n }).then(function(data) {\n if (data && data.email && !data.error) {\n __anRedirectToSignedInApp(ret);\n return true;\n }\n return false;\n }).catch(function() {\n return false;\n });\n }\n${identitySsoScript}\n\t (function __anRedirectIfAlreadySignedIn() {\n\t __anMaybeRedirectSignedIn();\n\t })();\n\t function __anSafeAttributionValue(value) {\n\t return typeof value === 'string' ? value.trim().slice(0, 120) : '';\n\t }\n\t function __anFirstTouchCookiePresent() {\n\t try {\n\t return document.cookie.split(';').some(function(part) {\n\t return part.trim().indexOf('an_ft=') === 0;\n\t });\n\t } catch(e) {\n\t return false;\n\t }\n\t }\n\t function __anWriteFirstTouchCookie(json) {\n\t try {\n\t document.cookie = 'an_ft=' + encodeURIComponent(json) + '; path=/; max-age=2592000; SameSite=Lax';\n\t } catch(e) {}\n\t }\n\t function __anExternalReferrerHost(referrer) {\n\t try {\n\t var url = new URL(referrer);\n\t if (url.host.toLowerCase() === window.location.host.toLowerCase()) return '';\n\t return __anSafeAttributionValue(url.host);\n\t } catch(e) {\n\t return '';\n\t }\n\t }\n\t function __anCaptureSignupAttribution() {\n\t try {\n\t var stored = '';\n\t try { stored = localStorage.getItem('an_attribution') || ''; } catch(e) {}\n\t if (stored) {\n\t if (!__anFirstTouchCookiePresent()) __anWriteFirstTouchCookie(stored);\n\t return;\n\t }\n\t if (__anFirstTouchCookiePresent()) return;\n\t var params = new URLSearchParams(window.location.search || '');\n\t var ft = {};\n\t ['ref', 'via', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach(function(key) {\n\t var value = __anSafeAttributionValue(params.get(key));\n\t if (value) ft[key] = value;\n\t });\n\t var returnPath = __anJourney.normalizeAppPath(params.get('return'));\n\t var landingPath = __anSafeAttributionValue(returnPath || window.location.pathname || '');\n\t if (landingPath) ft.landing_path = landingPath;\n\t var referrer = __anExternalReferrerHost(document.referrer || '');\n\t if (referrer) ft.landing_referrer = referrer;\n\t ft.landed_at = new Date().toISOString();\n\t var json = JSON.stringify(ft);\n\t try { localStorage.setItem('an_attribution', json); } catch(e) {}\n\t __anWriteFirstTouchCookie(json);\n\t } catch(e) {}\n\t }\n\t __anCaptureSignupAttribution();\n\t var __anBuilderPreviewSeen = false;\n function __anRememberBuilderPreview() {\n __anBuilderPreviewSeen = true;\n try { sessionStorage.setItem('__an_builder_preview_seen', '1'); } catch(e) {}\n }\n function __anHasBuilderPreviewSignal() {\n try {\n var params = new URLSearchParams(window.location.search);\n if (params.has('builder.preview') || params.has('builder.frameEditing') || params.has('__builder_editing__')) return true;\n } catch(e) {}\n return false;\n }\n function __anIsBuilderPreview() {\n if (__anBuilderPreviewSeen) return true;\n if (__anHasBuilderPreviewSignal()) {\n __anRememberBuilderPreview();\n return true;\n }\n try {\n if (sessionStorage.getItem('__an_builder_preview_seen') === '1') {\n __anBuilderPreviewSeen = true;\n return true;\n }\n } catch(e) {}\n try {\n var ref = document.referrer || '';\n var fromBuilder = ref.indexOf('builder.io') !== -1 || ref.indexOf('builder.my') !== -1 || ref.indexOf('builderio.xyz') !== -1 || ref.indexOf('builderio.dev') !== -1 || ref.indexOf('builder.codes') !== -1;\n if (fromBuilder) __anRememberBuilderPreview();\n return fromBuilder;\n } catch(e) {\n return false;\n }\n }\n __anIsBuilderPreview();\n function __anIsBuilderDesktop() {\n try {\n var ua = navigator.userAgent || '';\n return ua.indexOf('Electron') !== -1 && ua.indexOf('AgentNativeDesktop') === -1;\n } catch(e) {\n return false;\n }\n }\n function __anIsAgentNativeDesktop() {\n try {\n return (navigator.userAgent || '').indexOf('AgentNativeDesktop') !== -1;\n } catch(e) {\n return false;\n }\n }\n function __anIsInFrame() {\n try {\n return window.self !== window.top;\n } catch(e) {\n return true;\n }\n }\n function __anIsElectron() {\n try {\n return (navigator.userAgent || '').indexOf('Electron') !== -1;\n } catch(e) {\n return false;\n }\n }\n function __anResolveAuthFlow() {\n if (__anIsBuilderPreview()) return __anIsInFrame() ? 'popup' : 'redirect';\n // Per-session override for ad-hoc testing outside Builder: append\n // ?authMode=popup or ?authMode=redirect to the sign-in URL.\n try {\n var qp = new URLSearchParams(window.location.search).get('authMode');\n if (qp === 'popup' || qp === 'redirect') return qp;\n } catch(e) {}\n var mode = __AN_GOOGLE_AUTH_MODE || 'auto';\n if (mode === 'popup') return 'popup';\n if (mode === 'redirect') return 'redirect';\n return __anIsAgentNativeDesktop() ? 'redirect' : 'popup';\n }\n var __anOAuthPollTimer = null;\n var __anOAuthPollCount = 0;\n var __anGoogleSignInInFlight = false;\n var __anGoogleRecoverBound = false;\n function __anNewOAuthFlowId() {\n try {\n if (window.crypto && typeof window.crypto.randomUUID === 'function') {\n return window.crypto.randomUUID();\n }\n } catch(e) {}\n return 'builder-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2);\n }\n function __anFlowDebugId(flowId) {\n return flowId ? String(flowId).slice(-10) : '';\n }\n function __anSetOAuthDebug(message, flowId) {\n var text = message + (flowId ? ' (flow ' + __anFlowDebugId(flowId) + ')' : '');\n try {\n console.info('[agent-native][google-oauth] ' + text);\n } catch(e) {}\n // Only surface the debug overlay when explicitly opted in via #oauth-debug\n // hash or ?oauth_debug=1 query — otherwise it leaks raw flow IDs and\n // diagnostic strings into the user-facing sign-in screen.\n var showDebugOverlay = false;\n try {\n var loc = window.location || {};\n showDebugOverlay =\n (typeof loc.hash === 'string' && loc.hash.indexOf('oauth-debug') !== -1) ||\n (typeof loc.search === 'string' && loc.search.indexOf('oauth_debug=1') !== -1);\n } catch(e) {}\n var debug = document.getElementById('google-debug');\n if (debug) {\n debug.textContent = text;\n if (showDebugOverlay) debug.classList.add('show');\n }\n }\n function __anShowOAuthError(err, btn, message) {\n if (__anOAuthPollTimer) {\n clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = null;\n }\n err.textContent = message;\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n function __anRecoverGoogleSignInAfterReturn() {\n // The user left for the Google sign-in window and came back. If the flow\n // never completed (e.g. they closed the window to switch profiles), the\n // button is stuck disabled with no error path firing for up to 5 minutes.\n // Re-enable it so they can retry. Wait briefly first so a genuinely\n // in-flight exchange can still finish and navigate without a flicker.\n if (!__anGoogleSignInInFlight) return;\n setTimeout(function() {\n __anMaybeRedirectSignedIn(__anResumeHref()).then(function(redirected) {\n if (redirected) return;\n if (!__anGoogleSignInInFlight) return;\n var btn = document.getElementById('google-btn');\n if (!btn || !btn.disabled) return;\n // Keep the desktop-exchange poll alive. Agent Native Desktop opens\n // Google in the system browser, so focus can return before the\n // callback has stored the session token.\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n });\n }, 1200);\n }\n function __anBindGoogleRecover() {\n if (__anGoogleRecoverBound) return;\n __anGoogleRecoverBound = true;\n window.addEventListener('focus', __anRecoverGoogleSignInAfterReturn);\n document.addEventListener('visibilitychange', function() {\n if (document.visibilityState === 'visible') __anRecoverGoogleSignInAfterReturn();\n });\n }\n function __anHandlePopupOAuthFailure(ret, btn, err, flowId, redirectReason, builderFrameMessage) {\n if (__anIsBuilderPreview() && __anIsInFrame()) {\n __anShowOAuthError(err, btn, builderFrameMessage + ' ' + __anT('googlePopupHelp') + ' (flow ' + __anFlowDebugId(flowId) + ').');\n return;\n }\n __anStartRedirectOAuth(ret, btn, err, flowId, redirectReason);\n }\n function __anStartRedirectOAuth(ret, btn, err, flowId, reason) {\n var params = new URLSearchParams();\n var oauthReturn = __anIsBuilderPreview() ? __anOAuthReturnTarget(ret) : ret;\n if (oauthReturn) params.set('return', oauthReturn);\n params.set('redirect', '1');\n __anSetOAuthDebug(reason || 'Opening Google sign-in redirect', flowId);\n try {\n __anOpenOAuthUrl(__anGoogleAuthUrlPath() + '?' + params.toString());\n } catch(e) {\n __anShowOAuthError(err, btn, 'Could not start Google sign-in redirect' + (flowId ? ' for flow ' + __anFlowDebugId(flowId) : '') + ': ' + (e && e.message ? e.message : 'unknown error'));\n }\n }\n function __anWaitForOAuthExchange(flowId, ret, btn, err) {\n var started = Date.now();\n var timeoutMs = 5 * 60 * 1000;\n __anOAuthPollCount = 0;\n async function check() {\n __anOAuthPollCount++;\n try {\n var res = await fetch(__anPath('/_agent-native/auth/desktop-exchange') + '?flow_id=' + encodeURIComponent(flowId), { credentials: 'include' });\n var data = await res.json().catch(function() { return {}; });\n if (data && (data.email || data.token)) {\n if (__anOAuthPollTimer) clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = null;\n __anFinishOAuthExchange(ret, flowId, data.token);\n return;\n }\n if (data && data.error) {\n __anSetOAuthDebug('OAuth exchange returned an error: ' + (data.message || data.error), flowId);\n __anShowOAuthError(err, btn, data.message || data.error);\n return;\n }\n if (data && data.pending && (__anOAuthPollCount === 1 || __anOAuthPollCount % 5 === 0)) {\n __anSetOAuthDebug('Waiting for the Google callback; polling attempt ' + __anOAuthPollCount, flowId);\n }\n } catch(e) {\n if (__anOAuthPollCount === 1 || __anOAuthPollCount % 5 === 0) {\n __anSetOAuthDebug('Could not reach the OAuth exchange endpoint: ' + (e && e.message ? e.message : 'network error'), flowId);\n }\n }\n if (Date.now() - started > timeoutMs) {\n __anShowOAuthError(err, btn, __anT('googleNeverFinished') + ' Flow ' + __anFlowDebugId(flowId) + '.');\n }\n }\n if (__anOAuthPollTimer) clearInterval(__anOAuthPollTimer);\n __anOAuthPollTimer = setInterval(check, 1000);\n setTimeout(check, 500);\n }\n function __anStartPopupOAuth(ret, btn, err) {\n var flowId = __anNewOAuthFlowId();\n var oauthReturn = __anIsBuilderPreview() ? __anOAuthReturnTarget(ret) : ret;\n var params = new URLSearchParams();\n if (oauthReturn) params.set('return', oauthReturn);\n params.set('desktop', '1');\n params.set('flow_id', flowId);\n params.set('redirect', '1');\n var url = __anGoogleAuthUrlPath() + '?' + params.toString();\n try { sessionStorage.setItem('__an_signin', '1'); } catch(e) {}\n __anSetOAuthDebug('Opening Google sign-in popup', flowId);\n try {\n var popup = window.open('', '_blank', 'width=640,height=760');\n if (!popup) {\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Google popup was blocked; falling back to redirect', 'Google popup was blocked.');\n return;\n }\n try { popup.opener = null; } catch(e) {}\n try {\n popup.location.href = url;\n } catch(e) {\n try { popup.close(); } catch(closeErr) {}\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Could not navigate Google popup; falling back to redirect', 'Could not navigate Google popup.');\n return;\n }\n __anSetOAuthDebug('Google popup opened; waiting for callback', flowId);\n } catch(e) {\n __anHandlePopupOAuthFailure(ret, btn, err, flowId, 'Could not open Google popup; falling back to redirect', 'Could not open Google popup.');\n return;\n }\n __anWaitForOAuthExchange(flowId, ret, btn, err);\n }\n function __anStartNativeDesktopOAuth(ret, btn, err) {\n var flowId = __anNewOAuthFlowId();\n var params = new URLSearchParams();\n if (ret) params.set('return', ret);\n params.set('desktop', '1');\n params.set('flow_id', flowId);\n params.set('redirect', '1');\n var url = __anGoogleAuthUrlPath() + '?' + params.toString();\n __anSetOAuthDebug('Opening Google sign-in in system browser', flowId);\n __anOpenOAuthUrl(url);\n __anWaitForOAuthExchange(flowId, ret, btn, err);\n }\n function __anOpenOAuthUrl(url) {\n try { sessionStorage.setItem('__an_signin', '1'); } catch(e) {}\n window.location.href = url;\n }\n (function revealLocalNote() {\n var h = location.hostname;\n if (h === 'localhost' || h === '127.0.0.1' || h === '::1' || h.endsWith('.local')) {\n var n = document.getElementById('local-note');\n if (n) n.classList.add('show');\n }\n })();\n (function revealUpgradeNote() {\n var shouldShow = false;\n try {\n var params = new URLSearchParams(location.search);\n shouldShow = params.get('signin') === '1' || params.get('upgrade-from-local') === '1';\n } catch(e) {}\n if (!shouldShow) {\n try { shouldShow = localStorage.getItem('an_migrate_from_local') === '1'; } catch(e) {}\n }\n if (!shouldShow) return;\n var n = document.getElementById('upgrade-note');\n if (!n) return;\n n.textContent = n.getAttribute('data-upgrade-copy') || __anT('migrateLocalFallback');\n n.classList.add('show');\n })();\n${\n googleOnly\n ? \"\"\n : ` var TAB_STORAGE_KEY = 'an.onboarding.tab';\n var tabs = document.querySelectorAll('.tab');\n var forms = document.querySelectorAll('.form');\n\t var pendingSignupEmail = '';\n\t var pendingSignupPassword = '';\n\t var verificationCheckInFlight = false;\n\t var RESEND_VERIFICATION_COOLDOWN_SECONDS = 60;\n\t var resendVerificationCooldownUntil = 0;\n\t var resendVerificationCooldownTimer = null;\n\t function setActiveTab(name, opts) {\n\t if (name !== 'signup' && name !== 'login') return;\n\t var form = document.getElementById(name + '-form');\n\t if (!form) return;\n var card = document.querySelector('.card');\n if (card) card.classList.remove('verifying');\n tabs.forEach(function(x) { x.classList.remove('active'); });\n forms.forEach(function(x) { x.classList.remove('active'); });\n var btn = document.querySelector('.tab[data-tab=\"' + name + '\"]');\n if (btn) btn.classList.add('active');\n form.classList.add('active');\n __anSetAuthView(name);\n if (opts && opts.persist) {\n try { localStorage.setItem(TAB_STORAGE_KEY, name); } catch (e) {}\n }\n }\n function showVerificationStep(email, password) {\n pendingSignupEmail = email || '';\n pendingSignupPassword = password || '';\n tabs.forEach(function(x) { x.classList.remove('active'); });\n forms.forEach(function(x) { x.classList.remove('active'); });\n var card = document.querySelector('.card');\n if (card) card.classList.add('verifying');\n var step = document.getElementById('verification-step');\n if (step) step.classList.add('active');\n var emailNode = document.getElementById('verify-email');\n if (emailNode) emailNode.textContent = pendingSignupEmail;\n __anSetAuthView('verification');\n var msg = document.getElementById('verify-msg');\n if (msg) {\n msg.classList.remove('show', 'error', 'success');\n msg.textContent = '';\n }\n try { localStorage.setItem(TAB_STORAGE_KEY, 'signup'); } catch (e) {}\n }\n function getVerificationMessageNode() {\n var verifyStep = document.getElementById('verification-step');\n if (verifyStep && verifyStep.classList.contains('active')) {\n return document.getElementById('verify-msg');\n }\n return document.getElementById('l-msg') || document.getElementById('verify-msg');\n }\n function isVerificationStepActive() {\n var verifyStep = document.getElementById('verification-step');\n return !!(verifyStep && verifyStep.classList.contains('active'));\n }\n function getPendingSignupEmail() {\n var signupEmail = document.getElementById('s-email');\n var loginEmail = document.getElementById('l-email');\n return (pendingSignupEmail || (signupEmail && signupEmail.value) || (loginEmail && loginEmail.value) || '').trim();\n }\n function getPendingSignupPassword() {\n var signupPassword = document.getElementById('s-pass');\n return pendingSignupPassword || (signupPassword && signupPassword.value) || '';\n }\n function __anNormalizeAuthEmail(value) {\n return String(value || '').trim().toLowerCase();\n }\n\t function __anIsValidAuthEmail(value) {\n\t return /^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(__anNormalizeAuthEmail(value));\n\t }\n\t function __anIsVerifiedRedirectSuccess() {\n\t try {\n\t var params = new URLSearchParams(location.search);\n\t return params.has('verified') && !params.has('error');\n\t } catch (e) {\n\t return false;\n\t }\n\t }\n\t function __anShowEmailValidationError(input, msg) {\n\t if (msg) {\n\t msg.textContent = __anT('invalidEmail');\n\t msg.classList.add('show', 'error');\n }\n if (input && typeof input.focus === 'function') input.focus();\n }\n function movePendingSignupToLogin(message) {\n var email = getPendingSignupEmail();\n setActiveTab('login', { persist: true });\n var loginEmail = document.getElementById('l-email');\n var loginPassword = document.getElementById('l-pass');\n var msg = document.getElementById('l-msg');\n if (loginEmail && email) loginEmail.value = email;\n if (msg) {\n msg.textContent = message || __anT('signInToContinue');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n setTimeout(function() { if (loginPassword) loginPassword.focus(); }, 0);\n }\n async function signInWithPendingSignup() {\n var email = getPendingSignupEmail();\n var password = getPendingSignupPassword();\n if (!email || !password) {\n return { ok: false, needsManualSignIn: true };\n }\n var res = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, password: password }),\n });\n if (res.ok) {\n __anRedirectToSignedInApp();\n return { ok: true };\n }\n var data = await res.json().catch(function() { return {}; });\n var error = (data && (data.error || data.message)) || __anT('finishSignInFailed');\n return {\n ok: false,\n error: error,\n isWaitingForVerification: /not verified|verification/i.test(error),\n };\n }\n async function checkVerificationSession(fallbackText, opts) {\n opts = opts || {};\n if (verificationCheckInFlight) return;\n verificationCheckInFlight = true;\n var msg = getVerificationMessageNode();\n var continueBtn = document.getElementById('verify-continue');\n if (continueBtn && !opts.silent) {\n continueBtn.disabled = true;\n continueBtn.textContent = __anT('checking');\n }\n if (msg && !opts.silent) {\n msg.textContent = __anT('checkingVerification');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n try {\n var res = await fetch(__anPath('/_agent-native/auth/session'), {\n headers: { 'Accept': 'application/json' },\n });\n var data = await res.json().catch(function() { return {}; });\n if (res.ok && data && data.email && !data.error) {\n __anRedirectToSignedInApp();\n return;\n }\n var loginResult = await signInWithPendingSignup();\n if (loginResult.ok) return;\n if (loginResult.needsManualSignIn) {\n if (!opts.silent) {\n movePendingSignupToLogin(fallbackText || __anT('enterPasswordAfterVerification'));\n }\n return;\n }\n if (loginResult.error && !loginResult.isWaitingForVerification) {\n if (!opts.silent) {\n movePendingSignupToLogin(__anT('finishSignInManually'));\n }\n return;\n }\n if (msg && !opts.silent) {\n msg.textContent = fallbackText || __anT('stillWaitingVerification');\n msg.classList.remove('success');\n msg.classList.add('show', 'error');\n }\n } catch (err) {\n if (msg && !opts.silent) {\n msg.textContent = __anT('checkVerificationFailed');\n msg.classList.remove('success');\n msg.classList.add('show', 'error');\n }\n } finally {\n verificationCheckInFlight = false;\n if (continueBtn && !opts.silent) {\n continueBtn.disabled = false;\n continueBtn.textContent = __anT('continue');\n }\n }\n }\n\t function maybeCompleteVerificationAfterReturn() {\n\t if (!isVerificationStepActive()) return;\n\t checkVerificationSession(null, { silent: true });\n\t }\n\t function updateResendVerificationCooldown() {\n\t var btn = document.getElementById('resend-verification');\n\t if (!btn) return;\n\t var remaining = Math.ceil((resendVerificationCooldownUntil - Date.now()) / 1000);\n\t if (remaining > 0) {\n\t btn.disabled = true;\n\t btn.textContent = __anT('resendEmail') + ' (' + remaining + 's)';\n\t return;\n\t }\n\t if (resendVerificationCooldownTimer) {\n\t clearInterval(resendVerificationCooldownTimer);\n\t resendVerificationCooldownTimer = null;\n\t }\n\t resendVerificationCooldownUntil = 0;\n\t btn.disabled = false;\n\t btn.textContent = __anT('resendEmail');\n\t }\n\t function startResendVerificationCooldown(seconds) {\n\t resendVerificationCooldownUntil = Date.now() + seconds * 1000;\n\t updateResendVerificationCooldown();\n\t if (resendVerificationCooldownTimer) clearInterval(resendVerificationCooldownTimer);\n\t resendVerificationCooldownTimer = setInterval(updateResendVerificationCooldown, 1000);\n\t }\n\t async function resendVerificationEmail() {\n\t var btn = document.getElementById('resend-verification');\n\t var msg = document.getElementById('verify-msg');\n\t var email = pendingSignupEmail || document.getElementById('s-email').value;\n\t if (!email) return;\n\t if (resendVerificationCooldownUntil > Date.now()) {\n\t updateResendVerificationCooldown();\n\t return;\n\t }\n\t var original = btn ? btn.textContent : '';\n\t if (btn) {\n\t btn.disabled = true;\n\t btn.textContent = __anT('sending');\n }\n if (msg) msg.classList.remove('show', 'error', 'success');\n try {\n var res = await fetch(__anPath('/_agent-native/auth/ba/send-verification-email'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, callbackURL: __anResumeHref() }),\n });\n if (res.ok) {\n\t if (msg) {\n\t msg.textContent = __anT('sentVerification');\n\t msg.classList.add('show', 'success');\n\t }\n\t startResendVerificationCooldown(RESEND_VERIFICATION_COOLDOWN_SECONDS);\n\t return;\n\t }\n\t var data = await res.json().catch(function() { return {}; });\n\t if (msg) {\n msg.textContent = (data && (data.message || data.error)) || __anT('resendVerificationFailed');\n msg.classList.add('show', 'error');\n }\n if (btn) {\n btn.disabled = false;\n btn.textContent = original;\n }\n } catch (err) {\n if (msg) {\n msg.textContent = __anT('networkErrorRetry');\n msg.classList.add('show', 'error');\n }\n if (btn) {\n btn.disabled = false;\n btn.textContent = original;\n }\n }\n }\n (function initActiveTab() {\n var initial = 'signup';\n try {\n var params = new URLSearchParams(location.search);\n var qp = params.get('tab');\n var path = location.pathname;\n while (path.length > 1 && path.charAt(path.length - 1) === '/') path = path.slice(0, -1);\n if (qp === 'login' || qp === 'signup') {\n initial = qp;\n\t } else if (__anIsVerifiedRedirectSuccess()) {\n\t initial = 'login';\n\t } else if (path === '/login' || path.endsWith('/login')) {\n initial = 'login';\n } else if (path === '/signup' || path.endsWith('/signup')) {\n initial = 'signup';\n } else {\n var stored = localStorage.getItem(TAB_STORAGE_KEY);\n if (stored === 'login' || stored === 'signup') initial = stored;\n }\n } catch (e) {}\n setActiveTab(initial, { persist: false });\n\t try {\n\t if (__anIsVerifiedRedirectSuccess()) {\n\t var msg = document.getElementById('l-msg');\n if (msg) {\n msg.textContent = __anT('emailVerifiedFinishing');\n msg.classList.remove('error');\n msg.classList.add('show', 'success');\n }\n checkVerificationSession(__anT('emailVerifiedSignIn'));\n }\n } catch (e) {}\n })();\n tabs.forEach(function(t) { t.addEventListener('click', function() {\n setActiveTab(t.dataset.tab, { persist: true });\n }); });\n\n document.getElementById('signup-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var form = e.currentTarget;\n var btn = form.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('s-msg');\n msg.classList.remove('show', 'error', 'success');\n var pass = document.getElementById('s-pass').value;\n var pass2 = document.getElementById('s-pass2').value;\n if (pass !== pass2) {\n msg.textContent = __anT('passwordsMismatch');\n msg.classList.add('show', 'error');\n return;\n }\n var originalLabel = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('creatingAccount');\n try {\n var emailInput = document.getElementById('s-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = originalLabel;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/register'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email: email,\n password: pass,\n callbackURL: __anResumeHref(),\n }),\n });\n var data = await res.json().catch(function() { return {}; });\n if (res.ok) {\n // If email verification is required, the server won't return a session.\n // Try logging in — if it fails (unverified), show a \"check your email\" message.\n var loginRes = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email, password: pass }),\n });\n if (loginRes.ok) {\n msg.textContent = __anT('accountCreatedSigningIn');\n msg.classList.add('show', 'success');\n __anRedirectToSignedInApp();\n return;\n }\n btn.disabled = false;\n btn.textContent = originalLabel;\n showVerificationStep(email, pass);\n return;\n }\n msg.textContent = data.error || __anT('registrationFailed');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = originalLabel;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = originalLabel;\n }\n });\n\n var verifyContinue = document.getElementById('verify-continue');\n if (verifyContinue) verifyContinue.addEventListener('click', function(e) {\n e.preventDefault();\n checkVerificationSession();\n });\n window.addEventListener('focus', maybeCompleteVerificationAfterReturn);\n document.addEventListener('visibilitychange', function() {\n if (document.visibilityState === 'visible') maybeCompleteVerificationAfterReturn();\n });\n var resendBtn = document.getElementById('resend-verification');\n if (resendBtn) resendBtn.addEventListener('click', function(e) {\n e.preventDefault();\n resendVerificationEmail();\n });\n var backToSignup = document.getElementById('back-to-signup');\n if (backToSignup) backToSignup.addEventListener('click', function(e) {\n e.preventDefault();\n setActiveTab('signup', { persist: true });\n var email = document.getElementById('s-email');\n setTimeout(function() { if (email) email.focus(); }, 0);\n });\n\n var forgotLink = document.getElementById('forgot-link');\n var backToLogin = document.getElementById('back-to-login');\n if (forgotLink) forgotLink.addEventListener('click', function(e) {\n e.preventDefault();\n document.getElementById('login-form').classList.remove('active');\n document.getElementById('forgot-form').classList.add('active');\n __anSetAuthView('forgot');\n var fEmail = document.getElementById('f-email');\n var lEmail = document.getElementById('l-email');\n if (lEmail && lEmail.value) fEmail.value = lEmail.value;\n setTimeout(function() { fEmail.focus(); }, 0);\n });\n if (backToLogin) backToLogin.addEventListener('click', function(e) {\n e.preventDefault();\n document.getElementById('forgot-form').classList.remove('active');\n document.getElementById('login-form').classList.add('active');\n __anSetAuthView('login');\n });\n\n var forgotForm = document.getElementById('forgot-form');\n if (forgotForm) forgotForm.addEventListener('submit', async function(e) {\n e.preventDefault();\n var btn = e.currentTarget.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('f-msg');\n msg.classList.remove('show', 'error', 'success');\n var original = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('sending');\n try {\n var emailInput = document.getElementById('f-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = original;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/ba/request-password-reset'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email }),\n });\n if (res.ok) {\n msg.textContent = __anT('resetEmailSent');\n msg.classList.add('show', 'success');\n btn.textContent = __anT('sent');\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = (data && (data.message || data.error)) || __anT('resetEmailFailed');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n }\n });\n\n document.getElementById('login-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var form = e.currentTarget;\n var btn = form.querySelector('button[type=\"submit\"]');\n var msg = document.getElementById('l-msg');\n msg.classList.remove('show', 'success');\n msg.classList.add('error');\n var originalLabel = btn.textContent;\n btn.disabled = true;\n btn.textContent = __anT('signingIn');\n try {\n var emailInput = document.getElementById('l-email');\n var email = __anNormalizeAuthEmail(emailInput && emailInput.value);\n if (!__anIsValidAuthEmail(email)) {\n btn.disabled = false;\n btn.textContent = originalLabel;\n __anShowEmailValidationError(emailInput, msg);\n return;\n }\n var res = await fetch(__anPath('/_agent-native/auth/login'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n email: email,\n password: document.getElementById('l-pass').value,\n }),\n });\n if (res.ok) {\n __anRedirectToSignedInApp();\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = data.error || __anT('invalidLogin');\n msg.classList.add('show');\n btn.disabled = false;\n btn.textContent = originalLabel;\n } catch (err) {\n msg.textContent = __anT('networkErrorDashRetry');\n msg.classList.add('show');\n btn.disabled = false;\n btn.textContent = originalLabel;\n }\n });\n`\n}\n${\n renderGoogleButton\n ? `\n async function signInWithGoogle() {\n if (__anShouldShowGoogleNotice()) {\n __anShowGoogleNotice();\n return;\n }\n return __anStartGoogleSignIn();\n }\n async function __anStartGoogleSignIn() {\n var btn = document.getElementById('google-btn');\n var err = document.getElementById('google-err');\n var ret = __anResumeHref();\n btn.disabled = true;\n __anGoogleSignInInFlight = true;\n __anBindGoogleRecover();\n err.classList.remove('show');\n if (__anResolveAuthFlow() === 'popup') {\n __anStartPopupOAuth(ret, btn, err);\n return;\n }\n if (__anIsAgentNativeDesktop()) {\n __anStartNativeDesktopOAuth(ret, btn, err);\n return;\n }\n if (__anIsBuilderPreview()) {\n var flowId = __anNewOAuthFlowId();\n __anStartRedirectOAuth(ret, btn, err, flowId, 'Opening Google sign-in redirect from Builder preview');\n return;\n }\n try {\n var authUrl = __anGoogleAuthUrlPath() + '?return=' + encodeURIComponent(ret);\n var res = await fetch(authUrl);\n var data = await res.json();\n if (data.url) {\n __anOpenOAuthUrl(data.url);\n } else {\n err.textContent = data.message || __anT('googleNotConfigured');\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n } catch (e) {\n err.textContent = __anT('failedToConnect');\n err.classList.add('show');\n btn.disabled = false;\n __anGoogleSignInInFlight = false;\n }\n }`\n : \"\"\n}\n${\n googleSignInNotice\n ? `\n window.__anGoogleNoticeAccepted = false;\n function __anShouldShowGoogleNotice() {\n var notice = document.getElementById('google-preflight');\n if (!notice || window.__anGoogleNoticeAccepted) return false;\n var host = notice.getAttribute('data-host');\n return !host || window.location.hostname === host;\n }\n function __anSetGoogleNoticeOpen(open) {\n var notice = document.getElementById('google-preflight');\n var trigger = document.getElementById('google-btn');\n if (!notice) return;\n if (open) {\n notice.classList.add('show');\n if (trigger) trigger.setAttribute('aria-expanded', 'true');\n } else {\n notice.classList.remove('show');\n if (trigger) trigger.setAttribute('aria-expanded', 'false');\n }\n }\n function __anShowGoogleNotice() {\n var notice = document.getElementById('google-preflight');\n if (!notice) return;\n __anSetGoogleNoticeOpen(true);\n var continueBtn = document.getElementById('google-preflight-continue');\n if (continueBtn) continueBtn.focus();\n }\n function __anHideGoogleNotice() {\n __anSetGoogleNoticeOpen(false);\n }\n function __anChooseRunLocalFromGoogleNotice() {\n var panel = document.getElementById('google-preflight-run-local-panel');\n if (!panel) {\n __anHideGoogleNotice();\n return;\n }\n panel.removeAttribute('hidden');\n var copy = document.getElementById('copy-google-preflight-run-local');\n if (copy) copy.focus();\n }\n function __anAcceptGoogleNotice() {\n window.__anGoogleNoticeAccepted = true;\n __anHideGoogleNotice();\n __anStartGoogleSignIn();\n }\n (function __anInstallGoogleNoticeDismissal() {\n document.addEventListener('keydown', function(event) {\n if (event.key === 'Escape') __anHideGoogleNotice();\n });\n document.addEventListener('click', function(event) {\n var notice = document.getElementById('google-preflight');\n if (!notice || !notice.classList.contains('show')) return;\n var wrapper = document.getElementById('google-signin');\n if (wrapper && wrapper.contains(event.target)) return;\n __anHideGoogleNotice();\n });\n })();`\n : `\n function __anShouldShowGoogleNotice() { return false; }`\n}\n${starfieldScript}\n${\n runLocalCommand || signupLocalModeNote\n ? `\n function __anSetRunLocalCommandOpen(open) {\n var panel = document.getElementById('run-local-panel');\n var button = document.getElementById('run-local-button');\n if (!panel || !button) return;\n if (open) {\n panel.removeAttribute('hidden');\n } else {\n panel.setAttribute('hidden', '');\n }\n button.setAttribute('aria-expanded', String(open));\n }\n function __anToggleRunLocalCommand() {\n var panel = document.getElementById('run-local-panel');\n if (!panel) return;\n __anSetRunLocalCommandOpen(panel.hasAttribute('hidden'));\n }\n function __anCopyCommandFromPanel(panelId, buttonId) {\n var panel = document.getElementById(panelId);\n var button = document.getElementById(buttonId);\n if (!panel || !button) return;\n var command = panel.getAttribute('data-command') || '';\n var original = button.textContent || __anT('copyCommand');\n function markCopied() {\n button.textContent = __anT('copied');\n setTimeout(function() { button.textContent = original; }, 1600);\n }\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(command).then(markCopied).catch(function() {});\n }\n }\n function __anCopyRunLocalCommand() {\n __anCopyCommandFromPanel('run-local-panel', 'copy-run-local');\n }\n function __anCopySignupLocalModeCommand() {\n __anCopyCommandFromPanel('signup-local-mode-note', 'copy-signup-local-mode');\n }\n function __anCopyGoogleNoticeRunLocalCommand() {\n __anCopyCommandFromPanel('google-preflight-run-local-panel', 'copy-google-preflight-run-local');\n }`\n : \"\"\n}\n</script>\n</body>\n</html>`;\n}\n\n/** @deprecated Use getOnboardingHtml() instead */\nexport const ONBOARDING_HTML = getOnboardingHtml();\n\n/**\n * HTML for the password reset page — shown when the user clicks the link in\n * their reset email. Posts `{ newPassword, token }` to Better Auth's\n * `/reset-password` endpoint, then redirects to the login page.\n */\nexport function getResetPasswordHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>Reset password</title>\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"${withAppBasePath(\"/favicon.svg\")}\">\n<link rel=\"apple-touch-icon\" href=\"${withAppBasePath(\"/icon-180.svg\")}\">\n<style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 1rem; }\n .card { width: 100%; max-width: 400px; padding: 2rem; background: #141414; border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; }\n h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; color: #fff; }\n .subtitle { font-size: 0.8125rem; color: #888; margin-bottom: 1.5rem; }\n label { display: block; font-size: 0.8125rem; color: #888; margin-bottom: 0.375rem; }\n input { width: 100%; padding: 0.5rem 0.75rem; background: transparent; border: 1px solid rgba(255,255,255,0.12); border-radius: 6px; color: #e5e5e5; font-size: 0.875rem; outline: none; margin-bottom: 0.875rem; }\n input:focus { border-color: rgba(255,255,255,0.3); box-shadow: 0 0 0 1px rgba(255,255,255,0.1); }\n input::placeholder { color: #555; }\n button[type=\"submit\"] { width: 100%; margin-top: 0.25rem; padding: 0.5rem; background: #fff; color: #000; border: none; border-radius: 6px; font-size: 0.875rem; font-weight: 500; cursor: pointer; }\n button[type=\"submit\"]:hover { background: #e5e5e5; }\n button[type=\"submit\"]:disabled { opacity: 0.5; cursor: not-allowed; }\n .msg { margin-top: 0.75rem; font-size: 0.8125rem; display: none; }\n .msg.error { color: #f87171; }\n .msg.success { color: #33C4FF; }\n .msg.show { display: block; }\n .back { display: inline-block; margin-top: 1rem; font-size: 0.75rem; color: #888; text-decoration: none; }\n .back:hover { color: #bbb; }\n</style>\n</head>\n<body>\n<div class=\"card\">\n <h1>Choose a new password</h1>\n <p class=\"subtitle\">Set a new password for your account.</p>\n <form id=\"reset-form\">\n <label for=\"p1\">New password</label>\n <input id=\"p1\" type=\"password\" autocomplete=\"new-password\" autofocus placeholder=\"At least 8 characters\" required minlength=\"8\" />\n <label for=\"p2\">Confirm password</label>\n <input id=\"p2\" type=\"password\" autocomplete=\"new-password\" placeholder=\"Confirm password\" required minlength=\"8\" />\n <button type=\"submit\">Save new password</button>\n <p class=\"msg\" id=\"msg\"></p>\n </form>\n <a class=\"back\" id=\"back-link\" href=\"/\">Back to sign in</a>\n</div>\n<script>\n (function() {\n // Derive the app's base path so apps mounted under a prefix\n // (e.g. /mail, /calendar) get sent home instead of to the root domain.\n var RESET_PATH = '/_agent-native/auth/reset';\n var pathname = window.location.pathname;\n var idx = pathname.indexOf(RESET_PATH);\n var basePath = (idx >= 0 ? pathname.slice(0, idx) : '') || '';\n var homeHref = basePath + '/';\n var backLink = document.getElementById('back-link');\n if (backLink) backLink.setAttribute('href', homeHref);\n var params = new URLSearchParams(location.search);\n var token = params.get('token') || '';\n var msg = document.getElementById('msg');\n if (!token) {\n msg.textContent = 'Missing or invalid reset token. Request a new reset link.';\n msg.classList.add('show', 'error');\n document.getElementById('reset-form').style.display = 'none';\n return;\n }\n document.getElementById('reset-form').addEventListener('submit', async function(e) {\n e.preventDefault();\n var btn = e.currentTarget.querySelector('button[type=\"submit\"]');\n var p1 = document.getElementById('p1').value;\n var p2 = document.getElementById('p2').value;\n msg.classList.remove('show', 'error', 'success');\n if (p1 !== p2) {\n msg.textContent = 'Passwords do not match';\n msg.classList.add('show', 'error');\n return;\n }\n var original = btn.textContent;\n btn.disabled = true;\n btn.textContent = 'Saving…';\n try {\n var res = await fetch(basePath + '/_agent-native/auth/ba/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ newPassword: p1, token: token }),\n });\n if (res.ok) {\n msg.textContent = 'Password updated — redirecting to sign in…';\n msg.classList.add('show', 'success');\n setTimeout(function() { window.location.href = homeHref; }, 1200);\n return;\n }\n var data = await res.json().catch(function() { return {}; });\n msg.textContent = (data && (data.message || data.error)) || 'Reset failed. The link may have expired — request a new one.';\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n } catch (err) {\n msg.textContent = 'Network error — please try again';\n msg.classList.add('show', 'error');\n btn.disabled = false;\n btn.textContent = original;\n }\n });\n })();\n</script>\n</body>\n</html>`;\n}\n"]}
|