@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,643 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, client, isElectrobunRuntime, openExternalUrl, useApp, } from "@elizaos/app-core";
|
|
3
|
+
import { CheckCircle2, CircleAlert, CircleDashed, ExternalLink, Loader2, MessageCircle, Phone, Plug2, QrCode, RefreshCw, Unplug, } from "lucide-react";
|
|
4
|
+
import { useCallback, useEffect, useState } from "react";
|
|
5
|
+
import { useDiscordConnector } from "../hooks/useDiscordConnector.js";
|
|
6
|
+
import { useIMessageConnector } from "../hooks/useIMessageConnector.js";
|
|
7
|
+
import { useSignalConnector } from "../hooks/useSignalConnector.js";
|
|
8
|
+
import { useTelegramConnector } from "../hooks/useTelegramConnector.js";
|
|
9
|
+
import { useWhatsAppConnector } from "../hooks/useWhatsAppConnector.js";
|
|
10
|
+
import { WhatsAppQrOverlay } from "./WhatsAppQrOverlay.js";
|
|
11
|
+
function isIosRuntime() {
|
|
12
|
+
if (typeof navigator !== "undefined" &&
|
|
13
|
+
/iPad|iPhone|iPod/.test(navigator.userAgent)) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const capacitor = globalThis.Capacitor;
|
|
17
|
+
return capacitor?.getPlatform?.() === "ios";
|
|
18
|
+
}
|
|
19
|
+
const MACOS_FULL_DISK_ACCESS_SETTINGS_URL = "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles";
|
|
20
|
+
const LIFEOPS_BROWSER_SETUP_ID = "lifeops-browser-setup";
|
|
21
|
+
function ConnectorCardShell({ icon, platform, status, statusVariant, children, }) {
|
|
22
|
+
const dotColor = statusVariant === "ok"
|
|
23
|
+
? "bg-emerald-500"
|
|
24
|
+
: statusVariant === "warning"
|
|
25
|
+
? "bg-amber-500"
|
|
26
|
+
: "bg-muted/40";
|
|
27
|
+
return (_jsxs("div", { className: "space-y-2 rounded-2xl border border-border/20 bg-card/14 px-3 py-3", children: [_jsx("div", { className: "flex items-center justify-between gap-3", children: _jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [icon, _jsx("span", { className: "text-sm font-medium text-txt", children: platform }), _jsx("span", { className: `inline-block h-1.5 w-1.5 rounded-full ${dotColor}`, title: status, "aria-label": status, role: "img" })] }) }), children] }));
|
|
28
|
+
}
|
|
29
|
+
function AccessPips({ items, label, }) {
|
|
30
|
+
const dots = items.length > 0 ? items : ["muted"];
|
|
31
|
+
const slots = ["a", "b", "c", "d", "e", "f"];
|
|
32
|
+
return (_jsx("span", { "aria-label": label, className: "inline-flex items-center gap-1", role: "img", title: label, children: slots.slice(0, dots.slice(0, 6).length).map((slot, slotIndex) => {
|
|
33
|
+
const tone = dots[slotIndex];
|
|
34
|
+
const color = tone === "ok"
|
|
35
|
+
? "bg-emerald-500"
|
|
36
|
+
: tone === "warning"
|
|
37
|
+
? "bg-amber-500"
|
|
38
|
+
: "bg-muted/45";
|
|
39
|
+
return (_jsx("span", { className: `h-1.5 w-1.5 rounded-full ${color}` }, slot));
|
|
40
|
+
}) }));
|
|
41
|
+
}
|
|
42
|
+
function SignalIcon({ className }) {
|
|
43
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: className, children: _jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z" }) }));
|
|
44
|
+
}
|
|
45
|
+
function DiscordIcon({ className }) {
|
|
46
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: className, children: _jsx("path", { d: "M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z" }) }));
|
|
47
|
+
}
|
|
48
|
+
function TelegramIcon({ className }) {
|
|
49
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: className, children: _jsx("path", { d: "M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.479.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" }) }));
|
|
50
|
+
}
|
|
51
|
+
function WhatsAppIcon({ className }) {
|
|
52
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: className, children: _jsx("path", { d: "M19.11 4.93A9.9 9.9 0 0 0 12.04 2c-5.5 0-9.96 4.45-9.96 9.94 0 1.75.46 3.47 1.34 4.99L2 22l5.23-1.37a9.97 9.97 0 0 0 4.81 1.23h.01c5.49 0 9.95-4.45 9.95-9.94a9.87 9.87 0 0 0-2.89-6.99ZM12.05 20.2h-.01a8.25 8.25 0 0 1-4.2-1.14l-.3-.18-3.1.81.83-3.02-.2-.31a8.22 8.22 0 0 1-1.28-4.42 8.29 8.29 0 0 1 8.3-8.27c2.22 0 4.31.86 5.87 2.42a8.2 8.2 0 0 1 2.43 5.85 8.29 8.29 0 0 1-8.34 8.26Zm4.53-6.18c-.25-.12-1.48-.73-1.71-.82-.23-.08-.39-.12-.56.12-.16.24-.64.82-.78.98-.14.16-.29.18-.54.06-.25-.12-1.05-.39-2-.24-.74.33-1.37-1.11-1.52-1.35-.14-.24-.02-.37.11-.49.11-.11.25-.29.37-.43.12-.14.16-.24.24-.41.08-.16.04-.31-.02-.43-.06-.12-.56-1.34-.77-1.84-.2-.48-.4-.41-.56-.42h-.48c-.16 0-.43.06-.65.31-.22.24-.85.83-.85 2.03 0 1.19.87 2.35.99 2.51.12.16 1.7 2.59 4.12 3.63.58.25 1.03.4 1.38.51.58.18 1.1.15 1.52.09.46-.07 1.48-.61 1.69-1.2.21-.59.21-1.09.15-1.2-.06-.11-.22-.18-.47-.3Z" }) }));
|
|
53
|
+
}
|
|
54
|
+
function inferTelegramRetryState(args) {
|
|
55
|
+
if (args.authState !== "error") {
|
|
56
|
+
return args.authState;
|
|
57
|
+
}
|
|
58
|
+
const message = (args.authError ?? "").trim().toUpperCase();
|
|
59
|
+
if (message.includes("PASSWORD_HASH_INVALID") ||
|
|
60
|
+
message.includes("AUTH.CHECKPASSWORD") ||
|
|
61
|
+
message.includes("TWO-FACTOR PASSWORD")) {
|
|
62
|
+
return "waiting_for_password";
|
|
63
|
+
}
|
|
64
|
+
if (message.includes("PHONE_CODE_INVALID") ||
|
|
65
|
+
message.includes("PHONE_CODE_EXPIRED") ||
|
|
66
|
+
message.includes("LOGIN CODE")) {
|
|
67
|
+
return "waiting_for_code";
|
|
68
|
+
}
|
|
69
|
+
if (message.includes("PROVISIONING CODE")) {
|
|
70
|
+
return "waiting_for_provisioning_code";
|
|
71
|
+
}
|
|
72
|
+
return "error";
|
|
73
|
+
}
|
|
74
|
+
function browserAccessTitle(access) {
|
|
75
|
+
if (access.source === "discord_desktop") {
|
|
76
|
+
return "Discord Desktop App";
|
|
77
|
+
}
|
|
78
|
+
if (access.source === "desktop_browser") {
|
|
79
|
+
return "Milady Desktop Browser";
|
|
80
|
+
}
|
|
81
|
+
const browserLabel = access.browser === "safari" ? "Safari" : "Chrome";
|
|
82
|
+
const profileLabel = access.profileLabel?.trim() || "Default profile";
|
|
83
|
+
return `Your Browser · ${browserLabel} / ${profileLabel}`;
|
|
84
|
+
}
|
|
85
|
+
function browserAccessBadge(access) {
|
|
86
|
+
if (isBrowserAccessReady(access)) {
|
|
87
|
+
return {
|
|
88
|
+
label: access.tabState === "dm_inbox_visible" ? "Using now" : "Ready",
|
|
89
|
+
tone: "ok",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (access.active || access.available) {
|
|
93
|
+
return { label: "Available", tone: "warning" };
|
|
94
|
+
}
|
|
95
|
+
return { label: "Not ready", tone: "muted" };
|
|
96
|
+
}
|
|
97
|
+
function isBrowserAccessReady(access) {
|
|
98
|
+
return (access.canControl &&
|
|
99
|
+
access.siteAccessOk !== false &&
|
|
100
|
+
access.nextAction === "none" &&
|
|
101
|
+
(access.tabState === "dm_inbox_visible" ||
|
|
102
|
+
access.tabState === "discord_open" ||
|
|
103
|
+
access.tabState === "background_discord"));
|
|
104
|
+
}
|
|
105
|
+
function BrowserAccessStatusIcon({ label, tone, }) {
|
|
106
|
+
const className = tone === "ok"
|
|
107
|
+
? "text-emerald-500"
|
|
108
|
+
: tone === "warning"
|
|
109
|
+
? "text-amber-500"
|
|
110
|
+
: "text-muted/55";
|
|
111
|
+
const Icon = tone === "ok"
|
|
112
|
+
? CheckCircle2
|
|
113
|
+
: tone === "warning"
|
|
114
|
+
? CircleAlert
|
|
115
|
+
: CircleDashed;
|
|
116
|
+
return (_jsx("span", { "aria-label": label, className: `inline-flex h-5 w-5 items-center justify-center ${className}`, role: "img", title: label, children: _jsx(Icon, { className: "h-4 w-4", "aria-hidden": true }) }));
|
|
117
|
+
}
|
|
118
|
+
function browserAccessSourceLabel(access) {
|
|
119
|
+
if (!access) {
|
|
120
|
+
return "your browser";
|
|
121
|
+
}
|
|
122
|
+
return access.source === "desktop_browser"
|
|
123
|
+
? "Milady Desktop Browser"
|
|
124
|
+
: access.source === "discord_desktop"
|
|
125
|
+
? "Discord Desktop"
|
|
126
|
+
: "Your Browser";
|
|
127
|
+
}
|
|
128
|
+
function browserAccessActionLabel(action) {
|
|
129
|
+
switch (action) {
|
|
130
|
+
case "connect_browser":
|
|
131
|
+
return "Connect Your Browser";
|
|
132
|
+
case "open_extension_popup":
|
|
133
|
+
return "Open Extension Popup";
|
|
134
|
+
case "enable_browser_access":
|
|
135
|
+
return "Turn On Browser Access";
|
|
136
|
+
case "enable_browser_control":
|
|
137
|
+
return "Enable Browser Control";
|
|
138
|
+
case "open_discord":
|
|
139
|
+
return "Open Discord";
|
|
140
|
+
case "open_dm_inbox":
|
|
141
|
+
return "Open Discord DMs";
|
|
142
|
+
case "focus_discord_manually":
|
|
143
|
+
return "Open Discord Manually";
|
|
144
|
+
case "focus_dm_inbox_manually":
|
|
145
|
+
return "Focus DMs Manually";
|
|
146
|
+
case "log_in":
|
|
147
|
+
return "Log In to Discord";
|
|
148
|
+
case "open_desktop_browser":
|
|
149
|
+
return "Open Milady Desktop";
|
|
150
|
+
case "relaunch_discord":
|
|
151
|
+
return "Relaunch Discord";
|
|
152
|
+
default:
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function browserAccessMessage(access) {
|
|
157
|
+
const sourceLabel = browserAccessSourceLabel(access);
|
|
158
|
+
if (access.source === "discord_desktop") {
|
|
159
|
+
if (access.nextAction === "relaunch_discord") {
|
|
160
|
+
return "Relaunch Discord with local agent control enabled. This keeps your existing Discord login.";
|
|
161
|
+
}
|
|
162
|
+
if (access.authState === "logged_out") {
|
|
163
|
+
return "Discord Desktop is controllable, but that session still needs you to log in.";
|
|
164
|
+
}
|
|
165
|
+
if (access.tabState === "missing") {
|
|
166
|
+
return "Discord Desktop control is on, but no Discord page target was found yet.";
|
|
167
|
+
}
|
|
168
|
+
if (access.authState === "logged_in" &&
|
|
169
|
+
access.tabState !== "dm_inbox_visible") {
|
|
170
|
+
return "Discord Desktop is connected, but the DM inbox is not visible yet.";
|
|
171
|
+
}
|
|
172
|
+
return "Discord Desktop is ready for local agent control.";
|
|
173
|
+
}
|
|
174
|
+
if (access.source === "lifeops_browser") {
|
|
175
|
+
if (!access.available && access.nextAction === "enable_browser_access") {
|
|
176
|
+
return access.active
|
|
177
|
+
? "Browser access is paused in Agent Browser Bridge settings."
|
|
178
|
+
: "Browser access is turned off in Agent Browser Bridge settings.";
|
|
179
|
+
}
|
|
180
|
+
if (access.nextAction === "connect_browser") {
|
|
181
|
+
return "No browser profile is connected yet. Install the extension, then open its popup in the browser profile that has your account.";
|
|
182
|
+
}
|
|
183
|
+
if (access.nextAction === "open_extension_popup") {
|
|
184
|
+
return "A browser was paired before, but no profile is connected right now. Reopen the extension popup in the browser profile you want LifeOps to use.";
|
|
185
|
+
}
|
|
186
|
+
if (access.authState === "logged_out") {
|
|
187
|
+
return `Discord is open in ${sourceLabel}, but that profile still needs you to log in.`;
|
|
188
|
+
}
|
|
189
|
+
if (!access.canControl && access.tabState === "missing") {
|
|
190
|
+
return `${sourceLabel} is connected, but browser control is off, so LifeOps cannot open Discord for you.`;
|
|
191
|
+
}
|
|
192
|
+
if (!access.canControl && access.tabState !== "dm_inbox_visible") {
|
|
193
|
+
return `${sourceLabel} can see Discord, but browser control is off. Focus the Discord DM tab manually or turn browser control on.`;
|
|
194
|
+
}
|
|
195
|
+
if (access.siteAccessOk === false) {
|
|
196
|
+
return `${sourceLabel} is connected, but Discord has not been granted yet in this profile. Open Discord there and retry.`;
|
|
197
|
+
}
|
|
198
|
+
if (access.tabState === "missing") {
|
|
199
|
+
return `${sourceLabel} is connected, but Discord is not open in that browser profile yet.`;
|
|
200
|
+
}
|
|
201
|
+
if (access.authState === "logged_in" &&
|
|
202
|
+
access.tabState !== "dm_inbox_visible") {
|
|
203
|
+
return `${sourceLabel} sees your Discord session, but not the DM inbox yet.`;
|
|
204
|
+
}
|
|
205
|
+
return `${sourceLabel} is ready for Discord.`;
|
|
206
|
+
}
|
|
207
|
+
if (access.nextAction === "open_desktop_browser") {
|
|
208
|
+
return "Open Milady Desktop to use its built-in browser for your Discord session.";
|
|
209
|
+
}
|
|
210
|
+
if (access.authState === "logged_out") {
|
|
211
|
+
return "Discord is open in Milady Desktop Browser, but that session still needs you to log in.";
|
|
212
|
+
}
|
|
213
|
+
if (access.tabState === "missing") {
|
|
214
|
+
return "Milady Desktop Browser is available, but Discord is not open there yet.";
|
|
215
|
+
}
|
|
216
|
+
if (access.authState === "logged_in" &&
|
|
217
|
+
access.tabState !== "dm_inbox_visible") {
|
|
218
|
+
return "Milady Desktop Browser sees your Discord session, but not the DM inbox yet.";
|
|
219
|
+
}
|
|
220
|
+
return "Milady Desktop Browser is ready for Discord.";
|
|
221
|
+
}
|
|
222
|
+
function focusBrowserSetupPanel() {
|
|
223
|
+
if (typeof document === "undefined") {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
const element = document.getElementById(LIFEOPS_BROWSER_SETUP_ID);
|
|
227
|
+
if (!element) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
element.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
function browserAccessActionIcon(action) {
|
|
234
|
+
switch (action) {
|
|
235
|
+
case "connect_browser":
|
|
236
|
+
case "open_extension_popup":
|
|
237
|
+
case "enable_browser_access":
|
|
238
|
+
case "enable_browser_control":
|
|
239
|
+
return _jsx(Plug2, { className: "mr-1.5 h-3 w-3", "aria-hidden": true });
|
|
240
|
+
case "log_in":
|
|
241
|
+
case "open_desktop_browser":
|
|
242
|
+
case "relaunch_discord":
|
|
243
|
+
case "open_discord":
|
|
244
|
+
case "open_dm_inbox":
|
|
245
|
+
case "focus_discord_manually":
|
|
246
|
+
case "focus_dm_inbox_manually":
|
|
247
|
+
return action === "relaunch_discord" ? (_jsx(RefreshCw, { className: "mr-1.5 h-3 w-3", "aria-hidden": true })) : (_jsx(ExternalLink, { className: "mr-1.5 h-3 w-3", "aria-hidden": true }));
|
|
248
|
+
default:
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export function SignalConnectorCard() {
|
|
253
|
+
const signal = useSignalConnector();
|
|
254
|
+
const isConnected = signal.status?.connected === true;
|
|
255
|
+
const pairingState = signal.pairingStatus?.state ?? null;
|
|
256
|
+
const isPairing = !isConnected &&
|
|
257
|
+
(pairingState === "generating_qr" ||
|
|
258
|
+
pairingState === "waiting_for_scan" ||
|
|
259
|
+
pairingState === "linking");
|
|
260
|
+
const busy = signal.actionPending || signal.loading;
|
|
261
|
+
return (_jsxs(ConnectorCardShell, { icon: _jsx(SignalIcon, { className: "h-5 w-5 shrink-0 text-muted" }), platform: "Signal", status: isConnected ? "Connected" : isPairing ? "Pairing..." : "Not connected", statusVariant: isConnected ? "ok" : "muted", children: [!isConnected && !isPairing ? (_jsx(Button, { size: "sm", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void signal.startPairing(), title: "Link Signal", "aria-label": "Link Signal", children: signal.actionPending ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true })) : (_jsx(QrCode, { className: "h-3.5 w-3.5", "aria-hidden": true })) })) : null, isPairing ? (_jsxs("div", { className: "space-y-3", children: [signal.pairingStatus?.qrDataUrl ? (_jsx("div", { className: "flex justify-center rounded-2xl bg-white p-3", children: _jsx("img", { src: signal.pairingStatus.qrDataUrl, alt: "Signal pairing QR code", className: "h-40 w-40" }) })) : (_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Generating QR code..."] })), _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", onClick: () => void signal.stopPairing(), title: "Cancel", "aria-label": "Cancel", children: _jsx(Unplug, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] })) : null, isConnected ? (_jsxs("div", { className: "space-y-2", children: [signal.status?.identity?.phoneNumber ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted", children: [_jsx(Phone, { className: "h-3.5 w-3.5" }), signal.status.identity.phoneNumber] })) : null, _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void signal.disconnect(), title: "Disconnect", "aria-label": "Disconnect", children: _jsx(Unplug, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] })) : null, signal.error ? (_jsx("div", { className: "text-xs text-danger", children: signal.error })) : null] }));
|
|
262
|
+
}
|
|
263
|
+
export function DiscordConnectorCard() {
|
|
264
|
+
const discord = useDiscordConnector();
|
|
265
|
+
const { setActionNotice, setTab } = useApp();
|
|
266
|
+
const busy = discord.actionPending || discord.loading;
|
|
267
|
+
const username = discord.status?.identity?.username;
|
|
268
|
+
const browserAccess = discord.status?.browserAccess ?? [];
|
|
269
|
+
const activeDmInboxAccess = browserAccess.find((access) => access.active && access.tabState === "dm_inbox_visible") ?? null;
|
|
270
|
+
const isConnected = discord.status?.connected === true || Boolean(activeDmInboxAccess);
|
|
271
|
+
const desktopAccess = browserAccess.find((access) => access.source === "desktop_browser") ?? null;
|
|
272
|
+
const discordDesktopAccess = browserAccess.find((access) => access.source === "discord_desktop") ?? null;
|
|
273
|
+
const dmInboxVisible = discord.status?.dmInbox.visible === true || Boolean(activeDmInboxAccess);
|
|
274
|
+
const canRelaunchDiscord = discordDesktopAccess?.nextAction === "relaunch_discord";
|
|
275
|
+
const preferredDiscordDesktopAccess = !dmInboxVisible && canRelaunchDiscord
|
|
276
|
+
? discordDesktopAccess
|
|
277
|
+
: discordDesktopAccess?.active
|
|
278
|
+
? discordDesktopAccess
|
|
279
|
+
: null;
|
|
280
|
+
const preferredAccess = preferredDiscordDesktopAccess ??
|
|
281
|
+
browserAccess.find((access) => access.active) ??
|
|
282
|
+
browserAccess.find((access) => access.available) ??
|
|
283
|
+
discordDesktopAccess ??
|
|
284
|
+
browserAccess[0] ??
|
|
285
|
+
null;
|
|
286
|
+
const available = discord.status?.available === true ||
|
|
287
|
+
browserAccess.some((access) => access.available);
|
|
288
|
+
const visibleDmCount = discord.status?.dmInbox.count ?? 0;
|
|
289
|
+
const lastError = canRelaunchDiscord ? null : discord.status?.lastError;
|
|
290
|
+
const visibleDmLabels = discord.status?.dmInbox.previews
|
|
291
|
+
?.map((preview) => preview.label)
|
|
292
|
+
.filter((label, index, labels) => labels.indexOf(label) === index)
|
|
293
|
+
.slice(0, 3) ?? [];
|
|
294
|
+
const pairing = discord.status?.reason === "pairing" ||
|
|
295
|
+
preferredAccess?.nextAction === "open_discord" ||
|
|
296
|
+
preferredAccess?.nextAction === "open_dm_inbox" ||
|
|
297
|
+
preferredAccess?.nextAction === "relaunch_discord";
|
|
298
|
+
const authPending = discord.status?.reason === "auth_pending" ||
|
|
299
|
+
preferredAccess?.authState === "logged_out";
|
|
300
|
+
const showConnectButton = (available || canRelaunchDiscord) && (!isConnected || !dmInboxVisible);
|
|
301
|
+
const statusLabel = dmInboxVisible
|
|
302
|
+
? `Connected • ${visibleDmCount} DM${visibleDmCount === 1 ? "" : "s"} visible`
|
|
303
|
+
: authPending
|
|
304
|
+
? `Log in to Discord in ${browserAccessSourceLabel(preferredAccess)}`
|
|
305
|
+
: preferredAccess?.nextAction === "relaunch_discord"
|
|
306
|
+
? "Relaunch Discord"
|
|
307
|
+
: preferredAccess?.nextAction === "enable_browser_control"
|
|
308
|
+
? "Enable browser control"
|
|
309
|
+
: preferredAccess?.nextAction === "connect_browser" ||
|
|
310
|
+
preferredAccess?.nextAction === "open_extension_popup"
|
|
311
|
+
? "Connect Your Browser"
|
|
312
|
+
: preferredAccess?.nextAction === "open_desktop_browser"
|
|
313
|
+
? "Open Milady Desktop"
|
|
314
|
+
: !available
|
|
315
|
+
? "Browser access unavailable"
|
|
316
|
+
: isConnected
|
|
317
|
+
? "Connected, opening DM inbox"
|
|
318
|
+
: pairing
|
|
319
|
+
? `Opening Discord in ${browserAccessSourceLabel(preferredAccess)}…`
|
|
320
|
+
: "Not connected";
|
|
321
|
+
const statusVariant = isConnected
|
|
322
|
+
? dmInboxVisible
|
|
323
|
+
? "ok"
|
|
324
|
+
: "warning"
|
|
325
|
+
: pairing || authPending
|
|
326
|
+
? "warning"
|
|
327
|
+
: "muted";
|
|
328
|
+
const browserAccessTones = browserAccess.map((access) => isBrowserAccessReady(access)
|
|
329
|
+
? "ok"
|
|
330
|
+
: access.active || access.available
|
|
331
|
+
? "warning"
|
|
332
|
+
: "muted");
|
|
333
|
+
const handleOpenDesktopDiscord = useCallback(async () => {
|
|
334
|
+
try {
|
|
335
|
+
await client.startDiscordConnector({
|
|
336
|
+
side: "owner",
|
|
337
|
+
source: "desktop_browser",
|
|
338
|
+
});
|
|
339
|
+
await discord.refresh();
|
|
340
|
+
setTab("browser");
|
|
341
|
+
setActionNotice("Opened Discord in Milady Desktop Browser.", "success", 3200);
|
|
342
|
+
}
|
|
343
|
+
catch (cause) {
|
|
344
|
+
setActionNotice(cause instanceof Error && cause.message.trim().length > 0
|
|
345
|
+
? cause.message.trim()
|
|
346
|
+
: "Milady Desktop Browser could not open Discord.", "error", 4200);
|
|
347
|
+
}
|
|
348
|
+
}, [discord, setActionNotice, setTab]);
|
|
349
|
+
const handleBrowserAccessAction = useCallback(async (access) => {
|
|
350
|
+
if (access.source === "desktop_browser") {
|
|
351
|
+
await handleOpenDesktopDiscord();
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (access.source === "discord_desktop") {
|
|
355
|
+
await discord.connect("discord_desktop");
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
switch (access.nextAction) {
|
|
359
|
+
case "connect_browser":
|
|
360
|
+
case "open_extension_popup":
|
|
361
|
+
case "enable_browser_access":
|
|
362
|
+
case "enable_browser_control":
|
|
363
|
+
if (!focusBrowserSetupPanel()) {
|
|
364
|
+
setTab("browser");
|
|
365
|
+
}
|
|
366
|
+
setActionNotice("Use Guided Browser Setup to connect the browser profile that is already logged in to Discord.", "info", 4200);
|
|
367
|
+
return;
|
|
368
|
+
case "focus_discord_manually":
|
|
369
|
+
case "focus_dm_inbox_manually":
|
|
370
|
+
setActionNotice("Open Discord in the connected browser profile, then refresh this card.", "info", 4200);
|
|
371
|
+
return;
|
|
372
|
+
case "log_in":
|
|
373
|
+
case "open_discord":
|
|
374
|
+
case "open_dm_inbox":
|
|
375
|
+
await discord.connect(access.source);
|
|
376
|
+
return;
|
|
377
|
+
default:
|
|
378
|
+
await discord.refresh();
|
|
379
|
+
}
|
|
380
|
+
}, [discord, handleOpenDesktopDiscord, setActionNotice, setTab]);
|
|
381
|
+
return (_jsxs(ConnectorCardShell, { icon: _jsx(DiscordIcon, { className: "h-5 w-5 shrink-0 text-muted" }), platform: "Discord", status: statusLabel, statusVariant: statusVariant, children: [showConnectButton ? (_jsx(Button, { size: "sm", className: "h-8 w-8 rounded-xl p-0", disabled: busy || (!available && !canRelaunchDiscord), onClick: () => void discord.connect(preferredAccess?.source), title: browserAccessActionLabel(preferredAccess?.nextAction) ??
|
|
382
|
+
(authPending
|
|
383
|
+
? "Open Discord Login"
|
|
384
|
+
: isConnected
|
|
385
|
+
? "Show Discord DMs"
|
|
386
|
+
: pairing
|
|
387
|
+
? "Open Discord"
|
|
388
|
+
: "Connect Discord"), "aria-label": browserAccessActionLabel(preferredAccess?.nextAction) ??
|
|
389
|
+
(authPending
|
|
390
|
+
? "Open Discord Login"
|
|
391
|
+
: isConnected
|
|
392
|
+
? "Show Discord DMs"
|
|
393
|
+
: pairing
|
|
394
|
+
? "Open Discord"
|
|
395
|
+
: "Connect Discord"), children: preferredAccess?.nextAction === "relaunch_discord" ? (_jsx(RefreshCw, { className: "h-3.5 w-3.5", "aria-hidden": true })) : (_jsx(Plug2, { className: "h-3.5 w-3.5", "aria-hidden": true })) })) : null, isElectrobunRuntime() &&
|
|
396
|
+
desktopAccess &&
|
|
397
|
+
(desktopAccess.nextAction === "open_desktop_browser" ||
|
|
398
|
+
desktopAccess.nextAction === "open_discord" ||
|
|
399
|
+
desktopAccess.nextAction === "open_dm_inbox" ||
|
|
400
|
+
(!dmInboxVisible && desktopAccess.available)) ? (_jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void handleOpenDesktopDiscord(), title: "Open in Milady Desktop Browser", "aria-label": "Open in Milady Desktop Browser", children: _jsx(ExternalLink, { className: "h-3.5 w-3.5", "aria-hidden": true }) })) : null, isConnected ? (_jsxs("div", { className: "space-y-2", children: [username ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted", children: [_jsx(MessageCircle, { className: "h-3.5 w-3.5" }), String(username)] })) : null, dmInboxVisible ? (_jsx("div", { className: "text-xs text-muted", children: visibleDmLabels.length > 0
|
|
401
|
+
? visibleDmLabels.join(", ")
|
|
402
|
+
: "DM inbox visible" })) : null, _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void discord.disconnect(), title: "Disconnect", "aria-label": "Disconnect", children: _jsx(Unplug, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] })) : null, browserAccess.length > 0 ? (_jsxs("details", { className: "rounded-2xl bg-bg/24 px-3 py-2", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3", children: [_jsx("span", { className: "text-xs font-semibold text-txt", children: "Sources" }), _jsx(AccessPips, { items: browserAccessTones, label: `${browserAccess.length} browser sources` })] }), _jsx("div", { className: "mt-2 space-y-2", children: browserAccess.map((access) => {
|
|
403
|
+
const badge = browserAccessBadge(access);
|
|
404
|
+
const actionLabel = browserAccessActionLabel(access.nextAction);
|
|
405
|
+
return (_jsxs("div", { className: "rounded-2xl border border-border/20 bg-card/18 px-3 py-2", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-txt", children: browserAccessTitle(access) }), _jsx(BrowserAccessStatusIcon, { label: badge.label, tone: badge.tone })] }), _jsx("div", { className: "mt-1 text-xs text-muted", children: browserAccessMessage(access) }), _jsxs("div", { className: "mt-1 text-[11px] text-muted/80", children: [access.canControl ? "Control on" : "Control off", access.siteAccessOk === false
|
|
406
|
+
? " • Discord not granted yet"
|
|
407
|
+
: "", access.tabState === "dm_inbox_visible"
|
|
408
|
+
? " • DM inbox visible"
|
|
409
|
+
: access.tabState === "discord_open"
|
|
410
|
+
? " • Discord open"
|
|
411
|
+
: access.tabState === "background_discord"
|
|
412
|
+
? " • Discord tab found"
|
|
413
|
+
: ""] }), actionLabel ? (_jsxs(Button, { size: "sm", variant: access.source === "desktop_browser"
|
|
414
|
+
? "outline"
|
|
415
|
+
: "default", className: "mt-2 h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy, onClick: () => void handleBrowserAccessAction(access), title: actionLabel, "aria-label": actionLabel, children: [browserAccessActionIcon(access.nextAction), actionLabel] })) : null] }, `${access.source}:${access.browser ?? "desktop"}:${access.profileId ?? "default"}`));
|
|
416
|
+
}) })] })) : null, discord.error ? (_jsx("div", { className: "text-xs text-danger", children: discord.error })) : lastError ? (_jsx("div", { className: "text-xs text-danger", children: lastError })) : null] }));
|
|
417
|
+
}
|
|
418
|
+
export function TelegramConnectorCard() {
|
|
419
|
+
const telegram = useTelegramConnector();
|
|
420
|
+
const [phoneInput, setPhoneInput] = useState("");
|
|
421
|
+
const [codeInput, setCodeInput] = useState("");
|
|
422
|
+
const [passwordInput, setPasswordInput] = useState("");
|
|
423
|
+
const [loginOpen, setLoginOpen] = useState(false);
|
|
424
|
+
const isConnected = telegram.status?.connected === true;
|
|
425
|
+
const authError = telegram.status?.authError ?? telegram.error;
|
|
426
|
+
const authState = inferTelegramRetryState({
|
|
427
|
+
authState: telegram.authState ?? "idle",
|
|
428
|
+
authError,
|
|
429
|
+
});
|
|
430
|
+
const busy = telegram.actionPending || telegram.loading || telegram.verifyPending;
|
|
431
|
+
useEffect(() => {
|
|
432
|
+
if (telegram.status?.phone && phoneInput.trim().length === 0) {
|
|
433
|
+
setPhoneInput(telegram.status.phone);
|
|
434
|
+
}
|
|
435
|
+
}, [telegram.status?.phone, phoneInput]);
|
|
436
|
+
useEffect(() => {
|
|
437
|
+
if (isConnected) {
|
|
438
|
+
setLoginOpen(false);
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
if (authState !== "idle" && authState !== "error") {
|
|
442
|
+
setLoginOpen(true);
|
|
443
|
+
}
|
|
444
|
+
}, [authState, isConnected]);
|
|
445
|
+
const handleSendCode = useCallback(() => {
|
|
446
|
+
if (phoneInput.trim().length > 0) {
|
|
447
|
+
void telegram.startAuth(phoneInput.trim());
|
|
448
|
+
}
|
|
449
|
+
}, [phoneInput, telegram]);
|
|
450
|
+
const handleVerifyCode = useCallback(() => {
|
|
451
|
+
if (codeInput.trim().length > 0) {
|
|
452
|
+
void telegram.submitCode(codeInput.trim());
|
|
453
|
+
}
|
|
454
|
+
}, [codeInput, telegram]);
|
|
455
|
+
const handleSubmitPassword = useCallback(() => {
|
|
456
|
+
if (passwordInput.length > 0) {
|
|
457
|
+
void telegram.submitPassword(passwordInput);
|
|
458
|
+
}
|
|
459
|
+
}, [passwordInput, telegram]);
|
|
460
|
+
const handleRestartAuth = useCallback(() => {
|
|
461
|
+
setCodeInput("");
|
|
462
|
+
setPasswordInput("");
|
|
463
|
+
void telegram.cancelAuth();
|
|
464
|
+
}, [telegram]);
|
|
465
|
+
const showStartStep = !isConnected &&
|
|
466
|
+
!loginOpen &&
|
|
467
|
+
(authState === "idle" || authState === "error");
|
|
468
|
+
const showPhoneStep = !isConnected &&
|
|
469
|
+
loginOpen &&
|
|
470
|
+
(authState === "idle" || authState === "error");
|
|
471
|
+
const showCodeStep = authState === "waiting_for_provisioning_code" ||
|
|
472
|
+
authState === "waiting_for_code";
|
|
473
|
+
const showPasswordStep = authState === "waiting_for_password";
|
|
474
|
+
const statusLabel = isConnected
|
|
475
|
+
? "Connected"
|
|
476
|
+
: authState === "waiting_for_provisioning_code"
|
|
477
|
+
? "Enter my.telegram.org code"
|
|
478
|
+
: authState === "waiting_for_code"
|
|
479
|
+
? "Enter verification code"
|
|
480
|
+
: authState === "waiting_for_password"
|
|
481
|
+
? "2FA password required"
|
|
482
|
+
: authState === "error"
|
|
483
|
+
? "Retry Telegram login"
|
|
484
|
+
: "Not connected";
|
|
485
|
+
const statusVariant = isConnected
|
|
486
|
+
? "ok"
|
|
487
|
+
: showCodeStep || showPasswordStep || authState === "error"
|
|
488
|
+
? "warning"
|
|
489
|
+
: "muted";
|
|
490
|
+
return (_jsxs(ConnectorCardShell, { icon: _jsx(TelegramIcon, { className: "h-5 w-5 shrink-0 text-muted" }), platform: "Telegram", status: statusLabel, statusVariant: statusVariant, children: [showStartStep ? (_jsx(Button, { size: "sm", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => setLoginOpen(true), title: authState === "error" ? "Retry" : "Connect", "aria-label": authState === "error" ? "Retry" : "Connect", children: _jsx(Plug2, { className: "h-3.5 w-3.5", "aria-hidden": true }) })) : null, showPhoneStep ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "tel", placeholder: "+1 234 567 8900", value: phoneInput, onChange: (e) => setPhoneInput(e.target.value), className: "h-8 flex-1 rounded-lg bg-bg/40 px-3 text-xs text-txt placeholder:text-muted/50 focus:outline-none focus:ring-1 focus:ring-primary/40", onKeyDown: (e) => {
|
|
491
|
+
if (e.key === "Enter") {
|
|
492
|
+
handleSendCode();
|
|
493
|
+
}
|
|
494
|
+
} }), _jsx(Button, { size: "sm", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy || phoneInput.trim().length === 0, onClick: handleSendCode, children: "Send Code" })] })) : null, showCodeStep ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "text", placeholder: "Verification code", value: codeInput, onChange: (e) => setCodeInput(e.target.value), className: "h-8 flex-1 rounded-xl border border-border/28 bg-card/24 px-3 text-xs text-txt placeholder:text-muted/50 focus:outline-none focus:ring-1 focus:ring-primary/40", autoComplete: "one-time-code", onKeyDown: (e) => {
|
|
495
|
+
if (e.key === "Enter") {
|
|
496
|
+
handleVerifyCode();
|
|
497
|
+
}
|
|
498
|
+
} }), _jsx(Button, { size: "sm", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy || codeInput.trim().length === 0, onClick: handleVerifyCode, children: "Verify" }), _jsx(Button, { size: "sm", variant: "outline", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy, onClick: handleRestartAuth, children: "Restart" })] }), _jsx("div", { className: "text-xs text-muted", children: "Enter the login code Telegram sent to your app or SMS, then retry if the code was wrong or expired." })] })) : null, authState === "waiting_for_password" ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "password", placeholder: "2FA password", value: passwordInput, onChange: (e) => setPasswordInput(e.target.value), className: "h-8 flex-1 rounded-lg bg-bg/40 px-3 text-xs text-txt placeholder:text-muted/50 focus:outline-none focus:ring-1 focus:ring-primary/40", onKeyDown: (e) => {
|
|
499
|
+
if (e.key === "Enter") {
|
|
500
|
+
handleSubmitPassword();
|
|
501
|
+
}
|
|
502
|
+
} }), _jsx(Button, { size: "sm", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy || passwordInput.length === 0, onClick: handleSubmitPassword, children: "Submit" })] })) : null, isConnected ? (_jsxs("div", { className: "space-y-2", children: [telegram.status?.identity ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted", children: [_jsx(Phone, { className: "h-3.5 w-3.5" }), String(telegram.status.identity.username ||
|
|
503
|
+
telegram.status.identity.phone ||
|
|
504
|
+
"")] })) : null, _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void telegram.disconnect(), title: "Disconnect", "aria-label": "Disconnect", children: _jsx(Unplug, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] })) : null, authError ? (_jsx("div", { className: "text-xs text-danger", children: authError })) : null] }));
|
|
505
|
+
}
|
|
506
|
+
export function WhatsAppConnectorCard() {
|
|
507
|
+
const whatsapp = useWhatsAppConnector();
|
|
508
|
+
const [pairingOpen, setPairingOpen] = useState(false);
|
|
509
|
+
const isConnected = whatsapp.status?.connected === true;
|
|
510
|
+
const busy = whatsapp.loading;
|
|
511
|
+
const statusLabel = busy
|
|
512
|
+
? "Checking..."
|
|
513
|
+
: isConnected
|
|
514
|
+
? "Configured"
|
|
515
|
+
: pairingOpen
|
|
516
|
+
? "Pairing"
|
|
517
|
+
: "Needs setup";
|
|
518
|
+
const statusVariant = isConnected
|
|
519
|
+
? "ok"
|
|
520
|
+
: busy || pairingOpen
|
|
521
|
+
? "warning"
|
|
522
|
+
: "muted";
|
|
523
|
+
return (_jsxs(ConnectorCardShell, { icon: _jsx(WhatsAppIcon, { className: "h-5 w-5 shrink-0 text-muted" }), platform: "WhatsApp", status: statusLabel, statusVariant: statusVariant, children: [_jsxs("div", { className: "space-y-2", children: [whatsapp.status?.phoneNumberId ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted", children: [_jsx(Phone, { className: "h-3.5 w-3.5" }), "Phone number ID: ", whatsapp.status.phoneNumberId] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [!isConnected ? (_jsxs(Button, { size: "sm", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy, onClick: () => setPairingOpen((open) => !open), title: pairingOpen ? "Hide WhatsApp QR" : "Pair WhatsApp", "aria-label": pairingOpen ? "Hide WhatsApp QR" : "Pair WhatsApp", children: [_jsx(QrCode, { className: "mr-1.5 h-3.5 w-3.5", "aria-hidden": true }), pairingOpen ? "Hide QR" : "Pair WhatsApp"] })) : null, _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void whatsapp.refresh(), title: "Refresh", "aria-label": "Refresh", children: _jsx(RefreshCw, { className: "h-3.5 w-3.5", "aria-hidden": true }) })] }), pairingOpen ? (_jsx(WhatsAppQrOverlay, { accountId: "default", connectedMessage: "WhatsApp is paired. LifeOps will reuse this local session.", onConnected: () => {
|
|
524
|
+
setPairingOpen(false);
|
|
525
|
+
void whatsapp.refresh();
|
|
526
|
+
} })) : null] }), whatsapp.error ? (_jsx("div", { className: "text-xs text-danger", children: whatsapp.error })) : null] }));
|
|
527
|
+
}
|
|
528
|
+
function formatIMessageSendMode(sendMode) {
|
|
529
|
+
switch (sendMode) {
|
|
530
|
+
case "cli":
|
|
531
|
+
return "imsg CLI";
|
|
532
|
+
case "private-api":
|
|
533
|
+
return "BlueBubbles Private API";
|
|
534
|
+
case "apple-script":
|
|
535
|
+
return "Messages.app AppleScript";
|
|
536
|
+
default:
|
|
537
|
+
return "Unavailable";
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
function formatIMessageDiagnostic(code) {
|
|
541
|
+
switch (code) {
|
|
542
|
+
case "full_disk_access_required":
|
|
543
|
+
return "Full Disk Access is required before Milady can read incoming Messages history.";
|
|
544
|
+
case "chat_db_unavailable":
|
|
545
|
+
return "Milady could not open Messages chat.db for incoming message reads.";
|
|
546
|
+
case "native_bridge_not_connected":
|
|
547
|
+
return "The native Messages bridge is loaded but not connected yet.";
|
|
548
|
+
case "bluebubbles_private_api_disabled":
|
|
549
|
+
return "BlueBubbles Private API is disabled, so sends rely on AppleScript.";
|
|
550
|
+
case "bluebubbles_helper_disconnected":
|
|
551
|
+
return "BlueBubbles helper is disconnected, which usually means the Mac-side send path is degraded.";
|
|
552
|
+
case "no_backend_available":
|
|
553
|
+
return "No local iMessage backend is available.";
|
|
554
|
+
default:
|
|
555
|
+
return code;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
export function IMessageConnectorCard() {
|
|
559
|
+
const imessage = useIMessageConnector();
|
|
560
|
+
const { setActionNotice } = useApp();
|
|
561
|
+
const iosRuntime = isIosRuntime();
|
|
562
|
+
const status = imessage.status;
|
|
563
|
+
const busy = imessage.loading;
|
|
564
|
+
const isConnected = status?.connected === true;
|
|
565
|
+
const hostPlatform = status?.hostPlatform ?? "unknown";
|
|
566
|
+
const runningOnMacHost = hostPlatform === "darwin";
|
|
567
|
+
const nativeReadDegraded = status?.diagnostics.includes("full_disk_access_required") ||
|
|
568
|
+
status?.diagnostics.includes("chat_db_unavailable");
|
|
569
|
+
const isDegraded = Boolean(isConnected && nativeReadDegraded) ||
|
|
570
|
+
Boolean(isConnected &&
|
|
571
|
+
status?.bridgeType === "bluebubbles" &&
|
|
572
|
+
(status.sendMode === "apple-script" ||
|
|
573
|
+
status.helperConnected === false));
|
|
574
|
+
const needsFullDiskAccess = imessage.fullDiskAccess?.status === "revoked";
|
|
575
|
+
const showFullDiskAccessControls = runningOnMacHost && (needsFullDiskAccess || nativeReadDegraded);
|
|
576
|
+
const bridgeLabel = status?.bridgeType === "native"
|
|
577
|
+
? "Messages.app"
|
|
578
|
+
: status?.bridgeType === "bluebubbles"
|
|
579
|
+
? "BlueBubbles"
|
|
580
|
+
: status?.bridgeType === "imsg"
|
|
581
|
+
? "imsg"
|
|
582
|
+
: null;
|
|
583
|
+
const statusLabel = busy && !status
|
|
584
|
+
? "Checking..."
|
|
585
|
+
: isConnected
|
|
586
|
+
? bridgeLabel === "Messages.app" && nativeReadDegraded
|
|
587
|
+
? "Connected, needs Full Disk Access"
|
|
588
|
+
: bridgeLabel
|
|
589
|
+
? `Connected via ${bridgeLabel}`
|
|
590
|
+
: "Connected"
|
|
591
|
+
: "Not connected";
|
|
592
|
+
const statusVariant = isDegraded
|
|
593
|
+
? "warning"
|
|
594
|
+
: showFullDiskAccessControls
|
|
595
|
+
? "warning"
|
|
596
|
+
: isConnected
|
|
597
|
+
? "ok"
|
|
598
|
+
: busy && !status
|
|
599
|
+
? "warning"
|
|
600
|
+
: "muted";
|
|
601
|
+
const bridgePips = [
|
|
602
|
+
isConnected ? "ok" : "muted",
|
|
603
|
+
status?.privateApiEnabled === false || status?.helperConnected === false
|
|
604
|
+
? "warning"
|
|
605
|
+
: isConnected
|
|
606
|
+
? "ok"
|
|
607
|
+
: "muted",
|
|
608
|
+
status?.sendMode === "apple-script"
|
|
609
|
+
? "warning"
|
|
610
|
+
: isConnected
|
|
611
|
+
? "ok"
|
|
612
|
+
: "muted",
|
|
613
|
+
];
|
|
614
|
+
const handleOpenFullDiskAccess = useCallback(async () => {
|
|
615
|
+
try {
|
|
616
|
+
await openExternalUrl(MACOS_FULL_DISK_ACCESS_SETTINGS_URL);
|
|
617
|
+
setActionNotice("Opened macOS Full Disk Access settings.", "success", 3600);
|
|
618
|
+
}
|
|
619
|
+
catch (cause) {
|
|
620
|
+
setActionNotice(cause instanceof Error && cause.message.trim().length > 0
|
|
621
|
+
? cause.message.trim()
|
|
622
|
+
: "Milady could not open Full Disk Access settings.", "error", 5000);
|
|
623
|
+
}
|
|
624
|
+
}, [setActionNotice]);
|
|
625
|
+
return (_jsx(ConnectorCardShell, { icon: _jsx(MessageCircle, { className: "h-5 w-5 shrink-0 text-muted" }), platform: "iMessage", status: statusLabel, statusVariant: statusVariant, children: _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-xs text-muted", children: isConnected
|
|
626
|
+
? bridgeLabel === "Messages.app"
|
|
627
|
+
? nativeReadDegraded
|
|
628
|
+
? "Milady can send through Messages.app now. Grant Full Disk Access to let it read incoming iMessages from chat.db."
|
|
629
|
+
: "Milady is using the native Mac Messages bridge for iMessage send and receive."
|
|
630
|
+
: bridgeLabel === "BlueBubbles"
|
|
631
|
+
? status?.sendMode === "private-api"
|
|
632
|
+
? "LifeOps is using the Mac-side BlueBubbles bridge with Private API enabled."
|
|
633
|
+
: "LifeOps is using the Mac-side BlueBubbles bridge. Sends are currently using the AppleScript fallback."
|
|
634
|
+
: "LifeOps is using the Mac-side imsg bridge for iMessage access."
|
|
635
|
+
: iosRuntime
|
|
636
|
+
? "iMessage access must run through a paired Mac or a remote Mac backend that has iMessage configured."
|
|
637
|
+
: runningOnMacHost
|
|
638
|
+
? "Milady could not load the native Messages bridge. Refresh after enabling the iMessage connector or restarting the agent."
|
|
639
|
+
: "iMessage bridging requires a Mac host running Messages.app." }), showFullDiskAccessControls ? (_jsx("div", { className: "flex flex-wrap items-center gap-2", children: _jsx(Button, { size: "sm", variant: "outline", className: "h-8 rounded-xl px-3 text-xs font-semibold", disabled: busy, onClick: () => void handleOpenFullDiskAccess(), children: "Open Full Disk Access" }) })) : null, showFullDiskAccessControls ? (_jsx("div", { className: "rounded-xl border border-border/40 bg-card/18 px-3 py-2 text-xs text-muted", children: "Full Disk Access is still blocked for the process running Milady, so reading `~/Library/Messages/chat.db` may stay limited until you allow it in System Settings \u2192 Privacy & Security \u2192 Full Disk Access." })) : null, status?.accountHandle ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs text-muted", children: [_jsx(Phone, { className: "h-3.5 w-3.5" }), status.accountHandle] })) : null, isConnected ? (_jsxs("details", { className: "rounded-2xl bg-bg/24 px-3 py-2", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3", children: [_jsx("span", { className: "text-xs font-semibold text-txt", children: bridgeLabel ?? "Bridge" }), _jsx(AccessPips, { items: bridgePips, label: "iMessage bridge status" })] }), _jsxs("div", { className: "mt-2 rounded-xl border border-border/40 bg-card/18 px-3 py-2 text-xs text-muted", children: [_jsxs("div", { children: ["Send path: ", formatIMessageSendMode(status?.sendMode ?? "none")] }), status?.privateApiEnabled !== null ? (_jsxs("div", { children: ["Private API:", " ", status.privateApiEnabled ? "enabled" : "disabled"] })) : null, status?.helperConnected !== null ? (_jsxs("div", { children: ["Helper:", " ", status.helperConnected ? "connected" : "disconnected"] })) : null] })] })) : null, _jsx("div", { className: "flex items-center gap-2", children: _jsx(Button, { size: "sm", variant: "outline", className: "h-8 w-8 rounded-xl p-0", disabled: busy, onClick: () => void imessage.refresh(), title: "Refresh", "aria-label": "Refresh", children: busy ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", "aria-hidden": true })) : (_jsx(RefreshCw, { className: "h-3.5 w-3.5", "aria-hidden": true })) }) }), status?.error ? (_jsx("div", { className: "text-xs text-danger", children: status.error })) : null, status?.diagnostics.length ? (_jsxs("details", { className: "rounded-2xl bg-bg/24 px-3 py-2", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3", children: [_jsx("span", { className: "text-xs font-semibold text-txt", children: "Diagnostics" }), _jsx(AccessPips, { items: status.diagnostics.map(() => "warning"), label: `${status.diagnostics.length} diagnostics` })] }), _jsx("div", { className: "mt-2 space-y-2", children: status.diagnostics.map((diagnostic) => (_jsx("div", { className: "rounded-xl border border-border/40 bg-card/18 px-3 py-2 text-xs text-muted", children: formatIMessageDiagnostic(diagnostic) }, diagnostic))) })] })) : null, imessage.error ? (_jsx("div", { className: "text-xs text-danger", children: imessage.error })) : null] }) }));
|
|
640
|
+
}
|
|
641
|
+
export function MessagingConnectorGrid() {
|
|
642
|
+
return (_jsx("div", { className: "space-y-1", children: _jsxs("div", { className: "space-y-1", children: [_jsx(SignalConnectorCard, {}), _jsx(DiscordConnectorCard, {}), _jsx(WhatsAppConnectorCard, {}), _jsx(TelegramConnectorCard, {}), _jsx(IMessageConnectorCard, {})] }) }));
|
|
643
|
+
}
|