@elizaos/ui 2.0.0-alpha.385 → 2.0.0-alpha.392
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/apps/app-companion/src/components/companion/CompanionAppView.d.ts.map +1 -1
- package/apps/app-companion/src/components/companion/CompanionAppView.js +6 -4
- package/apps/app-companion/src/components/companion/CompanionView.d.ts.map +1 -1
- package/apps/app-companion/src/components/companion/CompanionView.js +6 -4
- package/apps/app-lifeops/src/api/client-lifeops.js +6 -0
- package/apps/app-lifeops/src/components/AppBlockerSettingsCard.d.ts +3 -0
- package/apps/app-lifeops/src/components/AppBlockerSettingsCard.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/AppBlockerSettingsCard.js +189 -0
- package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.d.ts +2 -0
- package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.js +1065 -0
- package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.d.ts +7 -0
- package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.js +71 -0
- package/apps/app-lifeops/src/components/DataSourcesStrip.d.ts +14 -0
- package/apps/app-lifeops/src/components/DataSourcesStrip.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/DataSourcesStrip.js +36 -0
- package/apps/app-lifeops/src/components/EventEditorDrawer.d.ts +23 -0
- package/apps/app-lifeops/src/components/EventEditorDrawer.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/EventEditorDrawer.js +514 -0
- package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.js +10 -0
- package/apps/app-lifeops/src/components/LifeOpsCalendarSection.d.ts +15 -0
- package/apps/app-lifeops/src/components/LifeOpsCalendarSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsCalendarSection.js +515 -0
- package/apps/app-lifeops/src/components/LifeOpsChatAdapter.d.ts +34 -0
- package/apps/app-lifeops/src/components/LifeOpsChatAdapter.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsChatAdapter.js +175 -0
- package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.js +99 -0
- package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.d.ts +37 -0
- package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.js +88 -0
- package/apps/app-lifeops/src/components/LifeOpsInboxSection.d.ts +13 -0
- package/apps/app-lifeops/src/components/LifeOpsInboxSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsInboxSection.js +490 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.d.ts +12 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.js +92 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.d.ts +12 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.js +160 -0
- package/apps/app-lifeops/src/components/LifeOpsMoneySection.d.ts +3 -0
- package/apps/app-lifeops/src/components/LifeOpsMoneySection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsMoneySection.js +373 -0
- package/apps/app-lifeops/src/components/LifeOpsNavRail.d.ts +9 -0
- package/apps/app-lifeops/src/components/LifeOpsNavRail.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsNavRail.js +93 -0
- package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.d.ts +4 -0
- package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.js +274 -0
- package/apps/app-lifeops/src/components/LifeOpsOverviewSection.d.ts +7 -0
- package/apps/app-lifeops/src/components/LifeOpsOverviewSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsOverviewSection.js +657 -0
- package/apps/app-lifeops/src/components/LifeOpsPageSections.d.ts +42 -0
- package/apps/app-lifeops/src/components/LifeOpsPageSections.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsPageSections.js +166 -0
- package/apps/app-lifeops/src/components/LifeOpsPageView.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsPageView.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsPageView.js +566 -0
- package/apps/app-lifeops/src/components/LifeOpsRemindersSection.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsRemindersSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsRemindersSection.js +749 -0
- package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.d.ts +27 -0
- package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.js +106 -0
- package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.js +373 -0
- package/apps/app-lifeops/src/components/LifeOpsSectionContent.d.ts +10 -0
- package/apps/app-lifeops/src/components/LifeOpsSectionContent.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsSectionContent.js +30 -0
- package/apps/app-lifeops/src/components/LifeOpsSelectionContext.d.ts +21 -0
- package/apps/app-lifeops/src/components/LifeOpsSelectionContext.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsSelectionContext.js +30 -0
- package/apps/app-lifeops/src/components/LifeOpsSettingsSection.d.ts +20 -0
- package/apps/app-lifeops/src/components/LifeOpsSettingsSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsSettingsSection.js +597 -0
- package/apps/app-lifeops/src/components/LifeOpsSetupGate.d.ts +13 -0
- package/apps/app-lifeops/src/components/LifeOpsSetupGate.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsSetupGate.js +134 -0
- package/apps/app-lifeops/src/components/LifeOpsSleepSection.d.ts +10 -0
- package/apps/app-lifeops/src/components/LifeOpsSleepSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsSleepSection.js +425 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.d.ts +11 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.js +49 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.d.ts +2 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.js +1041 -0
- package/apps/app-lifeops/src/components/MessagingConnectorCards.d.ts +7 -0
- package/apps/app-lifeops/src/components/MessagingConnectorCards.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/MessagingConnectorCards.js +643 -0
- package/apps/app-lifeops/src/components/MissingSourceCard.d.ts +9 -0
- package/apps/app-lifeops/src/components/MissingSourceCard.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/MissingSourceCard.js +5 -0
- package/apps/app-lifeops/src/components/MobileSignalsSetupCard.d.ts +2 -0
- package/apps/app-lifeops/src/components/MobileSignalsSetupCard.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/MobileSignalsSetupCard.js +163 -0
- package/apps/app-lifeops/src/components/SleepInspectionPanel.d.ts +8 -0
- package/apps/app-lifeops/src/components/SleepInspectionPanel.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/SleepInspectionPanel.js +59 -0
- package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.d.ts +3 -0
- package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.js +75 -0
- package/apps/app-lifeops/src/components/WhatsAppQrOverlay.d.ts +8 -0
- package/apps/app-lifeops/src/components/WhatsAppQrOverlay.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/WhatsAppQrOverlay.js +48 -0
- package/apps/app-lifeops/src/components/lifeops-labels.d.ts +2 -0
- package/apps/app-lifeops/src/components/lifeops-labels.d.ts.map +1 -0
- package/apps/app-lifeops/src/components/lifeops-labels.js +5 -0
- package/apps/app-lifeops/src/events/index.d.ts +34 -0
- package/apps/app-lifeops/src/events/index.d.ts.map +1 -0
- package/apps/app-lifeops/src/events/index.js +23 -0
- package/apps/app-lifeops/src/hooks/useCalendarWeek.d.ts +28 -0
- package/apps/app-lifeops/src/hooks/useCalendarWeek.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useCalendarWeek.js +93 -0
- package/apps/app-lifeops/src/hooks/useDiscordConnector.d.ts +14 -0
- package/apps/app-lifeops/src/hooks/useDiscordConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useDiscordConnector.js +126 -0
- package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.d.ts +29 -0
- package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.js +481 -0
- package/apps/app-lifeops/src/hooks/useIMessageConnector.d.ts +10 -0
- package/apps/app-lifeops/src/hooks/useIMessageConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useIMessageConnector.js +50 -0
- package/apps/app-lifeops/src/hooks/useInbox.d.ts +34 -0
- package/apps/app-lifeops/src/hooks/useInbox.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useInbox.js +98 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.d.ts +2 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.js +383 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsAppState.d.ts +9 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsAppState.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsAppState.js +83 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.d.ts +8 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.js +60 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.d.ts +18 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.js +66 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.d.ts +14 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.js +79 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsSection.d.ts +18 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsSection.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsSection.js +78 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.d.ts +14 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.js +160 -0
- package/apps/app-lifeops/src/hooks/useSignalConnector.d.ts +16 -0
- package/apps/app-lifeops/src/hooks/useSignalConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useSignalConnector.js +198 -0
- package/apps/app-lifeops/src/hooks/useTelegramConnector.d.ts +21 -0
- package/apps/app-lifeops/src/hooks/useTelegramConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useTelegramConnector.js +177 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppConnector.d.ts +8 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppConnector.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppConnector.js +58 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppPairing.d.ts +12 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppPairing.d.ts.map +1 -0
- package/apps/app-lifeops/src/hooks/useWhatsAppPairing.js +152 -0
- package/apps/app-lifeops/src/lifeops/discord-browser-scraper.js +1 -1
- package/apps/app-lifeops/src/lifeops/google-gmail.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/google-gmail.js +74 -26
- package/apps/app-lifeops/src/lifeops/google-managed-client.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/google-managed-client.js +4 -5
- package/apps/app-lifeops/src/lifeops/google-oauth.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/google-oauth.js +2 -2
- package/apps/app-lifeops/src/lifeops/owner-profile.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/owner-profile.js +1 -1
- package/apps/app-lifeops/src/lifeops/paypal-managed-client.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/paypal-managed-client.js +4 -5
- package/apps/app-lifeops/src/lifeops/plaid-managed-client.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/plaid-managed-client.js +4 -5
- package/apps/app-lifeops/src/lifeops/schedule-sync-client.js +2 -2
- package/apps/app-lifeops/src/lifeops/service-constants.d.ts +1 -0
- package/apps/app-lifeops/src/lifeops/service-constants.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-constants.js +1 -0
- package/apps/app-lifeops/src/lifeops/service-mixin-core.d.ts +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-core.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-core.js +2 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-imessage.js +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-inbox.d.ts +3 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-inbox.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-inbox.js +42 -13
- package/apps/app-lifeops/src/lifeops/service-mixin-reminders.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-reminders.js +3 -2
- package/apps/app-lifeops/src/lifeops/service-mixin-workflows.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-mixin-workflows.js +1 -1
- package/apps/app-lifeops/src/lifeops/service-normalize-calendar.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-normalize-calendar.js +3 -3
- package/apps/app-lifeops/src/lifeops/service-normalize-connector.d.ts +1 -1
- package/apps/app-lifeops/src/lifeops/service-normalize-connector.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/service-normalize-connector.js +2 -2
- package/apps/app-lifeops/src/lifeops/signal-auth.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/signal-auth.js +6 -3
- package/apps/app-lifeops/src/lifeops/telegram-auth.js +1 -1
- package/apps/app-lifeops/src/lifeops/travel-adapters/duffel.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/travel-adapters/duffel.js +31 -6
- package/apps/app-lifeops/src/lifeops/twilio.js +1 -1
- package/apps/app-lifeops/src/lifeops/x-poster.d.ts.map +1 -1
- package/apps/app-lifeops/src/lifeops/x-poster.js +13 -3
- package/apps/app-lifeops/src/lifeops-route.d.ts +74 -0
- package/apps/app-lifeops/src/lifeops-route.d.ts.map +1 -0
- package/apps/app-lifeops/src/lifeops-route.js +204 -0
- package/apps/app-lifeops/src/platform/lifeops-github.d.ts +15 -0
- package/apps/app-lifeops/src/platform/lifeops-github.d.ts.map +1 -0
- package/apps/app-lifeops/src/platform/lifeops-github.js +135 -0
- package/apps/app-lifeops/src/routes/cloud-features-routes.d.ts +2 -2
- package/apps/app-lifeops/src/routes/cloud-features-routes.d.ts.map +1 -1
- package/apps/app-lifeops/src/routes/cloud-features-routes.js +5 -3
- package/apps/app-lifeops/src/routes/lifeops-routes.d.ts.map +1 -1
- package/apps/app-lifeops/src/routes/lifeops-routes.js +15 -3
- package/apps/app-lifeops/src/routes/plugin.d.ts.map +1 -1
- package/apps/app-lifeops/src/routes/plugin.js +10 -1
- package/apps/app-lifeops/src/routes/travel-provider-relay-routes.d.ts +1 -1
- package/apps/app-lifeops/src/routes/travel-provider-relay-routes.d.ts.map +1 -1
- package/apps/app-lifeops/src/routes/travel-provider-relay-routes.js +4 -2
- package/apps/app-lifeops/src/routes/website-blocker-routes.d.ts +1 -1
- package/apps/app-lifeops/src/routes/website-blocker-routes.d.ts.map +1 -1
- package/apps/app-lifeops/src/ui.d.ts +11 -0
- package/apps/app-lifeops/src/ui.d.ts.map +1 -0
- package/apps/app-lifeops/src/ui.js +9 -0
- package/apps/app-lifeops/src/utils/lifeops-url.d.ts +5 -0
- package/apps/app-lifeops/src/utils/lifeops-url.d.ts.map +1 -0
- package/apps/app-lifeops/src/utils/lifeops-url.js +35 -0
- package/apps/app-lifeops/src/website-blocker/access.d.ts.map +1 -1
- package/apps/app-lifeops/src/website-blocker/access.js +1 -1
- package/apps/app-steward/src/routes/steward-compat-routes.d.ts +1 -1
- package/apps/app-steward/src/routes/steward-compat-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/steward-compat-routes.js +3 -1
- package/apps/app-steward/src/routes/wallet-browser-compat-routes.d.ts +1 -1
- package/apps/app-steward/src/routes/wallet-browser-compat-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/wallet-browser-compat-routes.js +3 -1
- package/apps/app-steward/src/routes/wallet-bsc-core-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/wallet-bsc-core-routes.js +2 -1
- package/apps/app-steward/src/routes/wallet-compat-routes.d.ts +1 -1
- package/apps/app-steward/src/routes/wallet-compat-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/wallet-compat-routes.js +3 -1
- package/apps/app-steward/src/routes/wallet-core-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/wallet-core-routes.js +2 -1
- package/apps/app-steward/src/routes/wallet-trade-compat-routes.d.ts +1 -1
- package/apps/app-steward/src/routes/wallet-trade-compat-routes.d.ts.map +1 -1
- package/apps/app-steward/src/routes/wallet-trade-compat-routes.js +3 -1
- package/apps/app-training/src/core/dataset-generator.d.ts +1 -1
- package/apps/app-training/src/core/dataset-generator.d.ts.map +1 -1
- package/apps/app-training/src/core/roleplay-executor.d.ts +1 -1
- package/apps/app-training/src/core/roleplay-executor.d.ts.map +1 -1
- package/apps/app-training/src/core/trajectory-task-datasets.d.ts +1 -1
- package/apps/app-training/src/core/trajectory-task-datasets.d.ts.map +1 -1
- package/apps/app-training/src/index.d.ts +1 -2
- package/apps/app-training/src/index.d.ts.map +1 -1
- package/apps/app-training/src/index.js +1 -2
- package/apps/app-training/src/routes/training-routes.d.ts +1 -1
- package/apps/app-training/src/routes/training-routes.d.ts.map +1 -1
- package/apps/app-training/src/routes/training-routes.js +1 -1
- package/apps/app-training/src/routes/trajectory-routes.d.ts +1 -1
- package/apps/app-training/src/routes/trajectory-routes.d.ts.map +1 -1
- package/apps/app-training/src/routes/trajectory-routes.js +3 -1
- package/apps/app-training/src/services/training-service-like.d.ts +1 -1
- package/apps/app-training/src/services/training-service-like.d.ts.map +1 -1
- package/apps/app-training/src/services/training-service.d.ts +1 -1
- package/apps/app-training/src/services/training-service.d.ts.map +1 -1
- package/package.json +1 -1
- package/packages/agent/src/api/provider-switch-config.js +1 -1
- package/packages/agent/src/api/server-helpers-auth.d.ts.map +1 -1
- package/packages/agent/src/api/server-helpers-auth.js +5 -4
- package/packages/agent/src/providers/media-provider.d.ts +1 -1
- package/packages/agent/src/providers/media-provider.d.ts.map +1 -1
- package/packages/app-core/src/App.d.ts.map +1 -1
- package/packages/app-core/src/App.js +20 -12
- package/packages/app-core/src/api/auth.d.ts.map +1 -1
- package/packages/app-core/src/api/auth.js +5 -5
- package/packages/app-core/src/api/client-types-experience.d.ts +7 -0
- package/packages/app-core/src/api/client-types-experience.d.ts.map +1 -1
- package/packages/app-core/src/components/apps/helpers.d.ts +1 -1
- package/packages/app-core/src/components/apps/helpers.d.ts.map +1 -1
- package/packages/app-core/src/components/apps/helpers.js +1 -0
- package/packages/app-core/src/components/apps/internal-tool-apps.d.ts +11 -0
- package/packages/app-core/src/components/apps/internal-tool-apps.d.ts.map +1 -1
- package/packages/app-core/src/components/apps/internal-tool-apps.js +31 -0
- package/packages/app-core/src/components/apps/launch-history.d.ts +16 -0
- package/packages/app-core/src/components/apps/launch-history.d.ts.map +1 -0
- package/packages/app-core/src/components/apps/launch-history.js +77 -0
- package/packages/app-core/src/components/apps/per-app-config.d.ts +19 -0
- package/packages/app-core/src/components/apps/per-app-config.d.ts.map +1 -0
- package/packages/app-core/src/components/apps/per-app-config.js +99 -0
- package/packages/app-core/src/components/apps/useRegistryCatalog.d.ts +14 -0
- package/packages/app-core/src/components/apps/useRegistryCatalog.d.ts.map +1 -0
- package/packages/app-core/src/components/apps/useRegistryCatalog.js +52 -0
- package/packages/app-core/src/components/auth/LoginView.d.ts +1 -19
- package/packages/app-core/src/components/auth/LoginView.d.ts.map +1 -1
- package/packages/app-core/src/components/auth/LoginView.js +4 -99
- package/packages/app-core/src/components/character/CharacterExperienceWorkspace.d.ts.map +1 -1
- package/packages/app-core/src/components/character/CharacterExperienceWorkspace.js +14 -2
- package/packages/app-core/src/components/character/character-hub-helpers.d.ts.map +1 -1
- package/packages/app-core/src/components/character/character-hub-helpers.js +7 -0
- package/packages/app-core/src/components/character/character-hub-types.d.ts +7 -0
- package/packages/app-core/src/components/character/character-hub-types.d.ts.map +1 -1
- package/packages/app-core/src/components/onboarding/BootstrapStep.d.ts.map +1 -1
- package/packages/app-core/src/components/onboarding/BootstrapStep.js +3 -2
- package/packages/app-core/src/components/pages/AppDetailsView.d.ts +36 -0
- package/packages/app-core/src/components/pages/AppDetailsView.d.ts.map +1 -0
- package/packages/app-core/src/components/pages/AppDetailsView.js +289 -0
- package/packages/app-core/src/components/pages/AppsView.d.ts.map +1 -1
- package/packages/app-core/src/components/pages/AppsView.js +134 -42
- package/packages/app-core/src/components/shell/StartupShell.d.ts.map +1 -1
- package/packages/app-core/src/components/shell/StartupShell.js +2 -5
- package/packages/app-core/src/i18n/locales/en.json +256 -205
- package/packages/app-core/src/i18n/locales/es.json +256 -205
- package/packages/app-core/src/i18n/locales/ko.json +256 -205
- package/packages/app-core/src/i18n/locales/pt.json +256 -205
- package/packages/app-core/src/i18n/locales/tl.json +256 -205
- package/packages/app-core/src/i18n/locales/vi.json +256 -205
- package/packages/app-core/src/i18n/locales/zh-CN.json +256 -205
- package/packages/app-core/src/navigation/index.d.ts.map +1 -1
- package/packages/app-core/src/navigation/index.js +6 -0
- package/packages/app-core/src/shell/AppWindowRenderer.d.ts +17 -0
- package/packages/app-core/src/shell/AppWindowRenderer.d.ts.map +1 -0
- package/packages/app-core/src/shell/AppWindowRenderer.js +337 -0
- package/packages/app-core/src/shell/DetachedShellRoot.js +4 -1
- package/packages/app-core/src/shell/index.d.ts +1 -0
- package/packages/app-core/src/shell/index.d.ts.map +1 -1
- package/packages/app-core/src/shell/index.js +1 -0
- package/packages/app-core/src/state/startup-coordinator.d.ts.map +1 -1
- package/packages/app-core/src/state/startup-coordinator.js +0 -3
- package/packages/app-core/src/state/startup-phase-poll.d.ts.map +1 -1
- package/packages/app-core/src/state/startup-phase-poll.js +2 -4
- package/packages/app-core/src/state/usePluginsSkillsState.d.ts +6 -6
- package/packages/native-plugins/mobile-signals/src/definitions.d.ts +162 -0
- package/packages/native-plugins/mobile-signals/src/definitions.d.ts.map +1 -0
- package/packages/native-plugins/mobile-signals/src/definitions.js +1 -0
- package/packages/native-plugins/mobile-signals/src/index.d.ts +4 -0
- package/packages/native-plugins/mobile-signals/src/index.d.ts.map +1 -0
- package/packages/native-plugins/mobile-signals/src/index.js +6 -0
- package/packages/native-plugins/mobile-signals/src/web.d.ts +29 -0
- package/packages/native-plugins/mobile-signals/src/web.d.ts.map +1 -0
- package/packages/native-plugins/mobile-signals/src/web.js +269 -0
- package/packages/shared/src/app-hero-art.d.ts.map +1 -1
- package/packages/shared/src/app-hero-art.js +13 -0
- package/packages/shared/src/contracts/lifeops.d.ts +10 -0
- package/packages/shared/src/contracts/lifeops.d.ts.map +1 -1
- package/packages/shared/src/contracts/lifeops.js +5 -0
- package/packages/typescript/src/features/advanced-capabilities/experience/actions/record-experience.d.ts.map +1 -1
- package/packages/typescript/src/features/advanced-capabilities/experience/actions/record-experience.js +46 -4
- package/packages/typescript/src/features/advanced-capabilities/experience/evaluators/experienceEvaluator.d.ts.map +1 -1
- package/packages/typescript/src/features/advanced-capabilities/experience/evaluators/experienceEvaluator.js +34 -124
- package/packages/typescript/src/features/advanced-capabilities/experience/service.d.ts.map +1 -1
- package/packages/typescript/src/features/advanced-capabilities/experience/service.js +56 -0
- package/packages/typescript/src/features/advanced-capabilities/experience/types.d.ts +7 -0
- package/packages/typescript/src/features/advanced-capabilities/experience/types.d.ts.map +1 -1
- package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.d.ts +7 -0
- package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.d.ts.map +1 -0
- package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.js +123 -0
- package/apps/app-training/src/ui/FineTuningView.d.ts +0 -5
- package/apps/app-training/src/ui/FineTuningView.d.ts.map +0 -1
- package/apps/app-training/src/ui/FineTuningView.js +0 -388
- package/apps/app-training/src/ui/fine-tuning-panels.d.ts +0 -111
- package/apps/app-training/src/ui/fine-tuning-panels.d.ts.map +0 -1
- package/apps/app-training/src/ui/fine-tuning-panels.js +0 -130
- package/apps/app-training/src/ui/index.d.ts +0 -3
- package/apps/app-training/src/ui/index.d.ts.map +0 -1
- package/apps/app-training/src/ui/index.js +0 -2
- package/packages/app-core/src/api/trusted-local-request.d.ts +0 -4
- package/packages/app-core/src/api/trusted-local-request.d.ts.map +0 -1
- package/packages/app-core/src/api/trusted-local-request.js +0 -176
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* AppDetailsView — config + diagnostics + widgets + Launch button page
|
|
4
|
+
* for apps that need it (those with `hasDetailsPage: true` in their
|
|
5
|
+
* descriptor, or any registry/catalog app with launch params).
|
|
6
|
+
*
|
|
7
|
+
* Mounted by AppsView when the apps sub-path is `/apps/<slug>/details`.
|
|
8
|
+
*/
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
10
|
+
import { Pin, PinOff, Settings as SettingsIcon, TriangleAlert, } from "lucide-react";
|
|
11
|
+
import { useRegistryCatalog } from "../apps/useRegistryCatalog";
|
|
12
|
+
import { invokeDesktopBridgeRequest } from "../../bridge";
|
|
13
|
+
import { useApp } from "../../state/useApp";
|
|
14
|
+
import { findAppBySlug, getAppSlug } from "../apps/helpers";
|
|
15
|
+
import { getInternalToolAppDescriptors, getInternalToolAppHasDetailsPage, getInternalToolAppTargetTab, getInternalToolApps, isInternalToolApp, } from "../apps/internal-tool-apps";
|
|
16
|
+
import { getAllOverlayApps, isOverlayApp, overlayAppToRegistryInfo, } from "../apps/overlay-app-registry";
|
|
17
|
+
import { loadPerAppConfig, savePerAppConfig, subscribePerAppConfig, } from "../apps/per-app-config";
|
|
18
|
+
import { getLaunchHistoryForApp, recordLaunchAttempt, } from "../apps/launch-history";
|
|
19
|
+
import { isWidgetVisible, loadChatSidebarVisibility, saveChatSidebarVisibility, widgetVisibilityKey, } from "../../widgets/visibility";
|
|
20
|
+
import { getWidgetComponent } from "../../widgets/registry";
|
|
21
|
+
function pluginIdFromName(name) {
|
|
22
|
+
return name.replace(/^@elizaos\/app-/, "");
|
|
23
|
+
}
|
|
24
|
+
function resolveAppFromSlug(slug, catalog) {
|
|
25
|
+
// Internal tool by slug
|
|
26
|
+
const internal = getInternalToolAppDescriptors().find((d) => d.windowPath === `/apps/${slug}`);
|
|
27
|
+
if (internal) {
|
|
28
|
+
const info = getInternalToolApps().find((a) => a.name === internal.name);
|
|
29
|
+
if (info) {
|
|
30
|
+
return {
|
|
31
|
+
source: "internal-tool",
|
|
32
|
+
info,
|
|
33
|
+
pluginId: pluginIdFromName(internal.name),
|
|
34
|
+
windowPath: internal.windowPath ?? `/apps/${slug}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Overlay app by slug
|
|
39
|
+
const overlay = getAllOverlayApps().find((a) => getAppSlug(a.name) === slug && isOverlayApp(a.name));
|
|
40
|
+
if (overlay) {
|
|
41
|
+
return {
|
|
42
|
+
source: "overlay",
|
|
43
|
+
info: overlayAppToRegistryInfo(overlay),
|
|
44
|
+
pluginId: pluginIdFromName(overlay.name),
|
|
45
|
+
windowPath: `/apps/${slug}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Catalog/registry app by slug
|
|
49
|
+
const catalogHit = findAppBySlug(catalog, slug);
|
|
50
|
+
if (catalogHit) {
|
|
51
|
+
return {
|
|
52
|
+
source: "catalog",
|
|
53
|
+
info: catalogHit,
|
|
54
|
+
pluginId: pluginIdFromName(catalogHit.name),
|
|
55
|
+
windowPath: `/apps/${slug}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function sourceLabel(source) {
|
|
61
|
+
switch (source) {
|
|
62
|
+
case "internal-tool":
|
|
63
|
+
return "Internal Tool";
|
|
64
|
+
case "overlay":
|
|
65
|
+
return "Overlay App";
|
|
66
|
+
case "catalog":
|
|
67
|
+
return "Catalog App";
|
|
68
|
+
default:
|
|
69
|
+
return "Unknown";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function formatTimestamp(value) {
|
|
73
|
+
try {
|
|
74
|
+
return new Date(value).toLocaleString();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return String(value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function SectionHeader({ children }) {
|
|
81
|
+
return (_jsx("h3", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: children }));
|
|
82
|
+
}
|
|
83
|
+
function ChipList({ items }) {
|
|
84
|
+
if (items.length === 0) {
|
|
85
|
+
return _jsx("span", { className: "text-xs text-muted", children: "None declared" });
|
|
86
|
+
}
|
|
87
|
+
return (_jsx("div", { className: "flex flex-wrap gap-1.5", children: items.map((item) => (_jsx("span", { className: "rounded-full border border-border/60 bg-card/50 px-2 py-0.5 text-xs text-muted", children: item }, item))) }));
|
|
88
|
+
}
|
|
89
|
+
function WidgetPreview({ declaration, pluginId, }) {
|
|
90
|
+
const Component = useMemo(() => getWidgetComponent(pluginId, declaration.id), [declaration.id, pluginId]);
|
|
91
|
+
if (!Component) {
|
|
92
|
+
return (_jsx("div", { className: "rounded-md border border-border/40 bg-card/30 px-3 py-2 text-xs text-muted", children: "No bundled component for this widget \u2014 preview unavailable." }));
|
|
93
|
+
}
|
|
94
|
+
return (_jsx("div", { className: "rounded-md border border-border/40 bg-card/30 p-3", children: _jsx(Component, { pluginId: pluginId, events: [], clearEvents: () => { } }) }));
|
|
95
|
+
}
|
|
96
|
+
export function AppDetailsView({ slug, onLaunched, }) {
|
|
97
|
+
const { plugins, appRuns, t, setTab, setState, setActionNotice } = useApp();
|
|
98
|
+
// Catalog of registry apps for slug → app resolution.
|
|
99
|
+
const { catalog: registryCatalog, error: catalogError } = useRegistryCatalog();
|
|
100
|
+
const catalog = registryCatalog ?? [];
|
|
101
|
+
const resolved = useMemo(() => resolveAppFromSlug(slug, catalog), [catalog, slug]);
|
|
102
|
+
// Per-app config (launch mode, alwaysOnTop, free-form settings).
|
|
103
|
+
const [config, setConfig] = useState(() => loadPerAppConfig(slug));
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
setConfig(loadPerAppConfig(slug));
|
|
106
|
+
return subscribePerAppConfig(slug, setConfig);
|
|
107
|
+
}, [slug]);
|
|
108
|
+
const updateConfig = useCallback((next) => {
|
|
109
|
+
const merged = {
|
|
110
|
+
launchMode: next.launchMode ?? config.launchMode,
|
|
111
|
+
alwaysOnTop: next.alwaysOnTop !== undefined ? next.alwaysOnTop : config.alwaysOnTop,
|
|
112
|
+
settings: next.settings ?? config.settings,
|
|
113
|
+
};
|
|
114
|
+
setConfig(merged);
|
|
115
|
+
savePerAppConfig(slug, merged);
|
|
116
|
+
}, [config, slug]);
|
|
117
|
+
// Widget visibility — re-uses the existing chat-sidebar visibility store.
|
|
118
|
+
const [visibility, setVisibility] = useState(() => loadChatSidebarVisibility());
|
|
119
|
+
const toggleWidget = useCallback((decl, enabled) => {
|
|
120
|
+
const key = widgetVisibilityKey(decl.pluginId, decl.id);
|
|
121
|
+
const nextOverrides = { ...visibility.overrides, [key]: enabled };
|
|
122
|
+
const next = { overrides: nextOverrides };
|
|
123
|
+
setVisibility(next);
|
|
124
|
+
saveChatSidebarVisibility(next);
|
|
125
|
+
}, [visibility]);
|
|
126
|
+
// Widgets owned by this app's plugin. Server-declared widgets carry
|
|
127
|
+
// `slot: string`; narrow to the WidgetSlot literal union here so the
|
|
128
|
+
// rest of the component can rely on it.
|
|
129
|
+
const widgets = useMemo(() => {
|
|
130
|
+
if (!resolved)
|
|
131
|
+
return [];
|
|
132
|
+
const ownPlugin = plugins?.find((p) => p.id === resolved.pluginId);
|
|
133
|
+
const raw = ownPlugin?.widgets ?? [];
|
|
134
|
+
return raw.map((decl) => ({
|
|
135
|
+
...decl,
|
|
136
|
+
slot: decl.slot,
|
|
137
|
+
}));
|
|
138
|
+
}, [plugins, resolved]);
|
|
139
|
+
const [expandedWidget, setExpandedWidget] = useState(null);
|
|
140
|
+
// Launch history for diagnostics.
|
|
141
|
+
const [history, setHistory] = useState([]);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (resolved)
|
|
144
|
+
setHistory(getLaunchHistoryForApp(resolved.info.name));
|
|
145
|
+
}, [resolved]);
|
|
146
|
+
// Recent runs (live).
|
|
147
|
+
const recentRuns = useMemo(() => {
|
|
148
|
+
if (!resolved || !appRuns)
|
|
149
|
+
return [];
|
|
150
|
+
return appRuns.filter((r) => r.appName === resolved.info.name).slice(0, 5);
|
|
151
|
+
}, [appRuns, resolved]);
|
|
152
|
+
// Launch action.
|
|
153
|
+
const [launching, setLaunching] = useState(false);
|
|
154
|
+
const launchedRef = useRef(false);
|
|
155
|
+
const handleLaunch = useCallback(async () => {
|
|
156
|
+
if (!resolved || launching)
|
|
157
|
+
return;
|
|
158
|
+
setLaunching(true);
|
|
159
|
+
launchedRef.current = false;
|
|
160
|
+
try {
|
|
161
|
+
if (config.launchMode === "inline") {
|
|
162
|
+
// Inline: for internal tools, switch the main shell tab; for
|
|
163
|
+
// overlays, set activeOverlayApp; otherwise fall back to window.
|
|
164
|
+
if (resolved.source === "internal-tool") {
|
|
165
|
+
const tab = getInternalToolAppTargetTab(resolved.info.name);
|
|
166
|
+
if (tab) {
|
|
167
|
+
setTab(tab);
|
|
168
|
+
launchedRef.current = true;
|
|
169
|
+
recordLaunchAttempt({
|
|
170
|
+
appName: resolved.info.name,
|
|
171
|
+
timestamp: Date.now(),
|
|
172
|
+
succeeded: true,
|
|
173
|
+
diagnostics: [],
|
|
174
|
+
});
|
|
175
|
+
setHistory(getLaunchHistoryForApp(resolved.info.name));
|
|
176
|
+
onLaunched?.({ mode: "inline", slug });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (resolved.source === "overlay") {
|
|
181
|
+
setState("activeOverlayApp", resolved.info.name);
|
|
182
|
+
launchedRef.current = true;
|
|
183
|
+
recordLaunchAttempt({
|
|
184
|
+
appName: resolved.info.name,
|
|
185
|
+
timestamp: Date.now(),
|
|
186
|
+
succeeded: true,
|
|
187
|
+
diagnostics: [],
|
|
188
|
+
});
|
|
189
|
+
setHistory(getLaunchHistoryForApp(resolved.info.name));
|
|
190
|
+
onLaunched?.({ mode: "inline", slug });
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Fall through to window mode — inline not supported for this app.
|
|
194
|
+
}
|
|
195
|
+
// Window mode (default).
|
|
196
|
+
const created = await invokeDesktopBridgeRequest({
|
|
197
|
+
rpcMethod: "desktopOpenAppWindow",
|
|
198
|
+
ipcChannel: "desktop:openAppWindow",
|
|
199
|
+
params: {
|
|
200
|
+
slug,
|
|
201
|
+
title: resolved.info.displayName ?? resolved.info.name,
|
|
202
|
+
path: resolved.windowPath,
|
|
203
|
+
alwaysOnTop: config.alwaysOnTop,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
if (!created?.id) {
|
|
207
|
+
throw new Error("Desktop bridge declined to open the window.");
|
|
208
|
+
}
|
|
209
|
+
launchedRef.current = true;
|
|
210
|
+
recordLaunchAttempt({
|
|
211
|
+
appName: resolved.info.name,
|
|
212
|
+
timestamp: Date.now(),
|
|
213
|
+
succeeded: true,
|
|
214
|
+
diagnostics: [],
|
|
215
|
+
});
|
|
216
|
+
setHistory(getLaunchHistoryForApp(resolved.info.name));
|
|
217
|
+
onLaunched?.({ mode: "window", slug });
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
221
|
+
recordLaunchAttempt({
|
|
222
|
+
appName: resolved.info.name,
|
|
223
|
+
timestamp: Date.now(),
|
|
224
|
+
succeeded: false,
|
|
225
|
+
diagnostics: [],
|
|
226
|
+
errorMessage: message,
|
|
227
|
+
});
|
|
228
|
+
setHistory(getLaunchHistoryForApp(resolved.info.name));
|
|
229
|
+
setActionNotice(t("appdetails.LaunchFailed", {
|
|
230
|
+
defaultValue: `Could not launch ${resolved.info.displayName}: ${message}`,
|
|
231
|
+
}), "error", 4000);
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
setLaunching(false);
|
|
235
|
+
}
|
|
236
|
+
}, [
|
|
237
|
+
config.alwaysOnTop,
|
|
238
|
+
config.launchMode,
|
|
239
|
+
launching,
|
|
240
|
+
onLaunched,
|
|
241
|
+
resolved,
|
|
242
|
+
setActionNotice,
|
|
243
|
+
setState,
|
|
244
|
+
setTab,
|
|
245
|
+
slug,
|
|
246
|
+
t,
|
|
247
|
+
]);
|
|
248
|
+
if (catalogError && !resolved) {
|
|
249
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 w-full flex-col items-center justify-center gap-2 p-6 text-center text-sm text-muted", children: [_jsx(TriangleAlert, { className: "h-5 w-5 text-accent" }), _jsx("span", { children: catalogError })] }));
|
|
250
|
+
}
|
|
251
|
+
if (!resolved) {
|
|
252
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 w-full items-center justify-center text-sm text-muted", children: ["Loading ", slug, "\u2026"] }));
|
|
253
|
+
}
|
|
254
|
+
const isInternal = resolved.source === "internal-tool";
|
|
255
|
+
const supportsInlineMode = isInternal || resolved.source === "overlay";
|
|
256
|
+
return (_jsxs("div", { className: "device-layout mx-auto flex w-full max-w-4xl flex-col gap-6 px-4 py-6 lg:px-6", children: [_jsxs("header", { className: "flex flex-col gap-3 border-b border-border/35 pb-5 sm:flex-row sm:items-center sm:justify-between", children: [_jsxs("div", { className: "flex items-center gap-4", children: [resolved.info.heroImage ? (_jsx("img", { src: resolved.info.heroImage, alt: "", className: "h-14 w-14 rounded-lg border border-border/40 object-cover" })) : (_jsx("div", { className: "flex h-14 w-14 items-center justify-center rounded-lg border border-border/40 bg-card/40 text-xs uppercase text-muted", children: (resolved.info.displayName ?? resolved.info.name)
|
|
257
|
+
.slice(0, 2)
|
|
258
|
+
.toUpperCase() })), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "truncate text-base font-semibold text-foreground", children: resolved.info.displayName ?? resolved.info.name }), _jsx("p", { className: "truncate text-xs text-muted", children: resolved.info.name }), _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-[10px] uppercase tracking-[0.16em] text-muted", children: [_jsx("span", { children: sourceLabel(resolved.source) }), recentRuns.length > 0 ? (_jsxs("span", { className: "rounded-full bg-accent/15 px-2 py-0.5 text-accent", children: [recentRuns.length, " running"] })) : null] })] })] }), _jsx("button", { type: "button", onClick: handleLaunch, disabled: launching, className: "rounded-full bg-accent px-5 py-2 text-xs font-semibold uppercase tracking-[0.16em] text-accent-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60", children: launching
|
|
259
|
+
? "Launching…"
|
|
260
|
+
: `Launch ${resolved.info.displayName ?? "App"}` })] }), _jsxs("section", { className: "flex flex-col gap-3", children: [_jsx(SectionHeader, { children: "About" }), resolved.info.description ? (_jsx("p", { className: "text-sm text-muted", children: resolved.info.description })) : null, _jsx(ChipList, { items: resolved.info.capabilities ?? [] })] }), recentRuns.length > 0 ? (_jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Recent Runs" }), _jsx("ul", { className: "flex flex-col gap-1 text-xs text-muted", children: recentRuns.map((run) => (_jsxs("li", { className: "flex items-center justify-between rounded-md border border-border/40 bg-card/30 px-3 py-1.5", children: [_jsx("span", { className: "truncate", children: run.runId }), _jsx("span", { className: "ml-2 shrink-0 uppercase tracking-[0.14em]", children: run.status })] }, run.runId))) })] })) : null, _jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Launch Diagnostics" }), history.length === 0 ? (_jsx("p", { className: "text-xs text-muted", children: "No launch history yet." })) : (_jsx("ul", { className: "flex flex-col gap-1 text-xs", children: history.slice(0, 5).map((entry) => (_jsxs("li", { className: "rounded-md border border-border/40 bg-card/30 px-3 py-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted", children: formatTimestamp(entry.timestamp) }), _jsx("span", { className: entry.succeeded
|
|
261
|
+
? "text-accent"
|
|
262
|
+
: "text-destructive", children: entry.succeeded ? "OK" : "FAILED" })] }), entry.errorMessage ? (_jsx("p", { className: "mt-1 text-muted", children: entry.errorMessage })) : null] }, entry.timestamp))) }))] }), widgets.length > 0 ? (_jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Widgets" }), _jsx("ul", { className: "flex flex-col gap-2", children: widgets.map((decl) => {
|
|
263
|
+
const visible = isWidgetVisible(decl, visibility.overrides);
|
|
264
|
+
const widgetKey = widgetVisibilityKey(decl.pluginId, decl.id);
|
|
265
|
+
const expanded = expandedWidget === widgetKey;
|
|
266
|
+
return (_jsxs("li", { className: "rounded-md border border-border/40 bg-card/30", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 px-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-medium text-foreground", children: decl.label }), _jsx("div", { className: "truncate text-[10px] uppercase tracking-[0.14em] text-muted", children: decl.slot })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx("button", { type: "button", onClick: () => setExpandedWidget(expanded ? null : widgetKey), className: "rounded-full border border-border/60 px-2 py-0.5 text-[10px] uppercase tracking-[0.14em] text-muted transition-colors hover:text-foreground", children: expanded ? "Hide" : "Preview" }), _jsxs("label", { className: "inline-flex cursor-pointer items-center gap-1.5 text-xs", children: [_jsx("input", { type: "checkbox", checked: visible, onChange: (event) => toggleWidget(decl, event.currentTarget.checked), className: "h-3.5 w-3.5 accent-accent" }), _jsx("span", { className: "text-muted", children: "Show" })] })] })] }), expanded ? (_jsx("div", { className: "border-t border-border/40 p-3", children: _jsx(WidgetPreview, { declaration: decl, pluginId: resolved.pluginId }) })) : null] }, widgetKey));
|
|
267
|
+
}) })] })) : null, _jsxs("section", { className: "flex flex-col gap-3", children: [_jsx(SectionHeader, { children: "Config" }), _jsxs("fieldset", { className: "flex flex-col gap-2 rounded-md border border-border/40 bg-card/30 p-3", children: [_jsxs("legend", { className: "px-1 text-xs uppercase tracking-[0.14em] text-muted", children: [_jsx(SettingsIcon, { className: "mr-1 inline h-3 w-3" }), " Launch Mode"] }), _jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", checked: config.launchMode === "window", onChange: () => updateConfig({ launchMode: "window" }), className: "h-3.5 w-3.5 accent-accent" }), _jsx("span", { children: "Open in dedicated window" })] }), _jsxs("label", { className: `flex items-center gap-2 text-sm ${supportsInlineMode
|
|
268
|
+
? "cursor-pointer"
|
|
269
|
+
: "cursor-not-allowed opacity-50"}`, children: [_jsx("input", { type: "radio", checked: config.launchMode === "inline", disabled: !supportsInlineMode, onChange: () => updateConfig({ launchMode: "inline" }), className: "h-3.5 w-3.5 accent-accent" }), _jsxs("span", { children: ["Replace current view in main window", !supportsInlineMode ? " (not supported for this app)" : ""] })] })] }), _jsxs("label", { className: `inline-flex items-center gap-2 self-start rounded-full border border-border/60 bg-card/40 px-3 py-1.5 text-xs ${config.launchMode === "window"
|
|
270
|
+
? "cursor-pointer"
|
|
271
|
+
: "cursor-not-allowed opacity-50"}`, children: [_jsx("input", { type: "checkbox", checked: config.alwaysOnTop, disabled: config.launchMode !== "window", onChange: (event) => updateConfig({ alwaysOnTop: event.currentTarget.checked }), className: "h-3.5 w-3.5 accent-accent" }), config.alwaysOnTop ? (_jsx(Pin, { className: "h-3.5 w-3.5", "aria-hidden": "true" })) : (_jsx(PinOff, { className: "h-3.5 w-3.5", "aria-hidden": "true" })), _jsx("span", { children: "Keep this app's window on top" })] })] })] }));
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Convenience: does this slug resolve to an app that wants the details
|
|
275
|
+
* page? Used by AppsView.handleLaunch to decide whether to navigate to
|
|
276
|
+
* /apps/<slug>/details or call openAppRouteWindow directly.
|
|
277
|
+
*
|
|
278
|
+
* Only apps that explicitly declare `hasDetailsPage: true` (today: a
|
|
279
|
+
* handful of internal tools with real config / runtime knobs) route
|
|
280
|
+
* through the details page. Catalog and overlay apps launch directly —
|
|
281
|
+
* launching is the primary action; the user only needs the extra step
|
|
282
|
+
* when there's config worth touching first.
|
|
283
|
+
*/
|
|
284
|
+
export function appNeedsDetailsPage(name) {
|
|
285
|
+
if (isInternalToolApp(name)) {
|
|
286
|
+
return getInternalToolAppHasDetailsPage(name);
|
|
287
|
+
}
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppsView.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/pages/AppsView.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppsView.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/pages/AppsView.tsx"],"names":[],"mappings":"AA0CA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAoJ1D,wBAAgB,QAAQ,4CAolCvB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { PageLayout } from "@elizaos/ui";
|
|
3
3
|
import { Pin, PinOff } from "lucide-react";
|
|
4
4
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -10,10 +10,11 @@ import { openExternalUrl } from "../../utils";
|
|
|
10
10
|
import { AppsCatalogGrid } from "../apps/AppsCatalogGrid";
|
|
11
11
|
import { AppsSidebar } from "../apps/AppsSidebar";
|
|
12
12
|
import { filterAppsForCatalog, findAppBySlug, getAppSlug, } from "../apps/helpers";
|
|
13
|
-
import { getInternalToolApps, getInternalToolAppTargetTab, } from "../apps/internal-tool-apps";
|
|
13
|
+
import { getInternalToolApps, getInternalToolAppTargetTab, getInternalToolAppWindowPath, } from "../apps/internal-tool-apps";
|
|
14
14
|
import { getAllOverlayApps, isOverlayApp, overlayAppToRegistryInfo, } from "../apps/overlay-app-registry";
|
|
15
15
|
import { RunningAppsRow } from "../apps/RunningAppsRow";
|
|
16
16
|
import { resolveEmbeddedViewerUrl, shouldUseEmbeddedAppViewer, } from "../apps/viewer-auth";
|
|
17
|
+
import { AppDetailsView, appNeedsDetailsPage } from "./AppDetailsView";
|
|
17
18
|
export { shouldShowAppInAppsView } from "../apps/helpers";
|
|
18
19
|
/** Max items retained in launch history. */
|
|
19
20
|
const RECENT_APPS_LIMIT = 10;
|
|
@@ -25,21 +26,6 @@ const APPS_SIDEBAR_MAX_WIDTH = 520;
|
|
|
25
26
|
const APP_WINDOW_LAUNCH_ENABLED_KEY = "milady:apps:window:launch-enabled";
|
|
26
27
|
const APP_WINDOW_ALWAYS_ON_TOP_KEY = "milady:apps:window:always-on-top";
|
|
27
28
|
const APP_WINDOW_HEARTBEAT_MS = 15_000;
|
|
28
|
-
function nativeSurfaceForInternalToolTab(tab) {
|
|
29
|
-
switch (tab) {
|
|
30
|
-
case "plugins":
|
|
31
|
-
return "plugins";
|
|
32
|
-
case "connectors":
|
|
33
|
-
return "connectors";
|
|
34
|
-
case "browser":
|
|
35
|
-
return "browser";
|
|
36
|
-
case "automations":
|
|
37
|
-
case "triggers":
|
|
38
|
-
return "triggers";
|
|
39
|
-
default:
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
29
|
function clampWidth(value) {
|
|
44
30
|
return Math.min(Math.max(value, APPS_SIDEBAR_MIN_WIDTH), APPS_SIDEBAR_MAX_WIDTH);
|
|
45
31
|
}
|
|
@@ -90,6 +76,23 @@ function loadInitialAppWindowLaunchEnabled() {
|
|
|
90
76
|
function getCurrentAppsPath() {
|
|
91
77
|
return getWindowNavigationPath();
|
|
92
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse the current apps sub-path into `{slug, action}`. Action recognizes
|
|
81
|
+
* `details` for `/apps/<slug>/details`. Anything else is treated as a
|
|
82
|
+
* direct app surface (`action: null`).
|
|
83
|
+
*/
|
|
84
|
+
function parseAppsRoute(path) {
|
|
85
|
+
if (!path.startsWith("/apps/"))
|
|
86
|
+
return { slug: null, action: null };
|
|
87
|
+
const after = path.slice("/apps/".length).replace(/[?#].*$/, "");
|
|
88
|
+
if (!after)
|
|
89
|
+
return { slug: null, action: null };
|
|
90
|
+
const [slug, sub] = after.split("/");
|
|
91
|
+
return {
|
|
92
|
+
slug: slug || null,
|
|
93
|
+
action: sub === "details" ? "details" : null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
93
96
|
function resolveDesktopViewerUrl(viewerUrl) {
|
|
94
97
|
const resolved = resolveEmbeddedViewerUrl(viewerUrl);
|
|
95
98
|
if (!resolved)
|
|
@@ -140,7 +143,7 @@ export function AppsView() {
|
|
|
140
143
|
const [sidebarCollapsed, setSidebarCollapsed] = useState(loadInitialSidebarCollapsed);
|
|
141
144
|
const [sidebarWidth, setSidebarWidth] = useState(loadInitialSidebarWidth);
|
|
142
145
|
const [appWindowLaunchEnabled, setAppWindowLaunchEnabled] = useState(loadInitialAppWindowLaunchEnabled);
|
|
143
|
-
const [appWindowAlwaysOnTop
|
|
146
|
+
const [appWindowAlwaysOnTop] = useState(loadInitialAppWindowAlwaysOnTop);
|
|
144
147
|
const [isAppWindow] = useState(isAppWindowRoute);
|
|
145
148
|
const [appWindows, setAppWindows] = useState([]);
|
|
146
149
|
const [busyAppWindowId, setBusyAppWindowId] = useState(null);
|
|
@@ -165,15 +168,9 @@ export function AppsView() {
|
|
|
165
168
|
/* ignore */
|
|
166
169
|
}
|
|
167
170
|
}, []);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
window.localStorage.setItem(APP_WINDOW_ALWAYS_ON_TOP_KEY, String(next));
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
/* ignore */
|
|
175
|
-
}
|
|
176
|
-
}, []);
|
|
171
|
+
// Upstream re-added handleAppWindowAlwaysOnTopChange but we removed the
|
|
172
|
+
// global toggle UI on this branch — keep only the launch-enabled handler
|
|
173
|
+
// upstream added (which still has UI in the catalog grid header).
|
|
177
174
|
const handleAppWindowLaunchEnabledChange = useCallback((next) => {
|
|
178
175
|
setAppWindowLaunchEnabled(next);
|
|
179
176
|
try {
|
|
@@ -234,10 +231,18 @@ export function AppsView() {
|
|
|
234
231
|
const hasActiveRun = Boolean(activeGameRun);
|
|
235
232
|
const hasCurrentGame = currentGameViewerUrl.length > 0 &&
|
|
236
233
|
activeGameRun?.viewerAttachment === "attached";
|
|
237
|
-
/**
|
|
238
|
-
|
|
234
|
+
/**
|
|
235
|
+
* Push or replace the browser URL to reflect the active app (or browse).
|
|
236
|
+
* `subPath` is appended after the slug so `/apps/<slug>/details` shows
|
|
237
|
+
* the details page instead of launching directly.
|
|
238
|
+
*/
|
|
239
|
+
const pushAppsUrl = useCallback((slug, subPath) => {
|
|
239
240
|
try {
|
|
240
|
-
const path = slug
|
|
241
|
+
const path = slug
|
|
242
|
+
? subPath
|
|
243
|
+
? `/apps/${slug}/${subPath}`
|
|
244
|
+
: `/apps/${slug}`
|
|
245
|
+
: "/apps";
|
|
241
246
|
if (shouldUseHashNavigation()) {
|
|
242
247
|
window.location.hash = path;
|
|
243
248
|
}
|
|
@@ -249,6 +254,50 @@ export function AppsView() {
|
|
|
249
254
|
/* ignore — sandboxed iframe or SSR */
|
|
250
255
|
}
|
|
251
256
|
}, []);
|
|
257
|
+
// Track the current `/apps/<slug>/details` slug for the details-page
|
|
258
|
+
// routing. Listens to hashchange + popstate so back/forward navigation
|
|
259
|
+
// unmounts AppDetailsView correctly.
|
|
260
|
+
const [appsDetailsSlug, setAppsDetailsSlug] = useState(() => parseAppsRoute(getCurrentAppsPath()).action === "details"
|
|
261
|
+
? parseAppsRoute(getCurrentAppsPath()).slug
|
|
262
|
+
: null);
|
|
263
|
+
useEffect(() => {
|
|
264
|
+
const handle = () => {
|
|
265
|
+
const parsed = parseAppsRoute(getCurrentAppsPath());
|
|
266
|
+
setAppsDetailsSlug(parsed.action === "details" ? parsed.slug : null);
|
|
267
|
+
};
|
|
268
|
+
window.addEventListener("hashchange", handle);
|
|
269
|
+
window.addEventListener("popstate", handle);
|
|
270
|
+
return () => {
|
|
271
|
+
window.removeEventListener("hashchange", handle);
|
|
272
|
+
window.removeEventListener("popstate", handle);
|
|
273
|
+
};
|
|
274
|
+
}, []);
|
|
275
|
+
// Bun side fires this when a menu/tray click hits an app that declares
|
|
276
|
+
// `hasDetailsPage: true`. We switch to the apps tab and navigate the
|
|
277
|
+
// hash to /apps/<slug>/details so AppDetailsView mounts.
|
|
278
|
+
useEffect(() => {
|
|
279
|
+
return subscribeDesktopBridgeEvent({
|
|
280
|
+
rpcMessage: "desktopAppDetailsRequested",
|
|
281
|
+
ipcChannel: "desktop:appDetailsRequested",
|
|
282
|
+
listener: (payload) => {
|
|
283
|
+
if (!payload ||
|
|
284
|
+
typeof payload !== "object" ||
|
|
285
|
+
typeof payload.slug !== "string") {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const slug = payload.slug;
|
|
289
|
+
if (!slug)
|
|
290
|
+
return;
|
|
291
|
+
setTab("apps");
|
|
292
|
+
setState("appsSubTab", "browse");
|
|
293
|
+
// Update state directly: pushAppsUrl uses replaceState in non-hash
|
|
294
|
+
// routing mode, which fires no event, so the hashchange/popstate
|
|
295
|
+
// listener wouldn't pick it up.
|
|
296
|
+
setAppsDetailsSlug(slug);
|
|
297
|
+
pushAppsUrl(slug, "details");
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
}, [pushAppsUrl, setState, setTab]);
|
|
252
301
|
const sortedRuns = useMemo(() => [...appRuns].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)), [appRuns]);
|
|
253
302
|
const mergeRun = useCallback((run) => {
|
|
254
303
|
const nextRuns = [
|
|
@@ -387,16 +436,27 @@ export function AppsView() {
|
|
|
387
436
|
setState("recentApps", next);
|
|
388
437
|
}, [recentApps, setState]);
|
|
389
438
|
const openAppRouteWindow = useCallback(async (app) => {
|
|
439
|
+
// Upstream gate: opt-in toggle for the per-app native window
|
|
440
|
+
// experience (lives in the catalog grid header).
|
|
390
441
|
if (!appWindowLaunchEnabled || isAppWindow || !isElectrobunRuntime()) {
|
|
391
442
|
return false;
|
|
392
443
|
}
|
|
393
|
-
|
|
394
|
-
|
|
444
|
+
// Internal tools that have an explicit windowPath open as their own
|
|
445
|
+
// app window (Ghost-style). The renderer parses `appWindow=1` + the
|
|
446
|
+
// hash route and renders the matching tab. This supersedes upstream's
|
|
447
|
+
// `desktopOpenSurfaceWindow` + `nativeSurfaceForInternalToolTab` path
|
|
448
|
+
// (the surface-bridge approach was removed when AppWindowRenderer
|
|
449
|
+
// landed — see the apps-as-windows refactor).
|
|
450
|
+
const internalWindowPath = getInternalToolAppWindowPath(app.name);
|
|
451
|
+
if (internalWindowPath) {
|
|
452
|
+
const slug = getAppSlug(app.name);
|
|
395
453
|
const created = await invokeDesktopBridgeRequest({
|
|
396
|
-
rpcMethod: "
|
|
397
|
-
ipcChannel: "desktop:
|
|
454
|
+
rpcMethod: "desktopOpenAppWindow",
|
|
455
|
+
ipcChannel: "desktop:openAppWindow",
|
|
398
456
|
params: {
|
|
399
|
-
|
|
457
|
+
slug,
|
|
458
|
+
title: app.displayName ?? app.name,
|
|
459
|
+
path: internalWindowPath,
|
|
400
460
|
alwaysOnTop: appWindowAlwaysOnTop,
|
|
401
461
|
},
|
|
402
462
|
});
|
|
@@ -415,7 +475,7 @@ export function AppsView() {
|
|
|
415
475
|
]);
|
|
416
476
|
pushRecentApp(app.name);
|
|
417
477
|
setState("appsSubTab", "browse");
|
|
418
|
-
pushAppsUrl(
|
|
478
|
+
pushAppsUrl(slug);
|
|
419
479
|
setActionNotice(t("appsview.OpenedInDesktopWindow", {
|
|
420
480
|
defaultValue: `${app.displayName ?? app.name} opened in a desktop window.`,
|
|
421
481
|
name: app.displayName ?? app.name,
|
|
@@ -427,6 +487,7 @@ export function AppsView() {
|
|
|
427
487
|
rpcMethod: "desktopOpenAppWindow",
|
|
428
488
|
ipcChannel: "desktop:openAppWindow",
|
|
429
489
|
params: {
|
|
490
|
+
slug,
|
|
430
491
|
title: app.displayName ?? app.name,
|
|
431
492
|
path: `/apps/${encodeURIComponent(slug)}`,
|
|
432
493
|
alwaysOnTop: appWindowAlwaysOnTop,
|
|
@@ -518,16 +579,42 @@ export function AppsView() {
|
|
|
518
579
|
}, [appWindowAlwaysOnTop, mergeRun, pushAppsUrl, setActionNotice, setState, t]);
|
|
519
580
|
const handleLaunch = useCallback(async (app) => {
|
|
520
581
|
slugAutoLaunchDone.current = true;
|
|
521
|
-
|
|
522
|
-
|
|
582
|
+
// Apps that declare config / runtime / widgets show a Details page
|
|
583
|
+
// first so the user can review settings before launching. The Launch
|
|
584
|
+
// button on AppDetailsView is what eventually calls the bridge or
|
|
585
|
+
// navigates inline. Skip when we're already inside an app window
|
|
586
|
+
// (the slug lives there, not in the main shell).
|
|
587
|
+
if (!isAppWindow && appNeedsDetailsPage(app.name)) {
|
|
588
|
+
const slug = getAppSlug(app.name);
|
|
589
|
+
pushRecentApp(app.name);
|
|
590
|
+
setState("appsSubTab", "browse");
|
|
591
|
+
pushAppsUrl(slug, "details");
|
|
523
592
|
return;
|
|
593
|
+
}
|
|
594
|
+
// In Electrobun, try to open the app's dedicated native window via
|
|
595
|
+
// `openAppRouteWindow` — slug-deduped + per-app bounds, Ghost-style.
|
|
596
|
+
// The helper itself respects the user's `appWindowLaunchEnabled`
|
|
597
|
+
// toggle: when off it returns false, and we fall through to the
|
|
598
|
+
// web-style launch path (catalog → client.launchApp + iframe-attach;
|
|
599
|
+
// internal tool → setTab; overlay → activeOverlayApp). That gives
|
|
600
|
+
// the toggle a real opt-out semantics instead of bricking launches.
|
|
601
|
+
if (isElectrobunRuntime()) {
|
|
602
|
+
const openedRouteWindow = await openAppRouteWindow(app).catch(() => false);
|
|
603
|
+
if (openedRouteWindow)
|
|
604
|
+
return;
|
|
605
|
+
// openAppRouteWindow returned false → either the toggle is off,
|
|
606
|
+
// we're already inside an app window, or the bridge declined.
|
|
607
|
+
// Continue to the web-fallback paths below so the click isn't a
|
|
608
|
+
// dead-end.
|
|
609
|
+
}
|
|
610
|
+
// Web fallback: internal tools switch tabs in the shell.
|
|
524
611
|
const internalToolTab = getInternalToolAppTargetTab(app.name);
|
|
525
612
|
if (internalToolTab) {
|
|
526
613
|
pushRecentApp(app.name);
|
|
527
614
|
setTab(internalToolTab);
|
|
528
615
|
return;
|
|
529
616
|
}
|
|
530
|
-
//
|
|
617
|
+
// Web fallback: overlay apps (e.g. companion) mount inside the shell.
|
|
531
618
|
if (isOverlayApp(app.name)) {
|
|
532
619
|
pushRecentApp(app.name);
|
|
533
620
|
setState("activeOverlayApp", app.name);
|
|
@@ -611,7 +698,12 @@ export function AppsView() {
|
|
|
611
698
|
useEffect(() => {
|
|
612
699
|
if (slugAutoLaunchDone.current || apps.length === 0)
|
|
613
700
|
return;
|
|
614
|
-
const
|
|
701
|
+
const parsed = parseAppsRoute(getCurrentAppsPath());
|
|
702
|
+
// /apps/<slug>/details is handled by the details renderer below; never
|
|
703
|
+
// auto-launch from it (would loop straight back to details).
|
|
704
|
+
if (parsed.action === "details")
|
|
705
|
+
return;
|
|
706
|
+
const slug = parsed.slug ?? getAppSlugFromPath(getCurrentAppsPath());
|
|
615
707
|
slugAutoLaunchDone.current = true;
|
|
616
708
|
if (!slug)
|
|
617
709
|
return;
|
|
@@ -801,10 +893,10 @@ export function AppsView() {
|
|
|
801
893
|
}
|
|
802
894
|
}, [busyAppWindowId, setActionNotice, t]);
|
|
803
895
|
const appsSidebar = (_jsx(AppsSidebar, { apps: apps, browseApps: browseApps, runs: sortedRuns, activeAppNames: activeAppNames, favoriteAppNames: favoriteAppNames, selectedAppName: activeGameRun?.appName ?? null, collapsed: sidebarCollapsed, onCollapsedChange: handleSidebarCollapsedChange, width: sidebarWidth, onWidthChange: handleSidebarWidthChange, minWidth: APPS_SIDEBAR_MIN_WIDTH, maxWidth: APPS_SIDEBAR_MAX_WIDTH, onLaunchApp: (app) => void handleLaunch(app), onOpenRun: (run) => void handleOpenRun(run) }));
|
|
804
|
-
return (_jsx(PageLayout, { className: "h-full bg-transparent", "data-testid": "apps-shell", sidebar: appsSidebar, contentInnerClassName: "w-full", contentClassName: "![scrollbar-width:none] [&::-webkit-scrollbar]:!hidden", children: _jsxs("div", { className: "device-layout mx-auto flex w-full max-w-6xl flex-col gap-4 px-4 py-4 lg:px-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b border-border/35 pb-3", children: [_jsx("div", { className: "min-w-0", children: _jsx("h2", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: "App Windows" }) }), _jsxs("
|
|
896
|
+
return (_jsx(PageLayout, { className: "h-full bg-transparent", "data-testid": "apps-shell", sidebar: appsSidebar, contentInnerClassName: "w-full", contentClassName: "![scrollbar-width:none] [&::-webkit-scrollbar]:!hidden", children: _jsxs("div", { className: "device-layout mx-auto flex w-full max-w-6xl flex-col gap-4 px-4 py-4 lg:px-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b border-border/35 pb-3", children: [_jsx("div", { className: "min-w-0", children: _jsx("h2", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: "App Windows" }) }), _jsxs("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-border/60 bg-card/60 px-3 py-1.5 text-xs font-medium text-muted transition-colors hover:text-foreground", children: [_jsx("input", { type: "checkbox", "aria-label": "Open apps in windows", className: "h-3.5 w-3.5 accent-accent", checked: appWindowLaunchEnabled, onChange: (event) => handleAppWindowLaunchEnabledChange(event.currentTarget.checked) }), _jsx("span", { children: "Open apps in windows" })] })] }), appWindows.length > 0 ? (_jsx("section", { "data-testid": "app-window-controls", className: "flex flex-wrap items-center gap-2", children: appWindows.map((windowRecord) => {
|
|
805
897
|
const busy = busyAppWindowId === windowRecord.id;
|
|
806
898
|
return (_jsxs("div", { className: "inline-flex min-w-0 items-center gap-2 rounded-full border border-border/55 bg-card/70 px-3 py-1.5 text-xs text-muted", children: [_jsx("span", { className: "max-w-44 truncate font-medium text-foreground", children: windowRecord.displayName }), _jsxs("button", { type: "button", className: "inline-flex items-center gap-1.5 rounded-full border border-border/60 px-2 py-1 text-[0.68rem] font-semibold uppercase tracking-[0.16em] text-muted transition-colors hover:border-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60", onClick: () => void handleToggleAppWindowAlwaysOnTop(windowRecord), disabled: busy, "aria-label": windowRecord.alwaysOnTop
|
|
807
899
|
? `Let ${windowRecord.displayName} act like a normal window`
|
|
808
900
|
: `Keep ${windowRecord.displayName} on top`, children: [windowRecord.alwaysOnTop ? (_jsx(PinOff, { className: "h-3.5 w-3.5", "aria-hidden": "true" })) : (_jsx(Pin, { className: "h-3.5 w-3.5", "aria-hidden": "true" })), windowRecord.alwaysOnTop ? "Normal" : "On top"] })] }, windowRecord.id));
|
|
809
|
-
}) })) : null, hasActiveRun ? (_jsx("div", { className: "flex flex-wrap items-center justify-between gap-3", children: _jsx("button", { type: "button", className: "rounded-full border border-ok/35 bg-ok/10 px-3 py-1.5 text-xs-tight font-medium text-ok transition-colors hover:bg-ok/15", onClick: handleOpenCurrentGame, children: hasCurrentGame ? "Live viewer" : "Active run" }) })) : null, _jsx(RunningAppsRow, { runs: sortedRuns, catalogApps: apps, busyRunId: busyRunId, onOpenRun: (run) => void handleOpenRun(run), onStopRun: (run) => void handleStopRun(run), stoppingRunId: stoppingRunId }), _jsx(AppsCatalogGrid, { activeAppNames: activeAppNames, error: error, favoriteAppNames: favoriteAppNames, loading: loading, searchQuery: searchQuery, visibleApps: visibleApps, onLaunch: (app) => void handleLaunch(app), onToggleFavorite: handleToggleFavorite })] }) }));
|
|
901
|
+
}) })) : null, hasActiveRun ? (_jsx("div", { className: "flex flex-wrap items-center justify-between gap-3", children: _jsx("button", { type: "button", className: "rounded-full border border-ok/35 bg-ok/10 px-3 py-1.5 text-xs-tight font-medium text-ok transition-colors hover:bg-ok/15", onClick: handleOpenCurrentGame, children: hasCurrentGame ? "Live viewer" : "Active run" }) })) : null, appsDetailsSlug ? (_jsx(AppDetailsView, { slug: appsDetailsSlug, onLaunched: () => pushAppsUrl() })) : (_jsxs(_Fragment, { children: [_jsx(RunningAppsRow, { runs: sortedRuns, catalogApps: apps, busyRunId: busyRunId, onOpenRun: (run) => void handleOpenRun(run), onStopRun: (run) => void handleStopRun(run), stoppingRunId: stoppingRunId }), _jsx(AppsCatalogGrid, { activeAppNames: activeAppNames, error: error, favoriteAppNames: favoriteAppNames, loading: loading, searchQuery: searchQuery, visibleApps: visibleApps, onLaunch: (app) => void handleLaunch(app), onToggleFavorite: handleToggleFavorite })] }))] }) }));
|
|
810
902
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartupShell.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/shell/StartupShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"StartupShell.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/shell/StartupShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiEH,wBAAgB,YAAY,mDA4O3B"}
|
|
@@ -49,9 +49,8 @@ function phaseToStatusKey(phase) {
|
|
|
49
49
|
/**
|
|
50
50
|
* Returns true when the cloud-provisioned bootstrap session has NOT yet been
|
|
51
51
|
* established for this page load. After a successful exchange the UI writes
|
|
52
|
-
* sessionStorage["milady_session"]
|
|
53
|
-
*
|
|
54
|
-
* HttpOnly cookie set by the server.
|
|
52
|
+
* sessionStorage["milady_session"] as a renderer-side marker; the server-owned
|
|
53
|
+
* HttpOnly cookie remains the actual auth boundary.
|
|
55
54
|
*/
|
|
56
55
|
function needsBootstrapSession() {
|
|
57
56
|
try {
|
|
@@ -148,12 +147,10 @@ export function StartupShell() {
|
|
|
148
147
|
if (needsBootstrapSession()) {
|
|
149
148
|
// Cloud-provisioned but no session yet. Lock the dashboard and show
|
|
150
149
|
// the bootstrap wizard step. Fail closed: we do NOT advance.
|
|
151
|
-
console.log("[eliza][startup] Cloud-provisioned container — bootstrap session required");
|
|
152
150
|
setShowBootstrap(true);
|
|
153
151
|
return;
|
|
154
152
|
}
|
|
155
153
|
// Cloud-provisioned and session already established — skip the wizard.
|
|
156
|
-
console.log("[eliza][startup] Cloud-provisioned container with session — skipping wizard");
|
|
157
154
|
setState("onboardingComplete", true);
|
|
158
155
|
coordinatorDispatchRef.current({ type: "ONBOARDING_COMPLETE" });
|
|
159
156
|
})
|