@glassly/engine 0.4.0 → 0.4.1-dev.1137
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/build/engine.d.ts +3 -1
- package/build/engine.d.ts.map +1 -1
- package/build/engine.js +6 -4
- package/build/engine.js.map +1 -1
- package/build/facades/display.d.ts +1 -1
- package/build/facades/display.d.ts.map +1 -1
- package/build/facades/display.js +1 -1
- package/build/facades/display.js.map +1 -1
- package/build/facades/glasses.js +1 -1
- package/build/facades/glasses.js.map +1 -1
- package/build/facades/permissions.d.ts.map +1 -1
- package/build/facades/permissions.js +0 -2
- package/build/facades/permissions.js.map +1 -1
- package/build/facades/phoneNotifications.d.ts +7 -0
- package/build/facades/phoneNotifications.d.ts.map +1 -1
- package/build/facades/phoneNotifications.js +6 -0
- package/build/facades/phoneNotifications.js.map +1 -1
- package/build/facades/providerKeys.d.ts +1 -1
- package/build/facades/providerKeys.js +1 -1
- package/build/facades/providerKeys.js.map +1 -1
- package/build/facades/reports.d.ts +15 -0
- package/build/facades/reports.d.ts.map +1 -1
- package/build/facades/reports.js +37 -0
- package/build/facades/reports.js.map +1 -1
- package/build/facades/settings.js +1 -1
- package/build/facades/settings.js.map +1 -1
- package/build/generated/releaseMetadata.js +4 -4
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/react/useMentraLiveOta.d.ts.map +1 -1
- package/build/react/useMentraLiveOta.js.map +1 -1
- package/build/runtime/config.d.ts.map +1 -1
- package/build/runtime/config.js.map +1 -1
- package/build/services/AiTierResolution.d.ts +1 -1
- package/build/services/AiTierResolution.d.ts.map +1 -1
- package/build/services/AiTierResolution.js.map +1 -1
- package/build/services/AppRegistry.d.ts +12 -1
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js +33 -0
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/AutomaticReportResult.d.ts.map +1 -1
- package/build/services/AutomaticReportResult.js.map +1 -1
- package/build/services/CloudClientService.d.ts +7 -5
- package/build/services/CloudClientService.d.ts.map +1 -1
- package/build/services/CloudClientService.js +17 -14
- package/build/services/CloudClientService.js.map +1 -1
- package/build/services/DisplayProcessor.d.ts.map +1 -1
- package/build/services/DisplayProcessor.js +2 -1
- package/build/services/DisplayProcessor.js.map +1 -1
- package/build/services/GestureDotsService.js +1 -1
- package/build/services/GestureDotsService.js.map +1 -1
- package/build/services/HotspotOtaTransport.d.ts.map +1 -1
- package/build/services/HotspotOtaTransport.js +0 -1
- package/build/services/HotspotOtaTransport.js.map +1 -1
- package/build/services/JSRouter.js +2 -2
- package/build/services/JSRouter.js.map +1 -1
- package/build/services/LocalLlmModelManager.d.ts.map +1 -1
- package/build/services/LocalLlmModelManager.js +4 -3
- package/build/services/LocalLlmModelManager.js.map +1 -1
- package/build/services/LocalLlmProvider.d.ts.map +1 -1
- package/build/services/LocalLlmProvider.js +5 -6
- package/build/services/LocalLlmProvider.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts +10 -3
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +142 -30
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
- package/build/services/NativeNavigationService.d.ts.map +1 -1
- package/build/services/NativeNavigationService.js.map +1 -1
- package/build/services/NavigationHandlers.d.ts +1 -1
- package/build/services/NavigationHandlers.js +2 -2
- package/build/services/NavigationHandlers.js.map +1 -1
- package/build/services/NavigationService.d.ts +2 -2
- package/build/services/NavigationService.d.ts.map +1 -1
- package/build/services/NavigationService.js +11 -11
- package/build/services/NavigationService.js.map +1 -1
- package/build/services/PairingIdentity.d.ts.map +1 -1
- package/build/services/PairingIdentity.js.map +1 -1
- package/build/services/PhoneCalendarService.d.ts.map +1 -1
- package/build/services/PhoneCalendarService.js.map +1 -1
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
- package/build/services/PhoneNotificationsSync.js +2 -1
- package/build/services/PhoneNotificationsSync.js.map +1 -1
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
- package/build/services/PhoneStreamCoordinator.js.map +1 -1
- package/build/services/ProviderKeyValidation.d.ts +1 -1
- package/build/services/ProviderKeyValidation.js +1 -1
- package/build/services/ProviderKeyValidation.js.map +1 -1
- package/build/services/STTModelManager.d.ts.map +1 -1
- package/build/services/STTModelManager.js +1 -6
- package/build/services/STTModelManager.js.map +1 -1
- package/build/services/SupportProfileSync.d.ts.map +1 -1
- package/build/services/SupportProfileSync.js +3 -0
- package/build/services/SupportProfileSync.js.map +1 -1
- package/build/services/TranscriptionRouting.d.ts +3 -0
- package/build/services/TranscriptionRouting.d.ts.map +1 -1
- package/build/services/TranscriptionRouting.js +14 -0
- package/build/services/TranscriptionRouting.js.map +1 -1
- package/build/services/UIRouter.d.ts.map +1 -1
- package/build/services/UIRouter.js.map +1 -1
- package/build/services/controllers.d.ts.map +1 -1
- package/build/services/controllers.js +1 -0
- package/build/services/controllers.js.map +1 -1
- package/build/services/effectiveCapabilities.js +3 -2
- package/build/services/effectiveCapabilities.js.map +1 -1
- package/build/services/gestureDotGlyphs.d.ts.map +1 -1
- package/build/services/gestureDotGlyphs.js.map +1 -1
- package/build/services/manifestActions.d.ts.map +1 -1
- package/build/services/manifestActions.js.map +1 -1
- package/build/services/neuralBand/MetaAuth.d.ts +1 -0
- package/build/services/neuralBand/MetaAuth.d.ts.map +1 -1
- package/build/services/neuralBand/MetaAuth.js +36 -8
- package/build/services/neuralBand/MetaAuth.js.map +1 -1
- package/build/services/notificationAppPayload.d.ts +14 -0
- package/build/services/notificationAppPayload.d.ts.map +1 -0
- package/build/services/notificationAppPayload.js +15 -0
- package/build/services/notificationAppPayload.js.map +1 -0
- package/build/services/notifications/miniappNotifications.d.ts +31 -0
- package/build/services/notifications/miniappNotifications.d.ts.map +1 -0
- package/build/services/notifications/miniappNotifications.js +24 -0
- package/build/services/notifications/miniappNotifications.js.map +1 -0
- package/build/services/pages/pageEligibility.d.ts +1 -2
- package/build/services/pages/pageEligibility.d.ts.map +1 -1
- package/build/services/pages/pageEligibility.js +4 -2
- package/build/services/pages/pageEligibility.js.map +1 -1
- package/build/services/settingsBridge.d.ts.map +1 -1
- package/build/services/settingsBridge.js +0 -2
- package/build/services/settingsBridge.js.map +1 -1
- package/build/services/uiShim.d.ts.map +1 -1
- package/build/services/uiShim.js +14 -0
- package/build/services/uiShim.js.map +1 -1
- package/build/stores/appVisibility.d.ts.map +1 -1
- package/build/stores/appVisibility.js.map +1 -1
- package/build/stores/gallerySync.d.ts.map +1 -1
- package/build/stores/gallerySync.js.map +1 -1
- package/build/stores/glasses.d.ts.map +1 -1
- package/build/stores/glasses.js +1 -0
- package/build/stores/glasses.js.map +1 -1
- package/build/stores/settings.d.ts.map +1 -1
- package/build/stores/settings.js +27 -28
- package/build/stores/settings.js.map +1 -1
- package/build/types/capabilities/even-realities-g1.d.ts.map +1 -1
- package/build/types/capabilities/even-realities-g1.js +4 -0
- package/build/types/capabilities/even-realities-g1.js.map +1 -1
- package/build/types/capabilities/nimo.d.ts.map +1 -1
- package/build/types/capabilities/nimo.js +21 -7
- package/build/types/capabilities/nimo.js.map +1 -1
- package/build/types/enums.d.ts +2 -1
- package/build/types/enums.d.ts.map +1 -1
- package/build/types/enums.js +1 -0
- package/build/types/enums.js.map +1 -1
- package/build/utils/display/index.d.ts +1 -0
- package/build/utils/display/index.d.ts.map +1 -1
- package/build/utils/display/index.js +2 -2
- package/build/utils/display/index.js.map +1 -1
- package/build/utils/display/profiles/index.d.ts +1 -0
- package/build/utils/display/profiles/index.d.ts.map +1 -1
- package/build/utils/display/profiles/index.js +1 -0
- package/build/utils/display/profiles/index.js.map +1 -1
- package/build/utils/display/profiles/nimo.d.ts +2 -0
- package/build/utils/display/profiles/nimo.d.ts.map +1 -0
- package/build/utils/display/profiles/nimo.js +3 -0
- package/build/utils/display/profiles/nimo.js.map +1 -0
- package/build/utils/display/scene/svgPath.js.map +1 -1
- package/build/utils/memory/search.d.ts.map +1 -1
- package/build/utils/memory/search.js +17 -7
- package/build/utils/memory/search.js.map +1 -1
- package/package.json +15 -15
- package/src/engine.ts +9 -7
- package/src/facades/display.ts +1 -1
- package/src/facades/glasses.ts +1 -1
- package/src/facades/permissions.ts +0 -2
- package/src/facades/phoneNotifications.ts +10 -0
- package/src/facades/providerKeys.ts +1 -1
- package/src/facades/reports.ts +41 -0
- package/src/facades/settings.ts +1 -1
- package/src/generated/releaseMetadata.ts +4 -4
- package/src/index.ts +2 -0
- package/src/react/useMentraLiveOta.ts +1 -4
- package/src/runtime/config.ts +1 -6
- package/src/services/AiTierResolution.ts +1 -1
- package/src/services/AppRegistry.ts +38 -1
- package/src/services/AutomaticReportResult.ts +1 -3
- package/src/services/CloudClientService.ts +17 -11
- package/src/services/DisplayProcessor.ts +2 -0
- package/src/services/GestureDotsService.ts +1 -1
- package/src/services/HotspotOtaTransport.ts +1 -5
- package/src/services/JSRouter.ts +2 -2
- package/src/services/LocalLlmModelManager.ts +4 -3
- package/src/services/LocalLlmProvider.ts +6 -7
- package/src/services/LocalMiniappRuntime.ts +170 -40
- package/src/services/LocalSttFallbackCoordinator.ts +1 -5
- package/src/services/NativeNavigationService.ts +1 -2
- package/src/services/NavigationHandlers.ts +2 -2
- package/src/services/NavigationService.ts +12 -11
- package/src/services/PairingIdentity.ts +1 -3
- package/src/services/PhoneCalendarService.ts +1 -3
- package/src/services/PhoneNotificationsSync.ts +2 -1
- package/src/services/PhoneStreamCoordinator.ts +1 -2
- package/src/services/ProviderKeyValidation.ts +1 -1
- package/src/services/STTModelManager.ts +1 -6
- package/src/services/SupportProfileSync.ts +2 -0
- package/src/services/TranscriptionRouting.ts +18 -0
- package/src/services/UIRouter.ts +3 -9
- package/src/services/controllers.ts +1 -0
- package/src/services/effectiveCapabilities.ts +3 -2
- package/src/services/gestureDotGlyphs.ts +10 -5
- package/src/services/manifestActions.ts +2 -1
- package/src/services/neuralBand/MetaAuth.ts +37 -8
- package/src/services/notificationAppPayload.ts +15 -0
- package/src/services/notifications/miniappNotifications.ts +53 -0
- package/src/services/pages/pageEligibility.ts +3 -2
- package/src/services/settingsBridge.ts +1 -4
- package/src/services/uiShim.ts +14 -0
- package/src/stores/appVisibility.ts +2 -5
- package/src/stores/gallerySync.ts +1 -7
- package/src/stores/glasses.ts +1 -0
- package/src/stores/settings.ts +27 -28
- package/src/types/capabilities/even-realities-g1.ts +5 -0
- package/src/types/capabilities/nimo.ts +23 -7
- package/src/types/enums.ts +1 -0
- package/src/utils/display/index.ts +2 -2
- package/src/utils/display/profiles/index.ts +2 -0
- package/src/utils/display/profiles/nimo.ts +2 -0
- package/src/utils/display/scene/svgPath.ts +1 -1
- package/src/utils/memory/search.ts +17 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalSttFallbackCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;GAeG;AACH;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"LocalSttFallbackCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;GAeG;AACH;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAChC,aAAa,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,WAAW,GAAG,sBAAsB,CAAA;AAEhG,cAAM,2BAA2B;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,OAAO,CAAC,4BAA4B,CAAQ;IAC5C,OAAO,CAAC,yBAAyB,CAAQ;IACzC,oFAAoF;IACpF,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,cAAc,CAAsB;IAC5C;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAO;IAC7B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,oBAAoB,CAAQ;IACpC;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,mBAAmB,CAAO;IAClC;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO;YAYO,oBAAoB;IAQlC;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAajC,MAAM,CAAC,WAAW,IAAI,2BAA2B;IAOjD,QAAQ,IAAI,OAAO;IAInB,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC,mEAAmE;IACnE,SAAS,IAAI,sBAAsB,GAAG,IAAI;IAI1C,oBAAoB,CAClB,gBAAgB,EAAE,OAAO,EACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,aAAa,UAAQ,EACrB,eAAe,UAAO,GACrB,IAAI;IAWP;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAEzB;;;;OAIG;IACG,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,iBAAiB,IAAI,OAAO;IAI5B,uEAAuE;IACvE,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAQnE;2CACuC;IACvC,OAAO,CAAC,SAAS;YAWH,SAAS;IAmBvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;YAWP,aAAa;YASb,gBAAgB;IAqB9B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,GAAG;CAGZ;AAED,QAAA,MAAM,2BAA2B,6BAA4C,CAAA;AAC7E,eAAe,2BAA2B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalSttFallbackCoordinator.js","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport {ISLAND_SETTINGS_KEYS} from \"../runtime/config\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport offlineActivity from \"./OfflineActivity\"\nimport sttModelManager from \"./STTModelManager\"\n\n/**\n * Decides whether on-device Sherpa STT should produce transcripts for local\n * miniapps, instead of (or in addition to) cloud transcription. Local STT is\n * active when the cloud is unavailable (disconnected or refusing STT for plan\n * quota) and some subscriber accepts fallback text, or any subscription\n * requires `forceLocal`.\n *\n * Activation flips `localSttFallbackActive` in the settings store, which\n * the bluetooth-sdk native side reads to decide whether to feed PCM into\n * the SherpaOnnxTranscriber. Local transcripts then flow back through the\n * `local_transcription` Bridge event; the host wires that event to\n * `localMiniappRuntime.forwardEvent`, with this coordinator providing the\n * subscription-active gate so we never publish transcripts to miniapps that\n * aren't asking for them. LocalMiniappRuntime filters mixed local/cloud\n * delivery per miniapp.\n */\n/**\n * Why local STT is currently active, mirrored into the\n * `local_stt_fallback_reason` setting (\"\" while inactive) so UI can show it.\n * When several causes hold at once, the primary-path outage wins over\n * `force_local` (a forced subscription would keep local STT on either way).\n */\nexport type LocalSttFallbackReason =\n | \"force_local\"\n | \"cloud_disconnected\"\n | \"cloud_disabled\"\n | \"stt_quota\"\n | \"provider_unreachable\"\n\nclass LocalSttFallbackCoordinator {\n private static instance: LocalSttFallbackCoordinator\n\n private hasTranscriptionSubscription = false\n private hasForceLocalSubscription = false\n /** Some default-route subscriber takes on-device text while the primary is down. */\n private hasFallbackSubscription = false\n private activeLanguage: string | null = null\n /**\n * Default to \"cloud is up\" so we never accidentally activate local STT before\n * the cloud client has had a chance to start. We attach lazily on the first\n * subscription/reconcile pass; once attached, this field reflects the real\n * cloud-client runtime status.\n */\n private cloudConnected = true\n private localActive = false\n private starting: Promise<void> | null = null\n private cloudAdapterAttached = false\n /**\n * Soniox-direct (user API key) state, pushed by SonioxDirectService. While\n * enabled, IT is the primary transcription path — cloud connectivity is\n * irrelevant and sherpa engages on Soniox health instead. Defaults healthy\n * for the same reason cloudConnected defaults true: never activate local STT\n * before the primary has had a chance to come up.\n */\n private sonioxDirectEnabled = false\n private sonioxDirectHealthy = true\n /**\n * Cloud STT refused for plan quota (`stream.quota` blocked=true). The cloud\n * connection stays up, so this is tracked separately from `cloudConnected`:\n * for transcription purposes the cloud path is down, and sherpa takes over\n * if its model is on-device. Soniox-direct is unmetered and unaffected.\n */\n private sttQuotaBlocked = false\n\n private constructor() {\n // Reset the persisted mirror flag on boot — the in-memory state in this\n // coordinator is the source of truth, and a stale \"true\" left from the\n // previous session would cause native to feed Sherpa before any miniapp\n // registered a subscription.\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason, \"\")\n sttModelManager.onModelReady(() => {\n void this.retryAfterModelReady()\n })\n }\n\n private async retryAfterModelReady(): Promise<void> {\n // A model can finish downloading while the initial availability check is\n // still pending. Wait for that attempt before retrying so readiness is\n // never lost and native restarts cannot overlap.\n await this.starting\n await this.reconcile()\n }\n\n /**\n * Lazy-attach the engine cloud connection listener. The coordinator is\n * constructed at module load, before engine.start() brings up the cloud\n * client, so we defer until the first reconcile.\n */\n private attachCloudAdapterIfReady(): void {\n if (this.cloudAdapterAttached) return\n this.cloudConnected = cloudClientService.isConnected()\n cloudClientService.onStatusChanged((status) => {\n const connected = status.status === \"connected\"\n if (this.cloudConnected === connected) return\n this.log(`cloud connection -> ${connected ? \"up\" : \"down\"}`)\n this.cloudConnected = connected\n void this.reconcile()\n })\n this.cloudAdapterAttached = true\n }\n\n static getInstance(): LocalSttFallbackCoordinator {\n if (!LocalSttFallbackCoordinator.instance) {\n LocalSttFallbackCoordinator.instance = new LocalSttFallbackCoordinator()\n }\n return LocalSttFallbackCoordinator.instance\n }\n\n isActive(): boolean {\n return this.localActive\n }\n\n getActiveLanguage(): string | null {\n return this.activeLanguage\n }\n\n /** The cause of the current activation, or null while inactive. */\n getReason(): LocalSttFallbackReason | null {\n return this.localActive ? this.currentReason() : null\n }\n\n onSubscriptionChange(\n hasTranscription: boolean,\n language: string | null,\n hasForceLocal = false,\n acceptsFallback = true,\n ): void {\n this.log(\n `onSubscriptionChange(hasTx=${hasTranscription}, lang=${language}, forceLocal=${hasForceLocal}, fallback=${acceptsFallback})`,\n )\n this.hasTranscriptionSubscription = hasTranscription\n this.hasForceLocalSubscription = hasTranscription && hasForceLocal\n this.hasFallbackSubscription = hasTranscription && acceptsFallback\n this.activeLanguage = hasTranscription ? language : null\n void this.reconcile()\n }\n\n /**\n * Informational hook, retained for API stability. No longer called: the\n * authoritative switching signal is the cloud-client adapter (local miniapps\n * are powered only by V2). v1 cloud transcripts deliberately do NOT drive this\n * coordinator anymore. Kept for future hysteresis if connection-state alone\n * proves too coarse.\n */\n onCloudTranscript(): void {}\n\n /**\n * Pushed when the cloud announces/clears an STT quota block. Awaitable so\n * the caller can inspect `isActive()` afterwards to phrase its user notice\n * (\"continuing on-device\" vs \"transcription paused\").\n */\n async onSttQuotaBlockedChange(blocked: boolean): Promise<void> {\n if (this.sttQuotaBlocked === blocked) return\n this.log(`stt quota -> ${blocked ? \"blocked\" : \"restored\"}`)\n this.sttQuotaBlocked = blocked\n await this.reconcile()\n }\n\n isSttQuotaBlocked(): boolean {\n return this.sttQuotaBlocked\n }\n\n /** Pushed by SonioxDirectService on every enable/health transition. */\n onSonioxDirectStateChange(enabled: boolean, healthy: boolean): void {\n if (this.sonioxDirectEnabled === enabled && this.sonioxDirectHealthy === healthy) return\n this.log(`soniox-direct -> enabled=${enabled} healthy=${healthy}`)\n this.sonioxDirectEnabled = enabled\n this.sonioxDirectHealthy = healthy\n void this.reconcile()\n }\n\n /** Whether the primary transcription path (Soniox-direct when a user key is\n * set, the cloud otherwise) is up. */\n private primaryUp(): boolean {\n // Cloud turned off in Privacy settings: the cloud path is not merely down,\n // it is never coming back, so on-device STT is the primary. Checked ahead\n // of `cloudConnected` because that field defaults to true (so local STT\n // doesn't pre-empt cloud at boot) and would otherwise report a path that\n // will never connect as up. Soniox-direct is a user-supplied third-party\n // key, not Glassly cloud, so it stays available.\n if (!this.sonioxDirectEnabled && cloudClientService.isCloudDisabled()) return false\n return this.sonioxDirectEnabled ? this.sonioxDirectHealthy : this.cloudConnected && !this.sttQuotaBlocked\n }\n\n private async reconcile(): Promise<void> {\n this.attachCloudAdapterIfReady()\n const shouldBeActive = this.shouldUseLocalStt()\n if (shouldBeActive && !this.localActive) {\n if (!this.starting) {\n this.starting = this.startLocalStt().finally(() => {\n this.starting = null\n })\n }\n await this.starting\n } else if (!shouldBeActive && this.localActive) {\n this.stopLocalStt(this.hasTranscriptionSubscription ? \"primary transcription recovered\" : \"subscription gone\")\n } else if (shouldBeActive && this.localActive) {\n // Still active, but the cause may have shifted (e.g. quota block landing\n // while already offline for a disconnect) — keep the mirror current.\n this.publishReason()\n }\n }\n\n /**\n * Ranks the concurrent causes: a dead-forever cloud path first, then the\n * primary provider's own failure, then transient outages, with `force_local`\n * only when the primary is actually up. Mirrors `primaryUp()`.\n */\n private currentReason(): LocalSttFallbackReason {\n if (!this.sonioxDirectEnabled && cloudClientService.isCloudDisabled()) return \"cloud_disabled\"\n if (this.sonioxDirectEnabled && !this.sonioxDirectHealthy) return \"provider_unreachable\"\n if (!this.sonioxDirectEnabled && !this.cloudConnected) return \"cloud_disconnected\"\n if (!this.sonioxDirectEnabled && this.sttQuotaBlocked) return \"stt_quota\"\n return \"force_local\"\n }\n\n private publishReason(): void {\n const reason = this.localActive ? this.currentReason() : \"\"\n offlineActivity.setTranscription(\n this.localActive ? {reason: this.currentReason(), model: sttModelManager.currentModelLabel()} : null,\n )\n const store = useSettingsStore.getState()\n if (store.getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason) !== reason) {\n store.setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason, reason)\n }\n }\n\n private async startLocalStt(): Promise<void> {\n this.log(\"starting local stt\")\n try {\n await this.activateLocalStt()\n } catch (err) {\n this.log(`local stt startup failed: ${err}`)\n }\n }\n\n private async activateLocalStt(): Promise<void> {\n const modelAvailable = await sttModelManager.isModelAvailable()\n if (!modelAvailable) {\n this.log(\"local stt model is not available yet — skipping activation\")\n return\n }\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed before start completed\")\n return\n }\n // Native rejects unless the recognizer and its processing loop are ready.\n await BluetoothSdk.restartTranscriber()\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed during transcriber restart\")\n return\n }\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, true)\n this.localActive = true\n this.publishReason()\n }\n\n private stopLocalStt(reason: string): void {\n this.log(`stopping local stt: ${reason}`)\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n this.localActive = false\n this.publishReason()\n }\n\n private shouldUseLocalStt(): boolean {\n return (\n this.hasTranscriptionSubscription &&\n (this.hasForceLocalSubscription || (this.hasFallbackSubscription && !this.primaryUp()))\n )\n }\n\n private log(msg: string): void {\n console.log(`[LocalSttFallback] ${msg}`)\n }\n}\n\nconst localSttFallbackCoordinator = LocalSttFallbackCoordinator.getInstance()\nexport default localSttFallbackCoordinator\n"]}
|
|
1
|
+
{"version":3,"file":"LocalSttFallbackCoordinator.js","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AACvD,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,eAAe,MAAM,mBAAmB,CAAA;AA2B/C,MAAM,2BAA2B;IACvB,MAAM,CAAC,QAAQ,CAA6B;IAE5C,4BAA4B,GAAG,KAAK,CAAA;IACpC,yBAAyB,GAAG,KAAK,CAAA;IACzC,oFAAoF;IAC5E,uBAAuB,GAAG,KAAK,CAAA;IAC/B,cAAc,GAAkB,IAAI,CAAA;IAC5C;;;;;OAKG;IACK,cAAc,GAAG,IAAI,CAAA;IACrB,WAAW,GAAG,KAAK,CAAA;IACnB,QAAQ,GAAyB,IAAI,CAAA;IACrC,oBAAoB,GAAG,KAAK,CAAA;IACpC;;;;;;OAMG;IACK,mBAAmB,GAAG,KAAK,CAAA;IAC3B,mBAAmB,GAAG,IAAI,CAAA;IAClC;;;;;OAKG;IACK,eAAe,GAAG,KAAK,CAAA;IAE/B;QACE,wEAAwE;QACxE,uEAAuE;QACvE,wEAAwE;QACxE,6BAA6B;QAC7B,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QAC1F,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAA;QACvF,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE;YAChC,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,yEAAyE;QACzE,uEAAuE;QACvE,iDAAiD;QACjD,MAAM,IAAI,CAAC,QAAQ,CAAA;QACnB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;IACxB,CAAC;IAED;;;;OAIG;IACK,yBAAyB;QAC/B,IAAI,IAAI,CAAC,oBAAoB;YAAE,OAAM;QACrC,IAAI,CAAC,cAAc,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAA;QACtD,kBAAkB,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAA;YAC/C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;gBAAE,OAAM;YAC7C,IAAI,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5D,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;YAC/B,KAAK,IAAI,CAAC,SAAS,EAAE,CAAA;QACvB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC;YAC1C,2BAA2B,CAAC,QAAQ,GAAG,IAAI,2BAA2B,EAAE,CAAA;QAC1E,CAAC;QACD,OAAO,2BAA2B,CAAC,QAAQ,CAAA;IAC7C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,mEAAmE;IACnE,SAAS;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACvD,CAAC;IAED,oBAAoB,CAClB,gBAAyB,EACzB,QAAuB,EACvB,aAAa,GAAG,KAAK,EACrB,eAAe,GAAG,IAAI;QAEtB,IAAI,CAAC,GAAG,CACN,8BAA8B,gBAAgB,UAAU,QAAQ,gBAAgB,aAAa,cAAc,eAAe,GAAG,CAC9H,CAAA;QACD,IAAI,CAAC,4BAA4B,GAAG,gBAAgB,CAAA;QACpD,IAAI,CAAC,yBAAyB,GAAG,gBAAgB,IAAI,aAAa,CAAA;QAClE,IAAI,CAAC,uBAAuB,GAAG,gBAAgB,IAAI,eAAe,CAAA;QAClE,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;QACxD,KAAK,IAAI,CAAC,SAAS,EAAE,CAAA;IACvB,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,KAAU,CAAC;IAE5B;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAAC,OAAgB;QAC5C,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO;YAAE,OAAM;QAC5C,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;QAC9B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;IACxB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED,uEAAuE;IACvE,yBAAyB,CAAC,OAAgB,EAAE,OAAgB;QAC1D,IAAI,IAAI,CAAC,mBAAmB,KAAK,OAAO,IAAI,IAAI,CAAC,mBAAmB,KAAK,OAAO;YAAE,OAAM;QACxF,IAAI,CAAC,GAAG,CAAC,4BAA4B,OAAO,YAAY,OAAO,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAA;QAClC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAA;QAClC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAA;IACvB,CAAC;IAED;2CACuC;IAC/B,SAAS;QACf,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,kBAAkB,CAAC,eAAe,EAAE;YAAE,OAAO,KAAK,CAAA;QACnF,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,eAAe,CAAA;IAC3G,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,yBAAyB,EAAE,CAAA;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC/C,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACtB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,CAAA;QACrB,CAAC;aAAM,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAA;QAChH,CAAC;aAAM,IAAI,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,yEAAyE;YACzE,qEAAqE;YACrE,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,kBAAkB,CAAC,eAAe,EAAE;YAAE,OAAO,gBAAgB,CAAA;QAC9F,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO,sBAAsB,CAAA;QACxF,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,oBAAoB,CAAA;QAClF,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,WAAW,CAAA;QACzE,OAAO,aAAa,CAAA;IACtB,CAAC;IAEO,aAAa;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3D,eAAe,CAAC,gBAAgB,CAC9B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,iBAAiB,EAAE,EAAC,CAAC,CAAC,CAAC,IAAI,CACrG,CAAA;QACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAA;QACzC,IAAI,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,KAAK,MAAM,EAAE,CAAC;YAC7E,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,gBAAgB,EAAE,CAAA;QAC/D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAA;YACtE,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;YAChF,OAAM;QACR,CAAC;QACD,0EAA0E;QAC1E,MAAM,YAAY,CAAC,kBAAkB,EAAE,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;YACpF,OAAM;QACR,CAAC;QACD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAA;QACzF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAEO,YAAY,CAAC,MAAc;QACjC,IAAI,CAAC,GAAG,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAA;QACzC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QAC1F,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAEO,iBAAiB;QACvB,OAAO,CACL,IAAI,CAAC,4BAA4B;YACjC,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CACxF,CAAA;IACH,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,2BAA2B,GAAG,2BAA2B,CAAC,WAAW,EAAE,CAAA;AAC7E,eAAe,2BAA2B,CAAA","sourcesContent":["import BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport {ISLAND_SETTINGS_KEYS} from \"../runtime/config\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport offlineActivity from \"./OfflineActivity\"\nimport sttModelManager from \"./STTModelManager\"\n\n/**\n * Decides whether on-device Sherpa STT should produce transcripts for local\n * miniapps, instead of (or in addition to) cloud transcription. Local STT is\n * active when the cloud is unavailable (disconnected or refusing STT for plan\n * quota) and some subscriber accepts fallback text, or any subscription\n * requires `forceLocal`.\n *\n * Activation flips `localSttFallbackActive` in the settings store, which\n * the bluetooth-sdk native side reads to decide whether to feed PCM into\n * the SherpaOnnxTranscriber. Local transcripts then flow back through the\n * `local_transcription` Bridge event; the host wires that event to\n * `localMiniappRuntime.forwardEvent`, with this coordinator providing the\n * subscription-active gate so we never publish transcripts to miniapps that\n * aren't asking for them. LocalMiniappRuntime filters mixed local/cloud\n * delivery per miniapp.\n */\n/**\n * Why local STT is currently active, mirrored into the\n * `local_stt_fallback_reason` setting (\"\" while inactive) so UI can show it.\n * When several causes hold at once, the primary-path outage wins over\n * `force_local` (a forced subscription would keep local STT on either way).\n */\nexport type LocalSttFallbackReason =\n \"force_local\" | \"cloud_disconnected\" | \"cloud_disabled\" | \"stt_quota\" | \"provider_unreachable\"\n\nclass LocalSttFallbackCoordinator {\n private static instance: LocalSttFallbackCoordinator\n\n private hasTranscriptionSubscription = false\n private hasForceLocalSubscription = false\n /** Some default-route subscriber takes on-device text while the primary is down. */\n private hasFallbackSubscription = false\n private activeLanguage: string | null = null\n /**\n * Default to \"cloud is up\" so we never accidentally activate local STT before\n * the cloud client has had a chance to start. We attach lazily on the first\n * subscription/reconcile pass; once attached, this field reflects the real\n * cloud-client runtime status.\n */\n private cloudConnected = true\n private localActive = false\n private starting: Promise<void> | null = null\n private cloudAdapterAttached = false\n /**\n * Soniox-direct (user API key) state, pushed by SonioxDirectService. While\n * enabled, IT is the primary transcription path — cloud connectivity is\n * irrelevant and sherpa engages on Soniox health instead. Defaults healthy\n * for the same reason cloudConnected defaults true: never activate local STT\n * before the primary has had a chance to come up.\n */\n private sonioxDirectEnabled = false\n private sonioxDirectHealthy = true\n /**\n * Cloud STT refused for plan quota (`stream.quota` blocked=true). The cloud\n * connection stays up, so this is tracked separately from `cloudConnected`:\n * for transcription purposes the cloud path is down, and sherpa takes over\n * if its model is on-device. Soniox-direct is unmetered and unaffected.\n */\n private sttQuotaBlocked = false\n\n private constructor() {\n // Reset the persisted mirror flag on boot — the in-memory state in this\n // coordinator is the source of truth, and a stale \"true\" left from the\n // previous session would cause native to feed Sherpa before any miniapp\n // registered a subscription.\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason, \"\")\n sttModelManager.onModelReady(() => {\n void this.retryAfterModelReady()\n })\n }\n\n private async retryAfterModelReady(): Promise<void> {\n // A model can finish downloading while the initial availability check is\n // still pending. Wait for that attempt before retrying so readiness is\n // never lost and native restarts cannot overlap.\n await this.starting\n await this.reconcile()\n }\n\n /**\n * Lazy-attach the engine cloud connection listener. The coordinator is\n * constructed at module load, before engine.start() brings up the cloud\n * client, so we defer until the first reconcile.\n */\n private attachCloudAdapterIfReady(): void {\n if (this.cloudAdapterAttached) return\n this.cloudConnected = cloudClientService.isConnected()\n cloudClientService.onStatusChanged((status) => {\n const connected = status.status === \"connected\"\n if (this.cloudConnected === connected) return\n this.log(`cloud connection -> ${connected ? \"up\" : \"down\"}`)\n this.cloudConnected = connected\n void this.reconcile()\n })\n this.cloudAdapterAttached = true\n }\n\n static getInstance(): LocalSttFallbackCoordinator {\n if (!LocalSttFallbackCoordinator.instance) {\n LocalSttFallbackCoordinator.instance = new LocalSttFallbackCoordinator()\n }\n return LocalSttFallbackCoordinator.instance\n }\n\n isActive(): boolean {\n return this.localActive\n }\n\n getActiveLanguage(): string | null {\n return this.activeLanguage\n }\n\n /** The cause of the current activation, or null while inactive. */\n getReason(): LocalSttFallbackReason | null {\n return this.localActive ? this.currentReason() : null\n }\n\n onSubscriptionChange(\n hasTranscription: boolean,\n language: string | null,\n hasForceLocal = false,\n acceptsFallback = true,\n ): void {\n this.log(\n `onSubscriptionChange(hasTx=${hasTranscription}, lang=${language}, forceLocal=${hasForceLocal}, fallback=${acceptsFallback})`,\n )\n this.hasTranscriptionSubscription = hasTranscription\n this.hasForceLocalSubscription = hasTranscription && hasForceLocal\n this.hasFallbackSubscription = hasTranscription && acceptsFallback\n this.activeLanguage = hasTranscription ? language : null\n void this.reconcile()\n }\n\n /**\n * Informational hook, retained for API stability. No longer called: the\n * authoritative switching signal is the cloud-client adapter (local miniapps\n * are powered only by V2). v1 cloud transcripts deliberately do NOT drive this\n * coordinator anymore. Kept for future hysteresis if connection-state alone\n * proves too coarse.\n */\n onCloudTranscript(): void {}\n\n /**\n * Pushed when the cloud announces/clears an STT quota block. Awaitable so\n * the caller can inspect `isActive()` afterwards to phrase its user notice\n * (\"continuing on-device\" vs \"transcription paused\").\n */\n async onSttQuotaBlockedChange(blocked: boolean): Promise<void> {\n if (this.sttQuotaBlocked === blocked) return\n this.log(`stt quota -> ${blocked ? \"blocked\" : \"restored\"}`)\n this.sttQuotaBlocked = blocked\n await this.reconcile()\n }\n\n isSttQuotaBlocked(): boolean {\n return this.sttQuotaBlocked\n }\n\n /** Pushed by SonioxDirectService on every enable/health transition. */\n onSonioxDirectStateChange(enabled: boolean, healthy: boolean): void {\n if (this.sonioxDirectEnabled === enabled && this.sonioxDirectHealthy === healthy) return\n this.log(`soniox-direct -> enabled=${enabled} healthy=${healthy}`)\n this.sonioxDirectEnabled = enabled\n this.sonioxDirectHealthy = healthy\n void this.reconcile()\n }\n\n /** Whether the primary transcription path (Soniox-direct when a user key is\n * set, the cloud otherwise) is up. */\n private primaryUp(): boolean {\n // Cloud turned off in Privacy settings: the cloud path is not merely down,\n // it is never coming back, so on-device STT is the primary. Checked ahead\n // of `cloudConnected` because that field defaults to true (so local STT\n // doesn't pre-empt cloud at boot) and would otherwise report a path that\n // will never connect as up. Soniox-direct is a user-supplied third-party\n // key, not Glassly cloud, so it stays available.\n if (!this.sonioxDirectEnabled && cloudClientService.isCloudDisabled()) return false\n return this.sonioxDirectEnabled ? this.sonioxDirectHealthy : this.cloudConnected && !this.sttQuotaBlocked\n }\n\n private async reconcile(): Promise<void> {\n this.attachCloudAdapterIfReady()\n const shouldBeActive = this.shouldUseLocalStt()\n if (shouldBeActive && !this.localActive) {\n if (!this.starting) {\n this.starting = this.startLocalStt().finally(() => {\n this.starting = null\n })\n }\n await this.starting\n } else if (!shouldBeActive && this.localActive) {\n this.stopLocalStt(this.hasTranscriptionSubscription ? \"primary transcription recovered\" : \"subscription gone\")\n } else if (shouldBeActive && this.localActive) {\n // Still active, but the cause may have shifted (e.g. quota block landing\n // while already offline for a disconnect) — keep the mirror current.\n this.publishReason()\n }\n }\n\n /**\n * Ranks the concurrent causes: a dead-forever cloud path first, then the\n * primary provider's own failure, then transient outages, with `force_local`\n * only when the primary is actually up. Mirrors `primaryUp()`.\n */\n private currentReason(): LocalSttFallbackReason {\n if (!this.sonioxDirectEnabled && cloudClientService.isCloudDisabled()) return \"cloud_disabled\"\n if (this.sonioxDirectEnabled && !this.sonioxDirectHealthy) return \"provider_unreachable\"\n if (!this.sonioxDirectEnabled && !this.cloudConnected) return \"cloud_disconnected\"\n if (!this.sonioxDirectEnabled && this.sttQuotaBlocked) return \"stt_quota\"\n return \"force_local\"\n }\n\n private publishReason(): void {\n const reason = this.localActive ? this.currentReason() : \"\"\n offlineActivity.setTranscription(\n this.localActive ? {reason: this.currentReason(), model: sttModelManager.currentModelLabel()} : null,\n )\n const store = useSettingsStore.getState()\n if (store.getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason) !== reason) {\n store.setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackReason, reason)\n }\n }\n\n private async startLocalStt(): Promise<void> {\n this.log(\"starting local stt\")\n try {\n await this.activateLocalStt()\n } catch (err) {\n this.log(`local stt startup failed: ${err}`)\n }\n }\n\n private async activateLocalStt(): Promise<void> {\n const modelAvailable = await sttModelManager.isModelAvailable()\n if (!modelAvailable) {\n this.log(\"local stt model is not available yet — skipping activation\")\n return\n }\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed before start completed\")\n return\n }\n // Native rejects unless the recognizer and its processing loop are ready.\n await BluetoothSdk.restartTranscriber()\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed during transcriber restart\")\n return\n }\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, true)\n this.localActive = true\n this.publishReason()\n }\n\n private stopLocalStt(reason: string): void {\n this.log(`stopping local stt: ${reason}`)\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n this.localActive = false\n this.publishReason()\n }\n\n private shouldUseLocalStt(): boolean {\n return (\n this.hasTranscriptionSubscription &&\n (this.hasForceLocalSubscription || (this.hasFallbackSubscription && !this.primaryUp()))\n )\n }\n\n private log(msg: string): void {\n console.log(`[LocalSttFallback] ${msg}`)\n }\n}\n\nconst localSttFallbackCoordinator = LocalSttFallbackCoordinator.getInstance()\nexport default localSttFallbackCoordinator\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeNavigationService.d.ts","sourceRoot":"","sources":["../../src/services/NativeNavigationService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,cAAM,uBAAuB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAE9D,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAoC;IACnD,6FAA6F;IAC7F,OAAO,CAAC,eAAe,CAA4B;IAEnD,OAAO;IAEA,gBAAgB,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;WAIxC,WAAW,IAAI,uBAAuB;IAOpD,8DAA8D;IAC9D,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACI,WAAW,IAAI,OAAO;
|
|
1
|
+
{"version":3,"file":"NativeNavigationService.d.ts","sourceRoot":"","sources":["../../src/services/NativeNavigationService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,cAAM,uBAAuB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAE9D,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAoC;IACnD,6FAA6F;IAC7F,OAAO,CAAC,eAAe,CAA4B;IAEnD,OAAO;IAEA,gBAAgB,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;WAIxC,WAAW,IAAI,uBAAuB;IAOpD,8DAA8D;IAC9D,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACI,WAAW,IAAI,OAAO;IAY7B,iEAAiE;IAC1D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAgB7C,gFAAgF;IACzE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAaxC;;;;OAIG;IACI,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IA4CtE,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,QAAQ;CAKjB;AAED,QAAA,MAAM,uBAAuB,yBAAwC,CAAA;AACrE,eAAe,uBAAuB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeNavigationService.js","sourceRoot":"","sources":["../../src/services/NativeNavigationService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * NativeNavigationService — trip-scoped bridge to glasses with a\n * firmware-rendered nav UI (`hasNativeNavigation`; G2 service 0x08 today).\n * NavigationHandlers drives enter/exit at trip boundaries; miniapp NATIVE_NAV\n * payloads (card fields, map bitmaps) are forwarded to the bluetooth-sdk.\n * While active, stock firmware streams its magnetometer heading; the device\n * event router forwards it to session.compass like any glasses compass sample.\n */\n\nimport {useDisplayStore} from \"../stores/display\"\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\n\nimport {ISLAND_SETTINGS_KEYS} from \"../runtime/config\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport {DeviceTypes} from \"../types\"\nimport {getEffectiveCapabilities} from \"./effectiveCapabilities\"\nimport glassesSensorService from \"./GlassesSensorService\"\n\nconst LOG_TAG = \"NATIVE_NAV_SERVICE\"\n\nexport interface NativeNavInfoPayload {\n directionIcon: number\n distance: string\n roadName: string\n spendTime: string\n remainDistance: string\n etaTime: string\n speed: string\n}\n\nclass NativeNavigationService {\n private static instance: NativeNavigationService | null = null\n\n private active = false\n private modeSub: {remove: () => void} | null = null\n /** Registered by NavigationHandlers; fires when the WEARER exits nav mode on the glasses. */\n private onGlassesExitCb: (() => void) | null = null\n\n private constructor() {}\n\n public setOnGlassesExit(cb: (() => void) | null): void {\n this.onGlassesExitCb = cb\n }\n\n public static getInstance(): NativeNavigationService {\n if (!NativeNavigationService.instance) {\n NativeNavigationService.instance = new NativeNavigationService()\n }\n return NativeNavigationService.instance\n }\n\n /** True while the glasses' native nav UI owns the display. */\n public get isActive(): boolean {\n return this.active\n }\n\n /**\n * True when the paired glasses render their own nav UI AND this native\n * build exposes the nav-mode functions (both platforms since the G2.kt\n * port — the typeof guard keeps older builds safe).\n */\n public isSupported(): boolean {\n const defaultWearable = useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.defaultWearable) as\n | DeviceTypes\n | undefined\n // Effective, not model: custom firmware drops hasNativeNavigation so the\n // miniapp's scene HUD owns the display (see effectiveCapabilities).\n const capabilities = getEffectiveCapabilities(defaultWearable || DeviceTypes.NONE)\n return (\n capabilities.hasNativeNavigation === true &&\n typeof (BluetoothSdk as {navigationModeStart?: unknown}).navigationModeStart === \"function\"\n )\n }\n\n /** A trip started (NavigationHandlers.handleStart succeeded). */\n public onTripStart(packageName: string): void {\n if (!this.isSupported() || this.active) return\n console.log(`${LOG_TAG}: entering native nav mode for ${packageName}`)\n this.active = true\n useDisplayStore.getState().setDisplayEvent({layout: {layoutType: \"unavailable\", reason: \"firmware-navigation\"}})\n this.attachListeners()\n void glassesSensorService\n .setNavigationActive(true)\n .then(() => {\n return this.active ? BluetoothSdk.navigationModeStart() : undefined\n })\n .catch((err) => {\n console.error(`${LOG_TAG}: navigationModeStart failed:`, err)\n })\n }\n\n /** The trip ended (arrived / stopped / errored). Safe to call when inactive. */\n public onTripEnd(arrived: boolean): void {\n if (!this.active) return\n console.log(`${LOG_TAG}: exiting native nav mode (arrived=${arrived})`)\n this.teardown()\n void Promise.resolve(BluetoothSdk.navigationModeStop(arrived))\n .then(() => {\n return glassesSensorService.setNavigationActive(false)\n })\n .catch((err) => {\n console.error(`${LOG_TAG}: navigationModeStop failed:`, err)\n })\n }\n\n /**\n * Forward a miniapp NATIVE_NAV payload to the glasses. Returns false when\n * native nav isn't active/supported (the SDK reports \"unsupported\" so the\n * miniapp can skip re-encoding bitmaps it doesn't need).\n */\n public handleMiniappRequest(payload: Record<string, unknown>): boolean {\n if (!this.active || !this.isSupported()) return false\n const action = payload.action\n try {\n switch (action) {\n case \"info\": {\n const info = (payload.info ?? {}) as Partial<NativeNavInfoPayload>\n void BluetoothSdk.navigationUpdateInfo({\n directionIcon: Number(info.directionIcon) || 0,\n distance: String(info.distance ?? \"\"),\n roadName: String(info.roadName ?? \"\"),\n spendTime: String(info.spendTime ?? \"\"),\n remainDistance: String(info.remainDistance ?? \"\"),\n etaTime: String(info.etaTime ?? \"\"),\n speed: String(info.speed ?? \"\"),\n })\n return true\n }\n case \"mini_map\": {\n const map = (payload.map ?? {}) as {data?: unknown; rotationDeg?: unknown; border?: unknown}\n if (typeof map.data !== \"string\" || map.data.length === 0) return false\n void BluetoothSdk.navigationMiniMap({\n data: map.data,\n rotationDeg: Number(map.rotationDeg) || 0,\n border: map.border !== false,\n })\n return true\n }\n case \"overview_map\": {\n const map = (payload.map ?? {}) as {data?: unknown}\n if (typeof map.data !== \"string\" || map.data.length === 0) return false\n void BluetoothSdk.navigationOverviewMap({data: map.data})\n return true\n }\n default:\n console.warn(`${LOG_TAG}: unknown native nav action:`, action)\n return false\n }\n } catch (err) {\n console.error(`${LOG_TAG}: native nav forward failed:`, err)\n return false\n }\n }\n\n private attachListeners(): void {\n // Glasses-side exit ends the whole trip: release the compass override and\n // let NavigationHandlers stop navigation + notify the miniapp (\"cancelled\").\n // Phone-initiated exits (trip already ending) just tear down.\n this.modeSub?.remove()\n this.modeSub = BluetoothSdk.addListener(\"navigation_mode_change\", (event) => {\n if (event.status === \"exited\" && this.active) {\n console.log(`${LOG_TAG}: nav mode exited natively (source=${event.source ?? \"phone\"})`)\n this.teardown()\n if (event.source === \"glasses\") {\n this.onGlassesExitCb?.()\n void glassesSensorService.setNavigationActive(false)\n }\n }\n })\n }\n\n private teardown(): void {\n this.active = false\n this.modeSub?.remove()\n this.modeSub = null\n }\n}\n\nconst nativeNavigationService = NativeNavigationService.getInstance()\nexport default nativeNavigationService\n"]}
|
|
1
|
+
{"version":3,"file":"NativeNavigationService.js","sourceRoot":"","sources":["../../src/services/NativeNavigationService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,YAAY,MAAM,iCAAiC,CAAA;AAE1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAC,WAAW,EAAC,MAAM,UAAU,CAAA;AACpC,OAAO,EAAC,wBAAwB,EAAC,MAAM,yBAAyB,CAAA;AAChE,OAAO,oBAAoB,MAAM,wBAAwB,CAAA;AAEzD,MAAM,OAAO,GAAG,oBAAoB,CAAA;AAYpC,MAAM,uBAAuB;IACnB,MAAM,CAAC,QAAQ,GAAmC,IAAI,CAAA;IAEtD,MAAM,GAAG,KAAK,CAAA;IACd,OAAO,GAAgC,IAAI,CAAA;IACnD,6FAA6F;IACrF,eAAe,GAAwB,IAAI,CAAA;IAEnD,gBAAuB,CAAC;IAEjB,gBAAgB,CAAC,EAAuB;QAC7C,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;IAC3B,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC;YACtC,uBAAuB,CAAC,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAA;QAClE,CAAC;QACD,OAAO,uBAAuB,CAAC,QAAQ,CAAA;IACzC,CAAC;IAED,8DAA8D;IAC9D,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;;;OAIG;IACI,WAAW;QAChB,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC,eAAe,CAC1E,CAAA;QACzB,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,YAAY,GAAG,wBAAwB,CAAC,eAAe,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;QAClF,OAAO,CACL,YAAY,CAAC,mBAAmB,KAAK,IAAI;YACzC,OAAQ,YAAgD,CAAC,mBAAmB,KAAK,UAAU,CAC5F,CAAA;IACH,CAAC;IAED,iEAAiE;IAC1D,WAAW,CAAC,WAAmB;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,kCAAkC,WAAW,EAAE,CAAC,CAAA;QACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,eAAe,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAC,MAAM,EAAE,EAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAC,EAAC,CAAC,CAAA;QAChH,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,KAAK,oBAAoB;aACtB,mBAAmB,CAAC,IAAI,CAAC;aACzB,IAAI,CAAC,GAAG,EAAE;YACT,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACrE,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,+BAA+B,EAAE,GAAG,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACN,CAAC;IAED,gFAAgF;IACzE,SAAS,CAAC,OAAgB;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QACxB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,sCAAsC,OAAO,GAAG,CAAC,CAAA;QACvE,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;aAC3D,IAAI,CAAC,GAAG,EAAE;YACT,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QACxD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,8BAA8B,EAAE,GAAG,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,OAAgC;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAA;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC;YACH,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAkC,CAAA;oBAClE,KAAK,YAAY,CAAC,oBAAoB,CAAC;wBACrC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBAC9C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;wBACrC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;wBACrC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;wBACvC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;wBACjD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;wBACnC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;qBAChC,CAAC,CAAA;oBACF,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAA8D,CAAA;oBAC5F,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAA;oBACvE,KAAK,YAAY,CAAC,iBAAiB,CAAC;wBAClC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;wBACzC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK;qBAC7B,CAAC,CAAA;oBACF,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAqB,CAAA;oBACnD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAA;oBACvE,KAAK,YAAY,CAAC,qBAAqB,CAAC,EAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAC,CAAC,CAAA;oBACzD,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD;oBACE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,8BAA8B,EAAE,MAAM,CAAC,CAAA;oBAC9D,OAAO,KAAK,CAAA;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,8BAA8B,EAAE,GAAG,CAAC,CAAA;YAC5D,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,0EAA0E;QAC1E,6EAA6E;QAC7E,8DAA8D;QAC9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,sCAAsC,KAAK,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,CAAA;gBACvF,IAAI,CAAC,QAAQ,EAAE,CAAA;gBACf,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC/B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAA;oBACxB,KAAK,oBAAoB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;;AAGH,MAAM,uBAAuB,GAAG,uBAAuB,CAAC,WAAW,EAAE,CAAA;AACrE,eAAe,uBAAuB,CAAA","sourcesContent":["/**\n * NativeNavigationService — trip-scoped bridge to glasses with a\n * firmware-rendered nav UI (`hasNativeNavigation`; G2 service 0x08 today).\n * NavigationHandlers drives enter/exit at trip boundaries; miniapp NATIVE_NAV\n * payloads (card fields, map bitmaps) are forwarded to the bluetooth-sdk.\n * While active, stock firmware streams its magnetometer heading; the device\n * event router forwards it to session.compass like any glasses compass sample.\n */\n\nimport {useDisplayStore} from \"../stores/display\"\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\n\nimport {ISLAND_SETTINGS_KEYS} from \"../runtime/config\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport {DeviceTypes} from \"../types\"\nimport {getEffectiveCapabilities} from \"./effectiveCapabilities\"\nimport glassesSensorService from \"./GlassesSensorService\"\n\nconst LOG_TAG = \"NATIVE_NAV_SERVICE\"\n\nexport interface NativeNavInfoPayload {\n directionIcon: number\n distance: string\n roadName: string\n spendTime: string\n remainDistance: string\n etaTime: string\n speed: string\n}\n\nclass NativeNavigationService {\n private static instance: NativeNavigationService | null = null\n\n private active = false\n private modeSub: {remove: () => void} | null = null\n /** Registered by NavigationHandlers; fires when the WEARER exits nav mode on the glasses. */\n private onGlassesExitCb: (() => void) | null = null\n\n private constructor() {}\n\n public setOnGlassesExit(cb: (() => void) | null): void {\n this.onGlassesExitCb = cb\n }\n\n public static getInstance(): NativeNavigationService {\n if (!NativeNavigationService.instance) {\n NativeNavigationService.instance = new NativeNavigationService()\n }\n return NativeNavigationService.instance\n }\n\n /** True while the glasses' native nav UI owns the display. */\n public get isActive(): boolean {\n return this.active\n }\n\n /**\n * True when the paired glasses render their own nav UI AND this native\n * build exposes the nav-mode functions (both platforms since the G2.kt\n * port — the typeof guard keeps older builds safe).\n */\n public isSupported(): boolean {\n const defaultWearable = useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.defaultWearable) as\n DeviceTypes | undefined\n // Effective, not model: custom firmware drops hasNativeNavigation so the\n // miniapp's scene HUD owns the display (see effectiveCapabilities).\n const capabilities = getEffectiveCapabilities(defaultWearable || DeviceTypes.NONE)\n return (\n capabilities.hasNativeNavigation === true &&\n typeof (BluetoothSdk as {navigationModeStart?: unknown}).navigationModeStart === \"function\"\n )\n }\n\n /** A trip started (NavigationHandlers.handleStart succeeded). */\n public onTripStart(packageName: string): void {\n if (!this.isSupported() || this.active) return\n console.log(`${LOG_TAG}: entering native nav mode for ${packageName}`)\n this.active = true\n useDisplayStore.getState().setDisplayEvent({layout: {layoutType: \"unavailable\", reason: \"firmware-navigation\"}})\n this.attachListeners()\n void glassesSensorService\n .setNavigationActive(true)\n .then(() => {\n return this.active ? BluetoothSdk.navigationModeStart() : undefined\n })\n .catch((err) => {\n console.error(`${LOG_TAG}: navigationModeStart failed:`, err)\n })\n }\n\n /** The trip ended (arrived / stopped / errored). Safe to call when inactive. */\n public onTripEnd(arrived: boolean): void {\n if (!this.active) return\n console.log(`${LOG_TAG}: exiting native nav mode (arrived=${arrived})`)\n this.teardown()\n void Promise.resolve(BluetoothSdk.navigationModeStop(arrived))\n .then(() => {\n return glassesSensorService.setNavigationActive(false)\n })\n .catch((err) => {\n console.error(`${LOG_TAG}: navigationModeStop failed:`, err)\n })\n }\n\n /**\n * Forward a miniapp NATIVE_NAV payload to the glasses. Returns false when\n * native nav isn't active/supported (the SDK reports \"unsupported\" so the\n * miniapp can skip re-encoding bitmaps it doesn't need).\n */\n public handleMiniappRequest(payload: Record<string, unknown>): boolean {\n if (!this.active || !this.isSupported()) return false\n const action = payload.action\n try {\n switch (action) {\n case \"info\": {\n const info = (payload.info ?? {}) as Partial<NativeNavInfoPayload>\n void BluetoothSdk.navigationUpdateInfo({\n directionIcon: Number(info.directionIcon) || 0,\n distance: String(info.distance ?? \"\"),\n roadName: String(info.roadName ?? \"\"),\n spendTime: String(info.spendTime ?? \"\"),\n remainDistance: String(info.remainDistance ?? \"\"),\n etaTime: String(info.etaTime ?? \"\"),\n speed: String(info.speed ?? \"\"),\n })\n return true\n }\n case \"mini_map\": {\n const map = (payload.map ?? {}) as {data?: unknown; rotationDeg?: unknown; border?: unknown}\n if (typeof map.data !== \"string\" || map.data.length === 0) return false\n void BluetoothSdk.navigationMiniMap({\n data: map.data,\n rotationDeg: Number(map.rotationDeg) || 0,\n border: map.border !== false,\n })\n return true\n }\n case \"overview_map\": {\n const map = (payload.map ?? {}) as {data?: unknown}\n if (typeof map.data !== \"string\" || map.data.length === 0) return false\n void BluetoothSdk.navigationOverviewMap({data: map.data})\n return true\n }\n default:\n console.warn(`${LOG_TAG}: unknown native nav action:`, action)\n return false\n }\n } catch (err) {\n console.error(`${LOG_TAG}: native nav forward failed:`, err)\n return false\n }\n }\n\n private attachListeners(): void {\n // Glasses-side exit ends the whole trip: release the compass override and\n // let NavigationHandlers stop navigation + notify the miniapp (\"cancelled\").\n // Phone-initiated exits (trip already ending) just tear down.\n this.modeSub?.remove()\n this.modeSub = BluetoothSdk.addListener(\"navigation_mode_change\", (event) => {\n if (event.status === \"exited\" && this.active) {\n console.log(`${LOG_TAG}: nav mode exited natively (source=${event.source ?? \"phone\"})`)\n this.teardown()\n if (event.source === \"glasses\") {\n this.onGlassesExitCb?.()\n void glassesSensorService.setNavigationActive(false)\n }\n }\n })\n }\n\n private teardown(): void {\n this.active = false\n this.modeSub?.remove()\n this.modeSub = null\n }\n}\n\nconst nativeNavigationService = NativeNavigationService.getInstance()\nexport default nativeNavigationService\n"]}
|
|
@@ -86,7 +86,7 @@ export declare class NavigationHandlers {
|
|
|
86
86
|
handleReverseGeocode(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void>;
|
|
87
87
|
/**
|
|
88
88
|
* Type-ahead place search. Runs on-device against Mapbox Search Box when the
|
|
89
|
-
* user saved their own key (Settings > API Keys) — that key exists precisely
|
|
89
|
+
* user saved their own key (Settings > Privacy > API Keys) — that key exists precisely
|
|
90
90
|
* so search works without the cloud — and falls back to the v2 cloud maps
|
|
91
91
|
* service otherwise. Resolves `{ok: true, suggestions}` — an empty query or no
|
|
92
92
|
* matches is `{ok: true, suggestions: []}`, not an error.
|
|
@@ -323,7 +323,7 @@ export class NavigationHandlers {
|
|
|
323
323
|
}
|
|
324
324
|
async handleComputeRoute(packageName, payload, requestId) {
|
|
325
325
|
try {
|
|
326
|
-
// With the user's own Mapbox key (Settings > API Keys), compute
|
|
326
|
+
// With the user's own Mapbox key (Settings > Privacy > API Keys), compute
|
|
327
327
|
// on-device so routing works without the cloud and bills their account.
|
|
328
328
|
// Without one, go through the v2 cloud maps proxy — org-token Mapbox
|
|
329
329
|
// usage only ever happens cloud-side.
|
|
@@ -394,7 +394,7 @@ export class NavigationHandlers {
|
|
|
394
394
|
}
|
|
395
395
|
/**
|
|
396
396
|
* Type-ahead place search. Runs on-device against Mapbox Search Box when the
|
|
397
|
-
* user saved their own key (Settings > API Keys) — that key exists precisely
|
|
397
|
+
* user saved their own key (Settings > Privacy > API Keys) — that key exists precisely
|
|
398
398
|
* so search works without the cloud — and falls back to the v2 cloud maps
|
|
399
399
|
* service otherwise. Resolves `{ok: true, suggestions}` — an empty query or no
|
|
400
400
|
* matches is `{ok: true, suggestions: []}`, not an error.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationHandlers.js","sourceRoot":"","sources":["../../src/services/NavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * NavigationHandlers — turn-by-turn navigation request handlers for\n * LocalMiniappRuntime. Extracted from LocalMiniappRuntime so the\n * navigation surface (Google Maps Navigation SDK adapter, multi-stop\n * routes, deviation simulator, dev toggles, road-snapped GPS streaming)\n * lives in one file the reviewer can read in isolation.\n *\n * Wire-up: LocalMiniappRuntime owns one instance, constructed with\n * callbacks for sending results / events back to the miniapp. The\n * dispatcher's switch statement delegates each `NAVIGATION_*` case to a\n * handler here. Cross-cutting hooks (cleanup on disconnect, location-\n * stream gating during a trip) are exposed via {@link onDisconnect} and\n * {@link isTripActive}.\n *\n * State owned here:\n * - navListeners: per-package unsubscribers for the nav-update +\n * road-snapped-location + route streams. Detached on disconnect,\n * reattached on the next NAVIGATION_START from the same package.\n * - activeNavApps: packages with a live nav session. Used by the\n * dispatcher to gate raw background-GPS forwards (we don't want the\n * unsnapped fix interleaving with the simulator's snapped output\n * during a trip).\n */\n\nimport {type NavLocation, type NavRoute, type NavUpdate} from \"../runtime/config\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport nativeNavigationService from \"./NativeNavigationService\"\nimport navigationService from \"./NavigationService\"\nimport {MiniappErrorCode, MiniappResponseType, MiniappStreamType} from \"@glassly/miniapp\"\n\nconst LOG_TAG = \"LocalMiniappRuntime\"\n\n/**\n * Shape of the per-miniapp envelope sender — matches\n * LocalMiniappRuntime.sendToMiniapp's signature.\n */\ntype SendToMiniapp = (\n packageName: string,\n envelope: {type: MiniappResponseType; streamType?: MiniappStreamType; data?: unknown},\n) => void\n\n/**\n * Shape of the request-result sender — matches\n * LocalMiniappRuntime.sendResult's signature.\n */\ntype SendResult = (\n packageName: string,\n requestId: string | undefined,\n ok: boolean,\n result?: unknown,\n error?: {code: MiniappErrorCode; message: string},\n) => void\n\nexport class NavigationHandlers {\n /** packageName → unsubscribe fn for that app's nav event forwarder. */\n private navListeners = new Map<string, () => void>()\n /** Set of packageNames that have called navigation.start() and not yet stop(). */\n private activeNavApps = new Set<string>()\n\n constructor(\n private readonly sendToMiniapp: SendToMiniapp,\n private readonly sendResult: SendResult,\n ) {\n nativeNavigationService.setOnGlassesExit(() => this.stopFromGlasses())\n }\n\n /**\n * The wearer exited nav mode on the glasses — end the trip: stop the native\n * navigator and tell each active nav app via a \"cancelled\" update so it can\n * reset its own trip state.\n */\n private stopFromGlasses(): void {\n if (this.activeNavApps.size === 0) return\n console.log(`${LOG_TAG}: nav mode exited on glasses — stopping trip for ${[...this.activeNavApps].join(\", \")}`)\n for (const packageName of this.activeNavApps) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_UPDATE,\n data: {kind: \"cancelled\", reason: \"glasses\"},\n })\n }\n this.activeNavApps.clear()\n void navigationService.stop().catch((err: unknown) => {\n console.error(`${LOG_TAG}: navigation stop after glasses exit failed:`, err)\n })\n }\n\n /** True iff a trip is currently active for the package (used to gate raw-GPS forwards). */\n isTripActive(packageName: string): boolean {\n return this.activeNavApps.has(packageName)\n }\n\n /**\n * Detach the per-app nav event forwarder. Called when the mini-app\n * disconnects. The native nav session is left running so the user can\n * reopen the app and reattach without losing their trip; `activeNavApps`\n * is kept intact for the same reason.\n */\n onDisconnect(packageName: string): void {\n const unsub = this.navListeners.get(packageName)\n if (unsub) {\n unsub()\n this.navListeners.delete(packageName)\n }\n }\n\n /**\n * The user closed/disabled the mini-app (not a crash-respawn). Unlike\n * {@link onDisconnect}, this ends the trip: the glasses leave native nav\n * mode and the phone navigator stops once no other app is navigating.\n */\n onAppClosed(packageName: string): void {\n this.onDisconnect(packageName)\n if (!this.activeNavApps.delete(packageName)) return\n if (this.activeNavApps.size > 0) return\n console.log(`${LOG_TAG}: ${packageName} closed with an active trip — stopping navigation`)\n nativeNavigationService.onTripEnd(false)\n void navigationService.stop().catch((err: unknown) => {\n console.error(`${LOG_TAG}: navigation stop after app close failed:`, err)\n })\n }\n\n async handleStart(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n console.log(`${LOG_TAG}: handleNavigationStart from ${packageName}`, JSON.stringify(payload))\n\n // v2 wire shape sends `stops`; v1 shape sends bare lat/lng. Accept both.\n const rawStops = payload.stops as Array<{lat?: unknown; lng?: unknown}> | undefined\n const stops: Array<{lat: number; lng: number}> = []\n if (Array.isArray(rawStops)) {\n for (const s of rawStops) {\n const sLat = Number(s?.lat)\n const sLng = Number(s?.lng)\n if (Number.isFinite(sLat) && Number.isFinite(sLng)) stops.push({lat: sLat, lng: sLng})\n }\n }\n if (stops.length === 0) {\n const lat = Number(payload.lat)\n const lng = Number(payload.lng)\n if (Number.isFinite(lat) && Number.isFinite(lng)) stops.push({lat, lng})\n }\n if (stops.length === 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"stops or lat/lng required\",\n })\n return\n }\n const lat = stops[0].lat\n const lng = stops[0].lng\n const simulate = payload.simulate === true\n const speedNum = Number(payload.speedMultiplier)\n const speedMultiplier = Number.isFinite(speedNum) && speedNum > 0 ? speedNum : 5\n const mode = typeof payload.mode === \"string\" ? payload.mode : \"walking\"\n const avoidRaw = payload.avoid as Record<string, unknown> | undefined\n const avoid = avoidRaw\n ? {\n highways: avoidRaw.highways === true,\n tolls: avoidRaw.tolls === true,\n ferries: avoidRaw.ferries === true,\n }\n : undefined\n const missedRaw = Number(payload.missedTurnRerouteMeters)\n const missedTurnRerouteMeters = Number.isFinite(missedRaw) && missedRaw > 0 ? missedRaw : undefined\n\n const navigation = navigationService\n if (!navigation) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"navigation adapter not configured on host\",\n })\n return\n }\n\n // Reattach the per-app event forwarder (it may have been detached when the\n // mini-app closed its UI without stopping the trip).\n if (!this.navListeners.has(packageName)) {\n const unsubNav = navigation.addListener((update: NavUpdate) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_UPDATE,\n data: update,\n })\n // Trip ended naturally — keep the forwarder alive (miniapp may\n // restart nav) but remove from active set so stop() accounting\n // stays accurate.\n if (update.kind === \"arrived\" || update.kind === \"error\") {\n this.activeNavApps.delete(packageName)\n if (this.activeNavApps.size === 0) {\n nativeNavigationService.onTripEnd(update.kind === \"arrived\")\n }\n }\n })\n // Forward the nav-SDK's road-snapped GPS fixes as a location_update\n // stream, so the miniapp's existing session.events.onLocation(...) just\n // works while a trip is active.\n const unsubLoc = navigation.addLocationListener((loc: NavLocation) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.LOCATION_UPDATE,\n data: {\n lat: loc.lat,\n lng: loc.lng,\n accuracy: loc.accuracy ?? undefined,\n timestamp: loc.timestamp,\n },\n })\n })\n const unsubRoute = navigation.addRouteListener((route: NavRoute) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_ROUTE,\n data: route,\n })\n })\n this.navListeners.set(packageName, () => {\n unsubNav()\n unsubLoc()\n unsubRoute()\n })\n }\n\n // If a trip is already active for this app (user closed the UI and came\n // back), reuse the running session — replay current snapshot and return\n // ok without restarting the native navigator.\n if (this.activeNavApps.has(packageName) && navigation.getState() !== \"idle\") {\n console.log(`${LOG_TAG}: resuming existing nav session for ${packageName}`)\n const snapshot = navigation.getSnapshot()\n this.sendResult(packageName, requestId, true, {ok: true, resumed: true, snapshot})\n return\n }\n\n try {\n const result = await navigation.start(\n {lat, lng},\n {simulate, speedMultiplier, stops, mode, avoid, missedTurnRerouteMeters},\n )\n if (result.ok) {\n this.activeNavApps.add(packageName)\n // Glasses with a firmware-rendered nav UI (G2) enter their native\n // navigation mode for the duration of the trip.\n nativeNavigationService.onTripStart(packageName)\n }\n // A refused start (`{ok: false, error}` from the token gate or the\n // native navigator) is request DATA, not a wire failure: the SDK's\n // navigation.start() contract is \"resolves {ok, error?}, never throws\".\n // Sending it as ok:false on the wire made the SDK reject with its\n // generic \"Unknown error\" and drop the real message.\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation start error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation start error\",\n })\n }\n }\n\n async handleStop(packageName: string, requestId?: string): Promise<void> {\n try {\n const unsub = this.navListeners.get(packageName)\n if (unsub) {\n unsub()\n this.navListeners.delete(packageName)\n }\n this.activeNavApps.delete(packageName)\n // Only stop the native trip when no other miniapp is still navigating.\n if (this.activeNavApps.size === 0) {\n nativeNavigationService.onTripEnd(false)\n const navigation = navigationService\n const result = navigation ? await navigation.stop() : {ok: true}\n this.sendResult(packageName, requestId, true, result)\n } else {\n this.sendResult(packageName, requestId, true, {ok: true}, undefined)\n }\n } catch (err) {\n console.error(`${LOG_TAG}: navigation stop error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation stop error\",\n })\n }\n }\n\n async handleDeviate(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const offsetNum = Number(payload.offsetMeters)\n const offsetMeters = Number.isFinite(offsetNum) && offsetNum > 0 ? offsetNum : 20\n const navigation = navigationService\n const result = navigation\n ? await navigation.simulateDeviation(offsetMeters)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation deviate error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation deviate error\",\n })\n }\n }\n\n async handleSetWrongSidewalk(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const enabled = payload.enabled === true\n const navigation = navigationService\n const result = navigation\n ? await navigation.setWrongSidewalkOffset(enabled)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation setWrongSidewalkOffset error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation setWrongSidewalkOffset error\",\n })\n }\n }\n\n async handleSetSkipCrossings(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const enabled = payload.enabled === true\n const navigation = navigationService\n const result = navigation\n ? await navigation.setSkipCrossings(enabled)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation setSkipCrossings error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation setSkipCrossings error\",\n })\n }\n }\n\n handleGetState(packageName: string, requestId?: string): void {\n const snapshot = navigationService.getSnapshot() ?? null\n this.sendResult(packageName, requestId, true, {state: snapshot})\n }\n\n async handleRequestPermission(packageName: string, requestId?: string): Promise<void> {\n try {\n const navigation = navigationService\n const result = navigation\n ? await navigation.requestPermission()\n : {ok: false, accepted: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation requestPermission error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation requestPermission error\",\n })\n }\n }\n\n async handleComputeRoute(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n // With the user's own Mapbox key (Settings > API Keys), compute\n // on-device so routing works without the cloud and bills their account.\n // Without one, go through the v2 cloud maps proxy — org-token Mapbox\n // usage only ever happens cloud-side.\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.computeRoute(payload)\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {ok: true, routes: local.routes ?? []})\n return\n }\n console.warn(`${LOG_TAG}: local computeRoute failed, falling back to cloud:`, local.error)\n }\n\n // Computed in the v2 cloud (provider-abstracted maps service). The SDK\n // payload shape ({origin, stops, mode, avoid, alternatives}) is the v2\n // DirectionsRequest field-for-field, so it passes straight through.\n const {routes} = await cloudClientService.maps.directions(payload as never)\n this.sendResult(packageName, requestId, true, {ok: true, routes})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation computeRoute error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation computeRoute error\",\n })\n }\n }\n\n /**\n * Reverse-geocode a coordinate into a short road name + full formatted\n * address. Backs the SDK pivot engine's road-name fallback (`road`) and the\n * navigation miniapp's dropped-pin / POI-tap labels (`address`). Always\n * resolves with `{ok, road?, address?}` — a missing road/address is\n * `{ok: true, road: null, address: null}`, not an error.\n */\n async handleReverseGeocode(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const lat = Number(payload.lat)\n const lng = Number(payload.lng)\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"lat/lng required\",\n })\n return\n }\n // With the user's own Mapbox key, resolve on-device so this works\n // without the cloud; otherwise use the v2 cloud maps service.\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.reverseGeocodeRoad({lat, lng})\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {\n ok: true,\n road: local.road ?? null,\n address: local.address ?? null,\n })\n return\n }\n console.warn(`${LOG_TAG}: local reverseGeocode failed, falling back to cloud:`, local.error)\n }\n\n const {road, address} = await cloudClientService.maps.reverseGeocode({lat, lng})\n this.sendResult(packageName, requestId, true, {ok: true, road, address})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation reverseGeocode error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation reverseGeocode error\",\n })\n }\n }\n\n /**\n * Type-ahead place search. Runs on-device against Mapbox Search Box when the\n * user saved their own key (Settings > API Keys) — that key exists precisely\n * so search works without the cloud — and falls back to the v2 cloud maps\n * service otherwise. Resolves `{ok: true, suggestions}` — an empty query or no\n * matches is `{ok: true, suggestions: []}`, not an error.\n */\n async handlePlaceAutocomplete(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const query = typeof payload.query === \"string\" ? payload.query : \"\"\n const sessionToken = typeof payload.sessionToken === \"string\" ? payload.sessionToken : \"\"\n const near = this.parseNear(payload.near)\n\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.placeAutocomplete(query, near, sessionToken)\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {ok: true, suggestions: local.suggestions ?? []})\n return\n }\n // A token is set but the direct call failed (bad key, offline, Mapbox\n // error). Fall through to the cloud rather than failing the search\n // outright.\n console.warn(`${LOG_TAG}: local placeAutocomplete failed, falling back to cloud:`, local.error)\n }\n\n const {suggestions} = await cloudClientService.maps.placeAutocomplete({query, near, sessionToken})\n this.sendResult(packageName, requestId, true, {ok: true, suggestions})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation placeAutocomplete error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation placeAutocomplete error\",\n })\n }\n }\n\n /**\n * Resolve a suggestion (`placeId` + `sessionToken`) to a full place with\n * coordinates. Takes the same on-device-vs-cloud branch as\n * {@link handlePlaceAutocomplete}: the `placeId` and session token come from\n * whichever provider produced the suggestion, so both calls must run against\n * the same one. Resolves `{ok: true, place}`.\n */\n async handlePlaceDetails(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const placeId = typeof payload.placeId === \"string\" ? payload.placeId : \"\"\n const sessionToken = typeof payload.sessionToken === \"string\" ? payload.sessionToken : \"\"\n if (!placeId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"placeId required\",\n })\n return\n }\n\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.placeDetails(placeId, sessionToken)\n if (local.ok && local.place) {\n this.sendResult(packageName, requestId, true, {ok: true, place: local.place})\n return\n }\n // Don't fall back to the cloud here: this `placeId` came from a Mapbox\n // Search Box suggestion and is not resolvable by another provider.\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: local.error ?? \"navigation placeDetails error\",\n })\n return\n }\n\n const place = await cloudClientService.maps.placeDetails({placeId, sessionToken})\n this.sendResult(packageName, requestId, true, {ok: true, place})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation placeDetails error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation placeDetails error\",\n })\n }\n }\n\n /** Coerce an inbound `near` payload to a {lat,lng}, or undefined when absent/invalid. */\n private parseNear(raw: unknown): {lat: number; lng: number} | undefined {\n if (!raw || typeof raw !== \"object\") return undefined\n const obj = raw as Record<string, unknown>\n const lat = Number(obj.lat)\n const lng = Number(obj.lng)\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) return undefined\n return {lat, lng}\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NavigationHandlers.js","sourceRoot":"","sources":["../../src/services/NavigationHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * NavigationHandlers — turn-by-turn navigation request handlers for\n * LocalMiniappRuntime. Extracted from LocalMiniappRuntime so the\n * navigation surface (Google Maps Navigation SDK adapter, multi-stop\n * routes, deviation simulator, dev toggles, road-snapped GPS streaming)\n * lives in one file the reviewer can read in isolation.\n *\n * Wire-up: LocalMiniappRuntime owns one instance, constructed with\n * callbacks for sending results / events back to the miniapp. The\n * dispatcher's switch statement delegates each `NAVIGATION_*` case to a\n * handler here. Cross-cutting hooks (cleanup on disconnect, location-\n * stream gating during a trip) are exposed via {@link onDisconnect} and\n * {@link isTripActive}.\n *\n * State owned here:\n * - navListeners: per-package unsubscribers for the nav-update +\n * road-snapped-location + route streams. Detached on disconnect,\n * reattached on the next NAVIGATION_START from the same package.\n * - activeNavApps: packages with a live nav session. Used by the\n * dispatcher to gate raw background-GPS forwards (we don't want the\n * unsnapped fix interleaving with the simulator's snapped output\n * during a trip).\n */\n\nimport {type NavLocation, type NavRoute, type NavUpdate} from \"../runtime/config\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport nativeNavigationService from \"./NativeNavigationService\"\nimport navigationService from \"./NavigationService\"\nimport {MiniappErrorCode, MiniappResponseType, MiniappStreamType} from \"@glassly/miniapp\"\n\nconst LOG_TAG = \"LocalMiniappRuntime\"\n\n/**\n * Shape of the per-miniapp envelope sender — matches\n * LocalMiniappRuntime.sendToMiniapp's signature.\n */\ntype SendToMiniapp = (\n packageName: string,\n envelope: {type: MiniappResponseType; streamType?: MiniappStreamType; data?: unknown},\n) => void\n\n/**\n * Shape of the request-result sender — matches\n * LocalMiniappRuntime.sendResult's signature.\n */\ntype SendResult = (\n packageName: string,\n requestId: string | undefined,\n ok: boolean,\n result?: unknown,\n error?: {code: MiniappErrorCode; message: string},\n) => void\n\nexport class NavigationHandlers {\n /** packageName → unsubscribe fn for that app's nav event forwarder. */\n private navListeners = new Map<string, () => void>()\n /** Set of packageNames that have called navigation.start() and not yet stop(). */\n private activeNavApps = new Set<string>()\n\n constructor(\n private readonly sendToMiniapp: SendToMiniapp,\n private readonly sendResult: SendResult,\n ) {\n nativeNavigationService.setOnGlassesExit(() => this.stopFromGlasses())\n }\n\n /**\n * The wearer exited nav mode on the glasses — end the trip: stop the native\n * navigator and tell each active nav app via a \"cancelled\" update so it can\n * reset its own trip state.\n */\n private stopFromGlasses(): void {\n if (this.activeNavApps.size === 0) return\n console.log(`${LOG_TAG}: nav mode exited on glasses — stopping trip for ${[...this.activeNavApps].join(\", \")}`)\n for (const packageName of this.activeNavApps) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_UPDATE,\n data: {kind: \"cancelled\", reason: \"glasses\"},\n })\n }\n this.activeNavApps.clear()\n void navigationService.stop().catch((err: unknown) => {\n console.error(`${LOG_TAG}: navigation stop after glasses exit failed:`, err)\n })\n }\n\n /** True iff a trip is currently active for the package (used to gate raw-GPS forwards). */\n isTripActive(packageName: string): boolean {\n return this.activeNavApps.has(packageName)\n }\n\n /**\n * Detach the per-app nav event forwarder. Called when the mini-app\n * disconnects. The native nav session is left running so the user can\n * reopen the app and reattach without losing their trip; `activeNavApps`\n * is kept intact for the same reason.\n */\n onDisconnect(packageName: string): void {\n const unsub = this.navListeners.get(packageName)\n if (unsub) {\n unsub()\n this.navListeners.delete(packageName)\n }\n }\n\n /**\n * The user closed/disabled the mini-app (not a crash-respawn). Unlike\n * {@link onDisconnect}, this ends the trip: the glasses leave native nav\n * mode and the phone navigator stops once no other app is navigating.\n */\n onAppClosed(packageName: string): void {\n this.onDisconnect(packageName)\n if (!this.activeNavApps.delete(packageName)) return\n if (this.activeNavApps.size > 0) return\n console.log(`${LOG_TAG}: ${packageName} closed with an active trip — stopping navigation`)\n nativeNavigationService.onTripEnd(false)\n void navigationService.stop().catch((err: unknown) => {\n console.error(`${LOG_TAG}: navigation stop after app close failed:`, err)\n })\n }\n\n async handleStart(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n console.log(`${LOG_TAG}: handleNavigationStart from ${packageName}`, JSON.stringify(payload))\n\n // v2 wire shape sends `stops`; v1 shape sends bare lat/lng. Accept both.\n const rawStops = payload.stops as Array<{lat?: unknown; lng?: unknown}> | undefined\n const stops: Array<{lat: number; lng: number}> = []\n if (Array.isArray(rawStops)) {\n for (const s of rawStops) {\n const sLat = Number(s?.lat)\n const sLng = Number(s?.lng)\n if (Number.isFinite(sLat) && Number.isFinite(sLng)) stops.push({lat: sLat, lng: sLng})\n }\n }\n if (stops.length === 0) {\n const lat = Number(payload.lat)\n const lng = Number(payload.lng)\n if (Number.isFinite(lat) && Number.isFinite(lng)) stops.push({lat, lng})\n }\n if (stops.length === 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"stops or lat/lng required\",\n })\n return\n }\n const lat = stops[0].lat\n const lng = stops[0].lng\n const simulate = payload.simulate === true\n const speedNum = Number(payload.speedMultiplier)\n const speedMultiplier = Number.isFinite(speedNum) && speedNum > 0 ? speedNum : 5\n const mode = typeof payload.mode === \"string\" ? payload.mode : \"walking\"\n const avoidRaw = payload.avoid as Record<string, unknown> | undefined\n const avoid = avoidRaw\n ? {\n highways: avoidRaw.highways === true,\n tolls: avoidRaw.tolls === true,\n ferries: avoidRaw.ferries === true,\n }\n : undefined\n const missedRaw = Number(payload.missedTurnRerouteMeters)\n const missedTurnRerouteMeters = Number.isFinite(missedRaw) && missedRaw > 0 ? missedRaw : undefined\n\n const navigation = navigationService\n if (!navigation) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"navigation adapter not configured on host\",\n })\n return\n }\n\n // Reattach the per-app event forwarder (it may have been detached when the\n // mini-app closed its UI without stopping the trip).\n if (!this.navListeners.has(packageName)) {\n const unsubNav = navigation.addListener((update: NavUpdate) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_UPDATE,\n data: update,\n })\n // Trip ended naturally — keep the forwarder alive (miniapp may\n // restart nav) but remove from active set so stop() accounting\n // stays accurate.\n if (update.kind === \"arrived\" || update.kind === \"error\") {\n this.activeNavApps.delete(packageName)\n if (this.activeNavApps.size === 0) {\n nativeNavigationService.onTripEnd(update.kind === \"arrived\")\n }\n }\n })\n // Forward the nav-SDK's road-snapped GPS fixes as a location_update\n // stream, so the miniapp's existing session.events.onLocation(...) just\n // works while a trip is active.\n const unsubLoc = navigation.addLocationListener((loc: NavLocation) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.LOCATION_UPDATE,\n data: {\n lat: loc.lat,\n lng: loc.lng,\n accuracy: loc.accuracy ?? undefined,\n timestamp: loc.timestamp,\n },\n })\n })\n const unsubRoute = navigation.addRouteListener((route: NavRoute) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: MiniappStreamType.NAVIGATION_ROUTE,\n data: route,\n })\n })\n this.navListeners.set(packageName, () => {\n unsubNav()\n unsubLoc()\n unsubRoute()\n })\n }\n\n // If a trip is already active for this app (user closed the UI and came\n // back), reuse the running session — replay current snapshot and return\n // ok without restarting the native navigator.\n if (this.activeNavApps.has(packageName) && navigation.getState() !== \"idle\") {\n console.log(`${LOG_TAG}: resuming existing nav session for ${packageName}`)\n const snapshot = navigation.getSnapshot()\n this.sendResult(packageName, requestId, true, {ok: true, resumed: true, snapshot})\n return\n }\n\n try {\n const result = await navigation.start(\n {lat, lng},\n {simulate, speedMultiplier, stops, mode, avoid, missedTurnRerouteMeters},\n )\n if (result.ok) {\n this.activeNavApps.add(packageName)\n // Glasses with a firmware-rendered nav UI (G2) enter their native\n // navigation mode for the duration of the trip.\n nativeNavigationService.onTripStart(packageName)\n }\n // A refused start (`{ok: false, error}` from the token gate or the\n // native navigator) is request DATA, not a wire failure: the SDK's\n // navigation.start() contract is \"resolves {ok, error?}, never throws\".\n // Sending it as ok:false on the wire made the SDK reject with its\n // generic \"Unknown error\" and drop the real message.\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation start error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation start error\",\n })\n }\n }\n\n async handleStop(packageName: string, requestId?: string): Promise<void> {\n try {\n const unsub = this.navListeners.get(packageName)\n if (unsub) {\n unsub()\n this.navListeners.delete(packageName)\n }\n this.activeNavApps.delete(packageName)\n // Only stop the native trip when no other miniapp is still navigating.\n if (this.activeNavApps.size === 0) {\n nativeNavigationService.onTripEnd(false)\n const navigation = navigationService\n const result = navigation ? await navigation.stop() : {ok: true}\n this.sendResult(packageName, requestId, true, result)\n } else {\n this.sendResult(packageName, requestId, true, {ok: true}, undefined)\n }\n } catch (err) {\n console.error(`${LOG_TAG}: navigation stop error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation stop error\",\n })\n }\n }\n\n async handleDeviate(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const offsetNum = Number(payload.offsetMeters)\n const offsetMeters = Number.isFinite(offsetNum) && offsetNum > 0 ? offsetNum : 20\n const navigation = navigationService\n const result = navigation\n ? await navigation.simulateDeviation(offsetMeters)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation deviate error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation deviate error\",\n })\n }\n }\n\n async handleSetWrongSidewalk(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const enabled = payload.enabled === true\n const navigation = navigationService\n const result = navigation\n ? await navigation.setWrongSidewalkOffset(enabled)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation setWrongSidewalkOffset error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation setWrongSidewalkOffset error\",\n })\n }\n }\n\n async handleSetSkipCrossings(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const enabled = payload.enabled === true\n const navigation = navigationService\n const result = navigation\n ? await navigation.setSkipCrossings(enabled)\n : {ok: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation setSkipCrossings error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation setSkipCrossings error\",\n })\n }\n }\n\n handleGetState(packageName: string, requestId?: string): void {\n const snapshot = navigationService.getSnapshot() ?? null\n this.sendResult(packageName, requestId, true, {state: snapshot})\n }\n\n async handleRequestPermission(packageName: string, requestId?: string): Promise<void> {\n try {\n const navigation = navigationService\n const result = navigation\n ? await navigation.requestPermission()\n : {ok: false, accepted: false, error: \"navigation adapter not configured\"}\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: navigation requestPermission error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation requestPermission error\",\n })\n }\n }\n\n async handleComputeRoute(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n // With the user's own Mapbox key (Settings > Privacy > API Keys), compute\n // on-device so routing works without the cloud and bills their account.\n // Without one, go through the v2 cloud maps proxy — org-token Mapbox\n // usage only ever happens cloud-side.\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.computeRoute(payload)\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {ok: true, routes: local.routes ?? []})\n return\n }\n console.warn(`${LOG_TAG}: local computeRoute failed, falling back to cloud:`, local.error)\n }\n\n // Computed in the v2 cloud (provider-abstracted maps service). The SDK\n // payload shape ({origin, stops, mode, avoid, alternatives}) is the v2\n // DirectionsRequest field-for-field, so it passes straight through.\n const {routes} = await cloudClientService.maps.directions(payload as never)\n this.sendResult(packageName, requestId, true, {ok: true, routes})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation computeRoute error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation computeRoute error\",\n })\n }\n }\n\n /**\n * Reverse-geocode a coordinate into a short road name + full formatted\n * address. Backs the SDK pivot engine's road-name fallback (`road`) and the\n * navigation miniapp's dropped-pin / POI-tap labels (`address`). Always\n * resolves with `{ok, road?, address?}` — a missing road/address is\n * `{ok: true, road: null, address: null}`, not an error.\n */\n async handleReverseGeocode(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const lat = Number(payload.lat)\n const lng = Number(payload.lng)\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"lat/lng required\",\n })\n return\n }\n // With the user's own Mapbox key, resolve on-device so this works\n // without the cloud; otherwise use the v2 cloud maps service.\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.reverseGeocodeRoad({lat, lng})\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {\n ok: true,\n road: local.road ?? null,\n address: local.address ?? null,\n })\n return\n }\n console.warn(`${LOG_TAG}: local reverseGeocode failed, falling back to cloud:`, local.error)\n }\n\n const {road, address} = await cloudClientService.maps.reverseGeocode({lat, lng})\n this.sendResult(packageName, requestId, true, {ok: true, road, address})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation reverseGeocode error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation reverseGeocode error\",\n })\n }\n }\n\n /**\n * Type-ahead place search. Runs on-device against Mapbox Search Box when the\n * user saved their own key (Settings > Privacy > API Keys) — that key exists precisely\n * so search works without the cloud — and falls back to the v2 cloud maps\n * service otherwise. Resolves `{ok: true, suggestions}` — an empty query or no\n * matches is `{ok: true, suggestions: []}`, not an error.\n */\n async handlePlaceAutocomplete(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const query = typeof payload.query === \"string\" ? payload.query : \"\"\n const sessionToken = typeof payload.sessionToken === \"string\" ? payload.sessionToken : \"\"\n const near = this.parseNear(payload.near)\n\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.placeAutocomplete(query, near, sessionToken)\n if (local.ok) {\n this.sendResult(packageName, requestId, true, {ok: true, suggestions: local.suggestions ?? []})\n return\n }\n // A token is set but the direct call failed (bad key, offline, Mapbox\n // error). Fall through to the cloud rather than failing the search\n // outright.\n console.warn(`${LOG_TAG}: local placeAutocomplete failed, falling back to cloud:`, local.error)\n }\n\n const {suggestions} = await cloudClientService.maps.placeAutocomplete({query, near, sessionToken})\n this.sendResult(packageName, requestId, true, {ok: true, suggestions})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation placeAutocomplete error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation placeAutocomplete error\",\n })\n }\n }\n\n /**\n * Resolve a suggestion (`placeId` + `sessionToken`) to a full place with\n * coordinates. Takes the same on-device-vs-cloud branch as\n * {@link handlePlaceAutocomplete}: the `placeId` and session token come from\n * whichever provider produced the suggestion, so both calls must run against\n * the same one. Resolves `{ok: true, place}`.\n */\n async handlePlaceDetails(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const placeId = typeof payload.placeId === \"string\" ? payload.placeId : \"\"\n const sessionToken = typeof payload.sessionToken === \"string\" ? payload.sessionToken : \"\"\n if (!placeId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"placeId required\",\n })\n return\n }\n\n if (navigationService.hasMapboxToken()) {\n const local = await navigationService.placeDetails(placeId, sessionToken)\n if (local.ok && local.place) {\n this.sendResult(packageName, requestId, true, {ok: true, place: local.place})\n return\n }\n // Don't fall back to the cloud here: this `placeId` came from a Mapbox\n // Search Box suggestion and is not resolvable by another provider.\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: local.error ?? \"navigation placeDetails error\",\n })\n return\n }\n\n const place = await cloudClientService.maps.placeDetails({placeId, sessionToken})\n this.sendResult(packageName, requestId, true, {ok: true, place})\n } catch (err) {\n console.error(`${LOG_TAG}: navigation placeDetails error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"navigation placeDetails error\",\n })\n }\n }\n\n /** Coerce an inbound `near` payload to a {lat,lng}, or undefined when absent/invalid. */\n private parseNear(raw: unknown): {lat: number; lng: number} | undefined {\n if (!raw || typeof raw !== \"object\") return undefined\n const obj = raw as Record<string, unknown>\n const lat = Number(obj.lat)\n const lng = Number(obj.lng)\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) return undefined\n return {lat, lng}\n }\n}\n"]}
|
|
@@ -196,7 +196,7 @@ declare class NavigationService {
|
|
|
196
196
|
* Compute one or more routes without starting a trip.
|
|
197
197
|
*
|
|
198
198
|
* Reached from the miniapp bridge (NavigationHandlers.handleComputeRoute)
|
|
199
|
-
* when the user has saved their own Mapbox key in Settings > API Keys —
|
|
199
|
+
* when the user has saved their own Mapbox key in Settings > Privacy > API Keys —
|
|
200
200
|
* that key exists so navigation works without the cloud. Without a user
|
|
201
201
|
* key the bridge uses the v2 cloud maps service, which holds a provider
|
|
202
202
|
* token server-side and caches results. Implemented by
|
|
@@ -243,7 +243,7 @@ declare class NavigationService {
|
|
|
243
243
|
}>;
|
|
244
244
|
/** True when a phone-side DIRECT Mapbox call can be made (user key saved). */
|
|
245
245
|
hasMapboxToken(): boolean;
|
|
246
|
-
/** True when the user saved their own Mapbox key in Settings > API Keys. */
|
|
246
|
+
/** True when the user saved their own Mapbox key in Settings > Privacy > API Keys. */
|
|
247
247
|
hasUserMapboxKey(): boolean;
|
|
248
248
|
/**
|
|
249
249
|
* Type-ahead place search on-device with the user's own Mapbox key.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationService.d.ts","sourceRoot":"","sources":["../../src/services/NavigationService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"NavigationService.d.ts","sourceRoot":"","sources":["../../src/services/NavigationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -112,7 +112,7 @@ class NavigationService {
|
|
|
112
112
|
// can't race native boot.
|
|
113
113
|
const mapboxRenderToken = await resolveMapboxRenderToken();
|
|
114
114
|
if (!mapboxRenderToken) {
|
|
115
|
-
const error = "No Mapbox token available — add your key in Settings > API Keys" +
|
|
115
|
+
const error = "No Mapbox token available — add your key in Settings > Privacy > API Keys" +
|
|
116
116
|
" (required while Glassly Cloud is disabled or unreachable)";
|
|
117
117
|
console.warn(`${LOG_TAG}: start blocked — ${error}`);
|
|
118
118
|
return { ok: false, error };
|
|
@@ -226,7 +226,7 @@ class NavigationService {
|
|
|
226
226
|
* Compute one or more routes without starting a trip.
|
|
227
227
|
*
|
|
228
228
|
* Reached from the miniapp bridge (NavigationHandlers.handleComputeRoute)
|
|
229
|
-
* when the user has saved their own Mapbox key in Settings > API Keys —
|
|
229
|
+
* when the user has saved their own Mapbox key in Settings > Privacy > API Keys —
|
|
230
230
|
* that key exists so navigation works without the cloud. Without a user
|
|
231
231
|
* key the bridge uses the v2 cloud maps service, which holds a provider
|
|
232
232
|
* token server-side and caches results. Implemented by
|
|
@@ -259,7 +259,7 @@ class NavigationService {
|
|
|
259
259
|
hasMapboxToken() {
|
|
260
260
|
return !!resolveMapboxAccessToken();
|
|
261
261
|
}
|
|
262
|
-
/** True when the user saved their own Mapbox key in Settings > API Keys. */
|
|
262
|
+
/** True when the user saved their own Mapbox key in Settings > Privacy > API Keys. */
|
|
263
263
|
hasUserMapboxKey() {
|
|
264
264
|
return !!userMapboxApiKey();
|
|
265
265
|
}
|
|
@@ -353,7 +353,7 @@ export default navigationService;
|
|
|
353
353
|
// Routes API (REST)
|
|
354
354
|
// ---------------------------------------------------------------------------
|
|
355
355
|
// Routes + Geocoding go DIRECT to Mapbox from the phone process ONLY when the
|
|
356
|
-
// user saved their own key (Settings > API Keys) — "use my account". Without
|
|
356
|
+
// user saved their own key (Settings > Privacy > API Keys) — "use my account". Without
|
|
357
357
|
// one, callers (NavigationHandlers) route these operations through the v2
|
|
358
358
|
// cloud maps proxy instead; the binary ships no baked Mapbox key.
|
|
359
359
|
const MAPBOX_DIRECTIONS_BASE = "https://api.mapbox.com/directions/v5/mapbox";
|
|
@@ -381,7 +381,7 @@ function mapboxToken() {
|
|
|
381
381
|
}
|
|
382
382
|
/**
|
|
383
383
|
* Phone-side helper: hit the Mapbox Directions API directly with the user's own
|
|
384
|
-
* key (Settings > API Keys). Preferred over the v2 cloud maps service whenever
|
|
384
|
+
* key (Settings > Privacy > API Keys). Preferred over the v2 cloud maps service whenever
|
|
385
385
|
* that key is set, so routing works without the cloud. Lives here
|
|
386
386
|
* (not in Kotlin) so it's platform-independent across the JS bridge.
|
|
387
387
|
* Returns the SDK-shaped result with primary + alternates.
|
|
@@ -412,7 +412,7 @@ async function computeRouteViaRoutesApi(payload) {
|
|
|
412
412
|
}
|
|
413
413
|
const token = mapboxToken();
|
|
414
414
|
if (!token)
|
|
415
|
-
return { ok: false, error: "computeRoute: no Mapbox key saved (add yours in Settings > API Keys)" };
|
|
415
|
+
return { ok: false, error: "computeRoute: no Mapbox key saved (add yours in Settings > Privacy > API Keys)" };
|
|
416
416
|
// Mapbox path is a semicolon-joined `lng,lat` list: origin then each stop.
|
|
417
417
|
const coords = [`${oLng},${oLat}`, ...stops.map((s) => `${s.lng},${s.lat}`)].join(";");
|
|
418
418
|
const exclude = mapboxExclude(avoid);
|
|
@@ -548,7 +548,7 @@ function mapboxManeuverToKind(type, modifier) {
|
|
|
548
548
|
}
|
|
549
549
|
/**
|
|
550
550
|
* Reverse-geocode a coordinate via the Mapbox Geocoding v6 API directly, using
|
|
551
|
-
* the user's own key (Settings > API Keys). Preferred over the v2 cloud maps
|
|
551
|
+
* the user's own key (Settings > Privacy > API Keys). Preferred over the v2 cloud maps
|
|
552
552
|
* service whenever that key is set, so pin labels work without the cloud.
|
|
553
553
|
*
|
|
554
554
|
* Returns the road/street name (e.g. "Octavia Blvd") plus the full formatted
|
|
@@ -571,7 +571,7 @@ async function reverseGeocodeRoadViaGeocodingApi(coord) {
|
|
|
571
571
|
if (!token)
|
|
572
572
|
return {
|
|
573
573
|
ok: false,
|
|
574
|
-
error: "reverseGeocode: no Mapbox key saved (add yours in Settings > API Keys)",
|
|
574
|
+
error: "reverseGeocode: no Mapbox key saved (add yours in Settings > Privacy > API Keys)",
|
|
575
575
|
};
|
|
576
576
|
const params = new URLSearchParams({
|
|
577
577
|
longitude: String(coord.lng),
|
|
@@ -608,7 +608,7 @@ async function reverseGeocodeRoadViaGeocodingApi(coord) {
|
|
|
608
608
|
}
|
|
609
609
|
/**
|
|
610
610
|
* Type-ahead place search straight from the device via Mapbox Search Box,
|
|
611
|
-
* using the user's own key (Settings > API Keys). This is the offline-from-
|
|
611
|
+
* using the user's own key (Settings > Privacy > API Keys). This is the offline-from-
|
|
612
612
|
* the-cloud path: with a key saved, place search works with no runtime
|
|
613
613
|
* involvement at all.
|
|
614
614
|
*
|
|
@@ -628,7 +628,7 @@ async function placeAutocompleteViaSearchBox(query, near, sessionToken) {
|
|
|
628
628
|
if (!token) {
|
|
629
629
|
return {
|
|
630
630
|
ok: false,
|
|
631
|
-
error: "placeAutocomplete: no Mapbox key saved (add yours in Settings > API Keys)",
|
|
631
|
+
error: "placeAutocomplete: no Mapbox key saved (add yours in Settings > Privacy > API Keys)",
|
|
632
632
|
};
|
|
633
633
|
}
|
|
634
634
|
const params = new URLSearchParams({
|
|
@@ -677,7 +677,7 @@ async function placeDetailsViaSearchBox(placeId, sessionToken) {
|
|
|
677
677
|
if (!token) {
|
|
678
678
|
return {
|
|
679
679
|
ok: false,
|
|
680
|
-
error: "placeDetails: no Mapbox key saved (add yours in Settings > API Keys)",
|
|
680
|
+
error: "placeDetails: no Mapbox key saved (add yours in Settings > Privacy > API Keys)",
|
|
681
681
|
};
|
|
682
682
|
}
|
|
683
683
|
const params = new URLSearchParams({ access_token: token, session_token: sessionToken });
|