@elizaos/ui 2.0.3-beta.2 → 2.0.3-beta.4
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/App.d.ts +6 -1
- package/App.d.ts.map +1 -1
- package/App.js +250 -49
- package/agent-surface/AgentSurfaceContext.d.ts +1 -1
- package/agent-surface/AgentSurfaceContext.hooks.d.ts +2 -2
- package/agent-surface/__e2e__/real-view-fixture.d.ts +21 -0
- package/agent-surface/__e2e__/real-view-fixture.d.ts.map +1 -0
- package/agent-surface/__e2e__/real-view-fixture.js +54 -0
- package/agent-surface/capabilities.d.ts +2 -2
- package/agent-surface/components.d.ts +1 -1
- package/agent-surface/element-reporter.hooks.d.ts +1 -1
- package/agent-surface/index.d.ts +10 -10
- package/agent-surface/registry.d.ts +1 -1
- package/agent-surface/useAgentElement.d.ts +1 -1
- package/api/android-native-agent-transport.d.ts +1 -1
- package/api/client-agent.d.ts +16 -2
- package/api/client-agent.d.ts.map +1 -1
- package/api/client-agent.js +13 -3
- package/api/client-approvals.d.ts +16 -0
- package/api/client-approvals.d.ts.map +1 -0
- package/api/client-approvals.js +4 -0
- package/api/client-automations.d.ts +1 -1
- package/api/client-background.d.ts +15 -0
- package/api/client-background.d.ts.map +1 -0
- package/api/client-background.js +10 -0
- package/api/client-base.d.ts +13 -3
- package/api/client-base.d.ts.map +1 -1
- package/api/client-base.js +99 -6
- package/api/client-browser-workspace.d.ts +1 -1
- package/api/client-chat.d.ts +8 -3
- package/api/client-chat.d.ts.map +1 -1
- package/api/client-chat.js +13 -4
- package/api/client-cloud.d.ts +3 -3
- package/api/client-cloud.d.ts.map +1 -1
- package/api/client-cloud.js +19 -13
- package/api/client-files.d.ts +36 -0
- package/api/client-files.d.ts.map +1 -0
- package/api/client-files.js +19 -0
- package/api/client-local-inference.d.ts +52 -6
- package/api/client-local-inference.d.ts.map +1 -1
- package/api/client-local-inference.js +78 -5
- package/api/client-skills.d.ts +3 -3
- package/api/client-transcripts.d.ts +8 -0
- package/api/client-transcripts.d.ts.map +1 -1
- package/api/client-transcripts.js +6 -0
- package/api/client-types-chat.d.ts +53 -2
- package/api/client-types-chat.d.ts.map +1 -1
- package/api/client-types-cloud.d.ts +3 -151
- package/api/client-types-cloud.d.ts.map +1 -1
- package/api/client-types-config.d.ts +13 -6
- package/api/client-types-config.d.ts.map +1 -1
- package/api/client-types-core.d.ts +1 -1
- package/api/client-types-feed.d.ts +0 -14
- package/api/client-types-feed.d.ts.map +1 -1
- package/api/client-types.d.ts +8 -8
- package/api/client-wallet.d.ts +3 -3
- package/api/client-workflow.d.ts +1 -1
- package/api/client.d.ts +31 -27
- package/api/client.d.ts.map +1 -1
- package/api/client.js +3 -0
- package/api/desktop-http-transport.d.ts +1 -1
- package/api/desktop-http-transport.d.ts.map +1 -1
- package/api/desktop-http-transport.js +29 -1
- package/api/i18n-locale-client.d.ts +1 -1
- package/api/index.d.ts +2 -2
- package/api/ios-local-agent-kernel.d.ts +1 -1
- package/api/ios-local-agent-kernel.d.ts.map +1 -1
- package/api/ios-local-agent-kernel.js +97 -22
- package/api/ios-local-agent-transport.d.ts +1 -1
- package/api/ios-local-agent-transport.d.ts.map +1 -1
- package/api/ios-local-agent-transport.js +1 -7
- package/api/ittp-agent-transport.d.ts +1 -1
- package/api/native-cloud-http-transport.d.ts +1 -1
- package/api/native-cloud-http-transport.d.ts.map +1 -1
- package/api/native-cloud-http-transport.js +7 -0
- package/app-navigate-view.d.ts +1 -1
- package/app-navigate-view.d.ts.map +1 -1
- package/app-navigate-view.js +1 -4
- package/app-shell-components.d.ts +26 -27
- package/app-shell-components.d.ts.map +1 -1
- package/app-shell-components.js +3 -1
- package/app-shell-registry.d.ts +12 -1
- package/app-shell-registry.d.ts.map +1 -1
- package/backgrounds/AppBackground.d.ts +16 -0
- package/backgrounds/AppBackground.d.ts.map +1 -0
- package/backgrounds/AppBackground.js +30 -0
- package/backgrounds/ImageBackground.d.ts +12 -0
- package/backgrounds/ImageBackground.d.ts.map +1 -0
- package/backgrounds/ImageBackground.js +15 -0
- package/backgrounds/ShaderBackground.d.ts +12 -0
- package/backgrounds/ShaderBackground.d.ts.map +1 -0
- package/backgrounds/ShaderBackground.js +39 -0
- package/backgrounds/index.d.ts +7 -3
- package/backgrounds/index.d.ts.map +1 -1
- package/backgrounds/index.js +4 -0
- package/backgrounds/useBackgroundApplyChannel.d.ts +21 -0
- package/backgrounds/useBackgroundApplyChannel.d.ts.map +1 -0
- package/backgrounds/useBackgroundApplyChannel.js +53 -0
- package/bridge/capacitor-bridge.d.ts +1 -1
- package/bridge/index.d.ts +6 -6
- package/bridge/native-notifications.d.ts.map +1 -1
- package/bridge/native-notifications.js +6 -1
- package/bridge/native-plugins.d.ts +20 -1
- package/bridge/native-plugins.d.ts.map +1 -1
- package/bridge/plugin-bridge.d.ts +1 -1
- package/browser.d.ts +131 -131
- package/cache-telemetry.d.ts +2 -0
- package/cache-telemetry.d.ts.map +1 -1
- package/character/character-draft-helpers.d.ts +1 -1
- package/character-catalog.d.ts +1 -1
- package/chat/coding-agent-session-state.d.ts +1 -1
- package/chat/index.d.ts +24 -4
- package/chat/index.d.ts.map +1 -1
- package/chat/index.js +59 -6
- package/chat/slash-menu.d.ts +37 -2
- package/chat/slash-menu.d.ts.map +1 -1
- package/chat/slash-menu.js +220 -0
- package/chat/useSlashCommandController.d.ts +35 -2
- package/chat/useSlashCommandController.d.ts.map +1 -1
- package/chat/useSlashCommandController.js +64 -8
- package/cloud/account-security/AccountRoute.js +1 -1
- package/cloud/account-security/PermissionsRoute.js +1 -1
- package/cloud/account-security/SecurityRoute.js +1 -1
- package/cloud/account-security/components/account-details.d.ts +1 -1
- package/cloud/account-security/components/account-page-client.d.ts +1 -1
- package/cloud/account-security/components/organization-info.d.ts +1 -1
- package/cloud/account-security/components/profile-form.d.ts +1 -1
- package/cloud/account-security/components/profile-form.js +2 -2
- package/cloud/account-security/data/use-session-auth.d.ts +1 -1
- package/cloud/account-security/index.d.ts +8 -8
- package/cloud/admin/ModerationPage.js +1 -1
- package/cloud/admin/RedemptionsPage.js +2 -2
- package/cloud/admin/RpcStatusPage.js +1 -1
- package/cloud/admin/index.d.ts +6 -6
- package/cloud/analytics/_components/filters.js +1 -1
- package/cloud/analytics/_components/model-breakdown.js +2 -2
- package/cloud/analytics/_components/projections-chart.js +2 -2
- package/cloud/analytics/_components/provider-breakdown.js +2 -2
- package/cloud/analytics/index.d.ts +3 -3
- package/cloud/api-explorer/ApiExplorerPage.js +2 -2
- package/cloud/api-explorer/api-tester.d.ts.map +1 -1
- package/cloud/api-explorer/api-tester.js +15 -8
- package/cloud/api-explorer/auth-manager.d.ts +1 -1
- package/cloud/api-explorer/auth-manager.js +1 -1
- package/cloud/api-explorer/index.d.ts +5 -5
- package/cloud/api-explorer/use-session-auth.d.ts +1 -1
- package/cloud/api-keys/ApiKeysRoute.js +1 -1
- package/cloud/api-keys/ApiKeysView.d.ts +1 -1
- package/cloud/api-keys/ApiKeysView.js +5 -5
- package/cloud/api-keys/index.d.ts +6 -6
- package/cloud/applications/ApplicationDetailPage.js +1 -1
- package/cloud/applications/ApplicationsPage.js +1 -1
- package/cloud/applications/components/app-analytics.d.ts.map +1 -1
- package/cloud/applications/components/app-analytics.js +12 -20
- package/cloud/applications/components/app-details-tabs.d.ts +1 -1
- package/cloud/applications/components/app-details-tabs.js +1 -1
- package/cloud/applications/components/app-domains.d.ts.map +1 -1
- package/cloud/applications/components/app-domains.js +5 -2
- package/cloud/applications/components/app-overview.d.ts +1 -1
- package/cloud/applications/components/app-overview.d.ts.map +1 -1
- package/cloud/applications/components/app-overview.js +120 -3
- package/cloud/applications/components/app-promote.d.ts +1 -1
- package/cloud/applications/components/app-promote.d.ts.map +1 -1
- package/cloud/applications/components/app-promote.js +13 -4
- package/cloud/applications/components/app-settings.d.ts +1 -1
- package/cloud/applications/components/app-settings.js +5 -5
- package/cloud/applications/components/apps-table.d.ts +1 -1
- package/cloud/applications/components/create-app-dialog.js +1 -1
- package/cloud/applications/components/withdraw-dialog.js +1 -1
- package/cloud/applications/index.d.ts +5 -5
- package/cloud/applications/lib/apps.d.ts +25 -0
- package/cloud/applications/lib/apps.d.ts.map +1 -1
- package/cloud/applications/lib/apps.js +17 -1
- package/cloud/approvals/ApprovalsRoute.js +1 -1
- package/cloud/approvals/index.d.ts +3 -3
- package/cloud/approvals/lib/approvals.d.ts.map +1 -1
- package/cloud/approvals/lib/approvals.js +1 -1
- package/cloud/billing/components/billing-tab.d.ts +1 -1
- package/cloud/billing/components/direct-crypto-credit-card.d.ts +1 -1
- package/cloud/billing/components/direct-crypto-credit-card.js +1 -1
- package/cloud/billing/components/invoice-detail-client.d.ts +1 -1
- package/cloud/billing/components/payment-waiting-overlay.js +1 -1
- package/cloud/billing/data/billing-data.d.ts +2 -2
- package/cloud/billing/index.d.ts +9 -9
- package/cloud/billing/use-session-auth.d.ts +1 -1
- package/cloud/connectors/index.d.ts +10 -10
- package/cloud/documents/DocumentsRoute.js +2 -2
- package/cloud/documents/index.d.ts +7 -7
- package/cloud/documents/lib/agents.d.ts.map +1 -1
- package/cloud/documents/lib/agents.js +1 -1
- package/cloud/handoff/cloud-handoff-supervisor.d.ts +1 -1
- package/cloud/handoff/run-cloud-agent-handoff.d.ts +18 -0
- package/cloud/handoff/run-cloud-agent-handoff.d.ts.map +1 -0
- package/cloud/handoff/run-cloud-agent-handoff.js +51 -0
- package/cloud/index.d.ts +4 -4
- package/cloud/instances/AgentChatPage.js +2 -2
- package/cloud/instances/AgentDetailPage.js +1 -1
- package/cloud/instances/AgentsPage.js +1 -1
- package/cloud/instances/MyAgentsPage.js +1 -1
- package/cloud/instances/components/agent-actions.js +1 -1
- package/cloud/instances/components/agent-card.d.ts +3 -1
- package/cloud/instances/components/agent-card.d.ts.map +1 -1
- package/cloud/instances/components/agent-card.js +10 -6
- package/cloud/instances/components/character-filters.d.ts +1 -1
- package/cloud/instances/components/character-filters.js +1 -1
- package/cloud/instances/components/character-library-grid.d.ts +1 -1
- package/cloud/instances/components/create-eliza-agent-dialog.js +3 -3
- package/cloud/instances/components/docker-logs-viewer.d.ts.map +1 -1
- package/cloud/instances/components/docker-logs-viewer.js +13 -12
- package/cloud/instances/components/eliza-agent-backups-panel.js +2 -2
- package/cloud/instances/components/eliza-agents-table.js +1 -1
- package/cloud/instances/components/eliza-wallet-section.d.ts.map +1 -1
- package/cloud/instances/components/eliza-wallet-section.js +3 -5
- package/cloud/instances/components/my-agents.d.ts.map +1 -1
- package/cloud/instances/components/my-agents.js +5 -5
- package/cloud/instances/index.d.ts +6 -6
- package/cloud/instances/lib/i18n.d.ts +1 -1
- package/cloud/instances/lib/use-job-poller.d.ts.map +1 -1
- package/cloud/instances/lib/use-job-poller.js +4 -0
- package/cloud/instances/lib/use-sandbox-status-poll.d.ts.map +1 -1
- package/cloud/instances/lib/use-sandbox-status-poll.js +6 -0
- package/cloud/instances/lib/use-session-auth.d.ts +1 -1
- package/cloud/join/index.d.ts +5 -5
- package/cloud/lib/auth-query.d.ts +19 -0
- package/cloud/lib/auth-query.d.ts.map +1 -0
- package/cloud/{documents/lib → lib}/auth-query.js +7 -5
- package/cloud/lib/format-usd.d.ts +9 -0
- package/cloud/lib/format-usd.d.ts.map +1 -0
- package/cloud/lib/format-usd.js +16 -0
- package/cloud/lib/use-copy-feedback.d.ts +5 -0
- package/cloud/lib/use-copy-feedback.d.ts.map +1 -0
- package/cloud/{instances/lib → lib}/use-copy-feedback.js +2 -0
- package/cloud/lib/use-document-title.d.ts +2 -0
- package/cloud/lib/use-document-title.d.ts.map +1 -0
- package/cloud/{admin → lib}/use-document-title.js +4 -5
- package/cloud/lib/use-session-auth.d.ts +31 -0
- package/cloud/lib/use-session-auth.d.ts.map +1 -0
- package/cloud/{applications/lib → lib}/use-session-auth.js +14 -11
- package/cloud/mcps/McpDetailDrawer.d.ts +1 -1
- package/cloud/mcps/McpEditorDialog.d.ts +1 -1
- package/cloud/mcps/McpsView.d.ts.map +1 -1
- package/cloud/mcps/McpsView.js +20 -13
- package/cloud/mcps/index.d.ts +10 -10
- package/cloud/mcps/lib/mcp-mutations.d.ts +1 -1
- package/cloud/mcps/lib/use-mcps.d.ts +1 -1
- package/cloud/monetization/affiliates/AffiliatesRoute.js +1 -1
- package/cloud/monetization/affiliates/use-dashboard-referral-me.d.ts +1 -1
- package/cloud/monetization/earnings/EarningsPageClient.js +1 -1
- package/cloud/monetization/earnings/EarningsRoute.js +1 -1
- package/cloud/monetization/index.d.ts +8 -8
- package/cloud/organization/data/use-organization.d.ts +1 -1
- package/cloud/organization/index.d.ts +11 -11
- package/cloud/organization/members-list.d.ts +1 -1
- package/cloud/organization/members-tab.d.ts +1 -1
- package/cloud/organization/organization-general-tab.d.ts +1 -1
- package/cloud/organization/organization-tab.d.ts +1 -1
- package/cloud/organization/pending-invites-list.d.ts +1 -1
- package/cloud/public-pages/index.d.ts +21 -21
- package/cloud/public-pages/lib/use-session-auth.d.ts +1 -1
- package/cloud/public-pages/pages/auth/cli-login-page.d.ts.map +1 -1
- package/cloud/public-pages/pages/auth/cli-login-page.js +46 -9
- package/cloud/public-pages/pages/bsc-page.js +5 -5
- package/cloud/public-pages/pages/login/steward-login-section.js +2 -2
- package/cloud/public-pages/pages/payment/app-charge-page.js +1 -1
- package/cloud/public-pages/pages/payment/payment-request-page.js +1 -1
- package/cloud/register-all.d.ts +5 -5
- package/cloud/settings/index.d.ts +4 -4
- package/cloud/settings/sections.js +1 -1
- package/cloud/shell/CloudI18nProvider.d.ts +1 -1
- package/cloud/shell/StewardProvider.d.ts +1 -31
- package/cloud/shell/StewardProvider.d.ts.map +1 -1
- package/cloud/shell/StewardProvider.js +3 -122
- package/cloud/shell/StewardProviderRuntime.d.ts.map +1 -1
- package/cloud/shell/StewardProviderRuntime.js +17 -7
- package/cloud/shell/StewardProviderShared.d.ts +27 -0
- package/cloud/shell/StewardProviderShared.d.ts.map +1 -0
- package/cloud/shell/StewardProviderShared.js +112 -0
- package/cloud-ui/components/ai-elements/index.d.ts +3 -3
- package/cloud-ui/components/ai-elements/memoized-chat-message.d.ts +1 -1
- package/cloud-ui/components/ai-elements/memoized-chat-message.d.ts.map +1 -1
- package/cloud-ui/components/ai-elements/memoized-chat-message.js +162 -139
- package/cloud-ui/components/analytics/cost-alerts.d.ts +1 -1
- package/cloud-ui/components/analytics/cost-insights-card.d.ts +1 -1
- package/cloud-ui/components/analytics/index.d.ts +3 -3
- package/cloud-ui/components/auth/authorize-content.js +1 -1
- package/cloud-ui/components/brand/brand-button.d.ts +1 -1
- package/cloud-ui/components/brand/brand-button.js +1 -1
- package/cloud-ui/components/brand/brand-tabs-responsive.d.ts.map +1 -1
- package/cloud-ui/components/brand/brand-tabs-responsive.js +1 -1
- package/cloud-ui/components/brand/brand-tabs.d.ts.map +1 -1
- package/cloud-ui/components/brand/brand-tabs.js +2 -2
- package/cloud-ui/components/brand/index.d.ts +21 -21
- package/cloud-ui/components/brand/lock-on-button.d.ts +2 -2
- package/cloud-ui/components/brand/lock-on-button.variants.d.ts +1 -1
- package/cloud-ui/components/brand/lock-on-button.variants.js +1 -1
- package/cloud-ui/components/code/code-display.d.ts +1 -1
- package/cloud-ui/components/code/code-display.d.ts.map +1 -1
- package/cloud-ui/components/code/code-display.js +11 -9
- package/cloud-ui/components/code/index.d.ts +3 -3
- package/cloud-ui/components/data-list/apps-list-view.js +1 -1
- package/cloud-ui/components/data-list/index.d.ts +8 -8
- package/cloud-ui/components/data-list/list-action-menu.js +1 -1
- package/cloud-ui/components/docs/api-parameter-select.js +1 -1
- package/cloud-ui/components/docs/api-route-explorer-client.d.ts +1 -1
- package/cloud-ui/components/docs/api-route-explorer-client.js +1 -1
- package/cloud-ui/components/docs/docs-layout.d.ts +1 -1
- package/cloud-ui/components/docs/index.d.ts +11 -11
- package/cloud-ui/components/drawer.js +1 -1
- package/cloud-ui/components/image-gen/index.d.ts +4 -4
- package/cloud-ui/components/image-gen/prompt-input.js +1 -1
- package/cloud-ui/components/layout/dashboard-route-page.d.ts +1 -1
- package/cloud-ui/components/layout/dashboard-sidebar-item.d.ts +1 -1
- package/cloud-ui/components/layout/dashboard-sidebar-section.d.ts +1 -1
- package/cloud-ui/components/layout/dashboard-sidebar.d.ts +1 -1
- package/cloud-ui/components/layout/dashboard-sidebar.js +1 -1
- package/cloud-ui/components/layout/index.d.ts +11 -11
- package/cloud-ui/components/log-viewer.d.ts +1 -1
- package/cloud-ui/components/log-viewer.d.ts.map +1 -1
- package/cloud-ui/components/log-viewer.js +5 -2
- package/cloud-ui/components/monetization/animated-counter.d.ts.map +1 -1
- package/cloud-ui/components/monetization/animated-counter.js +4 -2
- package/cloud-ui/components/monetization/index.d.ts +4 -4
- package/cloud-ui/components/primitives.d.ts +57 -57
- package/cloud-ui/components/product-switcher.js +1 -1
- package/cloud-ui/components/resizable.d.ts.map +1 -1
- package/cloud-ui/components/resizable.js +23 -3
- package/cloud-ui/components/share/index.d.ts +1 -1
- package/cloud-ui/components/theme/index.d.ts +3 -3
- package/cloud-ui/components/theme/theme-provider.d.ts +2 -2
- package/cloud-ui/components/timeline.d.ts.map +1 -1
- package/cloud-ui/components/timeline.js +6 -6
- package/cloud-ui/components/voice/index.d.ts +8 -8
- package/cloud-ui/index.d.ts +30 -30
- package/cloud-ui/lib/utils.d.ts +1 -1
- package/companion/desktop-bar/CompanionBar.d.ts +1 -1
- package/companion/desktop-bar/CompanionBar.d.ts.map +1 -1
- package/companion/desktop-bar/CompanionBar.js +11 -8
- package/companion/desktop-bar/index.d.ts +6 -6
- package/companion/desktop-bar/platform/electrobun-tray.d.ts +19 -0
- package/companion/desktop-bar/platform/electrobun-tray.d.ts.map +1 -1
- package/companion/desktop-bar/platform/index.d.ts +2 -2
- package/companion/desktop-bar/platform/index.d.ts.map +1 -1
- package/companion/desktop-bar/platform/web-fallback.d.ts +1 -1
- package/companion/desktop-bar/useKeyboardShortcuts.d.ts +1 -1
- package/components/accounts/AccountCard.d.ts +1 -1
- package/components/accounts/AccountCard.js +2 -2
- package/components/accounts/AccountList.js +2 -2
- package/components/accounts/AddAccountDialog.d.ts.map +1 -1
- package/components/accounts/AddAccountDialog.js +11 -3
- package/components/accounts/RotationStrategyPicker.d.ts +1 -1
- package/components/accounts/RotationStrategyPicker.js +2 -2
- package/components/apps/AppWindowRenderer.d.ts.map +1 -1
- package/components/apps/AppWindowRenderer.helpers.d.ts +1 -1
- package/components/apps/AppWindowRenderer.js +23 -10
- package/components/apps/AppsCatalogGrid.d.ts +1 -1
- package/components/apps/AppsCatalogGrid.d.ts.map +1 -1
- package/components/apps/AppsCatalogGrid.js +16 -23
- package/components/apps/AppsSidebar.d.ts +1 -1
- package/components/apps/AppsSidebar.d.ts.map +1 -1
- package/components/apps/AppsSidebar.js +22 -11
- package/components/apps/GameView.d.ts.map +1 -1
- package/components/apps/GameView.helpers.d.ts +1 -1
- package/components/apps/GameView.js +55 -20
- package/components/apps/GameViewOverlay.d.ts.map +1 -1
- package/components/apps/GameViewOverlay.js +38 -4
- package/components/apps/RunningAppsRow.d.ts +1 -1
- package/components/apps/RunningAppsRow.d.ts.map +1 -1
- package/components/apps/RunningAppsRow.js +12 -10
- package/components/apps/app-identity.helpers.d.ts +1 -1
- package/components/apps/app-identity.js +1 -1
- package/components/apps/catalog-loader.d.ts +1 -1
- package/components/apps/extensions/registry.d.ts +2 -2
- package/components/apps/extensions/surface.d.ts +2 -2
- package/components/apps/extensions/surface.d.ts.map +1 -1
- package/components/apps/extensions/surface.helpers.d.ts +2 -2
- package/components/apps/extensions/surface.js +9 -9
- package/components/apps/extensions/types.d.ts +1 -1
- package/components/apps/helpers.d.ts +8 -5
- package/components/apps/helpers.d.ts.map +1 -1
- package/components/apps/helpers.js +5 -10
- package/components/apps/home-grid-apps.d.ts +2 -2
- package/components/apps/internal-tool-apps.d.ts +2 -2
- package/components/apps/internal-tool-apps.d.ts.map +1 -1
- package/components/apps/internal-tool-apps.js +18 -8
- package/components/apps/launch-history.d.ts +1 -1
- package/components/apps/load-apps-catalog.d.ts +1 -1
- package/components/apps/overlay-app-registry.d.ts +5 -2
- package/components/apps/overlay-app-registry.d.ts.map +1 -1
- package/components/apps/overlay-app-registry.js +3 -6
- package/components/apps/run-attention.d.ts +1 -1
- package/components/apps/surfaces/registry.d.ts +1 -1
- package/components/apps/useRegistryCatalog.d.ts +1 -1
- package/components/apps/viewer-auth.d.ts +1 -1
- package/components/auth/LoginView.d.ts +1 -1
- package/components/auth/LoginView.js +1 -1
- package/components/character/CharacterEditor.d.ts +4 -1
- package/components/character/CharacterEditor.d.ts.map +1 -1
- package/components/character/CharacterEditor.js +54 -14
- package/components/character/CharacterEditorPanels.d.ts +1 -1
- package/components/character/CharacterEditorPanels.d.ts.map +1 -1
- package/components/character/CharacterEditorPanels.js +10 -12
- package/components/character/CharacterExperienceWorkspace.d.ts +1 -1
- package/components/character/CharacterExperienceWorkspace.d.ts.map +1 -1
- package/components/character/CharacterExperienceWorkspace.js +10 -10
- package/components/character/CharacterHubView.d.ts +4 -2
- package/components/character/CharacterHubView.d.ts.map +1 -1
- package/components/character/CharacterHubView.js +57 -201
- package/components/character/CharacterOverviewSection.d.ts +1 -1
- package/components/character/CharacterOverviewSection.js +1 -1
- package/components/character/CharacterPersonalityTimeline.d.ts +1 -1
- package/components/character/CharacterRoster.d.ts.map +1 -1
- package/components/character/CharacterRoster.helpers.d.ts +1 -1
- package/components/character/CharacterRoster.js +2 -10
- package/components/character/MusicLibraryCharacterWidget.d.ts +1 -1
- package/components/character/character-editor-helpers.d.ts +2 -2
- package/components/character/character-hub-helpers.d.ts +2 -2
- package/components/character/character-voice-config.d.ts +2 -2
- package/components/character/useCharacterHubData.d.ts +41 -0
- package/components/character/useCharacterHubData.d.ts.map +1 -0
- package/components/character/useCharacterHubData.js +112 -0
- package/components/chat/AccountRequiredCard.d.ts +1 -1
- package/components/chat/AgentActivityBox.d.ts +1 -1
- package/components/chat/AgentActivityBox.d.ts.map +1 -1
- package/components/chat/AgentActivityBox.js +28 -17
- package/components/chat/AppsSection.d.ts.map +1 -1
- package/components/chat/AppsSection.js +13 -14
- package/components/chat/ConnectorAccountPicker.d.ts +1 -1
- package/components/chat/InlineWidgetText.d.ts +6 -0
- package/components/chat/InlineWidgetText.d.ts.map +1 -0
- package/components/chat/InlineWidgetText.js +99 -0
- package/components/chat/MessageAttachments.d.ts +22 -3
- package/components/chat/MessageAttachments.d.ts.map +1 -1
- package/components/chat/MessageAttachments.js +381 -14
- package/components/chat/MessageContent.d.ts +17 -2
- package/components/chat/MessageContent.d.ts.map +1 -1
- package/components/chat/MessageContent.js +163 -467
- package/components/chat/SaveCommandModal.js +2 -2
- package/components/chat/TasksEventsPanel.d.ts +1 -1
- package/components/chat/TasksEventsPanel.js +2 -2
- package/components/chat/TranscriptViewerOverlay.d.ts +32 -0
- package/components/chat/TranscriptViewerOverlay.d.ts.map +1 -0
- package/components/chat/TranscriptViewerOverlay.js +329 -0
- package/components/chat/WidgetVisibilityPanel.d.ts +3 -3
- package/components/chat/WidgetVisibilityPanel.d.ts.map +1 -1
- package/components/chat/WidgetVisibilityPanel.helpers.d.ts +1 -1
- package/components/chat/connector-send-as.d.ts +1 -1
- package/components/chat/message-choice-parser.d.ts +1 -1
- package/components/chat/message-choice-parser.d.ts.map +1 -1
- package/components/chat/message-choice-parser.js +1 -1
- package/components/chat/message-parser-helpers.d.ts +139 -0
- package/components/chat/message-parser-helpers.d.ts.map +1 -0
- package/components/chat/message-parser-helpers.js +490 -0
- package/components/chat/widgets/ChoiceWidget.js +1 -1
- package/components/chat/widgets/agent-orchestrator-accounts-view.d.ts +3 -3
- package/components/chat/widgets/agent-orchestrator.d.ts +1 -1
- package/components/chat/widgets/agent-orchestrator.d.ts.map +1 -1
- package/components/chat/widgets/agent-orchestrator.js +60 -39
- package/components/chat/widgets/browser-launch-widget.d.ts +19 -0
- package/components/chat/widgets/browser-launch-widget.d.ts.map +1 -0
- package/components/chat/widgets/browser-launch-widget.js +38 -0
- package/components/chat/widgets/browser-status.d.ts +1 -1
- package/components/chat/widgets/browser-status.d.ts.map +1 -1
- package/components/chat/widgets/browser-status.helpers.d.ts +1 -1
- package/components/chat/widgets/browser-status.js +17 -27
- package/components/chat/widgets/calendar-upcoming.d.ts +17 -0
- package/components/chat/widgets/calendar-upcoming.d.ts.map +1 -0
- package/components/chat/widgets/calendar-upcoming.js +149 -0
- package/components/chat/widgets/credential-request-widget.d.ts +40 -0
- package/components/chat/widgets/credential-request-widget.d.ts.map +1 -0
- package/components/chat/widgets/credential-request-widget.js +52 -0
- package/components/chat/widgets/finances-alerts.d.ts +17 -0
- package/components/chat/widgets/finances-alerts.d.ts.map +1 -0
- package/components/chat/widgets/finances-alerts.js +214 -0
- package/components/chat/widgets/followups.d.ts +1 -1
- package/components/chat/widgets/form-request.d.ts +1 -1
- package/components/chat/widgets/goals-attention.d.ts +17 -0
- package/components/chat/widgets/goals-attention.d.ts.map +1 -0
- package/components/chat/widgets/goals-attention.js +155 -0
- package/components/chat/widgets/health-sleep.d.ts +18 -0
- package/components/chat/widgets/health-sleep.d.ts.map +1 -0
- package/components/chat/widgets/health-sleep.js +159 -0
- package/components/chat/widgets/home-widget-card.d.ts +47 -0
- package/components/chat/widgets/home-widget-card.d.ts.map +1 -0
- package/components/chat/widgets/home-widget-card.js +62 -0
- package/components/chat/widgets/inbox-unread.d.ts +10 -0
- package/components/chat/widgets/inbox-unread.d.ts.map +1 -0
- package/components/chat/widgets/inbox-unread.js +119 -0
- package/components/chat/widgets/inline-registry.d.ts +1 -1
- package/components/chat/widgets/messages.d.ts +8 -0
- package/components/chat/widgets/messages.d.ts.map +1 -0
- package/components/chat/widgets/messages.js +38 -0
- package/components/chat/widgets/music-player.d.ts +1 -1
- package/components/chat/widgets/music-player.helpers.d.ts +1 -1
- package/components/chat/widgets/needs-attention.d.ts +22 -0
- package/components/chat/widgets/needs-attention.d.ts.map +1 -0
- package/components/chat/widgets/needs-attention.js +109 -0
- package/components/chat/widgets/notifications.d.ts +9 -0
- package/components/chat/widgets/notifications.d.ts.map +1 -0
- package/components/chat/widgets/notifications.js +42 -0
- package/components/chat/widgets/orchestrator-grilling-card.d.ts +24 -0
- package/components/chat/widgets/orchestrator-grilling-card.d.ts.map +1 -0
- package/components/chat/widgets/orchestrator-grilling-card.js +57 -0
- package/components/chat/widgets/relationships-attention.d.ts +18 -0
- package/components/chat/widgets/relationships-attention.d.ts.map +1 -0
- package/components/chat/widgets/relationships-attention.js +135 -0
- package/components/chat/widgets/shared.js +2 -2
- package/components/chat/widgets/task-widget.js +1 -1
- package/components/chat/widgets/todo.d.ts +1 -1
- package/components/chat/widgets/todo.d.ts.map +1 -1
- package/components/chat/widgets/todo.js +39 -10
- package/components/chat/widgets/topic-chips-bar.d.ts +23 -0
- package/components/chat/widgets/topic-chips-bar.d.ts.map +1 -0
- package/components/chat/widgets/topic-chips-bar.js +22 -0
- package/components/chat/widgets/topic-grouped-transcript.d.ts +20 -0
- package/components/chat/widgets/topic-grouped-transcript.d.ts.map +1 -0
- package/components/chat/widgets/topic-grouped-transcript.js +45 -0
- package/components/chat/widgets/types.d.ts +5 -2
- package/components/chat/widgets/types.d.ts.map +1 -1
- package/components/chat/widgets/use-inline-widget-context.d.ts +18 -0
- package/components/chat/widgets/use-inline-widget-context.d.ts.map +1 -0
- package/components/chat/widgets/use-inline-widget-context.js +46 -0
- package/components/cloud/CloudSourceControls.js +2 -2
- package/components/cloud/CloudStatusBadge.js +2 -2
- package/components/cloud/FlaminaGuide.d.ts +1 -1
- package/components/cloud/FlaminaGuide.d.ts.map +1 -1
- package/components/cloud/FlaminaGuide.js +10 -5
- package/components/companion/injected.d.ts +1 -1
- package/components/companion/injected.hooks.d.ts +1 -1
- package/components/composites/chat/ChatVoiceStatusBar.d.ts +2 -2
- package/components/composites/chat/ChatVoiceStatusBar.js +1 -1
- package/components/composites/chat/ContinuousChatToggle.d.ts +1 -1
- package/components/composites/chat/ContinuousChatToggle.js +1 -1
- package/components/composites/chat/chat-attachment-strip.d.ts +1 -1
- package/components/composites/chat/chat-attachment-strip.js +1 -1
- package/components/composites/chat/chat-composer-shell.d.ts +1 -1
- package/components/composites/chat/chat-composer.d.ts +10 -4
- package/components/composites/chat/chat-composer.d.ts.map +1 -1
- package/components/composites/chat/chat-composer.js +14 -14
- package/components/composites/chat/chat-conversation-item.d.ts +2 -2
- package/components/composites/chat/chat-conversation-item.d.ts.map +1 -1
- package/components/composites/chat/chat-conversation-item.js +8 -8
- package/components/composites/chat/chat-empty-state.d.ts +1 -1
- package/components/composites/chat/chat-message-actions.d.ts +1 -1
- package/components/composites/chat/chat-message.d.ts +10 -2
- package/components/composites/chat/chat-message.d.ts.map +1 -1
- package/components/composites/chat/chat-message.js +4 -2
- package/components/composites/chat/chat-source.d.ts +2 -2
- package/components/composites/chat/chat-source.helpers.d.ts +1 -1
- package/components/composites/chat/chat-thread-layout.d.ts +1 -1
- package/components/composites/chat/chat-thread-layout.d.ts.map +1 -1
- package/components/composites/chat/chat-thread-layout.js +2 -2
- package/components/composites/chat/chat-transcript.d.ts +6 -2
- package/components/composites/chat/chat-transcript.d.ts.map +1 -1
- package/components/composites/chat/chat-transcript.js +18 -3
- package/components/composites/chat/chat-types.d.ts +2 -0
- package/components/composites/chat/chat-types.d.ts.map +1 -1
- package/components/composites/chat/chat-typing-indicator.d.ts +1 -1
- package/components/composites/chat/index.d.ts +16 -16
- package/components/composites/chat/permission-card.d.ts +1 -1
- package/components/composites/chat/permission-card.render.d.ts +2 -2
- package/components/composites/code/DiffReviewPanel.d.ts +1 -1
- package/components/composites/code/index.d.ts +1 -1
- package/components/composites/form-field/index.d.ts +1 -1
- package/components/composites/index.d.ts +29 -29
- package/components/composites/page-panel/index.d.ts +19 -19
- package/components/composites/page-panel/page-panel-collapsible-section.d.ts +1 -1
- package/components/composites/page-panel/page-panel-collapsible-section.d.ts.map +1 -1
- package/components/composites/page-panel/page-panel-collapsible-section.js +2 -2
- package/components/composites/page-panel/page-panel-empty.d.ts +1 -1
- package/components/composites/page-panel/page-panel-empty.d.ts.map +1 -1
- package/components/composites/page-panel/page-panel-empty.js +4 -4
- package/components/composites/page-panel/page-panel-feature-empty.d.ts +1 -1
- package/components/composites/page-panel/page-panel-frame.d.ts +1 -1
- package/components/composites/page-panel/page-panel-frame.d.ts.map +1 -1
- package/components/composites/page-panel/page-panel-frame.js +1 -1
- package/components/composites/page-panel/page-panel-header.d.ts +1 -1
- package/components/composites/page-panel/page-panel-header.d.ts.map +1 -1
- package/components/composites/page-panel/page-panel-header.js +9 -9
- package/components/composites/page-panel/page-panel-loading.d.ts +1 -1
- package/components/composites/page-panel/page-panel-loading.d.ts.map +1 -1
- package/components/composites/page-panel/page-panel-loading.js +3 -3
- package/components/composites/page-panel/page-panel-root.d.ts +2 -2
- package/components/composites/page-panel/page-panel-root.js +7 -7
- package/components/composites/page-panel/page-panel-toolbar.d.ts +1 -1
- package/components/composites/page-panel/page-panel-types.d.ts +1 -1
- package/components/composites/search/index.d.ts +1 -1
- package/components/composites/search/searchbar.js +1 -1
- package/components/composites/sidebar/index.d.ts +10 -10
- package/components/composites/sidebar/sidebar-auto-rail.d.ts +1 -1
- package/components/composites/sidebar/sidebar-body.d.ts +1 -1
- package/components/composites/sidebar/sidebar-collapsed-rail.d.ts +1 -1
- package/components/composites/sidebar/sidebar-content.js +3 -3
- package/components/composites/sidebar/sidebar-header-stack.d.ts +1 -1
- package/components/composites/sidebar/sidebar-header.d.ts +1 -1
- package/components/composites/sidebar/sidebar-panel.d.ts +1 -1
- package/components/composites/sidebar/sidebar-root.d.ts +1 -1
- package/components/composites/sidebar/sidebar-root.d.ts.map +1 -1
- package/components/composites/sidebar/sidebar-root.js +34 -8
- package/components/composites/sidebar/sidebar-scroll-region.d.ts +1 -1
- package/components/composites/skills/index.d.ts +1 -1
- package/components/composites/trajectories/index.d.ts +7 -7
- package/components/composites/trajectories/trajectory-code-block.d.ts.map +1 -1
- package/components/composites/trajectories/trajectory-code-block.js +3 -2
- package/components/composites/trajectories/trajectory-pipeline-graph.js +3 -3
- package/components/config-ui/config-control-primitives.helpers.js +2 -2
- package/components/config-ui/config-field.d.ts +1 -1
- package/components/config-ui/config-field.helpers.d.ts +1 -1
- package/components/config-ui/config-field.helpers.d.ts.map +1 -1
- package/components/config-ui/config-field.helpers.js +33 -20
- package/components/config-ui/config-field.js +2 -2
- package/components/config-ui/config-renderer.d.ts +2 -2
- package/components/config-ui/config-renderer.helpers.d.ts +2 -2
- package/components/config-ui/config-renderer.js +6 -6
- package/components/config-ui/index.d.ts +7 -7
- package/components/config-ui/ui-renderer.d.ts +1 -1
- package/components/config-ui/ui-renderer.d.ts.map +1 -1
- package/components/config-ui/ui-renderer.helpers.d.ts +1 -1
- package/components/config-ui/ui-renderer.js +15 -8
- package/components/connectors/BlueBubblesStatusPanel.d.ts.map +1 -1
- package/components/connectors/BlueBubblesStatusPanel.js +11 -24
- package/components/connectors/ConnectorAccountAuditList.d.ts.map +1 -1
- package/components/connectors/ConnectorAccountAuditList.js +19 -32
- package/components/connectors/ConnectorAccountCard.d.ts +1 -1
- package/components/connectors/ConnectorAccountList.d.ts +2 -2
- package/components/connectors/ConnectorAccountPrivacySelector.d.ts +1 -1
- package/components/connectors/ConnectorAccountPurposeSelector.d.ts +1 -1
- package/components/connectors/ConnectorModeSelector.d.ts +1 -1
- package/components/connectors/ConnectorModeSelector.helpers.d.ts +1 -1
- package/components/connectors/ConnectorModeSelector.hooks.d.ts +1 -1
- package/components/connectors/ConnectorModeSelector.js +2 -2
- package/components/connectors/ConnectorQrPairingOverlay.js +2 -2
- package/components/connectors/DiscordLocalConnectorPanel.js +2 -2
- package/components/connectors/IMessageStatusPanel.js +2 -2
- package/components/connectors/SignalQrOverlay.js +2 -2
- package/components/connectors/TelegramAccountConnectorPanel.js +4 -4
- package/components/connectors/TelegramBotSetupPanel.js +3 -3
- package/components/connectors/WhatsAppQrOverlay.js +2 -2
- package/components/connectors/XRPairingPanel.d.ts.map +1 -1
- package/components/connectors/XRPairingPanel.js +6 -3
- package/components/connectors/connector-account-options.d.ts +1 -1
- package/components/conversations/ConversationRenameDialog.d.ts.map +1 -1
- package/components/conversations/ConversationRenameDialog.js +4 -2
- package/components/conversations/ConversationsSidebar.d.ts.map +1 -1
- package/components/conversations/ConversationsSidebar.js +18 -3
- package/components/conversations/conversation-sidebar-model.d.ts +2 -2
- package/components/conversations/conversation-utils.d.ts +1 -1
- package/components/custom-actions/CustomActionEditor.js +2 -2
- package/components/custom-actions/CustomActionsPanel.d.ts.map +1 -1
- package/components/custom-actions/CustomActionsPanel.js +16 -5
- package/components/custom-actions/CustomActionsView.js +3 -3
- package/components/custom-actions/custom-action-form.d.ts +4 -4
- package/components/custom-actions/custom-action-form.d.ts.map +1 -1
- package/components/custom-actions/custom-action-form.js +2 -2
- package/components/desktop/DesktopTabBar.d.ts +2 -2
- package/components/desktop/DesktopTabBar.js +4 -4
- package/components/index.d.ts +161 -156
- package/components/index.d.ts.map +1 -1
- package/components/index.js +9 -1
- package/components/local-inference/ActiveModelBar.d.ts +1 -1
- package/components/local-inference/DeviceBridgeStatus.d.ts +1 -1
- package/components/local-inference/DevicesPanel.d.ts +1 -1
- package/components/local-inference/DownloadProgress.d.ts +1 -1
- package/components/local-inference/DownloadProgress.d.ts.map +1 -1
- package/components/local-inference/DownloadProgress.js +1 -3
- package/components/local-inference/DownloadQueue.d.ts +8 -2
- package/components/local-inference/DownloadQueue.d.ts.map +1 -1
- package/components/local-inference/DownloadQueue.js +3 -3
- package/components/local-inference/FirstRunOffer.d.ts +1 -1
- package/components/local-inference/HardwareBadge.d.ts +1 -1
- package/components/local-inference/LocalInferencePanel.d.ts +1 -1
- package/components/local-inference/LocalInferencePanel.d.ts.map +1 -1
- package/components/local-inference/LocalInferencePanel.js +18 -51
- package/components/local-inference/ModelCard.d.ts +1 -1
- package/components/local-inference/ModelCard.d.ts.map +1 -1
- package/components/local-inference/ModelCard.js +6 -5
- package/components/local-inference/ModelHubView.d.ts +1 -1
- package/components/local-inference/ModelHubView.d.ts.map +1 -1
- package/components/local-inference/ModelHubView.js +10 -6
- package/components/local-inference/RoutingMatrix.d.ts.map +1 -1
- package/components/local-inference/RoutingMatrix.js +115 -40
- package/components/local-inference/SlotAssignments.d.ts +1 -1
- package/components/local-inference/SlotAssignments.d.ts.map +1 -1
- package/components/local-inference/SlotAssignments.js +27 -10
- package/components/local-inference/hub-utils.d.ts +2 -1
- package/components/local-inference/hub-utils.d.ts.map +1 -1
- package/components/local-inference/hub-utils.js +2 -0
- package/components/local-inference/runtime-class-ui.d.ts +44 -0
- package/components/local-inference/runtime-class-ui.d.ts.map +1 -0
- package/components/local-inference/runtime-class-ui.js +61 -0
- package/components/local-inference/slot-metadata.d.ts +1 -1
- package/components/local-inference/useDeviceBridgeStatus.d.ts +1 -1
- package/components/local-inference/useDeviceBridgeStatus.d.ts.map +1 -1
- package/components/local-inference/useDeviceBridgeStatus.js +17 -12
- package/components/local-inference/useHomeModelStatus.d.ts +1 -1
- package/components/local-inference/useHomeModelStatus.d.ts.map +1 -1
- package/components/local-inference/useHomeModelStatus.js +15 -10
- package/components/pages/AppDetailsView.d.ts +1 -1
- package/components/pages/AppDetailsView.d.ts.map +1 -1
- package/components/pages/AppDetailsView.helpers.d.ts +1 -1
- package/components/pages/AppDetailsView.js +15 -3
- package/components/pages/AppsPageView.d.ts.map +1 -1
- package/components/pages/AppsPageView.js +7 -2
- package/components/pages/AppsView.d.ts.map +1 -1
- package/components/pages/AppsView.js +35 -8
- package/components/pages/AutomationsFeed.d.ts +1 -1
- package/components/pages/AutomationsFeed.d.ts.map +1 -1
- package/components/pages/AutomationsFeed.js +3 -7
- package/components/pages/BackgroundView.d.ts +10 -0
- package/components/pages/BackgroundView.d.ts.map +1 -0
- package/components/pages/BackgroundView.js +14 -0
- package/components/pages/BrowserWorkspaceView.d.ts.map +1 -1
- package/components/pages/BrowserWorkspaceView.js +13 -8
- package/components/pages/CameraPageView.js +2 -2
- package/components/pages/ChatView.d.ts +1 -1
- package/components/pages/ChatView.d.ts.map +1 -1
- package/components/pages/ChatView.js +186 -29
- package/components/pages/ConfigPageView.d.ts.map +1 -1
- package/components/pages/ConfigPageView.js +11 -2
- package/components/pages/DatabasePageView.d.ts.map +1 -1
- package/components/pages/DatabasePageView.js +4 -2
- package/components/pages/DatabaseView.d.ts.map +1 -1
- package/components/pages/DatabaseView.js +14 -12
- package/components/pages/DocumentsView.d.ts +2 -2
- package/components/pages/DocumentsView.d.ts.map +1 -1
- package/components/pages/DocumentsView.js +20 -20
- package/components/pages/ElizaCloudDashboard.d.ts.map +1 -1
- package/components/pages/ElizaCloudDashboard.js +20 -2
- package/components/pages/ElizaOsAppsView.d.ts.map +1 -1
- package/components/pages/ElizaOsAppsView.js +29 -22
- package/components/pages/FilesView.d.ts +15 -0
- package/components/pages/FilesView.d.ts.map +1 -0
- package/components/pages/FilesView.js +201 -0
- package/components/pages/GeneratedViewHero.js +1 -1
- package/components/pages/HeartbeatForm.d.ts +3 -3
- package/components/pages/HeartbeatsView.d.ts.map +1 -1
- package/components/pages/HeartbeatsView.js +21 -6
- package/components/pages/LogsView.d.ts +0 -6
- package/components/pages/LogsView.d.ts.map +1 -1
- package/components/pages/LogsView.js +41 -25
- package/components/pages/MediaGalleryView.d.ts.map +1 -1
- package/components/pages/MediaGalleryView.js +59 -11
- package/components/pages/MemoryDetailPanel.d.ts +1 -1
- package/components/pages/MemoryDetailPanel.d.ts.map +1 -1
- package/components/pages/MemoryDetailPanel.js +8 -3
- package/components/pages/MemoryViewerView.d.ts.map +1 -1
- package/components/pages/MemoryViewerView.js +33 -24
- package/components/pages/PluginCard.d.ts +2 -2
- package/components/pages/PluginCard.d.ts.map +1 -1
- package/components/pages/PluginCard.js +6 -5
- package/components/pages/PluginConfigForm.d.ts +1 -1
- package/components/pages/PluginConfigForm.js +2 -2
- package/components/pages/PluginVisual.d.ts +1 -1
- package/components/pages/PluginsView.d.ts +1 -1
- package/components/pages/PluginsView.d.ts.map +1 -1
- package/components/pages/PluginsView.js +33 -13
- package/components/pages/RelationshipsGraphPanel.d.ts +1 -1
- package/components/pages/RelationshipsGraphPanel.js +2 -2
- package/components/pages/RelationshipsIdentityCluster.d.ts +1 -1
- package/components/pages/ReleaseCenterView.d.ts.map +1 -1
- package/components/pages/ReleaseCenterView.js +11 -9
- package/components/pages/RuntimeView.d.ts.map +1 -1
- package/components/pages/RuntimeView.js +13 -12
- package/components/pages/SecretsView.d.ts.map +1 -1
- package/components/pages/SecretsView.js +21 -18
- package/components/pages/SettingsView.d.ts.map +1 -1
- package/components/pages/SettingsView.js +34 -14
- package/components/pages/SkillsView.d.ts.map +1 -1
- package/components/pages/SkillsView.js +47 -11
- package/components/pages/Springboard.d.ts +49 -0
- package/components/pages/Springboard.d.ts.map +1 -0
- package/components/pages/Springboard.js +238 -0
- package/components/pages/SpringboardSurface.d.ts +6 -0
- package/components/pages/SpringboardSurface.d.ts.map +1 -0
- package/components/pages/SpringboardSurface.js +120 -0
- package/components/pages/SqlEditorPanel.d.ts +1 -1
- package/components/pages/SqlEditorPanel.js +5 -5
- package/components/pages/StreamView.d.ts.map +1 -1
- package/components/pages/StreamView.js +6 -7
- package/components/pages/TaskEditor.d.ts +3 -3
- package/components/pages/TrajectoriesView.d.ts.map +1 -1
- package/components/pages/TrajectoriesView.js +9 -9
- package/components/pages/TrajectoryDetailView.d.ts.map +1 -1
- package/components/pages/TrajectoryDetailView.js +58 -39
- package/components/pages/WorkflowEditor.d.ts +1 -1
- package/components/pages/WorkflowEditor.d.ts.map +1 -1
- package/components/pages/WorkflowEditor.js +13 -22
- package/components/pages/WorkflowGraphViewer.d.ts +1 -1
- package/components/pages/WorkflowGraphViewer.d.ts.map +1 -1
- package/components/pages/WorkflowGraphViewer.js +9 -11
- package/components/pages/__e2e__/background-fixture.d.ts +2 -0
- package/components/pages/__e2e__/background-fixture.d.ts.map +1 -0
- package/components/pages/__e2e__/background-fixture.js +84 -0
- package/components/pages/__e2e__/springboard-fixture.d.ts +2 -0
- package/components/pages/__e2e__/springboard-fixture.d.ts.map +1 -0
- package/components/pages/__e2e__/springboard-fixture.js +103 -0
- package/components/pages/automation-conversations.d.ts +1 -1
- package/components/pages/automations-missing-creds.d.ts +1 -1
- package/components/pages/background-image.d.ts +10 -0
- package/components/pages/background-image.d.ts.map +1 -0
- package/components/pages/background-image.js +61 -0
- package/components/pages/browser-workspace-wallet.d.ts +1 -1
- package/components/pages/chat-view-hooks.d.ts +5 -5
- package/components/pages/cloud-dashboard-utils.d.ts +1 -1
- package/components/pages/config-page-sections.d.ts +1 -1
- package/components/pages/config-page-sections.d.ts.map +1 -1
- package/components/pages/config-page-sections.js +4 -3
- package/components/pages/database-utils.d.ts +2 -1
- package/components/pages/database-utils.d.ts.map +1 -1
- package/components/pages/database-utils.js +38 -25
- package/components/pages/documents-detail.d.ts.map +1 -1
- package/components/pages/documents-detail.helpers.d.ts +1 -1
- package/components/pages/documents-detail.js +55 -8
- package/components/pages/documents-upload.d.ts +1 -1
- package/components/pages/documents-upload.d.ts.map +1 -1
- package/components/pages/documents-upload.helpers.d.ts +1 -1
- package/components/pages/documents-upload.js +5 -3
- package/components/pages/heartbeat-utils.d.ts +2 -2
- package/components/pages/help/HelpView.js +2 -2
- package/components/pages/help/help-content.d.ts.map +1 -1
- package/components/pages/help/help-content.js +7 -5
- package/components/pages/page-scoped-conversations.d.ts +3 -3
- package/components/pages/page-scoped-conversations.d.ts.map +1 -1
- package/components/pages/page-scoped-conversations.js +1 -18
- package/components/pages/plugin-list-utils.d.ts +3 -3
- package/components/pages/plugin-list-utils.d.ts.map +1 -1
- package/components/pages/plugin-list-utils.js +6 -2
- package/components/pages/plugin-view-connectors.d.ts +2 -2
- package/components/pages/plugin-view-connectors.d.ts.map +1 -1
- package/components/pages/plugin-view-connectors.js +7 -2
- package/components/pages/plugin-view-dialogs.d.ts +3 -9
- package/components/pages/plugin-view-dialogs.d.ts.map +1 -1
- package/components/pages/plugin-view-dialogs.js +1 -1
- package/components/pages/plugin-view-modal.d.ts +2 -2
- package/components/pages/plugin-view-sidebar.d.ts +2 -2
- package/components/pages/relationships/RelationshipsCandidateMergesPanel.d.ts +1 -1
- package/components/pages/relationships/RelationshipsPersonPanels.d.ts +1 -1
- package/components/pages/relationships/RelationshipsPersonPanels.js +1 -1
- package/components/pages/relationships/RelationshipsSidebar.d.ts +1 -1
- package/components/pages/relationships/RelationshipsWorkspaceView.d.ts.map +1 -1
- package/components/pages/relationships/RelationshipsWorkspaceView.js +5 -4
- package/components/pages/relationships/relationships-utils.d.ts +1 -1
- package/components/pages/skill-detail-panel.d.ts.map +1 -1
- package/components/pages/skill-detail-panel.js +25 -3
- package/components/pages/skill-marketplace.d.ts +2 -2
- package/components/pages/skill-marketplace.d.ts.map +1 -1
- package/components/pages/skill-marketplace.js +3 -3
- package/components/pages/tutorial/TutorialNarrator.d.ts.map +1 -1
- package/components/pages/tutorial/TutorialNarrator.js +3 -2
- package/components/pages/tutorial/TutorialOverlay.d.ts.map +1 -1
- package/components/pages/tutorial/TutorialOverlay.js +3 -2
- package/components/pages/tutorial/TutorialSpotlight.js +3 -3
- package/components/pages/tutorial/TutorialView.d.ts.map +1 -1
- package/components/pages/tutorial/TutorialView.js +3 -5
- package/components/pages/useBrowserWorkspaceWalletBridge.d.ts +2 -2
- package/components/pages/workflow-action-handoff.d.ts +1 -1
- package/components/permissions/StreamingPermissions.d.ts +1 -1
- package/components/permissions/StreamingPermissions.d.ts.map +1 -1
- package/components/permissions/StreamingPermissions.js +5 -6
- package/components/plugins/showcase-data.d.ts +1 -1
- package/components/policy-controls/ApprovedAddressesSection.d.ts +1 -1
- package/components/policy-controls/ApprovedAddressesSection.helpers.d.ts +1 -1
- package/components/policy-controls/AutoApproveSection.d.ts +1 -1
- package/components/policy-controls/AutoApproveSection.helpers.d.ts +1 -1
- package/components/policy-controls/RateLimitSection.d.ts +1 -1
- package/components/policy-controls/RateLimitSection.helpers.d.ts +1 -1
- package/components/policy-controls/SpendingLimitSection.d.ts +1 -1
- package/components/policy-controls/SpendingLimitSection.helpers.d.ts +1 -1
- package/components/policy-controls/TimeWindowSection.d.ts +1 -1
- package/components/policy-controls/TimeWindowSection.helpers.d.ts +1 -1
- package/components/policy-controls/constants.d.ts +1 -1
- package/components/policy-controls/helpers.d.ts +1 -1
- package/components/policy-controls/index.d.ts +14 -14
- package/components/primitives/index.d.ts +27 -27
- package/components/release-center/sections.d.ts +1 -1
- package/components/release-center/sections.js +7 -7
- package/components/release-center/shared.js +2 -2
- package/components/settings/AdvancedSection.d.ts.map +1 -1
- package/components/settings/AdvancedSection.js +20 -4
- package/components/settings/AdvancedToggle.js +1 -1
- package/components/settings/ApiKeyConfig.d.ts +2 -2
- package/components/settings/ApiKeyConfig.js +2 -2
- package/components/settings/AppPermissionsSection.d.ts.map +1 -1
- package/components/settings/AppPermissionsSection.js +7 -12
- package/components/settings/AppearanceSettingsSection.d.ts.map +1 -1
- package/components/settings/AppearanceSettingsSection.js +34 -5
- package/components/settings/AppsManagementSection.d.ts.map +1 -1
- package/components/settings/AppsManagementSection.js +42 -33
- package/components/settings/BackgroundSettingsControls.d.ts +5 -0
- package/components/settings/BackgroundSettingsControls.d.ts.map +1 -0
- package/components/settings/BackgroundSettingsControls.js +118 -0
- package/components/settings/CapabilitiesSection.d.ts.map +1 -1
- package/components/settings/CapabilitiesSection.js +115 -13
- package/components/settings/CloudAgentsSection.d.ts.map +1 -1
- package/components/settings/CloudAgentsSection.js +33 -13
- package/components/settings/ConnectorsSection.d.ts.map +1 -1
- package/components/settings/ConnectorsSection.js +8 -6
- package/components/settings/DesktopWorkspaceDisplay.d.ts +2 -3
- package/components/settings/DesktopWorkspaceDisplay.d.ts.map +1 -1
- package/components/settings/DesktopWorkspaceDisplay.hooks.d.ts +3 -4
- package/components/settings/DesktopWorkspaceDisplay.hooks.d.ts.map +1 -1
- package/components/settings/DesktopWorkspaceSection.d.ts.map +1 -1
- package/components/settings/DesktopWorkspaceSection.js +4 -2
- package/components/settings/IdentitySettingsSection.d.ts.map +1 -1
- package/components/settings/IdentitySettingsSection.js +13 -3
- package/components/settings/LoadContentPackForm.js +2 -2
- package/components/settings/LoadedPacksList.d.ts.map +1 -1
- package/components/settings/LoadedPacksList.js +8 -10
- package/components/settings/PermissionsSection.d.ts.map +1 -1
- package/components/settings/PermissionsSection.js +10 -32
- package/components/settings/PolicyControlsView.d.ts.map +1 -1
- package/components/settings/PolicyControlsView.js +8 -10
- package/components/settings/ProviderCard.d.ts +3 -5
- package/components/settings/ProviderCard.d.ts.map +1 -1
- package/components/settings/ProviderCard.js +4 -6
- package/components/settings/ProviderPanels.d.ts +4 -15
- package/components/settings/ProviderPanels.d.ts.map +1 -1
- package/components/settings/ProviderPanels.js +11 -17
- package/components/settings/ProviderRoutingPanel.d.ts +1 -1
- package/components/settings/ProviderRoutingPanel.d.ts.map +1 -1
- package/components/settings/ProviderRoutingPanel.js +4 -8
- package/components/settings/ProviderSwitcher.d.ts +1 -1
- package/components/settings/ProviderSwitcher.d.ts.map +1 -1
- package/components/settings/ProviderSwitcher.js +31 -32
- package/components/settings/RemotePluginHostSection.d.ts.map +1 -1
- package/components/settings/RemotePluginHostSection.js +13 -27
- package/components/settings/RuntimeSettingsSection.d.ts.map +1 -1
- package/components/settings/RuntimeSettingsSection.js +7 -18
- package/components/settings/SecretsManagerSection.d.ts +1 -1
- package/components/settings/SecretsManagerSection.d.ts.map +1 -1
- package/components/settings/SecretsManagerSection.js +3 -3
- package/components/settings/SecuritySettingsSection.d.ts.map +1 -1
- package/components/settings/SecuritySettingsSection.js +49 -57
- package/components/settings/SubscriptionStatus.d.ts +1 -1
- package/components/settings/SubscriptionStatus.js +4 -4
- package/components/settings/VaultInventoryPanel.d.ts +1 -1
- package/components/settings/VaultInventoryPanel.d.ts.map +1 -1
- package/components/settings/VaultInventoryPanel.js +26 -22
- package/components/settings/VoiceConfigView.d.ts.map +1 -1
- package/components/settings/VoiceConfigView.helpers.d.ts +1 -1
- package/components/settings/VoiceConfigView.js +25 -21
- package/components/settings/VoiceProfileSection.d.ts +2 -4
- package/components/settings/VoiceProfileSection.d.ts.map +1 -1
- package/components/settings/VoiceProfileSection.js +57 -34
- package/components/settings/VoiceSection.d.ts +8 -7
- package/components/settings/VoiceSection.d.ts.map +1 -1
- package/components/settings/VoiceSection.helpers.d.ts +1 -1
- package/components/settings/VoiceSection.helpers.d.ts.map +1 -1
- package/components/settings/VoiceSection.helpers.js +0 -1
- package/components/settings/VoiceSection.js +21 -57
- package/components/settings/VoiceSectionMount.d.ts.map +1 -1
- package/components/settings/VoiceSectionMount.js +16 -7
- package/components/settings/VoiceTierBanner.d.ts.map +1 -1
- package/components/settings/VoiceTierBanner.helpers.d.ts +1 -1
- package/components/settings/VoiceTierBanner.js +13 -19
- package/components/settings/WalletKeysSection.d.ts.map +1 -1
- package/components/settings/WalletKeysSection.js +3 -9
- package/components/settings/cloud-model-schema.d.ts +3 -3
- package/components/settings/desktop-workspace-audit-config.d.ts +1 -1
- package/components/settings/permission-controls.d.ts +2 -2
- package/components/settings/permission-controls.hooks.d.ts +1 -1
- package/components/settings/permission-controls.js +3 -3
- package/components/settings/permission-types.d.ts +1 -1
- package/components/settings/permission-types.js +8 -8
- package/components/settings/settings-agent-rows.d.ts +26 -2
- package/components/settings/settings-agent-rows.d.ts.map +1 -1
- package/components/settings/settings-agent-rows.js +29 -1
- package/components/settings/settings-control-primitives.d.ts +1 -1
- package/components/settings/settings-layout.d.ts +9 -3
- package/components/settings/settings-layout.d.ts.map +1 -1
- package/components/settings/settings-layout.js +8 -6
- package/components/settings/settings-section-registry.d.ts +19 -1
- package/components/settings/settings-section-registry.d.ts.map +1 -1
- package/components/settings/settings-sections.d.ts +3 -3
- package/components/settings/settings-sections.d.ts.map +1 -1
- package/components/settings/settings-sections.js +11 -4
- package/components/settings/useCloudModelConfig.d.ts +2 -2
- package/components/settings/useDesktopWindowControls.d.ts +3 -4
- package/components/settings/useDesktopWindowControls.d.ts.map +1 -1
- package/components/settings/useProviderBootstrap.d.ts +2 -2
- package/components/settings/useProviderEntries.d.ts +4 -4
- package/components/settings/useProviderSelection.d.ts +1 -1
- package/components/settings/useProviderSelection.d.ts.map +1 -1
- package/components/settings/useProviderSelection.js +9 -5
- package/components/settings/vault-tabs/OverviewTab.d.ts +1 -1
- package/components/settings/vault-tabs/OverviewTab.d.ts.map +1 -1
- package/components/settings/vault-tabs/OverviewTab.js +7 -1
- package/components/settings/vault-tabs/RoutingTab.d.ts +1 -1
- package/components/settings/vault-tabs/RoutingTab.d.ts.map +1 -1
- package/components/settings/vault-tabs/RoutingTab.js +41 -14
- package/components/settings/vault-tabs/SecretsTab.d.ts +1 -1
- package/components/settings/vault-tabs/SecretsTab.d.ts.map +1 -1
- package/components/settings/vault-tabs/SecretsTab.js +3 -1
- package/components/setup/BootstrapStep.d.ts +1 -1
- package/components/setup/BootstrapStep.d.ts.map +1 -1
- package/components/setup/BootstrapStep.js +1 -2
- package/components/setup/setup-classes.d.ts +2 -2
- package/components/setup/setup-classes.d.ts.map +1 -1
- package/components/setup/setup-classes.js +2 -2
- package/components/shared/AppPageSidebar.d.ts +1 -1
- package/components/shared/AppPageSidebar.js +1 -1
- package/components/shared/CollapsibleSidebarSection.js +1 -1
- package/components/shared/LanguageDropdown.d.ts +1 -1
- package/components/shared/LanguageDropdown.d.ts.map +1 -1
- package/components/shared/LanguageDropdown.helpers.d.ts +1 -1
- package/components/shared/LanguageDropdown.js +4 -7
- package/components/shared/ThemeToggle.d.ts +1 -1
- package/components/shared/ThemeToggle.js +2 -2
- package/components/shared/confirm-delete-control.js +2 -2
- package/components/shell/ActionBanner.d.ts.map +1 -1
- package/components/shell/ActionBanner.js +3 -2
- package/components/shell/AssistantOverlay.d.ts +1 -1
- package/components/shell/AssistantOverlay.js +3 -3
- package/components/shell/BugReportModal.d.ts.map +1 -1
- package/components/shell/BugReportModal.js +6 -5
- package/components/shell/ChatSurface.d.ts +1 -1
- package/components/shell/ChatSurface.d.ts.map +1 -1
- package/components/shell/ChatSurface.js +7 -2
- package/components/shell/CloudHandoffBanner.d.ts +3 -2
- package/components/shell/CloudHandoffBanner.d.ts.map +1 -1
- package/components/shell/CloudHandoffBanner.js +9 -10
- package/components/shell/CommandPalette.d.ts.map +1 -1
- package/components/shell/CommandPalette.js +57 -5
- package/components/shell/ComputerUseApprovalOverlay.d.ts.map +1 -1
- package/components/shell/ComputerUseApprovalOverlay.js +10 -8
- package/components/shell/ConnectionFailedBanner.d.ts.map +1 -1
- package/components/shell/ConnectionFailedBanner.js +8 -3
- package/components/shell/ConnectionLostOverlay.d.ts.map +1 -1
- package/components/shell/ConnectionLostOverlay.js +7 -2
- package/components/shell/ContinuousChatOverlay.d.ts +2 -2
- package/components/shell/ContinuousChatOverlay.d.ts.map +1 -1
- package/components/shell/ContinuousChatOverlay.js +620 -168
- package/components/shell/HomePill.d.ts +1 -1
- package/components/shell/HomePill.js +1 -1
- package/components/shell/HomeScreen.d.ts +18 -6
- package/components/shell/HomeScreen.d.ts.map +1 -1
- package/components/shell/HomeScreen.js +84 -94
- package/components/shell/HomeSpringboardSurface.d.ts +21 -0
- package/components/shell/HomeSpringboardSurface.d.ts.map +1 -0
- package/components/shell/HomeSpringboardSurface.js +134 -0
- package/components/shell/KioskViewCanvas.d.ts +1 -1
- package/components/shell/LoadingScreen.d.ts +1 -1
- package/components/shell/LoadingScreen.d.ts.map +1 -1
- package/components/shell/LoadingScreen.js +29 -6
- package/components/shell/NotificationCenter.d.ts.map +1 -1
- package/components/shell/NotificationCenter.js +52 -20
- package/components/shell/PairingCommandHint.d.ts.map +1 -1
- package/components/shell/PairingCommandHint.js +4 -2
- package/components/shell/PairingView.d.ts.map +1 -1
- package/components/shell/PairingView.js +11 -2
- package/components/shell/RestartBanner.d.ts.map +1 -1
- package/components/shell/RestartBanner.js +9 -3
- package/components/shell/ShellControllerContext.hooks.d.ts +1 -1
- package/components/shell/ShellHeaderControls.d.ts +3 -3
- package/components/shell/ShellHeaderControls.d.ts.map +1 -1
- package/components/shell/ShellHeaderControls.js +2 -2
- package/components/shell/ShellOverlays.d.ts +1 -1
- package/components/shell/ShellOverlays.d.ts.map +1 -1
- package/components/shell/ShellOverlays.js +19 -4
- package/components/shell/ShortcutsOverlay.d.ts.map +1 -1
- package/components/shell/ShortcutsOverlay.js +10 -3
- package/components/shell/SlashCommandMenu.d.ts +2 -2
- package/components/shell/SlashCommandMenu.d.ts.map +1 -1
- package/components/shell/SlashCommandMenu.js +2 -2
- package/components/shell/StartupFailureView.d.ts +1 -1
- package/components/shell/StartupFailureView.js +3 -3
- package/components/shell/StartupShell.d.ts +1 -1
- package/components/shell/StartupShell.d.ts.map +1 -1
- package/components/shell/StartupShell.js +18 -6
- package/components/shell/SystemWarningBanner.d.ts.map +1 -1
- package/components/shell/SystemWarningBanner.js +5 -3
- package/components/shell/TopicChipsBar.d.ts +14 -0
- package/components/shell/TopicChipsBar.d.ts.map +1 -0
- package/components/shell/TopicChipsBar.js +18 -0
- package/components/shell/TopicGroup.d.ts +21 -0
- package/components/shell/TopicGroup.d.ts.map +1 -0
- package/components/shell/TopicGroup.js +30 -0
- package/components/shell/__e2e__/chat-ambient-fixture.js +2 -2
- package/components/shell/__e2e__/chat-sheet-fixture.js +13 -1
- package/components/shell/__e2e__/chatux-gesture-fixture.d.ts +13 -0
- package/components/shell/__e2e__/chatux-gesture-fixture.d.ts.map +1 -0
- package/components/shell/__e2e__/chatux-gesture-fixture.js +65 -0
- package/components/shell/__e2e__/home-screen-fixture.api-stub.d.ts +97 -9
- package/components/shell/__e2e__/home-screen-fixture.api-stub.d.ts.map +1 -1
- package/components/shell/__e2e__/home-screen-fixture.api-stub.js +30 -9
- package/components/shell/__e2e__/home-screen-fixture.catalog-stub.d.ts +20 -0
- package/components/shell/__e2e__/home-screen-fixture.catalog-stub.d.ts.map +1 -0
- package/components/shell/__e2e__/home-screen-fixture.catalog-stub.js +23 -0
- package/components/shell/__e2e__/home-screen-fixture.core-stub.d.ts +3 -0
- package/components/shell/__e2e__/home-screen-fixture.core-stub.d.ts.map +1 -0
- package/components/shell/__e2e__/home-screen-fixture.core-stub.js +6 -0
- package/components/shell/__e2e__/home-screen-fixture.js +10 -2
- package/components/shell/__e2e__/home-screen-fixture.platform-stub.d.ts +3 -0
- package/components/shell/__e2e__/home-screen-fixture.platform-stub.d.ts.map +1 -0
- package/components/shell/__e2e__/home-screen-fixture.platform-stub.js +6 -0
- package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.d.ts +5 -0
- package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.d.ts.map +1 -0
- package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.js +3 -0
- package/components/shell/__e2e__/home-screen-fixture.views-stub.d.ts +7 -0
- package/components/shell/__e2e__/home-screen-fixture.views-stub.d.ts.map +1 -1
- package/components/shell/__e2e__/home-screen-fixture.views-stub.js +68 -3
- package/components/shell/first-run-theme.d.ts +1 -1
- package/components/shell/glass-composer.helpers.d.ts +2 -2
- package/components/shell/glass-composer.helpers.d.ts.map +1 -1
- package/components/shell/glass-composer.helpers.js +2 -2
- package/components/shell/glass-composer.js +1 -1
- package/components/shell/home-springboard-events.d.ts +7 -0
- package/components/shell/home-springboard-events.d.ts.map +1 -0
- package/components/shell/home-springboard-events.js +6 -0
- package/components/shell/shell-state.d.ts +24 -1
- package/components/shell/shell-state.d.ts.map +1 -1
- package/components/shell/shell-state.js +19 -1
- package/components/shell/startup-shell-types.d.ts +1 -1
- package/components/shell/topic-grouping.d.ts +39 -0
- package/components/shell/topic-grouping.d.ts.map +1 -0
- package/components/shell/topic-grouping.js +81 -0
- package/components/shell/use-conversation-reset.d.ts +14 -0
- package/components/shell/use-conversation-reset.d.ts.map +1 -0
- package/components/shell/use-conversation-reset.js +25 -0
- package/components/shell/use-pull-gesture.d.ts +32 -7
- package/components/shell/use-pull-gesture.d.ts.map +1 -1
- package/components/shell/use-pull-gesture.js +146 -21
- package/components/shell/usePromptSuggestions.d.ts +3 -3
- package/components/shell/usePromptSuggestions.js +1 -1
- package/components/shell/useShellController.d.ts +42 -19
- package/components/shell/useShellController.d.ts.map +1 -1
- package/components/shell/useShellController.js +189 -15
- package/components/shell/useShellVoiceOutput.d.ts +1 -1
- package/components/steward/injected.d.ts +1 -1
- package/components/stream/StatusBar.js +5 -7
- package/components/tool-events/ToolCallEventLog.d.ts +1 -1
- package/components/tool-events/ToolCallEventLog.helpers.d.ts +2 -2
- package/components/training/JobDetailPanel.js +2 -2
- package/components/training/TrainingDashboard.js +1 -1
- package/components/training/hooks/useTrainingApi.d.ts +1 -1
- package/components/training/injected.d.ts +1 -1
- package/components/transcripts/TranscriptBody.d.ts.map +1 -1
- package/components/transcripts/TranscriptBody.js +14 -6
- package/components/transcripts/index.d.ts +4 -4
- package/components/ui/admin-dialog.d.ts +2 -2
- package/components/ui/admin-dialog.js +2 -2
- package/components/ui/badge.js +1 -1
- package/components/ui/button.js +1 -1
- package/components/ui/calendar.d.ts +1 -1
- package/components/ui/calendar.js +3 -3
- package/components/ui/carousel.d.ts +1 -1
- package/components/ui/chart.js +1 -1
- package/components/ui/checkbox.js +1 -1
- package/components/ui/code-block.js +1 -1
- package/components/ui/confirm-dialog.hooks.d.ts +1 -1
- package/components/ui/connection-status.d.ts.map +1 -1
- package/components/ui/connection-status.js +6 -6
- package/components/ui/copy-button.d.ts.map +1 -1
- package/components/ui/copy-button.js +10 -1
- package/components/ui/dialog.js +1 -1
- package/components/ui/dropdown-menu.js +4 -4
- package/components/ui/field-switch.js +1 -1
- package/components/ui/form-select.d.ts +1 -1
- package/components/ui/form-select.js +2 -2
- package/components/ui/grid.d.ts +1 -1
- package/components/ui/input-group.d.ts +1 -1
- package/components/ui/input-group.js +4 -4
- package/components/ui/input.js +3 -3
- package/components/ui/new-action-button.d.ts +1 -1
- package/components/ui/pagination.d.ts +1 -1
- package/components/ui/scroll-area.js +1 -1
- package/components/ui/select.js +2 -2
- package/components/ui/settings-controls.d.ts +6 -6
- package/components/ui/settings-controls.d.ts.map +1 -1
- package/components/ui/settings-controls.js +9 -9
- package/components/ui/slider.js +1 -1
- package/components/ui/stack.d.ts +2 -2
- package/components/ui/status-badge.helpers.d.ts +1 -1
- package/components/ui/switch.js +1 -1
- package/components/ui/tabs.d.ts.map +1 -1
- package/components/ui/tabs.js +2 -2
- package/components/ui/textarea.js +3 -3
- package/components/ui/toggle.js +1 -1
- package/components/ui/tooltip-extended.js +1 -1
- package/components/views/DynamicViewLoader.d.ts +12 -0
- package/components/views/DynamicViewLoader.d.ts.map +1 -1
- package/components/views/DynamicViewLoader.js +82 -18
- package/components/views/ShellViewAgentSurface.d.ts +1 -1
- package/components/views/TerminalPluginView.d.ts.map +1 -1
- package/components/views/TerminalPluginView.js +0 -1
- package/components/views/ViewIcon.d.ts.map +1 -1
- package/components/views/ViewIcon.js +22 -4
- package/components/views/ViewTileImage.d.ts +25 -0
- package/components/views/ViewTileImage.d.ts.map +1 -0
- package/components/views/ViewTileImage.js +52 -0
- package/components/views/view-interact-registry.d.ts +1 -1
- package/components/workspace/AppWorkspaceChrome.d.ts +12 -1
- package/components/workspace/AppWorkspaceChrome.d.ts.map +1 -1
- package/components/workspace/AppWorkspaceChrome.js +3 -3
- package/config/boot-config-store.d.ts +9 -8
- package/config/boot-config-store.d.ts.map +1 -1
- package/config/boot-config-store.js +1 -50
- package/config/branding-react.hooks.d.ts +1 -1
- package/config/branding.d.ts +2 -2
- package/config/config-catalog.d.ts +10 -366
- package/config/config-catalog.d.ts.map +1 -1
- package/config/config-catalog.js +10 -705
- package/config/index.d.ts +7 -7
- package/content-packs/index.d.ts +3 -3
- package/events/index.d.ts +33 -63
- package/events/index.d.ts.map +1 -1
- package/events/index.js +41 -37
- package/first-run/AgentPicker.d.ts +8 -2
- package/first-run/AgentPicker.d.ts.map +1 -1
- package/first-run/AgentPicker.js +4 -4
- package/first-run/CompactOnboarding.d.ts.map +1 -1
- package/first-run/CompactOnboarding.js +2 -2
- package/first-run/deep-link-handler.d.ts +1 -1
- package/first-run/ensure-store-build-workspace-folder.d.ts +1 -1
- package/first-run/first-run-config.d.ts +1 -1
- package/first-run/first-run.d.ts +3 -3
- package/first-run/mobile-runtime-mode.d.ts +1 -1
- package/first-run/pre-seed-local-runtime.d.ts +1 -1
- package/first-run/setup-steps.d.ts +1 -1
- package/first-run/use-first-run-controller.d.ts +3 -3
- package/first-run/use-first-run-controller.d.ts.map +1 -1
- package/first-run/use-first-run-controller.js +64 -68
- package/genui/actions.d.ts +1 -1
- package/genui/index.d.ts +8 -8
- package/genui/modes.d.ts +1 -1
- package/genui/pipe.d.ts +1 -1
- package/genui/renderer.d.ts +1 -1
- package/genui/starter-pack-demo.d.ts +1 -1
- package/genui/streaming.d.ts +1 -1
- package/genui/use-json-render-message.d.ts +1 -1
- package/genui/use-ui-stream.d.ts +1 -1
- package/genui/use-ui-stream.d.ts.map +1 -1
- package/genui/use-ui-stream.js +5 -5
- package/genui/validator.d.ts +1 -1
- package/hooks/BugReportProvider.d.ts +1 -1
- package/hooks/frame-budget.d.ts +124 -0
- package/hooks/frame-budget.d.ts.map +1 -0
- package/hooks/frame-budget.js +183 -0
- package/hooks/index.d.ts +27 -24
- package/hooks/index.d.ts.map +1 -1
- package/hooks/index.js +3 -0
- package/hooks/resource-cache.d.ts.map +1 -1
- package/hooks/resource-cache.js +36 -0
- package/hooks/useAccounts.d.ts +2 -4
- package/hooks/useAccounts.d.ts.map +1 -1
- package/hooks/useAccounts.js +6 -4
- package/hooks/useActivityEvents.d.ts +12 -0
- package/hooks/useActivityEvents.d.ts.map +1 -1
- package/hooks/useActivityEvents.js +48 -69
- package/hooks/useAuthStatus.d.ts +1 -1
- package/hooks/useAuthStatus.d.ts.map +1 -1
- package/hooks/useAuthStatus.js +19 -1
- package/hooks/useAvailableViews.d.ts +17 -3
- package/hooks/useAvailableViews.d.ts.map +1 -1
- package/hooks/useAvailableViews.js +89 -10
- package/hooks/useCachedResource.d.ts +1 -1
- package/hooks/useCloudHandoffPhase.d.ts +1 -1
- package/hooks/useCloudHandoffPhase.d.ts.map +1 -1
- package/hooks/useCloudHandoffPhase.js +15 -9
- package/hooks/useConnectorAccounts.d.ts +2 -4
- package/hooks/useConnectorAccounts.d.ts.map +1 -1
- package/hooks/useConnectorAccounts.js +1 -1
- package/hooks/useConnectorReconnect.d.ts +1 -1
- package/hooks/useConnectorSendAsAccount.d.ts +3 -5
- package/hooks/useConnectorSendAsAccount.d.ts.map +1 -1
- package/hooks/useContextMenu.d.ts +1 -1
- package/hooks/useContextMenu.d.ts.map +1 -1
- package/hooks/useContextMenu.js +6 -2
- package/hooks/useContinuousChat.d.ts +2 -2
- package/hooks/useDefaultProviderPresets.d.ts +1 -1
- package/hooks/useDesktopTabs.d.ts +1 -1
- package/hooks/useDesktopTabs.d.ts.map +1 -1
- package/hooks/useDesktopTabs.js +27 -9
- package/hooks/useFrameBudgetMonitor.d.ts +30 -0
- package/hooks/useFrameBudgetMonitor.d.ts.map +1 -0
- package/hooks/useFrameBudgetMonitor.js +105 -0
- package/hooks/useKeyboardShortcuts.d.ts +4 -0
- package/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/hooks/useKeyboardShortcuts.js +19 -11
- package/hooks/useLayoutShiftMonitor.d.ts +43 -0
- package/hooks/useLayoutShiftMonitor.d.ts.map +1 -0
- package/hooks/useLayoutShiftMonitor.js +128 -0
- package/hooks/useNow.d.ts +10 -0
- package/hooks/useNow.d.ts.map +1 -0
- package/hooks/useNow.js +18 -0
- package/hooks/useRuntimeMode.d.ts +1 -1
- package/hooks/useSignalPairing.d.ts +2 -2
- package/hooks/useViewCatalog.d.ts +2 -2
- package/hooks/useViewCatalog.js +5 -5
- package/hooks/useViewEvent.d.ts +1 -1
- package/hooks/useVoiceChat.d.ts +17 -6
- package/hooks/useVoiceChat.d.ts.map +1 -1
- package/hooks/useVoiceChat.js +49 -2
- package/hooks/useWhatsAppPairing.d.ts +2 -2
- package/hooks/view-catalog.d.ts +37 -5
- package/hooks/view-catalog.d.ts.map +1 -1
- package/hooks/view-catalog.js +75 -5
- package/i18n/index.d.ts +1 -1
- package/i18n/locales/en.json +65 -21
- package/i18n/locales/es.json +15 -16
- package/i18n/locales/ja.json +15 -16
- package/i18n/locales/ko.json +15 -16
- package/i18n/locales/pt.json +15 -16
- package/i18n/locales/tl.json +15 -16
- package/i18n/locales/vi.json +15 -16
- package/i18n/locales/zh-CN.json +15 -16
- package/i18n/region.d.ts +1 -1
- package/index.d.ts +146 -138
- package/index.d.ts.map +1 -1
- package/index.js +12 -2
- package/layouts/chat-panel-layout/index.d.ts +1 -1
- package/layouts/content-layout/index.d.ts +1 -1
- package/layouts/index.d.ts +4 -4
- package/layouts/page-layout/index.d.ts +4 -4
- package/layouts/page-layout/page-layout-mobile-drawer.d.ts +1 -1
- package/layouts/page-layout/page-layout-types.d.ts +2 -2
- package/layouts/page-layout/page-layout.d.ts +1 -1
- package/layouts/workspace-layout/index.d.ts +3 -3
- package/layouts/workspace-layout/workspace-layout-types.d.ts +1 -1
- package/layouts/workspace-layout/workspace-layout.d.ts +1 -1
- package/layouts/workspace-layout/workspace-layout.d.ts.map +1 -1
- package/layouts/workspace-layout/workspace-layout.js +2 -1
- package/navigation/index.d.ts +4 -4
- package/navigation/index.d.ts.map +1 -1
- package/navigation/index.js +26 -16
- package/package.json +26 -10
- package/perf/PerfOverlay.d.ts +21 -0
- package/perf/PerfOverlay.d.ts.map +1 -0
- package/perf/PerfOverlay.js +90 -0
- package/perf/perf-hud-control.d.ts +21 -0
- package/perf/perf-hud-control.d.ts.map +1 -0
- package/perf/perf-hud-control.js +98 -0
- package/platform/assistant-launch-payload.d.ts.map +1 -1
- package/platform/assistant-launch-payload.js +0 -3
- package/platform/cloud-preference-patch.d.ts +1 -1
- package/platform/desktop-permissions-client.d.ts +1 -1
- package/platform/first-run-reset.d.ts +1 -1
- package/platform/index.d.ts +14 -14
- package/platform/init.d.ts +1 -1
- package/platform/mobile-permissions-client.d.ts +1 -1
- package/platform/platform-guards.d.ts +8 -0
- package/platform/platform-guards.d.ts.map +1 -1
- package/platform/platform-guards.js +2 -4
- package/platform/types.d.ts +1 -1
- package/platform/window-shell.d.ts +1 -1
- package/retained-lazy.d.ts +1 -2
- package/retained-lazy.d.ts.map +1 -1
- package/services/app-updates/update-policy.d.ts +1 -1
- package/services/app-updates/update-policy.d.ts.map +1 -1
- package/services/app-updates/update-policy.js +1 -1
- package/services/local-inference/active-model.d.ts +3 -3
- package/services/local-inference/assignments.d.ts +6 -8
- package/services/local-inference/assignments.d.ts.map +1 -1
- package/services/local-inference/assignments.js +31 -14
- package/services/local-inference/catalog-policy.d.ts +2 -1
- package/services/local-inference/catalog-policy.d.ts.map +1 -1
- package/services/local-inference/catalog-policy.js +6 -0
- package/services/local-inference/catalog.d.ts +1 -1
- package/services/local-inference/catalog.d.ts.map +1 -1
- package/services/local-inference/catalog.js +1 -1
- package/services/local-inference/custom-search.d.ts +2 -1
- package/services/local-inference/custom-search.d.ts.map +1 -1
- package/services/local-inference/custom-search.js +13 -21
- package/services/local-inference/device-bridge.d.ts +1 -1
- package/services/local-inference/downloader.d.ts +6 -5
- package/services/local-inference/downloader.d.ts.map +1 -1
- package/services/local-inference/downloader.js +9 -5
- package/services/local-inference/engine.d.ts +1 -1
- package/services/local-inference/external-scanner.d.ts +1 -1
- package/services/local-inference/hardware.d.ts +2 -2
- package/services/local-inference/hf-search.d.ts +5 -20
- package/services/local-inference/hf-search.d.ts.map +1 -1
- package/services/local-inference/hf-search.js +14 -272
- package/services/local-inference/home-model-status.d.ts +1 -1
- package/services/local-inference/index.d.ts +10 -10
- package/services/local-inference/readiness.d.ts +1 -1
- package/services/local-inference/recommendation.d.ts +1 -1
- package/services/local-inference/registry.d.ts +11 -13
- package/services/local-inference/registry.d.ts.map +1 -1
- package/services/local-inference/registry.js +18 -17
- package/services/local-inference/routing-policy.d.ts +6 -2
- package/services/local-inference/routing-policy.d.ts.map +1 -1
- package/services/local-inference/routing-policy.js +36 -8
- package/services/local-inference/service.d.ts +6 -6
- package/services/local-inference/service.d.ts.map +1 -1
- package/services/local-inference/service.js +19 -8
- package/services/local-inference/token-tree.d.ts +1 -1
- package/slots/task-coordinator-slots.d.ts +2 -2
- package/spatial/context.d.ts +1 -1
- package/spatial/dom.d.ts +9 -3
- package/spatial/dom.d.ts.map +1 -1
- package/spatial/dom.js +13 -3
- package/spatial/evaluate.d.ts +1 -1
- package/spatial/index.d.ts +6 -6
- package/spatial/primitives.d.ts +3 -3
- package/spatial/primitives.d.ts.map +1 -1
- package/spatial/primitives.js +10 -7
- package/spatial/tui/engine.d.ts +1 -1
- package/spatial/tui/index.d.ts +3 -3
- package/spatial/tui/index.d.ts.map +1 -1
- package/spatial/tui/index.js +2 -2
- package/spatial/tui/renderer.d.ts +9 -2
- package/spatial/tui/renderer.d.ts.map +1 -1
- package/spatial/tui/renderer.js +47 -2
- package/state/AppContext.d.ts +1 -1
- package/state/AppContext.d.ts.map +1 -1
- package/state/AppContext.js +83 -30
- package/state/ChatComposerContext.hooks.d.ts +1 -1
- package/state/ChatTurnStatusContext.hooks.d.ts +27 -0
- package/state/ChatTurnStatusContext.hooks.d.ts.map +1 -0
- package/state/ChatTurnStatusContext.hooks.js +24 -0
- package/state/CompanionSceneConfigContext.hooks.d.ts +3 -3
- package/state/ConversationMessagesContext.hooks.d.ts +26 -0
- package/state/ConversationMessagesContext.hooks.d.ts.map +1 -0
- package/state/ConversationMessagesContext.hooks.js +22 -0
- package/state/PtySessionsContext.hooks.d.ts +1 -1
- package/state/TranslationContext.hooks.d.ts +1 -1
- package/state/TranslationProvider.d.ts +2 -2
- package/state/action-notice.d.ts +31 -1
- package/state/action-notice.d.ts.map +1 -1
- package/state/action-notice.js +27 -1
- package/state/agent-profiles.d.ts +10 -2
- package/state/agent-profiles.d.ts.map +1 -1
- package/state/agent-profiles.js +20 -0
- package/state/agent-runtime-target.d.ts +2 -2
- package/state/app-store.d.ts +52 -0
- package/state/app-store.d.ts.map +1 -0
- package/state/app-store.js +169 -0
- package/state/autonomy.d.ts +1 -1
- package/state/chat-conversation-guards.d.ts +1 -1
- package/state/chat-conversation-guards.d.ts.map +1 -1
- package/state/chat-conversation-guards.js +0 -1
- package/state/complete-reset-local-state-after-wipe.d.ts +1 -1
- package/state/conversation-message-filter.d.ts +1 -1
- package/state/first-run-bootstrap.d.ts +1 -1
- package/state/first-run-restart.d.ts +1 -1
- package/state/handle-reset-applied-from-main.d.ts +2 -2
- package/state/index.d.ts +24 -18
- package/state/index.d.ts.map +1 -1
- package/state/index.js +6 -0
- package/state/internal.d.ts +11 -11
- package/state/notifications/navigate-deep-link.d.ts +27 -0
- package/state/notifications/navigate-deep-link.d.ts.map +1 -0
- package/state/notifications/navigate-deep-link.js +48 -0
- package/state/notifications/notification-store.d.ts +2 -2
- package/state/notifications/notification-store.d.ts.map +1 -1
- package/state/notifications/notification-store.js +4 -4
- package/state/parsers.d.ts +3 -3
- package/state/parsers.d.ts.map +1 -1
- package/state/parsers.js +9 -3
- package/state/persistence.d.ts +23 -8
- package/state/persistence.d.ts.map +1 -1
- package/state/persistence.js +86 -4
- package/state/screen-capture-bridge.d.ts +8 -0
- package/state/screen-capture-bridge.d.ts.map +1 -0
- package/state/screen-capture-bridge.js +124 -0
- package/state/setup-resume.d.ts +2 -2
- package/state/shell-routing.d.ts +3 -3
- package/state/shell-surface-store.d.ts +50 -0
- package/state/shell-surface-store.d.ts.map +1 -0
- package/state/shell-surface-store.js +130 -0
- package/state/springboard-layout.d.ts +85 -0
- package/state/springboard-layout.d.ts.map +1 -0
- package/state/springboard-layout.js +180 -0
- package/state/startup-coordinator.d.ts +1 -1
- package/state/startup-phase-hydrate.d.ts +5 -5
- package/state/startup-phase-hydrate.d.ts.map +1 -1
- package/state/startup-phase-hydrate.js +6 -0
- package/state/startup-phase-poll.d.ts +8 -8
- package/state/startup-phase-restore.d.ts +22 -6
- package/state/startup-phase-restore.d.ts.map +1 -1
- package/state/startup-phase-restore.js +91 -1
- package/state/startup-phase-runtime.d.ts +3 -3
- package/state/startup-telemetry.d.ts +73 -0
- package/state/startup-telemetry.d.ts.map +1 -0
- package/state/startup-telemetry.js +139 -0
- package/state/types.d.ts +36 -12
- package/state/types.d.ts.map +1 -1
- package/state/types.js +13 -0
- package/state/ui-preferences.d.ts +39 -0
- package/state/ui-preferences.d.ts.map +1 -1
- package/state/ui-preferences.js +30 -1
- package/state/use-startup-shell-controller.d.ts +8 -1
- package/state/use-startup-shell-controller.d.ts.map +1 -1
- package/state/use-startup-shell-controller.js +63 -3
- package/state/useApp.d.ts +1 -1
- package/state/useAppLifecycleEvents.d.ts +1 -1
- package/state/useAppProviderEffects.d.ts +3 -3
- package/state/useBackgroundConfig.d.ts +16 -0
- package/state/useBackgroundConfig.d.ts.map +1 -0
- package/state/useBackgroundConfig.js +21 -0
- package/state/useCharacterState.d.ts +2 -2
- package/state/useChatCallbacks.d.ts +40 -7
- package/state/useChatCallbacks.d.ts.map +1 -1
- package/state/useChatCallbacks.js +218 -132
- package/state/useChatLifecycle.d.ts +12 -4
- package/state/useChatLifecycle.d.ts.map +1 -1
- package/state/useChatLifecycle.js +26 -2
- package/state/useChatSend.d.ts +7 -4
- package/state/useChatSend.d.ts.map +1 -1
- package/state/useChatSend.js +126 -21
- package/state/useChatState.d.ts +4 -4
- package/state/useContentPack.d.ts.map +1 -1
- package/state/useContentPack.js +12 -2
- package/state/useDataLoaders.d.ts +6 -5
- package/state/useDataLoaders.d.ts.map +1 -1
- package/state/useDataLoaders.js +99 -5
- package/state/useDeveloperMode.d.ts.map +1 -1
- package/state/useDeveloperMode.js +48 -8
- package/state/useDisplayPreferences.d.ts +6 -2
- package/state/useDisplayPreferences.d.ts.map +1 -1
- package/state/useDisplayPreferences.js +40 -2
- package/state/useFirstRunCallbacks.d.ts +8 -8
- package/state/useFirstRunState.d.ts +3 -3
- package/state/useLifecycleState.d.ts +9 -2
- package/state/useLifecycleState.d.ts.map +1 -1
- package/state/useLifecycleState.js +26 -1
- package/state/useLogsState.d.ts +1 -1
- package/state/useMiscUiState.d.ts +1 -1
- package/state/useNavigationState.d.ts +2 -2
- package/state/usePluginsSkillsState.d.ts +3 -3
- package/state/usePreviewMode.d.ts +4 -0
- package/state/usePreviewMode.d.ts.map +1 -0
- package/state/usePreviewMode.js +93 -0
- package/state/useStartupCoordinator.d.ts +5 -5
- package/state/useStartupCoordinator.d.ts.map +1 -1
- package/state/useStartupCoordinator.js +9 -0
- package/state/useStreamingText.d.ts +1 -1
- package/state/useTriggersState.d.ts +1 -1
- package/state/useViewKinds.d.ts +19 -0
- package/state/useViewKinds.d.ts.map +1 -0
- package/state/useViewKinds.js +28 -0
- package/state/useWalletState.d.ts +3 -3
- package/state/vrm.d.ts +1 -1
- package/storybook/home-widget-decorator.d.ts +21 -0
- package/storybook/home-widget-decorator.d.ts.map +1 -0
- package/storybook/home-widget-decorator.js +53 -0
- package/storybook/mock-providers.d.ts +2 -2
- package/storybook/mock-providers.d.ts.map +1 -1
- package/storybook/mock-providers.helpers.d.ts +1 -1
- package/storybook/mock-providers.js +20 -1
- package/styles/base.css +66 -32
- package/styles/brand-gold.css +0 -7
- package/styles/styles.css +10 -5
- package/testing/layout-stability.d.ts +67 -0
- package/testing/layout-stability.d.ts.map +1 -0
- package/testing/layout-stability.js +106 -0
- package/testing/render-counter.d.ts +56 -0
- package/testing/render-counter.d.ts.map +1 -0
- package/testing/render-counter.js +62 -0
- package/themes/presets.d.ts.map +1 -1
- package/themes/presets.js +17 -15
- package/utils/attachment-url.d.ts +42 -0
- package/utils/attachment-url.d.ts.map +1 -0
- package/utils/attachment-url.js +130 -0
- package/utils/cloud-agent-base.d.ts +0 -1
- package/utils/cloud-agent-base.d.ts.map +1 -1
- package/utils/cloud-agent-base.js +0 -8
- package/utils/download-share.d.ts +65 -0
- package/utils/download-share.d.ts.map +1 -0
- package/utils/download-share.js +292 -0
- package/utils/event-source.d.ts +17 -0
- package/utils/event-source.d.ts.map +1 -0
- package/utils/event-source.js +36 -0
- package/utils/image-attachment.d.ts +156 -4
- package/utils/image-attachment.d.ts.map +1 -1
- package/utils/image-attachment.js +193 -4
- package/utils/index.d.ts +33 -33
- package/utils/workflow-executions.d.ts +1 -1
- package/utils/workflow-json.d.ts +1 -1
- package/view-telemetry.d.ts +30 -0
- package/view-telemetry.d.ts.map +1 -0
- package/view-telemetry.js +47 -0
- package/views/view-interact-protocol.d.ts +6 -0
- package/views/view-interact-protocol.d.ts.map +1 -1
- package/views/view-interact-protocol.js +6 -0
- package/voice/audio-frame-diarization-harness.d.ts +5 -0
- package/voice/audio-frame-diarization-harness.d.ts.map +1 -1
- package/voice/audio-frame-pump.d.ts +1 -1
- package/voice/character-voice-config.d.ts +2 -2
- package/voice/end-of-turn.d.ts +14 -11
- package/voice/end-of-turn.d.ts.map +1 -1
- package/voice/end-of-turn.js +14 -119
- package/voice/index.d.ts +11 -10
- package/voice/index.d.ts.map +1 -1
- package/voice/index.js +1 -0
- package/voice/jni-voice-harness.d.ts +19 -4
- package/voice/jni-voice-harness.d.ts.map +1 -1
- package/voice/jni-voice-harness.js +45 -10
- package/voice/jni-voice-pipeline.d.ts +27 -3
- package/voice/jni-voice-pipeline.d.ts.map +1 -1
- package/voice/jni-voice-pipeline.js +40 -2
- package/voice/local-asr-capture.js +1 -1
- package/voice/local-asr-transcribe.d.ts +2 -2
- package/voice/local-asr-transcribe.d.ts.map +1 -1
- package/voice/local-asr-transcribe.js +3 -3
- package/voice/playback-frame-pump.d.ts +49 -0
- package/voice/playback-frame-pump.d.ts.map +1 -0
- package/voice/playback-frame-pump.js +387 -0
- package/voice/should-respond.d.ts +7 -32
- package/voice/should-respond.d.ts.map +1 -1
- package/voice/should-respond.js +7 -68
- package/voice/useVoiceConfig.d.ts +1 -1
- package/voice/voice-capture-factory.d.ts +2 -2
- package/voice/voice-capture-factory.js +3 -3
- package/voice/voice-chat-playback.d.ts +1 -1
- package/voice/voice-chat-types.d.ts +2 -2
- package/voice/voice-provider-defaults.d.ts +8 -5
- package/voice/voice-provider-defaults.d.ts.map +1 -1
- package/voice/voice-provider-defaults.js +17 -10
- package/voice/voice-selftest/VoiceSelfTestShell.d.ts +11 -0
- package/voice/voice-selftest/VoiceSelfTestShell.d.ts.map +1 -1
- package/voice/voice-selftest/VoiceSelfTestShell.js +1 -4
- package/voice/voice-selftest/VoiceWorkbenchShell.d.ts +29 -0
- package/voice/voice-selftest/VoiceWorkbenchShell.d.ts.map +1 -0
- package/voice/voice-selftest/VoiceWorkbenchShell.js +133 -0
- package/voice/voice-selftest/timing.d.ts +8 -0
- package/voice/voice-selftest/timing.d.ts.map +1 -0
- package/voice/voice-selftest/timing.js +7 -0
- package/voice/voice-selftest/voice-selftest-harness.d.ts +1 -1
- package/voice/voice-selftest/voice-selftest-harness.d.ts.map +1 -1
- package/voice/voice-selftest/voice-selftest-harness.js +1 -2
- package/voice/voice-selftest/voice-workbench-player.d.ts +139 -0
- package/voice/voice-selftest/voice-workbench-player.d.ts.map +1 -0
- package/voice/voice-selftest/voice-workbench-player.js +401 -0
- package/voice/voice-turn-signal.d.ts +15 -26
- package/voice/voice-turn-signal.d.ts.map +1 -1
- package/voice/voice-turn-signal.js +7 -51
- package/widgets/WidgetHost.d.ts +10 -4
- package/widgets/WidgetHost.d.ts.map +1 -1
- package/widgets/WidgetHost.js +149 -30
- package/widgets/__fixtures__/home-widget-mock-data.d.ts +89 -0
- package/widgets/__fixtures__/home-widget-mock-data.d.ts.map +1 -0
- package/widgets/__fixtures__/home-widget-mock-data.js +388 -0
- package/widgets/home-attention-store.d.ts +40 -0
- package/widgets/home-attention-store.d.ts.map +1 -0
- package/widgets/home-attention-store.js +84 -0
- package/widgets/home-priority.d.ts +136 -0
- package/widgets/home-priority.d.ts.map +1 -0
- package/widgets/home-priority.js +276 -0
- package/widgets/index.d.ts +10 -7
- package/widgets/index.d.ts.map +1 -1
- package/widgets/index.js +4 -2
- package/widgets/registry-store.d.ts +9 -11
- package/widgets/registry-store.d.ts.map +1 -1
- package/widgets/registry-store.js +8 -12
- package/widgets/registry.d.ts +16 -4
- package/widgets/registry.d.ts.map +1 -1
- package/widgets/registry.js +432 -8
- package/widgets/types.d.ts +12 -4
- package/widgets/types.d.ts.map +1 -1
- package/widgets/types.js +7 -1
- package/widgets/useChatSidebarVisibility.d.ts +6 -3
- package/widgets/useChatSidebarVisibility.d.ts.map +1 -1
- package/widgets/useChatSidebarVisibility.js +15 -11
- package/widgets/visibility.d.ts +16 -10
- package/widgets/visibility.d.ts.map +1 -1
- package/widgets/visibility.js +25 -13
- package/api/agent-client-type-shim.d.ts +0 -24
- package/api/agent-client-type-shim.d.ts.map +0 -1
- package/api/agent-client-type-shim.js +0 -1
- package/cloud/account-security/use-document-title.d.ts +0 -10
- package/cloud/account-security/use-document-title.d.ts.map +0 -1
- package/cloud/account-security/use-document-title.js +0 -20
- package/cloud/admin/lib/format-usd.d.ts +0 -11
- package/cloud/admin/lib/format-usd.d.ts.map +0 -1
- package/cloud/admin/lib/format-usd.js +0 -18
- package/cloud/admin/use-document-title.d.ts +0 -10
- package/cloud/admin/use-document-title.d.ts.map +0 -1
- package/cloud/api-explorer/use-document-title.d.ts +0 -11
- package/cloud/api-explorer/use-document-title.d.ts.map +0 -1
- package/cloud/api-explorer/use-document-title.js +0 -21
- package/cloud/api-keys/use-document-title.d.ts +0 -10
- package/cloud/api-keys/use-document-title.d.ts.map +0 -1
- package/cloud/api-keys/use-document-title.js +0 -20
- package/cloud/applications/lib/auth-query.d.ts +0 -14
- package/cloud/applications/lib/auth-query.d.ts.map +0 -1
- package/cloud/applications/lib/auth-query.js +0 -18
- package/cloud/applications/lib/use-copy-feedback.d.ts +0 -9
- package/cloud/applications/lib/use-copy-feedback.d.ts.map +0 -1
- package/cloud/applications/lib/use-copy-feedback.js +0 -13
- package/cloud/applications/lib/use-session-auth.d.ts +0 -28
- package/cloud/applications/lib/use-session-auth.d.ts.map +0 -1
- package/cloud/approvals/lib/auth-query.d.ts +0 -18
- package/cloud/approvals/lib/auth-query.d.ts.map +0 -1
- package/cloud/approvals/lib/auth-query.js +0 -22
- package/cloud/approvals/lib/use-session-auth.d.ts +0 -28
- package/cloud/approvals/lib/use-session-auth.d.ts.map +0 -1
- package/cloud/approvals/lib/use-session-auth.js +0 -97
- package/cloud/documents/lib/auth-query.d.ts +0 -17
- package/cloud/documents/lib/auth-query.d.ts.map +0 -1
- package/cloud/documents/lib/use-session-auth.d.ts +0 -27
- package/cloud/documents/lib/use-session-auth.d.ts.map +0 -1
- package/cloud/documents/lib/use-session-auth.js +0 -96
- package/cloud/documents/use-document-title.d.ts +0 -11
- package/cloud/documents/use-document-title.d.ts.map +0 -1
- package/cloud/documents/use-document-title.js +0 -21
- package/cloud/instances/lib/format-bytes.d.ts +0 -19
- package/cloud/instances/lib/format-bytes.d.ts.map +0 -1
- package/cloud/instances/lib/format-bytes.js +0 -25
- package/cloud/instances/lib/use-copy-feedback.d.ts +0 -9
- package/cloud/instances/lib/use-copy-feedback.d.ts.map +0 -1
- package/cloud/instances/lib/use-document-title.d.ts +0 -13
- package/cloud/instances/lib/use-document-title.d.ts.map +0 -1
- package/cloud/instances/lib/use-document-title.js +0 -23
- package/cloud/monetization/lib/format-usd.d.ts +0 -12
- package/cloud/monetization/lib/format-usd.d.ts.map +0 -1
- package/cloud/monetization/lib/format-usd.js +0 -19
- package/cloud/monetization/use-document-title.d.ts +0 -10
- package/cloud/monetization/use-document-title.d.ts.map +0 -1
- package/cloud/monetization/use-document-title.js +0 -20
- package/components/local-inference/CustomModelSearch.d.ts +0 -19
- package/components/local-inference/CustomModelSearch.d.ts.map +0 -1
- package/components/local-inference/CustomModelSearch.js +0 -128
- package/components/pages/ViewCatalog.d.ts +0 -10
- package/components/pages/ViewCatalog.d.ts.map +0 -1
- package/components/pages/ViewCatalog.js +0 -600
- package/components/shell/ChatAmbientBackground.d.ts +0 -8
- package/components/shell/ChatAmbientBackground.d.ts.map +0 -1
- package/components/shell/ChatAmbientBackground.js +0 -51
|
@@ -1,25 +1,34 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { transcriptPlainText } from "@elizaos/shared/transcripts";
|
|
3
|
-
import { FileText, Film,
|
|
3
|
+
import { Check, Copy, FileText, Film, LayoutGrid, Loader2, Maximize2, Mic, Minimize2, Music, RotateCcw, SendHorizontal, } from "lucide-react";
|
|
4
4
|
import { AnimatePresence, animate, motion, useMotionValue, useMotionValueEvent, useReducedMotion, useTransform, } from "motion/react";
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import { client } from "../../api/client.js";
|
|
7
|
-
import { parseSlashDraft, runSlashExecution, splitLeadingSlashCommand, } from "../../chat/slash-menu.js";
|
|
8
|
-
import { TUTORIAL_CHAT_CONTROL_EVENT, } from "../../events/index.js";
|
|
7
|
+
import { parseSlashDraft, resolveClientShortcutExecution, runSlashExecution, splitLeadingSlashCommand, } from "../../chat/slash-menu.js";
|
|
8
|
+
import { CHAT_PREFILL_EVENT, TUTORIAL_CHAT_CONTROL_EVENT, } from "../../events/index.js";
|
|
9
9
|
import { Z_SHELL_OVERLAY } from "../../lib/floating-layers.js";
|
|
10
10
|
import { cn } from "../../lib/utils.js";
|
|
11
11
|
import { useViewChatBinding } from "../../state/view-chat-binding.js";
|
|
12
12
|
import { copyTextToClipboard } from "../../utils/clipboard.js";
|
|
13
|
-
import { CHAT_UPLOAD_ACCEPT, chatUploadKind,
|
|
13
|
+
import { CHAT_UPLOAD_ACCEPT, chatUploadKind, classifyComposerPaste, intakeAttachmentFiles, MAX_CHAT_IMAGES, summarizeDroppedAttachments, } from "../../utils/image-attachment.js";
|
|
14
|
+
import { InlineWidgetText } from "../chat/InlineWidgetText.js";
|
|
14
15
|
import { MessageAttachments } from "../chat/MessageAttachments.js";
|
|
16
|
+
import { SensitiveRequestBlock } from "../chat/MessageContent.js";
|
|
17
|
+
import { conversationTranscriptText } from "../chat/message-parser-helpers.js";
|
|
15
18
|
import { ThinkingBlock } from "../chat/ThinkingBlock.js";
|
|
19
|
+
import { withTranscriptMarker } from "../chat/TranscriptViewerOverlay.js";
|
|
16
20
|
import { SlashCommandMenu, useSlashMenu } from "./SlashCommandMenu.js";
|
|
21
|
+
import { selectVisibleShellMessages } from "./shell-state.js";
|
|
22
|
+
import { TopicChipsBar } from "./TopicChipsBar.js";
|
|
23
|
+
import { TopicGroup } from "./TopicGroup.js";
|
|
24
|
+
import { deriveChannelTopics, groupMessagesByTopic } from "./topic-grouping.js";
|
|
17
25
|
import { usePullGesture } from "./use-pull-gesture.js";
|
|
18
26
|
import { usePromptSuggestions } from "./usePromptSuggestions.js";
|
|
19
27
|
/** No-op slash controller so the overlay renders without a provider (stories). */
|
|
20
28
|
const EMPTY_SLASH_CONTROLLER = {
|
|
21
29
|
commands: [],
|
|
22
30
|
loading: false,
|
|
31
|
+
naturalShortcutsEnabled: false,
|
|
23
32
|
resolveChoices: () => [],
|
|
24
33
|
resolveSection: () => undefined,
|
|
25
34
|
navigateTab: () => { },
|
|
@@ -74,10 +83,6 @@ const SHEET_TOP_MARGIN = 72;
|
|
|
74
83
|
// of resting free — so near-detent releases are deterministic + clean, and only
|
|
75
84
|
// the clear gaps between detents keep the free-drag rest height.
|
|
76
85
|
const SHEET_DETENT_MAGNET = 64;
|
|
77
|
-
// Cap how many turns are actually rendered. Older messages stay in state (the
|
|
78
|
-
// agent's context is untouched) — this only bounds DOM nodes so a long thread
|
|
79
|
-
// can't jank scrolling on a phone, without pulling in a virtualizer.
|
|
80
|
-
const MAX_RENDERED_MESSAGES = 80;
|
|
81
86
|
// Feature flag: the resting one-tap prompt-suggestion strip. Off for now so the
|
|
82
87
|
// composer can be tested without it; flip to true to bring the strip back.
|
|
83
88
|
const SHOW_PROMPT_SUGGESTIONS = false;
|
|
@@ -128,7 +133,7 @@ function wavBytesToBase64(bytes) {
|
|
|
128
133
|
let binary = "";
|
|
129
134
|
const chunk = 0x8000;
|
|
130
135
|
for (let i = 0; i < bytes.length; i += chunk) {
|
|
131
|
-
binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
|
|
136
|
+
binary += String.fromCharCode(...Array.from(bytes.subarray(i, i + chunk)));
|
|
132
137
|
}
|
|
133
138
|
return btoa(binary);
|
|
134
139
|
}
|
|
@@ -146,7 +151,7 @@ function SoftButton({ glyph, icon: Icon, label, onClick, onPointerDown, onPointe
|
|
|
146
151
|
return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, "aria-disabled": disabled, onClick: disabled ? undefined : onClick, onPointerDown: disabled ? undefined : onPointerDown, onPointerUp: disabled ? undefined : onPointerUp, onPointerCancel: disabled ? undefined : onPointerCancel, className: cn(
|
|
147
152
|
// 44×44 hit target (WCAG 2.5.5) — comfortably thumb-tappable without
|
|
148
153
|
// crowding the bar (split the difference back down from 48).
|
|
149
|
-
"grid h-11 w-11 shrink-0 place-items-center rounded-full border transition-colors", "
|
|
154
|
+
"grid h-11 w-11 shrink-0 place-items-center rounded-full border transition-colors", " ", active
|
|
150
155
|
? "border-white/40 bg-white/85 text-black"
|
|
151
156
|
: "border-white/15 bg-white/10 text-white/75 hover:bg-white/20 hover:text-white", disabled && "opacity-40"), children: Icon ? (_jsx(Icon, { className: "h-[22px] w-[22px]", "aria-hidden": true })) : glyph ? (_jsx(Glyph, { d: glyph })) : null }));
|
|
152
157
|
}
|
|
@@ -154,13 +159,37 @@ function SoftButton({ glyph, icon: Icon, label, onClick, onPointerDown, onPointe
|
|
|
154
159
|
* settings). Smaller than SoftButton; same neutral resting → neutral-hover
|
|
155
160
|
* language (no blue), `active` gets the white fill. Renders a lucide icon. */
|
|
156
161
|
function HeaderButton({ icon: Icon, label, onClick, active, disabled, testId, }) {
|
|
157
|
-
return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, disabled: disabled, "aria-disabled": disabled || undefined, onClick: onClick, className: cn("grid h-9 w-9 shrink-0 place-items-center rounded-full border transition-colors", "
|
|
162
|
+
return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, disabled: disabled, "aria-disabled": disabled || undefined, onClick: onClick, className: cn("grid h-9 w-9 shrink-0 place-items-center rounded-full border transition-colors", " ", disabled
|
|
158
163
|
? // On the view it targets: shown but inert + dimmed (we disable, not hide).
|
|
159
164
|
"cursor-default border-white/10 bg-white/[0.05] text-white/35"
|
|
160
165
|
: active
|
|
161
166
|
? "border-white/40 bg-white/85 text-black"
|
|
162
167
|
: "border-white/15 bg-white/10 text-white/75 hover:bg-white/20 hover:text-white"), children: _jsx(Icon, { className: "h-[18px] w-[18px]", "aria-hidden": true }) }));
|
|
163
168
|
}
|
|
169
|
+
/** Horizontal travel (px) at which a conversation-swipe edge hint is fully lit. */
|
|
170
|
+
const SWIPE_HINT_FULL = 96;
|
|
171
|
+
/** Inert conversation-nav fallback for minimal mock controllers. */
|
|
172
|
+
const EMPTY_CONVERSATION_NAV = {
|
|
173
|
+
hasPrev: false,
|
|
174
|
+
hasNext: false,
|
|
175
|
+
goPrev: () => { },
|
|
176
|
+
goNext: () => { },
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* A soft glass glow on the sheet edge the next/previous conversation will slide
|
|
180
|
+
* in from during a horizontal swipe (#8929). Brightens with the drag distance;
|
|
181
|
+
* inert and non-interactive.
|
|
182
|
+
*/
|
|
183
|
+
function SwipeEdgeHint({ side, active, amount, }) {
|
|
184
|
+
if (!active)
|
|
185
|
+
return null;
|
|
186
|
+
const opacity = Math.min(1, Math.max(0, amount) / SWIPE_HINT_FULL);
|
|
187
|
+
if (opacity <= 0)
|
|
188
|
+
return null;
|
|
189
|
+
return (_jsx("div", { "aria-hidden": true, "data-testid": `conversation-swipe-hint-${side}`, className: cn("pointer-events-none absolute inset-y-0 z-20 w-16", side === "left"
|
|
190
|
+
? "left-0 bg-gradient-to-r from-white/25 to-transparent"
|
|
191
|
+
: "right-0 bg-gradient-to-l from-white/25 to-transparent"), style: { opacity } }));
|
|
192
|
+
}
|
|
164
193
|
/**
|
|
165
194
|
* The drag handle at the top of the chat sheet — pull UP to open the history,
|
|
166
195
|
* pull DOWN to close it. It is also keyboard-operable (Enter/Space toggles,
|
|
@@ -205,9 +234,13 @@ function SheetGrabber({ open, onOpen, onClose, binding, glow, opacity, pilled, }
|
|
|
205
234
|
// vertically-centered textarea, so a tap on the composer lands natively
|
|
206
235
|
// on the textarea and raises the keyboard (a programmatic focus from the
|
|
207
236
|
// handle wouldn't). Pull gestures start from the bar / the upward zone.
|
|
208
|
-
"before:absolute before:-inset-x-6 before:-top-16 before:bottom-0 before:content-['']", "
|
|
209
|
-
//
|
|
210
|
-
|
|
237
|
+
"before:absolute before:-inset-x-6 before:-top-16 before:bottom-0 before:content-['']", " "), children: _jsx("span", { "aria-hidden": "true", className: cn(
|
|
238
|
+
// The visible grabber line. Its show/hide is driven by the WRAPPER's
|
|
239
|
+
// `grabberOpacity` crossfade (fades in over [0.55, 0.95] of the open),
|
|
240
|
+
// strictly anti-phase with the pill bar so the two are never on screen
|
|
241
|
+
// together. The bar paints at full opacity — a prior regression pinned
|
|
242
|
+
// it to `opacity-0`, leaving the handle grabbable but invisible (#9142).
|
|
243
|
+
"h-2.5 w-16 rounded-full opacity-100 transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
|
|
211
244
|
}
|
|
212
245
|
/**
|
|
213
246
|
* The fully-collapsed PILL — the chat reduced to a small glass capsule at the
|
|
@@ -234,22 +267,121 @@ function PillHandle({ binding, onOpen, glow, pilled, }) {
|
|
|
234
267
|
// Interactive only while pilled. When NOT pilled the (faded) handle must
|
|
235
268
|
// let taps fall through to the composer textarea below it — otherwise its
|
|
236
269
|
// tall hit zone steals the tap and the keyboard never opens.
|
|
237
|
-
pilled ? "pointer-events-auto" : "pointer-events-none", "
|
|
238
|
-
// Identical to the SheetGrabber bar —
|
|
239
|
-
//
|
|
240
|
-
|
|
270
|
+
pilled ? "pointer-events-auto" : "pointer-events-none", " "), children: _jsx("span", { "aria-hidden": "true", className: cn(
|
|
271
|
+
// Identical to the SheetGrabber bar — same white shape + color whether
|
|
272
|
+
// the chat is open or collapsed to the pill. Its show/hide is driven by
|
|
273
|
+
// the WRAPPER's `pillOpacity` crossfade (anti-phase with the grabber).
|
|
274
|
+
// The bar paints at full opacity — a prior regression pinned it to
|
|
275
|
+
// `opacity-0`, leaving the pill handle grabbable but invisible (#9142).
|
|
276
|
+
"h-2.5 w-16 rounded-full opacity-100 transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
|
|
277
|
+
}
|
|
278
|
+
/** Humanize an action/tool symbol ("SEND_MESSAGE" → "Send message") for the
|
|
279
|
+
* status label so it reads as prose, not a constant. */
|
|
280
|
+
function humanizeStatusName(name) {
|
|
281
|
+
const cleaned = name.trim().replace(/[_-]+/g, " ").toLowerCase();
|
|
282
|
+
if (!cleaned)
|
|
283
|
+
return "";
|
|
284
|
+
return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
|
|
285
|
+
}
|
|
286
|
+
/** The phase label shown beside the breathing dots. Server-provided `label`
|
|
287
|
+
* always wins; otherwise derive a concise phrase from the kind (+ action/tool
|
|
288
|
+
* name when present). */
|
|
289
|
+
function turnStatusLabel(status) {
|
|
290
|
+
if (status.label?.trim())
|
|
291
|
+
return status.label.trim();
|
|
292
|
+
switch (status.kind) {
|
|
293
|
+
case "thinking":
|
|
294
|
+
return "Thinking";
|
|
295
|
+
case "streaming":
|
|
296
|
+
return "Replying";
|
|
297
|
+
case "running_action":
|
|
298
|
+
return status.actionName
|
|
299
|
+
? `Running ${humanizeStatusName(status.actionName)}`
|
|
300
|
+
: "Working";
|
|
301
|
+
case "running_tool":
|
|
302
|
+
return status.toolName
|
|
303
|
+
? `Using ${humanizeStatusName(status.toolName)}`
|
|
304
|
+
: "Using a tool";
|
|
305
|
+
case "evaluating":
|
|
306
|
+
return "Reflecting";
|
|
307
|
+
case "waking":
|
|
308
|
+
return "Waking the agent";
|
|
309
|
+
case "speaking":
|
|
310
|
+
return "Speaking";
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Min time (ms) a phase label must stay on screen before the next one replaces
|
|
314
|
+
// it. Without this, a fast thinking→action→streaming sequence flickers through
|
|
315
|
+
// labels faster than the eye can read. The text content the user sees is
|
|
316
|
+
// debounced; the dots animate continuously throughout.
|
|
317
|
+
const STATUS_MIN_DWELL_MS = 320;
|
|
318
|
+
/** Debounce a fast-changing status to a min on-screen dwell so a rapid
|
|
319
|
+
* thinking→action→streaming sequence doesn't strobe the label. The dots animate
|
|
320
|
+
* continuously; only the words wait their turn. Returns null when status is
|
|
321
|
+
* null (between turns). */
|
|
322
|
+
function useDebouncedTurnStatus(status) {
|
|
323
|
+
const [shown, setShown] = React.useState(status);
|
|
324
|
+
const lastChangeRef = React.useRef(0);
|
|
325
|
+
const timerRef = React.useRef(null);
|
|
326
|
+
React.useEffect(() => {
|
|
327
|
+
if (!status) {
|
|
328
|
+
setShown(null);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const now = Date.now();
|
|
332
|
+
const elapsed = now - lastChangeRef.current;
|
|
333
|
+
if (elapsed >= STATUS_MIN_DWELL_MS) {
|
|
334
|
+
lastChangeRef.current = now;
|
|
335
|
+
setShown(status);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (timerRef.current !== null)
|
|
339
|
+
window.clearTimeout(timerRef.current);
|
|
340
|
+
timerRef.current = window.setTimeout(() => {
|
|
341
|
+
lastChangeRef.current = Date.now();
|
|
342
|
+
setShown(status);
|
|
343
|
+
timerRef.current = null;
|
|
344
|
+
}, STATUS_MIN_DWELL_MS - elapsed);
|
|
345
|
+
return () => {
|
|
346
|
+
if (timerRef.current !== null) {
|
|
347
|
+
window.clearTimeout(timerRef.current);
|
|
348
|
+
timerRef.current = null;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
}, [status]);
|
|
352
|
+
return shown;
|
|
241
353
|
}
|
|
242
|
-
/**
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
354
|
+
/**
|
|
355
|
+
* The breathing dots + phase label content of the status indicator, WITHOUT a
|
|
356
|
+
* bubble/motion wrapper — used both standalone (wrapped by TurnStatusIndicator)
|
|
357
|
+
* and inline inside the in-flight assistant bubble.
|
|
358
|
+
*
|
|
359
|
+
* Mirrors ChatVoiceStatusBar's a11y (`role="status"` + `aria-live="polite"`).
|
|
360
|
+
* Honors reduced motion (no pulse). Brand-safe: orange (the accent) ONLY for
|
|
361
|
+
* `speaking`; every other phase is neutral white. No blue anywhere. Degrades to
|
|
362
|
+
* plain dots when no status has arrived.
|
|
363
|
+
*/
|
|
364
|
+
function TurnStatusInner({ status, }) {
|
|
365
|
+
const shown = useDebouncedTurnStatus(status);
|
|
366
|
+
const speaking = shown?.kind === "speaking";
|
|
367
|
+
const label = shown ? turnStatusLabel(shown) : null;
|
|
368
|
+
return (_jsxs("span", { className: "inline-flex items-center gap-2", "data-testid": "turn-status-indicator", "data-status-kind": shown?.kind ?? "none", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "flex gap-1.5", "data-testid": "typing-dots", "aria-hidden": "true", children: [0, 1, 2].map((i) => (_jsx("span", { className: cn("h-1.5 w-1.5 animate-pulse rounded-full motion-reduce:animate-none", speaking ? "bg-[rgba(255,190,140,0.9)]" : "bg-white/70"), style: { animationDelay: `${i * 180}ms` } }, i))) }), label ? (_jsx("span", { className: cn("text-[13px] font-medium", speaking ? "text-[rgba(255,200,150,0.95)]" : "text-white/90"), "data-testid": "turn-status-label", children: label })) : null] }));
|
|
248
369
|
}
|
|
249
|
-
|
|
370
|
+
/**
|
|
371
|
+
* The rich, phase-aware status row shown while the assistant works (#8813),
|
|
372
|
+
* replacing the bare typing dots in the pre-placeholder gap. Wraps
|
|
373
|
+
* TurnStatusInner in its own glass bubble + fade so it reads as a turn.
|
|
374
|
+
*/
|
|
375
|
+
function TurnStatusIndicator({ status, reduce, }) {
|
|
376
|
+
const speaking = status?.kind === "speaking";
|
|
250
377
|
return (_jsx(motion.div, { className: "mb-2.5 flex w-full justify-start",
|
|
251
|
-
// Fade in/out so the
|
|
252
|
-
initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.45, ease: OVERLAY_EASE }, children: _jsx("div", { className: cn("rounded-2xl rounded-bl-md border
|
|
378
|
+
// Fade in/out so the row dissolves with the reply rather than popping.
|
|
379
|
+
initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.45, ease: OVERLAY_EASE }, children: _jsx("div", { className: cn("rounded-2xl rounded-bl-md border px-3.5 py-2", FLOAT_SHADOW,
|
|
380
|
+
// Orange (the accent) ONLY for spoken replies; every other phase is
|
|
381
|
+
// neutral white glass. No blue anywhere.
|
|
382
|
+
speaking
|
|
383
|
+
? "border-[rgba(255,180,120,0.45)] bg-black/55"
|
|
384
|
+
: "border-white/10 bg-black/45"), children: _jsx(TurnStatusInner, { status: status }) }) }));
|
|
253
385
|
}
|
|
254
386
|
/**
|
|
255
387
|
* One turn of the transcript as a chat bubble — assistant on the left, user on
|
|
@@ -271,7 +403,7 @@ function ThreadLineText({ content }) {
|
|
|
271
403
|
return content;
|
|
272
404
|
return (_jsxs(_Fragment, { children: [_jsx("span", { className: "font-bold", "data-testid": "slash-command-token", children: slash.command }), slash.rest] }));
|
|
273
405
|
}
|
|
274
|
-
const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, onCopy, onOpenSettings, }) {
|
|
406
|
+
const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, onCopy, onOpenSettings, turnStatus, }) {
|
|
275
407
|
const isUser = message.role === "user";
|
|
276
408
|
const isAssistant = message.role === "assistant";
|
|
277
409
|
// Press-and-hold to copy an assistant answer — the only extraction affordance
|
|
@@ -325,7 +457,7 @@ const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, o
|
|
|
325
457
|
// A failed turn the user can't recover from without wiring a provider: render
|
|
326
458
|
// a structured gate (not the raw error text) with a one-tap jump to Settings.
|
|
327
459
|
if (isAssistant && message.failureKind === "no_provider") {
|
|
328
|
-
return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role, "data-failure": "no_provider", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 14 }, animate: reduce ? { opacity: 1 } : { opacity: 1, y: 0 }, exit: reduce ? { opacity: 0 } : { opacity: 0, y: -8 }, transition: { duration: reduce ? 0.15 : 0.52, ease: OVERLAY_EASE }, className: cn("flex w-full justify-start", floating ? "mb-1.5" : "mb-2.5"), children: _jsxs("div", { className: cn("max-w-[85%] rounded-2xl rounded-bl-md border border-amber-300/30 bg-black/60 px-3.5 py-3 text-white", FLOAT_SHADOW), children: [_jsx("div", { className: "mb-1 text-[14px] font-medium", children: "Connect a provider to chat" }), _jsx("div", { className: "mb-2.5 whitespace-pre-wrap text-[13px] leading-relaxed text-white/80 [overflow-wrap:anywhere]", children: message.content }), _jsx("button", { type: "button", "data-testid": "chat-no-provider-settings", onClick: () => onOpenSettings?.(), className: "rounded-full border border-white/20 bg-white/15 px-3 py-1.5 text-[13px] font-medium text-white transition-colors hover:bg-white/25
|
|
460
|
+
return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role, "data-failure": "no_provider", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 14 }, animate: reduce ? { opacity: 1 } : { opacity: 1, y: 0 }, exit: reduce ? { opacity: 0 } : { opacity: 0, y: -8 }, transition: { duration: reduce ? 0.15 : 0.52, ease: OVERLAY_EASE }, className: cn("flex w-full justify-start", floating ? "mb-1.5" : "mb-2.5"), children: _jsxs("div", { className: cn("max-w-[85%] rounded-2xl rounded-bl-md border border-amber-300/30 bg-black/60 px-3.5 py-3 text-white", FLOAT_SHADOW), children: [_jsx("div", { className: "mb-1 text-[14px] font-medium", children: "Connect a provider to chat" }), _jsx("div", { className: "mb-2.5 whitespace-pre-wrap text-[13px] leading-relaxed text-white/80 [overflow-wrap:anywhere]", children: message.content }), _jsx("button", { type: "button", "data-testid": "chat-no-provider-settings", onClick: () => onOpenSettings?.(), className: "rounded-full border border-white/20 bg-white/15 px-3 py-1.5 text-[13px] font-medium text-white transition-colors hover:bg-white/25 ", children: "Open Settings" })] }) }));
|
|
329
461
|
}
|
|
330
462
|
return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role,
|
|
331
463
|
// New turns rise+fade in. Transform/opacity only; reduced motion collapses
|
|
@@ -339,28 +471,43 @@ const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, o
|
|
|
339
471
|
// behind. The light tone is for any embedding that supplies its own
|
|
340
472
|
// surrounding scrim.
|
|
341
473
|
isUser ? "rounded-br-md" : "rounded-bl-md",
|
|
342
|
-
//
|
|
343
|
-
//
|
|
344
|
-
|
|
474
|
+
// Message text must remain selectable for normal highlight/copy.
|
|
475
|
+
// Assistant bubbles still keep the press-and-hold copy shortcut.
|
|
476
|
+
"select-text [-webkit-touch-callout:default]", floating
|
|
345
477
|
? cn("border", isUser
|
|
346
478
|
? "border-white/15 bg-black/55 text-white"
|
|
347
479
|
: "border-white/10 bg-black/45 text-white/90", FLOAT_SHADOW)
|
|
348
480
|
: isUser
|
|
349
481
|
? "bg-white/20 text-white"
|
|
350
|
-
: "bg-white/10 text-white/90"), children: [isAssistant &&
|
|
351
|
-
|
|
352
|
-
|
|
482
|
+
: "bg-white/10 text-white/90"), children: [_jsx("div", { "data-chat-selectable": "true", children: isAssistant &&
|
|
483
|
+
!message.content.trim() &&
|
|
484
|
+
!message.attachments?.length ? (_jsxs(_Fragment, { children: [_jsx(TurnStatusInner, { status: turnStatus ?? null }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null] })) : isUser ? (_jsxs(_Fragment, { children: [_jsx(ThreadLineText, { content: message.content }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null] })) : (_jsxs(_Fragment, { children: [_jsx(InlineWidgetText, { content: message.content }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null, message.secretRequest ? (_jsx("div", { className: "pointer-events-auto", children: _jsx(SensitiveRequestBlock, { request: message.secretRequest }) })) : null, message.reasoning?.trim() ? (_jsx(ThinkingBlock, { reasoning: message.reasoning })) : null] })) }), _jsx(AnimatePresence, { children: copied ? (_jsx(motion.span, { "data-testid": "thread-line-copied", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.18 }, className: "pointer-events-none absolute -top-2 right-2 rounded-full bg-white/90 px-2 py-0.5 text-[11px] font-medium text-black", children: "Copied" }, "copied")) : null })] }) }));
|
|
353
485
|
});
|
|
354
486
|
export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash: slashProp, }) {
|
|
355
|
-
const { messages, phase, responding, send, canSend, recording, startRecording, stopRecording, handsFree, toggleHandsFree, transcriptionMode, toggleTranscriptionMode, setDictationSink, setTranscriptSessionSink, setComposerHasDraft, transcript, needsAudioUnlock, unlockAudio, openSettings, navigateHome,
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
|
|
359
|
-
//
|
|
360
|
-
//
|
|
361
|
-
|
|
362
|
-
// between
|
|
363
|
-
|
|
487
|
+
const { messages, phase, responding, turnStatus, send, canSend, recording, startRecording, stopRecording, handsFree, toggleHandsFree, transcriptionMode, toggleTranscriptionMode, stopTranscriptionAndMic, setDictationSink, setTranscriptSessionSink, setComposerHasDraft, transcript, needsAudioUnlock, unlockAudio, openSettings, navigateHome, currentTab, clearConversation, stop, modelStatus, } = controller;
|
|
488
|
+
// Defensive default so a minimal mock controller (stories/tests) that predates
|
|
489
|
+
// the swipe-nav surface still renders without crashing.
|
|
490
|
+
const conversationNav = controller.conversationNav ?? EMPTY_CONVERSATION_NAV;
|
|
491
|
+
// True while a clear/swipe is fetching an uncached thread — gates the empty
|
|
492
|
+
// thread's loading spinner. Defaulted for minimal mock controllers.
|
|
493
|
+
const conversationLoading = controller.conversationLoading ?? false;
|
|
494
|
+
// Horizontal swipe between conversations (#8929). `swipeDx` is the live
|
|
495
|
+
// horizontal drag (+left toward the next/older chat, -right toward the
|
|
496
|
+
// newer/previous chat) and drives the edge hint. The gesture defers pointer
|
|
497
|
+
// capture until a horizontal commit, so vertical thread scrolling is
|
|
498
|
+
// unaffected; it is only bound while the sheet is open (below).
|
|
499
|
+
const [swipeDx, setSwipeDx] = React.useState(0);
|
|
500
|
+
const conversationSwipe = usePullGesture({
|
|
501
|
+
onDragX: setSwipeDx,
|
|
502
|
+
onSwipeLeft: () => {
|
|
503
|
+
setSwipeDx(0);
|
|
504
|
+
conversationNav.goNext();
|
|
505
|
+
},
|
|
506
|
+
onSwipeRight: () => {
|
|
507
|
+
setSwipeDx(0);
|
|
508
|
+
conversationNav.goPrev();
|
|
509
|
+
},
|
|
510
|
+
});
|
|
364
511
|
// Copy an assistant answer (press-and-hold on its bubble). Stable identity so
|
|
365
512
|
// the memoized ThreadLine isn't re-rendered every parent tick.
|
|
366
513
|
const handleCopyMessage = React.useCallback((text) => {
|
|
@@ -431,6 +578,52 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
431
578
|
// re-render. Drives the glass/content crossfade + scale; `threadHeight` stays
|
|
432
579
|
// 0 until the input is fully formed, then takes over for input → chat.
|
|
433
580
|
const openProgress = useMotionValue(pilled ? 0 : 1);
|
|
581
|
+
// Imperative animations triggered from gesture callbacks are outside React's
|
|
582
|
+
// effect cleanup, so keep one owner per motion value and stop stale springs
|
|
583
|
+
// before starting another.
|
|
584
|
+
const threadAnimationRef = React.useRef(null);
|
|
585
|
+
const openProgressAnimationRef = React.useRef(null);
|
|
586
|
+
const delayedNavigationTimerRef = React.useRef(null);
|
|
587
|
+
const prefillFocusFrameRef = React.useRef(null);
|
|
588
|
+
const prefillFocusTimerRef = React.useRef(null);
|
|
589
|
+
const stopThreadAnimation = React.useCallback(() => {
|
|
590
|
+
threadAnimationRef.current?.stop();
|
|
591
|
+
threadAnimationRef.current = null;
|
|
592
|
+
}, []);
|
|
593
|
+
const stopOpenProgressAnimation = React.useCallback(() => {
|
|
594
|
+
openProgressAnimationRef.current?.stop();
|
|
595
|
+
openProgressAnimationRef.current = null;
|
|
596
|
+
}, []);
|
|
597
|
+
const animateThreadHeight = React.useCallback((target) => {
|
|
598
|
+
stopThreadAnimation();
|
|
599
|
+
threadAnimationRef.current = animate(threadHeight, target, SHEET_SPRING);
|
|
600
|
+
}, [stopThreadAnimation, threadHeight]);
|
|
601
|
+
const animateOpenProgress = React.useCallback((target) => {
|
|
602
|
+
stopOpenProgressAnimation();
|
|
603
|
+
openProgressAnimationRef.current = animate(openProgress, target, OPEN_SPRING);
|
|
604
|
+
}, [openProgress, stopOpenProgressAnimation]);
|
|
605
|
+
const clearPrefillFocusSchedule = React.useCallback(() => {
|
|
606
|
+
if (prefillFocusFrameRef.current !== null &&
|
|
607
|
+
typeof window !== "undefined" &&
|
|
608
|
+
typeof window.cancelAnimationFrame === "function") {
|
|
609
|
+
window.cancelAnimationFrame(prefillFocusFrameRef.current);
|
|
610
|
+
}
|
|
611
|
+
if (prefillFocusTimerRef.current !== null &&
|
|
612
|
+
typeof window !== "undefined") {
|
|
613
|
+
window.clearTimeout(prefillFocusTimerRef.current);
|
|
614
|
+
}
|
|
615
|
+
prefillFocusFrameRef.current = null;
|
|
616
|
+
prefillFocusTimerRef.current = null;
|
|
617
|
+
}, []);
|
|
618
|
+
React.useEffect(() => () => {
|
|
619
|
+
stopThreadAnimation();
|
|
620
|
+
stopOpenProgressAnimation();
|
|
621
|
+
if (delayedNavigationTimerRef.current !== null) {
|
|
622
|
+
window.clearTimeout(delayedNavigationTimerRef.current);
|
|
623
|
+
delayedNavigationTimerRef.current = null;
|
|
624
|
+
}
|
|
625
|
+
clearPrefillFocusSchedule();
|
|
626
|
+
}, [stopThreadAnimation, stopOpenProgressAnimation, clearPrefillFocusSchedule]);
|
|
434
627
|
// Latest `settleDrag` (defined below) exposed to the viewport-resize effect
|
|
435
628
|
// (which runs earlier). A rotation can orphan an in-flight drag — re-settling
|
|
436
629
|
// the morph keeps the pill↔input crossfade from stranding both bars visible.
|
|
@@ -460,22 +653,88 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
460
653
|
// fling a history thread open to half instead of resting on the input bar).
|
|
461
654
|
const suppressExpandOnFocusRef = React.useRef(false);
|
|
462
655
|
const focusThreadRef = React.useRef(false);
|
|
463
|
-
// Recomputed only when the thread changes — NOT on every drag/draft
|
|
464
|
-
//
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
// streaming, so its bubble can show the breathing dots anchored where the
|
|
468
|
-
// text fills in (then the text replaces them). It's dropped again the
|
|
469
|
-
// moment we leave `responding`, so a failed/empty turn never lingers.
|
|
470
|
-
.filter((m) => m.content.trim() ||
|
|
471
|
-
(m.role === "assistant" && phase === "responding"))
|
|
472
|
-
.slice(-MAX_RENDERED_MESSAGES), [messages, phase]);
|
|
656
|
+
// Recomputed only when the thread or phase changes — NOT on every drag/draft
|
|
657
|
+
// re-render. Pure windowing (empty-turn filter + most-recent cap, with the
|
|
658
|
+
// streaming-assistant exception) lives in shell-state so it's unit-tested.
|
|
659
|
+
const visibleMessages = React.useMemo(() => selectVisibleShellMessages(messages, phase), [messages, phase]);
|
|
473
660
|
const lastId = visibleMessages.at(-1)?.id ?? null;
|
|
474
661
|
const lastContent = visibleMessages.at(-1)?.content ?? "";
|
|
662
|
+
// Copy the whole thread as a plain-text transcript from the full-state header
|
|
663
|
+
// — parity with the desktop ChatView header. Flashes a check on success.
|
|
664
|
+
const [conversationCopied, setConversationCopied] = React.useState(false);
|
|
665
|
+
const conversationCopiedTimerRef = React.useRef(null);
|
|
666
|
+
React.useEffect(() => () => {
|
|
667
|
+
if (conversationCopiedTimerRef.current) {
|
|
668
|
+
clearTimeout(conversationCopiedTimerRef.current);
|
|
669
|
+
}
|
|
670
|
+
}, []);
|
|
671
|
+
const handleCopyConversation = React.useCallback(() => {
|
|
672
|
+
const transcript = conversationTranscriptText(visibleMessages.map((m) => ({ role: m.role, text: m.content })), { agentName });
|
|
673
|
+
if (!transcript)
|
|
674
|
+
return;
|
|
675
|
+
void copyTextToClipboard(transcript);
|
|
676
|
+
setConversationCopied(true);
|
|
677
|
+
if (conversationCopiedTimerRef.current) {
|
|
678
|
+
clearTimeout(conversationCopiedTimerRef.current);
|
|
679
|
+
}
|
|
680
|
+
conversationCopiedTimerRef.current = setTimeout(() => setConversationCopied(false), 2000);
|
|
681
|
+
}, [agentName, visibleMessages]);
|
|
475
682
|
// The last line id the scroll effect pinned to — lets it tell a NEW line
|
|
476
683
|
// (always pin to bottom) from streaming growth of the current line (follow
|
|
477
684
|
// only when the reader is already at the bottom).
|
|
478
685
|
const scrollPinnedIdRef = React.useRef(lastId);
|
|
686
|
+
// Topic grouping + chips bar (#8928). Derived from the per-message Stage-1
|
|
687
|
+
// topic tags; when no message is tagged the transcript renders flat (the
|
|
688
|
+
// chips bar and groups simply don't appear), preserving the prior behavior.
|
|
689
|
+
const channelTopics = React.useMemo(() => deriveChannelTopics(visibleMessages), [visibleMessages]);
|
|
690
|
+
const topicSegments = React.useMemo(() => groupMessagesByTopic(visibleMessages), [visibleMessages]);
|
|
691
|
+
const hasTopics = channelTopics.length > 0;
|
|
692
|
+
const [collapsedTopics, setCollapsedTopics] = React.useState(() => new Set());
|
|
693
|
+
const setTopicCollapsed = React.useCallback((key, collapsed) => {
|
|
694
|
+
setCollapsedTopics((prev) => {
|
|
695
|
+
if (collapsed === prev.has(key))
|
|
696
|
+
return prev;
|
|
697
|
+
const next = new Set(prev);
|
|
698
|
+
if (collapsed)
|
|
699
|
+
next.add(key);
|
|
700
|
+
else
|
|
701
|
+
next.delete(key);
|
|
702
|
+
return next;
|
|
703
|
+
});
|
|
704
|
+
}, []);
|
|
705
|
+
// Tapping a chip expands its group and scrolls its header into view.
|
|
706
|
+
const scrollToTopic = React.useCallback((topic) => {
|
|
707
|
+
setCollapsedTopics((prev) => {
|
|
708
|
+
if (!prev.has(topic))
|
|
709
|
+
return prev;
|
|
710
|
+
const next = new Set(prev);
|
|
711
|
+
next.delete(topic);
|
|
712
|
+
return next;
|
|
713
|
+
});
|
|
714
|
+
if (typeof requestAnimationFrame === "undefined")
|
|
715
|
+
return;
|
|
716
|
+
requestAnimationFrame(() => {
|
|
717
|
+
const escaped = typeof CSS !== "undefined" && typeof CSS.escape === "function"
|
|
718
|
+
? CSS.escape(topic)
|
|
719
|
+
: topic.replace(/"/g, '\\"');
|
|
720
|
+
const el = threadRef.current?.querySelector(`[data-topic="${escaped}"]`);
|
|
721
|
+
el?.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
722
|
+
});
|
|
723
|
+
}, []);
|
|
724
|
+
// Render one transcript line; shared by the flat and topic-grouped paths so
|
|
725
|
+
// the in-flight-turn detection stays identical.
|
|
726
|
+
const renderThreadLine = React.useCallback((m, index) => {
|
|
727
|
+
const isInFlight = index === visibleMessages.length - 1 &&
|
|
728
|
+
m.role === "assistant" &&
|
|
729
|
+
!m.content.trim();
|
|
730
|
+
return (_jsx(ThreadLine, { message: m, floating: true, reduce: reduce, onCopy: handleCopyMessage, onOpenSettings: openSettings, turnStatus: isInFlight ? turnStatus : undefined }, m.id));
|
|
731
|
+
}, [
|
|
732
|
+
visibleMessages.length,
|
|
733
|
+
reduce,
|
|
734
|
+
handleCopyMessage,
|
|
735
|
+
openSettings,
|
|
736
|
+
turnStatus,
|
|
737
|
+
]);
|
|
479
738
|
const booting = phase === "booting";
|
|
480
739
|
const listening = phase === "listening";
|
|
481
740
|
const hasDraft = draft.trim().length > 0;
|
|
@@ -516,6 +775,14 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
516
775
|
// only when the reader is already resting at the bottom, so scrolling up to
|
|
517
776
|
// read history is never yanked down.
|
|
518
777
|
const wasOpenRef = React.useRef(false);
|
|
778
|
+
// Coalesces the per-token streaming-follow scroll into one rAF so a burst of
|
|
779
|
+
// tokens landing within a frame triggers at most one measure+write instead of
|
|
780
|
+
// a forced reflow per token. New-line / first-open pins stay synchronous below.
|
|
781
|
+
const followRafRef = React.useRef(null);
|
|
782
|
+
React.useEffect(() => () => {
|
|
783
|
+
if (followRafRef.current != null)
|
|
784
|
+
cancelAnimationFrame(followRafRef.current);
|
|
785
|
+
}, []);
|
|
519
786
|
// biome-ignore lint/correctness/useExhaustiveDependencies: lastId/lastContent/sheetOpen are the triggers; the body reads refs
|
|
520
787
|
React.useLayoutEffect(() => {
|
|
521
788
|
const el = threadRef.current;
|
|
@@ -537,17 +804,43 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
537
804
|
// more reliable than scrollIntoView inside this clipped flex column.
|
|
538
805
|
const justOpened = !wasOpenRef.current;
|
|
539
806
|
wasOpenRef.current = true;
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
807
|
+
// New line or first open: pin synchronously (pre-paint) so the thread never
|
|
808
|
+
// flashes at the top. Infrequent — once per turn, not per token.
|
|
809
|
+
if (isNewLine || justOpened) {
|
|
810
|
+
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
|
|
811
|
+
// Pin to the latest line ONLY on first open, or when the reader is already
|
|
812
|
+
// resting at the bottom. If they have scrolled UP to read history, a new
|
|
813
|
+
// line must NOT yank them down — the previous code force-pinned on every
|
|
814
|
+
// new line (the `else` ran whenever !atBottom), which is exactly the
|
|
815
|
+
// "scroll up to the first message and get snapped back to the bottom" bug.
|
|
816
|
+
if (justOpened || atBottom) {
|
|
817
|
+
if (isNewLine && !justOpened && !reduce) {
|
|
818
|
+
endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
|
|
819
|
+
}
|
|
820
|
+
else {
|
|
821
|
+
el.scrollTop = el.scrollHeight;
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
if (justOpened && focusThreadRef.current) {
|
|
825
|
+
el.focus();
|
|
826
|
+
focusThreadRef.current = false;
|
|
827
|
+
}
|
|
828
|
+
return;
|
|
550
829
|
}
|
|
830
|
+
// Streaming growth of the current line: coalesce the bottom-follow into a
|
|
831
|
+
// single rAF (measure atBottom + write scrollTop at most once per frame).
|
|
832
|
+
// Same semantics as before — only follows when the reader is at the bottom.
|
|
833
|
+
if (followRafRef.current != null)
|
|
834
|
+
return;
|
|
835
|
+
followRafRef.current = requestAnimationFrame(() => {
|
|
836
|
+
followRafRef.current = null;
|
|
837
|
+
const node = threadRef.current;
|
|
838
|
+
if (!node)
|
|
839
|
+
return;
|
|
840
|
+
const atBottom = node.scrollHeight - node.scrollTop - node.clientHeight < 80;
|
|
841
|
+
if (atBottom)
|
|
842
|
+
node.scrollTop = node.scrollHeight;
|
|
843
|
+
});
|
|
551
844
|
}, [lastId, lastContent, sheetOpen]);
|
|
552
845
|
// The closed peek must always whisper the NEWEST line, but closing is an
|
|
553
846
|
// animated height collapse: a one-shot scroll set runs before the height
|
|
@@ -600,9 +893,6 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
600
893
|
detentHaptic();
|
|
601
894
|
inputRef.current?.focus();
|
|
602
895
|
}, [canSend, send]);
|
|
603
|
-
const submit = React.useCallback(() => {
|
|
604
|
-
submitText(draft, pendingImages);
|
|
605
|
-
}, [submitText, draft, pendingImages]);
|
|
606
896
|
// Tapping a suggestion sends it immediately (same path as submit), so the
|
|
607
897
|
// strip is a one-tap shortcut, not just a draft pre-fill.
|
|
608
898
|
const pickSuggestion = React.useCallback((text) => {
|
|
@@ -617,12 +907,22 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
617
907
|
inputRef.current?.focus();
|
|
618
908
|
}, [canSend, send]);
|
|
619
909
|
const addImageFiles = React.useCallback((files) => {
|
|
620
|
-
void
|
|
621
|
-
.then((attachments) => {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
910
|
+
void intakeAttachmentFiles(files)
|
|
911
|
+
.then(({ attachments, droppedTooLarge }) => {
|
|
912
|
+
// The overlay is a pure component without an i18n translator, so it
|
|
913
|
+
// surfaces the "kept N, dropped M" notice inline in English (matching
|
|
914
|
+
// its other hardcoded strings) via the existing imageError channel.
|
|
915
|
+
const summary = summarizeDroppedAttachments({
|
|
916
|
+
acceptedCount: attachments.length,
|
|
917
|
+
droppedTooLarge,
|
|
918
|
+
droppedOverCount: [],
|
|
919
|
+
});
|
|
920
|
+
setImageError(summary
|
|
921
|
+
? `Kept ${summary.kept}, dropped ${summary.dropped} (too large — max ${summary.maxMb}MB)`
|
|
922
|
+
: null);
|
|
923
|
+
if (attachments.length) {
|
|
924
|
+
setPendingImages((prev) => [...prev, ...attachments].slice(0, MAX_CHAT_IMAGES));
|
|
925
|
+
}
|
|
626
926
|
})
|
|
627
927
|
.catch((err) => {
|
|
628
928
|
// Surface the failure inline rather than silently dropping the image —
|
|
@@ -647,6 +947,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
647
947
|
event.button !== 0 ||
|
|
648
948
|
hasDraft ||
|
|
649
949
|
recording ||
|
|
950
|
+
transcriptionMode ||
|
|
650
951
|
// Voice input is gated while a reply is in flight; type + send to queue
|
|
651
952
|
// another turn instead. Re-enabled the instant the reply finishes.
|
|
652
953
|
responding)
|
|
@@ -669,7 +970,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
669
970
|
startRecording("dictate");
|
|
670
971
|
}, 200);
|
|
671
972
|
pttRef.current = { kind: "pending", pointerId, timer };
|
|
672
|
-
}, [hasDraft, recording, responding, startRecording]);
|
|
973
|
+
}, [hasDraft, recording, responding, startRecording, transcriptionMode]);
|
|
673
974
|
// One funnel for BOTH pointerup (cancelled=false) and pointercancel
|
|
674
975
|
// (cancelled=true). Always clears the pending timer + releases pointer capture
|
|
675
976
|
// FIRST — before any early return — so a quick tap can never leak a stuck timer
|
|
@@ -678,7 +979,8 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
678
979
|
const phase = pttRef.current;
|
|
679
980
|
if (phase.kind === "pending")
|
|
680
981
|
window.clearTimeout(phase.timer);
|
|
681
|
-
if (event.currentTarget.hasPointerCapture
|
|
982
|
+
if (typeof event.currentTarget.hasPointerCapture === "function" &&
|
|
983
|
+
event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
682
984
|
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
683
985
|
}
|
|
684
986
|
pttRef.current = { kind: "idle" };
|
|
@@ -701,11 +1003,13 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
701
1003
|
// turn finishes), but an active hands-free session can always be turned OFF.
|
|
702
1004
|
if (responding && !handsFree)
|
|
703
1005
|
return;
|
|
704
|
-
// While transcribing, the mic is the master voice control: a tap
|
|
705
|
-
// transcription (
|
|
706
|
-
//
|
|
1006
|
+
// While transcribing, the mic is the master voice control: a tap turns the
|
|
1007
|
+
// mic OFF, which also ends transcription (mic = parent — turning off the mic
|
|
1008
|
+
// turns off transcript). This is distinct from the transcript button, which
|
|
1009
|
+
// turns transcript off but LEAVES THE MIC ON. The finished transcript still
|
|
1010
|
+
// drops into the composer as an attachment.
|
|
707
1011
|
if (transcriptionMode) {
|
|
708
|
-
|
|
1012
|
+
stopTranscriptionAndMic();
|
|
709
1013
|
return;
|
|
710
1014
|
}
|
|
711
1015
|
// Quick tap = hands-free conversation: the agent speaks its replies back and
|
|
@@ -716,7 +1020,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
716
1020
|
handsFree,
|
|
717
1021
|
toggleHandsFree,
|
|
718
1022
|
transcriptionMode,
|
|
719
|
-
|
|
1023
|
+
stopTranscriptionAndMic,
|
|
720
1024
|
]);
|
|
721
1025
|
const hasThread = visibleMessages.length > 0;
|
|
722
1026
|
// Track the VISUAL viewport so the chat sizes to — and sits above — whatever
|
|
@@ -744,13 +1048,35 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
744
1048
|
React.useEffect(() => {
|
|
745
1049
|
if (typeof window === "undefined")
|
|
746
1050
|
return undefined;
|
|
747
|
-
const
|
|
748
|
-
|
|
1051
|
+
const commit = () => {
|
|
1052
|
+
// Bail out of the re-render when the viewport values are unchanged — vv
|
|
1053
|
+
// `scroll` fires constantly while the keyboard animates but the height/
|
|
1054
|
+
// inset frequently don't actually move between events.
|
|
1055
|
+
setViewport((prev) => {
|
|
1056
|
+
const next = readViewport();
|
|
1057
|
+
return prev.height === next.height &&
|
|
1058
|
+
prev.keyboardInset === next.keyboardInset &&
|
|
1059
|
+
prev.innerHeight === next.innerHeight
|
|
1060
|
+
? prev
|
|
1061
|
+
: next;
|
|
1062
|
+
});
|
|
749
1063
|
const el = overlayRef.current;
|
|
750
1064
|
if (el) {
|
|
751
|
-
|
|
1065
|
+
const pad = Number.parseFloat(getComputedStyle(el).paddingBottom) || 0;
|
|
1066
|
+
setBottomPad((prev) => (prev === pad ? prev : pad));
|
|
752
1067
|
}
|
|
753
1068
|
};
|
|
1069
|
+
// Coalesce the high-rate vv `scroll` to at most one commit per frame so the
|
|
1070
|
+
// keyboard-animation storm can't drive >60 forced style reads + setStates/s.
|
|
1071
|
+
let rafId = 0;
|
|
1072
|
+
const sync = () => {
|
|
1073
|
+
if (rafId !== 0)
|
|
1074
|
+
return;
|
|
1075
|
+
rafId = requestAnimationFrame(() => {
|
|
1076
|
+
rafId = 0;
|
|
1077
|
+
commit();
|
|
1078
|
+
});
|
|
1079
|
+
};
|
|
754
1080
|
// A viewport SIZE change (rotation) must never strand the pill↔input morph
|
|
755
1081
|
// mid-crossfade — rotation often cancels the in-flight pointer with no
|
|
756
1082
|
// pointerup, leaving the drag orphaned (openProgress frozen mid-range = BOTH
|
|
@@ -767,8 +1093,10 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
767
1093
|
const vv = window.visualViewport;
|
|
768
1094
|
window.addEventListener("resize", syncAndSettle);
|
|
769
1095
|
vv?.addEventListener("resize", syncAndSettle);
|
|
770
|
-
vv?.addEventListener("scroll", sync);
|
|
1096
|
+
vv?.addEventListener("scroll", sync, { passive: true });
|
|
771
1097
|
return () => {
|
|
1098
|
+
if (rafId !== 0)
|
|
1099
|
+
cancelAnimationFrame(rafId);
|
|
772
1100
|
window.removeEventListener("resize", syncAndSettle);
|
|
773
1101
|
vv?.removeEventListener("resize", syncAndSettle);
|
|
774
1102
|
vv?.removeEventListener("scroll", sync);
|
|
@@ -918,8 +1246,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
918
1246
|
// thread's flex-basis is the live height as a px string.
|
|
919
1247
|
const revealed = useTransform(threadHeight, (h) => Math.min(1, Math.max(0, h / Math.max(1, openH))));
|
|
920
1248
|
// At rest (threadHeight 0 = INPUT/CLOSED) the full-viewport dimming scrim sits
|
|
921
|
-
// at opacity 0
|
|
922
|
-
// samples through. Drive `visibility` off the SAME motion value so it drops out
|
|
1249
|
+
// at opacity 0. Drive `visibility` off the SAME motion value so it drops out
|
|
923
1250
|
// of compositing/paint at rest (no reflow, compositor-only, zero re-render) and
|
|
924
1251
|
// flips back the instant the thread opens.
|
|
925
1252
|
const scrimVisibility = useTransform(threadHeight, (h) => h > 0 ? "visible" : "hidden");
|
|
@@ -932,9 +1259,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
932
1259
|
clamp: true,
|
|
933
1260
|
});
|
|
934
1261
|
// --- Liquid-glass pill → input morph (driven by openProgress) ---------------
|
|
935
|
-
// The panel is ONE persistent element; the pill capsule and the full
|
|
936
|
-
// input crossfade by opacity (compositor-cheap
|
|
937
|
-
//
|
|
1262
|
+
// The panel is ONE persistent element; the pill capsule and the full
|
|
1263
|
+
// input crossfade by opacity (compositor-cheap) while the whole panel scales
|
|
1264
|
+
// up from a capsule. transform + opacity only.
|
|
938
1265
|
const panelScale = useTransform(openProgress, [0, 1], [0.9, 1]);
|
|
939
1266
|
// Glass surface + its content crossfade IN as the input forms (one wrapper, so
|
|
940
1267
|
// sheen/glow/thread/composer resolve together with the glass).
|
|
@@ -988,38 +1315,58 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
988
1315
|
draggingRef.current = false;
|
|
989
1316
|
const open = pilled ? 0 : 1;
|
|
990
1317
|
if (reduce) {
|
|
1318
|
+
stopThreadAnimation();
|
|
1319
|
+
stopOpenProgressAnimation();
|
|
991
1320
|
threadHeight.set(baseH);
|
|
992
1321
|
openProgress.set(open);
|
|
993
1322
|
}
|
|
994
1323
|
else {
|
|
995
|
-
|
|
996
|
-
|
|
1324
|
+
animateThreadHeight(baseH);
|
|
1325
|
+
animateOpenProgress(open);
|
|
997
1326
|
}
|
|
998
|
-
}, [
|
|
1327
|
+
}, [
|
|
1328
|
+
threadHeight,
|
|
1329
|
+
openProgress,
|
|
1330
|
+
baseH,
|
|
1331
|
+
pilled,
|
|
1332
|
+
reduce,
|
|
1333
|
+
stopThreadAnimation,
|
|
1334
|
+
stopOpenProgressAnimation,
|
|
1335
|
+
animateThreadHeight,
|
|
1336
|
+
animateOpenProgress,
|
|
1337
|
+
]);
|
|
999
1338
|
// Keep the ref the (earlier-declared) viewport-resize effect calls pointing at
|
|
1000
1339
|
// the latest settleDrag, so a rotation re-settles with current pilled/baseH.
|
|
1001
1340
|
settleDragRef.current = settleDrag;
|
|
1002
1341
|
// Drive openProgress from the pilled flag for NON-drag transitions (tap the
|
|
1003
1342
|
// pill, programmatic open/close): a live finger drag owns openProgress itself
|
|
1004
1343
|
// (draggingRef gates this so it never fights the gesture).
|
|
1005
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: openProgress is a stable motion value ref
|
|
1006
1344
|
React.useEffect(() => {
|
|
1007
1345
|
if (draggingRef.current)
|
|
1008
1346
|
return;
|
|
1009
1347
|
const open = pilled ? 0 : 1;
|
|
1010
1348
|
if (reduce) {
|
|
1349
|
+
stopOpenProgressAnimation();
|
|
1011
1350
|
openProgress.set(open);
|
|
1012
1351
|
return;
|
|
1013
1352
|
}
|
|
1014
|
-
|
|
1015
|
-
return
|
|
1016
|
-
}, [
|
|
1353
|
+
animateOpenProgress(open);
|
|
1354
|
+
return stopOpenProgressAnimation;
|
|
1355
|
+
}, [
|
|
1356
|
+
pilled,
|
|
1357
|
+
reduce,
|
|
1358
|
+
openProgress,
|
|
1359
|
+
animateOpenProgress,
|
|
1360
|
+
stopOpenProgressAnimation,
|
|
1361
|
+
]);
|
|
1017
1362
|
const closeSheet = React.useCallback(() => {
|
|
1018
1363
|
draggingRef.current = false;
|
|
1364
|
+
stopThreadAnimation();
|
|
1365
|
+
stopOpenProgressAnimation();
|
|
1019
1366
|
setFreeH(null);
|
|
1020
1367
|
setMaximized(false);
|
|
1021
1368
|
setMode("input");
|
|
1022
|
-
}, []);
|
|
1369
|
+
}, [stopThreadAnimation, stopOpenProgressAnimation]);
|
|
1023
1370
|
// Leaving the chat for Settings/Home: animate OUT of maximize and collapse the
|
|
1024
1371
|
// sheet (closeSheet un-maximizes + springs the thread height down) BEFORE
|
|
1025
1372
|
// swapping the page underneath, so it reads as the chat closing into the new
|
|
@@ -1029,7 +1376,13 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1029
1376
|
const navigateAndClose = React.useCallback((go) => {
|
|
1030
1377
|
const wasMaximized = maximized;
|
|
1031
1378
|
closeSheet();
|
|
1032
|
-
|
|
1379
|
+
if (delayedNavigationTimerRef.current !== null) {
|
|
1380
|
+
window.clearTimeout(delayedNavigationTimerRef.current);
|
|
1381
|
+
}
|
|
1382
|
+
delayedNavigationTimerRef.current = window.setTimeout(() => {
|
|
1383
|
+
delayedNavigationTimerRef.current = null;
|
|
1384
|
+
go();
|
|
1385
|
+
}, reduce ? 0 : wasMaximized ? 260 : 190);
|
|
1033
1386
|
}, [closeSheet, maximized, reduce]);
|
|
1034
1387
|
// Maximize toggle. Maximizing from ANY open detent (half or a free rest) first
|
|
1035
1388
|
// rises to the FULL detent, then drops the inset — so the height spring
|
|
@@ -1038,32 +1391,35 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1038
1391
|
// nothing). Un-maximizing drops back to the inset FULL detent.
|
|
1039
1392
|
const toggleMaximize = React.useCallback(() => {
|
|
1040
1393
|
if (maximized) {
|
|
1394
|
+
stopThreadAnimation();
|
|
1041
1395
|
setMaximized(false);
|
|
1042
1396
|
return;
|
|
1043
1397
|
}
|
|
1044
1398
|
// Snap the morph fully open BEFORE flipping to full-bleed so no in-flight
|
|
1045
1399
|
// pill-open spring can leak a sub-1 scale into the maximized frame (top gap).
|
|
1046
1400
|
draggingRef.current = false;
|
|
1401
|
+
stopThreadAnimation();
|
|
1402
|
+
stopOpenProgressAnimation();
|
|
1047
1403
|
openProgress.set(1);
|
|
1048
1404
|
setFreeH(null);
|
|
1049
1405
|
setMode("full");
|
|
1050
1406
|
setMaximized(true);
|
|
1051
|
-
}, [maximized, openProgress]);
|
|
1407
|
+
}, [maximized, openProgress, stopThreadAnimation, stopOpenProgressAnimation]);
|
|
1052
1408
|
// The single detent→detent animator: whenever the settled detent (or viewport)
|
|
1053
1409
|
// changes and we're not mid finger-drag, spring the history height to it. The
|
|
1054
1410
|
// gesture / open paths just flip sheetOpen/expanded and this reacts — no
|
|
1055
1411
|
// per-frame React state, so the live drag stays buttery.
|
|
1056
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: baseH already encodes sheetOpen/expanded/freeH/viewportH; threadHeight is a stable ref
|
|
1057
1412
|
React.useEffect(() => {
|
|
1058
1413
|
if (draggingRef.current)
|
|
1059
1414
|
return;
|
|
1060
1415
|
if (reduce) {
|
|
1416
|
+
stopThreadAnimation();
|
|
1061
1417
|
threadHeight.set(baseH);
|
|
1062
1418
|
return;
|
|
1063
1419
|
}
|
|
1064
|
-
|
|
1065
|
-
return
|
|
1066
|
-
}, [baseH, reduce]);
|
|
1420
|
+
animateThreadHeight(baseH);
|
|
1421
|
+
return stopThreadAnimation;
|
|
1422
|
+
}, [baseH, reduce, threadHeight, animateThreadHeight, stopThreadAnimation]);
|
|
1067
1423
|
// Snap to one of the three iOS-style detents and settle the live drag. A
|
|
1068
1424
|
// detent change fires a light haptic so the snap feels physical on device.
|
|
1069
1425
|
// "collapsed" hides the history entirely (just the input); "half" is the
|
|
@@ -1073,6 +1429,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1073
1429
|
// A detent always clears any free-drag rest height and (since only FULL
|
|
1074
1430
|
// can be maximized) drops full-bleed when stepping anywhere else.
|
|
1075
1431
|
draggingRef.current = false;
|
|
1432
|
+
stopThreadAnimation();
|
|
1076
1433
|
setFreeH(null);
|
|
1077
1434
|
if (to !== "full")
|
|
1078
1435
|
setMaximized(false);
|
|
@@ -1082,7 +1439,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1082
1439
|
if (to === "collapsed")
|
|
1083
1440
|
inputRef.current?.blur();
|
|
1084
1441
|
detentHaptic();
|
|
1085
|
-
}, []);
|
|
1442
|
+
}, [stopThreadAnimation]);
|
|
1086
1443
|
// Collapsing always drops input focus, so the mobile keyboard goes away the
|
|
1087
1444
|
// moment the chat is dismissed (pull-down, Escape, or click-out) — the chat is
|
|
1088
1445
|
// no longer "focused". Blurring (rather than the old refocus dance) also means
|
|
@@ -1194,6 +1551,37 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1194
1551
|
window.addEventListener(TUTORIAL_CHAT_CONTROL_EVENT, onControl);
|
|
1195
1552
|
return () => window.removeEventListener(TUTORIAL_CHAT_CONTROL_EVENT, onControl);
|
|
1196
1553
|
}, [goToDetent]);
|
|
1554
|
+
React.useEffect(() => {
|
|
1555
|
+
if (typeof window === "undefined")
|
|
1556
|
+
return undefined;
|
|
1557
|
+
const onPrefill = (event) => {
|
|
1558
|
+
const detail = event.detail;
|
|
1559
|
+
const text = typeof detail?.text === "string" ? detail.text : "";
|
|
1560
|
+
if (!text.trim())
|
|
1561
|
+
return;
|
|
1562
|
+
setMode((m) => (m === "pill" ? "input" : m));
|
|
1563
|
+
setDraft(text);
|
|
1564
|
+
const focusComposer = () => {
|
|
1565
|
+
prefillFocusFrameRef.current = null;
|
|
1566
|
+
prefillFocusTimerRef.current = null;
|
|
1567
|
+
const input = inputRef.current;
|
|
1568
|
+
input?.focus();
|
|
1569
|
+
if (detail?.select) {
|
|
1570
|
+
input?.setSelectionRange(0, text.length);
|
|
1571
|
+
}
|
|
1572
|
+
};
|
|
1573
|
+
clearPrefillFocusSchedule();
|
|
1574
|
+
if (typeof window.requestAnimationFrame === "function") {
|
|
1575
|
+
prefillFocusFrameRef.current =
|
|
1576
|
+
window.requestAnimationFrame(focusComposer);
|
|
1577
|
+
}
|
|
1578
|
+
else {
|
|
1579
|
+
prefillFocusTimerRef.current = window.setTimeout(focusComposer, 0);
|
|
1580
|
+
}
|
|
1581
|
+
};
|
|
1582
|
+
window.addEventListener(CHAT_PREFILL_EVENT, onPrefill);
|
|
1583
|
+
return () => window.removeEventListener(CHAT_PREFILL_EVENT, onPrefill);
|
|
1584
|
+
}, [clearPrefillFocusSchedule]);
|
|
1197
1585
|
// Push-to-talk dictation drops its final transcript into the composer draft
|
|
1198
1586
|
// (no send): register the sink with the controller while this overlay is
|
|
1199
1587
|
// mounted, appending to whatever the user has already typed.
|
|
@@ -1216,15 +1604,16 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1216
1604
|
if (segments.length === 0)
|
|
1217
1605
|
return;
|
|
1218
1606
|
const text = transcriptPlainText(segments);
|
|
1607
|
+
const stamp = new Date(startedAtMs)
|
|
1608
|
+
.toISOString()
|
|
1609
|
+
.slice(0, 16)
|
|
1610
|
+
.replace("T", " ");
|
|
1611
|
+
const attachmentName = `Transcript ${stamp}.md`;
|
|
1219
1612
|
if (text) {
|
|
1220
|
-
const stamp = new Date(startedAtMs)
|
|
1221
|
-
.toISOString()
|
|
1222
|
-
.slice(0, 16)
|
|
1223
|
-
.replace("T", " ");
|
|
1224
1613
|
const attachment = {
|
|
1225
1614
|
data: textToBase64(text),
|
|
1226
1615
|
mimeType: "text/markdown",
|
|
1227
|
-
name:
|
|
1616
|
+
name: attachmentName,
|
|
1228
1617
|
};
|
|
1229
1618
|
setPendingImages((prev) => [...prev, attachment].slice(0, MAX_CHAT_IMAGES));
|
|
1230
1619
|
expand();
|
|
@@ -1240,6 +1629,23 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1240
1629
|
audioContentType: "audio/wav",
|
|
1241
1630
|
}
|
|
1242
1631
|
: {}),
|
|
1632
|
+
})
|
|
1633
|
+
.then(({ transcript }) => {
|
|
1634
|
+
// Link the pending attachment to the saved record so tapping it opens
|
|
1635
|
+
// the editable viewer and edits persist — both via the client-only
|
|
1636
|
+
// `transcriptId` field and a durable marker embedded in the markdown
|
|
1637
|
+
// (which survives the server round-trip in the attachment's text).
|
|
1638
|
+
if (!text)
|
|
1639
|
+
return;
|
|
1640
|
+
setPendingImages((prev) => prev.map((a) => a.name === attachmentName &&
|
|
1641
|
+
a.mimeType === "text/markdown" &&
|
|
1642
|
+
!a.transcriptId
|
|
1643
|
+
? {
|
|
1644
|
+
...a,
|
|
1645
|
+
transcriptId: transcript.id,
|
|
1646
|
+
data: textToBase64(withTranscriptMarker(transcript.id, text)),
|
|
1647
|
+
}
|
|
1648
|
+
: a));
|
|
1243
1649
|
})
|
|
1244
1650
|
.catch(() => {
|
|
1245
1651
|
/* archival is best-effort; a failed save just skips the record */
|
|
@@ -1304,6 +1710,19 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1304
1710
|
setSlashDismissed(true);
|
|
1305
1711
|
inputRef.current?.focus();
|
|
1306
1712
|
}, [slash, controller, submitText, toggleMaximize, toggleTranscriptionMode]);
|
|
1713
|
+
const submit = React.useCallback(() => {
|
|
1714
|
+
const shortcut = pendingImages.length === 0
|
|
1715
|
+
? resolveClientShortcutExecution(slash.commands, draft, slash.resolveSection, {
|
|
1716
|
+
allowNatural: slash.naturalShortcutsEnabled,
|
|
1717
|
+
resolveChoices: slash.resolveChoices,
|
|
1718
|
+
})
|
|
1719
|
+
: null;
|
|
1720
|
+
if (shortcut) {
|
|
1721
|
+
runExecution(shortcut);
|
|
1722
|
+
return;
|
|
1723
|
+
}
|
|
1724
|
+
submitText(draft, pendingImages);
|
|
1725
|
+
}, [draft, pendingImages, runExecution, slash, submitText]);
|
|
1307
1726
|
const pickSlashItem = React.useCallback((index) => {
|
|
1308
1727
|
const exec = slashMenu.resolve(index);
|
|
1309
1728
|
if (exec)
|
|
@@ -1393,10 +1812,12 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1393
1812
|
preFocusCollapsedRef.current = true;
|
|
1394
1813
|
detentHaptic();
|
|
1395
1814
|
}
|
|
1396
|
-
if (reduce)
|
|
1815
|
+
if (reduce) {
|
|
1816
|
+
stopOpenProgressAnimation();
|
|
1397
1817
|
openProgress.set(1);
|
|
1818
|
+
}
|
|
1398
1819
|
else
|
|
1399
|
-
|
|
1820
|
+
animateOpenProgress(1);
|
|
1400
1821
|
// Raise the keyboard on the SAME tap that opens the pill. While pilled, the
|
|
1401
1822
|
// composer content is `inert`, and React only clears that on the next
|
|
1402
1823
|
// render — too late for iOS WebKit, which honors focus() only synchronously
|
|
@@ -1410,13 +1831,24 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1410
1831
|
contentRef.current?.removeAttribute("inert");
|
|
1411
1832
|
suppressExpandOnFocusRef.current = true;
|
|
1412
1833
|
inputRef.current?.focus();
|
|
1413
|
-
}, [
|
|
1834
|
+
}, [
|
|
1835
|
+
openProgress,
|
|
1836
|
+
reduce,
|
|
1837
|
+
hasThread,
|
|
1838
|
+
goToDetent,
|
|
1839
|
+
stopOpenProgressAnimation,
|
|
1840
|
+
animateOpenProgress,
|
|
1841
|
+
]);
|
|
1414
1842
|
// --- Pull gesture --------------------------------------------------------
|
|
1415
1843
|
// The grabber is the draggable handle. A live drag sets the threadHeight motion
|
|
1416
1844
|
// value DIRECTLY (no React state → no re-render per frame, so it tracks the
|
|
1417
1845
|
// finger 1:1); release fires onPullUp/onPullDown (distance OR velocity, via
|
|
1418
1846
|
// usePullGesture) to snap to a detent.
|
|
1419
1847
|
const onDragOffset = React.useCallback((offset) => {
|
|
1848
|
+
if (!draggingRef.current) {
|
|
1849
|
+
stopThreadAnimation();
|
|
1850
|
+
stopOpenProgressAnimation();
|
|
1851
|
+
}
|
|
1420
1852
|
draggingRef.current = true;
|
|
1421
1853
|
// PILL drag: map the upward travel to the pill→input morph (openProgress).
|
|
1422
1854
|
// The thread stays at 0 until the input is fully formed; only the EXCESS
|
|
@@ -1458,6 +1890,8 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1458
1890
|
clampHeight,
|
|
1459
1891
|
threadHeight,
|
|
1460
1892
|
openProgress,
|
|
1893
|
+
stopThreadAnimation,
|
|
1894
|
+
stopOpenProgressAnimation,
|
|
1461
1895
|
]);
|
|
1462
1896
|
const pullBinding = usePullGesture({
|
|
1463
1897
|
onDrag: onDragOffset,
|
|
@@ -1478,10 +1912,12 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1478
1912
|
else {
|
|
1479
1913
|
// Pill → bare input bar (no thread to open into).
|
|
1480
1914
|
setMode("input");
|
|
1481
|
-
if (reduce)
|
|
1915
|
+
if (reduce) {
|
|
1916
|
+
stopThreadAnimation();
|
|
1482
1917
|
threadHeight.set(0);
|
|
1918
|
+
}
|
|
1483
1919
|
else
|
|
1484
|
-
|
|
1920
|
+
animateThreadHeight(0);
|
|
1485
1921
|
detentHaptic();
|
|
1486
1922
|
}
|
|
1487
1923
|
return;
|
|
@@ -1652,9 +2088,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1652
2088
|
opacity: revealed,
|
|
1653
2089
|
visibility: scrimVisibility,
|
|
1654
2090
|
pointerEvents: sheetOpen ? "auto" : "none",
|
|
1655
|
-
} }), recording && transcript ? (_jsxs("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: cn("pointer-events-none relative mb-2 w-full max-w-3xl text-center text-sm italic text-white/85", FLOAT_SHADOW), children: [transcript, _jsx("span", { "aria-hidden": "true", children: "\u2026" })] })) : null, needsAudioUnlock ? (_jsx("div", { role: "status", "aria-live": "polite", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("button", { type: "button", onClick: unlockAudio, "data-testid": "overlay-voice-audio-unlock", className: cn("pointer-events-auto inline-flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors", "border-warn/40 bg-warn/15 text-warn hover:bg-warn/25", "
|
|
2091
|
+
} }), recording && transcript ? (_jsxs("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: cn("pointer-events-none relative mb-2 w-full max-w-3xl text-center text-sm italic text-white/85", FLOAT_SHADOW), children: [transcript, _jsx("span", { "aria-hidden": "true", children: "\u2026" })] })) : null, needsAudioUnlock ? (_jsx("div", { role: "status", "aria-live": "polite", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("button", { type: "button", onClick: unlockAudio, "data-testid": "overlay-voice-audio-unlock", className: cn("pointer-events-auto inline-flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors", "border-warn/40 bg-warn/15 text-warn hover:bg-warn/25", " ", FLOAT_SHADOW), children: [_jsx(Glyph, { d: SPEAKER_MUTED_GLYPH }), _jsx("span", { children: "Tap to enable sound" })] }) })) : null, modelStatus.kind === "downloading" || modelStatus.kind === "loading" ? (_jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", "data-testid": "overlay-model-download-status", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("span", { className: cn("inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/10 px-3 py-1.5 text-sm font-medium text-white/85", FLOAT_SHADOW), children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-[#FF5800]" }), modelStatus.kind === "downloading" ? (_jsxs("span", { children: ["Downloading ", modelStatus.modelName ?? "local model", typeof modelStatus.percent === "number"
|
|
1656
2092
|
? ` — ${Math.round(modelStatus.percent)}%`
|
|
1657
|
-
: "…"] })) : (_jsxs("span", { children: ["Loading ", modelStatus.modelName ?? "local model", "\u2026"] }))] }) })) : null, suggestionsVisible ? (_jsx(motion.fieldset, { "aria-label": "Suggested prompts", className: cn("pointer-events-auto relative m-0 mb-2 flex w-full max-w-3xl flex-wrap items-center justify-center gap-2 border-0 p-0"), style: { order: -1, opacity: suggestionsOpacity }, "data-testid": "chat-suggestions", children: suggestions.map((s, i) => (_jsx("button", { type: "button", "data-testid": `chat-suggestion-${i}`, "aria-label": s, onClick: () => pickSuggestion(s), className: cn("max-w-full truncate rounded-full border border-white/15 bg-black/40 px-3 py-1.5", "text-[12px] text-white/80
|
|
2093
|
+
: "…"] })) : (_jsxs("span", { children: ["Loading ", modelStatus.modelName ?? "local model", "\u2026"] }))] }) })) : null, suggestionsVisible ? (_jsx(motion.fieldset, { "aria-label": "Suggested prompts", className: cn("pointer-events-auto relative m-0 mb-2 flex w-full max-w-3xl flex-wrap items-center justify-center gap-2 border-0 p-0"), style: { order: -1, opacity: suggestionsOpacity }, "data-testid": "chat-suggestions", children: suggestions.map((s, i) => (_jsx("button", { type: "button", "data-testid": `chat-suggestion-${i}`, "aria-label": s, onClick: () => pickSuggestion(s), className: cn("max-w-full truncate rounded-full border border-white/15 bg-black/40 px-3 py-1.5", "text-[12px] text-white/80 transition-colors", "hover:border-white/30 hover:bg-white/15 hover:text-white", " "), children: s }, s))) })) : null, _jsxs("div", { className: cn("pointer-events-none relative flex w-full flex-col items-center", fullBleed ? "max-w-none" : "max-w-3xl"), children: [!fullBleed ? (_jsx(SheetGrabber, { open: sheetOpen, onOpen: () => {
|
|
1658
2094
|
if (!hasThread)
|
|
1659
2095
|
return;
|
|
1660
2096
|
goToDetent("half");
|
|
@@ -1687,23 +2123,14 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1687
2123
|
// home screen — only the pill-capsule child re-enables pointer events.
|
|
1688
2124
|
pointerEvents: pilled ? "none" : "auto",
|
|
1689
2125
|
}, className: cn(
|
|
1690
|
-
// overflow-VISIBLE on the outer fieldset: the
|
|
1691
|
-
//
|
|
1692
|
-
//
|
|
1693
|
-
//
|
|
2126
|
+
// overflow-VISIBLE on the outer fieldset: the pill's tall grab zone
|
|
2127
|
+
// must bleed past the box. The rounded thread-clip lives on the inner
|
|
2128
|
+
// content wrapper instead, so clipping the scroll never clips a hard
|
|
2129
|
+
// square edge over the content.
|
|
1694
2130
|
"relative m-0 flex w-full min-w-0 flex-col overflow-visible border-0 p-0"), children: [_jsx(motion.div, { "aria-hidden": "true", className: cn("pointer-events-none absolute inset-0 z-0", fullBleed ? "border-0" : "border border-white/[0.16]",
|
|
1695
|
-
//
|
|
1696
|
-
//
|
|
1697
|
-
|
|
1698
|
-
// out — instead of a heavy dark fill. blur(16px)+saturate+brightness
|
|
1699
|
-
// compose into ONE backdrop-filter pass (blur radius never animated,
|
|
1700
|
-
// so it stays cheap on the per-frame-resizing surface). The base
|
|
1701
|
-
// bg-black/45 is the legible fallback when backdrop-filter is
|
|
1702
|
-
// unavailable; the supports- rule thins it to glass once the filter
|
|
1703
|
-
// is doing the darkening.
|
|
1704
|
-
"bg-black/45 backdrop-blur-lg backdrop-saturate-[1.8] backdrop-brightness-[0.68] supports-[backdrop-filter]:bg-black/[0.12]", fullBleed
|
|
1705
|
-
? "shadow-none"
|
|
1706
|
-
: "shadow-[inset_0_1px_0_rgba(255,255,255,0.26),inset_0_0_0_0.5px_rgba(255,255,255,0.08),0_18px_50px_-16px_rgba(0,0,0,0.72)]"), style: {
|
|
2131
|
+
// A solid dark fill so white text stays legible over any view
|
|
2132
|
+
// behind (a bright view, a dark view, or the warm ambient field).
|
|
2133
|
+
"bg-black/45"), style: {
|
|
1707
2134
|
opacity: glassOpacity,
|
|
1708
2135
|
borderRadius: fullBleed ? 0 : panelRadius,
|
|
1709
2136
|
// Full-bleed: extend the glass UP through the safe-area-top so the
|
|
@@ -1725,7 +2152,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1725
2152
|
opacity: glassOpacity,
|
|
1726
2153
|
pointerEvents: pilled ? "none" : "auto",
|
|
1727
2154
|
borderRadius: fullBleed ? 0 : panelRadius,
|
|
1728
|
-
}, children: [
|
|
2155
|
+
}, children: [sheetOpen ? (_jsxs(_Fragment, { children: [_jsx(SwipeEdgeHint, { side: "left", active: swipeDx < 0 && conversationNav.hasPrev, amount: -swipeDx }), _jsx(SwipeEdgeHint, { side: "right", active: swipeDx > 0 && conversationNav.hasNext, amount: swipeDx })] })) : null, _jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 top-0 z-0 h-20 bg-gradient-to-b from-white/[0.07] to-transparent" }), !pilled ? (_jsxs(motion.div
|
|
1729
2156
|
// Always mounted (when not pilled) so it can FADE + LERP its
|
|
1730
2157
|
// space open/closed with the live height instead of popping in
|
|
1731
2158
|
// on a mount. `headerVisible` (live-height boolean) gates
|
|
@@ -1756,7 +2183,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1756
2183
|
paddingTop: fullBleed
|
|
1757
2184
|
? "calc(var(--safe-area-top, 0px) + 0.5rem)"
|
|
1758
2185
|
: headerPadTop,
|
|
1759
|
-
}, className: cn("relative z-10 flex shrink-0 items-center justify-between gap-1.5 overflow-hidden px-3"), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(HeaderButton, { icon: maximized ? Minimize2 : Maximize2, label: maximized ? "exit full screen" : "full screen", active: maximized, onClick: toggleMaximize, testId: "chat-full-maximize" }),
|
|
2186
|
+
}, className: cn("relative z-10 flex shrink-0 items-center justify-between gap-1.5 overflow-hidden px-3"), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(HeaderButton, { icon: maximized ? Minimize2 : Maximize2, label: maximized ? "exit full screen" : "full screen", active: maximized, onClick: toggleMaximize, testId: "chat-full-maximize" }), hasThread ? (_jsx(HeaderButton, { icon: conversationCopied ? Check : Copy, label: conversationCopied
|
|
2187
|
+
? "conversation copied"
|
|
2188
|
+
: "copy conversation", onClick: handleCopyConversation, testId: "chat-full-copy-conversation" })) : null, _jsx(HeaderButton, { icon: RotateCcw, label: "clear conversation", onClick: () => clearConversation(), testId: "chat-full-clear" })] }), transcriptionMode ? (_jsx("div", { "data-testid": "chat-transcribing-badge", className: "pointer-events-none absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full bg-[var(--brand-orange,#ff6a00)]/15 px-2.5 py-0.5 text-[11px] font-medium text-[var(--brand-orange,#ff6a00)]", children: "Transcribing \u2014 say \u201Cexit transcription mode\u201D to stop" })) : null, _jsx("div", { className: "flex items-center gap-1.5", children: _jsx(HeaderButton, { icon: LayoutGrid, label: "springboard", onClick: () => navigateAndClose(() => navigateHome?.()), testId: "chat-full-springboard" }) })] })) : null, hasThread || sheetOpen ? (_jsx(motion.div, { "data-testid": "chat-thread", className: cn("relative z-10 min-h-0 w-full shrink grow-0 overflow-hidden",
|
|
1760
2189
|
// When open, fade the top edge into the glass so the topmost
|
|
1761
2190
|
// message dissolves under the drag handle instead of butting
|
|
1762
2191
|
// against it.
|
|
@@ -1772,20 +2201,34 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1772
2201
|
style: {
|
|
1773
2202
|
flexBasis: threadFlexBasis,
|
|
1774
2203
|
paddingTop: threadGrabberClearance,
|
|
1775
|
-
}, children:
|
|
2204
|
+
}, children: _jsxs("div", { id: "continuous-thread", ref: threadRef, role: "log", "aria-label": "conversation history", "aria-live": "polite", "aria-hidden": !sheetOpen ? true : undefined, tabIndex: sheetOpen ? 0 : -1, onKeyDown: (e) => {
|
|
1776
2205
|
if (e.key === "Escape") {
|
|
1777
2206
|
e.preventDefault();
|
|
1778
2207
|
collapse();
|
|
1779
2208
|
}
|
|
1780
|
-
}, className: "relative flex h-full w-full touch-pan-y flex-col overflow-y-auto px-5 [scrollbar-width:none]
|
|
1781
|
-
|
|
1782
|
-
|
|
2209
|
+
}, ...(sheetOpen ? conversationSwipe : {}), className: "relative flex h-full w-full touch-pan-y flex-col overflow-y-auto px-5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: [visibleMessages.length === 0 && conversationLoading ? (_jsx("div", { "data-testid": "chat-thread-loading", className: "pointer-events-none absolute inset-0 grid place-items-center", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-[#FF5800]" }) })) : null, hasTopics ? (_jsx(TopicChipsBar, { topics: channelTopics, onSelectTopic: scrollToTopic, className: "sticky top-0 z-[2] -mx-5 mb-1 bg-gradient-to-b from-black/40 to-transparent px-5" })) : null, _jsxs("div", { className: "mt-auto flex flex-col pb-3 pt-1", children: [hasTopics
|
|
2210
|
+
? // Topic-grouped transcript: each cluster collapses via a
|
|
2211
|
+
// gesture on its header (no visible buttons).
|
|
2212
|
+
(() => {
|
|
2213
|
+
let lineIndex = 0;
|
|
2214
|
+
return topicSegments.map((segment) => {
|
|
2215
|
+
const lines = segment.messages.map((m) => renderThreadLine(m, lineIndex++));
|
|
2216
|
+
return (_jsx(TopicGroup, { topic: segment.topic, count: segment.messages.length, collapsed: collapsedTopics.has(segment.key), onCollapsedChange: (collapsed) => setTopicCollapsed(segment.key, collapsed), children: _jsx(AnimatePresence, { initial: false, children: lines }) }, segment.messages[0]?.id ?? segment.key));
|
|
2217
|
+
});
|
|
2218
|
+
})()
|
|
2219
|
+
: // Flat transcript (no topic tags) — unchanged behavior.
|
|
2220
|
+
// Only the LAST, content-less assistant turn (the
|
|
2221
|
+
// in-flight one) reads turnStatus — every settled bubble
|
|
2222
|
+
// gets undefined so its memo identity is unchanged.
|
|
2223
|
+
null, hasTopics ? null : (_jsx(AnimatePresence, { initial: false, children: visibleMessages.map((m, i) => renderThreadLine(m, i)) })), _jsx(AnimatePresence, { children: responding &&
|
|
2224
|
+
!(visibleMessages.at(-1)?.role === "assistant" &&
|
|
2225
|
+
!visibleMessages.at(-1)?.content.trim()) ? (_jsx(TurnStatusIndicator, { status: turnStatus, reduce: reduce })) : null }), _jsx("div", { ref: endRef })] })] }) })) : null, hasImages || imageError ? (_jsxs("div", { className: "relative z-10 flex shrink-0 flex-col gap-1.5 px-3 pt-2", children: [hasImages ? (_jsx("div", { className: "flex flex-wrap gap-2", children: pendingImages.map((img, i) => {
|
|
1783
2226
|
const kind = chatUploadKind(img.mimeType);
|
|
1784
2227
|
const removeButton = (_jsx("button", { type: "button", "aria-label": `remove ${img.name}`, onClick: () => removeImage(i),
|
|
1785
2228
|
// Small visual disc, but a 44px-class hit zone via the
|
|
1786
2229
|
// invisible `before` overlay so it's thumb-tappable
|
|
1787
2230
|
// without crowding the tile.
|
|
1788
|
-
className: "absolute -right-1.5 -top-1.5 grid h-5 w-5 place-items-center rounded-full border border-white/20 bg-black/70 text-xs text-white/90
|
|
2231
|
+
className: "absolute -right-1.5 -top-1.5 grid h-5 w-5 place-items-center rounded-full border border-white/20 bg-black/70 text-xs text-white/90 transition-colors before:absolute before:-inset-3 before:content-[''] hover:bg-black/90", children: "\u00D7" }));
|
|
1789
2232
|
const tileKey = `${img.name}-${img.mimeType}-${img.data.length}`;
|
|
1790
2233
|
if (kind === "image") {
|
|
1791
2234
|
return (_jsxs("div", { className: "group relative h-14 w-14 shrink-0", children: [_jsx("img", { src: `data:${img.mimeType};base64,${img.data}`, alt: img.name, className: "h-14 w-14 rounded-lg border border-white/20 object-cover" }), removeButton] }, tileKey));
|
|
@@ -1835,11 +2278,22 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1835
2278
|
expand();
|
|
1836
2279
|
}
|
|
1837
2280
|
}, onBlur: () => setComposerFocused(false), onPaste: (e) => {
|
|
1838
|
-
//
|
|
1839
|
-
|
|
1840
|
-
|
|
2281
|
+
// Shared with the desktop composer: a pasted image/file
|
|
2282
|
+
// attaches, a large plain-text paste becomes a collapsed
|
|
2283
|
+
// text-attachment chip, and small text falls through to the
|
|
2284
|
+
// textarea as normal.
|
|
2285
|
+
const intent = classifyComposerPaste({
|
|
2286
|
+
files: Array.from(e.clipboardData?.files ?? []),
|
|
2287
|
+
text: e.clipboardData?.getData("text") ?? "",
|
|
2288
|
+
});
|
|
2289
|
+
if (intent.kind === "files") {
|
|
2290
|
+
e.preventDefault();
|
|
2291
|
+
addImageFiles(intent.files);
|
|
2292
|
+
return;
|
|
2293
|
+
}
|
|
2294
|
+
if (intent.kind === "text-attachment") {
|
|
1841
2295
|
e.preventDefault();
|
|
1842
|
-
|
|
2296
|
+
setPendingImages((prev) => [...prev, intent.attachment].slice(0, MAX_CHAT_IMAGES));
|
|
1843
2297
|
}
|
|
1844
2298
|
}, onKeyDown: (e) => {
|
|
1845
2299
|
// The slash menu intercepts navigation/commit keys when open.
|
|
@@ -1888,30 +2342,28 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
|
|
|
1888
2342
|
}
|
|
1889
2343
|
}, placeholder: booting
|
|
1890
2344
|
? `Ask ${agentName} — waking up…`
|
|
1891
|
-
: (viewChatBinding?.placeholder ?? `Ask ${agentName}`), "aria-label": "message", "data-testid": "chat-composer-textarea", "aria-describedby": booting ? "cc-booting-hint" : undefined, ...comboboxAria, className: "max-h-[8.5rem] min-h-8 min-w-0 flex-1 resize-none self-center border-none bg-transparent px-1.5 py-1 text-left text-sm leading-relaxed text-white/[0.92] outline-none [scrollbar-width:none] placeholder:text-white/45 [&::-webkit-scrollbar]:hidden" }), _jsxs("span", { id: "cc-booting-hint", className: "sr-only", children: [agentName, " is waking up \u2014 you can type now; your message sends and the reply arrives in a moment."] }),
|
|
1892
|
-
? "
|
|
1893
|
-
:
|
|
1894
|
-
? "send
|
|
1895
|
-
:
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
? "
|
|
1908
|
-
:
|
|
1909
|
-
? "
|
|
1910
|
-
:
|
|
1911
|
-
? "
|
|
1912
|
-
: recording
|
|
1913
|
-
? "stop listening"
|
|
1914
|
-
: "talk", active: recording || handsFree || transcriptionMode, onClick: handleMicClick, onPointerDown: beginPushToTalkPress, onPointerUp: (e) => finishPushToTalkPress(e, false), onPointerCancel: (e) => finishPushToTalkPress(e, true), testId: "chat-composer-mic" })) })] })] })] }), _jsx(motion.div, { className: "absolute inset-x-0 bottom-0 z-30 flex justify-center", style: {
|
|
2345
|
+
: (viewChatBinding?.placeholder ?? `Ask ${agentName}`), "aria-label": "message", "data-testid": "chat-composer-textarea", "aria-describedby": booting ? "cc-booting-hint" : undefined, ...comboboxAria, className: "max-h-[8.5rem] min-h-8 min-w-0 flex-1 resize-none self-center border-none bg-transparent px-1.5 py-1 text-left text-sm leading-relaxed text-white/[0.92] outline-none [scrollbar-width:none] placeholder:text-white/45 [&::-webkit-scrollbar]:hidden" }), _jsxs("span", { id: "cc-booting-hint", className: "sr-only", children: [agentName, " is waking up \u2014 you can type now; your message sends and the reply arrives in a moment."] }), _jsx("div", { className: "flex shrink-0 items-center gap-1.5 sm:gap-2", children: _jsx("div", { className: "shrink-0", children: (hasDraft || hasImages) && !recording ? (_jsx(SoftButton, { icon: SendHorizontal, label: !canSend
|
|
2346
|
+
? "send (agent stopped)"
|
|
2347
|
+
: responding
|
|
2348
|
+
? "send another"
|
|
2349
|
+
: "send", disabled: !canSend,
|
|
2350
|
+
// Keep focus in the textarea on tap: without this the
|
|
2351
|
+
// button steals focus, the textarea blurs, the keyboard
|
|
2352
|
+
// retracts and the composer relayouts between pointerdown
|
|
2353
|
+
// and click — so the first tap only dismissed the keyboard
|
|
2354
|
+
// and a second tap was needed to actually send. Chromium
|
|
2355
|
+
// still dispatches click after a preventDefaulted
|
|
2356
|
+
// pointerdown, so onClick fires on the first tap and the
|
|
2357
|
+
// keyboard stays up for the next message.
|
|
2358
|
+
onPointerDown: (e) => e.preventDefault(), onClick: submit, testId: "chat-composer-action" })) : !recording && responding ? (_jsx(SoftButton, { glyph: STOP_GLYPH, label: "stop generating", onClick: () => stop(), testId: "chat-composer-stop" })) : (_jsx(SoftButton, { icon: Mic, label: pttHolding
|
|
2359
|
+
? "release to send"
|
|
2360
|
+
: transcriptionMode
|
|
2361
|
+
? "stop transcription"
|
|
2362
|
+
: handsFree
|
|
2363
|
+
? "end conversation"
|
|
2364
|
+
: recording
|
|
2365
|
+
? "stop listening"
|
|
2366
|
+
: "talk", active: recording || handsFree || transcriptionMode, onClick: handleMicClick, onPointerDown: beginPushToTalkPress, onPointerUp: (e) => finishPushToTalkPress(e, false), onPointerCancel: (e) => finishPushToTalkPress(e, true), testId: "chat-composer-mic" })) }) })] })] }), _jsx(motion.div, { className: "absolute inset-x-0 bottom-0 z-30 flex justify-center", style: {
|
|
1915
2367
|
opacity: pillOpacity,
|
|
1916
2368
|
pointerEvents: pilled ? "auto" : "none",
|
|
1917
2369
|
}, children: _jsx(PillHandle, { binding: pullBinding, onOpen: openFromPill, glow: listening || responding, pilled: pilled }) })] })] })] }));
|